@xopcai/xopc 0.0.144 → 0.0.145
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/manifest.json +1 -1
- package/dist/extensions/feishu/src/workflow-progress.js +1 -1
- package/dist/extensions/telegram/src/adapters/streaming-adapter.js +1 -1
- package/dist/extensions/telegram/src/inbound-processor.js +1 -1
- package/dist/extensions/telegram/src/plugin.js +1 -1
- package/dist/extensions/telegram/src/routing-integration.js +2 -2
- package/dist/extensions/telegram/src/workflow-progress.js +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/extensions/weixin/src/api/api.js +1 -1
- package/dist/extensions/weixin/src/plugin.js +1 -1
- package/dist/extensions/weixin/src/workflow-progress.js +1 -1
- package/dist/gateway/static/root/assets/Combination-DolwnuKi.js +41 -0
- package/dist/gateway/static/root/assets/{activity-center-store-jITiX2vJ.js → activity-center-store-3l9ahUqb.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-EAVnrCAs.js → agent-avatar-dicebear-BEUxdhZx.js} +1 -1
- package/dist/gateway/static/root/assets/agents-1bpT0xRO.js +2 -0
- package/dist/gateway/static/root/assets/app-management-settings-panel-CRHSZJWi.js +1 -0
- package/dist/gateway/static/root/assets/{appearance-settings-DSkm9bp_.js → appearance-settings-BunADYJb.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-Cc4JgVUQ.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-C99N0vV6.js → archive-plugin-B6vTkH2A.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-CHTDqME5.js → attachment-load-BjZXzaNv.js} +1 -1
- package/dist/gateway/static/root/assets/{automation-suggestion-card-CBt6U3-S.js → automation-suggestion-card-ZDA-Stg1.js} +1 -1
- package/dist/gateway/static/root/assets/automations-page-mb0fdVpq.js +6 -0
- package/dist/gateway/static/root/assets/{binary-plugins-BRtxOLlM.js → binary-plugins-DYZfLvPz.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-CUlXfgXd.js → block-editor-C3MUlYC9.js} +46 -46
- package/dist/gateway/static/root/assets/browser-settings-page-Bb0xhaMN.js +8 -0
- package/dist/gateway/static/root/assets/capability-presets-api-BV76yN9a.js +1 -0
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-CUcGKZqC.js +2 -0
- package/dist/gateway/static/root/assets/channel-recipient-api-fTlTnWB4.js +1 -0
- package/dist/gateway/static/root/assets/channels-settings-BlSDMGdy.js +1 -0
- package/dist/gateway/static/root/assets/channels-status-swr-CJauF1CW.js +1 -0
- package/dist/gateway/static/root/assets/{code-editor--tMO38Tr.js → code-editor-D4_k-6QN.js} +1 -1
- package/dist/gateway/static/root/assets/connector-logo-BVFNT2zW.js +1 -0
- package/dist/gateway/static/root/assets/connectors-page-CMgAFGvb.js +2 -0
- package/dist/gateway/static/root/assets/copy-to-clipboard-HOJ79TWv.js +1 -0
- package/dist/gateway/static/root/assets/{desktop-pet-C-Drhqyk.js → desktop-pet-_jUmoXd3.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-settings-CRGiolqF.js → desktop-pet-settings-DwGOy4AQ.js} +1 -1
- package/dist/gateway/static/root/assets/{directory-picker-path-field-Dw1L3M84.js → directory-picker-path-field-akvF0F-u.js} +1 -1
- package/dist/gateway/static/root/assets/{dist-SwiI0Xu3.js → dist-C99RGfAH.js} +1 -1
- package/dist/gateway/static/root/assets/dreaming-settings-BLetQiYY.js +3 -0
- package/dist/gateway/static/root/assets/{extension-debug-page-Dcl8LJG_.js → extension-debug-page-Cof2ncxE.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-i_BXmO_x.js → extension-page-CwWktRNz.js} +1 -1
- package/dist/gateway/static/root/assets/extension-settings-page-CuggWOIl.js +1 -0
- package/dist/gateway/static/root/assets/gateway-config-api-B7sxIbza.js +1 -0
- package/dist/gateway/static/root/assets/gateway-settings-DIv0eKMf.js +1 -0
- package/dist/gateway/static/root/assets/gateway-startup-retry-DtoLihQE.js +1 -0
- package/dist/gateway/static/root/assets/goal-create-dialog-C4Kw0mfS.js +1 -0
- package/dist/gateway/static/root/assets/goal-detail-page-BMmzYpZL.js +4 -0
- package/dist/gateway/static/root/assets/goals-config-api-B0jm5JaA.js +1 -0
- package/dist/gateway/static/root/assets/goals-page-CGeT77PC.js +2 -0
- package/dist/gateway/static/root/assets/goals-settings-N5_iL7es.js +1 -0
- package/dist/gateway/static/root/assets/heartbeat-settings-XzH3lbRR.js +1 -0
- package/dist/gateway/static/root/assets/{html-workspace-editor-COqmtESs.js → html-workspace-editor-C3DKAkMc.js} +1 -1
- package/dist/gateway/static/root/assets/index-CSLF84-Q.css +1 -0
- package/dist/gateway/static/root/assets/index-I-ZCenVw.js +259 -0
- package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-x_v0nrIi.js +1 -0
- package/dist/gateway/static/root/assets/locale-store-CiM-D9jA.js +1 -0
- package/dist/gateway/static/root/assets/logs-page-BSh1t8cD.js +7 -0
- package/dist/gateway/static/root/assets/markdown-editor-BvUebh3C.js +2 -0
- package/dist/gateway/static/root/assets/{markdown-split-BTRFTK0w.js → markdown-split-5rJx5flj.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-BABfIZPU.js → media-plugins-DYXccwAd.js} +1 -1
- package/dist/gateway/static/root/assets/messages-Cb1VMeqP.js +5 -0
- package/dist/gateway/static/root/assets/models-hub-panel-BNpTenAI.js +2 -0
- package/dist/gateway/static/root/assets/{notes-page-88QBHW9a.js → notes-page-BgLyndCO.js} +1 -1
- package/dist/gateway/static/root/assets/notes-workbench-teklkhcE.js +4 -0
- package/dist/gateway/static/root/assets/{page-tabs-je95DZOf.js → page-tabs-6Al9_sGz.js} +1 -1
- package/dist/gateway/static/root/assets/{preview-open-alternatives-BJbwi7Rc.js → preview-open-alternatives-Cm3G72Hv.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-CCB_dKoh.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-VOAFAHYj.js +1 -0
- package/dist/gateway/static/root/assets/remote-access-hub-USYu64Ru.js +1 -0
- package/dist/gateway/static/root/assets/{save-bar-controls-qWMQ9mod.js → save-bar-controls-BYtfzu_F.js} +1 -1
- package/dist/gateway/static/root/assets/{schedule-field-kxd270Gs.js → schedule-field-CvIRc6yK.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-DLnD-MuD.js → schema-form-CQuKx0n7.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-oGC8O5h_.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-D4rP66R1.js +1 -0
- package/dist/gateway/static/root/assets/{settings-collapsible-section-DQprvu5J.js → settings-collapsible-section-CF3HHM-t.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-form-section-Cqq7Y98y.js → settings-form-section-CwWjoRN6.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-loading-skeleton-b6rXULL5.js → settings-loading-skeleton-aUFmJa13.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-BtBVz3cX.js → settings-page-B2UUU9TF.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-layout-BNJbtklV.js → settings-page-layout-DqpbTWqI.js} +1 -1
- package/dist/gateway/static/root/assets/setup-status-panel-Ck9keROI.js +1 -0
- package/dist/gateway/static/root/assets/share-preview-page-BOhlPsS1.js +2 -0
- package/dist/gateway/static/root/assets/shares-settings-BYLsCuqj.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-BNHUyVML.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-CpXbQH4n.js +2 -0
- package/dist/gateway/static/root/assets/{system-settings-panel-Cq9J7i7v.js → system-settings-panel-CWxSvuwD.js} +1 -1
- package/dist/gateway/static/root/assets/{theme-store-Bt6vAkSB.js → theme-store-C9Dxcppm.js} +1 -1
- package/dist/gateway/static/root/assets/{typed-models-lib-CdSwi1gT.js → typed-models-lib-qROAvqTw.js} +1 -1
- package/dist/gateway/static/root/assets/use-channel-catalog-DE9cpn4G.js +1 -0
- package/dist/gateway/static/root/assets/user-context-page-DbNEK4Yp.js +1 -0
- package/dist/gateway/static/root/assets/user-profile-fields-editor-CWxc0ghP.js +1 -0
- package/dist/gateway/static/root/assets/{user-profile-settings-panel-B8hlamVB.js → user-profile-settings-panel-DW-Up6vt.js} +1 -1
- package/dist/gateway/static/root/assets/{utils-Dx01V8qF.js → utils-D53uRXVr.js} +1 -1
- package/dist/gateway/static/root/assets/{vendor-codemirror-C1WKjCk5.js → vendor-codemirror--gTq3YAI.js} +17 -17
- package/dist/gateway/static/root/assets/voice-api-key-field-Cs7MOrg0.js +1 -0
- package/dist/gateway/static/root/assets/work-item-detail-page-D1ziG1Pp.js +1 -0
- package/dist/gateway/static/root/assets/workflow-run-setup-panel-D_x9ELJp.js +3 -0
- package/dist/gateway/static/root/assets/workflows-page-DHGV_n6i.js +11 -0
- package/dist/gateway/static/root/index.html +10 -10
- package/dist/package.js +1 -1
- package/dist/src/activity/emitter.js +1 -1
- package/dist/src/agent/agent-manager.js +4 -4
- package/dist/src/agent/code-intelligence/binary.js +1 -1
- package/dist/src/agent/context/project-context.js +2 -2
- package/dist/src/agent/context/workspace-seed.js +2 -2
- package/dist/src/agent/embedded/run-for-session.js +1 -1
- package/dist/src/agent/embedded/session-runner.js +3 -3
- package/dist/src/agent/embedded/session-runner.js.map +1 -1
- package/dist/src/agent/embedded/xopc-auth-storage.d.ts +3 -1
- package/dist/src/agent/embedded/xopc-auth-storage.js +11 -1
- package/dist/src/agent/embedded/xopc-auth-storage.js.map +1 -1
- package/dist/src/agent/goals/post-turn.js +2 -2
- package/dist/src/agent/ipc/bus.js +1 -1
- package/dist/src/agent/mcp/bundle-mcp-materialize.js +1 -1
- package/dist/src/agent/mcp/bundle-mcp-runtime.js +1 -1
- package/dist/src/agent/mcp/mcp-transport-config.js +1 -1
- package/dist/src/agent/mcp/mcp-transport.js +1 -1
- package/dist/src/agent/memory/dreaming/config.js +1 -1
- package/dist/src/agent/memory/plugin-discovery.js +1 -1
- package/dist/src/agent/models/manager.js +1 -1
- package/dist/src/agent/orchestration/agent-orchestrator.js +1 -1
- package/dist/src/agent/service.js +3 -3
- package/dist/src/agent/session/session-inspector.js +2 -2
- package/dist/src/agent/skills/hub-pull.js +1 -1
- package/dist/src/agent/tools/composio-tool.js +1 -1
- package/dist/src/agent/tools/goal-tool.js +2 -2
- package/dist/src/agent/tools/workflow-tool.js +1 -1
- package/dist/src/agent/tools/xopc-use-tool.js +1 -1
- package/dist/src/agent/workspace-runtime/registry.js +2 -2
- package/dist/src/agent-runtime/index.js +1 -1
- package/dist/src/agent-runtime/runtime-profile.js +1 -1
- package/dist/src/automations/api/routes.js +1 -1
- package/dist/src/automations/service/action-executor.js +2 -2
- package/dist/src/browser/cdp-local-launcher.js +1 -1
- package/dist/src/browser/providers/browser-ext-install.js +3 -3
- package/dist/src/browser/providers/cloakbrowser.js +2 -2
- package/dist/src/browser/providers/playwright-doctor.js +1 -1
- package/dist/src/browser/stealth.js +1 -1
- package/dist/src/capabilities/store-connector.js +1 -1
- package/dist/src/chat-commands/agent-edit.js +1 -1
- package/dist/src/chat-commands/builtins/config.js +1 -1
- package/dist/src/chat-commands/builtins/goal.js +2 -2
- package/dist/src/chat-commands/context.js +1 -1
- package/dist/src/cli/commands/agent.js +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +2 -2
- package/dist/src/cli/commands/doctor/checks/session-integrity.js +1 -1
- package/dist/src/cli/commands/extension-marketplace.js +1 -1
- package/dist/src/cli/commands/extension-pack.js +1 -1
- package/dist/src/cli/commands/goal.js +2 -2
- package/dist/src/cli/commands/init.js +1 -1
- package/dist/src/cli/commands/project.js +3 -3
- package/dist/src/config/agent-profile.js +1 -1
- package/dist/src/config/gateway-bind.js +1 -1
- package/dist/src/config/index.js +3 -3
- package/dist/src/config/loader.js +1 -1
- package/dist/src/config/models-json.js +1 -1
- package/dist/src/config/schema.d.ts +60 -5
- package/dist/src/config/schema.js +30 -9
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/connectors/composio-catalog.js +11 -2
- package/dist/src/connectors/composio-catalog.js.map +1 -1
- package/dist/src/connectors/composio-sessions.js +1 -1
- package/dist/src/connectors/composio.js +1 -1
- package/dist/src/connectors/connector-memory-sync.js +135 -26
- package/dist/src/connectors/connector-memory-sync.js.map +1 -1
- package/dist/src/daemon/launchd.js +1 -1
- package/dist/src/daemon/systemd.js +1 -1
- package/dist/src/extensions/discover-extensions.js +1 -1
- package/dist/src/extensions/loader.js +2 -2
- package/dist/src/gateway/agents-admin.js +1 -1
- package/dist/src/gateway/heartbeat/service.js +1 -1
- package/dist/src/gateway/hono/app.js +1 -1
- package/dist/src/gateway/hono/app.js.map +1 -1
- package/dist/src/gateway/hono/lib/config-payload.d.ts +11 -0
- package/dist/src/gateway/hono/lib/config-payload.js +1 -0
- package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
- package/dist/src/gateway/hono/lib/static-ui.js +1 -1
- package/dist/src/gateway/hono/routes/config-patch/misc.js +6 -1
- package/dist/src/gateway/hono/routes/config-patch/misc.js.map +1 -1
- package/dist/src/gateway/hono/routes/home.js +2 -2
- package/dist/src/gateway/hono/routes/memory.js +13 -3
- package/dist/src/gateway/hono/routes/memory.js.map +1 -1
- package/dist/src/gateway/hono/routes/projects.js +5 -5
- package/dist/src/gateway/hono/routes/status.js +3 -0
- package/dist/src/gateway/hono/routes/status.js.map +1 -1
- package/dist/src/gateway/hono/routes/voice.d.ts +5 -5
- package/dist/src/gateway/hono/routes/voice.js +288 -62
- package/dist/src/gateway/hono/routes/voice.js.map +1 -1
- package/dist/src/gateway/hono/routes/workflows.js +1 -1
- package/dist/src/gateway/hono/routes/you.js +11 -7
- package/dist/src/gateway/hono/routes/you.js.map +1 -1
- package/dist/src/gateway/lock.js +1 -1
- package/dist/src/gateway/ports.js +1 -1
- package/dist/src/gateway/service.d.ts +8 -0
- package/dist/src/gateway/service.js +47 -17
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/goals/goal-workflow-judge.js +1 -1
- package/dist/src/heartbeat/index.js +1 -1
- package/dist/src/infra/ports.js +1 -1
- package/dist/src/infra/ssh-tunnel.js +1 -1
- package/dist/src/infra/update-check.js +1 -1
- package/dist/src/knowledge/connected-knowledge-pipeline.d.ts +21 -0
- package/dist/src/knowledge/connected-knowledge-pipeline.js +267 -0
- package/dist/src/knowledge/connected-knowledge-pipeline.js.map +1 -0
- package/dist/src/knowledge/coordinator.d.ts +10 -0
- package/dist/src/knowledge/coordinator.js +52 -0
- package/dist/src/knowledge/coordinator.js.map +1 -0
- package/dist/src/knowledge/index.d.ts +2 -0
- package/dist/src/knowledge/index.js +3 -1
- package/dist/src/knowledge/ingestion-service.d.ts +7 -1
- package/dist/src/knowledge/ingestion-service.js +28 -0
- package/dist/src/knowledge/ingestion-service.js.map +1 -1
- package/dist/src/knowledge/types.d.ts +18 -0
- package/dist/src/media-understanding/audio-transcription-runner.js +5 -3
- package/dist/src/media-understanding/audio-transcription-runner.js.map +1 -1
- package/dist/src/media-understanding/runner.js +8 -3
- package/dist/src/media-understanding/runner.js.map +1 -1
- package/dist/src/media-understanding/types.d.ts +7 -0
- package/dist/src/migrations/runner.js +1 -1
- package/dist/src/notes/service.js +3 -3
- package/dist/src/notes/store.js +1 -1
- package/dist/src/projects/project-service.js +1 -1
- package/dist/src/projects/workspace.js +1 -1
- package/dist/src/routing/agent-session-key.js +1 -1
- package/dist/src/routing/resolve-route.js +1 -1
- package/dist/src/routing/resolve-tui-session-key.js +1 -1
- package/dist/src/session/init-session-turn.js +1 -1
- package/dist/src/session/resolve-session.js +1 -1
- package/dist/src/session/session-title.js +2 -2
- package/dist/src/session/store.js +1 -1
- package/dist/src/storage/sqlite/connection.js +1 -1
- package/dist/src/storage/sqlite/index.d.ts +1 -1
- package/dist/src/storage/sqlite/index.js +2 -2
- package/dist/src/storage/sqlite/knowledge-repository.d.ts +26 -1
- package/dist/src/storage/sqlite/knowledge-repository.js +120 -6
- package/dist/src/storage/sqlite/knowledge-repository.js.map +1 -1
- package/dist/src/storage/sqlite/migrations/037_connected_knowledge_pipeline.sql +47 -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.js.map +1 -1
- package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
- package/dist/src/storage/sqlite/row-mappers.js +1 -1
- package/dist/src/storage/sqlite/schema.js +1 -1
- package/dist/src/tui/backends/embedded-backend.js +4 -4
- package/dist/src/tui/clipboard-image.js +1 -1
- package/dist/src/tui/tui-command-formatters.js +2 -2
- package/dist/src/tui/tui-commands.js +3 -3
- package/dist/src/tui/tui.js +1 -1
- package/dist/src/user-context/projection.d.ts +13 -4
- package/dist/src/user-context/projection.js +19 -7
- package/dist/src/user-context/projection.js.map +1 -1
- package/dist/src/utils/index.js +1 -1
- package/dist/src/utils/logger/index.js +1 -1
- package/dist/src/utils/logger.js +1 -1
- package/dist/src/voice/language-profile.d.ts +20 -0
- package/dist/src/voice/language-profile.js +156 -0
- package/dist/src/voice/language-profile.js.map +1 -0
- package/dist/src/voice/local/model-files.d.ts +14 -0
- package/dist/src/voice/local/model-files.js +94 -0
- package/dist/src/voice/local/model-files.js.map +1 -0
- package/dist/src/voice/local/model-manager.d.ts +18 -0
- package/dist/src/voice/local/model-manager.js +135 -0
- package/dist/src/voice/local/model-manager.js.map +1 -0
- package/dist/src/voice/local/models.d.ts +28 -0
- package/dist/src/voice/local/models.js +101 -0
- package/dist/src/voice/local/models.js.map +1 -0
- package/dist/src/voice/local/runtime-client.d.ts +26 -0
- package/dist/src/voice/local/runtime-client.js +166 -0
- package/dist/src/voice/local/runtime-client.js.map +1 -0
- package/dist/src/voice/local/runtime-dispatcher.d.ts +9 -0
- package/dist/src/voice/local/runtime-dispatcher.js +22 -0
- package/dist/src/voice/local/runtime-dispatcher.js.map +1 -0
- package/dist/src/voice/local/runtime-worker.d.ts +1 -0
- package/dist/src/voice/local/runtime-worker.js +249 -0
- package/dist/src/voice/local/runtime-worker.js.map +1 -0
- package/dist/src/voice/local/wav.d.ts +6 -0
- package/dist/src/voice/local/wav.js +69 -0
- package/dist/src/voice/local/wav.js.map +1 -0
- package/dist/src/voice/metadata/builtin.js +46 -0
- package/dist/src/voice/metadata/builtin.js.map +1 -1
- package/dist/src/voice/stt/factory.js +8 -2
- package/dist/src/voice/stt/factory.js.map +1 -1
- package/dist/src/voice/stt/providers/alibaba-transcription.js +14 -8
- package/dist/src/voice/stt/providers/alibaba-transcription.js.map +1 -1
- package/dist/src/voice/stt/providers/index.d.ts +1 -0
- package/dist/src/voice/stt/providers/index.js +2 -1
- package/dist/src/voice/stt/providers/local-transcription.d.ts +2 -0
- package/dist/src/voice/stt/providers/local-transcription.js +51 -0
- package/dist/src/voice/stt/providers/local-transcription.js.map +1 -0
- package/dist/src/voice/stt/providers/openai-transcription.js +5 -3
- package/dist/src/voice/stt/providers/openai-transcription.js.map +1 -1
- package/dist/src/voice/stt/transcribe-core.js +5 -4
- package/dist/src/voice/stt/transcribe-core.js.map +1 -1
- package/dist/src/voice/stt/types.d.ts +4 -0
- package/dist/src/voice/stt/types.js +5 -4
- package/dist/src/voice/stt/types.js.map +1 -1
- package/dist/src/voice/tts/providers/edge-speech.js +2 -2
- package/dist/src/voice/tts/providers/edge-speech.js.map +1 -1
- package/dist/src/voice/tts/types.js +3 -3
- package/dist/src/voice/tts/types.js.map +1 -1
- package/dist/src/work-items/work-item-service.js +1 -1
- package/dist/src/workflows/draft/workflow-draft-service.js +1 -1
- package/dist/src/workflows/service/workflow-session-bridge.js +3 -3
- package/package.json +3 -1
- package/dist/gateway/static/root/assets/Combination-HAlzriaz.js +0 -41
- package/dist/gateway/static/root/assets/agents-5rTuJOtT.js +0 -2
- package/dist/gateway/static/root/assets/app-management-settings-panel-Bu568NpC.js +0 -1
- package/dist/gateway/static/root/assets/apps-page-DWetalKp.js +0 -1
- package/dist/gateway/static/root/assets/automations-page-ICUfxeOz.js +0 -4
- package/dist/gateway/static/root/assets/browser-settings-page-D7Bj4MKi.js +0 -8
- package/dist/gateway/static/root/assets/capability-presets-api-Bg1ntFSD.js +0 -1
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-C-8I-Ktn.js +0 -2
- package/dist/gateway/static/root/assets/channel-recipient-api-DuulnhIj.js +0 -1
- package/dist/gateway/static/root/assets/channels-settings-Dm5EqQyK.js +0 -1
- package/dist/gateway/static/root/assets/channels-status-swr-B5lVrUsN.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-BOzjh-OK.js +0 -2
- package/dist/gateway/static/root/assets/dreaming-settings-CF21cbjo.js +0 -3
- package/dist/gateway/static/root/assets/extension-settings-page-CWIi7xsn.js +0 -1
- package/dist/gateway/static/root/assets/fetch-8QNN25Sh.js +0 -1
- package/dist/gateway/static/root/assets/gateway-config-api-2sLP2kkA.js +0 -1
- package/dist/gateway/static/root/assets/gateway-settings-DMHiZc-2.js +0 -1
- package/dist/gateway/static/root/assets/gateway-startup-retry-5YBnS9Fj.js +0 -1
- package/dist/gateway/static/root/assets/goal-create-dialog-CAODVDiA.js +0 -1
- package/dist/gateway/static/root/assets/goal-detail-page-_d4DjmeX.js +0 -4
- package/dist/gateway/static/root/assets/goals-config-api-B4qeLKQS.js +0 -1
- package/dist/gateway/static/root/assets/goals-page-lgsop664.js +0 -2
- package/dist/gateway/static/root/assets/goals-settings-Dx_1ZNgb.js +0 -1
- package/dist/gateway/static/root/assets/heartbeat-settings-DeTseEk_.js +0 -1
- package/dist/gateway/static/root/assets/index-CphxClbs.css +0 -1
- package/dist/gateway/static/root/assets/index-VWvztcst.js +0 -257
- package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-BpwpMmlk.js +0 -1
- package/dist/gateway/static/root/assets/locale-store-Ba72bFmP.js +0 -1
- package/dist/gateway/static/root/assets/logs-page-9_hbTg3j.js +0 -7
- package/dist/gateway/static/root/assets/markdown-editor-jD1LPiP-.js +0 -2
- package/dist/gateway/static/root/assets/messages-CzKxM6I4.js +0 -5
- package/dist/gateway/static/root/assets/models-hub-panel-B1CUvZxh.js +0 -2
- package/dist/gateway/static/root/assets/notes-workbench-CerZOeLW.js +0 -2
- package/dist/gateway/static/root/assets/project-detail-page-BmrApldl.js +0 -1
- package/dist/gateway/static/root/assets/projects-page-tTn-k76N.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-DeA2-pOi.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-D4kvvcL1.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-CI1OG4gq.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-cmclUJzS.js +0 -1
- package/dist/gateway/static/root/assets/share-preview-page--zO-A1W1.js +0 -2
- package/dist/gateway/static/root/assets/shares-settings-DNJvqA67.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-DWr_0Xgn.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-DEGsTbJx.js +0 -2
- package/dist/gateway/static/root/assets/use-channel-catalog-COXIfXcl.js +0 -1
- package/dist/gateway/static/root/assets/user-context-page-C-V73ZaJ.js +0 -1
- package/dist/gateway/static/root/assets/user-profile-fields-editor-B1cxoGkh.js +0 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-DGpIUelZ.js +0 -1
- package/dist/gateway/static/root/assets/work-item-detail-page-fzWTxF26.js +0 -1
- package/dist/gateway/static/root/assets/workflow-run-setup-panel-Dt_x8LGg.js +0 -3
- package/dist/gateway/static/root/assets/workflows-page-Bg02zEUh.js +0 -11
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
import { createLogger } from "../utils/logger/index.js";
|
|
2
|
+
import { init_logger } from "../utils/logger.js";
|
|
3
|
+
import { getMemoryRecord, upsertMemoryRecord } from "../storage/sqlite/memory-records-repository.js";
|
|
4
|
+
import { attachMemoryEvidence, claimKnowledgeSourceItems, completeKnowledgeSourceItemSynthesis, deleteMemoryEvidenceForRecord, listKnowledgeSourceItems } from "../storage/sqlite/knowledge-repository.js";
|
|
5
|
+
import "../storage/sqlite/index.js";
|
|
6
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
7
|
+
//#region src/knowledge/connected-knowledge-pipeline.ts
|
|
8
|
+
init_logger();
|
|
9
|
+
const log = createLogger("ConnectedKnowledge");
|
|
10
|
+
const MAX_ITEM_CHARS = 8e3;
|
|
11
|
+
const MAX_SUMMARY_CHARS = 6e3;
|
|
12
|
+
const MAX_SUMMARY_ITEMS = 24;
|
|
13
|
+
function providerId(item) {
|
|
14
|
+
const connectorId = item.metadata.connectorId;
|
|
15
|
+
if (typeof connectorId === "string" && connectorId.trim()) return connectorId.trim();
|
|
16
|
+
return item.sourceInstanceId.split(":")[0] || "connected-source";
|
|
17
|
+
}
|
|
18
|
+
function ownerAgentId(item, fallback) {
|
|
19
|
+
const agentId = item.metadata.agentId;
|
|
20
|
+
return typeof agentId === "string" && agentId.trim() ? agentId.trim() : fallback;
|
|
21
|
+
}
|
|
22
|
+
function ownerWorkspaceId(item, fallback) {
|
|
23
|
+
const workspaceId = item.metadata.workspaceId;
|
|
24
|
+
return typeof workspaceId === "string" && workspaceId.trim() ? workspaceId.trim() : fallback;
|
|
25
|
+
}
|
|
26
|
+
function knowledgeRecordId(itemId) {
|
|
27
|
+
return `knowledge:${itemId}`;
|
|
28
|
+
}
|
|
29
|
+
function boundedText(item) {
|
|
30
|
+
const text = item.normalizedText?.trim() ?? "";
|
|
31
|
+
return text.length > MAX_ITEM_CHARS ? `${text.slice(0, MAX_ITEM_CHARS)}\n…` : text;
|
|
32
|
+
}
|
|
33
|
+
function dayFor(item) {
|
|
34
|
+
return (item.occurredAt ?? item.sourceUpdatedAt ?? item.updatedAt).slice(0, 10);
|
|
35
|
+
}
|
|
36
|
+
function summaryRecordId(sourceInstanceId, day) {
|
|
37
|
+
return `knowledge-summary:${createHash("sha256").update(`${sourceInstanceId}:${day}`).digest("hex").slice(0, 24)}`;
|
|
38
|
+
}
|
|
39
|
+
var ConnectedKnowledgePipeline = class {
|
|
40
|
+
workerId;
|
|
41
|
+
batchSize;
|
|
42
|
+
constructor(options) {
|
|
43
|
+
this.options = options;
|
|
44
|
+
this.workerId = options.workerId ?? `connected-knowledge:${process.pid}:${randomUUID()}`;
|
|
45
|
+
this.batchSize = Math.max(1, Math.min(100, options.batchSize ?? 20));
|
|
46
|
+
}
|
|
47
|
+
async processPending(sourceInstanceId) {
|
|
48
|
+
const claimed = claimKnowledgeSourceItems({
|
|
49
|
+
workerId: this.workerId,
|
|
50
|
+
sourceInstanceId,
|
|
51
|
+
synthesisPipeline: "connected_knowledge",
|
|
52
|
+
limit: this.batchSize
|
|
53
|
+
});
|
|
54
|
+
const result = {
|
|
55
|
+
claimed: claimed.length,
|
|
56
|
+
completed: 0,
|
|
57
|
+
ignored: 0,
|
|
58
|
+
failed: 0,
|
|
59
|
+
recordIds: []
|
|
60
|
+
};
|
|
61
|
+
const summaryKeys = /* @__PURE__ */ new Set();
|
|
62
|
+
for (const item of claimed) try {
|
|
63
|
+
const recordId = knowledgeRecordId(item.id);
|
|
64
|
+
const content = boundedText(item);
|
|
65
|
+
if (item.deletedAt) {
|
|
66
|
+
const existing = getMemoryRecord(recordId);
|
|
67
|
+
if (existing) upsertMemoryRecord({
|
|
68
|
+
id: existing.id,
|
|
69
|
+
providerId: "connected-knowledge",
|
|
70
|
+
kind: existing.kind,
|
|
71
|
+
agentId: existing.scope.agentId,
|
|
72
|
+
workspaceId: existing.scope.workspaceId,
|
|
73
|
+
content: existing.content,
|
|
74
|
+
source: existing.source,
|
|
75
|
+
confidence: existing.confidence,
|
|
76
|
+
tags: existing.tags,
|
|
77
|
+
status: "archived",
|
|
78
|
+
sensitivity: existing.sensitivity,
|
|
79
|
+
explicitness: existing.explicitness,
|
|
80
|
+
durability: existing.durability,
|
|
81
|
+
importance: existing.importance,
|
|
82
|
+
disclosurePolicy: existing.disclosurePolicy,
|
|
83
|
+
evidence: existing.evidence,
|
|
84
|
+
validFrom: existing.validFrom,
|
|
85
|
+
validTo: item.deletedAt,
|
|
86
|
+
reviewAfter: existing.reviewAfter,
|
|
87
|
+
expiresAt: existing.expiresAt,
|
|
88
|
+
canonicalKey: existing.canonicalKey,
|
|
89
|
+
supersedesRecordId: existing.supersedesRecordId,
|
|
90
|
+
conflictGroupId: existing.conflictGroupId
|
|
91
|
+
});
|
|
92
|
+
completeKnowledgeSourceItemSynthesis({
|
|
93
|
+
itemId: item.id,
|
|
94
|
+
workerId: this.workerId,
|
|
95
|
+
status: "ignored"
|
|
96
|
+
});
|
|
97
|
+
result.ignored += 1;
|
|
98
|
+
summaryKeys.add(`${item.sourceInstanceId}\u0000${dayFor(item)}`);
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
if (!content || item.sensitivity === "secret" || item.sensitivity === "regulated") {
|
|
102
|
+
completeKnowledgeSourceItemSynthesis({
|
|
103
|
+
itemId: item.id,
|
|
104
|
+
workerId: this.workerId,
|
|
105
|
+
status: "ignored"
|
|
106
|
+
});
|
|
107
|
+
result.ignored += 1;
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
const sourceProvider = providerId(item);
|
|
111
|
+
const record = upsertMemoryRecord({
|
|
112
|
+
id: recordId,
|
|
113
|
+
providerId: "connected-knowledge",
|
|
114
|
+
kind: "workspace_fact",
|
|
115
|
+
agentId: ownerAgentId(item, this.options.agentId),
|
|
116
|
+
workspaceId: ownerWorkspaceId(item, this.options.workspaceId),
|
|
117
|
+
content,
|
|
118
|
+
canonicalKey: `source-item:${item.sourceInstanceId}:${item.externalId}`,
|
|
119
|
+
source: {
|
|
120
|
+
provider: sourceProvider,
|
|
121
|
+
path: item.payloadRef
|
|
122
|
+
},
|
|
123
|
+
confidence: .78,
|
|
124
|
+
tags: [
|
|
125
|
+
"connected-source",
|
|
126
|
+
"external",
|
|
127
|
+
sourceProvider,
|
|
128
|
+
item.itemType
|
|
129
|
+
],
|
|
130
|
+
status: "active",
|
|
131
|
+
sensitivity: item.sensitivity,
|
|
132
|
+
explicitness: "observed",
|
|
133
|
+
durability: item.retentionClass === "durable" ? "durable" : "recurring",
|
|
134
|
+
importance: .5,
|
|
135
|
+
disclosurePolicy: "referenceable",
|
|
136
|
+
evidence: [{
|
|
137
|
+
sourceItemId: item.id,
|
|
138
|
+
relation: "derived_from",
|
|
139
|
+
sourceText: content.slice(0, 1e3),
|
|
140
|
+
confidence: .78,
|
|
141
|
+
observedAt: item.occurredAt ?? item.sourceUpdatedAt
|
|
142
|
+
}],
|
|
143
|
+
validFrom: item.occurredAt ?? item.sourceUpdatedAt
|
|
144
|
+
});
|
|
145
|
+
attachMemoryEvidence({
|
|
146
|
+
recordId: record.id,
|
|
147
|
+
sourceItemId: item.id,
|
|
148
|
+
relation: "derived_from",
|
|
149
|
+
excerpt: content.slice(0, 1e3),
|
|
150
|
+
confidence: .78,
|
|
151
|
+
observedAt: item.occurredAt ?? item.sourceUpdatedAt
|
|
152
|
+
});
|
|
153
|
+
completeKnowledgeSourceItemSynthesis({
|
|
154
|
+
itemId: item.id,
|
|
155
|
+
workerId: this.workerId,
|
|
156
|
+
status: "completed"
|
|
157
|
+
});
|
|
158
|
+
result.completed += 1;
|
|
159
|
+
result.recordIds.push(record.id);
|
|
160
|
+
summaryKeys.add(`${item.sourceInstanceId}\u0000${dayFor(item)}`);
|
|
161
|
+
} catch (err) {
|
|
162
|
+
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
163
|
+
completeKnowledgeSourceItemSynthesis({
|
|
164
|
+
itemId: item.id,
|
|
165
|
+
workerId: this.workerId,
|
|
166
|
+
status: "failed",
|
|
167
|
+
error: errorMessage.slice(0, 1e3)
|
|
168
|
+
});
|
|
169
|
+
result.failed += 1;
|
|
170
|
+
log.warn({
|
|
171
|
+
err,
|
|
172
|
+
itemId: item.id,
|
|
173
|
+
sourceInstanceId: item.sourceInstanceId
|
|
174
|
+
}, `Connected knowledge synthesis failed: ${errorMessage}`);
|
|
175
|
+
}
|
|
176
|
+
for (const key of summaryKeys) {
|
|
177
|
+
const [sourceInstanceId, day] = key.split("\0");
|
|
178
|
+
if (sourceInstanceId && day) this.rebuildDailySummary(sourceInstanceId, day);
|
|
179
|
+
}
|
|
180
|
+
return result;
|
|
181
|
+
}
|
|
182
|
+
rebuildDailySummary(sourceInstanceId, day) {
|
|
183
|
+
const items = listKnowledgeSourceItems({
|
|
184
|
+
sourceInstanceId,
|
|
185
|
+
limit: 500
|
|
186
|
+
}).filter((item) => dayFor(item) === day && item.synthesisStatus === "completed").slice(0, MAX_SUMMARY_ITEMS);
|
|
187
|
+
if (items.length === 0) {
|
|
188
|
+
const existing = getMemoryRecord(summaryRecordId(sourceInstanceId, day));
|
|
189
|
+
if (existing) upsertMemoryRecord({
|
|
190
|
+
id: existing.id,
|
|
191
|
+
providerId: "connected-knowledge",
|
|
192
|
+
kind: existing.kind,
|
|
193
|
+
agentId: existing.scope.agentId,
|
|
194
|
+
workspaceId: existing.scope.workspaceId,
|
|
195
|
+
content: existing.content,
|
|
196
|
+
source: existing.source,
|
|
197
|
+
confidence: existing.confidence,
|
|
198
|
+
tags: existing.tags,
|
|
199
|
+
status: "archived",
|
|
200
|
+
sensitivity: existing.sensitivity,
|
|
201
|
+
explicitness: existing.explicitness,
|
|
202
|
+
durability: existing.durability,
|
|
203
|
+
importance: existing.importance,
|
|
204
|
+
disclosurePolicy: existing.disclosurePolicy,
|
|
205
|
+
evidence: existing.evidence,
|
|
206
|
+
validFrom: existing.validFrom,
|
|
207
|
+
validTo: (/* @__PURE__ */ new Date()).toISOString(),
|
|
208
|
+
reviewAfter: existing.reviewAfter,
|
|
209
|
+
expiresAt: existing.expiresAt,
|
|
210
|
+
canonicalKey: existing.canonicalKey
|
|
211
|
+
});
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
const sourceProvider = providerId(items[0]);
|
|
215
|
+
const lines = [`# ${sourceProvider} updates for ${day}`, ""];
|
|
216
|
+
for (const item of items) {
|
|
217
|
+
const text = boundedText(item).replace(/\s+/g, " ").trim();
|
|
218
|
+
if (!text) continue;
|
|
219
|
+
lines.push(`- ${text.slice(0, 360)}`);
|
|
220
|
+
if (lines.join("\n").length >= MAX_SUMMARY_CHARS) break;
|
|
221
|
+
}
|
|
222
|
+
const content = lines.join("\n").slice(0, MAX_SUMMARY_CHARS);
|
|
223
|
+
const summary = upsertMemoryRecord({
|
|
224
|
+
id: summaryRecordId(sourceInstanceId, day),
|
|
225
|
+
providerId: "connected-knowledge",
|
|
226
|
+
kind: "daily_note",
|
|
227
|
+
agentId: ownerAgentId(items[0], this.options.agentId),
|
|
228
|
+
workspaceId: ownerWorkspaceId(items[0], this.options.workspaceId),
|
|
229
|
+
content,
|
|
230
|
+
canonicalKey: `source-day:${sourceInstanceId}:${day}`,
|
|
231
|
+
source: { provider: sourceProvider },
|
|
232
|
+
confidence: .72,
|
|
233
|
+
tags: [
|
|
234
|
+
"connected-source",
|
|
235
|
+
"source-day-summary",
|
|
236
|
+
sourceProvider
|
|
237
|
+
],
|
|
238
|
+
status: "active",
|
|
239
|
+
sensitivity: items.some((item) => item.sensitivity === "personal") ? "personal" : "normal",
|
|
240
|
+
explicitness: "observed",
|
|
241
|
+
durability: "recurring",
|
|
242
|
+
importance: .55,
|
|
243
|
+
disclosurePolicy: "referenceable",
|
|
244
|
+
evidence: items.map((item) => ({
|
|
245
|
+
sourceItemId: item.id,
|
|
246
|
+
relation: "derived_from",
|
|
247
|
+
sourceText: boundedText(item).slice(0, 500),
|
|
248
|
+
confidence: .72,
|
|
249
|
+
observedAt: item.occurredAt ?? item.sourceUpdatedAt
|
|
250
|
+
})),
|
|
251
|
+
validFrom: `${day}T00:00:00.000Z`
|
|
252
|
+
});
|
|
253
|
+
deleteMemoryEvidenceForRecord(summary.id, "derived_from");
|
|
254
|
+
for (const item of items) attachMemoryEvidence({
|
|
255
|
+
recordId: summary.id,
|
|
256
|
+
sourceItemId: item.id,
|
|
257
|
+
relation: "derived_from",
|
|
258
|
+
excerpt: boundedText(item).slice(0, 500),
|
|
259
|
+
confidence: .72,
|
|
260
|
+
observedAt: item.occurredAt ?? item.sourceUpdatedAt
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
};
|
|
264
|
+
//#endregion
|
|
265
|
+
export { ConnectedKnowledgePipeline };
|
|
266
|
+
|
|
267
|
+
//# sourceMappingURL=connected-knowledge-pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connected-knowledge-pipeline.js","names":[],"sources":["../../../src/knowledge/connected-knowledge-pipeline.ts"],"sourcesContent":["import { createHash, randomUUID } from 'node:crypto';\n\nimport {\n attachMemoryEvidence,\n claimKnowledgeSourceItems,\n completeKnowledgeSourceItemSynthesis,\n deleteMemoryEvidenceForRecord,\n getMemoryRecord,\n listKnowledgeSourceItems,\n upsertMemoryRecord,\n} from '../storage/sqlite/index.js';\nimport { createLogger } from '../utils/logger.js';\nimport type { KnowledgeSourceItem } from './types.js';\n\nconst log = createLogger('ConnectedKnowledge');\nconst MAX_ITEM_CHARS = 8_000;\nconst MAX_SUMMARY_CHARS = 6_000;\nconst MAX_SUMMARY_ITEMS = 24;\n\nexport type ConnectedKnowledgePipelineOptions = {\n agentId: string;\n workspaceId: string;\n workerId?: string;\n batchSize?: number;\n};\n\nexport type KnowledgeSynthesisBatchResult = {\n claimed: number;\n completed: number;\n ignored: number;\n failed: number;\n recordIds: string[];\n};\n\nfunction providerId(item: KnowledgeSourceItem): string {\n const connectorId = item.metadata.connectorId;\n if (typeof connectorId === 'string' && connectorId.trim()) return connectorId.trim();\n return item.sourceInstanceId.split(':')[0] || 'connected-source';\n}\n\nfunction ownerAgentId(item: KnowledgeSourceItem, fallback: string): string {\n const agentId = item.metadata.agentId;\n return typeof agentId === 'string' && agentId.trim() ? agentId.trim() : fallback;\n}\n\nfunction ownerWorkspaceId(item: KnowledgeSourceItem, fallback: string): string {\n const workspaceId = item.metadata.workspaceId;\n return typeof workspaceId === 'string' && workspaceId.trim() ? workspaceId.trim() : fallback;\n}\n\nfunction knowledgeRecordId(itemId: string): string {\n return `knowledge:${itemId}`;\n}\n\nfunction boundedText(item: KnowledgeSourceItem): string {\n const text = item.normalizedText?.trim() ?? '';\n return text.length > MAX_ITEM_CHARS ? `${text.slice(0, MAX_ITEM_CHARS)}\\n…` : text;\n}\n\nfunction dayFor(item: KnowledgeSourceItem): string {\n const timestamp = item.occurredAt ?? item.sourceUpdatedAt ?? item.updatedAt;\n return timestamp.slice(0, 10);\n}\n\nfunction summaryRecordId(sourceInstanceId: string, day: string): string {\n const key = createHash('sha256').update(`${sourceInstanceId}:${day}`).digest('hex').slice(0, 24);\n return `knowledge-summary:${key}`;\n}\n\nexport class ConnectedKnowledgePipeline {\n private readonly workerId: string;\n private readonly batchSize: number;\n\n constructor(private readonly options: ConnectedKnowledgePipelineOptions) {\n this.workerId = options.workerId ?? `connected-knowledge:${process.pid}:${randomUUID()}`;\n this.batchSize = Math.max(1, Math.min(100, options.batchSize ?? 20));\n }\n\n async processPending(sourceInstanceId?: string): Promise<KnowledgeSynthesisBatchResult> {\n const claimed = claimKnowledgeSourceItems({\n workerId: this.workerId,\n sourceInstanceId,\n synthesisPipeline: 'connected_knowledge',\n limit: this.batchSize,\n });\n const result: KnowledgeSynthesisBatchResult = {\n claimed: claimed.length,\n completed: 0,\n ignored: 0,\n failed: 0,\n recordIds: [],\n };\n const summaryKeys = new Set<string>();\n\n for (const item of claimed) {\n try {\n const recordId = knowledgeRecordId(item.id);\n const content = boundedText(item);\n if (item.deletedAt) {\n const existing = getMemoryRecord(recordId);\n if (existing) {\n upsertMemoryRecord({\n id: existing.id,\n providerId: 'connected-knowledge',\n kind: existing.kind,\n agentId: existing.scope.agentId,\n workspaceId: existing.scope.workspaceId,\n content: existing.content,\n source: existing.source,\n confidence: existing.confidence,\n tags: existing.tags,\n status: 'archived',\n sensitivity: existing.sensitivity,\n explicitness: existing.explicitness,\n durability: existing.durability,\n importance: existing.importance,\n disclosurePolicy: existing.disclosurePolicy,\n evidence: existing.evidence,\n validFrom: existing.validFrom,\n validTo: item.deletedAt,\n reviewAfter: existing.reviewAfter,\n expiresAt: existing.expiresAt,\n canonicalKey: existing.canonicalKey,\n supersedesRecordId: existing.supersedesRecordId,\n conflictGroupId: existing.conflictGroupId,\n });\n }\n completeKnowledgeSourceItemSynthesis({\n itemId: item.id,\n workerId: this.workerId,\n status: 'ignored',\n });\n result.ignored += 1;\n summaryKeys.add(`${item.sourceInstanceId}\\u0000${dayFor(item)}`);\n continue;\n }\n if (!content || item.sensitivity === 'secret' || item.sensitivity === 'regulated') {\n completeKnowledgeSourceItemSynthesis({\n itemId: item.id,\n workerId: this.workerId,\n status: 'ignored',\n });\n result.ignored += 1;\n continue;\n }\n\n const sourceProvider = providerId(item);\n const record = upsertMemoryRecord({\n id: recordId,\n providerId: 'connected-knowledge',\n kind: 'workspace_fact',\n agentId: ownerAgentId(item, this.options.agentId),\n workspaceId: ownerWorkspaceId(item, this.options.workspaceId),\n content,\n canonicalKey: `source-item:${item.sourceInstanceId}:${item.externalId}`,\n source: { provider: sourceProvider, path: item.payloadRef },\n confidence: 0.78,\n tags: ['connected-source', 'external', sourceProvider, item.itemType],\n status: 'active',\n sensitivity: item.sensitivity,\n explicitness: 'observed',\n durability: item.retentionClass === 'durable' ? 'durable' : 'recurring',\n importance: 0.5,\n disclosurePolicy: 'referenceable',\n evidence: [{\n sourceItemId: item.id,\n relation: 'derived_from',\n sourceText: content.slice(0, 1_000),\n confidence: 0.78,\n observedAt: item.occurredAt ?? item.sourceUpdatedAt,\n }],\n validFrom: item.occurredAt ?? item.sourceUpdatedAt,\n });\n attachMemoryEvidence({\n recordId: record.id,\n sourceItemId: item.id,\n relation: 'derived_from',\n excerpt: content.slice(0, 1_000),\n confidence: 0.78,\n observedAt: item.occurredAt ?? item.sourceUpdatedAt,\n });\n completeKnowledgeSourceItemSynthesis({\n itemId: item.id,\n workerId: this.workerId,\n status: 'completed',\n });\n result.completed += 1;\n result.recordIds.push(record.id);\n summaryKeys.add(`${item.sourceInstanceId}\\u0000${dayFor(item)}`);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n completeKnowledgeSourceItemSynthesis({\n itemId: item.id,\n workerId: this.workerId,\n status: 'failed',\n error: errorMessage.slice(0, 1_000),\n });\n result.failed += 1;\n log.warn(\n { err, itemId: item.id, sourceInstanceId: item.sourceInstanceId },\n `Connected knowledge synthesis failed: ${errorMessage}`,\n );\n }\n }\n\n for (const key of summaryKeys) {\n const [sourceInstanceId, day] = key.split('\\u0000');\n if (sourceInstanceId && day) this.rebuildDailySummary(sourceInstanceId, day);\n }\n return result;\n }\n\n private rebuildDailySummary(sourceInstanceId: string, day: string): void {\n const items = listKnowledgeSourceItems({ sourceInstanceId, limit: 500 })\n .filter((item) => dayFor(item) === day && item.synthesisStatus === 'completed')\n .slice(0, MAX_SUMMARY_ITEMS);\n if (items.length === 0) {\n const existing = getMemoryRecord(summaryRecordId(sourceInstanceId, day));\n if (existing) {\n upsertMemoryRecord({\n id: existing.id,\n providerId: 'connected-knowledge',\n kind: existing.kind,\n agentId: existing.scope.agentId,\n workspaceId: existing.scope.workspaceId,\n content: existing.content,\n source: existing.source,\n confidence: existing.confidence,\n tags: existing.tags,\n status: 'archived',\n sensitivity: existing.sensitivity,\n explicitness: existing.explicitness,\n durability: existing.durability,\n importance: existing.importance,\n disclosurePolicy: existing.disclosurePolicy,\n evidence: existing.evidence,\n validFrom: existing.validFrom,\n validTo: new Date().toISOString(),\n reviewAfter: existing.reviewAfter,\n expiresAt: existing.expiresAt,\n canonicalKey: existing.canonicalKey,\n });\n }\n return;\n }\n const sourceProvider = providerId(items[0]!);\n const lines = [`# ${sourceProvider} updates for ${day}`, ''];\n for (const item of items) {\n const text = boundedText(item).replace(/\\s+/g, ' ').trim();\n if (!text) continue;\n lines.push(`- ${text.slice(0, 360)}`);\n if (lines.join('\\n').length >= MAX_SUMMARY_CHARS) break;\n }\n const content = lines.join('\\n').slice(0, MAX_SUMMARY_CHARS);\n const summary = upsertMemoryRecord({\n id: summaryRecordId(sourceInstanceId, day),\n providerId: 'connected-knowledge',\n kind: 'daily_note',\n agentId: ownerAgentId(items[0]!, this.options.agentId),\n workspaceId: ownerWorkspaceId(items[0]!, this.options.workspaceId),\n content,\n canonicalKey: `source-day:${sourceInstanceId}:${day}`,\n source: { provider: sourceProvider },\n confidence: 0.72,\n tags: ['connected-source', 'source-day-summary', sourceProvider],\n status: 'active',\n sensitivity: items.some((item) => item.sensitivity === 'personal') ? 'personal' : 'normal',\n explicitness: 'observed',\n durability: 'recurring',\n importance: 0.55,\n disclosurePolicy: 'referenceable',\n evidence: items.map((item) => ({\n sourceItemId: item.id,\n relation: 'derived_from' as const,\n sourceText: boundedText(item).slice(0, 500),\n confidence: 0.72,\n observedAt: item.occurredAt ?? item.sourceUpdatedAt,\n })),\n validFrom: `${day}T00:00:00.000Z`,\n });\n deleteMemoryEvidenceForRecord(summary.id, 'derived_from');\n for (const item of items) {\n attachMemoryEvidence({\n recordId: summary.id,\n sourceItemId: item.id,\n relation: 'derived_from',\n excerpt: boundedText(item).slice(0, 500),\n confidence: 0.72,\n observedAt: item.occurredAt ?? item.sourceUpdatedAt,\n });\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type ConnectedKnowledgePipelineOptions } from './connected-knowledge-pipeline.js';
|
|
2
|
+
export type ConnectedKnowledgeCoordinator = {
|
|
3
|
+
runNow(): Promise<void>;
|
|
4
|
+
stop(): void;
|
|
5
|
+
};
|
|
6
|
+
export declare function startConnectedKnowledgeCoordinator(options: {
|
|
7
|
+
resolvePipelineOptions: () => ConnectedKnowledgePipelineOptions;
|
|
8
|
+
intervalMs?: number;
|
|
9
|
+
initialDelayMs?: number;
|
|
10
|
+
}): ConnectedKnowledgeCoordinator;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { createLogger } from "../utils/logger/index.js";
|
|
2
|
+
import { init_logger } from "../utils/logger.js";
|
|
3
|
+
import { ConnectedKnowledgePipeline } from "./connected-knowledge-pipeline.js";
|
|
4
|
+
//#region src/knowledge/coordinator.ts
|
|
5
|
+
init_logger();
|
|
6
|
+
const log = createLogger("ConnectedKnowledge:Coordinator");
|
|
7
|
+
function startConnectedKnowledgeCoordinator(options) {
|
|
8
|
+
const intervalMs = Math.max(1e4, Math.min(options.intervalMs ?? 6e4, 30 * 6e4));
|
|
9
|
+
let timer = null;
|
|
10
|
+
let running = false;
|
|
11
|
+
let stopped = false;
|
|
12
|
+
async function runNow() {
|
|
13
|
+
if (running || stopped) return;
|
|
14
|
+
running = true;
|
|
15
|
+
try {
|
|
16
|
+
const pipeline = new ConnectedKnowledgePipeline(options.resolvePipelineOptions());
|
|
17
|
+
let processed = 0;
|
|
18
|
+
for (let batch = 0; batch < 5; batch += 1) {
|
|
19
|
+
const result = await pipeline.processPending();
|
|
20
|
+
processed += result.claimed;
|
|
21
|
+
if (result.claimed === 0) break;
|
|
22
|
+
}
|
|
23
|
+
if (processed > 0) log.info({ processed }, "Connected knowledge synthesis queue drained");
|
|
24
|
+
} catch (err) {
|
|
25
|
+
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
26
|
+
log.warn({ err }, `Connected knowledge coordinator failed: ${errorMessage}`);
|
|
27
|
+
} finally {
|
|
28
|
+
running = false;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
timer = setTimeout(() => {
|
|
32
|
+
runNow();
|
|
33
|
+
timer = setInterval(() => void runNow(), intervalMs);
|
|
34
|
+
timer.unref?.();
|
|
35
|
+
}, Math.max(0, options.initialDelayMs ?? 2e3));
|
|
36
|
+
timer.unref?.();
|
|
37
|
+
return {
|
|
38
|
+
runNow,
|
|
39
|
+
stop() {
|
|
40
|
+
stopped = true;
|
|
41
|
+
if (timer) {
|
|
42
|
+
clearTimeout(timer);
|
|
43
|
+
clearInterval(timer);
|
|
44
|
+
timer = null;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
//#endregion
|
|
50
|
+
export { startConnectedKnowledgeCoordinator };
|
|
51
|
+
|
|
52
|
+
//# sourceMappingURL=coordinator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coordinator.js","names":[],"sources":["../../../src/knowledge/coordinator.ts"],"sourcesContent":["import { createLogger } from '../utils/logger.js';\nimport { ConnectedKnowledgePipeline, type ConnectedKnowledgePipelineOptions } from './connected-knowledge-pipeline.js';\n\nconst log = createLogger('ConnectedKnowledge:Coordinator');\n\nexport type ConnectedKnowledgeCoordinator = {\n runNow(): Promise<void>;\n stop(): void;\n};\n\nexport function startConnectedKnowledgeCoordinator(options: {\n resolvePipelineOptions: () => ConnectedKnowledgePipelineOptions;\n intervalMs?: number;\n initialDelayMs?: number;\n}): ConnectedKnowledgeCoordinator {\n const intervalMs = Math.max(10_000, Math.min(options.intervalMs ?? 60_000, 30 * 60_000));\n let timer: NodeJS.Timeout | null = null;\n let running = false;\n let stopped = false;\n\n async function runNow(): Promise<void> {\n if (running || stopped) return;\n running = true;\n try {\n const pipeline = new ConnectedKnowledgePipeline(options.resolvePipelineOptions());\n let processed = 0;\n for (let batch = 0; batch < 5; batch += 1) {\n const result = await pipeline.processPending();\n processed += result.claimed;\n if (result.claimed === 0) break;\n }\n if (processed > 0) {\n log.info({ processed }, 'Connected knowledge synthesis queue drained');\n }\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n log.warn({ err }, `Connected knowledge coordinator failed: ${errorMessage}`);\n } finally {\n running = false;\n }\n }\n\n timer = setTimeout(() => {\n void runNow();\n timer = setInterval(() => void runNow(), intervalMs);\n timer.unref?.();\n }, Math.max(0, options.initialDelayMs ?? 2_000));\n timer.unref?.();\n\n return {\n runNow,\n stop() {\n stopped = true;\n if (timer) {\n clearTimeout(timer);\n clearInterval(timer);\n timer = null;\n }\n },\n };\n}\n"],"mappings":";;;;aAAkD;AAGlD,MAAM,MAAM,aAAa,iCAAiC;AAO1D,SAAgB,mCAAmC,SAIjB;CAChC,MAAM,aAAa,KAAK,IAAI,KAAQ,KAAK,IAAI,QAAQ,cAAc,KAAQ,KAAK,IAAO,CAAC;CACxF,IAAI,QAA+B;CACnC,IAAI,UAAU;CACd,IAAI,UAAU;CAEd,eAAe,SAAwB;AACrC,MAAI,WAAW,QAAS;AACxB,YAAU;AACV,MAAI;GACF,MAAM,WAAW,IAAI,2BAA2B,QAAQ,wBAAwB,CAAC;GACjF,IAAI,YAAY;AAChB,QAAK,IAAI,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG;IACzC,MAAM,SAAS,MAAM,SAAS,gBAAgB;AAC9C,iBAAa,OAAO;AACpB,QAAI,OAAO,YAAY,EAAG;;AAE5B,OAAI,YAAY,EACd,KAAI,KAAK,EAAE,WAAW,EAAE,8CAA8C;WAEjE,KAAK;GACZ,MAAM,eAAe,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AACrE,OAAI,KAAK,EAAE,KAAK,EAAE,2CAA2C,eAAe;YACpE;AACR,aAAU;;;AAId,SAAQ,iBAAiB;AAClB,UAAQ;AACb,UAAQ,kBAAkB,KAAK,QAAQ,EAAE,WAAW;AACpD,QAAM,SAAS;IACd,KAAK,IAAI,GAAG,QAAQ,kBAAkB,IAAM,CAAC;AAChD,OAAM,SAAS;AAEf,QAAO;EACL;EACA,OAAO;AACL,aAAU;AACV,OAAI,OAAO;AACT,iBAAa,MAAM;AACnB,kBAAc,MAAM;AACpB,YAAQ;;;EAGb"}
|
|
@@ -1,2 +1,4 @@
|
|
|
1
1
|
import { KnowledgeIngestionService, SqliteKnowledgeSourceStateStore } from "./ingestion-service.js";
|
|
2
|
-
|
|
2
|
+
import { ConnectedKnowledgePipeline } from "./connected-knowledge-pipeline.js";
|
|
3
|
+
import { startConnectedKnowledgeCoordinator } from "./coordinator.js";
|
|
4
|
+
export { ConnectedKnowledgePipeline, KnowledgeIngestionService, SqliteKnowledgeSourceStateStore, startConnectedKnowledgeCoordinator };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { KnowledgeSourceAdapter, KnowledgeSyncRun } from './types.js';
|
|
1
|
+
import type { KnowledgeSourceAdapter, KnowledgeSourceItemInput, KnowledgeSyncRun } from './types.js';
|
|
2
2
|
export interface KnowledgeSourceStateStore {
|
|
3
3
|
getCursor(instanceId: string): string | undefined;
|
|
4
4
|
setCursor(instanceId: string, cursor: string | undefined): void;
|
|
@@ -11,6 +11,12 @@ export declare class KnowledgeIngestionService {
|
|
|
11
11
|
private readonly adapters;
|
|
12
12
|
private readonly state;
|
|
13
13
|
constructor(adapters: ReadonlyMap<string, KnowledgeSourceAdapter>, state?: KnowledgeSourceStateStore);
|
|
14
|
+
ingest(params: {
|
|
15
|
+
instanceId: string;
|
|
16
|
+
items: KnowledgeSourceItemInput[];
|
|
17
|
+
cursorAfter?: string;
|
|
18
|
+
warnings?: string[];
|
|
19
|
+
}): KnowledgeSyncRun;
|
|
14
20
|
sync(params: {
|
|
15
21
|
adapterKind: string;
|
|
16
22
|
instanceId: string;
|
|
@@ -17,6 +17,34 @@ var KnowledgeIngestionService = class {
|
|
|
17
17
|
this.adapters = adapters;
|
|
18
18
|
this.state = state;
|
|
19
19
|
}
|
|
20
|
+
ingest(params) {
|
|
21
|
+
const cursorBefore = this.state.getCursor(params.instanceId);
|
|
22
|
+
const run = startKnowledgeSyncRun({
|
|
23
|
+
sourceInstanceId: params.instanceId,
|
|
24
|
+
cursorBefore
|
|
25
|
+
});
|
|
26
|
+
try {
|
|
27
|
+
const stored = upsertKnowledgeSourceItems(params.items);
|
|
28
|
+
this.state.setCursor(params.instanceId, params.cursorAfter);
|
|
29
|
+
return finishKnowledgeSyncRun({
|
|
30
|
+
runId: run.id,
|
|
31
|
+
status: params.warnings?.length ? "partial" : "succeeded",
|
|
32
|
+
cursorAfter: params.cursorAfter,
|
|
33
|
+
itemsSeen: params.items.length,
|
|
34
|
+
itemsCreated: stored.created,
|
|
35
|
+
itemsUpdated: stored.updated,
|
|
36
|
+
warnings: params.warnings
|
|
37
|
+
});
|
|
38
|
+
} catch (err) {
|
|
39
|
+
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
40
|
+
finishKnowledgeSyncRun({
|
|
41
|
+
runId: run.id,
|
|
42
|
+
status: "failed",
|
|
43
|
+
error: errorMessage
|
|
44
|
+
});
|
|
45
|
+
throw err;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
20
48
|
async sync(params) {
|
|
21
49
|
const adapter = this.adapters.get(params.adapterKind);
|
|
22
50
|
if (!adapter) throw new Error(`Knowledge source adapter not found: ${params.adapterKind}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ingestion-service.js","names":[],"sources":["../../../src/knowledge/ingestion-service.ts"],"sourcesContent":["import { createLogger } from '../utils/logger.js';\nimport {\n finishKnowledgeSyncRun,\n getKnowledgeSourceCursor,\n setKnowledgeSourceCursor,\n startKnowledgeSyncRun,\n upsertKnowledgeSourceItems,\n} from '../storage/sqlite/knowledge-repository.js';\nimport type { KnowledgeSourceAdapter, KnowledgeSyncRun } from './types.js';\n\nconst log = createLogger('KnowledgeIngestion');\n\nexport interface KnowledgeSourceStateStore {\n getCursor(instanceId: string): string | undefined;\n setCursor(instanceId: string, cursor: string | undefined): void;\n}\n\nexport class SqliteKnowledgeSourceStateStore implements KnowledgeSourceStateStore {\n getCursor(instanceId: string): string | undefined {\n return getKnowledgeSourceCursor(instanceId);\n }\n\n setCursor(instanceId: string, cursor: string | undefined): void {\n setKnowledgeSourceCursor(instanceId, cursor);\n }\n}\n\nexport class KnowledgeIngestionService {\n constructor(\n private readonly adapters: ReadonlyMap<string, KnowledgeSourceAdapter>,\n private readonly state: KnowledgeSourceStateStore = new SqliteKnowledgeSourceStateStore(),\n ) {}\n\n async sync(params: {\n adapterKind: string;\n instanceId: string;\n windowStart?: string;\n signal?: AbortSignal;\n }): Promise<KnowledgeSyncRun> {\n const adapter = this.adapters.get(params.adapterKind);\n if (!adapter) {\n throw new Error(`Knowledge source adapter not found: ${params.adapterKind}`);\n }\n const cursorBefore = this.state.getCursor(params.instanceId);\n const run = startKnowledgeSyncRun({\n sourceInstanceId: params.instanceId,\n cursorBefore,\n });\n const controller = params.signal ? null : new AbortController();\n const signal = params.signal ?? controller!.signal;\n\n try {\n const pulled = await adapter.pull({\n instanceId: params.instanceId,\n cursor: cursorBefore,\n windowStart: params.windowStart,\n signal,\n });\n const stored = upsertKnowledgeSourceItems(pulled.items);\n this.state.setCursor(params.instanceId, pulled.nextCursor);\n const completed = finishKnowledgeSyncRun({\n runId: run.id,\n status: pulled.warnings.length > 0 ? 'partial' : 'succeeded',\n cursorAfter: pulled.nextCursor,\n itemsSeen: pulled.items.length,\n itemsCreated: stored.created,\n itemsUpdated: stored.updated,\n warnings: pulled.warnings,\n });\n log.info(\n {\n runId: run.id,\n sourceInstanceId: params.instanceId,\n itemsSeen: pulled.items.length,\n itemsCreated: stored.created,\n itemsUpdated: stored.updated,\n },\n 'Knowledge source sync completed',\n );\n return completed;\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n const status = signal.aborted ? 'cancelled' : 'failed';\n log.warn(\n { err, runId: run.id, sourceInstanceId: params.instanceId },\n `Knowledge source sync ${status}: ${errorMessage}`,\n );\n return finishKnowledgeSyncRun({\n runId: run.id,\n status,\n error: errorMessage,\n });\n }\n }\n}\n"],"mappings":";;;;aAAkD;AAUlD,MAAM,MAAM,aAAa,qBAAqB;AAO9C,IAAa,kCAAb,MAAkF;CAChF,UAAU,YAAwC;AAChD,SAAO,yBAAyB,WAAW;;CAG7C,UAAU,YAAoB,QAAkC;AAC9D,2BAAyB,YAAY,OAAO;;;AAIhD,IAAa,4BAAb,MAAuC;CACrC,YACE,UACA,QAAoD,IAAI,iCAAiC,EACzF;AAFiB,OAAA,WAAA;AACA,OAAA,QAAA;;CAGnB,MAAM,KAAK,QAKmB;EAC5B,MAAM,UAAU,KAAK,SAAS,IAAI,OAAO,YAAY;AACrD,MAAI,CAAC,QACH,OAAM,IAAI,MAAM,uCAAuC,OAAO,cAAc;EAE9E,MAAM,eAAe,KAAK,MAAM,UAAU,OAAO,WAAW;EAC5D,MAAM,MAAM,sBAAsB;GAChC,kBAAkB,OAAO;GACzB;GACD,CAAC;EACF,MAAM,aAAa,OAAO,SAAS,OAAO,IAAI,iBAAiB;EAC/D,MAAM,SAAS,OAAO,UAAU,WAAY;AAE5C,MAAI;GACF,MAAM,SAAS,MAAM,QAAQ,KAAK;IAChC,YAAY,OAAO;IACnB,QAAQ;IACR,aAAa,OAAO;IACpB;IACD,CAAC;GACF,MAAM,SAAS,2BAA2B,OAAO,MAAM;AACvD,QAAK,MAAM,UAAU,OAAO,YAAY,OAAO,WAAW;GAC1D,MAAM,YAAY,uBAAuB;IACvC,OAAO,IAAI;IACX,QAAQ,OAAO,SAAS,SAAS,IAAI,YAAY;IACjD,aAAa,OAAO;IACpB,WAAW,OAAO,MAAM;IACxB,cAAc,OAAO;IACrB,cAAc,OAAO;IACrB,UAAU,OAAO;IAClB,CAAC;AACF,OAAI,KACF;IACE,OAAO,IAAI;IACX,kBAAkB,OAAO;IACzB,WAAW,OAAO,MAAM;IACxB,cAAc,OAAO;IACrB,cAAc,OAAO;IACtB,EACD,kCACD;AACD,UAAO;WACA,KAAK;GACZ,MAAM,eAAe,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;GACrE,MAAM,SAAS,OAAO,UAAU,cAAc;AAC9C,OAAI,KACF;IAAE;IAAK,OAAO,IAAI;IAAI,kBAAkB,OAAO;IAAY,EAC3D,yBAAyB,OAAO,IAAI,eACrC;AACD,UAAO,uBAAuB;IAC5B,OAAO,IAAI;IACX;IACA,OAAO;IACR,CAAC"}
|
|
1
|
+
{"version":3,"file":"ingestion-service.js","names":[],"sources":["../../../src/knowledge/ingestion-service.ts"],"sourcesContent":["import { createLogger } from '../utils/logger.js';\nimport {\n finishKnowledgeSyncRun,\n getKnowledgeSourceCursor,\n setKnowledgeSourceCursor,\n startKnowledgeSyncRun,\n upsertKnowledgeSourceItems,\n} from '../storage/sqlite/knowledge-repository.js';\nimport type { KnowledgeSourceAdapter, KnowledgeSourceItemInput, KnowledgeSyncRun } from './types.js';\n\nconst log = createLogger('KnowledgeIngestion');\n\nexport interface KnowledgeSourceStateStore {\n getCursor(instanceId: string): string | undefined;\n setCursor(instanceId: string, cursor: string | undefined): void;\n}\n\nexport class SqliteKnowledgeSourceStateStore implements KnowledgeSourceStateStore {\n getCursor(instanceId: string): string | undefined {\n return getKnowledgeSourceCursor(instanceId);\n }\n\n setCursor(instanceId: string, cursor: string | undefined): void {\n setKnowledgeSourceCursor(instanceId, cursor);\n }\n}\n\nexport class KnowledgeIngestionService {\n constructor(\n private readonly adapters: ReadonlyMap<string, KnowledgeSourceAdapter>,\n private readonly state: KnowledgeSourceStateStore = new SqliteKnowledgeSourceStateStore(),\n ) {}\n\n ingest(params: {\n instanceId: string;\n items: KnowledgeSourceItemInput[];\n cursorAfter?: string;\n warnings?: string[];\n }): KnowledgeSyncRun {\n const cursorBefore = this.state.getCursor(params.instanceId);\n const run = startKnowledgeSyncRun({ sourceInstanceId: params.instanceId, cursorBefore });\n try {\n const stored = upsertKnowledgeSourceItems(params.items);\n this.state.setCursor(params.instanceId, params.cursorAfter);\n return finishKnowledgeSyncRun({\n runId: run.id,\n status: params.warnings?.length ? 'partial' : 'succeeded',\n cursorAfter: params.cursorAfter,\n itemsSeen: params.items.length,\n itemsCreated: stored.created,\n itemsUpdated: stored.updated,\n warnings: params.warnings,\n });\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n finishKnowledgeSyncRun({ runId: run.id, status: 'failed', error: errorMessage });\n throw err;\n }\n }\n\n async sync(params: {\n adapterKind: string;\n instanceId: string;\n windowStart?: string;\n signal?: AbortSignal;\n }): Promise<KnowledgeSyncRun> {\n const adapter = this.adapters.get(params.adapterKind);\n if (!adapter) {\n throw new Error(`Knowledge source adapter not found: ${params.adapterKind}`);\n }\n const cursorBefore = this.state.getCursor(params.instanceId);\n const run = startKnowledgeSyncRun({\n sourceInstanceId: params.instanceId,\n cursorBefore,\n });\n const controller = params.signal ? null : new AbortController();\n const signal = params.signal ?? controller!.signal;\n\n try {\n const pulled = await adapter.pull({\n instanceId: params.instanceId,\n cursor: cursorBefore,\n windowStart: params.windowStart,\n signal,\n });\n const stored = upsertKnowledgeSourceItems(pulled.items);\n this.state.setCursor(params.instanceId, pulled.nextCursor);\n const completed = finishKnowledgeSyncRun({\n runId: run.id,\n status: pulled.warnings.length > 0 ? 'partial' : 'succeeded',\n cursorAfter: pulled.nextCursor,\n itemsSeen: pulled.items.length,\n itemsCreated: stored.created,\n itemsUpdated: stored.updated,\n warnings: pulled.warnings,\n });\n log.info(\n {\n runId: run.id,\n sourceInstanceId: params.instanceId,\n itemsSeen: pulled.items.length,\n itemsCreated: stored.created,\n itemsUpdated: stored.updated,\n },\n 'Knowledge source sync completed',\n );\n return completed;\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n const status = signal.aborted ? 'cancelled' : 'failed';\n log.warn(\n { err, runId: run.id, sourceInstanceId: params.instanceId },\n `Knowledge source sync ${status}: ${errorMessage}`,\n );\n return finishKnowledgeSyncRun({\n runId: run.id,\n status,\n error: errorMessage,\n });\n }\n }\n}\n"],"mappings":";;;;aAAkD;AAUlD,MAAM,MAAM,aAAa,qBAAqB;AAO9C,IAAa,kCAAb,MAAkF;CAChF,UAAU,YAAwC;AAChD,SAAO,yBAAyB,WAAW;;CAG7C,UAAU,YAAoB,QAAkC;AAC9D,2BAAyB,YAAY,OAAO;;;AAIhD,IAAa,4BAAb,MAAuC;CACrC,YACE,UACA,QAAoD,IAAI,iCAAiC,EACzF;AAFiB,OAAA,WAAA;AACA,OAAA,QAAA;;CAGnB,OAAO,QAKc;EACnB,MAAM,eAAe,KAAK,MAAM,UAAU,OAAO,WAAW;EAC5D,MAAM,MAAM,sBAAsB;GAAE,kBAAkB,OAAO;GAAY;GAAc,CAAC;AACxF,MAAI;GACF,MAAM,SAAS,2BAA2B,OAAO,MAAM;AACvD,QAAK,MAAM,UAAU,OAAO,YAAY,OAAO,YAAY;AAC3D,UAAO,uBAAuB;IAC5B,OAAO,IAAI;IACX,QAAQ,OAAO,UAAU,SAAS,YAAY;IAC9C,aAAa,OAAO;IACpB,WAAW,OAAO,MAAM;IACxB,cAAc,OAAO;IACrB,cAAc,OAAO;IACrB,UAAU,OAAO;IAClB,CAAC;WACK,KAAK;GACZ,MAAM,eAAe,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AACrE,0BAAuB;IAAE,OAAO,IAAI;IAAI,QAAQ;IAAU,OAAO;IAAc,CAAC;AAChF,SAAM;;;CAIV,MAAM,KAAK,QAKmB;EAC5B,MAAM,UAAU,KAAK,SAAS,IAAI,OAAO,YAAY;AACrD,MAAI,CAAC,QACH,OAAM,IAAI,MAAM,uCAAuC,OAAO,cAAc;EAE9E,MAAM,eAAe,KAAK,MAAM,UAAU,OAAO,WAAW;EAC5D,MAAM,MAAM,sBAAsB;GAChC,kBAAkB,OAAO;GACzB;GACD,CAAC;EACF,MAAM,aAAa,OAAO,SAAS,OAAO,IAAI,iBAAiB;EAC/D,MAAM,SAAS,OAAO,UAAU,WAAY;AAE5C,MAAI;GACF,MAAM,SAAS,MAAM,QAAQ,KAAK;IAChC,YAAY,OAAO;IACnB,QAAQ;IACR,aAAa,OAAO;IACpB;IACD,CAAC;GACF,MAAM,SAAS,2BAA2B,OAAO,MAAM;AACvD,QAAK,MAAM,UAAU,OAAO,YAAY,OAAO,WAAW;GAC1D,MAAM,YAAY,uBAAuB;IACvC,OAAO,IAAI;IACX,QAAQ,OAAO,SAAS,SAAS,IAAI,YAAY;IACjD,aAAa,OAAO;IACpB,WAAW,OAAO,MAAM;IACxB,cAAc,OAAO;IACrB,cAAc,OAAO;IACrB,UAAU,OAAO;IAClB,CAAC;AACF,OAAI,KACF;IACE,OAAO,IAAI;IACX,kBAAkB,OAAO;IACzB,WAAW,OAAO,MAAM;IACxB,cAAc,OAAO;IACrB,cAAc,OAAO;IACtB,EACD,kCACD;AACD,UAAO;WACA,KAAK;GACZ,MAAM,eAAe,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;GACrE,MAAM,SAAS,OAAO,UAAU,cAAc;AAC9C,OAAI,KACF;IAAE;IAAK,OAAO,IAAI;IAAI,kBAAkB,OAAO;IAAY,EAC3D,yBAAyB,OAAO,IAAI,eACrC;AACD,UAAO,uBAAuB;IAC5B,OAAO,IAAI;IACX;IACA,OAAO;IACR,CAAC"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import type { MemorySensitivity } from '../agent/memory/types.js';
|
|
2
2
|
export type KnowledgeSyncRunStatus = 'running' | 'succeeded' | 'partial' | 'failed' | 'cancelled';
|
|
3
3
|
export type KnowledgeSynthesisStatus = 'pending' | 'processing' | 'completed' | 'failed' | 'ignored';
|
|
4
|
+
export type KnowledgeSynthesisPipeline = 'user_understanding' | 'connected_knowledge';
|
|
4
5
|
export type KnowledgeRetentionClass = 'ephemeral' | 'bounded' | 'durable';
|
|
5
6
|
export type KnowledgeAuthorRole = 'user' | 'assistant' | 'third_party' | 'system' | 'unknown';
|
|
7
|
+
export type KnowledgeChangeKind = 'added' | 'modified' | 'deleted';
|
|
6
8
|
export interface KnowledgeSourceItem {
|
|
7
9
|
id: string;
|
|
8
10
|
sourceInstanceId: string;
|
|
@@ -17,11 +19,26 @@ export interface KnowledgeSourceItem {
|
|
|
17
19
|
metadata: Record<string, unknown>;
|
|
18
20
|
sensitivity: MemorySensitivity;
|
|
19
21
|
retentionClass: KnowledgeRetentionClass;
|
|
22
|
+
synthesisPipeline: KnowledgeSynthesisPipeline;
|
|
20
23
|
synthesisStatus: KnowledgeSynthesisStatus;
|
|
24
|
+
synthesisAttempts: number;
|
|
25
|
+
synthesisClaimedAt?: string;
|
|
26
|
+
synthesisClaimedBy?: string;
|
|
27
|
+
synthesisError?: string;
|
|
21
28
|
deletedAt?: string;
|
|
22
29
|
createdAt: string;
|
|
23
30
|
updatedAt: string;
|
|
24
31
|
}
|
|
32
|
+
export interface KnowledgeSourceChange {
|
|
33
|
+
sequence: number;
|
|
34
|
+
id: string;
|
|
35
|
+
sourceInstanceId: string;
|
|
36
|
+
sourceItemId: string;
|
|
37
|
+
kind: KnowledgeChangeKind;
|
|
38
|
+
oldHash?: string;
|
|
39
|
+
newHash?: string;
|
|
40
|
+
changedAt: string;
|
|
41
|
+
}
|
|
25
42
|
export interface KnowledgeSourceItemInput {
|
|
26
43
|
id?: string;
|
|
27
44
|
sourceInstanceId: string;
|
|
@@ -36,6 +53,7 @@ export interface KnowledgeSourceItemInput {
|
|
|
36
53
|
metadata?: Record<string, unknown>;
|
|
37
54
|
sensitivity?: MemorySensitivity;
|
|
38
55
|
retentionClass?: KnowledgeRetentionClass;
|
|
56
|
+
synthesisPipeline?: KnowledgeSynthesisPipeline;
|
|
39
57
|
synthesisStatus?: KnowledgeSynthesisStatus;
|
|
40
58
|
deletedAt?: string;
|
|
41
59
|
}
|
|
@@ -17,7 +17,8 @@ async function runAudioTranscription(options) {
|
|
|
17
17
|
provider,
|
|
18
18
|
attachment,
|
|
19
19
|
config: configById.get(provider.id.toLowerCase()),
|
|
20
|
-
timeoutMs: options.timeoutMs
|
|
20
|
+
timeoutMs: options.timeoutMs,
|
|
21
|
+
signal: options.signal
|
|
21
22
|
})
|
|
22
23
|
});
|
|
23
24
|
const outputs = result.outputs.map((entry) => ({
|
|
@@ -33,7 +34,7 @@ async function runAudioTranscription(options) {
|
|
|
33
34
|
};
|
|
34
35
|
}
|
|
35
36
|
function buildAudioRequest(params) {
|
|
36
|
-
const { provider, attachment, config, timeoutMs } = params;
|
|
37
|
+
const { provider, attachment, config, timeoutMs, signal } = params;
|
|
37
38
|
if (!config) {
|
|
38
39
|
log.debug({
|
|
39
40
|
providerId: provider.id,
|
|
@@ -59,7 +60,8 @@ function buildAudioRequest(params) {
|
|
|
59
60
|
...config.language ? { language: config.language } : {},
|
|
60
61
|
...config.prompt ? { prompt: config.prompt } : {},
|
|
61
62
|
...config.query ? { query: config.query } : {},
|
|
62
|
-
timeoutMs
|
|
63
|
+
timeoutMs,
|
|
64
|
+
...signal ? { signal } : {}
|
|
63
65
|
};
|
|
64
66
|
}
|
|
65
67
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audio-transcription-runner.js","names":[],"sources":["../../../src/media-understanding/audio-transcription-runner.ts"],"sourcesContent":["/**\n * Audio transcription entry point.\n *\n * Thin facade over `runCapability({ capability: 'audio' })` that:\n * 1. Builds the per-provider AudioTranscriptionRequest from\n * `cfg.tools.media.audio`.\n * 2. Resolves the api key / base URL / per-provider model from config + env.\n * 3. Returns a normalized `{ transcript, attempts }` shape so the agent /\n * channel layer doesn't see the registry plumbing.\n */\n\nimport { createLogger } from '../utils/logger.js';\n\nimport { runCapability } from './runner.js';\nimport type {\n AudioTranscriptionRequest,\n CapabilityAttachmentInput,\n MediaUnderstandingDecision,\n MediaUnderstandingProvider,\n} from './types.js';\n// Re-export to keep callers' import paths short.\nexport type { AudioTranscriptionRequest, AudioTranscriptionResult } from './types.js';\n\nconst log = createLogger('AudioTranscriptionRunner');\n\nexport interface AudioProviderResolvedConfig {\n /** Provider id (must match a registered MediaUnderstandingProvider id). */\n id: string;\n apiKey?: string;\n baseUrl?: string;\n model?: string;\n language?: string;\n prompt?: string;\n query?: Record<string, string | number | boolean>;\n headers?: Record<string, string>;\n /** Provider-specific extra fields preserved as-is. */\n extra?: Record<string, unknown>;\n}\n\nexport interface RunAudioTranscriptionOptions {\n /** Pre-resolved provider configs in the order to try them. */\n providers: readonly AudioProviderResolvedConfig[];\n /** Audio buffers to transcribe. */\n attachments: readonly CapabilityAttachmentInput[];\n /** Hard timeout per provider call (ms). */\n timeoutMs: number;\n signal?: AbortSignal;\n}\n\nexport interface RunAudioTranscriptionResult {\n /** First successful transcript across attachments (joined when multiple). */\n transcript?: string;\n /** Per-attachment outputs (preserves order). */\n outputs: Array<{ attachmentIndex: number; text: string; provider: string; model?: string }>;\n decision: MediaUnderstandingDecision;\n}\n\nexport async function runAudioTranscription(\n options: RunAudioTranscriptionOptions,\n): Promise<RunAudioTranscriptionResult> {\n if (options.providers.length === 0) {\n log.warn(\n { attachmentCount: options.attachments.length },\n 'No audio providers configured; transcription disabled',\n );\n }\n\n // Index resolved configs by provider id for quick lookup inside buildRequest.\n const configById = new Map<string, AudioProviderResolvedConfig>();\n for (const cfg of options.providers) {\n configById.set(cfg.id.toLowerCase(), cfg);\n }\n\n const result = await runCapability({\n capability: 'audio',\n attachments: options.attachments,\n providerOrder: options.providers.map((cfg) => cfg.id),\n signal: options.signal,\n buildRequest: ({ provider, attachment }) =>\n buildAudioRequest({\n provider,\n attachment,\n config: configById.get(provider.id.toLowerCase()),\n timeoutMs: options.timeoutMs,\n }),\n });\n\n // Aggregate transcripts by attachment order.\n const outputs = result.outputs.map((entry) => ({\n attachmentIndex: entry.attachmentIndex,\n text: entry.text,\n provider: entry.provider,\n ...(entry.model ? { model: entry.model } : {}),\n }));\n\n const transcript =\n outputs.length === 0\n ? undefined\n : outputs\n .slice()\n .sort((a, b) => a.attachmentIndex - b.attachmentIndex)\n .map((o) => o.text)\n .join('\\n')\n .trim() || undefined;\n\n return { transcript, outputs, decision: result.decision };\n}\n\nfunction buildAudioRequest(params: {\n provider: MediaUnderstandingProvider;\n attachment: CapabilityAttachmentInput;\n config?: AudioProviderResolvedConfig;\n timeoutMs: number;\n}): AudioTranscriptionRequest | undefined {\n const { provider, attachment, config, timeoutMs } = params;\n if (!config) {\n log.debug(\n { providerId: provider.id, attachmentIndex: attachment.attachmentIndex },\n `No resolved config for provider \"${provider.id}\"; skipping`,\n );\n return undefined;\n }\n const requiresApiKey = provider.requiresApiKey !== false;\n if (requiresApiKey && !config.apiKey) {\n log.debug(\n { providerId: provider.id, attachmentIndex: attachment.attachmentIndex },\n `Provider \"${provider.id}\" has no apiKey; skipping`,\n );\n return undefined;\n }\n return {\n buffer: attachment.buffer,\n fileName: attachment.fileName,\n ...(attachment.mime ? { mime: attachment.mime } : {}),\n ...(config.apiKey ? { apiKey: config.apiKey } : {}),\n ...(config.baseUrl ? { baseUrl: config.baseUrl } : {}),\n ...(config.headers ? { headers: config.headers } : {}),\n ...(config.model ?? provider.defaultModels?.audio\n ? { model: config.model ?? provider.defaultModels?.audio }\n : {}),\n ...(config.language ? { language: config.language } : {}),\n ...(config.prompt ? { prompt: config.prompt } : {}),\n ...(config.query ? { query: config.query } : {}),\n timeoutMs,\n };\n}\n"],"mappings":";;;;aAWkD;AAYlD,MAAM,MAAM,aAAa,2BAA2B;AAkCpD,eAAsB,sBACpB,SACsC;AACtC,KAAI,QAAQ,UAAU,WAAW,EAC/B,KAAI,KACF,EAAE,iBAAiB,QAAQ,YAAY,QAAQ,EAC/C,wDACD;CAIH,MAAM,6BAAa,IAAI,KAA0C;AACjE,MAAK,MAAM,OAAO,QAAQ,UACxB,YAAW,IAAI,IAAI,GAAG,aAAa,EAAE,IAAI;CAG3C,MAAM,SAAS,MAAM,cAAc;EACjC,YAAY;EACZ,aAAa,QAAQ;EACrB,eAAe,QAAQ,UAAU,KAAK,QAAQ,IAAI,GAAG;EACrD,QAAQ,QAAQ;EAChB,eAAe,EAAE,UAAU,iBACzB,kBAAkB;GAChB;GACA;GACA,QAAQ,WAAW,IAAI,SAAS,GAAG,aAAa,CAAC;GACjD,WAAW,QAAQ;
|
|
1
|
+
{"version":3,"file":"audio-transcription-runner.js","names":[],"sources":["../../../src/media-understanding/audio-transcription-runner.ts"],"sourcesContent":["/**\n * Audio transcription entry point.\n *\n * Thin facade over `runCapability({ capability: 'audio' })` that:\n * 1. Builds the per-provider AudioTranscriptionRequest from\n * `cfg.tools.media.audio`.\n * 2. Resolves the api key / base URL / per-provider model from config + env.\n * 3. Returns a normalized `{ transcript, attempts }` shape so the agent /\n * channel layer doesn't see the registry plumbing.\n */\n\nimport { createLogger } from '../utils/logger.js';\n\nimport { runCapability } from './runner.js';\nimport type {\n AudioTranscriptionRequest,\n CapabilityAttachmentInput,\n MediaUnderstandingDecision,\n MediaUnderstandingProvider,\n} from './types.js';\n// Re-export to keep callers' import paths short.\nexport type { AudioTranscriptionRequest, AudioTranscriptionResult } from './types.js';\n\nconst log = createLogger('AudioTranscriptionRunner');\n\nexport interface AudioProviderResolvedConfig {\n /** Provider id (must match a registered MediaUnderstandingProvider id). */\n id: string;\n apiKey?: string;\n baseUrl?: string;\n model?: string;\n language?: string;\n prompt?: string;\n query?: Record<string, string | number | boolean>;\n headers?: Record<string, string>;\n /** Provider-specific extra fields preserved as-is. */\n extra?: Record<string, unknown>;\n}\n\nexport interface RunAudioTranscriptionOptions {\n /** Pre-resolved provider configs in the order to try them. */\n providers: readonly AudioProviderResolvedConfig[];\n /** Audio buffers to transcribe. */\n attachments: readonly CapabilityAttachmentInput[];\n /** Hard timeout per provider call (ms). */\n timeoutMs: number;\n signal?: AbortSignal;\n}\n\nexport interface RunAudioTranscriptionResult {\n /** First successful transcript across attachments (joined when multiple). */\n transcript?: string;\n /** Per-attachment outputs (preserves order). */\n outputs: Array<{ attachmentIndex: number; text: string; provider: string; model?: string }>;\n decision: MediaUnderstandingDecision;\n}\n\nexport async function runAudioTranscription(\n options: RunAudioTranscriptionOptions,\n): Promise<RunAudioTranscriptionResult> {\n if (options.providers.length === 0) {\n log.warn(\n { attachmentCount: options.attachments.length },\n 'No audio providers configured; transcription disabled',\n );\n }\n\n // Index resolved configs by provider id for quick lookup inside buildRequest.\n const configById = new Map<string, AudioProviderResolvedConfig>();\n for (const cfg of options.providers) {\n configById.set(cfg.id.toLowerCase(), cfg);\n }\n\n const result = await runCapability({\n capability: 'audio',\n attachments: options.attachments,\n providerOrder: options.providers.map((cfg) => cfg.id),\n signal: options.signal,\n buildRequest: ({ provider, attachment }) =>\n buildAudioRequest({\n provider,\n attachment,\n config: configById.get(provider.id.toLowerCase()),\n timeoutMs: options.timeoutMs,\n signal: options.signal,\n }),\n });\n\n // Aggregate transcripts by attachment order.\n const outputs = result.outputs.map((entry) => ({\n attachmentIndex: entry.attachmentIndex,\n text: entry.text,\n provider: entry.provider,\n ...(entry.model ? { model: entry.model } : {}),\n }));\n\n const transcript =\n outputs.length === 0\n ? undefined\n : outputs\n .slice()\n .sort((a, b) => a.attachmentIndex - b.attachmentIndex)\n .map((o) => o.text)\n .join('\\n')\n .trim() || undefined;\n\n return { transcript, outputs, decision: result.decision };\n}\n\nfunction buildAudioRequest(params: {\n provider: MediaUnderstandingProvider;\n attachment: CapabilityAttachmentInput;\n config?: AudioProviderResolvedConfig;\n timeoutMs: number;\n signal?: AbortSignal;\n}): AudioTranscriptionRequest | undefined {\n const { provider, attachment, config, timeoutMs, signal } = params;\n if (!config) {\n log.debug(\n { providerId: provider.id, attachmentIndex: attachment.attachmentIndex },\n `No resolved config for provider \"${provider.id}\"; skipping`,\n );\n return undefined;\n }\n const requiresApiKey = provider.requiresApiKey !== false;\n if (requiresApiKey && !config.apiKey) {\n log.debug(\n { providerId: provider.id, attachmentIndex: attachment.attachmentIndex },\n `Provider \"${provider.id}\" has no apiKey; skipping`,\n );\n return undefined;\n }\n return {\n buffer: attachment.buffer,\n fileName: attachment.fileName,\n ...(attachment.mime ? { mime: attachment.mime } : {}),\n ...(config.apiKey ? { apiKey: config.apiKey } : {}),\n ...(config.baseUrl ? { baseUrl: config.baseUrl } : {}),\n ...(config.headers ? { headers: config.headers } : {}),\n ...(config.model ?? provider.defaultModels?.audio\n ? { model: config.model ?? provider.defaultModels?.audio }\n : {}),\n ...(config.language ? { language: config.language } : {}),\n ...(config.prompt ? { prompt: config.prompt } : {}),\n ...(config.query ? { query: config.query } : {}),\n timeoutMs,\n ...(signal ? { signal } : {}),\n };\n}\n"],"mappings":";;;;aAWkD;AAYlD,MAAM,MAAM,aAAa,2BAA2B;AAkCpD,eAAsB,sBACpB,SACsC;AACtC,KAAI,QAAQ,UAAU,WAAW,EAC/B,KAAI,KACF,EAAE,iBAAiB,QAAQ,YAAY,QAAQ,EAC/C,wDACD;CAIH,MAAM,6BAAa,IAAI,KAA0C;AACjE,MAAK,MAAM,OAAO,QAAQ,UACxB,YAAW,IAAI,IAAI,GAAG,aAAa,EAAE,IAAI;CAG3C,MAAM,SAAS,MAAM,cAAc;EACjC,YAAY;EACZ,aAAa,QAAQ;EACrB,eAAe,QAAQ,UAAU,KAAK,QAAQ,IAAI,GAAG;EACrD,QAAQ,QAAQ;EAChB,eAAe,EAAE,UAAU,iBACzB,kBAAkB;GAChB;GACA;GACA,QAAQ,WAAW,IAAI,SAAS,GAAG,aAAa,CAAC;GACjD,WAAW,QAAQ;GACnB,QAAQ,QAAQ;GACjB,CAAC;EACL,CAAC;CAGF,MAAM,UAAU,OAAO,QAAQ,KAAK,WAAW;EAC7C,iBAAiB,MAAM;EACvB,MAAM,MAAM;EACZ,UAAU,MAAM;EAChB,GAAI,MAAM,QAAQ,EAAE,OAAO,MAAM,OAAO,GAAG,EAAE;EAC9C,EAAE;AAYH,QAAO;EAAE,YATP,QAAQ,WAAW,IACf,KAAA,IACA,QACG,OAAO,CACP,MAAM,GAAG,MAAM,EAAE,kBAAkB,EAAE,gBAAgB,CACrD,KAAK,MAAM,EAAE,KAAK,CAClB,KAAK,KAAK,CACV,MAAM,IAAI,KAAA;EAEE;EAAS,UAAU,OAAO;EAAU;;AAG3D,SAAS,kBAAkB,QAMe;CACxC,MAAM,EAAE,UAAU,YAAY,QAAQ,WAAW,WAAW;AAC5D,KAAI,CAAC,QAAQ;AACX,MAAI,MACF;GAAE,YAAY,SAAS;GAAI,iBAAiB,WAAW;GAAiB,EACxE,oCAAoC,SAAS,GAAG,aACjD;AACD;;AAGF,KADuB,SAAS,mBAAmB,SAC7B,CAAC,OAAO,QAAQ;AACpC,MAAI,MACF;GAAE,YAAY,SAAS;GAAI,iBAAiB,WAAW;GAAiB,EACxE,aAAa,SAAS,GAAG,2BAC1B;AACD;;AAEF,QAAO;EACL,QAAQ,WAAW;EACnB,UAAU,WAAW;EACrB,GAAI,WAAW,OAAO,EAAE,MAAM,WAAW,MAAM,GAAG,EAAE;EACpD,GAAI,OAAO,SAAS,EAAE,QAAQ,OAAO,QAAQ,GAAG,EAAE;EAClD,GAAI,OAAO,UAAU,EAAE,SAAS,OAAO,SAAS,GAAG,EAAE;EACrD,GAAI,OAAO,UAAU,EAAE,SAAS,OAAO,SAAS,GAAG,EAAE;EACrD,GAAI,OAAO,SAAS,SAAS,eAAe,QACxC,EAAE,OAAO,OAAO,SAAS,SAAS,eAAe,OAAO,GACxD,EAAE;EACN,GAAI,OAAO,WAAW,EAAE,UAAU,OAAO,UAAU,GAAG,EAAE;EACxD,GAAI,OAAO,SAAS,EAAE,QAAQ,OAAO,QAAQ,GAAG,EAAE;EAClD,GAAI,OAAO,QAAQ,EAAE,OAAO,OAAO,OAAO,GAAG,EAAE;EAC/C;EACA,GAAI,SAAS,EAAE,QAAQ,GAAG,EAAE;EAC7B"}
|
|
@@ -88,6 +88,7 @@ async function runCapability(options) {
|
|
|
88
88
|
});
|
|
89
89
|
continue;
|
|
90
90
|
}
|
|
91
|
+
const startedAt = Date.now();
|
|
91
92
|
try {
|
|
92
93
|
const callResult = await method(request);
|
|
93
94
|
const text = callResult.text?.trim() ?? "";
|
|
@@ -97,7 +98,8 @@ async function runCapability(options) {
|
|
|
97
98
|
type: "provider",
|
|
98
99
|
outcome: "failed",
|
|
99
100
|
reason: "empty transcription/description text",
|
|
100
|
-
model: callResult.model
|
|
101
|
+
model: callResult.model,
|
|
102
|
+
latencyMs: Date.now() - startedAt
|
|
101
103
|
});
|
|
102
104
|
continue;
|
|
103
105
|
}
|
|
@@ -105,7 +107,8 @@ async function runCapability(options) {
|
|
|
105
107
|
provider: provider.id,
|
|
106
108
|
type: "provider",
|
|
107
109
|
outcome: "success",
|
|
108
|
-
model: callResult.model
|
|
110
|
+
model: callResult.model,
|
|
111
|
+
latencyMs: Date.now() - startedAt
|
|
109
112
|
};
|
|
110
113
|
attempts.push(chosen);
|
|
111
114
|
outputs.push({
|
|
@@ -117,6 +120,7 @@ async function runCapability(options) {
|
|
|
117
120
|
});
|
|
118
121
|
break;
|
|
119
122
|
} catch (error) {
|
|
123
|
+
if (options.signal?.aborted) throw error;
|
|
120
124
|
const reason = error instanceof Error ? error.message : String(error);
|
|
121
125
|
log.warn({
|
|
122
126
|
err: error,
|
|
@@ -128,7 +132,8 @@ async function runCapability(options) {
|
|
|
128
132
|
provider: provider.id,
|
|
129
133
|
type: "provider",
|
|
130
134
|
outcome: "failed",
|
|
131
|
-
reason
|
|
135
|
+
reason,
|
|
136
|
+
latencyMs: Date.now() - startedAt
|
|
132
137
|
});
|
|
133
138
|
}
|
|
134
139
|
}
|