| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
fix(transcript): keep word/index/ref alignment under playOrder; project word-click seeks Two breaks of the word <-> source-time <-> timeline-frame invariant: - retimeWords sorts its output by projected timeline start, but keptWordIndices enumerated surviving indices in SOURCE order. With transcriptPlayOrder (speech-block reorder) the two orders diverge, so resolveCaptionWords[i] no longer corresponded to resolveCaptionWordIndices[i] / wordRefs[i]: hiding or overriding a caption word hit a DIFFERENT word, and agent-facing refs pointed at the wrong source word. Refactored both onto a shared core (retimedWordEntries) that carries {index, word} pairs through the same survival, sort, and de-overlap steps — retimeWords output is byte-identical; keptWordIndices now emits indices in the SAME timeline order, which is what its doc contract ("callers stay aligned") always promised. Its only caller is captions/resolve.ts. - Word-click seek in TranscriptPanel used startFrame + msToFrame(word.start): source ms added to a timeline frame with no projection — wrong on split clips (large source ms jumps past the clip), after deletions/silence compression (late drift equal to removed span), and on trimmed or rate-stretched video. New wordTimelineFrame in transcript/edit.ts projects through the same math as the render layer (audio: keptSegments stream; video: continuous srcIn window with playbackRate); a deleted word at a cut seeks to the cut point where playback resumes. Shared paths touched: caption word resolution (render, translation generator, agent read_captions all share resolve.ts) and the transcript panel click-to-seek. Without playOrder the emitted order is unchanged (stable sort over already-chronological words), so existing projects and non-reordered clips resolve byte-identically. Verification: tsc -b --force clean; oxlint 0 warnings; new wordAlignment.verify covers edit-layer and resolve-layer positional alignment under playOrder (words/indices/refs triple), plus wordTimelineFrame for audio (deletion stream, cut-point fallback) and video (srcIn window, playbackRate); transcript/edit.verify passes; full captions+transcript sweep 28/35 green — the 7 failures (captionCue*/captionSelection*/captionGroupMove/captionTimelineClipboard/ whisper-word-timestamps) reproduce identically on a clean tree (pre-existing). Browser smoke on localhost:5199: editor loads, Transcript and Captions panels open, 0 console errors. | 1 个月前 | |
perf: reduce hot-path overhead in editor, transcript, and agent streaming - editor/store: memoize activeEditorState so unrelated renders keep downstream [state] memos and effects stable - editor/sequenceGraph: skip graph traversal when the project has no sequence items (runs on every per-timeline action); duplicate timeline id detection is preserved in the fast path - agent/proposal: cache projectDocsDiffer per (baseDoc, currentDoc) identity pair (docs are immutable) so pending-proposal renders stop re-migrating and stringifying two full docs - transcript/TranscriptViews: memoize buildScriptRows and WordRow so drag-over/gap-adjust state changes no longer rebuild rows and re-render every word span on long transcripts - agent/serverRun: batch streaming text/thinking persistence into 200ms flushes via new serverRunStreamDeltaBuffer instead of rewriting the full localStorage record per SSE delta (O(text^2)); cursor+text always land in one atomic patch, non-delta commits fold pending text into their own write, stale cross-run flushes are discarded, and flush failures follow the existing persistenceError abandon path Shared paths touched: useEditor state identity (all editor consumers), per-timeline action validation, proposal staleness checks (browser and external bridge), transcript script view, serverRun durable stream persistence. All changes are memoization/short-circuit/batching only; no action semantics, storage schema, or recovery contract changed. Verification: tsc -b --force clean; oxlint 0 warnings; verify:affected (sequenceGraph, proposal) and serverRunSessionStorage.verify pass; 6-scenario standalone logic test for the delta buffer (batch merge, fold, cross-run discard, failure reporting, drop) passed; browser e2e on localhost:5199 (isolated dev profile): new project -> add solid -> undo -> redo -> dashboard reload with 0 console errors. Pre-existing issue confirmed on a clean tree: useServerRun.verify and serverRunToolRecovery.verify crash under run-check (dynamic require in @vercel/oidc via the ai package), unrelated to this change. | 1 个月前 | |
fix: close agent and desktop regression gaps Keep Codex tool activation and business-failure settlement consistent, preserve media identity across agent edits, and expose complete timeline projections. Harden transcript recovery, capability fallbacks, media ingest, and Jianying export while adding a shared model-cache path plus Windows fresh-process persistence CI. | 2 个月前 | |
fix(transcript): prevent whole-video fallback for local ASR Require compact audio extraction on the browser-local ASR path and retain stage-specific failures instead of attributing every error to model downloads. Expose Russian transcription in settings and local model language labels. Shared-path impact: extraction remains optional for cloud and desktop-native callers. Existing fallback behavior, model readiness validation, project data, and editor commands are unchanged. Independent silence-detection work is excluded from this commit. Validation: - Staged snapshot: TypeScript build, lint, and assemblyai, language settings, transcript-tools, and mediaSourceRevision verifies passed. - Development tree: 16 affected verifies and production build passed. - Real browser Agent smoke: gpt-5.6-sol invoked transcribe_track with provider=local; a 17,350-byte extracted audio file produced three words. - Full development-tree tests hit an unrelated pending read_transcript contract change; that contract verify passes in the staged snapshot. Refs #120 | 1 个月前 | |
fix(transcript): prevent whole-video fallback for local ASR Require compact audio extraction on the browser-local ASR path and retain stage-specific failures instead of attributing every error to model downloads. Expose Russian transcription in settings and local model language labels. Shared-path impact: extraction remains optional for cloud and desktop-native callers. Existing fallback behavior, model readiness validation, project data, and editor commands are unchanged. Independent silence-detection work is excluded from this commit. Validation: - Staged snapshot: TypeScript build, lint, and assemblyai, language settings, transcript-tools, and mediaSourceRevision verifies passed. - Development tree: 16 affected verifies and production build passed. - Real browser Agent smoke: gpt-5.6-sol invoked transcribe_track with provider=local; a 17,350-byte extracted audio file produced three words. - Full development-tree tests hit an unrelated pending read_transcript contract change; that contract verify passes in the staged snapshot. Refs #120 | 1 个月前 | |
feat(media): pool-level transcription controls with auto-transcribe policy Issue #87. Pool cards now expose transcription directly, so the transcribe-then-edit documentary workflow no longer needs the timeline as an ASR trigger. - Media-pool cards show a mic button (hover) and per-asset ASR status (spinner while running, check when done, error tooltip on failure), wired through the established startAssetTranscription/enqueueTranscription path with EditorCommands.setAssetTranscription persistence. - Right-click asset menu gains a Transcribe entry that runs on the whole selection, so batch transcription is two clicks after import_folder. - New AUTO_TRANSCRIBE_INGEST keystore setting (off/local/all, default local) gates every ingest ASR start: upload, relink, mobile upload, and watched-folder imports. Local Whisper stays automatic and free; paid cloud providers stop auto-burning quota unless explicitly set to all. - auto-transcribe-ingest.verify.ts covers the policy matrix; media-pool verify suites and full tsc -b stay green. Shared-path impact: the ingest gate (useEditorMediaIngest poolImportHooks and ingestToPool) previously started ASR unconditionally on import; it now consults the policy, defaulting to local-only. Cloud-provider users see a behavior change (no more silent paid transcription on import) — the regression surface is limited to that gate and covered by verify. | 2 个月前 | |
feat: complete source capability parity | 3 个月前 | |
fix: harden desktop recovery and media analysis workflows Recover Windows renderer/GPU failures within the selected profile and singleton owner. Ignore clean GPU exits and replay the latest floating transcript payload after renderer reloads. Clear queue-only export hints on active progress and direct completion. Report missing transcripts and explicitly optional music analysis as availability states while preserving stale-source and invalid-target failures. Cap source contact sheets at eight samples and skip browser-local ASR inference for near-silent PCM. Shared paths: recovery stays Windows-gated except the explicit smoke flag; nonqueued export details and default music failures are preserved. No README, persistence schema, dependency, or user-profile changes. Validation: complete pretest/posttest coverage and 104 core test segments; tsc -b --force, lint, web build, desktop build, and targeted lifecycle/stale-transcript checks passed. Real DeepSeek completed read_transcript, 6/8/2-frame extraction, optional missing-model music analysis, and zero-word local ASR; project/media/chat survived refresh. macOS Electron baseline and forced main/floating renderer recovery both reached SMOKE-OK. Windows/Linux hardware and CI were not run. Evidence: /tmp/openchatcut-commit-validation-20260830/validation-summary.md. | 1 个月前 | |
docs: translate code comments to English | 2 个月前 | |
feat(desktop): add cross-platform GPU runtime selection Detect CPU and GPU capabilities through Electron and route native inference to DirectML, CUDA, CoreML, WebGPU, or CPU as supported. Shared-path impact: desktop inference capabilities gain an optional hardware snapshot; existing version 3 clients remain compatible. Linux packaging now includes native inference workers and the target ONNX Runtime binary. Verification: npm test; npm run verify:affected; npx tsc -b --force; npm run lint; npm run build; npm run desktop:smoke; real Apple M5 CoreML rhythm analysis. | 2 个月前 | |
feat(agent-runs): multi-turn tool loop with browser-delegated execution The run loop now registers the full tool catalog (schemas supplied by the client, keeping the server free of the browser schema dependency chain that broke vite config bundling via ?raw imports). Tool calls publish a tool-request event and await the browser result through POST /api/agent-runs/:id/tool-result, then feed the assistant+tool messages into the next streamText turn (AI SDK does not auto-loop tool rounds). Refresh-safe: pending tool calls stay open and the SSE replay re-delivers the request after reconnect. Also fixes an implicit-type bug the clean build exposed: worker adapters read window.openChatCutDesktop from desktop-api.d.ts but never imported the module, so the declare global augmentation was not loaded in a clean tsc build. Added explicit import type {} references. Verified live with DeepSeek: run → tool-request(list_projects) → delivered result → assistant final answer streamed → completed. | 2 个月前 | |
feat(asr): auto-enable desktop native inference in the Electron shell whisper.cpp Metal is ~60x faster than the browser wasm path and every failure already falls back to the browser engine, so the desktop shell now enables native routing by default (bridge present), with an explicit opt-out (cc.desktopNativeInference=0) and plain browsers staying on wasm. The settings label drops the 'experimental' tag; verify covers no-bridge default off + no IPC, bridge auto-on, and explicit opt-out. | 2 个月前 | |
fix(asr): stop the settings sync from discarding new model tiers Selecting Whisper Large v3 Turbo never took effect. syncLocalAsrModel gated the write behind a hand-written list — tiny/base/small/medium/'' — that was not updated when the tier was added, so the chosen value was silently dropped and cc.asrModel kept whatever was selected before. The catalog and chooseAsrConfig both knew the tier; only the list in between disagreed, which made the failure look like the new model failing rather than never loading. For a user pinned to medium this was unescapable through the UI: every selection was discarded, medium kept running on the browser wasm engine, and each retry reproduced the same std::bad_alloc. - Derive ASR_MODEL_TIERS from ASR_MODELS (it was hard-coded, and unused) and add isAsrModelTier. - Validate through it in both the settings sync and chooseAsrConfig. - Cover the whole selection path: every catalog tier must survive the sync and resolve back to its own model/revision, plus a source guard rejecting inline tier literals in either file. Verified to fail against the original code. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> | 1 个月前 | |
fix(transcript): a zero-length word blacked out the whole preview ASR sometimes emits a word whose start and end round to the same frame ("Music" 24420->24440ms is f733 at both ends, on a junk auto-transcript attached to an SFX clip). keptSegments floored durFrames at 1 but left srcEndFrame unclamped, so the segment rendered <Audio trimBefore={733} trimAfter={733}> and Remotion threw "trimAfter prop must be greater than trimBefore prop." That throw unmounts the entire preview composition: the Player swaps in its bare warning fallback, so playback goes black and silent while the transport still reports "playing", and no restart clears it. Premount (fps * 1) detonates the bad segment a second before its clip, so the stall lands ~30 frames earlier than the offending item. Clamp srcEndFrame to srcStart + 1, matching what durFrames already did; timeline timing is unchanged because those segments were already one frame long. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> | 15 天前 | |
fix(transcript): a zero-length word blacked out the whole preview ASR sometimes emits a word whose start and end round to the same frame ("Music" 24420->24440ms is f733 at both ends, on a junk auto-transcript attached to an SFX clip). keptSegments floored durFrames at 1 but left srcEndFrame unclamped, so the segment rendered <Audio trimBefore={733} trimAfter={733}> and Remotion threw "trimAfter prop must be greater than trimBefore prop." That throw unmounts the entire preview composition: the Player swaps in its bare warning fallback, so playback goes black and silent while the transport still reports "playing", and no restart clears it. Premount (fps * 1) detonates the bad segment a second before its clip, so the stall lands ~30 frames earlier than the offending item. Clamp srcEndFrame to srcStart + 1, matching what durFrames already did; timeline timing is unchanged because those segments were already one frame long. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> | 15 天前 | |
chore(release): prepare v0.2.0 Harden project storage, upload finalization, export recovery, watched-folder ownership, and native inference lifecycle boundaries. Add cross-platform desktop update packaging and checksum-gated GitHub Release publication while preserving the public v3 project schema, existing media URL semantics, and opt-in defaults. Verified with TypeScript project builds, zero-warning lint, the full test suite, production build, and a browser create/import/edit/reload/close-reopen smoke. | 2 个月前 | |
Expose Italian transcription and media translations | 2 个月前 | |
feat: harden media captions and offline editing | 2 个月前 | |
fix(asr): check browser and desktop model readiness separately downloaded meant "every ONNX file and the GGML companion verified", and two gates enforced it before any engine ran: assertAsrModelDownloaded in the renderer and NativeAsrService.ensureModelInstalled in the main process. The engines never load each other's files: desktop whisper.cpp reads only the GGML companion, the browser worker only the ONNX export. So an installed desktop model was refused until the browser download finished (#168). And since #165 gave small and medium a companion, every existing Small/Medium install read as "not downloaded", browser-only users included, and was blocked until it fetched 190-539 MB its engine never loads. - inspectAsrModel verifies the ONNX export and the companion as separate groups (same size + sha256 checks, each cached under its own stat fingerprint) and reports onnxDownloaded / ggmlDownloaded; GET /api/asr-models carries both. downloaded keeps its meaning (the complete pack) for older clients; bytes now counts the verified groups. - NativeAsrService requires only a verified companion. - The renderer reads the catalog once and gates each engine right before it runs: whisper.cpp when its companion is verified (or readiness is unknown), then the browser fallback only when its ONNX export is verified. When the engine that would run is not ready, the error names what is missing (the ONNX files, the GGML file, or both, plus the desktop failure when that forced the fallback) and points at 设置 → 本地模型 → 本地转写, the page that has the download buttons. A desktop run that skips whisper.cpp says so. - Warm-up applies the same per-engine rules. - Settings: "已下载" means ready for the engine this client runs first (whisper.cpp with native inference, otherwise the browser engine). A desktop client ready with the companion alone gets a "补全" button for its browser fallback; a browser client is never asked for the companion. - New strings have en/it/ru entries. Italian settings entries go to a new it/localModels.ts shard because it/settings.ts is at the 500-line ceiling. Tests: asr-models.verify covers each group alone, a same-size corrupted companion, and the catalog flags. native-asr-service.verify runs a GGML-only install and refuses an ONNX-only one before starting a worker. The new local-asr-engine-order.verify drives localTranscribePathResumable through the #168 case, the browser-only case and each failure message; it fails against the previous local-asr.ts. local-asr-model-integrity.verify now covers catalog parsing, the per-engine predicate, the precheck messages and the settings row states. Fixes #168. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 29 天前 | |
fix(asr): check browser and desktop model readiness separately downloaded meant "every ONNX file and the GGML companion verified", and two gates enforced it before any engine ran: assertAsrModelDownloaded in the renderer and NativeAsrService.ensureModelInstalled in the main process. The engines never load each other's files: desktop whisper.cpp reads only the GGML companion, the browser worker only the ONNX export. So an installed desktop model was refused until the browser download finished (#168). And since #165 gave small and medium a companion, every existing Small/Medium install read as "not downloaded", browser-only users included, and was blocked until it fetched 190-539 MB its engine never loads. - inspectAsrModel verifies the ONNX export and the companion as separate groups (same size + sha256 checks, each cached under its own stat fingerprint) and reports onnxDownloaded / ggmlDownloaded; GET /api/asr-models carries both. downloaded keeps its meaning (the complete pack) for older clients; bytes now counts the verified groups. - NativeAsrService requires only a verified companion. - The renderer reads the catalog once and gates each engine right before it runs: whisper.cpp when its companion is verified (or readiness is unknown), then the browser fallback only when its ONNX export is verified. When the engine that would run is not ready, the error names what is missing (the ONNX files, the GGML file, or both, plus the desktop failure when that forced the fallback) and points at 设置 → 本地模型 → 本地转写, the page that has the download buttons. A desktop run that skips whisper.cpp says so. - Warm-up applies the same per-engine rules. - Settings: "已下载" means ready for the engine this client runs first (whisper.cpp with native inference, otherwise the browser engine). A desktop client ready with the companion alone gets a "补全" button for its browser fallback; a browser client is never asked for the companion. - New strings have en/it/ru entries. Italian settings entries go to a new it/localModels.ts shard because it/settings.ts is at the 500-line ceiling. Tests: asr-models.verify covers each group alone, a same-size corrupted companion, and the catalog flags. native-asr-service.verify runs a GGML-only install and refuses an ONNX-only one before starting a worker. The new local-asr-engine-order.verify drives localTranscribePathResumable through the #168 case, the browser-only case and each failure message; it fails against the previous local-asr.ts. local-asr-model-integrity.verify now covers catalog parsing, the per-engine predicate, the precheck messages and the settings row states. Fixes #168. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 29 天前 | |
feat(media): add on-device music intelligence | 2 个月前 | |
feat(media): add on-device music intelligence | 2 个月前 | |
fix(asr): check browser and desktop model readiness separately downloaded meant "every ONNX file and the GGML companion verified", and two gates enforced it before any engine ran: assertAsrModelDownloaded in the renderer and NativeAsrService.ensureModelInstalled in the main process. The engines never load each other's files: desktop whisper.cpp reads only the GGML companion, the browser worker only the ONNX export. So an installed desktop model was refused until the browser download finished (#168). And since #165 gave small and medium a companion, every existing Small/Medium install read as "not downloaded", browser-only users included, and was blocked until it fetched 190-539 MB its engine never loads. - inspectAsrModel verifies the ONNX export and the companion as separate groups (same size + sha256 checks, each cached under its own stat fingerprint) and reports onnxDownloaded / ggmlDownloaded; GET /api/asr-models carries both. downloaded keeps its meaning (the complete pack) for older clients; bytes now counts the verified groups. - NativeAsrService requires only a verified companion. - The renderer reads the catalog once and gates each engine right before it runs: whisper.cpp when its companion is verified (or readiness is unknown), then the browser fallback only when its ONNX export is verified. When the engine that would run is not ready, the error names what is missing (the ONNX files, the GGML file, or both, plus the desktop failure when that forced the fallback) and points at 设置 → 本地模型 → 本地转写, the page that has the download buttons. A desktop run that skips whisper.cpp says so. - Warm-up applies the same per-engine rules. - Settings: "已下载" means ready for the engine this client runs first (whisper.cpp with native inference, otherwise the browser engine). A desktop client ready with the companion alone gets a "补全" button for its browser fallback; a browser client is never asked for the companion. - New strings have en/it/ru entries. Italian settings entries go to a new it/localModels.ts shard because it/settings.ts is at the 500-line ceiling. Tests: asr-models.verify covers each group alone, a same-size corrupted companion, and the catalog flags. native-asr-service.verify runs a GGML-only install and refuses an ONNX-only one before starting a worker. The new local-asr-engine-order.verify drives localTranscribePathResumable through the #168 case, the browser-only case and each failure message; it fails against the previous local-asr.ts. local-asr-model-integrity.verify now covers catalog parsing, the per-engine predicate, the precheck messages and the settings row states. Fixes #168. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 29 天前 | |
fix: harden desktop recovery and media analysis workflows Recover Windows renderer/GPU failures within the selected profile and singleton owner. Ignore clean GPU exits and replay the latest floating transcript payload after renderer reloads. Clear queue-only export hints on active progress and direct completion. Report missing transcripts and explicitly optional music analysis as availability states while preserving stale-source and invalid-target failures. Cap source contact sheets at eight samples and skip browser-local ASR inference for near-silent PCM. Shared paths: recovery stays Windows-gated except the explicit smoke flag; nonqueued export details and default music failures are preserved. No README, persistence schema, dependency, or user-profile changes. Validation: complete pretest/posttest coverage and 104 core test segments; tsc -b --force, lint, web build, desktop build, and targeted lifecycle/stale-transcript checks passed. Real DeepSeek completed read_transcript, 6/8/2-frame extraction, optional missing-model music analysis, and zero-word local ASR; project/media/chat survived refresh. macOS Electron baseline and forced main/floating renderer recovery both reached SMOKE-OK. Windows/Linux hardware and CI were not run. Evidence: /tmp/openchatcut-commit-validation-20260830/validation-summary.md. | 1 个月前 | |
fix(asr): explain a wasm out-of-memory failure in the UI language #165 replaced onnxruntime-web's bare std::bad_alloc with a Chinese sentence built inside the ASR worker. The worker has no locale dictionaries, so en, it and ru users (#120's reporter writes Russian) still got Chinese. It was also wrapped in an untranslated "模型推理失败:" stage prefix. And its advice, "在桌面端 开启本地原生推理", named a toggle that does not exist ("桌面原生推理加速" is on by default) and was the wrong fix in a browser. - The worker reports the failure by kind (failure: 'wasm-out-of-memory' on its error message). It still drops the exhausted session as before. - LocalAsrClient words it with t(): it names the model by its settings label, points at 设置 → 本地模型 → 本地转写 for a smaller tier, and offers the whisper.cpp way out that applies (turn on 桌面原生推理加速 and download the model in the desktop app; use the desktop app from a browser). - The stage prefix and the four stage names go through t() as well, so the whole message reads in one language. - en/it/ru entries for all of the above. local-asr-warmup.verify drives a real LocalAsrClient against a fake worker that reports the failure kind, and checks both the browser and the desktop wording. It fails when the client ignores the kind. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 29 天前 | |
fix(asr): explain a wasm out-of-memory failure in the UI language #165 replaced onnxruntime-web's bare std::bad_alloc with a Chinese sentence built inside the ASR worker. The worker has no locale dictionaries, so en, it and ru users (#120's reporter writes Russian) still got Chinese. It was also wrapped in an untranslated "模型推理失败:" stage prefix. And its advice, "在桌面端 开启本地原生推理", named a toggle that does not exist ("桌面原生推理加速" is on by default) and was the wrong fix in a browser. - The worker reports the failure by kind (failure: 'wasm-out-of-memory' on its error message). It still drops the exhausted session as before. - LocalAsrClient words it with t(): it names the model by its settings label, points at 设置 → 本地模型 → 本地转写 for a smaller tier, and offers the whisper.cpp way out that applies (turn on 桌面原生推理加速 and download the model in the desktop app; use the desktop app from a browser). - The stage prefix and the four stage names go through t() as well, so the whole message reads in one language. - en/it/ru entries for all of the above. local-asr-warmup.verify drives a real LocalAsrClient against a fake worker that reports the failure kind, and checks both the browser and the desktop wording. It fails when the client ignores the kind. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 29 天前 | |
fix(asr): explain a wasm out-of-memory failure in the UI language #165 replaced onnxruntime-web's bare std::bad_alloc with a Chinese sentence built inside the ASR worker. The worker has no locale dictionaries, so en, it and ru users (#120's reporter writes Russian) still got Chinese. It was also wrapped in an untranslated "模型推理失败:" stage prefix. And its advice, "在桌面端 开启本地原生推理", named a toggle that does not exist ("桌面原生推理加速" is on by default) and was the wrong fix in a browser. - The worker reports the failure by kind (failure: 'wasm-out-of-memory' on its error message). It still drops the exhausted session as before. - LocalAsrClient words it with t(): it names the model by its settings label, points at 设置 → 本地模型 → 本地转写 for a smaller tier, and offers the whisper.cpp way out that applies (turn on 桌面原生推理加速 and download the model in the desktop app; use the desktop app from a browser). - The stage prefix and the four stage names go through t() as well, so the whole message reads in one language. - en/it/ru entries for all of the above. local-asr-warmup.verify drives a real LocalAsrClient against a fake worker that reports the failure kind, and checks both the browser and the desktop wording. It fails when the client ignores the kind. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 29 天前 | |
fix(asr): explain a wasm out-of-memory failure in the UI language #165 replaced onnxruntime-web's bare std::bad_alloc with a Chinese sentence built inside the ASR worker. The worker has no locale dictionaries, so en, it and ru users (#120's reporter writes Russian) still got Chinese. It was also wrapped in an untranslated "模型推理失败:" stage prefix. And its advice, "在桌面端 开启本地原生推理", named a toggle that does not exist ("桌面原生推理加速" is on by default) and was the wrong fix in a browser. - The worker reports the failure by kind (failure: 'wasm-out-of-memory' on its error message). It still drops the exhausted session as before. - LocalAsrClient words it with t(): it names the model by its settings label, points at 设置 → 本地模型 → 本地转写 for a smaller tier, and offers the whisper.cpp way out that applies (turn on 桌面原生推理加速 and download the model in the desktop app; use the desktop app from a browser). - The stage prefix and the four stage names go through t() as well, so the whole message reads in one language. - en/it/ru entries for all of the above. local-asr-warmup.verify drives a real LocalAsrClient against a fake worker that reports the failure kind, and checks both the browser and the desktop wording. It fails when the client ignores the kind. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 29 天前 | |
feat: add compact agent transcript view | 3 个月前 | |
fix(quality): revive watchdogs, fix orphan checks, and unify skill count Resurrect two silent quality gateways and wire them into the test suite, catch up CHANGELOG and skill-count docs, and convert every orphaned verify/check file into a tracked, npm-wired regression. Quality watchdogs (now in pretest): - verify:shortcuts: catalog count 54->56, keymap scope, native-copy - verify:i18n: check-i18n.mjs now exempts test files; 4 real UI files wrapped in t(); 62 missing en keys added across 9 dict slices - Fixed stableOverrideKeys merging distinct legacy caption overrides when wordRef is empty (3 overrides collapsed to one key) - Fixed buildFollowupWidget silently dropping option-less choice fields (now degrades to a prompt line) - Fixed apply_script repack being silently rejected by the same-track overlap guard: reorderTrackItems now accepts explicit starts and apply_script rebuys atomically per track Docs: - CHANGELOG [Unreleased]: SQLite migration, session-recovery, chat-load-perf, Geist fonts, platform inference routing; fixed link refs - Skill count unified to 26 (README/README_ZH/AGENTS.md/tools.ts) Verify/check cleanup: - Promoted 81 .check.ts to tracked .verify.ts and deleted the originals - Fixed 20+ stale assertions (PROJECT_VERSION 3->7, sourceRevision, caption-track structure, legacy index selectors, shader hash re-pins, abort wiring refactor, stock orientation enum) - 8 new verify groups (editor/captions/agent-tools/components/ media-persist/export-gl/server-extra/sqlite-migration) wired into pretest - Orphan verify count: 158 -> 0 Full npm test, tsc -b --force, and npm run lint all pass. | 2 个月前 | |
fix: preserve offline edits and optimize editor workflows Recover conflicting offline project documents into verified, retry-safe copies without replacing the original project. Harden skill installation and media stream handling, deduplicate loudness work, reuse transcript projections, and load sequence options only when needed. Split oversized source modules while preserving their public exports. Expand affected verification coverage, add a macOS frame-sync CI job, and update vulnerable media dependency overrides. Shared-path impact: - Persistence recovery runs only for pending conflicting documents. Normal saves keep their existing format, media URLs, and ownership rules. Recovery confirms document and index writes before clearing pending state. - Agent and UI loudness paths retain existing volume limits and undo behavior; repeated sources share bounded analysis and stale sources are rejected. - Transcript, caption, preview, export, server, and desktop module moves keep existing call contracts. Differential checks cover projections and stored job reports; media transport checks cover ranges, empty files, and aborts. Validation: - Full TypeScript project build, zero-warning lint, and production build passed. - npm test preflight passed; all 172 test segments passed after registering the new verification files (TEST_CONCURRENCY=2 npm run test --ignore-scripts). - Final persistence changes passed project-store transport and recovery checks, lint, build, and the 561-verification gate coverage check. - npm audit --omit=dev reported zero vulnerabilities. - Real DeepSeek Agent invoked add_audio and normalize_loudness successfully. Browser checks covered import, save/reopen, undo/redo, and offline recovery with the original project and recovered media preserved. - Native macOS frame-sync checks and real FFmpeg media checks passed. The new remote macOS CI job has not yet run. | 1 个月前 | |
feat(media): pool-level transcription controls with auto-transcribe policy Issue #87. Pool cards now expose transcription directly, so the transcribe-then-edit documentary workflow no longer needs the timeline as an ASR trigger. - Media-pool cards show a mic button (hover) and per-asset ASR status (spinner while running, check when done, error tooltip on failure), wired through the established startAssetTranscription/enqueueTranscription path with EditorCommands.setAssetTranscription persistence. - Right-click asset menu gains a Transcribe entry that runs on the whole selection, so batch transcription is two clicks after import_folder. - New AUTO_TRANSCRIBE_INGEST keystore setting (off/local/all, default local) gates every ingest ASR start: upload, relink, mobile upload, and watched-folder imports. Local Whisper stays automatic and free; paid cloud providers stop auto-burning quota unless explicitly set to all. - auto-transcribe-ingest.verify.ts covers the policy matrix; media-pool verify suites and full tsc -b stay green. Shared-path impact: the ingest gate (useEditorMediaIngest poolImportHooks and ingestToPool) previously started ASR unconditionally on import; it now consults the policy, defaulting to local-only. Cloud-provider users see a behavior change (no more silent paid transcription on import) — the regression surface is limited to that gate and covered by verify. | 2 个月前 | |
docs: translate code comments to English | 2 个月前 | |
feat: expand media generation and caption editing | 3 个月前 | |
fix(quality): revive watchdogs, fix orphan checks, and unify skill count Resurrect two silent quality gateways and wire them into the test suite, catch up CHANGELOG and skill-count docs, and convert every orphaned verify/check file into a tracked, npm-wired regression. Quality watchdogs (now in pretest): - verify:shortcuts: catalog count 54->56, keymap scope, native-copy - verify:i18n: check-i18n.mjs now exempts test files; 4 real UI files wrapped in t(); 62 missing en keys added across 9 dict slices - Fixed stableOverrideKeys merging distinct legacy caption overrides when wordRef is empty (3 overrides collapsed to one key) - Fixed buildFollowupWidget silently dropping option-less choice fields (now degrades to a prompt line) - Fixed apply_script repack being silently rejected by the same-track overlap guard: reorderTrackItems now accepts explicit starts and apply_script rebuys atomically per track Docs: - CHANGELOG [Unreleased]: SQLite migration, session-recovery, chat-load-perf, Geist fonts, platform inference routing; fixed link refs - Skill count unified to 26 (README/README_ZH/AGENTS.md/tools.ts) Verify/check cleanup: - Promoted 81 .check.ts to tracked .verify.ts and deleted the originals - Fixed 20+ stale assertions (PROJECT_VERSION 3->7, sourceRevision, caption-track structure, legacy index selectors, shader hash re-pins, abort wiring refactor, stock orientation enum) - 8 new verify groups (editor/captions/agent-tools/components/ media-persist/export-gl/server-extra/sqlite-migration) wired into pretest - Orphan verify count: 158 -> 0 Full npm test, tsc -b --force, and npm run lint all pass. | 2 个月前 | |
fix: close agent and desktop regression gaps Keep Codex tool activation and business-failure settlement consistent, preserve media identity across agent edits, and expose complete timeline projections. Harden transcript recovery, capability fallbacks, media ingest, and Jianying export while adding a shared model-cache path plus Windows fresh-process persistence CI. | 2 个月前 | |
feat(editor): improve Agent and caption workflows - Gate every Agent send until the configured model catalog is ready and retry one transient pre-output failure. - Import tolerant SRT files into isolated caption tracks and stream local ASR uploads through a same-origin JSON route. - Keep responsive editor controls separate and make panel dividers keyboard-resizable. Co-authored-by: matthewdonsemail-lab <matthewdonsemail@gmail.com> | 2 个月前 | |
feat(speech): expand AI SDK voice and transcription providers Add opt-in OpenAI, Gemini, Mistral, and Cartesia TTS plus OpenAI, Mistral, Deepgram, Groq, ElevenLabs, and Cartesia cloud transcription. Preserve AssemblyAI, local Whisper, and existing voice defaults; credentials remain server-side. Add provider settings, Agent discovery, connection probes, official marks, durable provider checkpoints, and regression coverage. Verified with real Agent TTS/transcription browser flows, npm test, zero-warning lint, production build, probe smoke, and independent review. | 2 个月前 | |
fix(transcript): prevent whole-video fallback for local ASR Require compact audio extraction on the browser-local ASR path and retain stage-specific failures instead of attributing every error to model downloads. Expose Russian transcription in settings and local model language labels. Shared-path impact: extraction remains optional for cloud and desktop-native callers. Existing fallback behavior, model readiness validation, project data, and editor commands are unchanged. Independent silence-detection work is excluded from this commit. Validation: - Staged snapshot: TypeScript build, lint, and assemblyai, language settings, transcript-tools, and mediaSourceRevision verifies passed. - Development tree: 16 affected verifies and production build passed. - Real browser Agent smoke: gpt-5.6-sol invoked transcribe_track with provider=local; a 17,350-byte extracted audio file produced three words. - Full development-tree tests hit an unrelated pending read_transcript contract change; that contract verify passes in the staged snapshot. Refs #120 | 1 个月前 | |
docs: translate code comments to English | 2 个月前 | |
fix(quality): revive watchdogs, fix orphan checks, and unify skill count Resurrect two silent quality gateways and wire them into the test suite, catch up CHANGELOG and skill-count docs, and convert every orphaned verify/check file into a tracked, npm-wired regression. Quality watchdogs (now in pretest): - verify:shortcuts: catalog count 54->56, keymap scope, native-copy - verify:i18n: check-i18n.mjs now exempts test files; 4 real UI files wrapped in t(); 62 missing en keys added across 9 dict slices - Fixed stableOverrideKeys merging distinct legacy caption overrides when wordRef is empty (3 overrides collapsed to one key) - Fixed buildFollowupWidget silently dropping option-less choice fields (now degrades to a prompt line) - Fixed apply_script repack being silently rejected by the same-track overlap guard: reorderTrackItems now accepts explicit starts and apply_script rebuys atomically per track Docs: - CHANGELOG [Unreleased]: SQLite migration, session-recovery, chat-load-perf, Geist fonts, platform inference routing; fixed link refs - Skill count unified to 26 (README/README_ZH/AGENTS.md/tools.ts) Verify/check cleanup: - Promoted 81 .check.ts to tracked .verify.ts and deleted the originals - Fixed 20+ stale assertions (PROJECT_VERSION 3->7, sourceRevision, caption-track structure, legacy index selectors, shader hash re-pins, abort wiring refactor, stock orientation enum) - 8 new verify groups (editor/captions/agent-tools/components/ media-persist/export-gl/server-extra/sqlite-migration) wired into pretest - Orphan verify count: 158 -> 0 Full npm test, tsc -b --force, and npm run lint all pass. | 2 个月前 | |
fix: preserve offline edits and optimize editor workflows Recover conflicting offline project documents into verified, retry-safe copies without replacing the original project. Harden skill installation and media stream handling, deduplicate loudness work, reuse transcript projections, and load sequence options only when needed. Split oversized source modules while preserving their public exports. Expand affected verification coverage, add a macOS frame-sync CI job, and update vulnerable media dependency overrides. Shared-path impact: - Persistence recovery runs only for pending conflicting documents. Normal saves keep their existing format, media URLs, and ownership rules. Recovery confirms document and index writes before clearing pending state. - Agent and UI loudness paths retain existing volume limits and undo behavior; repeated sources share bounded analysis and stale sources are rejected. - Transcript, caption, preview, export, server, and desktop module moves keep existing call contracts. Differential checks cover projections and stored job reports; media transport checks cover ranges, empty files, and aborts. Validation: - Full TypeScript project build, zero-warning lint, and production build passed. - npm test preflight passed; all 172 test segments passed after registering the new verification files (TEST_CONCURRENCY=2 npm run test --ignore-scripts). - Final persistence changes passed project-store transport and recovery checks, lint, build, and the 561-verification gate coverage check. - npm audit --omit=dev reported zero vulnerabilities. - Real DeepSeek Agent invoked add_audio and normalize_loudness successfully. Browser checks covered import, save/reopen, undo/redo, and offline recovery with the original project and recovered media preserved. - Native macOS frame-sync checks and real FFmpeg media checks passed. The new remote macOS CI job has not yet run. | 1 个月前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 1 个月前 | ||
| 1 个月前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 2 个月前 | ||
| 3 个月前 | ||
| 1 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 15 天前 | ||
| 15 天前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 29 天前 | ||
| 29 天前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 29 天前 | ||
| 1 个月前 | ||
| 29 天前 | ||
| 29 天前 | ||
| 29 天前 | ||
| 29 天前 | ||
| 3 个月前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 3 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 1 个月前 |