@xopcai/xopc 0.0.277 → 0.0.282
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser-ext/_locales/en/messages.json +34 -4
- package/dist/browser-ext/_locales/zh_CN/messages.json +34 -4
- package/dist/browser-ext/dist/assets/{auth-ClQTK565.js → auth-DB30ywek.js} +18 -53
- package/dist/browser-ext/dist/assets/pcm-capture-worklet-CGN9Mlhg.js +39 -0
- package/dist/browser-ext/dist/assets/{sidepanel-CeGqObOa.css → sidepanel-BbSQr-6P.css} +40 -6
- package/dist/browser-ext/dist/background.js +1 -1
- package/dist/browser-ext/dist/sidepanel.html +2 -2
- package/dist/browser-ext/dist/sidepanel.js +1219 -191
- package/dist/browser-ext/manifest.json +2 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/{activity-store-SJZ5fS17.js → activity-store-iPtG94qr.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-Cavbls0E.js → agent-avatar-dicebear-Cny5rATT.js} +1 -1
- package/dist/gateway/static/root/assets/agent-defaults-settings-panel-OyQ8OVZv.js +1 -0
- package/dist/gateway/static/root/assets/{agents-DlDTItrB.js → agents-DJeh_Ewo.js} +1 -1
- package/dist/gateway/static/root/assets/{api-CnJAVHBu.js → api-KMJzMqvZ.js} +1 -1
- package/dist/gateway/static/root/assets/{app-management-settings-panel-5gS0_LWl.js → app-management-settings-panel-ZqQKaZEI.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-DHzZCJon.js → appearance-settings-CfXsQkKO.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-k-QnVhKW.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-Ia98yZe3.js → archive-plugin-BrW53Hap.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-DiWW88c8.js → attachment-load-DkfFWHiS.js} +1 -1
- package/dist/gateway/static/root/assets/{automations-page-BuhTeGRJ.js → automations-page-e-5we6kD.js} +1 -1
- package/dist/gateway/static/root/assets/automations-workspace-DPnlkws1.js +6 -0
- package/dist/gateway/static/root/assets/{binary-plugins-DDD48cJv.js → binary-plugins-CWIswfXA.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-0AWVCD3F.js → block-editor-CfeF1OmA.js} +3 -3
- package/dist/gateway/static/root/assets/{browser-automation-inputs-DcVLoIzc.js → browser-automation-inputs-BTIufVbM.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-automations-page-BKOYX5xV.js → browser-automations-page-DnsuWKRu.js} +2 -2
- package/dist/gateway/static/root/assets/browser-settings-page-C8xyhnxx.js +8 -0
- package/dist/gateway/static/root/assets/capabilities-settings-panel-CBllOLTT.js +8 -0
- package/dist/gateway/static/root/assets/channels-settings-C-A-VUE2.js +1 -0
- package/dist/gateway/static/root/assets/{channels-status-swr-BTT2sIGg.js → channels-status-swr-DMYQNs-J.js} +1 -1
- package/dist/gateway/static/root/assets/{chat-terminal-dock-CW9Byi8V.js → chat-terminal-dock-C_Fw1R3A.js} +2 -2
- package/dist/gateway/static/root/assets/connectors-page-CtsMo3H4.js +2 -0
- package/dist/gateway/static/root/assets/{date-picker-gdYmKC8W.js → date-picker-CPFxjTrN.js} +1 -1
- package/dist/gateway/static/root/assets/{dependency-picker-40BYmiMc.js → dependency-picker-C_5KqzjI.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-By1z6tKE.js → desktop-pet-DLJsC5D6.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-settings-ByjJqx9H.js → desktop-pet-settings-BdI1iSgz.js} +1 -1
- package/dist/gateway/static/root/assets/device-pairing-wizard-BnvPLhc9.js +1 -0
- package/dist/gateway/static/root/assets/{extension-debug-page-DQO65KbM.js → extension-debug-page-BNS_TkZQ.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-Db32jip6.js → extension-page-DMSDZ7Mb.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-CL8Wx8lf.js → extension-settings-page-CeGCWMt0.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-config-swr-Cpmyrr6j.js +1 -0
- package/dist/gateway/static/root/assets/gateway-settings-DKOTYUma.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-startup-retry-CVTa5HSS.js → gateway-startup-retry-DoiPeb65.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-settings-CRXWu2q6.js → heartbeat-settings-gsdL_Yij.js} +1 -1
- package/dist/gateway/static/root/assets/home-page-CbeAdS1T.js +1 -0
- package/dist/gateway/static/root/assets/{image-generation-api-DtMRG1oF.js → image-generation-api-CqjHWl2T.js} +1 -1
- package/dist/gateway/static/root/assets/index-B_Sg5BKz.css +2 -0
- package/dist/gateway/static/root/assets/index-enFXJJCU.js +74 -0
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-CjehhHPz.js → keyboard-shortcuts-settings-CCLtJ8s8.js} +1 -1
- package/dist/gateway/static/root/assets/local-app-workbench-page-DzC6SrXj.js +2 -0
- package/dist/gateway/static/root/assets/{local-apps-page-CrIdaTrK.js → local-apps-page-3LdgP3NO.js} +1 -1
- package/dist/gateway/static/root/assets/{locale-store-BkJ7g35d.js → locale-store-1urrBBCQ.js} +1 -1
- package/dist/gateway/static/root/assets/{logs-page-FfSwV_VH.js → logs-page-DHClKtm6.js} +2 -2
- package/dist/gateway/static/root/assets/{management-settings-BakV5aOw.js → management-settings-BaCo9Nuo.js} +1 -1
- package/dist/gateway/static/root/assets/{markdown-view-DF3aJP_5.js → markdown-view-BZmcFIWa.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-Blv9U6Jp.js → media-plugins-BMjJppvG.js} +1 -1
- package/dist/gateway/static/root/assets/messages-DYFcjtmG.js +3 -0
- package/dist/gateway/static/root/assets/note-detail-panel-hYO2jNhL.js +5 -0
- package/dist/gateway/static/root/assets/notes-page-BT66x22W.js +8 -0
- package/dist/gateway/static/root/assets/{page-tabs-BQfVtLLC.js → page-tabs-BCszXX_F.js} +1 -1
- package/dist/gateway/static/root/assets/{preview-open-alternatives-kjHFiO81.js → preview-open-alternatives-CyM0sanh.js} +1 -1
- package/dist/gateway/static/root/assets/proactive-page-CVDGA5sB.js +1 -0
- package/dist/gateway/static/root/assets/{product-open-page-BazdmFYo.js → product-open-page-lXAbj85Z.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-Bp6TAMPM.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-UhOIiDcg.js +1 -0
- package/dist/gateway/static/root/assets/{registry-api-CTq8EECj.js → registry-api-CxQstD00.js} +1 -1
- package/dist/gateway/static/root/assets/remote-access-hub-DJIkMFT4.js +1 -0
- package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-BhJlopSW.js → runtime-tools-settings-panel-BUFCgRdZ.js} +2 -2
- package/dist/gateway/static/root/assets/{schema-form-cxoO_5I1.js → schema-form-B01ksA8M.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-CQOAwPDt.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-CFuqbGI-.js +1 -0
- package/dist/gateway/static/root/assets/{settings-form-section-BiRTWiBi.js → settings-form-section-DvnjZBa3.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-D-Cb71pq.js → settings-page-DZRkpbCh.js} +1 -1
- package/dist/gateway/static/root/assets/setup-status-panel-DVaEiAVY.js +1 -0
- package/dist/gateway/static/root/assets/{share-preview-page-DciHfTay.js → share-preview-page-vz0UK56q.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-XiCqMDAe.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-C3D8WanU.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-CxMWwR6A.js +2 -0
- package/dist/gateway/static/root/assets/{skills-page.utils-CU7PALQB.js → skills-page.utils-BryVNYll.js} +1 -1
- package/dist/gateway/static/root/assets/{system-settings-panel-GpjNbqvM.js → system-settings-panel-mKFDe6aZ.js} +1 -1
- package/dist/gateway/static/root/assets/task-detail-page-Cb0RZNcJ.js +1 -0
- package/dist/gateway/static/root/assets/{theme-store-mV6Cm2vj.js → theme-store-Dc5s20V3.js} +1 -1
- package/dist/gateway/static/root/assets/tunnel-api-FcI3wKy3.js +1 -0
- package/dist/gateway/static/root/assets/{use-autosave-LvCiBidm.js → use-autosave-CDgdtjTC.js} +1 -1
- package/dist/gateway/static/root/assets/user-model-page-Cnshc-Un.js +2 -0
- package/dist/gateway/static/root/assets/{voice-api-key-field-BlGysZxj.js → voice-api-key-field-Ce8cb5mN.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-config-api-D3DdcH4H.js → voice-config-api-Mk78BrpP.js} +1 -1
- package/dist/gateway/static/root/assets/{work-discovery-overlay-DvIQOR5x.js → work-discovery-overlay-CacFTtXe.js} +1 -1
- package/dist/gateway/static/root/assets/{workflow-run-setup-panel-JIp60bXT.js → workflow-run-setup-panel-V-5HuEUq.js} +2 -2
- package/dist/gateway/static/root/assets/workflows-page-1OJimIfo.js +6 -0
- package/dist/gateway/static/root/index.html +10 -11
- package/dist/package.js +1 -1
- package/dist/packages/gateway-contract/src/discussions.js +17 -0
- package/dist/packages/gateway-contract/src/proactive.js +4 -2
- package/dist/src/agent/agent-manager.js +4 -4
- package/dist/src/agent/background-review/run-background-review.js +1 -1
- package/dist/src/agent/commands/command-isolation.d.ts +1 -0
- package/dist/src/agent/commands/command-isolation.js +17 -1
- package/dist/src/agent/commands/commandMounts.d.ts +2 -0
- package/dist/src/agent/commands/commandMounts.js +32 -0
- package/dist/src/agent/context/project-context.d.ts +1 -0
- package/dist/src/agent/context/project-context.js +12 -4
- package/dist/src/agent/embedded/model-runtime.js +1 -1
- package/dist/src/agent/embedded/run-for-session.js +1 -1
- package/dist/src/agent/image/tool-model-config.js +1 -1
- package/dist/src/agent/mcp/oauth/mcp-oauth-store.js +1 -1
- package/dist/src/agent/sandbox/command-validator.js +0 -20
- package/dist/src/agent/sandbox/exec-policy.d.ts +1 -0
- package/dist/src/agent/sandbox/exec-policy.js +4 -4
- package/dist/src/agent/sandbox/fileAccess.d.ts +7 -0
- package/dist/src/agent/sandbox/fileAccess.js +100 -0
- package/dist/src/agent/sandbox/path-policy.d.ts +2 -0
- package/dist/src/agent/sandbox/path-policy.js +54 -17
- package/dist/src/agent/sandbox/sanitize-env-vars.js +10 -9
- package/dist/src/agent/service.js +2 -2
- package/dist/src/agent/session/session-inspector.js +1 -1
- package/dist/src/agent/skills/hub-lock.js +1 -1
- package/dist/src/agent/source-context/task-context.d.ts +3 -0
- package/dist/src/agent/source-context/task-context.js +24 -0
- package/dist/src/agent/source-context/types.d.ts +2 -2
- package/dist/src/agent/source-context/types.js +1 -1
- package/dist/src/agent/tasks/task-judge-service.js +3 -3
- package/dist/src/agent/tool-manuals/xopc-use.d.ts +1 -1
- package/dist/src/agent/tool-manuals/xopc-use.js +1 -0
- package/dist/src/agent/tools/apply-patch.js +25 -38
- package/dist/src/agent/tools/create-share-tool.js +11 -3
- package/dist/src/agent/tools/exec-command.js +2 -1
- package/dist/src/agent/tools/find.js +5 -3
- package/dist/src/agent/tools/grep.js +21 -4
- package/dist/src/agent/tools/image-generate-tool.js +3 -4
- package/dist/src/agent/tools/list-dir.js +2 -1
- package/dist/src/agent/tools/managed-job-tool.js +1 -0
- package/dist/src/agent/tools/publish-artifacts.js +4 -3
- package/dist/src/agent/tools/read.js +8 -5
- package/dist/src/agent/tools/repository-search.d.ts +2 -0
- package/dist/src/agent/tools/repository-search.js +51 -7
- package/dist/src/agent/tools/review-workspace.js +76 -10
- package/dist/src/agent/tools/send-media.js +4 -3
- package/dist/src/agent/tools/tool-paths.js +3 -1
- package/dist/src/agent/tools/write.js +4 -17
- package/dist/src/agent/tools/xopc-use-tool.js +2 -2
- package/dist/src/agent-config/schema.d.ts +24 -0
- package/dist/src/agent-config/schema.js +2 -1
- package/dist/src/ai-assist/text-assist.js +1 -1
- package/dist/src/auth/credentials.js +2 -2
- package/dist/src/auth/oauth/xopc-cloud.js +1 -1
- package/dist/src/auth/profiles/store.js +1 -1
- package/dist/src/auth/sync-provider-auth.js +2 -2
- package/dist/src/browser/providers/browser-ext-install.js +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/doctor/checks/provider-auth.js +21 -20
- package/dist/src/cli/commands/models.js +1 -1
- package/dist/src/config/index.js +4 -4
- package/dist/src/config/loader.js +2 -2
- package/dist/src/config/models-json.js +1 -1
- package/dist/src/config/schema.d.ts +16 -0
- package/dist/src/discussions/action-tasks.d.ts +21 -0
- package/dist/src/discussions/action-tasks.js +93 -0
- package/dist/src/discussions/analyzer.d.ts +21 -1
- package/dist/src/discussions/analyzer.js +229 -62
- package/dist/src/discussions/audio-repair.d.ts +8 -0
- package/dist/src/discussions/audio-repair.js +41 -0
- package/dist/src/discussions/edits.d.ts +22 -0
- package/dist/src/discussions/edits.js +81 -0
- package/dist/src/discussions/errors.d.ts +4 -0
- package/dist/src/discussions/errors.js +10 -0
- package/dist/src/discussions/export.d.ts +2 -0
- package/dist/src/discussions/export.js +23 -0
- package/dist/src/discussions/index.js +3 -2
- package/dist/src/discussions/live-worker.js +1 -1
- package/dist/src/discussions/organizer-worker.js +14 -5
- package/dist/src/discussions/organizer.d.ts +1 -1
- package/dist/src/discussions/organizer.js +60 -24
- package/dist/src/discussions/reconcile.d.ts +22 -0
- package/dist/src/discussions/reconcile.js +55 -0
- package/dist/src/discussions/recording.d.ts +9 -0
- package/dist/src/discussions/recording.js +219 -0
- package/dist/src/discussions/recordingJobs.d.ts +14 -0
- package/dist/src/discussions/recordingJobs.js +69 -0
- package/dist/src/discussions/repository.d.ts +4 -2
- package/dist/src/discussions/repository.js +15 -10
- package/dist/src/discussions/revisions.d.ts +12 -0
- package/dist/src/discussions/revisions.js +36 -0
- package/dist/src/discussions/sealer.d.ts +1 -0
- package/dist/src/discussions/sealer.js +61 -11
- package/dist/src/discussions/service.d.ts +16 -15
- package/dist/src/discussions/service.js +177 -91
- package/dist/src/discussions/types.d.ts +4 -139
- package/dist/src/discussions/types.js +1 -11
- package/dist/src/extensions/lockfile.js +1 -1
- package/dist/src/files/file-service.d.ts +1 -0
- package/dist/src/files/file-service.js +77 -0
- package/dist/src/gateway/agents-admin.js +1 -1
- package/dist/src/gateway/chat-stream/mapper.js +2 -2
- package/dist/src/gateway/file-path-classifier.js +1 -1
- package/dist/src/gateway/hono/app.js +3 -2
- package/dist/src/gateway/hono/lib/config-payload.d.ts +1 -0
- package/dist/src/gateway/hono/lib/config-payload.js +1 -1
- package/dist/src/gateway/hono/lib/static-ui.js +1 -0
- package/dist/src/gateway/hono/routes/context-sources.js +1 -2
- package/dist/src/gateway/hono/routes/discussions.js +126 -19
- package/dist/src/gateway/hono/routes/files.js +1 -22
- package/dist/src/gateway/hono/routes/index.js +0 -2
- package/dist/src/gateway/hono/routes/lazy-bundles.js +16 -0
- package/dist/src/gateway/hono/routes/models.js +1 -1
- package/dist/src/gateway/hono/routes/proactive-control.js +2 -36
- package/dist/src/gateway/hono/routes/project-understanding.d.ts +3 -0
- package/dist/src/gateway/hono/routes/project-understanding.js +65 -0
- package/dist/src/gateway/hono/routes/projects.js +20 -4
- package/dist/src/gateway/hono/routes/session-input-handler.d.ts +2 -2
- package/dist/src/gateway/hono/routes/session-input-handler.js +2 -2
- package/dist/src/gateway/hono/routes/shares.js +22 -1
- package/dist/src/gateway/hono/routes/tasks.js +2 -1
- package/dist/src/gateway/hono/routes/work-discovery.d.ts +0 -2
- package/dist/src/gateway/hono/routes/work-discovery.js +2 -16
- package/dist/src/gateway/hono/routes/workflows.js +2 -2
- package/dist/src/gateway/security/gateway-scopes.js +1 -2
- package/dist/src/gateway/service/agent-runner.js +2 -2
- package/dist/src/gateway/service/config-coordinator.js +1 -1
- package/dist/src/gateway/service.d.ts +3 -0
- package/dist/src/gateway/service.js +28 -13
- package/dist/src/knowledge-memory/repository.d.ts +2 -0
- package/dist/src/knowledge-memory/repository.js +3 -1
- package/dist/src/media-understanding/audio-transcription-runner.d.ts +1 -0
- package/dist/src/media-understanding/audio-transcription-runner.js +1 -0
- package/dist/src/media-understanding/runner.js +1 -0
- package/dist/src/media-understanding/types.d.ts +8 -0
- package/dist/src/notes/service.d.ts +3 -1
- package/dist/src/notes/store.d.ts +3 -1
- package/dist/src/notes/store.js +5 -3
- package/dist/src/proactive/experience.d.ts +38 -21
- package/dist/src/proactive/experience.js +113 -12
- package/dist/src/proactive/inbox/cards.js +7 -1
- package/dist/src/proactive/maintenance.js +0 -1
- package/dist/src/proactive/scenarios/control.d.ts +0 -35
- package/dist/src/proactive/scenarios/control.js +7 -53
- package/dist/src/projects/project-store.js +6 -4
- package/dist/src/providers/auth-runtime/resolve-auth.js +1 -1
- package/dist/src/providers/index.js +2 -2
- package/dist/src/providers/model-registry.js +1 -1
- package/dist/src/providers/register-runtime-providers.js +1 -1
- package/dist/src/session/client-history.d.ts +1 -1
- package/dist/src/session/client-history.js +1 -1
- package/dist/src/share/share-store.js +5 -1
- package/dist/src/storage/sqlite/migrations/166_remove_proactive_previews.sql +1 -0
- package/dist/src/storage/sqlite/migrations/167_discussion_recording_chunks.sql +7 -0
- package/dist/src/storage/sqlite/migrations/168_discussion_evidence.sql +16 -0
- package/dist/src/storage/sqlite/migrations/169_discussion_action_tasks.sql +8 -0
- package/dist/src/storage/sqlite/migrations/170_discussion_edits.sql +8 -0
- package/dist/src/storage/sqlite/migrations/171_discussion_recording_jobs.sql +14 -0
- package/dist/src/storage/sqlite/migrations/172_project_understanding.sql +3 -0
- package/dist/src/storage/sqlite/migrations/173_mobile_discussion_source.sql +5 -0
- package/dist/src/storage/sqlite/migrations/__tests__/mobile-discussion-source.test.ts +20 -0
- package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
- package/dist/src/storage/sqlite/migrations/runner.js +3 -3
- package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
- package/dist/src/storage/sqlite/schema.js +1 -1
- package/dist/src/tasks/home-query-service.js +2 -2
- package/dist/src/tasks/task-application-service.js +77 -3
- package/dist/src/tasks/task-context-assembler.js +1 -0
- package/dist/src/tasks/task-repository.d.ts +1 -0
- package/dist/src/tasks/task-repository.js +4 -0
- package/dist/src/tui/tui-startup-resources.js +1 -1
- package/dist/src/tui/tui.js +1 -1
- package/dist/src/voice/audio/normalize.js +28 -5
- package/dist/src/voice/stt/transcribe-core.js +1 -0
- package/dist/src/voice/stt/types.d.ts +1 -0
- package/dist/src/work-discovery/analyzer.d.ts +1 -0
- package/dist/src/work-discovery/analyzer.js +28 -22
- package/dist/src/work-discovery/index.js +3 -3
- package/dist/src/work-discovery/investigator.js +1 -1
- package/dist/src/work-discovery/project-understanding.d.ts +7 -0
- package/dist/src/work-discovery/project-understanding.js +38 -0
- package/dist/src/work-discovery/repository.d.ts +3 -1
- package/dist/src/work-discovery/repository.js +18 -5
- package/dist/src/work-discovery/service.d.ts +8 -0
- package/dist/src/work-discovery/service.js +163 -15
- package/dist/src/work-discovery/types.d.ts +2 -0
- package/dist/src/workflows/service/workflow-run-service.js +2 -2
- package/package.json +3 -3
- package/dist/gateway/static/root/assets/agent-defaults-settings-panel-DyCyuJpi.js +0 -1
- package/dist/gateway/static/root/assets/apps-page-__yzruGu.js +0 -1
- package/dist/gateway/static/root/assets/automations-workspace-DaisbmEh.js +0 -6
- package/dist/gateway/static/root/assets/browser-settings-page-C7zjxscU.js +0 -8
- package/dist/gateway/static/root/assets/capabilities-settings-panel-7kZMT1r6.js +0 -8
- package/dist/gateway/static/root/assets/channels-settings-BKUh6hzO.js +0 -1
- package/dist/gateway/static/root/assets/config-reload-event-Bjh2zoKp.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-m8J-F3u8.js +0 -2
- package/dist/gateway/static/root/assets/device-pairing-wizard-CfWQfz7a.js +0 -1
- package/dist/gateway/static/root/assets/gateway-config-swr-cd8owslz.js +0 -1
- package/dist/gateway/static/root/assets/gateway-settings-wLly-Kc1.js +0 -1
- package/dist/gateway/static/root/assets/home-page-FqgSwpmy.js +0 -1
- package/dist/gateway/static/root/assets/index-5UchbidQ.js +0 -74
- package/dist/gateway/static/root/assets/index-CXF9-BpI.css +0 -2
- package/dist/gateway/static/root/assets/local-app-workbench-page-DtYZa4GK.js +0 -2
- package/dist/gateway/static/root/assets/messages-BGc-OJWg.js +0 -3
- package/dist/gateway/static/root/assets/note-detail-panel-JbvyGdEX.js +0 -5
- package/dist/gateway/static/root/assets/notes-page-Dm7mE2FK.js +0 -8
- package/dist/gateway/static/root/assets/proactive-card-Ap_wfos3.js +0 -1
- package/dist/gateway/static/root/assets/proactive-page-D1lEuanT.js +0 -1
- package/dist/gateway/static/root/assets/project-detail-page-h00lfcVI.js +0 -1
- package/dist/gateway/static/root/assets/projects-page-C2Bo1FAL.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-_bZYAl49.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-F7CHsvPa.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-DtZSUX4H.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-VPfBsNVv.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-BS2pnWO0.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-DX344nVV.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-BhfKUsv7.js +0 -2
- package/dist/gateway/static/root/assets/task-detail-page-CElcQ9Sh.js +0 -1
- package/dist/gateway/static/root/assets/tunnel-api-Bhi_x_h4.js +0 -1
- package/dist/gateway/static/root/assets/user-model-page-BydARq2C.js +0 -2
- package/dist/gateway/static/root/assets/workflows-page-B972t6zx.js +0 -6
- package/dist/src/proactive/scenarios/preview.d.ts +0 -13
- package/dist/src/proactive/scenarios/preview.js +0 -81
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { getSqliteDatabase, runSqliteWriteTransaction } from "../storage/sqlite/transaction.js";
|
|
2
|
-
import { DISCUSSION_STATUSES } from "
|
|
2
|
+
import { DISCUSSION_STATUSES } from "../../packages/gateway-contract/src/discussions.js";
|
|
3
3
|
import { randomUUID } from "node:crypto";
|
|
4
4
|
//#region src/discussions/repository.ts
|
|
5
5
|
function optional(condition, value) {
|
|
@@ -17,6 +17,7 @@ function discussionFromRow(row) {
|
|
|
17
17
|
createdAt: row.created_at,
|
|
18
18
|
updatedAt: row.updated_at
|
|
19
19
|
};
|
|
20
|
+
capture.template = row.organization_template;
|
|
20
21
|
if (row.project_id) capture.projectId = row.project_id;
|
|
21
22
|
if (row.audio_attachment_id) capture.audioAttachmentId = row.audio_attachment_id;
|
|
22
23
|
if (row.duration_ms != null) capture.durationMs = row.duration_ms;
|
|
@@ -71,6 +72,7 @@ function organizationFromRow(row) {
|
|
|
71
72
|
revision: row.revision,
|
|
72
73
|
inputTranscriptSha256: row.input_transcript_sha256,
|
|
73
74
|
promptVersion: row.prompt_version,
|
|
75
|
+
transcriptRevision: row.transcript_revision,
|
|
74
76
|
modelRef: row.model_ref,
|
|
75
77
|
...optional(row.organization_json, { organization: JSON.parse(row.organization_json) }),
|
|
76
78
|
status: row.status,
|
|
@@ -161,7 +163,7 @@ function updateDiscussionCapture(id, patch, expectedStatuses) {
|
|
|
161
163
|
mime_type=?, audio_size_bytes=?, audio_sha256=?, canonical_transcript=?, canonical_transcript_sha256=?,
|
|
162
164
|
transcript_language=?, transcript_revision=?, generated_title=?, project_inference_score=?,
|
|
163
165
|
project_inference_source=?, failure_stage=?, failure_code=?, failure_message=?, recording_started_at=?,
|
|
164
|
-
recording_stopped_at=?, updated_at=?, completed_at=?, audio_deleted_at=? WHERE id=?${statusGuard}`).run(next.projectId ?? null, next.audioAttachmentId ?? null, next.source, next.status, next.durationMs ?? null, next.expectedLastSequence ?? null, next.mimeType ?? null, next.audioSizeBytes ?? null, next.audioSha256 ?? null, next.canonicalTranscript ?? null, next.canonicalTranscriptSha256 ?? null, next.transcriptLanguage ?? null, next.transcriptRevision, next.generatedTitle ?? null, next.projectInferenceScore ?? null, next.projectInferenceSource ?? null, next.failureStage ?? null, next.failureCode ?? null, next.failureMessage ?? null, next.recordingStartedAt, next.recordingStoppedAt ?? null, next.updatedAt, next.completedAt ?? null, next.audioDeletedAt ?? null, id, ...expectedStatuses ?? []).changes) ? getDiscussionCapture(id) : null;
|
|
166
|
+
recording_stopped_at=?, updated_at=?, completed_at=?, audio_deleted_at=?, organization_template=? WHERE id=?${statusGuard}`).run(next.projectId ?? null, next.audioAttachmentId ?? null, next.source, next.status, next.durationMs ?? null, next.expectedLastSequence ?? null, next.mimeType ?? null, next.audioSizeBytes ?? null, next.audioSha256 ?? null, next.canonicalTranscript ?? null, next.canonicalTranscriptSha256 ?? null, next.transcriptLanguage ?? null, next.transcriptRevision, next.generatedTitle ?? null, next.projectInferenceScore ?? null, next.projectInferenceSource ?? null, next.failureStage ?? null, next.failureCode ?? null, next.failureMessage ?? null, next.recordingStartedAt, next.recordingStoppedAt ?? null, next.updatedAt, next.completedAt ?? null, next.audioDeletedAt ?? null, next.template ?? "general", id, ...expectedStatuses ?? []).changes) ? getDiscussionCapture(id) : null;
|
|
165
167
|
}
|
|
166
168
|
function claimNextDiscussionCapture(owner, now = Date.now(), leaseMs = 5 * 6e4) {
|
|
167
169
|
return runSqliteWriteTransaction((db) => {
|
|
@@ -173,8 +175,8 @@ function claimNextDiscussionCapture(owner, now = Date.now(), leaseMs = 5 * 6e4)
|
|
|
173
175
|
WHERE id=? AND status='organizing' AND (work_lease_owner IS NULL OR work_lease_expires_at <= ?)`).run(owner, now + leaseMs, now, row.id, now).changes ? getDiscussionCapture(row.id) : null;
|
|
174
176
|
});
|
|
175
177
|
}
|
|
176
|
-
function releaseDiscussionWorkLease(id) {
|
|
177
|
-
runSqliteWriteTransaction((db) => db.prepare("UPDATE discussion_captures SET work_lease_owner=NULL, work_lease_expires_at=NULL WHERE id=?").run(id));
|
|
178
|
+
function releaseDiscussionWorkLease(id, owner) {
|
|
179
|
+
runSqliteWriteTransaction((db) => db.prepare("UPDATE discussion_captures SET work_lease_owner=NULL, work_lease_expires_at=NULL WHERE id=? AND work_lease_owner=?").run(id, owner));
|
|
178
180
|
}
|
|
179
181
|
function createDiscussionTranscriptSegment(input) {
|
|
180
182
|
const existing = getDiscussionTranscriptSegment(input.discussionId, input.sequence);
|
|
@@ -228,12 +230,12 @@ function completeDiscussionTranscriptSegment(discussionId, sequence, owner, text
|
|
|
228
230
|
return changed;
|
|
229
231
|
}) ? getDiscussionTranscriptSegment(discussionId, sequence) : null;
|
|
230
232
|
}
|
|
231
|
-
function correctDiscussionTranscriptSegment(discussionId, sequence, displayText, expectedRevision) {
|
|
233
|
+
function correctDiscussionTranscriptSegment(discussionId, sequence, displayText, expectedRevision, speakerLabel) {
|
|
232
234
|
const now = Date.now();
|
|
233
235
|
return runSqliteWriteTransaction((db) => {
|
|
234
|
-
const changed = db.prepare(`UPDATE discussion_transcript_segments SET display_text=?, corrected_by_user=1,
|
|
236
|
+
const changed = db.prepare(`UPDATE discussion_transcript_segments SET display_text=?, speaker_label=CASE WHEN ? THEN ? ELSE speaker_label END, corrected_by_user=1,
|
|
235
237
|
corrected_at=?, revision=revision+1, updated_at=? WHERE discussion_id=? AND sequence=?
|
|
236
|
-
AND status='confirmed' AND revision=?`).run(displayText, now, now, discussionId, sequence, expectedRevision).changes;
|
|
238
|
+
AND status='confirmed' AND revision=?`).run(displayText, speakerLabel === void 0 ? 0 : 1, speakerLabel?.trim() || null, now, now, discussionId, sequence, expectedRevision).changes;
|
|
237
239
|
if (changed) db.prepare("UPDATE discussion_captures SET transcript_revision=transcript_revision+1, updated_at=? WHERE id=?").run(now, discussionId);
|
|
238
240
|
return changed;
|
|
239
241
|
}) ? getDiscussionTranscriptSegment(discussionId, sequence) : null;
|
|
@@ -253,8 +255,8 @@ function createDiscussionOrganization(input) {
|
|
|
253
255
|
const revision = (getLatestDiscussionOrganization(input.discussionId)?.revision ?? 0) + 1;
|
|
254
256
|
const id = randomUUID();
|
|
255
257
|
runSqliteWriteTransaction((db) => db.prepare(`INSERT INTO discussion_organizations (
|
|
256
|
-
id, discussion_id, revision, input_transcript_sha256, prompt_version, model_ref, status, created_at
|
|
257
|
-
) VALUES (?, ?, ?, ?, ?, ?, 'running', ?)`).run(id, input.discussionId, revision, input.inputTranscriptSha256, input.promptVersion, input.modelRef, now));
|
|
258
|
+
id, discussion_id, revision, input_transcript_sha256, prompt_version, model_ref, transcript_revision, status, created_at
|
|
259
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, 'running', ?)`).run(id, input.discussionId, revision, input.inputTranscriptSha256, input.promptVersion, input.modelRef, input.transcriptRevision, now));
|
|
258
260
|
return getLatestDiscussionOrganization(input.discussionId);
|
|
259
261
|
}
|
|
260
262
|
function getLatestDiscussionOrganization(discussionId) {
|
|
@@ -285,5 +287,8 @@ function acknowledgeDiscussionCaptureConsent(policyVersion) {
|
|
|
285
287
|
SET consent_acknowledged_at=?, updated_at=? WHERE workspace_id='default' AND consent_policy_version=?`).run(now, now, policyVersion));
|
|
286
288
|
return getDiscussionCaptureSettings();
|
|
287
289
|
}
|
|
290
|
+
function renewDiscussionWorkLease(id, owner) {
|
|
291
|
+
return Number(getSqliteDatabase().prepare("UPDATE discussion_captures SET work_lease_expires_at=? WHERE id=? AND work_lease_owner=? AND status='organizing'").run(Date.now() + 5 * 6e4, id, owner).changes) === 1;
|
|
292
|
+
}
|
|
288
293
|
//#endregion
|
|
289
|
-
export { acknowledgeDiscussionCaptureConsent, claimNextDiscussionCapture, claimNextDiscussionTranscriptSegment, completeDiscussionOrganization, completeDiscussionTranscriptSegment, correctDiscussionTranscriptSegment, createDiscussionCapture, createDiscussionOrganization, createDiscussionTranscriptSegment, deleteDiscussionSegmentAudio, failDiscussionOrganization, getDiscussionCapture, getDiscussionCaptureByClientRequestId, getDiscussionCaptureByNoteId, getDiscussionCaptureSettings, getDiscussionMetrics, getDiscussionTranscriptSegment, getLatestDiscussionOrganization, listDiscussionCaptures, listDiscussionTranscriptSegments, releaseDiscussionWorkLease, retryOrFailDiscussionTranscriptSegment, updateDiscussionCapture };
|
|
294
|
+
export { acknowledgeDiscussionCaptureConsent, claimNextDiscussionCapture, claimNextDiscussionTranscriptSegment, completeDiscussionOrganization, completeDiscussionTranscriptSegment, correctDiscussionTranscriptSegment, createDiscussionCapture, createDiscussionOrganization, createDiscussionTranscriptSegment, deleteDiscussionSegmentAudio, failDiscussionOrganization, getDiscussionCapture, getDiscussionCaptureByClientRequestId, getDiscussionCaptureByNoteId, getDiscussionCaptureSettings, getDiscussionMetrics, getDiscussionTranscriptSegment, getLatestDiscussionOrganization, listDiscussionCaptures, listDiscussionTranscriptSegments, releaseDiscussionWorkLease, renewDiscussionWorkLease, retryOrFailDiscussionTranscriptSegment, updateDiscussionCapture };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { DiscussionTranscriptSegment } from './types.js';
|
|
2
|
+
export declare function saveTranscriptRevision(id: string): number;
|
|
3
|
+
export declare function readTranscriptRevision(id: string, revision: number): DiscussionTranscriptSegment[] | null;
|
|
4
|
+
export declare function replaceTranscriptSegments(id: string, segments: Array<{
|
|
5
|
+
text: string;
|
|
6
|
+
startedAtMs: number;
|
|
7
|
+
endedAtMs: number;
|
|
8
|
+
speakerLabel?: string;
|
|
9
|
+
correctedByUser?: boolean;
|
|
10
|
+
rawText?: string;
|
|
11
|
+
}>): void;
|
|
12
|
+
export declare function refreshCanonicalTranscript(id: string): void;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { getSqliteDatabase, runSqliteWriteTransaction } from "../storage/sqlite/transaction.js";
|
|
2
|
+
import { getDiscussionCapture, listDiscussionTranscriptSegments, updateDiscussionCapture } from "./repository.js";
|
|
3
|
+
import { assembleDiscussionTranscript } from "./transcript.js";
|
|
4
|
+
import { createHash } from "node:crypto";
|
|
5
|
+
//#region src/discussions/revisions.ts
|
|
6
|
+
function saveTranscriptRevision(id) {
|
|
7
|
+
const capture = getDiscussionCapture(id);
|
|
8
|
+
if (!capture) throw new Error("Discussion not found");
|
|
9
|
+
getSqliteDatabase().prepare("INSERT OR IGNORE INTO discussion_transcript_revisions (discussion_id, revision, segments_json, created_at) VALUES (?, ?, ?, ?)").run(id, capture.transcriptRevision, JSON.stringify(listDiscussionTranscriptSegments(id)), Date.now());
|
|
10
|
+
return capture.transcriptRevision;
|
|
11
|
+
}
|
|
12
|
+
function readTranscriptRevision(id, revision) {
|
|
13
|
+
const row = getSqliteDatabase().prepare("SELECT segments_json FROM discussion_transcript_revisions WHERE discussion_id=? AND revision=?").get(id, revision);
|
|
14
|
+
return row ? JSON.parse(row.segments_json) : null;
|
|
15
|
+
}
|
|
16
|
+
function replaceTranscriptSegments(id, segments) {
|
|
17
|
+
runSqliteWriteTransaction((db) => {
|
|
18
|
+
saveTranscriptRevision(id);
|
|
19
|
+
db.prepare("DELETE FROM discussion_transcript_segments WHERE discussion_id=?").run(id);
|
|
20
|
+
const insert = db.prepare(`INSERT INTO discussion_transcript_segments
|
|
21
|
+
(discussion_id, sequence, audio_sha256, started_at_ms, ended_at_ms, status, raw_text, display_text, speaker_label, revision, corrected_by_user, attempt_count, created_at, updated_at)
|
|
22
|
+
VALUES (?, ?, ?, ?, ?, 'confirmed', ?, ?, ?, 1, ?, 0, ?, ?)`);
|
|
23
|
+
segments.forEach((segment, index) => insert.run(id, index, createHash("sha256").update(segment.text).digest("hex"), segment.startedAtMs, segment.endedAtMs, segment.rawText ?? segment.text, segment.text, segment.speakerLabel ?? null, segment.correctedByUser ? 1 : 0, Date.now(), Date.now()));
|
|
24
|
+
db.prepare("UPDATE discussion_captures SET transcript_revision=transcript_revision+1 WHERE id=?").run(id);
|
|
25
|
+
saveTranscriptRevision(id);
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
function refreshCanonicalTranscript(id) {
|
|
29
|
+
const text = assembleDiscussionTranscript(listDiscussionTranscriptSegments(id));
|
|
30
|
+
updateDiscussionCapture(id, {
|
|
31
|
+
canonicalTranscript: text,
|
|
32
|
+
canonicalTranscriptSha256: createHash("sha256").update(text).digest("hex")
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
//#endregion
|
|
36
|
+
export { readTranscriptRevision, refreshCanonicalTranscript, replaceTranscriptSegments, saveTranscriptRevision };
|
|
@@ -2,6 +2,7 @@ import type { Config } from '../config/schema.js';
|
|
|
2
2
|
import type { NotesService } from '../notes/service.js';
|
|
3
3
|
import type { DiscussionCapture } from './types.js';
|
|
4
4
|
export interface DiscussionSealerDeps {
|
|
5
|
+
processRecordingJob?: () => Promise<void>;
|
|
5
6
|
notes: NotesService;
|
|
6
7
|
getConfig: () => Config;
|
|
7
8
|
transcribeRecording?: (filePath: string, capture: DiscussionCapture, signal?: AbortSignal) => Promise<{
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
import { createLogger } from "../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../utils/logger.js";
|
|
3
|
+
import { decodeWavToMonoFloat32 } from "../voice/local/wav.js";
|
|
3
4
|
import { forEachNormalizedAudioSegment } from "../voice/audio/normalize.js";
|
|
4
5
|
import { transcribe } from "../voice/stt/transcribe-core.js";
|
|
5
6
|
import { isSTTAvailable } from "../voice/stt/availability.js";
|
|
6
7
|
import { mergeSttConfigFromAppConfig } from "../voice/stt/config.js";
|
|
7
8
|
import "../voice/stt/index.js";
|
|
8
9
|
import { getDiscussionCapture, listDiscussionCaptures, listDiscussionTranscriptSegments, updateDiscussionCapture } from "./repository.js";
|
|
9
|
-
import {
|
|
10
|
+
import { assembleDiscussionTranscript } from "./transcript.js";
|
|
11
|
+
import { replaceTranscriptSegments, saveTranscriptRevision } from "./revisions.js";
|
|
12
|
+
import { missingAudioRanges, slicePcmWav } from "./audio-repair.js";
|
|
13
|
+
import { getRecordingJob } from "./recordingJobs.js";
|
|
10
14
|
import { createHash } from "node:crypto";
|
|
11
15
|
//#region src/discussions/sealer.ts
|
|
12
16
|
init_logger();
|
|
@@ -34,6 +38,7 @@ var DiscussionSealer = class {
|
|
|
34
38
|
if (this.running) return;
|
|
35
39
|
this.running = true;
|
|
36
40
|
try {
|
|
41
|
+
await this.deps.processRecordingJob?.();
|
|
37
42
|
const capture = [...listDiscussionCaptures({
|
|
38
43
|
status: "sealing",
|
|
39
44
|
limit: 1
|
|
@@ -50,6 +55,8 @@ var DiscussionSealer = class {
|
|
|
50
55
|
async sealWhenReady(capture, now) {
|
|
51
56
|
const ageMs = now - (capture.recordingStoppedAt ?? now);
|
|
52
57
|
if (!capture.audioAttachmentId) {
|
|
58
|
+
const job = getRecordingJob(capture.id);
|
|
59
|
+
if (job && (job.state === "queued" || job.state === "running")) return;
|
|
53
60
|
if (ageMs >= UPLOAD_GRACE_MS) this.fail(capture, "audio_upload", "recording_missing", "Original recording was not uploaded");
|
|
54
61
|
return;
|
|
55
62
|
}
|
|
@@ -65,6 +72,7 @@ var DiscussionSealer = class {
|
|
|
65
72
|
const confirmed = segments.filter((segment) => segment.status === "confirmed");
|
|
66
73
|
const result = expected >= 0 && missing.length === 0 && !pending && confirmed.length === expected + 1 ? { text: assembleDiscussionTranscript(confirmed) } : await this.transcribeFullRecording(sealing);
|
|
67
74
|
const text = result.text.trim();
|
|
75
|
+
saveTranscriptRevision(capture.id);
|
|
68
76
|
if (!text) throw new Error("Discussion transcription produced no text");
|
|
69
77
|
const updated = updateDiscussionCapture(capture.id, {
|
|
70
78
|
status: "organizing",
|
|
@@ -85,22 +93,64 @@ var DiscussionSealer = class {
|
|
|
85
93
|
async transcribeFullRecording(capture) {
|
|
86
94
|
const attachment = await this.deps.notes.getAttachmentPath(capture.noteId, capture.audioAttachmentId);
|
|
87
95
|
if (!attachment) throw new Error("Discussion audio file is missing");
|
|
88
|
-
if (this.deps.transcribeRecording)
|
|
96
|
+
if (this.deps.transcribeRecording) {
|
|
97
|
+
const result = await this.deps.transcribeRecording(attachment.filePath, capture);
|
|
98
|
+
replaceTranscriptSegments(capture.id, [{
|
|
99
|
+
text: result.text,
|
|
100
|
+
startedAtMs: 0,
|
|
101
|
+
endedAtMs: capture.durationMs ?? 1e3
|
|
102
|
+
}]);
|
|
103
|
+
return result;
|
|
104
|
+
}
|
|
89
105
|
const config = this.deps.getConfig();
|
|
90
106
|
const sttConfig = mergeSttConfigFromAppConfig(config.tools?.media?.audio, config.tools?.media);
|
|
91
107
|
if (!isSTTAvailable(sttConfig)) throw new Error("STT is not configured");
|
|
92
|
-
let
|
|
108
|
+
let offset = 0;
|
|
109
|
+
const confirmed = listDiscussionTranscriptSegments(capture.id).filter((segment) => segment.status === "confirmed");
|
|
110
|
+
const segments = confirmed.map((segment) => ({
|
|
111
|
+
text: segment.displayText ?? segment.rawText ?? "",
|
|
112
|
+
rawText: segment.rawText,
|
|
113
|
+
startedAtMs: segment.startedAtMs,
|
|
114
|
+
endedAtMs: segment.endedAtMs,
|
|
115
|
+
speakerLabel: segment.speakerLabel,
|
|
116
|
+
correctedByUser: segment.correctedByUser
|
|
117
|
+
}));
|
|
93
118
|
let language;
|
|
94
|
-
await forEachNormalizedAudioSegment({
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
119
|
+
await forEachNormalizedAudioSegment({
|
|
120
|
+
filePath: attachment.filePath,
|
|
121
|
+
maxDurationSeconds: 7200
|
|
122
|
+
}, async (buffer, index) => {
|
|
123
|
+
const decoded = decodeWavToMonoFloat32(buffer);
|
|
124
|
+
const durationMs = decoded.durationSeconds * 1e3;
|
|
125
|
+
const gaps = missingAudioRanges(offset, offset + durationMs, confirmed);
|
|
126
|
+
for (const [gapIndex, gap] of gaps.entries()) {
|
|
127
|
+
const audio = gaps.length === 1 && gap.startedAtMs === offset && gap.endedAtMs === offset + durationMs ? buffer : slicePcmWav(decoded, gap.startedAtMs - offset, gap.endedAtMs - offset);
|
|
128
|
+
if (audio.length <= 44) continue;
|
|
129
|
+
const result = await transcribe(audio, sttConfig, {
|
|
130
|
+
mime: "audio/wav",
|
|
131
|
+
fileName: `discussion-recovery-${index}-${gapIndex}.wav`
|
|
132
|
+
});
|
|
133
|
+
if (result.segments?.length) for (const part of result.segments) {
|
|
134
|
+
if (!Number.isFinite(part.startMs) || !Number.isFinite(part.endMs) || part.startMs < 0 || part.endMs <= part.startMs || part.endMs > gap.endedAtMs - gap.startedAtMs + 100) throw new Error("Provider returned an invalid transcript time range");
|
|
135
|
+
segments.push({
|
|
136
|
+
text: part.text,
|
|
137
|
+
startedAtMs: gap.startedAtMs + part.startMs,
|
|
138
|
+
endedAtMs: Math.min(gap.endedAtMs, gap.startedAtMs + part.endMs),
|
|
139
|
+
...part.speaker ? { speakerLabel: `${index + 1}:${gapIndex + 1}:${part.speaker}` } : {}
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
else if (result.text.trim()) segments.push({
|
|
143
|
+
text: result.text,
|
|
144
|
+
...gap
|
|
145
|
+
});
|
|
146
|
+
language ??= result.language;
|
|
147
|
+
}
|
|
148
|
+
offset += durationMs;
|
|
101
149
|
});
|
|
150
|
+
segments.sort((a, b) => a.startedAtMs - b.startedAtMs);
|
|
151
|
+
replaceTranscriptSegments(capture.id, segments);
|
|
102
152
|
return {
|
|
103
|
-
text,
|
|
153
|
+
text: assembleDiscussionTranscript(listDiscussionTranscriptSegments(capture.id)),
|
|
104
154
|
...language ? { language } : {}
|
|
105
155
|
};
|
|
106
156
|
}
|
|
@@ -1,13 +1,10 @@
|
|
|
1
|
+
import { type DiscussionRecordingManifest } from '@xopcai/gateway-contract';
|
|
1
2
|
import type { NotesService } from '../notes/service.js';
|
|
2
3
|
import type { ProjectService } from '../projects/project-service.js';
|
|
3
4
|
import type { CreateDiscussionInput, DiscussionCaptureSettings, DiscussionDetail, DiscussionListResult, DiscussionMetrics, DiscussionTranscript, ListDiscussionsQuery } from './types.js';
|
|
4
|
-
|
|
5
|
-
export
|
|
6
|
-
export
|
|
7
|
-
export declare class DiscussionServiceError extends Error {
|
|
8
|
-
readonly code: 'invalid_input' | 'not_found' | 'conflict';
|
|
9
|
-
constructor(code: 'invalid_input' | 'not_found' | 'conflict', message: string);
|
|
10
|
-
}
|
|
5
|
+
import { editMeeting } from './edits.js';
|
|
6
|
+
export { DiscussionServiceError } from './errors.js';
|
|
7
|
+
export { DISCUSSION_MAX_DURATION_MS, DISCUSSION_AUDIO_MAX_BYTES, DISCUSSION_SEGMENT_MAX_BYTES } from '@xopcai/gateway-contract';
|
|
11
8
|
export declare class DiscussionService {
|
|
12
9
|
private readonly notes;
|
|
13
10
|
private readonly projects;
|
|
@@ -15,6 +12,8 @@ export declare class DiscussionService {
|
|
|
15
12
|
private readonly createsInFlight;
|
|
16
13
|
private readonly mutationTails;
|
|
17
14
|
private readonly objectLinks;
|
|
15
|
+
private readonly recordingOwner;
|
|
16
|
+
private readonly recordingControllers;
|
|
18
17
|
constructor(notes: NotesService, projects: ProjectService, emit?: (type: string, payload: unknown) => void);
|
|
19
18
|
settings(): DiscussionCaptureSettings;
|
|
20
19
|
acknowledgeConsent(policyVersion: number): DiscussionCaptureSettings;
|
|
@@ -24,7 +23,7 @@ export declare class DiscussionService {
|
|
|
24
23
|
getByNoteId(noteId: string): Promise<DiscussionDetail | null>;
|
|
25
24
|
list(query?: ListDiscussionsQuery): DiscussionListResult;
|
|
26
25
|
metrics(): DiscussionMetrics;
|
|
27
|
-
transcript(id: string): DiscussionTranscript | null;
|
|
26
|
+
transcript(id: string, revision?: number): DiscussionTranscript | null;
|
|
28
27
|
uploadSegment(input: {
|
|
29
28
|
discussionId: string;
|
|
30
29
|
sequence: number;
|
|
@@ -36,13 +35,15 @@ export declare class DiscussionService {
|
|
|
36
35
|
endedAtMs: number;
|
|
37
36
|
sha256: string;
|
|
38
37
|
}): DiscussionTranscript;
|
|
39
|
-
correctSegment(id: string, sequence: number, displayText: string, expectedRevision: number): DiscussionTranscript;
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
38
|
+
correctSegment(id: string, sequence: number, displayText: string, expectedRevision: number, speakerLabel?: string, applyToSpeakerGroup?: boolean, expectedTranscriptRevision?: number): DiscussionTranscript;
|
|
39
|
+
editSummary(id: string, input: Parameters<typeof editMeeting>[1]): import("@xopcai/gateway-contract").DiscussionOrganizationRecord;
|
|
40
|
+
recordingChunks(id: string): import("@xopcai/gateway-contract").DiscussionRecordingChunk[];
|
|
41
|
+
reorganize(id: string, template?: string): Promise<DiscussionDetail>;
|
|
42
|
+
uploadRecordingChunk(id: string, sequence: number, sha256: string, body: ReadableStream<Uint8Array>): Promise<import("@xopcai/gateway-contract").DiscussionRecordingChunk>;
|
|
43
|
+
recordingJob(id: string): import("@xopcai/gateway-contract").DiscussionRecordingJob;
|
|
44
|
+
sealRecording(id: string, input: DiscussionRecordingManifest): Promise<import("@xopcai/gateway-contract").DiscussionRecordingJob>;
|
|
45
|
+
/** Runs inside the existing sealer lifecycle; unfinished leases survive process restart. */
|
|
46
|
+
processRecordingJob(): Promise<void>;
|
|
46
47
|
retry(id: string): Promise<DiscussionDetail | null>;
|
|
47
48
|
cancel(id: string): Promise<DiscussionDetail | null>;
|
|
48
49
|
deleteAudio(id: string): Promise<DiscussionDetail | null>;
|