@xopcai/xopc 0.0.145 → 0.0.147
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/README.md +2 -2
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/demo-memory/src/index.js +6 -4
- package/dist/extensions/demo-memory/src/index.js.map +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/Combination-14nmIgxH.js +41 -0
- package/dist/gateway/static/root/assets/activity-store-DXeSSlw1.js +1 -0
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-BEUxdhZx.js → agent-avatar-dicebear-CFdJKSjY.js} +1 -1
- package/dist/gateway/static/root/assets/agents-DKjbRpbA.js +2 -0
- package/dist/gateway/static/root/assets/api-Bs69B5zA.js +1 -0
- package/dist/gateway/static/root/assets/{app-management-settings-panel-CRHSZJWi.js → app-management-settings-panel-ag1ViXT_.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-BunADYJb.js → appearance-settings-C6iMpwOM.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-CpX3lBFF.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-B6vTkH2A.js → archive-plugin-Dwi3mIBy.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-BjZXzaNv.js → attachment-load-BaCDoq40.js} +1 -1
- package/dist/gateway/static/root/assets/{automation-suggestion-card-ZDA-Stg1.js → automation-suggestion-card-CwqtFgnw.js} +1 -1
- package/dist/gateway/static/root/assets/automations-page-DlupOxFQ.js +6 -0
- package/dist/gateway/static/root/assets/{binary-plugins-DYZfLvPz.js → binary-plugins-DoAYhsxa.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-C3MUlYC9.js → block-editor-Bw72pO7S.js} +31 -31
- package/dist/gateway/static/root/assets/browser-settings-page-BwLoUBcZ.js +8 -0
- package/dist/gateway/static/root/assets/capability-presets-api-vdbAR65Q.js +1 -0
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-BAsKbJgm.js +2 -0
- package/dist/gateway/static/root/assets/{channel-recipient-api-fTlTnWB4.js → channel-recipient-api-rTG26jpV.js} +1 -1
- package/dist/gateway/static/root/assets/channels-settings-CxFWy0cE.js +1 -0
- package/dist/gateway/static/root/assets/channels-status-swr-OKlqTtKJ.js +1 -0
- package/dist/gateway/static/root/assets/{connector-logo-BVFNT2zW.js → connector-logo-DIMP4NWY.js} +1 -1
- package/dist/gateway/static/root/assets/connectors-page-BjQQwX62.js +2 -0
- package/dist/gateway/static/root/assets/{desktop-pet-_jUmoXd3.js → desktop-pet-kQq2e0BN.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-settings-DwGOy4AQ.js → desktop-pet-settings-B6vtozMY.js} +1 -1
- package/dist/gateway/static/root/assets/{directory-picker-path-field-akvF0F-u.js → directory-picker-path-field-Dn5-e3v4.js} +1 -1
- package/dist/gateway/static/root/assets/dist-C230izr8.js +1 -0
- package/dist/gateway/static/root/assets/dist-CxGUk8J-.js +1 -0
- package/dist/gateway/static/root/assets/dreaming-settings-BzwIujPG.js +3 -0
- package/dist/gateway/static/root/assets/extension-debug-page-D_e_hsEy.js +1 -0
- package/dist/gateway/static/root/assets/{extension-page-CwWktRNz.js → extension-page-D15CWHBd.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-CuggWOIl.js → extension-settings-page-D4P0n1om.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-api-B7sxIbza.js → gateway-config-api-B4qZctjG.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-settings-DIv0eKMf.js → gateway-settings-BvndV7TP.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-startup-retry-DtoLihQE.js → gateway-startup-retry-BpgMunEb.js} +1 -1
- package/dist/gateway/static/root/assets/{goal-create-dialog-C4Kw0mfS.js → goal-create-dialog-DrVHKXHq.js} +1 -1
- package/dist/gateway/static/root/assets/goal-detail-page-PHlCwv68.js +4 -0
- package/dist/gateway/static/root/assets/{goals-config-api-B0jm5JaA.js → goals-config-api-B6YJB_ct.js} +1 -1
- package/dist/gateway/static/root/assets/goals-page-Hg9uyO6e.js +2 -0
- package/dist/gateway/static/root/assets/{goals-settings-N5_iL7es.js → goals-settings-BROWCIcL.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-settings-XzH3lbRR.js → heartbeat-settings-CoCwIOIg.js} +1 -1
- package/dist/gateway/static/root/assets/index-CxkNzw3e.js +259 -0
- package/dist/gateway/static/root/assets/index-DjCSOyaN.css +1 -0
- package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-Bm_AIYQ7.js +1 -0
- package/dist/gateway/static/root/assets/local-app-workbench-page-BJWFcxwG.js +2 -0
- package/dist/gateway/static/root/assets/local-apps-page-BsiZMrEf.js +1 -0
- package/dist/gateway/static/root/assets/{locale-store-CiM-D9jA.js → locale-store-Bp8joZck.js} +1 -1
- package/dist/gateway/static/root/assets/logs-page-DOmK61ey.js +7 -0
- package/dist/gateway/static/root/assets/{markdown-split-5rJx5flj.js → markdown-split-Dy7QpaAz.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-DYXccwAd.js → media-plugins-3Lxliy9D.js} +1 -1
- package/dist/gateway/static/root/assets/messages-CQGpD-dC.js +5 -0
- package/dist/gateway/static/root/assets/models-hub-panel-DGCZom4o.js +2 -0
- package/dist/gateway/static/root/assets/{notes-page-BgLyndCO.js → notes-page-BJtT4vSf.js} +1 -1
- package/dist/gateway/static/root/assets/notes-workbench-B_bN7cOR.js +4 -0
- package/dist/gateway/static/root/assets/{page-tabs-6Al9_sGz.js → page-tabs-DKB6RDre.js} +1 -1
- package/dist/gateway/static/root/assets/{preview-open-alternatives-Cm3G72Hv.js → preview-open-alternatives-Br_YhYHp.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-Dq8JouJj.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-DvfL7fSe.js +1 -0
- package/dist/gateway/static/root/assets/remote-access-hub-DqwMXSXP.js +1 -0
- package/dist/gateway/static/root/assets/{save-bar-controls-BYtfzu_F.js → save-bar-controls-BgIE9BBh.js} +1 -1
- package/dist/gateway/static/root/assets/{schedule-field-CvIRc6yK.js → schedule-field-BXDP-oMz.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-CQuKx0n7.js → schema-form-Dhv-SmjG.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-B_mOZkQk.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-BHGmH6YS.js +1 -0
- package/dist/gateway/static/root/assets/{settings-collapsible-section-CF3HHM-t.js → settings-collapsible-section-CUTExnlK.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-form-section-CwWjoRN6.js → settings-form-section-CmnDhsf0.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-loading-skeleton-aUFmJa13.js → settings-loading-skeleton-B79dq-XY.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-B2UUU9TF.js → settings-page-Db8uAv3X.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-layout-DqpbTWqI.js → settings-page-layout-DaFwstQw.js} +1 -1
- package/dist/gateway/static/root/assets/setup-status-panel-BUSEj0KK.js +1 -0
- package/dist/gateway/static/root/assets/{share-preview-page-BOhlPsS1.js → share-preview-page-Bi00uXzV.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-DzsTYfuX.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-DSsdU081.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-DeB1tQZL.js +2 -0
- package/dist/gateway/static/root/assets/{system-settings-panel-CWxSvuwD.js → system-settings-panel-Cxaph7hW.js} +1 -1
- package/dist/gateway/static/root/assets/{theme-store-C9Dxcppm.js → theme-store-eCTN1RpG.js} +1 -1
- package/dist/gateway/static/root/assets/{typed-models-lib-qROAvqTw.js → typed-models-lib-CcZ_tyFY.js} +1 -1
- package/dist/gateway/static/root/assets/{use-channel-catalog-DE9cpn4G.js → use-channel-catalog-C4PWbNoi.js} +1 -1
- package/dist/gateway/static/root/assets/user-context-page-QTVMx_hG.js +1 -0
- package/dist/gateway/static/root/assets/{user-profile-fields-editor-CWxc0ghP.js → user-profile-fields-editor-CPOO9Jz5.js} +1 -1
- package/dist/gateway/static/root/assets/{user-profile-settings-panel-DW-Up6vt.js → user-profile-settings-panel-C8cgtSF7.js} +1 -1
- package/dist/gateway/static/root/assets/{utils-D53uRXVr.js → utils-CiZK2KwH.js} +1 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-b-YZtvUu.js +1 -0
- package/dist/gateway/static/root/assets/work-discovery-page-4zVDOl2G.js +1 -0
- package/dist/gateway/static/root/assets/work-item-detail-page-CHe2tfkc.js +1 -0
- package/dist/gateway/static/root/assets/{workflow-run-setup-panel-D_x9ELJp.js → workflow-run-setup-panel-8SLCYeXE.js} +2 -2
- package/dist/gateway/static/root/assets/workflows-page-DEOFqiWn.js +11 -0
- package/dist/gateway/static/root/index.html +10 -9
- package/dist/package.js +1 -1
- package/dist/src/activity/types.d.ts +1 -1
- package/dist/src/agent/agent-instance-gateway.d.ts +1 -1
- package/dist/src/agent/agent-manager.d.ts +1 -1
- package/dist/src/agent/agent-manager.js +5 -4
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/background-review/coordinator.js +0 -1
- package/dist/src/agent/background-review/coordinator.js.map +1 -1
- package/dist/src/agent/background-review/settings.d.ts +1 -1
- package/dist/src/agent/background-review/settings.js +10 -17
- package/dist/src/agent/background-review/settings.js.map +1 -1
- package/dist/src/agent/bootstrap/filter-bootstrap-files.d.ts +1 -1
- package/dist/src/agent/bootstrap/filter-bootstrap-files.js +1 -1
- package/dist/src/agent/bootstrap/filter-bootstrap-files.js.map +1 -1
- package/dist/src/agent/bootstrap/load-bootstrap-files.js +2 -3
- package/dist/src/agent/bootstrap/load-bootstrap-files.js.map +1 -1
- package/dist/src/agent/code-intelligence/binary.js +1 -1
- package/dist/src/agent/context/project-context.d.ts +14 -0
- package/dist/src/agent/context/project-context.js +23 -1
- package/dist/src/agent/context/project-context.js.map +1 -1
- package/dist/src/agent/context/workspace-templates/AGENTS.md +1 -1
- package/dist/src/agent/context/workspace.d.ts +1 -2
- package/dist/src/agent/context/workspace.js +2 -4
- package/dist/src/agent/context/workspace.js.map +1 -1
- package/dist/src/agent/embedded/run-for-session.js +1 -2
- package/dist/src/agent/embedded/run-for-session.js.map +1 -1
- package/dist/src/agent/embedded/run-turn.js +6 -1
- package/dist/src/agent/embedded/run-turn.js.map +1 -1
- package/dist/src/agent/embedded/types.d.ts +17 -0
- package/dist/src/agent/memory/builtin-memory-store.d.ts +2 -2
- package/dist/src/agent/memory/builtin-memory-store.js +2 -2
- package/dist/src/agent/memory/builtin-memory-store.js.map +1 -1
- package/dist/src/agent/memory/builtin-provider.d.ts +1 -3
- package/dist/src/agent/memory/builtin-provider.js +21 -48
- package/dist/src/agent/memory/builtin-provider.js.map +1 -1
- package/dist/src/agent/memory/context/planner.js +48 -9
- package/dist/src/agent/memory/context/planner.js.map +1 -1
- package/dist/src/agent/memory/context/types.d.ts +7 -1
- package/dist/src/agent/memory/context-fence.js +1 -1
- package/dist/src/agent/memory/context-fence.js.map +1 -1
- package/dist/src/agent/memory/create-memory-manager.js +2 -9
- package/dist/src/agent/memory/create-memory-manager.js.map +1 -1
- package/dist/src/agent/memory/dreaming/config.js +5 -10
- package/dist/src/agent/memory/dreaming/config.js.map +1 -1
- package/dist/src/agent/memory/dreaming/promotion-lifecycle.js +2 -2
- package/dist/src/agent/memory/dreaming/promotion-lifecycle.js.map +1 -1
- package/dist/src/agent/memory/dreaming/scope.d.ts +2 -3
- package/dist/src/agent/memory/dreaming/scope.js +8 -8
- package/dist/src/agent/memory/dreaming/scope.js.map +1 -1
- package/dist/src/agent/memory/manager.d.ts +1 -5
- package/dist/src/agent/memory/manager.js +2 -23
- package/dist/src/agent/memory/manager.js.map +1 -1
- package/dist/src/agent/memory/memory-config.d.ts +3 -3
- package/dist/src/agent/memory/memory-config.js +9 -14
- package/dist/src/agent/memory/memory-config.js.map +1 -1
- package/dist/src/agent/memory/types.d.ts +9 -5
- package/dist/src/agent/memory/understanding/service.js +21 -8
- package/dist/src/agent/memory/understanding/service.js.map +1 -1
- package/dist/src/agent/memory/understanding/types.d.ts +5 -0
- package/dist/src/agent/memory/user-context-coordinator.d.ts +1 -1
- package/dist/src/agent/memory/user-context-coordinator.js +6 -2
- package/dist/src/agent/memory/user-context-coordinator.js.map +1 -1
- package/dist/src/agent/orchestration/agent-orchestrator.js +2 -2
- package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
- package/dist/src/agent/prompt/memory/index.d.ts +1 -2
- package/dist/src/agent/prompt/memory/index.js +6 -7
- package/dist/src/agent/prompt/memory/index.js.map +1 -1
- package/dist/src/agent/prompt/sections/tooling.js +1 -1
- package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
- package/dist/src/agent/service/direct-turn-helpers.js +13 -2
- package/dist/src/agent/service/direct-turn-helpers.js.map +1 -1
- package/dist/src/agent/tools/curated-memory-tool.js +4 -4
- package/dist/src/agent/tools/curated-memory-tool.js.map +1 -1
- package/dist/src/agent/tools/factory.d.ts +1 -1
- package/dist/src/agent/tools/factory.js +2 -2
- package/dist/src/agent/tools/factory.js.map +1 -1
- package/dist/src/agent/tools/memory-tool.js +1 -1
- package/dist/src/agent/tools/memory-tool.js.map +1 -1
- package/dist/src/agent/workflow/workflow-child-tools.js +2 -3
- package/dist/src/agent/workflow/workflow-child-tools.js.map +1 -1
- package/dist/src/agent/workspace-runtime/registry.d.ts +5 -5
- package/dist/src/agent/workspace-runtime/registry.js +6 -11
- package/dist/src/agent/workspace-runtime/registry.js.map +1 -1
- package/dist/src/agent-manifest/index.js +2 -2
- package/dist/src/agent-manifest/prompt.js +1 -7
- package/dist/src/agent-manifest/prompt.js.map +1 -1
- package/dist/src/agent-manifest/schema.d.ts +0 -598
- package/dist/src/agent-manifest/schema.js +2 -143
- package/dist/src/agent-manifest/schema.js.map +1 -1
- package/dist/src/agent-manifest/validator.js +0 -12
- package/dist/src/agent-manifest/validator.js.map +1 -1
- package/dist/src/agent-runtime/index.js +1 -1
- package/dist/src/agent-runtime/memory-runtime.d.ts +2 -2
- package/dist/src/agent-runtime/memory-runtime.js +8 -7
- package/dist/src/agent-runtime/memory-runtime.js.map +1 -1
- package/dist/src/agent-runtime/runtime-profile.d.ts +2 -0
- package/dist/src/agent-runtime/runtime-profile.js +2 -2
- package/dist/src/agent-runtime/runtime-profile.js.map +1 -1
- package/dist/src/chat-commands/agent-edit.js +1 -2
- package/dist/src/chat-commands/agent-edit.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/init.js +0 -22
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/templates.d.ts +1 -1
- package/dist/src/cli/templates.js +1 -16
- package/dist/src/cli/templates.js.map +1 -1
- package/dist/src/commands/agents.config.js +0 -10
- package/dist/src/commands/agents.config.js.map +1 -1
- package/dist/src/config/agent-profile.js +1 -1
- package/dist/src/config/index.js +2 -2
- package/dist/src/config/paths.d.ts +0 -1
- package/dist/src/config/paths.js +1 -2
- package/dist/src/config/paths.js.map +1 -1
- package/dist/src/config/schema.d.ts +118 -532
- package/dist/src/config/schema.js +32 -26
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/extensions/loader.js +2 -1
- package/dist/src/extensions/loader.js.map +1 -1
- package/dist/src/gateway/agents-admin.d.ts +0 -2
- package/dist/src/gateway/agents-admin.js +1 -7
- package/dist/src/gateway/agents-admin.js.map +1 -1
- package/dist/src/gateway/capability-presets-admin.d.ts +0 -2
- package/dist/src/gateway/capability-presets-admin.js.map +1 -1
- package/dist/src/gateway/chat-stream/mapper.js +26 -0
- package/dist/src/gateway/chat-stream/mapper.js.map +1 -1
- package/dist/src/gateway/chat-stream/protocol.d.ts +16 -1
- package/dist/src/gateway/dreaming-automation-reconciler.d.ts +0 -1
- package/dist/src/gateway/dreaming-automation-reconciler.js +41 -63
- package/dist/src/gateway/dreaming-automation-reconciler.js.map +1 -1
- package/dist/src/gateway/heartbeat/service.js +1 -1
- package/dist/src/gateway/hono/app.js +3 -1
- package/dist/src/gateway/hono/app.js.map +1 -1
- package/dist/src/gateway/hono/lib/config-payload.d.ts +0 -130
- package/dist/src/gateway/hono/lib/config-payload.js +0 -1
- package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
- package/dist/src/gateway/hono/routes/agents.js +6 -12
- package/dist/src/gateway/hono/routes/agents.js.map +1 -1
- package/dist/src/gateway/hono/routes/auth-registry-extensions.js +6 -0
- package/dist/src/gateway/hono/routes/auth-registry-extensions.js.map +1 -1
- package/dist/src/gateway/hono/routes/capability-presets.js +2 -2
- package/dist/src/gateway/hono/routes/capability-presets.js.map +1 -1
- package/dist/src/gateway/hono/routes/dreaming.js +9 -20
- package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
- package/dist/src/gateway/hono/routes/index.js +4 -0
- package/dist/src/gateway/hono/routes/index.js.map +1 -1
- package/dist/src/gateway/hono/routes/local-apps.d.ts +5 -0
- package/dist/src/gateway/hono/routes/local-apps.js +99 -0
- package/dist/src/gateway/hono/routes/local-apps.js.map +1 -0
- package/dist/src/gateway/hono/routes/memory.js +48 -65
- package/dist/src/gateway/hono/routes/memory.js.map +1 -1
- package/dist/src/gateway/hono/routes/projects.js +2 -2
- package/dist/src/gateway/hono/routes/projects.js.map +1 -1
- package/dist/src/gateway/hono/routes/work-discovery.d.ts +3 -0
- package/dist/src/gateway/hono/routes/work-discovery.js +150 -0
- package/dist/src/gateway/hono/routes/work-discovery.js.map +1 -0
- package/dist/src/gateway/hono/routes/you.d.ts +3 -0
- package/dist/src/gateway/hono/routes/you.js +358 -91
- package/dist/src/gateway/hono/routes/you.js.map +1 -1
- package/dist/src/gateway/service.d.ts +3 -0
- package/dist/src/gateway/service.js +12 -0
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/heartbeat/index.js +1 -1
- package/dist/src/knowledge/connected-knowledge-pipeline.js +9 -5
- package/dist/src/knowledge/connected-knowledge-pipeline.js.map +1 -1
- package/dist/src/local-apps/acceptance.d.ts +30 -0
- package/dist/src/local-apps/acceptance.js +93 -0
- package/dist/src/local-apps/acceptance.js.map +1 -0
- package/dist/src/local-apps/index.d.ts +5 -0
- package/dist/src/local-apps/index.js +4 -0
- package/dist/src/local-apps/preview-runtime-bridge.d.ts +4 -0
- package/dist/src/local-apps/preview-runtime-bridge.js +171 -0
- package/dist/src/local-apps/preview-runtime-bridge.js.map +1 -0
- package/dist/src/local-apps/runtime-entry.d.ts +8 -0
- package/dist/src/local-apps/runtime-entry.js +25 -0
- package/dist/src/local-apps/runtime-entry.js.map +1 -0
- package/dist/src/local-apps/scaffold.d.ts +8 -0
- package/dist/src/local-apps/scaffold.js +122 -0
- package/dist/src/local-apps/scaffold.js.map +1 -0
- package/dist/src/local-apps/service.d.ts +37 -0
- package/dist/src/local-apps/service.js +553 -0
- package/dist/src/local-apps/service.js.map +1 -0
- package/dist/src/local-apps/store.d.ts +44 -0
- package/dist/src/local-apps/store.js +195 -0
- package/dist/src/local-apps/store.js.map +1 -0
- package/dist/src/local-apps/types.d.ts +105 -0
- package/dist/src/local-apps/types.js +1 -0
- package/dist/src/storage/sqlite/index.d.ts +3 -2
- package/dist/src/storage/sqlite/index.js +4 -3
- package/dist/src/storage/sqlite/memory-index-repository.d.ts +2 -3
- package/dist/src/storage/sqlite/memory-index-repository.js +16 -20
- package/dist/src/storage/sqlite/memory-index-repository.js.map +1 -1
- package/dist/src/storage/sqlite/memory-records-repository.d.ts +18 -10
- package/dist/src/storage/sqlite/memory-records-repository.js +79 -34
- package/dist/src/storage/sqlite/memory-records-repository.js.map +1 -1
- package/dist/src/storage/sqlite/memory-reference-consent-repository.d.ts +27 -0
- package/dist/src/storage/sqlite/memory-reference-consent-repository.js +109 -0
- package/dist/src/storage/sqlite/memory-reference-consent-repository.js.map +1 -0
- package/dist/src/storage/sqlite/migrations/038_user_owned_memory.sql +68 -0
- package/dist/src/storage/sqlite/migrations/039_memory_reference_consents.sql +19 -0
- package/dist/src/storage/sqlite/migrations/040_local_apps.sql +32 -0
- package/dist/src/storage/sqlite/migrations/041_local_app_release_lifecycle.sql +17 -0
- package/dist/src/storage/sqlite/migrations/042_work_discovery.sql +41 -0
- package/dist/src/storage/sqlite/migrations/043_local_app_acceptance_runs.sql +16 -0
- package/dist/src/storage/sqlite/migrations/044_repair_work_discovery_foreign_keys.sql +75 -0
- package/dist/src/storage/sqlite/migrations/045_extension_ui_grants.sql +13 -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/schema.js +1 -1
- package/dist/src/storage/sqlite/schema.sql +20 -0
- package/dist/src/user-context/config.d.ts +227 -0
- package/dist/src/user-context/config.js +158 -0
- package/dist/src/user-context/config.js.map +1 -0
- package/dist/src/user-context/import.d.ts +1 -1
- package/dist/src/user-context/import.js +6 -1
- package/dist/src/user-context/import.js.map +1 -1
- package/dist/src/user-context/owner.d.ts +5 -0
- package/dist/src/user-context/owner.js +9 -0
- package/dist/src/user-context/owner.js.map +1 -0
- package/dist/src/user-context/projection.d.ts +11 -9
- package/dist/src/user-context/projection.js +74 -47
- package/dist/src/user-context/projection.js.map +1 -1
- package/dist/src/user-context/runtime.d.ts +13 -0
- package/dist/src/user-context/runtime.js +36 -0
- package/dist/src/user-context/runtime.js.map +1 -0
- package/dist/src/work-discovery/analyzer.d.ts +11 -0
- package/dist/src/work-discovery/analyzer.js +171 -0
- package/dist/src/work-discovery/analyzer.js.map +1 -0
- package/dist/src/work-discovery/index.d.ts +5 -0
- package/dist/src/work-discovery/index.js +5 -0
- package/dist/src/work-discovery/probe.d.ts +12 -0
- package/dist/src/work-discovery/probe.js +335 -0
- package/dist/src/work-discovery/probe.js.map +1 -0
- package/dist/src/work-discovery/repository.d.ts +11 -0
- package/dist/src/work-discovery/repository.js +100 -0
- package/dist/src/work-discovery/repository.js.map +1 -0
- package/dist/src/work-discovery/service.d.ts +30 -0
- package/dist/src/work-discovery/service.js +387 -0
- package/dist/src/work-discovery/service.js.map +1 -0
- package/dist/src/work-discovery/types.d.ts +114 -0
- package/dist/src/work-discovery/types.js +1 -0
- package/dist/src/workflows/service/workflow-session-bridge.js +1 -1
- package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
- package/package.json +5 -3
- package/skills/engineering/build-xopc-local-app/SKILL.md +45 -0
- package/skills/engineering/build-xopc-local-app/references/app-contract.md +33 -0
- package/skills/engineering/build-xopc-local-app/scripts/validate-local-app.mjs +72 -0
- package/dist/gateway/static/root/assets/Combination-DolwnuKi.js +0 -41
- package/dist/gateway/static/root/assets/activity-center-store-3l9ahUqb.js +0 -1
- package/dist/gateway/static/root/assets/agents-1bpT0xRO.js +0 -2
- package/dist/gateway/static/root/assets/apps-page-Cc4JgVUQ.js +0 -1
- package/dist/gateway/static/root/assets/automations-page-mb0fdVpq.js +0 -6
- package/dist/gateway/static/root/assets/browser-settings-page-Bb0xhaMN.js +0 -8
- package/dist/gateway/static/root/assets/capability-presets-api-BV76yN9a.js +0 -1
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-CUcGKZqC.js +0 -2
- package/dist/gateway/static/root/assets/channels-settings-BlSDMGdy.js +0 -1
- package/dist/gateway/static/root/assets/channels-status-swr-CJauF1CW.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-CMgAFGvb.js +0 -2
- package/dist/gateway/static/root/assets/dist-C99RGfAH.js +0 -1
- package/dist/gateway/static/root/assets/dreaming-settings-BLetQiYY.js +0 -3
- package/dist/gateway/static/root/assets/extension-debug-page-Cof2ncxE.js +0 -1
- package/dist/gateway/static/root/assets/goal-detail-page-BMmzYpZL.js +0 -4
- package/dist/gateway/static/root/assets/goals-page-CGeT77PC.js +0 -2
- package/dist/gateway/static/root/assets/index-CSLF84-Q.css +0 -1
- package/dist/gateway/static/root/assets/index-I-ZCenVw.js +0 -259
- package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-x_v0nrIi.js +0 -1
- package/dist/gateway/static/root/assets/logs-page-BSh1t8cD.js +0 -7
- package/dist/gateway/static/root/assets/messages-Cb1VMeqP.js +0 -5
- package/dist/gateway/static/root/assets/models-hub-panel-BNpTenAI.js +0 -2
- package/dist/gateway/static/root/assets/notes-workbench-teklkhcE.js +0 -4
- package/dist/gateway/static/root/assets/project-detail-page-CCB_dKoh.js +0 -1
- package/dist/gateway/static/root/assets/projects-page-VOAFAHYj.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-USYu64Ru.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-oGC8O5h_.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-D4rP66R1.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-Ck9keROI.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-BYLsCuqj.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-BNHUyVML.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-CpXbQH4n.js +0 -2
- package/dist/gateway/static/root/assets/user-context-page-DbNEK4Yp.js +0 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-Cs7MOrg0.js +0 -1
- package/dist/gateway/static/root/assets/work-item-detail-page-D1ziG1Pp.js +0 -1
- package/dist/gateway/static/root/assets/workflows-page-DHGV_n6i.js +0 -11
- package/dist/src/agent/context/workspace-templates/MEMORY.md +0 -33
- package/dist/src/agent/memory/access-policy.d.ts +0 -12
- package/dist/src/agent/memory/access-policy.js +0 -44
- package/dist/src/agent/memory/access-policy.js.map +0 -1
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
import { createLogger } from "../utils/logger/index.js";
|
|
2
|
+
import { init_logger } from "../utils/logger.js";
|
|
3
|
+
import { ActivityService } from "../activity/service.js";
|
|
4
|
+
import { getAgentDefaultModelRef, init_schema } from "../config/schema.js";
|
|
5
|
+
import { buildSessionKey, init_session_key } from "../routing/session-key.js";
|
|
6
|
+
import { getDefaultAgentId, init_resolve_route } from "../routing/resolve-route.js";
|
|
7
|
+
import { previewWorkDiscoveryRoot, probeWorkDiscoveryRoot, summarizeWorkContextSnapshot } from "./probe.js";
|
|
8
|
+
import { analyzeWorkContext, workDiscoveryResultMarkdown } from "./analyzer.js";
|
|
9
|
+
import { createWorkDiscoveryRun, getWorkDiscoveryOnboardingState, getWorkDiscoveryRun, getWorkDiscoveryRunByIdempotencyKey, setWorkDiscoveryOnboardingState, updateWorkDiscoveryRun } from "./repository.js";
|
|
10
|
+
import { randomUUID } from "node:crypto";
|
|
11
|
+
//#region src/work-discovery/service.ts
|
|
12
|
+
init_schema();
|
|
13
|
+
init_session_key();
|
|
14
|
+
init_resolve_route();
|
|
15
|
+
init_logger();
|
|
16
|
+
const log = createLogger("WorkDiscovery");
|
|
17
|
+
function sessionMetadata(agentId, peerId) {
|
|
18
|
+
return {
|
|
19
|
+
sourceChannel: "webchat",
|
|
20
|
+
sourceChatId: [
|
|
21
|
+
"default",
|
|
22
|
+
"direct",
|
|
23
|
+
peerId
|
|
24
|
+
].join(":"),
|
|
25
|
+
sessionType: "chat",
|
|
26
|
+
hiddenFromSessionList: true,
|
|
27
|
+
routing: {
|
|
28
|
+
agentId,
|
|
29
|
+
source: "webchat",
|
|
30
|
+
accountId: "default",
|
|
31
|
+
peerKind: "direct",
|
|
32
|
+
peerId
|
|
33
|
+
},
|
|
34
|
+
customData: {
|
|
35
|
+
workDiscovery: true,
|
|
36
|
+
genericNewChatShell: false
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
function errorCode(error) {
|
|
41
|
+
if (error instanceof DOMException && error.name === "AbortError") return "canceled";
|
|
42
|
+
const message = error instanceof Error ? error.message.toLowerCase() : String(error).toLowerCase();
|
|
43
|
+
if (message.includes("api key") || message.includes("model") || message.includes("provider")) return "model_unavailable";
|
|
44
|
+
if (message.includes("directory") || message.includes("folder") || message.includes("enoent")) return "folder_unavailable";
|
|
45
|
+
if (message.includes("permission") || message.includes("eacces")) return "folder_not_readable";
|
|
46
|
+
if (message.includes("json") || message.includes("analysis result")) return "analysis_invalid";
|
|
47
|
+
if (message.includes("timeout")) return "analysis_timeout";
|
|
48
|
+
return "internal_error";
|
|
49
|
+
}
|
|
50
|
+
var WorkDiscoveryService = class {
|
|
51
|
+
abortControllers = /* @__PURE__ */ new Map();
|
|
52
|
+
activity = new ActivityService();
|
|
53
|
+
constructor(options) {
|
|
54
|
+
this.options = options;
|
|
55
|
+
}
|
|
56
|
+
isEnabled() {
|
|
57
|
+
return this.options.getConfig().experimental?.workDiscoveryOnboarding === true;
|
|
58
|
+
}
|
|
59
|
+
getOnboardingState() {
|
|
60
|
+
return getWorkDiscoveryOnboardingState();
|
|
61
|
+
}
|
|
62
|
+
dismissOnboarding() {
|
|
63
|
+
return setWorkDiscoveryOnboardingState({
|
|
64
|
+
status: "dismissed",
|
|
65
|
+
activeRunId: null
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
getRun(id) {
|
|
69
|
+
return getWorkDiscoveryRun(id);
|
|
70
|
+
}
|
|
71
|
+
async startRun(input) {
|
|
72
|
+
const existing = getWorkDiscoveryRunByIdempotencyKey(input.idempotencyKey);
|
|
73
|
+
if (existing) return existing;
|
|
74
|
+
const config = this.options.getConfig();
|
|
75
|
+
const modelRef = getAgentDefaultModelRef(config);
|
|
76
|
+
if (!modelRef) throw new Error("No default model configured");
|
|
77
|
+
const rootPath = (await previewWorkDiscoveryRoot(input.rootPath)).canonicalRootPath;
|
|
78
|
+
const agentId = getDefaultAgentId(config);
|
|
79
|
+
const match = this.options.projects.resolveOrCreateForWorkspacePath({
|
|
80
|
+
workspacePath: rootPath,
|
|
81
|
+
defaultAgentId: agentId,
|
|
82
|
+
autoCreate: true
|
|
83
|
+
});
|
|
84
|
+
if (!match) throw new Error("Selected folder cannot be used as a project workspace");
|
|
85
|
+
const projectAgentId = match.project.defaultAgentId || agentId;
|
|
86
|
+
const peerId = `work-discovery-${randomUUID()}`;
|
|
87
|
+
const sessionKey = buildSessionKey({
|
|
88
|
+
agentId: projectAgentId,
|
|
89
|
+
source: "webchat",
|
|
90
|
+
accountId: "default",
|
|
91
|
+
peerKind: "direct",
|
|
92
|
+
peerId
|
|
93
|
+
});
|
|
94
|
+
await this.options.sessions.saveMessages(sessionKey, [], { metadata: sessionMetadata(projectAgentId, peerId) });
|
|
95
|
+
this.options.projects.attachSession(sessionKey, match.project.id);
|
|
96
|
+
const now = Date.now();
|
|
97
|
+
const run = createWorkDiscoveryRun({
|
|
98
|
+
id: randomUUID(),
|
|
99
|
+
idempotencyKey: input.idempotencyKey,
|
|
100
|
+
source: input.source,
|
|
101
|
+
status: "queued",
|
|
102
|
+
rootPath,
|
|
103
|
+
projectId: match.project.id,
|
|
104
|
+
sessionKey,
|
|
105
|
+
agentId: projectAgentId,
|
|
106
|
+
modelRef,
|
|
107
|
+
scanPolicyVersion: 1,
|
|
108
|
+
createdAt: now
|
|
109
|
+
});
|
|
110
|
+
await this.options.sessions.appendTranscriptContextEntry(sessionKey, {
|
|
111
|
+
text: "Work discovery was explicitly requested for the selected folder.",
|
|
112
|
+
data: {
|
|
113
|
+
type: "work_discovery",
|
|
114
|
+
runId: run.id,
|
|
115
|
+
rootPath,
|
|
116
|
+
scanPolicyVersion: 1,
|
|
117
|
+
source: input.source
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
if (input.source === "onboarding_selected_directory") setWorkDiscoveryOnboardingState({
|
|
121
|
+
status: "in_progress",
|
|
122
|
+
activeRunId: run.id
|
|
123
|
+
});
|
|
124
|
+
this.activity.record({
|
|
125
|
+
type: "work_discovery.started",
|
|
126
|
+
primaryObject: {
|
|
127
|
+
kind: "project",
|
|
128
|
+
id: match.project.id,
|
|
129
|
+
title: match.project.name
|
|
130
|
+
},
|
|
131
|
+
actor: { kind: "system" },
|
|
132
|
+
initiator: {
|
|
133
|
+
kind: "user",
|
|
134
|
+
sessionKey
|
|
135
|
+
},
|
|
136
|
+
source: {
|
|
137
|
+
kind: "gateway_api",
|
|
138
|
+
runId: run.id
|
|
139
|
+
},
|
|
140
|
+
visibility: "audit",
|
|
141
|
+
payload: {
|
|
142
|
+
policyVersion: 1,
|
|
143
|
+
source: input.source
|
|
144
|
+
},
|
|
145
|
+
scopes: [{
|
|
146
|
+
scopeKind: "project",
|
|
147
|
+
scopeId: match.project.id,
|
|
148
|
+
reason: "object_owner"
|
|
149
|
+
}, {
|
|
150
|
+
scopeKind: "session",
|
|
151
|
+
scopeId: sessionKey,
|
|
152
|
+
reason: "runtime_context"
|
|
153
|
+
}]
|
|
154
|
+
});
|
|
155
|
+
const controller = new AbortController();
|
|
156
|
+
this.abortControllers.set(run.id, controller);
|
|
157
|
+
this.execute(run, controller.signal);
|
|
158
|
+
return run;
|
|
159
|
+
}
|
|
160
|
+
publish(run) {
|
|
161
|
+
const suffix = run.status === "completed" ? "completed" : run.status === "failed" ? "failed" : run.status === "canceled" ? "canceled" : "progress";
|
|
162
|
+
this.options.emit(`work-discovery.${suffix}`, {
|
|
163
|
+
runId: run.id,
|
|
164
|
+
projectId: run.projectId,
|
|
165
|
+
sessionKey: run.sessionKey,
|
|
166
|
+
status: run.status,
|
|
167
|
+
stage: run.stage,
|
|
168
|
+
...run.status === "completed" ? { result: run.result } : {}
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
async execute(run, signal) {
|
|
172
|
+
const startedAt = Date.now();
|
|
173
|
+
try {
|
|
174
|
+
let current = updateWorkDiscoveryRun(run.id, {
|
|
175
|
+
status: "probing",
|
|
176
|
+
stage: "folder_structure",
|
|
177
|
+
startedAt
|
|
178
|
+
});
|
|
179
|
+
this.publish(current);
|
|
180
|
+
const snapshot = await probeWorkDiscoveryRoot(run.rootPath, signal);
|
|
181
|
+
if (signal.aborted) throw new DOMException("Work discovery canceled", "AbortError");
|
|
182
|
+
current = updateWorkDiscoveryRun(run.id, {
|
|
183
|
+
status: "analyzing",
|
|
184
|
+
stage: "recent_progress",
|
|
185
|
+
snapshot: summarizeWorkContextSnapshot(snapshot)
|
|
186
|
+
});
|
|
187
|
+
this.publish(current);
|
|
188
|
+
const analysis = await analyzeWorkContext({
|
|
189
|
+
config: this.options.getConfig(),
|
|
190
|
+
snapshot,
|
|
191
|
+
signal
|
|
192
|
+
});
|
|
193
|
+
current = updateWorkDiscoveryRun(run.id, {
|
|
194
|
+
status: "analyzing",
|
|
195
|
+
stage: "next_steps"
|
|
196
|
+
});
|
|
197
|
+
this.publish(current);
|
|
198
|
+
await this.options.sessions.appendTranscriptCustomMessageEntry(run.sessionKey, {
|
|
199
|
+
customType: "work-discovery-result",
|
|
200
|
+
content: workDiscoveryResultMarkdown(analysis.result),
|
|
201
|
+
display: true,
|
|
202
|
+
details: {
|
|
203
|
+
runId: run.id,
|
|
204
|
+
result: analysis.result
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
const project = this.options.projects.get(run.projectId);
|
|
208
|
+
await this.options.sessions.updateSessionMetadata(run.sessionKey, {
|
|
209
|
+
name: project ? `Continue work on ${project.name}` : "Continue recent work",
|
|
210
|
+
hiddenFromSessionList: false
|
|
211
|
+
});
|
|
212
|
+
current = updateWorkDiscoveryRun(run.id, {
|
|
213
|
+
status: "completed",
|
|
214
|
+
stage: "next_steps",
|
|
215
|
+
result: analysis.result,
|
|
216
|
+
completedAt: Date.now()
|
|
217
|
+
});
|
|
218
|
+
if (run.source === "onboarding_selected_directory") setWorkDiscoveryOnboardingState({
|
|
219
|
+
status: "completed",
|
|
220
|
+
activeRunId: run.id
|
|
221
|
+
});
|
|
222
|
+
this.activity.record({
|
|
223
|
+
type: "work_discovery.completed",
|
|
224
|
+
primaryObject: {
|
|
225
|
+
kind: "project",
|
|
226
|
+
id: run.projectId,
|
|
227
|
+
title: project?.name
|
|
228
|
+
},
|
|
229
|
+
actor: {
|
|
230
|
+
kind: "agent",
|
|
231
|
+
agentId: run.agentId,
|
|
232
|
+
sessionKey: run.sessionKey
|
|
233
|
+
},
|
|
234
|
+
initiator: {
|
|
235
|
+
kind: "user",
|
|
236
|
+
sessionKey: run.sessionKey
|
|
237
|
+
},
|
|
238
|
+
source: {
|
|
239
|
+
kind: "system",
|
|
240
|
+
runId: run.id
|
|
241
|
+
},
|
|
242
|
+
payload: {
|
|
243
|
+
policyVersion: run.scanPolicyVersion,
|
|
244
|
+
suggestionCount: analysis.result.suggestions.length,
|
|
245
|
+
lowConfidence: analysis.result.lowConfidence === true
|
|
246
|
+
},
|
|
247
|
+
scopes: [{
|
|
248
|
+
scopeKind: "project",
|
|
249
|
+
scopeId: run.projectId,
|
|
250
|
+
reason: "object_owner"
|
|
251
|
+
}, {
|
|
252
|
+
scopeKind: "session",
|
|
253
|
+
scopeId: run.sessionKey,
|
|
254
|
+
reason: "runtime_context"
|
|
255
|
+
}]
|
|
256
|
+
});
|
|
257
|
+
this.publish(current);
|
|
258
|
+
this.options.emit("session.transcript_updated", { key: run.sessionKey });
|
|
259
|
+
log.info({
|
|
260
|
+
runId: run.id,
|
|
261
|
+
projectId: run.projectId,
|
|
262
|
+
sessionKey: run.sessionKey,
|
|
263
|
+
durationMs: Date.now() - startedAt
|
|
264
|
+
}, "Work discovery completed");
|
|
265
|
+
} catch (error) {
|
|
266
|
+
const canceled = signal.aborted || error instanceof DOMException && error.name === "AbortError";
|
|
267
|
+
const code = canceled ? "canceled" : errorCode(error);
|
|
268
|
+
const message = canceled ? "Analysis canceled" : error instanceof Error ? error.message : String(error);
|
|
269
|
+
const current = updateWorkDiscoveryRun(run.id, {
|
|
270
|
+
status: canceled ? "canceled" : "failed",
|
|
271
|
+
errorCode: code,
|
|
272
|
+
errorMessage: message,
|
|
273
|
+
...canceled ? { canceledAt: Date.now() } : { completedAt: Date.now() }
|
|
274
|
+
});
|
|
275
|
+
if (current) this.publish(current);
|
|
276
|
+
this.activity.record({
|
|
277
|
+
type: canceled ? "work_discovery.canceled" : "work_discovery.failed",
|
|
278
|
+
primaryObject: {
|
|
279
|
+
kind: "project",
|
|
280
|
+
id: run.projectId
|
|
281
|
+
},
|
|
282
|
+
actor: { kind: "system" },
|
|
283
|
+
initiator: {
|
|
284
|
+
kind: "user",
|
|
285
|
+
sessionKey: run.sessionKey
|
|
286
|
+
},
|
|
287
|
+
source: {
|
|
288
|
+
kind: "system",
|
|
289
|
+
runId: run.id
|
|
290
|
+
},
|
|
291
|
+
visibility: "audit",
|
|
292
|
+
payload: { errorCode: code },
|
|
293
|
+
scopes: [{
|
|
294
|
+
scopeKind: "project",
|
|
295
|
+
scopeId: run.projectId,
|
|
296
|
+
reason: "object_owner"
|
|
297
|
+
}, {
|
|
298
|
+
scopeKind: "session",
|
|
299
|
+
scopeId: run.sessionKey,
|
|
300
|
+
reason: "runtime_context"
|
|
301
|
+
}]
|
|
302
|
+
});
|
|
303
|
+
log.warn({
|
|
304
|
+
err: error,
|
|
305
|
+
runId: run.id,
|
|
306
|
+
projectId: run.projectId,
|
|
307
|
+
phase: "analysis",
|
|
308
|
+
errorCode: code
|
|
309
|
+
}, `Work discovery failed: ${message}`);
|
|
310
|
+
} finally {
|
|
311
|
+
this.abortControllers.delete(run.id);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
cancelRun(id) {
|
|
315
|
+
const run = getWorkDiscoveryRun(id);
|
|
316
|
+
if (!run) return null;
|
|
317
|
+
if (run.status === "completed" || run.status === "failed" || run.status === "canceled") return run;
|
|
318
|
+
this.abortControllers.get(id)?.abort();
|
|
319
|
+
return updateWorkDiscoveryRun(id, {
|
|
320
|
+
status: "canceled",
|
|
321
|
+
errorCode: "canceled",
|
|
322
|
+
errorMessage: "Analysis canceled",
|
|
323
|
+
canceledAt: Date.now()
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
retryRun(id) {
|
|
327
|
+
const run = getWorkDiscoveryRun(id);
|
|
328
|
+
if (!run) return null;
|
|
329
|
+
if (run.status !== "failed" && run.status !== "canceled") return run;
|
|
330
|
+
const queued = updateWorkDiscoveryRun(id, {
|
|
331
|
+
status: "queued",
|
|
332
|
+
stage: "folder_structure",
|
|
333
|
+
errorCode: void 0,
|
|
334
|
+
errorMessage: void 0,
|
|
335
|
+
completedAt: void 0,
|
|
336
|
+
canceledAt: void 0
|
|
337
|
+
});
|
|
338
|
+
if (!queued) return null;
|
|
339
|
+
const controller = new AbortController();
|
|
340
|
+
this.abortControllers.set(id, controller);
|
|
341
|
+
if (run.source === "onboarding_selected_directory") setWorkDiscoveryOnboardingState({
|
|
342
|
+
status: "in_progress",
|
|
343
|
+
activeRunId: id
|
|
344
|
+
});
|
|
345
|
+
this.publish(queued);
|
|
346
|
+
this.execute(queued, controller.signal);
|
|
347
|
+
return queued;
|
|
348
|
+
}
|
|
349
|
+
selectSuggestion(runId, suggestionId) {
|
|
350
|
+
const run = getWorkDiscoveryRun(runId);
|
|
351
|
+
const suggestion = run?.result?.suggestions.find((item) => item.id === suggestionId);
|
|
352
|
+
if (!run || !suggestion) return null;
|
|
353
|
+
this.activity.record({
|
|
354
|
+
type: "work_discovery.suggestion_selected",
|
|
355
|
+
primaryObject: {
|
|
356
|
+
kind: "project",
|
|
357
|
+
id: run.projectId
|
|
358
|
+
},
|
|
359
|
+
actor: {
|
|
360
|
+
kind: "user",
|
|
361
|
+
sessionKey: run.sessionKey
|
|
362
|
+
},
|
|
363
|
+
source: {
|
|
364
|
+
kind: "gateway_api",
|
|
365
|
+
runId
|
|
366
|
+
},
|
|
367
|
+
payload: {
|
|
368
|
+
suggestionId,
|
|
369
|
+
title: suggestion.title
|
|
370
|
+
},
|
|
371
|
+
scopes: [{
|
|
372
|
+
scopeKind: "project",
|
|
373
|
+
scopeId: run.projectId,
|
|
374
|
+
reason: "object_owner"
|
|
375
|
+
}, {
|
|
376
|
+
scopeKind: "session",
|
|
377
|
+
scopeId: run.sessionKey,
|
|
378
|
+
reason: "runtime_context"
|
|
379
|
+
}]
|
|
380
|
+
});
|
|
381
|
+
return run;
|
|
382
|
+
}
|
|
383
|
+
};
|
|
384
|
+
//#endregion
|
|
385
|
+
export { WorkDiscoveryService };
|
|
386
|
+
|
|
387
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","names":[],"sources":["../../../src/work-discovery/service.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport type { Config } from '../config/schema.js';\nimport { getAgentDefaultModelRef } from '../config/schema.js';\nimport { ActivityService } from '../activity/service.js';\nimport type { ProjectService } from '../projects/project-service.js';\nimport { buildSessionKey } from '../routing/session-key.js';\nimport { getDefaultAgentId } from '../routing/resolve-route.js';\nimport type { SessionIndex } from '../session/manager.js';\nimport type { SessionMetadataSeed } from '../storage/sqlite/index.js';\nimport { createLogger } from '../utils/logger.js';\n\nimport { analyzeWorkContext, workDiscoveryResultMarkdown } from './analyzer.js';\nimport {\n createWorkDiscoveryRun,\n getWorkDiscoveryOnboardingState,\n getWorkDiscoveryRun,\n getWorkDiscoveryRunByIdempotencyKey,\n setWorkDiscoveryOnboardingState,\n updateWorkDiscoveryRun,\n} from './repository.js';\nimport {\n probeWorkDiscoveryRoot,\n previewWorkDiscoveryRoot,\n summarizeWorkContextSnapshot,\n WORK_DISCOVERY_SCAN_POLICY_VERSION,\n} from './probe.js';\nimport type {\n WorkDiscoveryErrorCode,\n WorkDiscoveryOnboardingState,\n WorkDiscoveryRun,\n WorkDiscoverySource,\n} from './types.js';\n\nconst log = createLogger('WorkDiscovery');\n\nexport interface WorkDiscoveryServiceOptions {\n projects: ProjectService;\n sessions: SessionIndex;\n getConfig: () => Config;\n emit: (type: string, payload: unknown) => void;\n}\n\nfunction sessionMetadata(agentId: string, peerId: string): SessionMetadataSeed {\n return {\n sourceChannel: 'webchat',\n sourceChatId: ['default', 'direct', peerId].join(':'),\n sessionType: 'chat',\n hiddenFromSessionList: true,\n routing: {\n agentId,\n source: 'webchat',\n accountId: 'default',\n peerKind: 'direct',\n peerId,\n },\n customData: {\n workDiscovery: true,\n genericNewChatShell: false,\n },\n };\n}\n\nfunction errorCode(error: unknown): WorkDiscoveryErrorCode {\n if (error instanceof DOMException && error.name === 'AbortError') return 'canceled';\n const message = error instanceof Error ? error.message.toLowerCase() : String(error).toLowerCase();\n if (message.includes('api key') || message.includes('model') || message.includes('provider')) return 'model_unavailable';\n if (message.includes('directory') || message.includes('folder') || message.includes('enoent')) return 'folder_unavailable';\n if (message.includes('permission') || message.includes('eacces')) return 'folder_not_readable';\n if (message.includes('json') || message.includes('analysis result')) return 'analysis_invalid';\n if (message.includes('timeout')) return 'analysis_timeout';\n return 'internal_error';\n}\n\nexport class WorkDiscoveryService {\n private readonly abortControllers = new Map<string, AbortController>();\n private readonly activity = new ActivityService();\n\n constructor(private readonly options: WorkDiscoveryServiceOptions) {}\n\n isEnabled(): boolean {\n return this.options.getConfig().experimental?.workDiscoveryOnboarding === true;\n }\n\n getOnboardingState(): WorkDiscoveryOnboardingState {\n return getWorkDiscoveryOnboardingState();\n }\n\n dismissOnboarding(): WorkDiscoveryOnboardingState {\n return setWorkDiscoveryOnboardingState({ status: 'dismissed', activeRunId: null });\n }\n\n getRun(id: string): WorkDiscoveryRun | null {\n return getWorkDiscoveryRun(id);\n }\n\n async startRun(input: {\n rootPath: string;\n source: WorkDiscoverySource;\n idempotencyKey: string;\n }): Promise<WorkDiscoveryRun> {\n const existing = getWorkDiscoveryRunByIdempotencyKey(input.idempotencyKey);\n if (existing) return existing;\n const config = this.options.getConfig();\n const modelRef = getAgentDefaultModelRef(config);\n if (!modelRef) throw new Error('No default model configured');\n\n const preview = await previewWorkDiscoveryRoot(input.rootPath);\n const rootPath = preview.canonicalRootPath;\n const agentId = getDefaultAgentId(config);\n const match = this.options.projects.resolveOrCreateForWorkspacePath({\n workspacePath: rootPath,\n defaultAgentId: agentId,\n autoCreate: true,\n });\n if (!match) throw new Error('Selected folder cannot be used as a project workspace');\n const projectAgentId = match.project.defaultAgentId || agentId;\n const peerId = `work-discovery-${randomUUID()}`;\n const sessionKey = buildSessionKey({\n agentId: projectAgentId,\n source: 'webchat',\n accountId: 'default',\n peerKind: 'direct',\n peerId,\n });\n await this.options.sessions.saveMessages(sessionKey, [], {\n metadata: sessionMetadata(projectAgentId, peerId),\n });\n this.options.projects.attachSession(sessionKey, match.project.id);\n const now = Date.now();\n const run = createWorkDiscoveryRun({\n id: randomUUID(),\n idempotencyKey: input.idempotencyKey,\n source: input.source,\n status: 'queued',\n rootPath,\n projectId: match.project.id,\n sessionKey,\n agentId: projectAgentId,\n modelRef,\n scanPolicyVersion: WORK_DISCOVERY_SCAN_POLICY_VERSION,\n createdAt: now,\n });\n await this.options.sessions.appendTranscriptContextEntry(sessionKey, {\n text: 'Work discovery was explicitly requested for the selected folder.',\n data: {\n type: 'work_discovery',\n runId: run.id,\n rootPath,\n scanPolicyVersion: WORK_DISCOVERY_SCAN_POLICY_VERSION,\n source: input.source,\n },\n });\n if (input.source === 'onboarding_selected_directory') {\n setWorkDiscoveryOnboardingState({ status: 'in_progress', activeRunId: run.id });\n }\n this.activity.record({\n type: 'work_discovery.started',\n primaryObject: { kind: 'project', id: match.project.id, title: match.project.name },\n actor: { kind: 'system' },\n initiator: { kind: 'user', sessionKey },\n source: { kind: 'gateway_api', runId: run.id },\n visibility: 'audit',\n payload: { policyVersion: WORK_DISCOVERY_SCAN_POLICY_VERSION, source: input.source },\n scopes: [\n { scopeKind: 'project', scopeId: match.project.id, reason: 'object_owner' },\n { scopeKind: 'session', scopeId: sessionKey, reason: 'runtime_context' },\n ],\n });\n const controller = new AbortController();\n this.abortControllers.set(run.id, controller);\n void this.execute(run, controller.signal);\n return run;\n }\n\n private publish(run: WorkDiscoveryRun): void {\n const suffix = run.status === 'completed'\n ? 'completed'\n : run.status === 'failed'\n ? 'failed'\n : run.status === 'canceled'\n ? 'canceled'\n : 'progress';\n this.options.emit(`work-discovery.${suffix}`, {\n runId: run.id,\n projectId: run.projectId,\n sessionKey: run.sessionKey,\n status: run.status,\n stage: run.stage,\n ...(run.status === 'completed' ? { result: run.result } : {}),\n });\n }\n\n private async execute(run: WorkDiscoveryRun, signal: AbortSignal): Promise<void> {\n const startedAt = Date.now();\n try {\n let current = updateWorkDiscoveryRun(run.id, {\n status: 'probing',\n stage: 'folder_structure',\n startedAt,\n })!;\n this.publish(current);\n const snapshot = await probeWorkDiscoveryRoot(run.rootPath, signal);\n if (signal.aborted) throw new DOMException('Work discovery canceled', 'AbortError');\n current = updateWorkDiscoveryRun(run.id, {\n status: 'analyzing',\n stage: 'recent_progress',\n snapshot: summarizeWorkContextSnapshot(snapshot),\n })!;\n this.publish(current);\n const analysis = await analyzeWorkContext({ config: this.options.getConfig(), snapshot, signal });\n current = updateWorkDiscoveryRun(run.id, { status: 'analyzing', stage: 'next_steps' })!;\n this.publish(current);\n await this.options.sessions.appendTranscriptCustomMessageEntry(run.sessionKey, {\n customType: 'work-discovery-result',\n content: workDiscoveryResultMarkdown(analysis.result),\n display: true,\n details: { runId: run.id, result: analysis.result },\n });\n const project = this.options.projects.get(run.projectId);\n await this.options.sessions.updateSessionMetadata(run.sessionKey, {\n name: project ? `Continue work on ${project.name}` : 'Continue recent work',\n hiddenFromSessionList: false,\n });\n current = updateWorkDiscoveryRun(run.id, {\n status: 'completed',\n stage: 'next_steps',\n result: analysis.result,\n completedAt: Date.now(),\n })!;\n if (run.source === 'onboarding_selected_directory') {\n setWorkDiscoveryOnboardingState({ status: 'completed', activeRunId: run.id });\n }\n this.activity.record({\n type: 'work_discovery.completed',\n primaryObject: { kind: 'project', id: run.projectId, title: project?.name },\n actor: { kind: 'agent', agentId: run.agentId, sessionKey: run.sessionKey },\n initiator: { kind: 'user', sessionKey: run.sessionKey },\n source: { kind: 'system', runId: run.id },\n payload: {\n policyVersion: run.scanPolicyVersion,\n suggestionCount: analysis.result.suggestions.length,\n lowConfidence: analysis.result.lowConfidence === true,\n },\n scopes: [\n { scopeKind: 'project', scopeId: run.projectId, reason: 'object_owner' },\n { scopeKind: 'session', scopeId: run.sessionKey, reason: 'runtime_context' },\n ],\n });\n this.publish(current);\n this.options.emit('session.transcript_updated', { key: run.sessionKey });\n log.info({ runId: run.id, projectId: run.projectId, sessionKey: run.sessionKey, durationMs: Date.now() - startedAt }, 'Work discovery completed');\n } catch (error) {\n const canceled = signal.aborted || (error instanceof DOMException && error.name === 'AbortError');\n const code = canceled ? 'canceled' : errorCode(error);\n const message = canceled ? 'Analysis canceled' : error instanceof Error ? error.message : String(error);\n const current = updateWorkDiscoveryRun(run.id, {\n status: canceled ? 'canceled' : 'failed',\n errorCode: code,\n errorMessage: message,\n ...(canceled ? { canceledAt: Date.now() } : { completedAt: Date.now() }),\n });\n if (current) this.publish(current);\n this.activity.record({\n type: canceled ? 'work_discovery.canceled' : 'work_discovery.failed',\n primaryObject: { kind: 'project', id: run.projectId },\n actor: { kind: 'system' },\n initiator: { kind: 'user', sessionKey: run.sessionKey },\n source: { kind: 'system', runId: run.id },\n visibility: 'audit',\n payload: { errorCode: code },\n scopes: [\n { scopeKind: 'project', scopeId: run.projectId, reason: 'object_owner' },\n { scopeKind: 'session', scopeId: run.sessionKey, reason: 'runtime_context' },\n ],\n });\n log.warn({ err: error, runId: run.id, projectId: run.projectId, phase: 'analysis', errorCode: code }, `Work discovery failed: ${message}`);\n } finally {\n this.abortControllers.delete(run.id);\n }\n }\n\n cancelRun(id: string): WorkDiscoveryRun | null {\n const run = getWorkDiscoveryRun(id);\n if (!run) return null;\n if (run.status === 'completed' || run.status === 'failed' || run.status === 'canceled') return run;\n this.abortControllers.get(id)?.abort();\n return updateWorkDiscoveryRun(id, {\n status: 'canceled',\n errorCode: 'canceled',\n errorMessage: 'Analysis canceled',\n canceledAt: Date.now(),\n });\n }\n\n retryRun(id: string): WorkDiscoveryRun | null {\n const run = getWorkDiscoveryRun(id);\n if (!run) return null;\n if (run.status !== 'failed' && run.status !== 'canceled') return run;\n const queued = updateWorkDiscoveryRun(id, {\n status: 'queued',\n stage: 'folder_structure',\n errorCode: undefined,\n errorMessage: undefined,\n completedAt: undefined,\n canceledAt: undefined,\n });\n if (!queued) return null;\n const controller = new AbortController();\n this.abortControllers.set(id, controller);\n if (run.source === 'onboarding_selected_directory') {\n setWorkDiscoveryOnboardingState({ status: 'in_progress', activeRunId: id });\n }\n this.publish(queued);\n void this.execute(queued, controller.signal);\n return queued;\n }\n\n selectSuggestion(runId: string, suggestionId: string): WorkDiscoveryRun | null {\n const run = getWorkDiscoveryRun(runId);\n const suggestion = run?.result?.suggestions.find((item) => item.id === suggestionId);\n if (!run || !suggestion) return null;\n this.activity.record({\n type: 'work_discovery.suggestion_selected',\n primaryObject: { kind: 'project', id: run.projectId },\n actor: { kind: 'user', sessionKey: run.sessionKey },\n source: { kind: 'gateway_api', runId },\n payload: { suggestionId, title: suggestion.title },\n scopes: [\n { scopeKind: 'project', scopeId: run.projectId, reason: 'object_owner' },\n { scopeKind: 'session', scopeId: run.sessionKey, reason: 'runtime_context' },\n ],\n });\n return run;\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
export type WorkDiscoveryOnboardingStatus = 'not_started' | 'in_progress' | 'completed' | 'dismissed';
|
|
2
|
+
export interface WorkDiscoveryOnboardingState {
|
|
3
|
+
status: WorkDiscoveryOnboardingStatus;
|
|
4
|
+
activeRunId?: string;
|
|
5
|
+
completedAt?: number;
|
|
6
|
+
dismissedAt?: number;
|
|
7
|
+
updatedAt: number;
|
|
8
|
+
}
|
|
9
|
+
export type WorkDiscoveryRunStatus = 'queued' | 'probing' | 'analyzing' | 'completed' | 'failed' | 'canceled';
|
|
10
|
+
export type WorkDiscoveryStage = 'folder_structure' | 'recent_progress' | 'next_steps';
|
|
11
|
+
export type WorkDiscoverySource = 'onboarding_selected_directory' | 'manual_selected_directory';
|
|
12
|
+
export type WorkDiscoveryErrorCode = 'folder_unavailable' | 'folder_not_readable' | 'nothing_useful_found' | 'model_unavailable' | 'analysis_invalid' | 'analysis_timeout' | 'canceled' | 'internal_error';
|
|
13
|
+
export interface WorkDiscoveryEvidence {
|
|
14
|
+
path?: string;
|
|
15
|
+
observation: string;
|
|
16
|
+
}
|
|
17
|
+
export interface WorkDiscoverySuggestion {
|
|
18
|
+
id: string;
|
|
19
|
+
title: string;
|
|
20
|
+
rationale: string;
|
|
21
|
+
evidence: WorkDiscoveryEvidence[];
|
|
22
|
+
actionPrompt: string;
|
|
23
|
+
confidence: 'high' | 'medium' | 'low';
|
|
24
|
+
}
|
|
25
|
+
export interface WorkDiscoveryResult {
|
|
26
|
+
projectSummary: string;
|
|
27
|
+
currentState: string;
|
|
28
|
+
uncertainties: string[];
|
|
29
|
+
suggestions: WorkDiscoverySuggestion[];
|
|
30
|
+
lowConfidence?: boolean;
|
|
31
|
+
contextQuestion?: string;
|
|
32
|
+
}
|
|
33
|
+
export interface WorkContextDocument {
|
|
34
|
+
relativePath: string;
|
|
35
|
+
modifiedAt?: number;
|
|
36
|
+
excerpt: string;
|
|
37
|
+
truncated: boolean;
|
|
38
|
+
selectionReason: string;
|
|
39
|
+
}
|
|
40
|
+
export interface WorkContextMetadataFile {
|
|
41
|
+
relativePath: string;
|
|
42
|
+
modifiedAt?: number;
|
|
43
|
+
size: number;
|
|
44
|
+
kind: 'document' | 'pdf' | 'image';
|
|
45
|
+
}
|
|
46
|
+
export interface WorkContextSnapshot {
|
|
47
|
+
root: {
|
|
48
|
+
displayName: string;
|
|
49
|
+
projectKind: 'coding' | 'general' | 'unknown';
|
|
50
|
+
markerReasons: string[];
|
|
51
|
+
};
|
|
52
|
+
structure: {
|
|
53
|
+
sampledPaths: string[];
|
|
54
|
+
metadataOnlyFiles: WorkContextMetadataFile[];
|
|
55
|
+
omittedPathCount: number;
|
|
56
|
+
};
|
|
57
|
+
git?: {
|
|
58
|
+
branch?: string;
|
|
59
|
+
changedPaths: string[];
|
|
60
|
+
recentCommits: Array<{
|
|
61
|
+
subject: string;
|
|
62
|
+
committedAt?: number;
|
|
63
|
+
}>;
|
|
64
|
+
};
|
|
65
|
+
documents: WorkContextDocument[];
|
|
66
|
+
limits: {
|
|
67
|
+
policyVersion: number;
|
|
68
|
+
fileCount: number;
|
|
69
|
+
contentBytes: number;
|
|
70
|
+
truncated: boolean;
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
export interface WorkContextSnapshotSummary {
|
|
74
|
+
projectKind: 'coding' | 'general' | 'unknown';
|
|
75
|
+
sampledPathCount: number;
|
|
76
|
+
omittedPathCount: number;
|
|
77
|
+
documentCount: number;
|
|
78
|
+
contentBytes: number;
|
|
79
|
+
changedPathCount: number;
|
|
80
|
+
truncated: boolean;
|
|
81
|
+
}
|
|
82
|
+
export interface WorkDiscoveryRun {
|
|
83
|
+
id: string;
|
|
84
|
+
idempotencyKey: string;
|
|
85
|
+
source: WorkDiscoverySource;
|
|
86
|
+
status: WorkDiscoveryRunStatus;
|
|
87
|
+
stage?: WorkDiscoveryStage;
|
|
88
|
+
rootPath: string;
|
|
89
|
+
projectId: string;
|
|
90
|
+
sessionKey: string;
|
|
91
|
+
agentId: string;
|
|
92
|
+
modelRef: string;
|
|
93
|
+
scanPolicyVersion: number;
|
|
94
|
+
snapshot?: WorkContextSnapshotSummary;
|
|
95
|
+
result?: WorkDiscoveryResult;
|
|
96
|
+
errorCode?: WorkDiscoveryErrorCode;
|
|
97
|
+
errorMessage?: string;
|
|
98
|
+
createdAt: number;
|
|
99
|
+
startedAt?: number;
|
|
100
|
+
completedAt?: number;
|
|
101
|
+
canceledAt?: number;
|
|
102
|
+
}
|
|
103
|
+
export interface WorkDiscoveryPreview {
|
|
104
|
+
canonicalRootPath: string;
|
|
105
|
+
displayName: string;
|
|
106
|
+
exists: boolean;
|
|
107
|
+
readable: boolean;
|
|
108
|
+
projectKind: 'coding' | 'general' | 'unknown';
|
|
109
|
+
projectKindConfidence: number;
|
|
110
|
+
markerReasons: string[];
|
|
111
|
+
provider: string;
|
|
112
|
+
remoteModel: boolean;
|
|
113
|
+
policyVersion: number;
|
|
114
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -165,7 +165,7 @@ var WorkflowSessionBridge = class {
|
|
|
165
165
|
id: `workflow-run:${view.run.id}`,
|
|
166
166
|
providerId: "workflow-run",
|
|
167
167
|
kind: "task_lesson",
|
|
168
|
-
agentId,
|
|
168
|
+
sourceAgentId: agentId,
|
|
169
169
|
workspaceId: this.gateway.currentWorkspacePath,
|
|
170
170
|
sessionKey,
|
|
171
171
|
projectId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-session-bridge.js","names":[],"sources":["../../../../src/workflows/service/workflow-session-bridge.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport type { GatewayWorkflowHost } from '../../gateway/gateway-workflow-host.types.js';\nimport { renderWorkflowText } from '../../agent/workflow/snapshot.js';\nimport type { SessionStore } from '../../session/store.js';\nimport { SessionStatus } from '../../session/types.js';\nimport { upsertMemoryRecord } from '../../storage/sqlite/index.js';\nimport type { WorkflowRunView } from '../domain/index.js';\nimport { isTerminalWorkflowRunStatus } from '../domain/index.js';\nimport { GoalWorkflowJudge } from '../../goals/index.js';\nimport { WorkItemWorkflowJudge } from '../../work-items/index.js';\n\nimport { runViewToSnapshot } from './run-view-to-snapshot.js';\nimport { buildWorkflowRunSessionKey } from './workflow-session-key.js';\n\nexport const WORKFLOW_SESSION_TYPE = 'workflow-run';\nexport const WORKFLOW_RUN_LINK_CONTEXT_KIND = 'workflow-run-link';\n\nexport interface PrepareWorkflowRunSessionParams {\n runId: string;\n agentId: string;\n definitionId: string;\n definitionTitle: string;\n goal: string;\n parentSessionKey?: string;\n projectId?: string;\n}\n\nexport interface PrepareWorkflowRunSessionResult {\n sessionKey: string;\n}\n\nexport class WorkflowSessionBridge {\n private readonly terminalPersistedRunIds = new Set<string>();\n\n constructor(private readonly gateway: GatewayWorkflowHost) {}\n\n async prepareRunSession(params: PrepareWorkflowRunSessionParams): Promise<PrepareWorkflowRunSessionResult> {\n const sessionKey = buildWorkflowRunSessionKey(params.agentId, params.runId);\n const goalText = formatWorkflowGoalUserMessage(params.definitionId, params.goal);\n const sessionName = truncateSessionName(params.goal.trim() || params.definitionTitle || params.definitionId);\n\n const store = this.gateway.sessionIndexInstance.getStore();\n const projectId =\n params.projectId?.trim() ||\n (params.parentSessionKey?.trim()\n ? (await store.getMetadata(params.parentSessionKey.trim()))?.projectId\n : undefined);\n await store.resolveTranscriptPath(sessionKey, {\n metadata: {\n sessionType: WORKFLOW_SESSION_TYPE,\n projectId,\n hiddenFromSessionList: true,\n sourceChannel: 'workflow',\n sourceChatId: params.runId,\n routing: {\n agentId: params.agentId,\n source: 'workflow',\n accountId: 'default',\n peerKind: 'run',\n peerId: params.runId,\n },\n },\n });\n await store.updateMetadata(sessionKey, {\n sessionType: WORKFLOW_SESSION_TYPE,\n hiddenFromSessionList: true,\n workflowRunId: params.runId,\n workflowDefinitionId: params.definitionId,\n projectId,\n name: sessionName,\n tags: ['workflow', params.definitionId],\n customData: {\n workflowRunId: params.runId,\n workflowDefinitionId: params.definitionId,\n workflowGoal: params.goal,\n ...(params.parentSessionKey ? { parentSessionKey: params.parentSessionKey } : {}),\n },\n });\n\n await store.appendTranscriptMessage(sessionKey, {\n role: 'user',\n content: [{ type: 'text', text: goalText }],\n timestamp: Date.now(),\n });\n\n if (params.parentSessionKey?.trim()) {\n await this.writeParentRunLink({\n parentSessionKey: params.parentSessionKey.trim(),\n runId: params.runId,\n ownerAgentId: params.agentId,\n workflowSessionKey: sessionKey,\n definitionId: params.definitionId,\n goal: params.goal,\n status: 'running',\n });\n }\n\n this.gateway.emit('session.updated', { key: sessionKey, name: sessionName });\n return { sessionKey };\n }\n\n async handleRunViewUpdated(view: WorkflowRunView): Promise<void> {\n const runId = view.run.id;\n const sessionKey = view.run.metadata?.sessionKey?.trim();\n if (!sessionKey || !isTerminalWorkflowRunStatus(view.run.status)) {\n return;\n }\n if (this.terminalPersistedRunIds.has(runId)) {\n return;\n }\n this.terminalPersistedRunIds.add(runId);\n\n await this.persistTerminalTranscript(sessionKey, view);\n\n const parentSessionKey = readParentSessionKey(view);\n if (parentSessionKey) {\n await this.writeParentRunLink({\n parentSessionKey,\n runId,\n ownerAgentId: view.run.metadata?.agentId ?? '',\n workflowSessionKey: sessionKey,\n definitionId: view.run.definitionId,\n goal: view.run.goal,\n status: view.run.status,\n });\n }\n new WorkItemWorkflowJudge().handleTerminalWorkflowRun({ view });\n this.recordProjectWorkflowMemory(sessionKey, view);\n await new GoalWorkflowJudge().handleTerminalWorkflowRun({\n config: this.gateway.currentConfig,\n view,\n sessionKey,\n });\n }\n\n private async persistTerminalTranscript(sessionKey: string, view: WorkflowRunView): Promise<void> {\n const store = this.gateway.sessionIndexInstance.getStore();\n const snapshot = runViewToSnapshot(view);\n const toolCallId = randomUUID();\n const completed = view.run.status === 'succeeded';\n const resultText = renderWorkflowText(snapshot, completed, { showResultPreviews: true });\n const envelope = {\n content: [{ type: 'text', text: resultText }],\n details: snapshot,\n };\n const isError = view.run.status === 'failed' || view.run.status === 'timeout';\n\n await store.appendTranscriptMessage(sessionKey, {\n role: 'assistant',\n content: [\n {\n type: 'toolCall',\n id: toolCallId,\n name: 'workflow',\n arguments: { name: view.run.definitionId },\n },\n ],\n timestamp: Date.now(),\n } as unknown as Parameters<SessionStore['appendTranscriptMessage']>[1]);\n\n await store.appendTranscriptMessage(sessionKey, {\n role: 'toolResult',\n toolCallId,\n content: [{ type: 'text', text: JSON.stringify(envelope) }],\n details: snapshot,\n isError,\n timestamp: Date.now(),\n } as unknown as Parameters<SessionStore['appendTranscriptMessage']>[1]);\n\n await store.updateMetadata(sessionKey, {\n status: SessionStatus.ACTIVE,\n });\n }\n\n private async writeParentRunLink(params: {\n parentSessionKey: string;\n runId: string;\n ownerAgentId?: string;\n workflowSessionKey: string;\n definitionId: string;\n goal: string;\n status: WorkflowRunView['run']['status'];\n }): Promise<void> {\n const store = this.gateway.sessionIndexInstance.getStore();\n const text = formatParentRunLinkText(params);\n await store.appendTranscriptContextEntry(params.parentSessionKey, {\n kind: 'context',\n id: `workflow-run-link:${params.runId}`,\n text,\n data: {\n kind: WORKFLOW_RUN_LINK_CONTEXT_KIND,\n runId: params.runId,\n ...(params.ownerAgentId ? { ownerAgentId: params.ownerAgentId } : {}),\n workflowSessionKey: params.workflowSessionKey,\n definitionId: params.definitionId,\n goal: params.goal,\n status: params.status,\n },\n createdAt: new Date().toISOString(),\n });\n }\n\n private recordProjectWorkflowMemory(sessionKey: string, view: WorkflowRunView): void {\n const projectId = view.run.metadata?.projectId?.trim();\n const agentId = view.run.metadata?.agentId?.trim();\n if (!projectId || !agentId) return;\n\n const summary = view.run.result?.summary?.trim();\n const resultText = summary || renderWorkflowText(\n runViewToSnapshot(view),\n view.run.status === 'succeeded',\n { showResultPreviews: true },\n );\n upsertMemoryRecord({\n id: `workflow-run:${view.run.id}`,\n providerId: 'workflow-run',\n kind: 'task_lesson',\n agentId,\n workspaceId: this.gateway.currentWorkspacePath,\n sessionKey,\n projectId,\n content: [\n `Workflow ${view.run.definitionId} finished with status ${view.run.status}.`,\n view.run.goal ? `Goal: ${view.run.goal}` : undefined,\n compactMemoryLine(resultText),\n ].filter((line): line is string => Boolean(line)).join('\\n'),\n source: { provider: 'workflow-run' },\n confidence: view.run.status === 'succeeded' ? 0.7 : 0.82,\n tags: ['project', 'workflow', view.run.definitionId, view.run.status],\n status: view.run.status === 'succeeded' ? 'active' : 'needs_review',\n sensitivity: 'normal',\n evidence: [{\n sessionKey,\n sourceText: `workflow:${view.run.id}`,\n }],\n });\n }\n}\n\nfunction compactMemoryLine(text: string): string {\n const compact = text.trim().replace(/\\s+/g, ' ');\n if (compact.length <= 1200) return compact;\n return `${compact.slice(0, 1197)}...`;\n}\n\nfunction formatWorkflowGoalUserMessage(definitionId: string, goal: string): string {\n const trimmedGoal = goal.trim();\n if (trimmedGoal) {\n return `Run workflow \\`${definitionId}\\`:\\n\\n${trimmedGoal}`;\n }\n return `Run workflow \\`${definitionId}\\``;\n}\n\nfunction truncateSessionName(name: string): string {\n const trimmed = name.trim();\n if (trimmed.length <= 80) return trimmed;\n return `${trimmed.slice(0, 77)}…`;\n}\n\nfunction readParentSessionKey(view: WorkflowRunView): string | null {\n if (view.run.source.kind === 'chat') {\n const originKey = view.run.source.sessionKey?.trim();\n if (originKey) return originKey;\n }\n const customParent = view.run.metadata?.origin?.sessionKey?.trim();\n if (customParent && view.run.metadata?.triggerSource === 'chat') {\n return customParent;\n }\n return null;\n}\n\nexport function formatParentRunLinkText(params: {\n definitionId: string;\n goal: string;\n status: WorkflowRunView['run']['status'];\n}): string {\n const label = params.goal.trim() || params.definitionId;\n if (params.status === 'running' || params.status === 'queued') {\n return `Workflow \\`${params.definitionId}\\` is running: ${label}`;\n }\n if (params.status === 'succeeded') {\n return `Workflow \\`${params.definitionId}\\` completed: ${label}`;\n }\n return `Workflow \\`${params.definitionId}\\` finished (${params.status}): ${label}`;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"workflow-session-bridge.js","names":[],"sources":["../../../../src/workflows/service/workflow-session-bridge.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport type { GatewayWorkflowHost } from '../../gateway/gateway-workflow-host.types.js';\nimport { renderWorkflowText } from '../../agent/workflow/snapshot.js';\nimport type { SessionStore } from '../../session/store.js';\nimport { SessionStatus } from '../../session/types.js';\nimport { upsertMemoryRecord } from '../../storage/sqlite/index.js';\nimport type { WorkflowRunView } from '../domain/index.js';\nimport { isTerminalWorkflowRunStatus } from '../domain/index.js';\nimport { GoalWorkflowJudge } from '../../goals/index.js';\nimport { WorkItemWorkflowJudge } from '../../work-items/index.js';\n\nimport { runViewToSnapshot } from './run-view-to-snapshot.js';\nimport { buildWorkflowRunSessionKey } from './workflow-session-key.js';\n\nexport const WORKFLOW_SESSION_TYPE = 'workflow-run';\nexport const WORKFLOW_RUN_LINK_CONTEXT_KIND = 'workflow-run-link';\n\nexport interface PrepareWorkflowRunSessionParams {\n runId: string;\n agentId: string;\n definitionId: string;\n definitionTitle: string;\n goal: string;\n parentSessionKey?: string;\n projectId?: string;\n}\n\nexport interface PrepareWorkflowRunSessionResult {\n sessionKey: string;\n}\n\nexport class WorkflowSessionBridge {\n private readonly terminalPersistedRunIds = new Set<string>();\n\n constructor(private readonly gateway: GatewayWorkflowHost) {}\n\n async prepareRunSession(params: PrepareWorkflowRunSessionParams): Promise<PrepareWorkflowRunSessionResult> {\n const sessionKey = buildWorkflowRunSessionKey(params.agentId, params.runId);\n const goalText = formatWorkflowGoalUserMessage(params.definitionId, params.goal);\n const sessionName = truncateSessionName(params.goal.trim() || params.definitionTitle || params.definitionId);\n\n const store = this.gateway.sessionIndexInstance.getStore();\n const projectId =\n params.projectId?.trim() ||\n (params.parentSessionKey?.trim()\n ? (await store.getMetadata(params.parentSessionKey.trim()))?.projectId\n : undefined);\n await store.resolveTranscriptPath(sessionKey, {\n metadata: {\n sessionType: WORKFLOW_SESSION_TYPE,\n projectId,\n hiddenFromSessionList: true,\n sourceChannel: 'workflow',\n sourceChatId: params.runId,\n routing: {\n agentId: params.agentId,\n source: 'workflow',\n accountId: 'default',\n peerKind: 'run',\n peerId: params.runId,\n },\n },\n });\n await store.updateMetadata(sessionKey, {\n sessionType: WORKFLOW_SESSION_TYPE,\n hiddenFromSessionList: true,\n workflowRunId: params.runId,\n workflowDefinitionId: params.definitionId,\n projectId,\n name: sessionName,\n tags: ['workflow', params.definitionId],\n customData: {\n workflowRunId: params.runId,\n workflowDefinitionId: params.definitionId,\n workflowGoal: params.goal,\n ...(params.parentSessionKey ? { parentSessionKey: params.parentSessionKey } : {}),\n },\n });\n\n await store.appendTranscriptMessage(sessionKey, {\n role: 'user',\n content: [{ type: 'text', text: goalText }],\n timestamp: Date.now(),\n });\n\n if (params.parentSessionKey?.trim()) {\n await this.writeParentRunLink({\n parentSessionKey: params.parentSessionKey.trim(),\n runId: params.runId,\n ownerAgentId: params.agentId,\n workflowSessionKey: sessionKey,\n definitionId: params.definitionId,\n goal: params.goal,\n status: 'running',\n });\n }\n\n this.gateway.emit('session.updated', { key: sessionKey, name: sessionName });\n return { sessionKey };\n }\n\n async handleRunViewUpdated(view: WorkflowRunView): Promise<void> {\n const runId = view.run.id;\n const sessionKey = view.run.metadata?.sessionKey?.trim();\n if (!sessionKey || !isTerminalWorkflowRunStatus(view.run.status)) {\n return;\n }\n if (this.terminalPersistedRunIds.has(runId)) {\n return;\n }\n this.terminalPersistedRunIds.add(runId);\n\n await this.persistTerminalTranscript(sessionKey, view);\n\n const parentSessionKey = readParentSessionKey(view);\n if (parentSessionKey) {\n await this.writeParentRunLink({\n parentSessionKey,\n runId,\n ownerAgentId: view.run.metadata?.agentId ?? '',\n workflowSessionKey: sessionKey,\n definitionId: view.run.definitionId,\n goal: view.run.goal,\n status: view.run.status,\n });\n }\n new WorkItemWorkflowJudge().handleTerminalWorkflowRun({ view });\n this.recordProjectWorkflowMemory(sessionKey, view);\n await new GoalWorkflowJudge().handleTerminalWorkflowRun({\n config: this.gateway.currentConfig,\n view,\n sessionKey,\n });\n }\n\n private async persistTerminalTranscript(sessionKey: string, view: WorkflowRunView): Promise<void> {\n const store = this.gateway.sessionIndexInstance.getStore();\n const snapshot = runViewToSnapshot(view);\n const toolCallId = randomUUID();\n const completed = view.run.status === 'succeeded';\n const resultText = renderWorkflowText(snapshot, completed, { showResultPreviews: true });\n const envelope = {\n content: [{ type: 'text', text: resultText }],\n details: snapshot,\n };\n const isError = view.run.status === 'failed' || view.run.status === 'timeout';\n\n await store.appendTranscriptMessage(sessionKey, {\n role: 'assistant',\n content: [\n {\n type: 'toolCall',\n id: toolCallId,\n name: 'workflow',\n arguments: { name: view.run.definitionId },\n },\n ],\n timestamp: Date.now(),\n } as unknown as Parameters<SessionStore['appendTranscriptMessage']>[1]);\n\n await store.appendTranscriptMessage(sessionKey, {\n role: 'toolResult',\n toolCallId,\n content: [{ type: 'text', text: JSON.stringify(envelope) }],\n details: snapshot,\n isError,\n timestamp: Date.now(),\n } as unknown as Parameters<SessionStore['appendTranscriptMessage']>[1]);\n\n await store.updateMetadata(sessionKey, {\n status: SessionStatus.ACTIVE,\n });\n }\n\n private async writeParentRunLink(params: {\n parentSessionKey: string;\n runId: string;\n ownerAgentId?: string;\n workflowSessionKey: string;\n definitionId: string;\n goal: string;\n status: WorkflowRunView['run']['status'];\n }): Promise<void> {\n const store = this.gateway.sessionIndexInstance.getStore();\n const text = formatParentRunLinkText(params);\n await store.appendTranscriptContextEntry(params.parentSessionKey, {\n kind: 'context',\n id: `workflow-run-link:${params.runId}`,\n text,\n data: {\n kind: WORKFLOW_RUN_LINK_CONTEXT_KIND,\n runId: params.runId,\n ...(params.ownerAgentId ? { ownerAgentId: params.ownerAgentId } : {}),\n workflowSessionKey: params.workflowSessionKey,\n definitionId: params.definitionId,\n goal: params.goal,\n status: params.status,\n },\n createdAt: new Date().toISOString(),\n });\n }\n\n private recordProjectWorkflowMemory(sessionKey: string, view: WorkflowRunView): void {\n const projectId = view.run.metadata?.projectId?.trim();\n const agentId = view.run.metadata?.agentId?.trim();\n if (!projectId || !agentId) return;\n\n const summary = view.run.result?.summary?.trim();\n const resultText = summary || renderWorkflowText(\n runViewToSnapshot(view),\n view.run.status === 'succeeded',\n { showResultPreviews: true },\n );\n upsertMemoryRecord({\n id: `workflow-run:${view.run.id}`,\n providerId: 'workflow-run',\n kind: 'task_lesson',\n sourceAgentId: agentId,\n workspaceId: this.gateway.currentWorkspacePath,\n sessionKey,\n projectId,\n content: [\n `Workflow ${view.run.definitionId} finished with status ${view.run.status}.`,\n view.run.goal ? `Goal: ${view.run.goal}` : undefined,\n compactMemoryLine(resultText),\n ].filter((line): line is string => Boolean(line)).join('\\n'),\n source: { provider: 'workflow-run' },\n confidence: view.run.status === 'succeeded' ? 0.7 : 0.82,\n tags: ['project', 'workflow', view.run.definitionId, view.run.status],\n status: view.run.status === 'succeeded' ? 'active' : 'needs_review',\n sensitivity: 'normal',\n evidence: [{\n sessionKey,\n sourceText: `workflow:${view.run.id}`,\n }],\n });\n }\n}\n\nfunction compactMemoryLine(text: string): string {\n const compact = text.trim().replace(/\\s+/g, ' ');\n if (compact.length <= 1200) return compact;\n return `${compact.slice(0, 1197)}...`;\n}\n\nfunction formatWorkflowGoalUserMessage(definitionId: string, goal: string): string {\n const trimmedGoal = goal.trim();\n if (trimmedGoal) {\n return `Run workflow \\`${definitionId}\\`:\\n\\n${trimmedGoal}`;\n }\n return `Run workflow \\`${definitionId}\\``;\n}\n\nfunction truncateSessionName(name: string): string {\n const trimmed = name.trim();\n if (trimmed.length <= 80) return trimmed;\n return `${trimmed.slice(0, 77)}…`;\n}\n\nfunction readParentSessionKey(view: WorkflowRunView): string | null {\n if (view.run.source.kind === 'chat') {\n const originKey = view.run.source.sessionKey?.trim();\n if (originKey) return originKey;\n }\n const customParent = view.run.metadata?.origin?.sessionKey?.trim();\n if (customParent && view.run.metadata?.triggerSource === 'chat') {\n return customParent;\n }\n return null;\n}\n\nexport function formatParentRunLinkText(params: {\n definitionId: string;\n goal: string;\n status: WorkflowRunView['run']['status'];\n}): string {\n const label = params.goal.trim() || params.definitionId;\n if (params.status === 'running' || params.status === 'queued') {\n return `Workflow \\`${params.definitionId}\\` is running: ${label}`;\n }\n if (params.status === 'succeeded') {\n return `Workflow \\`${params.definitionId}\\` completed: ${label}`;\n }\n return `Workflow \\`${params.definitionId}\\` finished (${params.status}): ${label}`;\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xopcai/xopc",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.147",
|
|
4
4
|
"description": "Local-first AI system that remembers context, coordinates AI, and sustains long-term progress.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/src/index.js",
|
|
@@ -98,6 +98,7 @@
|
|
|
98
98
|
"jsdom": "^29.1.1",
|
|
99
99
|
"markdown-it": "^14.2.0",
|
|
100
100
|
"node-edge-tts": "^1.2.10",
|
|
101
|
+
"onnxruntime-common": "1.21.0",
|
|
101
102
|
"openai": "^6.39.1",
|
|
102
103
|
"pino": "^10.3.1",
|
|
103
104
|
"pino-pretty": "^13.1.3",
|
|
@@ -199,13 +200,14 @@
|
|
|
199
200
|
"build:extensions-ui": "node scripts/build-extensions-ui.mjs",
|
|
200
201
|
"pack:browser-ext": "pnpm -C packages/browser-ext run pack",
|
|
201
202
|
"sync:browser-ext-version": "node scripts/sync-browser-ext-version.mjs",
|
|
202
|
-
"electron:
|
|
203
|
+
"electron:native:build": "node scripts/build-voice-hotkey-helper.mjs",
|
|
204
|
+
"electron:dev": "pnpm run electron:native:build && cross-env ELECTRON_ENTRY=out/main/index.js electron-vite dev",
|
|
203
205
|
"electron:vite:build": "cross-env ELECTRON_ENTRY=out/main/index.js electron-vite build",
|
|
204
206
|
"electron:vite:build:package": "cross-env ELECTRON_ENTRY=out/main/index.js ELECTRON_VITE_SKIP_RENDERER=1 electron-vite build",
|
|
205
207
|
"electron:package": "pnpm run assets:brand && node scripts/electron-builder.mjs",
|
|
206
208
|
"electron:server:build": "node scripts/build-electron-server.mjs",
|
|
207
209
|
"electron:extensions:build": "node scripts/build-electron-extensions.mjs",
|
|
208
|
-
"electron:build:artifacts": "pnpm run electron:vite:build:package && pnpm run electron:server:build && pnpm run electron:extensions:build",
|
|
210
|
+
"electron:build:artifacts": "pnpm run electron:native:build && pnpm run electron:vite:build:package && pnpm run electron:server:build && pnpm run electron:extensions:build",
|
|
209
211
|
"electron:frpc:download": "node --import tsx/esm scripts/download-frpc-binaries.mjs",
|
|
210
212
|
"electron:frpc:download:all": "node --import tsx/esm scripts/download-frpc-binaries.mjs --all",
|
|
211
213
|
"electron:build": "pnpm run generate:bundled && pnpm run build:node && pnpm run build:web && pnpm run electron:build:artifacts && pnpm run electron:package",
|