@xopcai/xopc 0.0.121 → 0.0.122
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 +23 -3
- package/README.zh-CN.md +23 -3
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-4AW4JgSU.js → agent-avatar-dicebear-CK3s5cJo.js} +1 -1
- package/dist/gateway/static/root/assets/agents-SsQrj9B-.js +2 -0
- package/dist/gateway/static/root/assets/{app-management-settings-panel-CE6GkGU2.js → app-management-settings-panel-CWsNHtTs.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-BmaUjghw.js → appearance-settings-C4b8y6iZ.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-CYb6fame.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-CX4_KWut.js → archive-plugin-DAtNW3Ia.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-jf-PIIUU.js → attachment-load-Dm-RY54y.js} +1 -1
- package/dist/gateway/static/root/assets/automation-suggestion-card-BKHewSVT.js +1 -0
- package/dist/gateway/static/root/assets/automations-page-DpOOq1nk.js +1 -0
- package/dist/gateway/static/root/assets/{binary-plugins-DG9XQikd.js → binary-plugins-BG6Xnk71.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-Up_VIxLJ.js → block-editor-DfndiO3h.js} +28 -28
- package/dist/gateway/static/root/assets/browser-settings-page-9nXxgh4u.js +8 -0
- package/dist/gateway/static/root/assets/{capability-presets-api-CGM4OyMw.js → capability-presets-api-Cx93GLdw.js} +1 -1
- package/dist/gateway/static/root/assets/{capability-presets-settings-panel-CzWt0LBb.js → capability-presets-settings-panel-D528_YFy.js} +1 -1
- package/dist/gateway/static/root/assets/{channel-recipient-api-BEByL4_o.js → channel-recipient-api-DdPTtEs8.js} +1 -1
- package/dist/gateway/static/root/assets/channels-settings-Ck-3h5lI.js +1 -0
- package/dist/gateway/static/root/assets/connectors-page-DL-fAqE_.js +2 -0
- package/dist/gateway/static/root/assets/directory-picker-path-field-D835EHJd.js +1 -0
- package/dist/gateway/static/root/assets/dreaming-settings-CCa1F7Fg.js +1 -0
- package/dist/gateway/static/root/assets/{extension-debug-page-DZxa_j7-.js → extension-debug-page-W2ITCPSA.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-CseziW53.js → extension-page-DrvUytvn.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-B_9J-xyo.js → extension-settings-page-qM8aLT5u.js} +1 -1
- package/dist/gateway/static/root/assets/{fetch-Cs4ck8zA.js → fetch-ovkvM8KQ.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-api-Dl223a7r.js → gateway-config-api-BB3biuD0.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-settings-mmmnIH27.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-startup-retry-IvePwjFE.js → gateway-startup-retry-CanQ8UcR.js} +1 -1
- package/dist/gateway/static/root/assets/goal-create-dialog-CNqNdEkQ.js +1 -0
- package/dist/gateway/static/root/assets/goal-detail-page-Ceu5zrN6.js +1 -0
- package/dist/gateway/static/root/assets/{goals-config-api-CUCP6yCl.js → goals-config-api-BBOX6mUl.js} +1 -1
- package/dist/gateway/static/root/assets/goals-page-BP1kfvWv.js +2 -0
- package/dist/gateway/static/root/assets/{goals-settings-Dj87qPxv.js → goals-settings-Bh3A7OZV.js} +1 -1
- package/dist/gateway/static/root/assets/heartbeat-settings-YoYgKlfX.js +1 -0
- package/dist/gateway/static/root/assets/index-DdqSO9R2.js +191 -0
- package/dist/gateway/static/root/assets/index-jGB-2nI-.css +1 -0
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-DJgYw0nB.js → keyboard-shortcuts-settings-B4TKJHla.js} +1 -1
- package/dist/gateway/static/root/assets/logs-page-BgVk5DvZ.js +2 -0
- package/dist/gateway/static/root/assets/{markdown-split-gnQ_EiGo.js → markdown-split-DcFtdLci.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-CQV-mgJn.js → media-plugins-B6SmeLVB.js} +1 -1
- package/dist/gateway/static/root/assets/messages-B5O4OIEo.js +3 -0
- package/dist/gateway/static/root/assets/models-hub-panel-BU0x8PGP.js +2 -0
- package/dist/gateway/static/root/assets/notes-page-D6JYVP4I.js +1 -0
- package/dist/gateway/static/root/assets/notes-workbench-mqRJYnJS.js +2 -0
- package/dist/gateway/static/root/assets/{preview-open-alternatives-BPMXC-2u.js → preview-open-alternatives-C29O19s7.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-DOTgzoeh.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-DGUIb4y5.js +1 -0
- package/dist/gateway/static/root/assets/remote-access-hub-DVKKUj3u.js +1 -0
- package/dist/gateway/static/root/assets/{save-bar-controls-BEHqwZjz.js → save-bar-controls-B4ad9GfB.js} +1 -1
- package/dist/gateway/static/root/assets/{schedule-field-CMY25m97.js → schedule-field-DdYncfLR.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-CxjxsFfg.js → schema-form-BMTrDE-7.js} +1 -1
- package/dist/gateway/static/root/assets/segmented-styles-BL8oLBEp.js +1 -0
- package/dist/gateway/static/root/assets/sessions-page-BVbzUWxW.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-DrNNoSqE.js +1 -0
- package/dist/gateway/static/root/assets/{settings-collapsible-section-s-kiLAxP.js → settings-collapsible-section-MwTW2eK4.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-form-section-CIxIEYxU.js → settings-form-section-Dg6LBbcr.js} +1 -1
- package/dist/gateway/static/root/assets/settings-page-CMDqgeMR.js +1 -0
- package/dist/gateway/static/root/assets/settings-page-layout-BX4T-OLF.js +1 -0
- package/dist/gateway/static/root/assets/setup-status-panel-Ce1pcFtR.js +1 -0
- package/dist/gateway/static/root/assets/share-preview-page-DWE-dUFh.js +2 -0
- package/dist/gateway/static/root/assets/shares-settings-aKSraR8l.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-CS-FU_B-.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-BaF3u0LA.js +2 -0
- package/dist/gateway/static/root/assets/{system-settings-panel-Czjf0kLJ.js → system-settings-panel-Dd6Y35Cm.js} +1 -1
- package/dist/gateway/static/root/assets/{typed-models-lib-Cmt8SYdI.js → typed-models-lib-Cx6XV5A2.js} +1 -1
- package/dist/gateway/static/root/assets/{use-channel-catalog-DyM-ckEQ.js → use-channel-catalog-D4sMbmy7.js} +1 -1
- package/dist/gateway/static/root/assets/{user-profile-settings-panel-BygLv8vm.js → user-profile-settings-panel-Bx-hjMQc.js} +1 -1
- package/dist/gateway/static/root/assets/{utils-CloW8coB.js → utils-D7b_vZnv.js} +1 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-CkhbRt1q.js +1 -0
- package/dist/gateway/static/root/assets/workflow-run-setup-panel--TdohF5N.js +3 -0
- package/dist/gateway/static/root/assets/workflow-start-dialog-B0lavx_o.js +1 -0
- package/dist/gateway/static/root/assets/workflows-page-CZR05Bu_.js +18 -0
- package/dist/gateway/static/root/index.html +5 -5
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.d.ts +2 -0
- package/dist/src/agent/agent-manager.js +47 -7
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/context/project-context.d.ts +19 -0
- package/dist/src/agent/context/project-context.js +90 -0
- package/dist/src/agent/context/project-context.js.map +1 -0
- package/dist/src/agent/goals/goal-locale.js +2 -2
- package/dist/src/agent/memory/types.d.ts +1 -0
- package/dist/src/agent/prompt/service-prompt-builder.d.ts +1 -0
- package/dist/src/agent/prompt/service-prompt-builder.js +2 -0
- package/dist/src/agent/prompt/service-prompt-builder.js.map +1 -1
- package/dist/src/agent/prompt/system-prompt-params.d.ts +2 -0
- package/dist/src/agent/prompt/system-prompt-params.js +1 -0
- package/dist/src/agent/prompt/system-prompt-params.js.map +1 -1
- package/dist/src/agent/prompt/system-prompt.d.ts +1 -0
- package/dist/src/agent/prompt/system-prompt.js +2 -1
- package/dist/src/agent/prompt/system-prompt.js.map +1 -1
- package/dist/src/agent/service.js +4 -3
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/session/session-config-service.js +6 -1
- package/dist/src/agent/session/session-config-service.js.map +1 -1
- package/dist/src/agent/session/session-hydrator.js +7 -3
- package/dist/src/agent/session/session-hydrator.js.map +1 -1
- package/dist/src/agent/session/session-inspector.js +9 -5
- package/dist/src/agent/session/session-inspector.js.map +1 -1
- package/dist/src/agent/starter-agents.js +5 -34
- package/dist/src/agent/starter-agents.js.map +1 -1
- package/dist/src/agent/workflow/index.js +2 -2
- package/dist/src/agent/workflow/runtime.js +1 -1
- package/dist/src/automations/api/routes.js +13 -2
- package/dist/src/automations/api/routes.js.map +1 -1
- package/dist/src/automations/domain/types.d.ts +2 -0
- package/dist/src/automations/domain/validation.d.ts +3 -0
- package/dist/src/automations/domain/validation.js +1 -0
- package/dist/src/automations/domain/validation.js.map +1 -1
- package/dist/src/automations/draft/automation-draft-validator.d.ts +1 -0
- package/dist/src/automations/service/action-executor.js +3 -1
- package/dist/src/automations/service/action-executor.js.map +1 -1
- package/dist/src/automations/service/automation-service.d.ts +4 -1
- package/dist/src/automations/service/automation-service.js +2 -2
- package/dist/src/automations/service/automation-service.js.map +1 -1
- package/dist/src/automations/storage/automation-repository.d.ts +3 -1
- package/dist/src/automations/storage/automation-repository.js +7 -5
- package/dist/src/automations/storage/automation-repository.js.map +1 -1
- package/dist/src/automations/storage/automation-run-repository.d.ts +1 -0
- package/dist/src/automations/storage/automation-run-repository.js +12 -1
- package/dist/src/automations/storage/automation-run-repository.js.map +1 -1
- package/dist/src/chat-commands/context.js +2 -1
- package/dist/src/chat-commands/context.js.map +1 -1
- package/dist/src/cli/command-loaders.js +1 -0
- package/dist/src/cli/command-loaders.js.map +1 -1
- package/dist/src/cli/command-manifest.js +4 -0
- package/dist/src/cli/command-manifest.js.map +1 -1
- package/dist/src/cli/commands/agent.js +2 -2
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
- package/dist/src/cli/commands/goal.js +27 -4
- package/dist/src/cli/commands/goal.js.map +1 -1
- package/dist/src/cli/commands/models.js +1 -1
- package/dist/src/cli/commands/onboard.js +1 -1
- package/dist/src/cli/commands/profile.js +1 -1
- package/dist/src/cli/commands/project.d.ts +4 -0
- package/dist/src/cli/commands/project.js +239 -0
- package/dist/src/cli/commands/project.js.map +1 -0
- package/dist/src/cli/commands/tunnel.js +1 -1
- package/dist/src/cli/commands/update.js +1 -1
- package/dist/src/cli/extension-cli-register.js +1 -1
- package/dist/src/config/agent-profile.js +1 -1
- package/dist/src/config/index.js +1 -1
- package/dist/src/gateway/agents-admin.js +1 -1
- package/dist/src/gateway/hono/routes/goals.js +51 -4
- package/dist/src/gateway/hono/routes/goals.js.map +1 -1
- package/dist/src/gateway/hono/routes/index.js +2 -0
- package/dist/src/gateway/hono/routes/index.js.map +1 -1
- package/dist/src/gateway/hono/routes/memory.js +5 -1
- package/dist/src/gateway/hono/routes/memory.js.map +1 -1
- package/dist/src/gateway/hono/routes/notes.js +5 -0
- package/dist/src/gateway/hono/routes/notes.js.map +1 -1
- package/dist/src/gateway/hono/routes/projects.d.ts +3 -0
- package/dist/src/gateway/hono/routes/projects.js +578 -0
- package/dist/src/gateway/hono/routes/projects.js.map +1 -0
- package/dist/src/gateway/hono/routes/sessions.js +47 -7
- package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
- package/dist/src/gateway/hono/routes/workflows.js +27 -4
- package/dist/src/gateway/hono/routes/workflows.js.map +1 -1
- package/dist/src/gateway/run-loop.js +1 -1
- package/dist/src/gateway/service.d.ts +3 -0
- package/dist/src/gateway/service.js +10 -3
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/goals/goal-service.d.ts +1 -1
- package/dist/src/goals/goal-service.js +2 -1
- package/dist/src/goals/goal-service.js.map +1 -1
- package/dist/src/goals/goal-store.d.ts +1 -1
- package/dist/src/goals/goal-store.js +12 -6
- package/dist/src/goals/goal-store.js.map +1 -1
- package/dist/src/goals/goal-workflow-judge.js +1 -1
- package/dist/src/goals/types.d.ts +3 -0
- package/dist/src/i18n/goals-bundle.js +1 -1
- package/dist/src/i18n/index.js +1 -1
- package/dist/src/i18n/share-tool-bundle.js +2 -2
- package/dist/src/mcp/channel-bridge.js +1 -1
- package/dist/src/notes/agent-context.js +2 -2
- package/dist/src/projects/automation-bind.d.ts +1 -0
- package/dist/src/projects/automation-bind.js +16 -0
- package/dist/src/projects/automation-bind.js.map +1 -0
- package/dist/src/projects/goal-bind.d.ts +4 -0
- package/dist/src/projects/goal-bind.js +40 -0
- package/dist/src/projects/goal-bind.js.map +1 -0
- package/dist/src/projects/index.d.ts +11 -0
- package/dist/src/projects/index.js +11 -0
- package/dist/src/projects/memory-bind.d.ts +1 -0
- package/dist/src/projects/memory-bind.js +16 -0
- package/dist/src/projects/memory-bind.js.map +1 -0
- package/dist/src/projects/project-agent.d.ts +10 -0
- package/dist/src/projects/project-agent.js +27 -0
- package/dist/src/projects/project-agent.js.map +1 -0
- package/dist/src/projects/project-loop.d.ts +58 -0
- package/dist/src/projects/project-loop.js +118 -0
- package/dist/src/projects/project-loop.js.map +1 -0
- package/dist/src/projects/project-service.d.ts +26 -0
- package/dist/src/projects/project-service.js +94 -0
- package/dist/src/projects/project-service.js.map +1 -0
- package/dist/src/projects/project-store.d.ts +31 -0
- package/dist/src/projects/project-store.js +193 -0
- package/dist/src/projects/project-store.js.map +1 -0
- package/dist/src/projects/session-bind.d.ts +5 -0
- package/dist/src/projects/session-bind.js +46 -0
- package/dist/src/projects/session-bind.js.map +1 -0
- package/dist/src/projects/types.d.ts +60 -0
- package/dist/src/projects/types.js +1 -0
- package/dist/src/projects/workflow-bind.d.ts +1 -0
- package/dist/src/projects/workflow-bind.js +16 -0
- package/dist/src/projects/workflow-bind.js.map +1 -0
- package/dist/src/projects/workspace.d.ts +5 -0
- package/dist/src/projects/workspace.js +25 -0
- package/dist/src/projects/workspace.js.map +1 -0
- package/dist/src/session/index.d.ts +1 -1
- package/dist/src/session/index.js +3 -3
- package/dist/src/session/session-workspace.d.ts +4 -2
- package/dist/src/session/session-workspace.js +10 -3
- package/dist/src/session/session-workspace.js.map +1 -1
- package/dist/src/session/types.d.ts +3 -0
- package/dist/src/session/types.js.map +1 -1
- package/dist/src/storage/sqlite/memory-records-repository.d.ts +3 -0
- package/dist/src/storage/sqlite/memory-records-repository.js +16 -5
- package/dist/src/storage/sqlite/memory-records-repository.js.map +1 -1
- package/dist/src/storage/sqlite/migrations/019_projects.sql +40 -0
- package/dist/src/storage/sqlite/migrations/020_project_default_agent.sql +1 -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/notes-repository.js +20 -4
- package/dist/src/storage/sqlite/notes-repository.js.map +1 -1
- package/dist/src/storage/sqlite/row-mappers.d.ts +2 -0
- package/dist/src/storage/sqlite/row-mappers.js +2 -0
- package/dist/src/storage/sqlite/row-mappers.js.map +1 -1
- package/dist/src/storage/sqlite/schema.js +1 -1
- package/dist/src/storage/sqlite/session-repository.js +10 -5
- package/dist/src/storage/sqlite/session-repository.js.map +1 -1
- package/dist/src/storage/sqlite/transcript-repository.js +8 -0
- package/dist/src/storage/sqlite/transcript-repository.js.map +1 -1
- package/dist/src/tui/backends/embedded-backend.js +1 -1
- package/dist/src/tui/tui-commands.js +145 -0
- package/dist/src/tui/tui-commands.js.map +1 -1
- package/dist/src/workflows/domain/run.d.ts +1 -0
- package/dist/src/workflows/domain/run.js.map +1 -1
- package/dist/src/workflows/index.js +1 -1
- package/dist/src/workflows/service/workflow-run-service.d.ts +1 -0
- package/dist/src/workflows/service/workflow-run-service.js +18 -4
- package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
- package/dist/src/workflows/service/workflow-run-service.types.d.ts +2 -0
- package/dist/src/workflows/service/workflow-session-bridge.d.ts +1 -0
- package/dist/src/workflows/service/workflow-session-bridge.js +3 -0
- package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
- package/dist/src/workflows/store/run-index-store.d.ts +1 -0
- package/dist/src/workflows/store/run-index-store.js +13 -3
- package/dist/src/workflows/store/run-index-store.js.map +1 -1
- package/dist/src/workflows/store/run-store.d.ts +3 -1
- package/dist/src/workflows/store/run-store.js +5 -2
- package/dist/src/workflows/store/run-store.js.map +1 -1
- package/package.json +10 -1
- package/dist/gateway/static/root/assets/agents-2SVUUPlp.js +0 -2
- package/dist/gateway/static/root/assets/apps-page-BWeQ1I49.js +0 -1
- package/dist/gateway/static/root/assets/automation-suggestion-card-BHk5rtJz.js +0 -1
- package/dist/gateway/static/root/assets/automations-page-QHotl53D.js +0 -1
- package/dist/gateway/static/root/assets/browser-settings-page-Cmwi6IIQ.js +0 -8
- package/dist/gateway/static/root/assets/channels-settings-BOMCUe2J.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-C-Dexk_F.js +0 -2
- package/dist/gateway/static/root/assets/dreaming-settings-WPEj8pir.js +0 -1
- package/dist/gateway/static/root/assets/gateway-settings-DdzbtW9R.js +0 -1
- package/dist/gateway/static/root/assets/goal-detail-page-Dxldogms.js +0 -1
- package/dist/gateway/static/root/assets/goals-page-DU5Nd6Xp.js +0 -2
- package/dist/gateway/static/root/assets/heartbeat-settings-Cgm5JmwH.js +0 -1
- package/dist/gateway/static/root/assets/index-BU1pvxmS.js +0 -191
- package/dist/gateway/static/root/assets/index-l54WfSqe.css +0 -1
- package/dist/gateway/static/root/assets/logs-page-C10aS4XO.js +0 -2
- package/dist/gateway/static/root/assets/messages-C6Kc4Jhf.js +0 -3
- package/dist/gateway/static/root/assets/models-hub-panel-B35CAfg6.js +0 -2
- package/dist/gateway/static/root/assets/note-detail-page-Brlwse8x.js +0 -2
- package/dist/gateway/static/root/assets/note-image-lightbox-BthwKjLA.js +0 -1
- package/dist/gateway/static/root/assets/note-time-hm6JO_Wi.js +0 -1
- package/dist/gateway/static/root/assets/notes-page-CoAwRc7L.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-B36RQ05h.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-73THChnj.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-CR9VsY-R.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-BJ1AhfKI.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-layout--6qT7ZJa.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-C1TtS1vJ.js +0 -1
- package/dist/gateway/static/root/assets/share-preview-page-BZADSbS1.js +0 -2
- package/dist/gateway/static/root/assets/shares-settings-gqC8Rmhy.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-C9P-WYvS.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-CEpSvOhF.js +0 -2
- package/dist/gateway/static/root/assets/voice-api-key-field-BsoqJba6.js +0 -1
- package/dist/gateway/static/root/assets/voice-player-store-DduWlJYV.js +0 -1
- package/dist/gateway/static/root/assets/workflow-run-setup-panel-CcQeX6l5.js +0 -3
- package/dist/gateway/static/root/assets/workflows-page-CeA8A9Ef.js +0 -18
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { buildSessionKey, init_session_key, sanitizeSegment } from "../../../routing/session-key.js";
|
|
2
2
|
import { getDefaultAgentId, init_resolve_route } from "../../../routing/resolve-route.js";
|
|
3
|
-
import { createWorkflowCatalog } from "../../../agent/workflow/catalog.js";
|
|
4
3
|
import { GoalService, normalizeGoalUiLocale } from "../../../goals/goal-service.js";
|
|
5
4
|
import "../../../goals/index.js";
|
|
5
|
+
import { createWorkflowCatalog } from "../../../agent/workflow/catalog.js";
|
|
6
6
|
import { MAX_WEBCHAT_ATTACHMENT_FILE_BYTES } from "../../chat-limits.js";
|
|
7
|
+
import { resolveProjectAgentId } from "../../../projects/project-agent.js";
|
|
8
|
+
import "../../../projects/index.js";
|
|
7
9
|
//#region src/gateway/hono/routes/goals.ts
|
|
8
10
|
init_session_key();
|
|
9
11
|
init_resolve_route();
|
|
@@ -231,12 +233,14 @@ function registerGoalsRoutes(authenticated, deps) {
|
|
|
231
233
|
const limit = parseLimit(c.req.query("limit"));
|
|
232
234
|
const offsetRaw = c.req.query("offset")?.trim();
|
|
233
235
|
const offset = offsetRaw ? Math.max(0, Number.parseInt(offsetRaw, 10) || 0) : 0;
|
|
236
|
+
const projectId = c.req.query("projectId")?.trim() || void 0;
|
|
234
237
|
return c.json({
|
|
235
238
|
ok: true,
|
|
236
239
|
goals: goals.list({
|
|
237
240
|
status,
|
|
238
241
|
agentId,
|
|
239
242
|
sessionKey,
|
|
243
|
+
projectId,
|
|
240
244
|
limit,
|
|
241
245
|
offset
|
|
242
246
|
})
|
|
@@ -263,7 +267,17 @@ function registerGoalsRoutes(authenticated, deps) {
|
|
|
263
267
|
error: attachmentError
|
|
264
268
|
}, 400);
|
|
265
269
|
const preparedContextAttachments = contextMessage.attachments?.length ? await deps.service.agentService.prepareInboundAttachments(sessionKey ?? `goal:${Date.now()}`, contextMessage.attachments) : void 0;
|
|
266
|
-
const
|
|
270
|
+
const projectId = typeof body.projectId === "string" && body.projectId.trim() ? body.projectId.trim() : void 0;
|
|
271
|
+
if (projectId && !deps.service.projects.get(projectId)) return c.json({
|
|
272
|
+
ok: false,
|
|
273
|
+
error: "Project not found"
|
|
274
|
+
}, 404);
|
|
275
|
+
const agentId = sessionKey ? typeof body.agentId === "string" && body.agentId.trim() ? body.agentId.trim() : void 0 : resolveProjectAgentId({
|
|
276
|
+
config: cfg(),
|
|
277
|
+
projects: deps.service.projects,
|
|
278
|
+
explicitAgentId: typeof body.agentId === "string" ? body.agentId : void 0,
|
|
279
|
+
projectId
|
|
280
|
+
});
|
|
267
281
|
const maxTurns = typeof body.maxTurns === "number" && Number.isFinite(body.maxTurns) ? Math.max(1, Math.min(500, Math.floor(body.maxTurns))) : void 0;
|
|
268
282
|
const goal = goals.create({
|
|
269
283
|
title,
|
|
@@ -276,6 +290,7 @@ function registerGoalsRoutes(authenticated, deps) {
|
|
|
276
290
|
maxTurns,
|
|
277
291
|
uiLocale: normalizeGoalUiLocale(body.uiLocale),
|
|
278
292
|
source: body.source === "cli" || body.source === "cron" || body.source === "workflow" || body.source === "channel" || body.source === "api" ? body.source : "chat",
|
|
293
|
+
projectId,
|
|
279
294
|
config: cfg()
|
|
280
295
|
});
|
|
281
296
|
goals.setContextMessage({
|
|
@@ -426,6 +441,14 @@ function registerGoalsRoutes(authenticated, deps) {
|
|
|
426
441
|
if ("judgeModelRef" in body) patch.judgeModelRef = typeof body.judgeModelRef === "string" ? body.judgeModelRef : void 0;
|
|
427
442
|
if ("nextAction" in body) patch.nextAction = typeof body.nextAction === "string" ? body.nextAction : void 0;
|
|
428
443
|
if ("blockedReason" in body) patch.blockedReason = typeof body.blockedReason === "string" ? body.blockedReason : void 0;
|
|
444
|
+
if ("projectId" in body) {
|
|
445
|
+
const nextProjectId = typeof body.projectId === "string" && body.projectId.trim() ? body.projectId.trim() : void 0;
|
|
446
|
+
if (nextProjectId && !deps.service.projects.get(nextProjectId)) return c.json({
|
|
447
|
+
ok: false,
|
|
448
|
+
error: "Project not found"
|
|
449
|
+
}, 404);
|
|
450
|
+
patch.projectId = nextProjectId;
|
|
451
|
+
}
|
|
429
452
|
const locale = normalizeGoalUiLocale(body.uiLocale);
|
|
430
453
|
if (locale) patch.uiLocale = locale;
|
|
431
454
|
if (Object.keys(patch).length > 0) goal = goals.update(goalId, patch);
|
|
@@ -481,7 +504,22 @@ function registerGoalsRoutes(authenticated, deps) {
|
|
|
481
504
|
peerId
|
|
482
505
|
}
|
|
483
506
|
} });
|
|
507
|
+
if (goal.projectId) try {
|
|
508
|
+
deps.service.projects.attachSession(sessionKey, goal.projectId);
|
|
509
|
+
} catch {
|
|
510
|
+
return c.json({
|
|
511
|
+
ok: false,
|
|
512
|
+
error: "Session not found"
|
|
513
|
+
}, 404);
|
|
514
|
+
}
|
|
484
515
|
goals.attachSession(goalId, sessionKey);
|
|
516
|
+
} else if (goal.projectId) try {
|
|
517
|
+
deps.service.projects.attachSession(sessionKey, goal.projectId);
|
|
518
|
+
} catch {
|
|
519
|
+
return c.json({
|
|
520
|
+
ok: false,
|
|
521
|
+
error: "Session not found"
|
|
522
|
+
}, 404);
|
|
485
523
|
}
|
|
486
524
|
const queued = deps.service.enqueueGoalRun(goalId, {
|
|
487
525
|
userTurn: parseUserTurnInput(body.userTurn),
|
|
@@ -632,11 +670,20 @@ function registerGoalsRoutes(authenticated, deps) {
|
|
|
632
670
|
ok: false,
|
|
633
671
|
error: "Missing sessionKey"
|
|
634
672
|
}, 400);
|
|
635
|
-
const
|
|
636
|
-
if (!
|
|
673
|
+
const currentGoal = goals.get(goalId);
|
|
674
|
+
if (!currentGoal) return c.json({
|
|
637
675
|
ok: false,
|
|
638
676
|
error: "Goal not found"
|
|
639
677
|
}, 404);
|
|
678
|
+
if (currentGoal.projectId) try {
|
|
679
|
+
deps.service.projects.attachSession(sessionKey, currentGoal.projectId);
|
|
680
|
+
} catch {
|
|
681
|
+
return c.json({
|
|
682
|
+
ok: false,
|
|
683
|
+
error: "Session not found"
|
|
684
|
+
}, 404);
|
|
685
|
+
}
|
|
686
|
+
const goal = goals.attachSession(goalId, sessionKey);
|
|
640
687
|
return c.json({
|
|
641
688
|
ok: true,
|
|
642
689
|
goal
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"goals.js","names":[],"sources":["../../../../../src/gateway/hono/routes/goals.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport { createWorkflowCatalog } from '../../../agent/workflow/catalog.js';\nimport {\n GoalService,\n normalizeGoalUiLocale,\n type GoalChecklistItem,\n type GoalEvent,\n type GoalEvidence,\n type GoalQueueItemSnapshot,\n type GoalRun,\n type GoalStatus,\n} from '../../../goals/index.js';\nimport { buildSessionKey, sanitizeSegment } from '../../../routing/session-key.js';\nimport { getDefaultAgentId } from '../../../routing/resolve-route.js';\nimport type { WorkflowRunSummary } from '../../../workflows/domain/index.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\nimport { MAX_CHAT_ATTACHMENTS, MAX_WEBCHAT_ATTACHMENT_FILE_BYTES } from '../../chat-limits.js';\nimport type { UserTurnAttachment, UserTurnInput } from '../../user-turn-input.js';\n\nfunction parseLimit(raw: string | undefined, fallback = 50): number {\n if (!raw) return fallback;\n const n = Number.parseInt(raw, 10);\n return Number.isFinite(n) ? Math.min(500, Math.max(1, n)) : fallback;\n}\n\nfunction parseStatuses(raw: string | undefined): GoalStatus[] | undefined {\n if (!raw?.trim()) return undefined;\n const statuses = raw\n .split(',')\n .map((s) => s.trim())\n .filter((s): s is GoalStatus =>\n s === 'active' ||\n s === 'paused' ||\n s === 'blocked' ||\n s === 'needs_input' ||\n s === 'done' ||\n s === 'archived',\n );\n return statuses.length ? statuses : undefined;\n}\n\nfunction parseBodyGoalStatus(raw: unknown): GoalStatus | null {\n return raw === 'active' ||\n raw === 'paused' ||\n raw === 'blocked' ||\n raw === 'needs_input' ||\n raw === 'done' ||\n raw === 'archived'\n ? raw\n : null;\n}\n\nfunction parsePriority(raw: unknown): 'low' | 'normal' | 'high' | undefined {\n return raw === 'low' || raw === 'normal' || raw === 'high' ? raw : undefined;\n}\n\nfunction maxBase64CharsForBinary(maxBinaryBytes: number): number {\n return 4 * Math.ceil(maxBinaryBytes / 3);\n}\n\nfunction parseUserTurnAttachment(raw: unknown): UserTurnAttachment | null {\n if (!raw || typeof raw !== 'object') return null;\n const value = raw as Record<string, unknown>;\n const type = typeof value.type === 'string' && value.type.trim() ? value.type.trim() : 'file';\n const out: UserTurnAttachment = { type };\n if (typeof value.id === 'string' && value.id.trim()) out.id = value.id.trim();\n if (typeof value.mimeType === 'string' && value.mimeType.trim()) out.mimeType = value.mimeType.trim();\n if (typeof value.data === 'string' && value.data.trim()) out.data = value.data;\n if (typeof value.uri === 'string' && value.uri.trim()) out.uri = value.uri.trim();\n if (typeof value.name === 'string' && value.name.trim()) out.name = value.name.trim();\n if (typeof value.size === 'number' && Number.isFinite(value.size)) out.size = Math.max(0, Math.floor(value.size));\n if (typeof value.workspaceRelativePath === 'string' && value.workspaceRelativePath.trim()) {\n out.workspaceRelativePath = value.workspaceRelativePath.trim();\n }\n if (typeof value.durationSeconds === 'number' && Number.isFinite(value.durationSeconds)) {\n out.durationSeconds = value.durationSeconds;\n }\n return out.data || out.uri ? out : null;\n}\n\nfunction parseUserTurnInput(raw: unknown): UserTurnInput | undefined {\n if (!raw || typeof raw !== 'object') return undefined;\n const value = raw as Record<string, unknown>;\n const text = typeof value.text === 'string' ? value.text.trim() : '';\n const attachments = Array.isArray(value.attachments)\n ? value.attachments.map(parseUserTurnAttachment).filter((item): item is UserTurnAttachment => item !== null)\n : undefined;\n if (!text && !attachments?.length) return undefined;\n return { text, ...(attachments?.length ? { attachments } : {}) };\n}\n\nfunction validateUserTurnAttachments(attachments: UserTurnAttachment[] | undefined): string | null {\n if (!attachments?.length) return null;\n if (attachments.length > MAX_CHAT_ATTACHMENTS) {\n return `Too many attachments (max ${MAX_CHAT_ATTACHMENTS})`;\n }\n const maxDataChars = maxBase64CharsForBinary(MAX_WEBCHAT_ATTACHMENT_FILE_BYTES);\n for (const attachment of attachments) {\n if (attachment.data && attachment.data.length > maxDataChars) {\n return `Attachment exceeds maximum size (${MAX_WEBCHAT_ATTACHMENT_FILE_BYTES} bytes)`;\n }\n }\n return null;\n}\n\ntype GoalActivityItem = {\n id: string;\n kind: 'queue' | 'goal_run' | 'workflow_run' | 'event' | 'evidence';\n status?: string;\n title: string;\n summary?: string;\n createdAt: number;\n link?: { type: 'chat' | 'workflow_run'; value: string };\n data?: unknown;\n};\n\ntype GoalWorkflowSuggestion = {\n definitionId: string;\n name: string;\n title: string;\n description: string;\n score: number;\n reasons: string[];\n tags: string[];\n successRate?: number;\n lastRunStatus?: WorkflowRunSummary['status'];\n};\n\nconst STOP_WORDS = new Set([\n 'a',\n 'an',\n 'and',\n 'are',\n 'as',\n 'for',\n 'in',\n 'is',\n 'of',\n 'on',\n 'or',\n 'the',\n 'to',\n 'with',\n '一个',\n '这个',\n '需要',\n '进行',\n '推进',\n]);\n\nfunction tokenizeForWorkflowMatch(text: string): string[] {\n const normalized = text.toLowerCase();\n const tokens = normalized.match(/[\\p{L}\\p{N}_-]+/gu) ?? [];\n return tokens\n .map((token) => token.trim())\n .filter((token) => token.length >= 2 && !STOP_WORDS.has(token));\n}\n\nfunction goalSearchText(goal: NonNullable<ReturnType<GoalService['get']>>): string {\n return [\n goal.title,\n goal.description,\n goal.nextAction,\n goal.blockedReason,\n ...goal.checklist.map((item: GoalChecklistItem) => `${item.text} ${item.evidenceSummary ?? ''}`),\n ].filter(Boolean).join('\\n');\n}\n\nfunction buildGoalWorkflowSuggestions(params: {\n goal: NonNullable<ReturnType<GoalService['get']>>;\n workflowRuns: WorkflowRunSummary[];\n}): GoalWorkflowSuggestion[] {\n const goalTokens = new Set(tokenizeForWorkflowMatch(goalSearchText(params.goal)));\n const runsByDefinition = new Map<string, WorkflowRunSummary[]>();\n for (const run of params.workflowRuns) {\n const list = runsByDefinition.get(run.definitionId) ?? [];\n list.push(run);\n runsByDefinition.set(run.definitionId, list);\n }\n\n const suggestions: GoalWorkflowSuggestion[] = [];\n for (const entry of createWorkflowCatalog().list()) {\n const candidateText = [\n entry.name,\n entry.title,\n entry.description,\n entry.whenToUse,\n ...(entry.tags ?? []),\n ].filter(Boolean).join('\\n');\n const candidateTokens = new Set(tokenizeForWorkflowMatch(candidateText));\n const matched = [...goalTokens].filter((token) => candidateTokens.has(token));\n const relatedRuns = runsByDefinition.get(entry.name) ?? [];\n const terminalRuns = relatedRuns.filter((run) => run.status !== 'queued' && run.status !== 'running');\n const succeededRuns = terminalRuns.filter((run) => run.status === 'succeeded');\n const successRate = terminalRuns.length ? succeededRuns.length / terminalRuns.length : undefined;\n const lastRun = relatedRuns.toSorted((left, right) => right.createdAtMs - left.createdAtMs)[0];\n\n let score = matched.length * 8;\n if (entry.tags?.some((tag) => goalTokens.has(tag.toLowerCase()))) score += 8;\n if (entry.whenToUse && matched.length > 0) score += 4;\n if (successRate != null) score += Math.round(successRate * 10);\n if (lastRun?.status === 'succeeded') score += 4;\n if (lastRun?.status === 'failed' || lastRun?.status === 'timeout') score -= 3;\n if (score <= 0) score = entry.source === 'builtin' ? 1 : 0;\n\n const reasons: string[] = [];\n if (matched.length) reasons.push(`matches ${matched.slice(0, 4).join(', ')}`);\n if (successRate != null) reasons.push(`${Math.round(successRate * 100)}% success rate`);\n if (lastRun) reasons.push(`last run ${lastRun.status}`);\n if (!reasons.length && entry.whenToUse) reasons.push('general workflow fit');\n\n if (score > 0) {\n suggestions.push({\n definitionId: entry.name,\n name: entry.name,\n title: entry.title || entry.name,\n description: entry.description,\n score,\n reasons,\n tags: entry.tags ?? [],\n successRate,\n lastRunStatus: lastRun?.status,\n });\n }\n }\n\n return suggestions\n .sort((left, right) => right.score - left.score || left.name.localeCompare(right.name))\n .slice(0, 5);\n}\n\nfunction buildGoalActivities(input: {\n goalId: string;\n queue: GoalQueueItemSnapshot[];\n runs: GoalRun[];\n workflowRuns: WorkflowRunSummary[];\n events: GoalEvent[];\n evidence: GoalEvidence[];\n limit: number;\n}): GoalActivityItem[] {\n const activities: GoalActivityItem[] = [];\n\n for (const item of input.queue.filter((queueItem) => queueItem.goalId === input.goalId)) {\n activities.push({\n id: `queue:${item.id}`,\n kind: 'queue',\n status: item.status,\n title: 'Goal queued',\n summary: item.lastError || item.userTurn?.text || undefined,\n createdAt: item.finishedAt ?? item.startedAt ?? item.nextRunAt ?? item.enqueuedAt,\n link: item.sessionKey ? { type: 'chat', value: item.sessionKey } : undefined,\n data: item,\n });\n }\n\n for (const run of input.runs) {\n activities.push({\n id: `goal_run:${run.id}`,\n kind: 'goal_run',\n status: run.verdict ?? run.status,\n title: 'Goal run judged',\n summary: run.reason || run.assistantPreview || run.nextAction,\n createdAt: run.finishedAt ?? run.startedAt,\n data: run,\n });\n }\n\n for (const run of input.workflowRuns) {\n activities.push({\n id: `workflow_run:${run.id}`,\n kind: 'workflow_run',\n status: run.status,\n title: run.title || run.definitionId,\n summary: run.definitionId,\n createdAt: run.completedAtMs ?? run.startedAtMs ?? run.createdAtMs,\n link: { type: 'workflow_run', value: run.id },\n data: run,\n });\n }\n\n for (const event of input.events) {\n activities.push({\n id: `event:${event.id}`,\n kind: 'event',\n status: event.kind,\n title: event.kind,\n summary: event.message,\n createdAt: event.createdAt,\n data: event,\n });\n }\n\n for (const item of input.evidence) {\n activities.push({\n id: `evidence:${item.id}`,\n kind: 'evidence',\n status: item.kind,\n title: item.title,\n summary: item.summary || item.uri,\n createdAt: item.createdAt,\n data: item,\n });\n }\n\n return activities\n .sort((left, right) => right.createdAt - left.createdAt)\n .slice(0, input.limit);\n}\n\nfunction abortActiveWebchatRunForGoal(\n deps: AuthenticatedRouteDeps,\n goal: NonNullable<ReturnType<GoalService['get']>>,\n): { aborted?: boolean; abortedRunId?: string } {\n const sessionKey = goal.activeSessionKey?.trim();\n if (!sessionKey) return {};\n const runId = deps.service.getActiveWebchatRunId(sessionKey);\n if (!runId) return {};\n return {\n abortedRunId: runId,\n aborted: deps.service.abortAgentRun(runId),\n };\n}\n\n/** First-class Goal API. Sessions are execution context; goals are durable product objects. */\nexport function registerGoalsRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const goals = new GoalService();\n const cfg = () => deps.service.currentConfig;\n const workflowRunService = deps.service.createWorkflowRunService();\n\n authenticated.get('/api/goals/current', async (c) => {\n const sessionKey = c.req.query('sessionKey')?.trim();\n if (!sessionKey) return c.json({ ok: false, error: 'Missing sessionKey' }, 400);\n return c.json({ ok: true, goal: goals.getActiveForSession(sessionKey) });\n });\n\n authenticated.get('/api/goals', async (c) => {\n const status = parseStatuses(c.req.query('status'));\n const agentId = c.req.query('agentId')?.trim() || undefined;\n const sessionKey = c.req.query('sessionKey')?.trim() || undefined;\n const limit = parseLimit(c.req.query('limit'));\n const offsetRaw = c.req.query('offset')?.trim();\n const offset = offsetRaw ? Math.max(0, Number.parseInt(offsetRaw, 10) || 0) : 0;\n return c.json({ ok: true, goals: goals.list({ status, agentId, sessionKey, limit, offset }) });\n });\n\n authenticated.get('/api/goals/queue', async (c) => {\n return c.json({ ok: true, queue: deps.service.getGoalQueueSnapshot() });\n });\n\n authenticated.post('/api/goals', async (c) => {\n const body = (await c.req.json().catch(() => ({}))) as Record<string, unknown>;\n const title = typeof body.title === 'string' ? body.title.trim() : '';\n if (!title) return c.json({ ok: false, error: 'Missing title' }, 400);\n\n const sessionKey = typeof body.sessionKey === 'string' && body.sessionKey.trim() ? body.sessionKey.trim() : undefined;\n const contextMessage = parseUserTurnInput(body.contextMessage) ?? { text: '' };\n const attachmentError = validateUserTurnAttachments(contextMessage.attachments);\n if (attachmentError) return c.json({ ok: false, error: attachmentError }, 400);\n const preparedContextAttachments = contextMessage.attachments?.length\n ? await deps.service.agentService.prepareInboundAttachments(sessionKey ?? `goal:${Date.now()}`, contextMessage.attachments)\n : undefined;\n const agentId =\n typeof body.agentId === 'string' && body.agentId.trim()\n ? body.agentId.trim()\n : sessionKey\n ? undefined\n : getDefaultAgentId(cfg());\n const maxTurns =\n typeof body.maxTurns === 'number' && Number.isFinite(body.maxTurns)\n ? Math.max(1, Math.min(500, Math.floor(body.maxTurns)))\n : undefined;\n const goal = goals.create({\n title,\n description: contextMessage.text || undefined,\n sessionKey,\n agentId,\n priority: body.priority === 'low' || body.priority === 'high' ? body.priority : 'normal',\n deadlineAt: typeof body.deadlineAt === 'number' && Number.isFinite(body.deadlineAt) ? body.deadlineAt : undefined,\n judgeModelRef: typeof body.judgeModelRef === 'string' ? body.judgeModelRef : undefined,\n maxTurns,\n uiLocale: normalizeGoalUiLocale(body.uiLocale),\n source: body.source === 'cli' || body.source === 'cron' || body.source === 'workflow' || body.source === 'channel' || body.source === 'api'\n ? body.source\n : 'chat',\n config: cfg(),\n });\n\n goals.setContextMessage({\n goalId: goal.id,\n text: contextMessage.text,\n attachments: preparedContextAttachments,\n });\n\n return c.json({ ok: true, goal: goals.get(goal.id) });\n });\n\n authenticated.get('/api/goals/:goalId/workflow-runs', async (c) => {\n const goalId = c.req.param('goalId');\n const goal = goals.get(goalId);\n if (!goal) return c.json({ ok: false, error: 'Goal not found' }, 404);\n const runStore = workflowRunService.createRunStore(goal.agentId || getDefaultAgentId(cfg()));\n const runs = await runStore.listRunSummariesForGoal(goalId, parseLimit(c.req.query('limit')));\n return c.json({ ok: true, runs });\n });\n\n authenticated.post('/api/goals/:goalId/workflows/run', async (c) => {\n const goalId = c.req.param('goalId');\n const goal = goals.get(goalId);\n if (!goal) return c.json({ ok: false, error: 'Goal not found' }, 404);\n if (goal.status === 'done' || goal.status === 'archived') {\n return c.json({ ok: false, error: `Goal is ${goal.status}` }, 409);\n }\n\n const body = (await c.req.json().catch(() => ({}))) as Record<string, unknown>;\n const definitionId = typeof body.definitionId === 'string' ? body.definitionId.trim() : '';\n if (!definitionId) return c.json({ ok: false, error: 'Missing definitionId' }, 400);\n\n try {\n createWorkflowCatalog().load(definitionId);\n } catch {\n return c.json({ ok: false, error: 'Workflow definition not found' }, 404);\n }\n\n const result = await workflowRunService.startWorkflowRun({\n agentId: goal.agentId || getDefaultAgentId(cfg()),\n definitionId,\n goalId,\n goal: typeof body.goal === 'string' && body.goal.trim() ? body.goal.trim() : goal.nextAction || goal.title,\n input: body.input ?? {\n goal: goal.title,\n description: goal.description,\n nextAction: goal.nextAction,\n checklist: goal.checklist.map((item) => ({\n text: item.text,\n status: item.status,\n evidenceSummary: item.evidenceSummary,\n })),\n },\n parentSessionKey: goal.activeSessionKey,\n source: { kind: 'webui' },\n concurrency: typeof body.concurrency === 'number' ? body.concurrency : undefined,\n maxSubagents: typeof body.maxSubagents === 'number' ? body.maxSubagents : undefined,\n });\n if (result.ok === false) {\n return c.json({ ok: false, error: result.message, code: result.code }, result.httpStatus);\n }\n return c.json({ ok: true, runId: result.runId, sessionKey: result.sessionKey }, 202);\n });\n\n authenticated.get('/api/goals/:goalId/activity', async (c) => {\n const goalId = c.req.param('goalId');\n const goal = goals.get(goalId);\n if (!goal) return c.json({ ok: false, error: 'Goal not found' }, 404);\n\n const limit = parseLimit(c.req.query('limit'), 100);\n const runStore = workflowRunService.createRunStore(goal.agentId || getDefaultAgentId(cfg()));\n const workflowRuns = await runStore.listRunSummariesForGoal(goalId, limit);\n const activities = buildGoalActivities({\n goalId,\n queue: deps.service.getGoalQueueSnapshot(),\n runs: goals.listRuns(goalId, limit),\n workflowRuns,\n events: goals.listEvents(goalId, limit),\n evidence: goals.listEvidence(goalId, limit),\n limit,\n });\n return c.json({ ok: true, activities });\n });\n\n authenticated.get('/api/goals/:goalId/workflow-suggestions', async (c) => {\n const goalId = c.req.param('goalId');\n const goal = goals.get(goalId);\n if (!goal) return c.json({ ok: false, error: 'Goal not found' }, 404);\n\n const runStore = workflowRunService.createRunStore(goal.agentId || getDefaultAgentId(cfg()));\n const workflowRuns = await runStore.listRunSummaries(500);\n return c.json({\n ok: true,\n suggestions: buildGoalWorkflowSuggestions({ goal, workflowRuns }),\n });\n });\n\n authenticated.get('/api/goals/:goalId', async (c) => {\n const goal = goals.get(c.req.param('goalId'));\n if (!goal) return c.json({ ok: false, error: 'Goal not found' }, 404);\n return c.json({ ok: true, goal });\n });\n\n authenticated.patch('/api/goals/:goalId', async (c) => {\n const goalId = c.req.param('goalId');\n const body = (await c.req.json().catch(() => ({}))) as Record<string, unknown>;\n const status = parseBodyGoalStatus(body.status);\n let goal = goals.get(goalId);\n if (!goal) return c.json({ ok: false, error: 'Goal not found' }, 404);\n const patch: Parameters<GoalService['update']>[1] = {};\n if (typeof body.title === 'string') patch.title = body.title;\n if ('description' in body) patch.description = typeof body.description === 'string' ? body.description : undefined;\n const priority = parsePriority(body.priority);\n if (priority) patch.priority = priority;\n if ('deadlineAt' in body) {\n patch.deadlineAt = typeof body.deadlineAt === 'number' && Number.isFinite(body.deadlineAt) ? body.deadlineAt : undefined;\n }\n if (typeof body.maxTurns === 'number' && Number.isFinite(body.maxTurns)) patch.maxTurns = body.maxTurns;\n if ('judgeModelRef' in body) patch.judgeModelRef = typeof body.judgeModelRef === 'string' ? body.judgeModelRef : undefined;\n if ('nextAction' in body) patch.nextAction = typeof body.nextAction === 'string' ? body.nextAction : undefined;\n if ('blockedReason' in body) patch.blockedReason = typeof body.blockedReason === 'string' ? body.blockedReason : undefined;\n const locale = normalizeGoalUiLocale(body.uiLocale);\n if (locale) patch.uiLocale = locale;\n if (Object.keys(patch).length > 0) {\n goal = goals.update(goalId, patch);\n }\n if (status) {\n const previousStatus = goal?.status;\n goal = goals.setStatus(goalId, status, {\n reason: typeof body.reason === 'string' ? body.reason : undefined,\n });\n const abortResult = goal && status === 'archived' ? abortActiveWebchatRunForGoal(deps, goal) : {};\n if (goal && previousStatus !== goal.status) {\n deps.service.emit('goal.status.updated', {\n goalId,\n previousStatus,\n status: goal.status,\n goal,\n });\n }\n return c.json({ ok: true, goal, ...abortResult });\n }\n return c.json({ ok: true, goal });\n });\n\n authenticated.post('/api/goals/:goalId/continue', async (c) => {\n const goalId = c.req.param('goalId');\n const body = (await c.req.json().catch(() => ({}))) as Record<string, unknown>;\n const goal = goals.get(goalId);\n if (!goal) return c.json({ ok: false, error: 'Goal not found' }, 404);\n let sessionKey =\n typeof body.sessionKey === 'string' && body.sessionKey.trim()\n ? body.sessionKey.trim()\n : goal.activeSessionKey;\n\n if (!sessionKey) {\n const agentId = goal.agentId || getDefaultAgentId(cfg());\n const peerId = `goal-${sanitizeSegment(goal.id) || Date.now()}`;\n sessionKey = buildSessionKey({\n agentId,\n source: 'webchat',\n accountId: 'default',\n peerKind: 'direct',\n peerId,\n });\n await deps.service.sessionIndexInstance.saveMessages(sessionKey, [], {\n metadata: {\n sourceChannel: 'webchat',\n sourceChatId: `default:direct:${peerId}`,\n sessionType: 'chat',\n routing: {\n agentId,\n source: 'webchat',\n accountId: 'default',\n peerKind: 'direct',\n peerId,\n },\n },\n });\n goals.attachSession(goalId, sessionKey);\n }\n\n const queued = deps.service.enqueueGoalRun(goalId, {\n userTurn: parseUserTurnInput(body.userTurn),\n maxRetries: typeof body.maxRetries === 'number' && Number.isFinite(body.maxRetries) ? body.maxRetries : undefined,\n source: 'api',\n });\n const nextGoal = goals.get(goalId);\n return c.json({ ok: true, goal: nextGoal, sessionKey, queued });\n });\n\n authenticated.post('/api/goals/:goalId/enqueue', async (c) => {\n const goalId = c.req.param('goalId');\n const body = (await c.req.json().catch(() => ({}))) as Record<string, unknown>;\n if (!goals.get(goalId)) return c.json({ ok: false, error: 'Goal not found' }, 404);\n const item = deps.service.enqueueGoalRun(goalId, {\n userTurn: parseUserTurnInput(body.userTurn),\n maxRetries: typeof body.maxRetries === 'number' && Number.isFinite(body.maxRetries) ? body.maxRetries : undefined,\n source: 'api',\n });\n return c.json({ ok: true, item });\n });\n\n authenticated.post('/api/goals/:goalId/pause', async (c) => {\n const body = (await c.req.json().catch(() => ({}))) as Record<string, unknown>;\n const before = goals.get(c.req.param('goalId'));\n const goal = goals.pause(\n c.req.param('goalId'),\n typeof body.reason === 'string' && body.reason.trim() ? body.reason.trim() : 'user-paused',\n );\n if (!goal) return c.json({ ok: false, error: 'Goal not found' }, 404);\n if (before?.status !== goal.status) {\n deps.service.emit('goal.status.updated', {\n goalId: goal.id,\n previousStatus: before?.status,\n status: goal.status,\n goal,\n });\n }\n return c.json({ ok: true, goal });\n });\n\n authenticated.post('/api/goals/:goalId/resume', async (c) => {\n const before = goals.get(c.req.param('goalId'));\n const goal = goals.resume(c.req.param('goalId'));\n if (!goal) return c.json({ ok: false, error: 'Goal not found' }, 404);\n if (before?.status !== goal.status) {\n deps.service.emit('goal.status.updated', {\n goalId: goal.id,\n previousStatus: before?.status,\n status: goal.status,\n goal,\n });\n }\n return c.json({ ok: true, goal });\n });\n\n authenticated.post('/api/goals/:goalId/reopen', async (c) => {\n const before = goals.get(c.req.param('goalId'));\n const goal = goals.reopen(c.req.param('goalId'));\n if (!goal) return c.json({ ok: false, error: 'Goal not found' }, 404);\n if (before?.status !== goal.status) {\n deps.service.emit('goal.status.updated', {\n goalId: goal.id,\n previousStatus: before?.status,\n status: goal.status,\n goal,\n });\n }\n return c.json({ ok: true, goal });\n });\n\n authenticated.post('/api/goals/:goalId/complete', async (c) => {\n const before = goals.get(c.req.param('goalId'));\n const goal = goals.complete(c.req.param('goalId'));\n if (!goal) return c.json({ ok: false, error: 'Goal not found' }, 404);\n if (before?.status !== goal.status) {\n deps.service.emit('goal.status.updated', {\n goalId: goal.id,\n previousStatus: before?.status,\n status: goal.status,\n goal,\n });\n }\n return c.json({ ok: true, goal });\n });\n\n authenticated.post('/api/goals/:goalId/archive', async (c) => {\n const before = goals.get(c.req.param('goalId'));\n const goal = goals.archive(c.req.param('goalId'));\n if (!goal) return c.json({ ok: false, error: 'Goal not found' }, 404);\n const abortResult = abortActiveWebchatRunForGoal(deps, goal);\n if (before?.status !== goal.status) {\n deps.service.emit('goal.status.updated', {\n goalId: goal.id,\n previousStatus: before?.status,\n status: goal.status,\n goal,\n });\n }\n return c.json({ ok: true, goal, ...abortResult });\n });\n\n authenticated.post('/api/goals/:goalId/unarchive', async (c) => {\n const before = goals.get(c.req.param('goalId'));\n const goal = goals.unarchive(c.req.param('goalId'));\n if (!goal) return c.json({ ok: false, error: 'Goal not found' }, 404);\n if (before?.status !== goal.status) {\n deps.service.emit('goal.status.updated', {\n goalId: goal.id,\n previousStatus: before?.status,\n status: goal.status,\n goal,\n });\n }\n return c.json({ ok: true, goal });\n });\n\n authenticated.post('/api/goals/:goalId/attach', async (c) => {\n const goalId = c.req.param('goalId');\n const body = (await c.req.json().catch(() => ({}))) as Record<string, unknown>;\n const sessionKey = typeof body.sessionKey === 'string' ? body.sessionKey.trim() : '';\n if (!sessionKey) return c.json({ ok: false, error: 'Missing sessionKey' }, 400);\n const goal = goals.attachSession(goalId, sessionKey);\n if (!goal) return c.json({ ok: false, error: 'Goal not found' }, 404);\n return c.json({ ok: true, goal });\n });\n\n authenticated.post('/api/goals/:goalId/detach', async (c) => {\n const goal = goals.update(c.req.param('goalId'), { activeSessionKey: undefined });\n if (!goal) return c.json({ ok: false, error: 'Goal not found' }, 404);\n return c.json({ ok: true, goal });\n });\n\n authenticated.get('/api/goals/:goalId/runs', async (c) => {\n const goalId = c.req.param('goalId');\n if (!goals.get(goalId)) return c.json({ ok: false, error: 'Goal not found' }, 404);\n return c.json({ ok: true, runs: goals.listRuns(goalId, parseLimit(c.req.query('limit'))) });\n });\n\n authenticated.get('/api/goals/:goalId/events', async (c) => {\n const goalId = c.req.param('goalId');\n if (!goals.get(goalId)) return c.json({ ok: false, error: 'Goal not found' }, 404);\n return c.json({ ok: true, events: goals.listEvents(goalId, parseLimit(c.req.query('limit'), 100)) });\n });\n\n authenticated.get('/api/goals/:goalId/evidence', async (c) => {\n const goalId = c.req.param('goalId');\n if (!goals.get(goalId)) return c.json({ ok: false, error: 'Goal not found' }, 404);\n return c.json({ ok: true, evidence: goals.listEvidence(goalId, parseLimit(c.req.query('limit'), 100)) });\n });\n\n authenticated.post('/api/goals/:goalId/evidence', async (c) => {\n const goalId = c.req.param('goalId');\n if (!goals.get(goalId)) return c.json({ ok: false, error: 'Goal not found' }, 404);\n const body = (await c.req.json().catch(() => ({}))) as Record<string, unknown>;\n const title = typeof body.title === 'string' ? body.title.trim() : '';\n const kind = body.kind;\n if (!title) return c.json({ ok: false, error: 'Missing title' }, 400);\n if (kind !== 'file' && kind !== 'diff' && kind !== 'command' && kind !== 'test' && kind !== 'link' && kind !== 'message' && kind !== 'artifact') {\n return c.json({ ok: false, error: 'Invalid evidence kind' }, 400);\n }\n const evidence = goals.addEvidence({\n goalId,\n runId: typeof body.runId === 'string' ? body.runId : undefined,\n kind,\n title,\n summary: typeof body.summary === 'string' ? body.summary : undefined,\n uri: typeof body.uri === 'string' ? body.uri : undefined,\n data: body.data,\n });\n return c.json({ ok: true, evidence });\n });\n\n authenticated.post('/api/goals/:goalId/checklist', async (c) => {\n const goalId = c.req.param('goalId');\n if (!goals.get(goalId)) return c.json({ ok: false, error: 'Goal not found' }, 404);\n const body = (await c.req.json().catch(() => ({}))) as Record<string, unknown>;\n const text = typeof body.text === 'string' ? body.text.trim() : '';\n if (!text) return c.json({ ok: false, error: 'Missing text' }, 400);\n const goal = goals.updateChecklist(goalId, { type: 'add', text, addedBy: 'user' });\n return c.json({ ok: true, goal });\n });\n\n authenticated.patch('/api/goals/:goalId/checklist/:itemId', async (c) => {\n const goalId = c.req.param('goalId');\n const itemId = c.req.param('itemId');\n if (!goals.get(goalId)) return c.json({ ok: false, error: 'Goal not found' }, 404);\n const body = (await c.req.json().catch(() => ({}))) as Record<string, unknown>;\n const status = body.status;\n if (status !== 'pending' && status !== 'completed' && status !== 'impossible') {\n return c.json({ ok: false, error: 'Invalid checklist status' }, 400);\n }\n const goal = goals.updateChecklist(goalId, {\n type: 'mark',\n itemId,\n status,\n evidenceSummary: typeof body.evidenceSummary === 'string' ? body.evidenceSummary : undefined,\n });\n return c.json({ ok: true, goal });\n });\n\n authenticated.delete('/api/goals/:goalId/checklist/:itemId', async (c) => {\n const goalId = c.req.param('goalId');\n if (!goals.get(goalId)) return c.json({ ok: false, error: 'Goal not found' }, 404);\n const goal = goals.updateChecklist(goalId, { type: 'remove', itemId: c.req.param('itemId') });\n return c.json({ ok: true, goal });\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"goals.js","names":[],"sources":["../../../../../src/gateway/hono/routes/goals.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport { createWorkflowCatalog } from '../../../agent/workflow/catalog.js';\nimport {\n GoalService,\n normalizeGoalUiLocale,\n type GoalChecklistItem,\n type GoalEvent,\n type GoalEvidence,\n type GoalQueueItemSnapshot,\n type GoalRun,\n type GoalStatus,\n} from '../../../goals/index.js';\nimport { resolveProjectAgentId } from '../../../projects/index.js';\nimport { buildSessionKey, sanitizeSegment } from '../../../routing/session-key.js';\nimport { getDefaultAgentId } from '../../../routing/resolve-route.js';\nimport type { WorkflowRunSummary } from '../../../workflows/domain/index.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\nimport { MAX_CHAT_ATTACHMENTS, MAX_WEBCHAT_ATTACHMENT_FILE_BYTES } from '../../chat-limits.js';\nimport type { UserTurnAttachment, UserTurnInput } from '../../user-turn-input.js';\n\nfunction parseLimit(raw: string | undefined, fallback = 50): number {\n if (!raw) return fallback;\n const n = Number.parseInt(raw, 10);\n return Number.isFinite(n) ? Math.min(500, Math.max(1, n)) : fallback;\n}\n\nfunction parseStatuses(raw: string | undefined): GoalStatus[] | undefined {\n if (!raw?.trim()) return undefined;\n const statuses = raw\n .split(',')\n .map((s) => s.trim())\n .filter((s): s is GoalStatus =>\n s === 'active' ||\n s === 'paused' ||\n s === 'blocked' ||\n s === 'needs_input' ||\n s === 'done' ||\n s === 'archived',\n );\n return statuses.length ? statuses : undefined;\n}\n\nfunction parseBodyGoalStatus(raw: unknown): GoalStatus | null {\n return raw === 'active' ||\n raw === 'paused' ||\n raw === 'blocked' ||\n raw === 'needs_input' ||\n raw === 'done' ||\n raw === 'archived'\n ? raw\n : null;\n}\n\nfunction parsePriority(raw: unknown): 'low' | 'normal' | 'high' | undefined {\n return raw === 'low' || raw === 'normal' || raw === 'high' ? raw : undefined;\n}\n\nfunction maxBase64CharsForBinary(maxBinaryBytes: number): number {\n return 4 * Math.ceil(maxBinaryBytes / 3);\n}\n\nfunction parseUserTurnAttachment(raw: unknown): UserTurnAttachment | null {\n if (!raw || typeof raw !== 'object') return null;\n const value = raw as Record<string, unknown>;\n const type = typeof value.type === 'string' && value.type.trim() ? value.type.trim() : 'file';\n const out: UserTurnAttachment = { type };\n if (typeof value.id === 'string' && value.id.trim()) out.id = value.id.trim();\n if (typeof value.mimeType === 'string' && value.mimeType.trim()) out.mimeType = value.mimeType.trim();\n if (typeof value.data === 'string' && value.data.trim()) out.data = value.data;\n if (typeof value.uri === 'string' && value.uri.trim()) out.uri = value.uri.trim();\n if (typeof value.name === 'string' && value.name.trim()) out.name = value.name.trim();\n if (typeof value.size === 'number' && Number.isFinite(value.size)) out.size = Math.max(0, Math.floor(value.size));\n if (typeof value.workspaceRelativePath === 'string' && value.workspaceRelativePath.trim()) {\n out.workspaceRelativePath = value.workspaceRelativePath.trim();\n }\n if (typeof value.durationSeconds === 'number' && Number.isFinite(value.durationSeconds)) {\n out.durationSeconds = value.durationSeconds;\n }\n return out.data || out.uri ? out : null;\n}\n\nfunction parseUserTurnInput(raw: unknown): UserTurnInput | undefined {\n if (!raw || typeof raw !== 'object') return undefined;\n const value = raw as Record<string, unknown>;\n const text = typeof value.text === 'string' ? value.text.trim() : '';\n const attachments = Array.isArray(value.attachments)\n ? value.attachments.map(parseUserTurnAttachment).filter((item): item is UserTurnAttachment => item !== null)\n : undefined;\n if (!text && !attachments?.length) return undefined;\n return { text, ...(attachments?.length ? { attachments } : {}) };\n}\n\nfunction validateUserTurnAttachments(attachments: UserTurnAttachment[] | undefined): string | null {\n if (!attachments?.length) return null;\n if (attachments.length > MAX_CHAT_ATTACHMENTS) {\n return `Too many attachments (max ${MAX_CHAT_ATTACHMENTS})`;\n }\n const maxDataChars = maxBase64CharsForBinary(MAX_WEBCHAT_ATTACHMENT_FILE_BYTES);\n for (const attachment of attachments) {\n if (attachment.data && attachment.data.length > maxDataChars) {\n return `Attachment exceeds maximum size (${MAX_WEBCHAT_ATTACHMENT_FILE_BYTES} bytes)`;\n }\n }\n return null;\n}\n\ntype GoalActivityItem = {\n id: string;\n kind: 'queue' | 'goal_run' | 'workflow_run' | 'event' | 'evidence';\n status?: string;\n title: string;\n summary?: string;\n createdAt: number;\n link?: { type: 'chat' | 'workflow_run'; value: string };\n data?: unknown;\n};\n\ntype GoalWorkflowSuggestion = {\n definitionId: string;\n name: string;\n title: string;\n description: string;\n score: number;\n reasons: string[];\n tags: string[];\n successRate?: number;\n lastRunStatus?: WorkflowRunSummary['status'];\n};\n\nconst STOP_WORDS = new Set([\n 'a',\n 'an',\n 'and',\n 'are',\n 'as',\n 'for',\n 'in',\n 'is',\n 'of',\n 'on',\n 'or',\n 'the',\n 'to',\n 'with',\n '一个',\n '这个',\n '需要',\n '进行',\n '推进',\n]);\n\nfunction tokenizeForWorkflowMatch(text: string): string[] {\n const normalized = text.toLowerCase();\n const tokens = normalized.match(/[\\p{L}\\p{N}_-]+/gu) ?? [];\n return tokens\n .map((token) => token.trim())\n .filter((token) => token.length >= 2 && !STOP_WORDS.has(token));\n}\n\nfunction goalSearchText(goal: NonNullable<ReturnType<GoalService['get']>>): string {\n return [\n goal.title,\n goal.description,\n goal.nextAction,\n goal.blockedReason,\n ...goal.checklist.map((item: GoalChecklistItem) => `${item.text} ${item.evidenceSummary ?? ''}`),\n ].filter(Boolean).join('\\n');\n}\n\nfunction buildGoalWorkflowSuggestions(params: {\n goal: NonNullable<ReturnType<GoalService['get']>>;\n workflowRuns: WorkflowRunSummary[];\n}): GoalWorkflowSuggestion[] {\n const goalTokens = new Set(tokenizeForWorkflowMatch(goalSearchText(params.goal)));\n const runsByDefinition = new Map<string, WorkflowRunSummary[]>();\n for (const run of params.workflowRuns) {\n const list = runsByDefinition.get(run.definitionId) ?? [];\n list.push(run);\n runsByDefinition.set(run.definitionId, list);\n }\n\n const suggestions: GoalWorkflowSuggestion[] = [];\n for (const entry of createWorkflowCatalog().list()) {\n const candidateText = [\n entry.name,\n entry.title,\n entry.description,\n entry.whenToUse,\n ...(entry.tags ?? []),\n ].filter(Boolean).join('\\n');\n const candidateTokens = new Set(tokenizeForWorkflowMatch(candidateText));\n const matched = [...goalTokens].filter((token) => candidateTokens.has(token));\n const relatedRuns = runsByDefinition.get(entry.name) ?? [];\n const terminalRuns = relatedRuns.filter((run) => run.status !== 'queued' && run.status !== 'running');\n const succeededRuns = terminalRuns.filter((run) => run.status === 'succeeded');\n const successRate = terminalRuns.length ? succeededRuns.length / terminalRuns.length : undefined;\n const lastRun = relatedRuns.toSorted((left, right) => right.createdAtMs - left.createdAtMs)[0];\n\n let score = matched.length * 8;\n if (entry.tags?.some((tag) => goalTokens.has(tag.toLowerCase()))) score += 8;\n if (entry.whenToUse && matched.length > 0) score += 4;\n if (successRate != null) score += Math.round(successRate * 10);\n if (lastRun?.status === 'succeeded') score += 4;\n if (lastRun?.status === 'failed' || lastRun?.status === 'timeout') score -= 3;\n if (score <= 0) score = entry.source === 'builtin' ? 1 : 0;\n\n const reasons: string[] = [];\n if (matched.length) reasons.push(`matches ${matched.slice(0, 4).join(', ')}`);\n if (successRate != null) reasons.push(`${Math.round(successRate * 100)}% success rate`);\n if (lastRun) reasons.push(`last run ${lastRun.status}`);\n if (!reasons.length && entry.whenToUse) reasons.push('general workflow fit');\n\n if (score > 0) {\n suggestions.push({\n definitionId: entry.name,\n name: entry.name,\n title: entry.title || entry.name,\n description: entry.description,\n score,\n reasons,\n tags: entry.tags ?? [],\n successRate,\n lastRunStatus: lastRun?.status,\n });\n }\n }\n\n return suggestions\n .sort((left, right) => right.score - left.score || left.name.localeCompare(right.name))\n .slice(0, 5);\n}\n\nfunction buildGoalActivities(input: {\n goalId: string;\n queue: GoalQueueItemSnapshot[];\n runs: GoalRun[];\n workflowRuns: WorkflowRunSummary[];\n events: GoalEvent[];\n evidence: GoalEvidence[];\n limit: number;\n}): GoalActivityItem[] {\n const activities: GoalActivityItem[] = [];\n\n for (const item of input.queue.filter((queueItem) => queueItem.goalId === input.goalId)) {\n activities.push({\n id: `queue:${item.id}`,\n kind: 'queue',\n status: item.status,\n title: 'Goal queued',\n summary: item.lastError || item.userTurn?.text || undefined,\n createdAt: item.finishedAt ?? item.startedAt ?? item.nextRunAt ?? item.enqueuedAt,\n link: item.sessionKey ? { type: 'chat', value: item.sessionKey } : undefined,\n data: item,\n });\n }\n\n for (const run of input.runs) {\n activities.push({\n id: `goal_run:${run.id}`,\n kind: 'goal_run',\n status: run.verdict ?? run.status,\n title: 'Goal run judged',\n summary: run.reason || run.assistantPreview || run.nextAction,\n createdAt: run.finishedAt ?? run.startedAt,\n data: run,\n });\n }\n\n for (const run of input.workflowRuns) {\n activities.push({\n id: `workflow_run:${run.id}`,\n kind: 'workflow_run',\n status: run.status,\n title: run.title || run.definitionId,\n summary: run.definitionId,\n createdAt: run.completedAtMs ?? run.startedAtMs ?? run.createdAtMs,\n link: { type: 'workflow_run', value: run.id },\n data: run,\n });\n }\n\n for (const event of input.events) {\n activities.push({\n id: `event:${event.id}`,\n kind: 'event',\n status: event.kind,\n title: event.kind,\n summary: event.message,\n createdAt: event.createdAt,\n data: event,\n });\n }\n\n for (const item of input.evidence) {\n activities.push({\n id: `evidence:${item.id}`,\n kind: 'evidence',\n status: item.kind,\n title: item.title,\n summary: item.summary || item.uri,\n createdAt: item.createdAt,\n data: item,\n });\n }\n\n return activities\n .sort((left, right) => right.createdAt - left.createdAt)\n .slice(0, input.limit);\n}\n\nfunction abortActiveWebchatRunForGoal(\n deps: AuthenticatedRouteDeps,\n goal: NonNullable<ReturnType<GoalService['get']>>,\n): { aborted?: boolean; abortedRunId?: string } {\n const sessionKey = goal.activeSessionKey?.trim();\n if (!sessionKey) return {};\n const runId = deps.service.getActiveWebchatRunId(sessionKey);\n if (!runId) return {};\n return {\n abortedRunId: runId,\n aborted: deps.service.abortAgentRun(runId),\n };\n}\n\n/** First-class Goal API. Sessions are execution context; goals are durable product objects. */\nexport function registerGoalsRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const goals = new GoalService();\n const cfg = () => deps.service.currentConfig;\n const workflowRunService = deps.service.createWorkflowRunService();\n\n authenticated.get('/api/goals/current', async (c) => {\n const sessionKey = c.req.query('sessionKey')?.trim();\n if (!sessionKey) return c.json({ ok: false, error: 'Missing sessionKey' }, 400);\n return c.json({ ok: true, goal: goals.getActiveForSession(sessionKey) });\n });\n\n authenticated.get('/api/goals', async (c) => {\n const status = parseStatuses(c.req.query('status'));\n const agentId = c.req.query('agentId')?.trim() || undefined;\n const sessionKey = c.req.query('sessionKey')?.trim() || undefined;\n const limit = parseLimit(c.req.query('limit'));\n const offsetRaw = c.req.query('offset')?.trim();\n const offset = offsetRaw ? Math.max(0, Number.parseInt(offsetRaw, 10) || 0) : 0;\n const projectId = c.req.query('projectId')?.trim() || undefined;\n return c.json({ ok: true, goals: goals.list({ status, agentId, sessionKey, projectId, limit, offset }) });\n });\n\n authenticated.get('/api/goals/queue', async (c) => {\n return c.json({ ok: true, queue: deps.service.getGoalQueueSnapshot() });\n });\n\n authenticated.post('/api/goals', async (c) => {\n const body = (await c.req.json().catch(() => ({}))) as Record<string, unknown>;\n const title = typeof body.title === 'string' ? body.title.trim() : '';\n if (!title) return c.json({ ok: false, error: 'Missing title' }, 400);\n\n const sessionKey = typeof body.sessionKey === 'string' && body.sessionKey.trim() ? body.sessionKey.trim() : undefined;\n const contextMessage = parseUserTurnInput(body.contextMessage) ?? { text: '' };\n const attachmentError = validateUserTurnAttachments(contextMessage.attachments);\n if (attachmentError) return c.json({ ok: false, error: attachmentError }, 400);\n const preparedContextAttachments = contextMessage.attachments?.length\n ? await deps.service.agentService.prepareInboundAttachments(sessionKey ?? `goal:${Date.now()}`, contextMessage.attachments)\n : undefined;\n const projectId = typeof body.projectId === 'string' && body.projectId.trim() ? body.projectId.trim() : undefined;\n if (projectId && !deps.service.projects.get(projectId)) {\n return c.json({ ok: false, error: 'Project not found' }, 404);\n }\n const agentId = sessionKey\n ? (typeof body.agentId === 'string' && body.agentId.trim() ? body.agentId.trim() : undefined)\n : resolveProjectAgentId({\n config: cfg(),\n projects: deps.service.projects,\n explicitAgentId: typeof body.agentId === 'string' ? body.agentId : undefined,\n projectId,\n });\n const maxTurns =\n typeof body.maxTurns === 'number' && Number.isFinite(body.maxTurns)\n ? Math.max(1, Math.min(500, Math.floor(body.maxTurns)))\n : undefined;\n const goal = goals.create({\n title,\n description: contextMessage.text || undefined,\n sessionKey,\n agentId,\n priority: body.priority === 'low' || body.priority === 'high' ? body.priority : 'normal',\n deadlineAt: typeof body.deadlineAt === 'number' && Number.isFinite(body.deadlineAt) ? body.deadlineAt : undefined,\n judgeModelRef: typeof body.judgeModelRef === 'string' ? body.judgeModelRef : undefined,\n maxTurns,\n uiLocale: normalizeGoalUiLocale(body.uiLocale),\n source: body.source === 'cli' || body.source === 'cron' || body.source === 'workflow' || body.source === 'channel' || body.source === 'api'\n ? body.source\n : 'chat',\n projectId,\n config: cfg(),\n });\n\n goals.setContextMessage({\n goalId: goal.id,\n text: contextMessage.text,\n attachments: preparedContextAttachments,\n });\n\n return c.json({ ok: true, goal: goals.get(goal.id) });\n });\n\n authenticated.get('/api/goals/:goalId/workflow-runs', async (c) => {\n const goalId = c.req.param('goalId');\n const goal = goals.get(goalId);\n if (!goal) return c.json({ ok: false, error: 'Goal not found' }, 404);\n const runStore = workflowRunService.createRunStore(goal.agentId || getDefaultAgentId(cfg()));\n const runs = await runStore.listRunSummariesForGoal(goalId, parseLimit(c.req.query('limit')));\n return c.json({ ok: true, runs });\n });\n\n authenticated.post('/api/goals/:goalId/workflows/run', async (c) => {\n const goalId = c.req.param('goalId');\n const goal = goals.get(goalId);\n if (!goal) return c.json({ ok: false, error: 'Goal not found' }, 404);\n if (goal.status === 'done' || goal.status === 'archived') {\n return c.json({ ok: false, error: `Goal is ${goal.status}` }, 409);\n }\n\n const body = (await c.req.json().catch(() => ({}))) as Record<string, unknown>;\n const definitionId = typeof body.definitionId === 'string' ? body.definitionId.trim() : '';\n if (!definitionId) return c.json({ ok: false, error: 'Missing definitionId' }, 400);\n\n try {\n createWorkflowCatalog().load(definitionId);\n } catch {\n return c.json({ ok: false, error: 'Workflow definition not found' }, 404);\n }\n\n const result = await workflowRunService.startWorkflowRun({\n agentId: goal.agentId || getDefaultAgentId(cfg()),\n definitionId,\n goalId,\n goal: typeof body.goal === 'string' && body.goal.trim() ? body.goal.trim() : goal.nextAction || goal.title,\n input: body.input ?? {\n goal: goal.title,\n description: goal.description,\n nextAction: goal.nextAction,\n checklist: goal.checklist.map((item) => ({\n text: item.text,\n status: item.status,\n evidenceSummary: item.evidenceSummary,\n })),\n },\n parentSessionKey: goal.activeSessionKey,\n source: { kind: 'webui' },\n concurrency: typeof body.concurrency === 'number' ? body.concurrency : undefined,\n maxSubagents: typeof body.maxSubagents === 'number' ? body.maxSubagents : undefined,\n });\n if (result.ok === false) {\n return c.json({ ok: false, error: result.message, code: result.code }, result.httpStatus);\n }\n return c.json({ ok: true, runId: result.runId, sessionKey: result.sessionKey }, 202);\n });\n\n authenticated.get('/api/goals/:goalId/activity', async (c) => {\n const goalId = c.req.param('goalId');\n const goal = goals.get(goalId);\n if (!goal) return c.json({ ok: false, error: 'Goal not found' }, 404);\n\n const limit = parseLimit(c.req.query('limit'), 100);\n const runStore = workflowRunService.createRunStore(goal.agentId || getDefaultAgentId(cfg()));\n const workflowRuns = await runStore.listRunSummariesForGoal(goalId, limit);\n const activities = buildGoalActivities({\n goalId,\n queue: deps.service.getGoalQueueSnapshot(),\n runs: goals.listRuns(goalId, limit),\n workflowRuns,\n events: goals.listEvents(goalId, limit),\n evidence: goals.listEvidence(goalId, limit),\n limit,\n });\n return c.json({ ok: true, activities });\n });\n\n authenticated.get('/api/goals/:goalId/workflow-suggestions', async (c) => {\n const goalId = c.req.param('goalId');\n const goal = goals.get(goalId);\n if (!goal) return c.json({ ok: false, error: 'Goal not found' }, 404);\n\n const runStore = workflowRunService.createRunStore(goal.agentId || getDefaultAgentId(cfg()));\n const workflowRuns = await runStore.listRunSummaries(500);\n return c.json({\n ok: true,\n suggestions: buildGoalWorkflowSuggestions({ goal, workflowRuns }),\n });\n });\n\n authenticated.get('/api/goals/:goalId', async (c) => {\n const goal = goals.get(c.req.param('goalId'));\n if (!goal) return c.json({ ok: false, error: 'Goal not found' }, 404);\n return c.json({ ok: true, goal });\n });\n\n authenticated.patch('/api/goals/:goalId', async (c) => {\n const goalId = c.req.param('goalId');\n const body = (await c.req.json().catch(() => ({}))) as Record<string, unknown>;\n const status = parseBodyGoalStatus(body.status);\n let goal = goals.get(goalId);\n if (!goal) return c.json({ ok: false, error: 'Goal not found' }, 404);\n const patch: Parameters<GoalService['update']>[1] = {};\n if (typeof body.title === 'string') patch.title = body.title;\n if ('description' in body) patch.description = typeof body.description === 'string' ? body.description : undefined;\n const priority = parsePriority(body.priority);\n if (priority) patch.priority = priority;\n if ('deadlineAt' in body) {\n patch.deadlineAt = typeof body.deadlineAt === 'number' && Number.isFinite(body.deadlineAt) ? body.deadlineAt : undefined;\n }\n if (typeof body.maxTurns === 'number' && Number.isFinite(body.maxTurns)) patch.maxTurns = body.maxTurns;\n if ('judgeModelRef' in body) patch.judgeModelRef = typeof body.judgeModelRef === 'string' ? body.judgeModelRef : undefined;\n if ('nextAction' in body) patch.nextAction = typeof body.nextAction === 'string' ? body.nextAction : undefined;\n if ('blockedReason' in body) patch.blockedReason = typeof body.blockedReason === 'string' ? body.blockedReason : undefined;\n if ('projectId' in body) {\n const nextProjectId = typeof body.projectId === 'string' && body.projectId.trim() ? body.projectId.trim() : undefined;\n if (nextProjectId && !deps.service.projects.get(nextProjectId)) {\n return c.json({ ok: false, error: 'Project not found' }, 404);\n }\n patch.projectId = nextProjectId;\n }\n const locale = normalizeGoalUiLocale(body.uiLocale);\n if (locale) patch.uiLocale = locale;\n if (Object.keys(patch).length > 0) {\n goal = goals.update(goalId, patch);\n }\n if (status) {\n const previousStatus = goal?.status;\n goal = goals.setStatus(goalId, status, {\n reason: typeof body.reason === 'string' ? body.reason : undefined,\n });\n const abortResult = goal && status === 'archived' ? abortActiveWebchatRunForGoal(deps, goal) : {};\n if (goal && previousStatus !== goal.status) {\n deps.service.emit('goal.status.updated', {\n goalId,\n previousStatus,\n status: goal.status,\n goal,\n });\n }\n return c.json({ ok: true, goal, ...abortResult });\n }\n return c.json({ ok: true, goal });\n });\n\n authenticated.post('/api/goals/:goalId/continue', async (c) => {\n const goalId = c.req.param('goalId');\n const body = (await c.req.json().catch(() => ({}))) as Record<string, unknown>;\n const goal = goals.get(goalId);\n if (!goal) return c.json({ ok: false, error: 'Goal not found' }, 404);\n let sessionKey =\n typeof body.sessionKey === 'string' && body.sessionKey.trim()\n ? body.sessionKey.trim()\n : goal.activeSessionKey;\n\n if (!sessionKey) {\n const agentId = goal.agentId || getDefaultAgentId(cfg());\n const peerId = `goal-${sanitizeSegment(goal.id) || Date.now()}`;\n sessionKey = buildSessionKey({\n agentId,\n source: 'webchat',\n accountId: 'default',\n peerKind: 'direct',\n peerId,\n });\n await deps.service.sessionIndexInstance.saveMessages(sessionKey, [], {\n metadata: {\n sourceChannel: 'webchat',\n sourceChatId: `default:direct:${peerId}`,\n sessionType: 'chat',\n routing: {\n agentId,\n source: 'webchat',\n accountId: 'default',\n peerKind: 'direct',\n peerId,\n },\n },\n });\n if (goal.projectId) {\n try {\n deps.service.projects.attachSession(sessionKey, goal.projectId);\n } catch {\n return c.json({ ok: false, error: 'Session not found' }, 404);\n }\n }\n goals.attachSession(goalId, sessionKey);\n } else if (goal.projectId) {\n try {\n deps.service.projects.attachSession(sessionKey, goal.projectId);\n } catch {\n return c.json({ ok: false, error: 'Session not found' }, 404);\n }\n }\n\n const queued = deps.service.enqueueGoalRun(goalId, {\n userTurn: parseUserTurnInput(body.userTurn),\n maxRetries: typeof body.maxRetries === 'number' && Number.isFinite(body.maxRetries) ? body.maxRetries : undefined,\n source: 'api',\n });\n const nextGoal = goals.get(goalId);\n return c.json({ ok: true, goal: nextGoal, sessionKey, queued });\n });\n\n authenticated.post('/api/goals/:goalId/enqueue', async (c) => {\n const goalId = c.req.param('goalId');\n const body = (await c.req.json().catch(() => ({}))) as Record<string, unknown>;\n if (!goals.get(goalId)) return c.json({ ok: false, error: 'Goal not found' }, 404);\n const item = deps.service.enqueueGoalRun(goalId, {\n userTurn: parseUserTurnInput(body.userTurn),\n maxRetries: typeof body.maxRetries === 'number' && Number.isFinite(body.maxRetries) ? body.maxRetries : undefined,\n source: 'api',\n });\n return c.json({ ok: true, item });\n });\n\n authenticated.post('/api/goals/:goalId/pause', async (c) => {\n const body = (await c.req.json().catch(() => ({}))) as Record<string, unknown>;\n const before = goals.get(c.req.param('goalId'));\n const goal = goals.pause(\n c.req.param('goalId'),\n typeof body.reason === 'string' && body.reason.trim() ? body.reason.trim() : 'user-paused',\n );\n if (!goal) return c.json({ ok: false, error: 'Goal not found' }, 404);\n if (before?.status !== goal.status) {\n deps.service.emit('goal.status.updated', {\n goalId: goal.id,\n previousStatus: before?.status,\n status: goal.status,\n goal,\n });\n }\n return c.json({ ok: true, goal });\n });\n\n authenticated.post('/api/goals/:goalId/resume', async (c) => {\n const before = goals.get(c.req.param('goalId'));\n const goal = goals.resume(c.req.param('goalId'));\n if (!goal) return c.json({ ok: false, error: 'Goal not found' }, 404);\n if (before?.status !== goal.status) {\n deps.service.emit('goal.status.updated', {\n goalId: goal.id,\n previousStatus: before?.status,\n status: goal.status,\n goal,\n });\n }\n return c.json({ ok: true, goal });\n });\n\n authenticated.post('/api/goals/:goalId/reopen', async (c) => {\n const before = goals.get(c.req.param('goalId'));\n const goal = goals.reopen(c.req.param('goalId'));\n if (!goal) return c.json({ ok: false, error: 'Goal not found' }, 404);\n if (before?.status !== goal.status) {\n deps.service.emit('goal.status.updated', {\n goalId: goal.id,\n previousStatus: before?.status,\n status: goal.status,\n goal,\n });\n }\n return c.json({ ok: true, goal });\n });\n\n authenticated.post('/api/goals/:goalId/complete', async (c) => {\n const before = goals.get(c.req.param('goalId'));\n const goal = goals.complete(c.req.param('goalId'));\n if (!goal) return c.json({ ok: false, error: 'Goal not found' }, 404);\n if (before?.status !== goal.status) {\n deps.service.emit('goal.status.updated', {\n goalId: goal.id,\n previousStatus: before?.status,\n status: goal.status,\n goal,\n });\n }\n return c.json({ ok: true, goal });\n });\n\n authenticated.post('/api/goals/:goalId/archive', async (c) => {\n const before = goals.get(c.req.param('goalId'));\n const goal = goals.archive(c.req.param('goalId'));\n if (!goal) return c.json({ ok: false, error: 'Goal not found' }, 404);\n const abortResult = abortActiveWebchatRunForGoal(deps, goal);\n if (before?.status !== goal.status) {\n deps.service.emit('goal.status.updated', {\n goalId: goal.id,\n previousStatus: before?.status,\n status: goal.status,\n goal,\n });\n }\n return c.json({ ok: true, goal, ...abortResult });\n });\n\n authenticated.post('/api/goals/:goalId/unarchive', async (c) => {\n const before = goals.get(c.req.param('goalId'));\n const goal = goals.unarchive(c.req.param('goalId'));\n if (!goal) return c.json({ ok: false, error: 'Goal not found' }, 404);\n if (before?.status !== goal.status) {\n deps.service.emit('goal.status.updated', {\n goalId: goal.id,\n previousStatus: before?.status,\n status: goal.status,\n goal,\n });\n }\n return c.json({ ok: true, goal });\n });\n\n authenticated.post('/api/goals/:goalId/attach', async (c) => {\n const goalId = c.req.param('goalId');\n const body = (await c.req.json().catch(() => ({}))) as Record<string, unknown>;\n const sessionKey = typeof body.sessionKey === 'string' ? body.sessionKey.trim() : '';\n if (!sessionKey) return c.json({ ok: false, error: 'Missing sessionKey' }, 400);\n const currentGoal = goals.get(goalId);\n if (!currentGoal) return c.json({ ok: false, error: 'Goal not found' }, 404);\n if (currentGoal.projectId) {\n try {\n deps.service.projects.attachSession(sessionKey, currentGoal.projectId);\n } catch {\n return c.json({ ok: false, error: 'Session not found' }, 404);\n }\n }\n const goal = goals.attachSession(goalId, sessionKey);\n return c.json({ ok: true, goal });\n });\n\n authenticated.post('/api/goals/:goalId/detach', async (c) => {\n const goal = goals.update(c.req.param('goalId'), { activeSessionKey: undefined });\n if (!goal) return c.json({ ok: false, error: 'Goal not found' }, 404);\n return c.json({ ok: true, goal });\n });\n\n authenticated.get('/api/goals/:goalId/runs', async (c) => {\n const goalId = c.req.param('goalId');\n if (!goals.get(goalId)) return c.json({ ok: false, error: 'Goal not found' }, 404);\n return c.json({ ok: true, runs: goals.listRuns(goalId, parseLimit(c.req.query('limit'))) });\n });\n\n authenticated.get('/api/goals/:goalId/events', async (c) => {\n const goalId = c.req.param('goalId');\n if (!goals.get(goalId)) return c.json({ ok: false, error: 'Goal not found' }, 404);\n return c.json({ ok: true, events: goals.listEvents(goalId, parseLimit(c.req.query('limit'), 100)) });\n });\n\n authenticated.get('/api/goals/:goalId/evidence', async (c) => {\n const goalId = c.req.param('goalId');\n if (!goals.get(goalId)) return c.json({ ok: false, error: 'Goal not found' }, 404);\n return c.json({ ok: true, evidence: goals.listEvidence(goalId, parseLimit(c.req.query('limit'), 100)) });\n });\n\n authenticated.post('/api/goals/:goalId/evidence', async (c) => {\n const goalId = c.req.param('goalId');\n if (!goals.get(goalId)) return c.json({ ok: false, error: 'Goal not found' }, 404);\n const body = (await c.req.json().catch(() => ({}))) as Record<string, unknown>;\n const title = typeof body.title === 'string' ? body.title.trim() : '';\n const kind = body.kind;\n if (!title) return c.json({ ok: false, error: 'Missing title' }, 400);\n if (kind !== 'file' && kind !== 'diff' && kind !== 'command' && kind !== 'test' && kind !== 'link' && kind !== 'message' && kind !== 'artifact') {\n return c.json({ ok: false, error: 'Invalid evidence kind' }, 400);\n }\n const evidence = goals.addEvidence({\n goalId,\n runId: typeof body.runId === 'string' ? body.runId : undefined,\n kind,\n title,\n summary: typeof body.summary === 'string' ? body.summary : undefined,\n uri: typeof body.uri === 'string' ? body.uri : undefined,\n data: body.data,\n });\n return c.json({ ok: true, evidence });\n });\n\n authenticated.post('/api/goals/:goalId/checklist', async (c) => {\n const goalId = c.req.param('goalId');\n if (!goals.get(goalId)) return c.json({ ok: false, error: 'Goal not found' }, 404);\n const body = (await c.req.json().catch(() => ({}))) as Record<string, unknown>;\n const text = typeof body.text === 'string' ? body.text.trim() : '';\n if (!text) return c.json({ ok: false, error: 'Missing text' }, 400);\n const goal = goals.updateChecklist(goalId, { type: 'add', text, addedBy: 'user' });\n return c.json({ ok: true, goal });\n });\n\n authenticated.patch('/api/goals/:goalId/checklist/:itemId', async (c) => {\n const goalId = c.req.param('goalId');\n const itemId = c.req.param('itemId');\n if (!goals.get(goalId)) return c.json({ ok: false, error: 'Goal not found' }, 404);\n const body = (await c.req.json().catch(() => ({}))) as Record<string, unknown>;\n const status = body.status;\n if (status !== 'pending' && status !== 'completed' && status !== 'impossible') {\n return c.json({ ok: false, error: 'Invalid checklist status' }, 400);\n }\n const goal = goals.updateChecklist(goalId, {\n type: 'mark',\n itemId,\n status,\n evidenceSummary: typeof body.evidenceSummary === 'string' ? body.evidenceSummary : undefined,\n });\n return c.json({ ok: true, goal });\n });\n\n authenticated.delete('/api/goals/:goalId/checklist/:itemId', async (c) => {\n const goalId = c.req.param('goalId');\n if (!goals.get(goalId)) return c.json({ ok: false, error: 'Goal not found' }, 404);\n const goal = goals.updateChecklist(goalId, { type: 'remove', itemId: c.req.param('itemId') });\n return c.json({ ok: true, goal });\n });\n}\n"],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import { registerAgentStreamRoutes } from "./agent-stream.js";
|
|
|
2
2
|
import { registerSessionsRoutes } from "./sessions.js";
|
|
3
3
|
import { registerStatusRoutes } from "./status.js";
|
|
4
4
|
import { registerMemoryRoutes } from "./memory.js";
|
|
5
|
+
import { registerProjectsRoutes } from "./projects.js";
|
|
5
6
|
import { mountAppLazyRoutePrefixes, registerAuthenticatedLazyRouteFallback } from "./lazy-fallback.js";
|
|
6
7
|
//#region src/gateway/hono/routes/index.ts
|
|
7
8
|
function registerCoreAuthenticatedRoutes(authenticated, deps) {
|
|
@@ -9,6 +10,7 @@ function registerCoreAuthenticatedRoutes(authenticated, deps) {
|
|
|
9
10
|
registerAgentStreamRoutes(authenticated, deps);
|
|
10
11
|
registerSessionsRoutes(authenticated, deps);
|
|
11
12
|
registerMemoryRoutes(authenticated, deps);
|
|
13
|
+
registerProjectsRoutes(authenticated, deps);
|
|
12
14
|
}
|
|
13
15
|
function registerAuthenticatedRoutes(app, authenticated, deps) {
|
|
14
16
|
registerCoreAuthenticatedRoutes(authenticated, deps);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../../src/gateway/hono/routes/index.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport { registerAgentStreamRoutes } from './agent-stream.js';\nimport { registerSessionsRoutes } from './sessions.js';\nimport { registerStatusRoutes } from './status.js';\nimport { registerMemoryRoutes } from './memory.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\nimport {\n mountAppLazyRoutePrefixes,\n registerAuthenticatedLazyRouteFallback,\n} from './lazy-fallback.js';\n\nexport function registerCoreAuthenticatedRoutes(\n authenticated: Hono,\n deps: AuthenticatedRouteDeps,\n): void {\n registerStatusRoutes(authenticated, deps);\n registerAgentStreamRoutes(authenticated, deps);\n registerSessionsRoutes(authenticated, deps);\n registerMemoryRoutes(authenticated, deps);\n}\n\nexport function registerAuthenticatedRoutes(app: Hono, authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n registerCoreAuthenticatedRoutes(authenticated, deps);\n registerAuthenticatedLazyRouteFallback(authenticated, deps);\n mountAppLazyRoutePrefixes(app, { service: deps.service, deps });\n}\n\nexport type { AuthenticatedRouteDeps } from './deps.js';\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../../src/gateway/hono/routes/index.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport { registerAgentStreamRoutes } from './agent-stream.js';\nimport { registerSessionsRoutes } from './sessions.js';\nimport { registerStatusRoutes } from './status.js';\nimport { registerMemoryRoutes } from './memory.js';\nimport { registerProjectsRoutes } from './projects.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\nimport {\n mountAppLazyRoutePrefixes,\n registerAuthenticatedLazyRouteFallback,\n} from './lazy-fallback.js';\n\nexport function registerCoreAuthenticatedRoutes(\n authenticated: Hono,\n deps: AuthenticatedRouteDeps,\n): void {\n registerStatusRoutes(authenticated, deps);\n registerAgentStreamRoutes(authenticated, deps);\n registerSessionsRoutes(authenticated, deps);\n registerMemoryRoutes(authenticated, deps);\n registerProjectsRoutes(authenticated, deps);\n}\n\nexport function registerAuthenticatedRoutes(app: Hono, authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n registerCoreAuthenticatedRoutes(authenticated, deps);\n registerAuthenticatedLazyRouteFallback(authenticated, deps);\n mountAppLazyRoutePrefixes(app, { service: deps.service, deps });\n}\n\nexport type { AuthenticatedRouteDeps } from './deps.js';\n"],"mappings":";;;;;;;AAaA,SAAgB,gCACd,eACA,MACM;AACN,sBAAqB,eAAe,KAAK;AACzC,2BAA0B,eAAe,KAAK;AAC9C,wBAAuB,eAAe,KAAK;AAC3C,sBAAqB,eAAe,KAAK;AACzC,wBAAuB,eAAe,KAAK;;AAG7C,SAAgB,4BAA4B,KAAW,eAAqB,MAAoC;AAC9G,iCAAgC,eAAe,KAAK;AACpD,wCAAuC,eAAe,KAAK;AAC3D,2BAA0B,KAAK;EAAE,SAAS,KAAK;EAAS;EAAM,CAAC"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { MemoryPolicySchema, init_schema } from "../../../agent-manifest/schema.js";
|
|
2
2
|
import { init_agent_scope, resolveDefaultAgentId } from "../../../agent/agent-scope.js";
|
|
3
3
|
import { resolveEffectiveAgentManifestForAgent } from "../../../config/agent-profile.js";
|
|
4
|
-
import { resolveBuiltinMemoryStoreConfig } from "../../../agent/memory/memory-config.js";
|
|
5
4
|
import { appendMemorySignal, appendMemoryTraceEvent, deleteMemoryRecord, getMemoryRecord, listMemoryRecords, listMemorySignals, listMemoryTraceEvents, searchMemoryRecords, setMemoryTraceFeedback, summarizeMemoryRecallFeedback, upsertMemoryRecord } from "../../../storage/sqlite/memory-records-repository.js";
|
|
6
5
|
import "../../../storage/sqlite/index.js";
|
|
6
|
+
import { resolveBuiltinMemoryStoreConfig } from "../../../agent/memory/memory-config.js";
|
|
7
7
|
import { BuiltinMemoryStore } from "../../../agent/memory/builtin-memory-store.js";
|
|
8
8
|
import { discoverMemoryPlugins } from "../../../agent/memory/plugin-discovery.js";
|
|
9
9
|
import { createMemoryManagerFromConfig } from "../../../agent/memory/create-memory-manager.js";
|
|
@@ -118,6 +118,7 @@ function registerMemoryRoutes(authenticated, deps) {
|
|
|
118
118
|
providerId: c.req.query("providerId") || void 0,
|
|
119
119
|
agentId: c.req.query("agentId") || void 0,
|
|
120
120
|
workspaceId: c.req.query("workspaceId") || void 0,
|
|
121
|
+
projectId: c.req.query("projectId") || void 0,
|
|
121
122
|
kind: parseKind(c.req.query("kind")),
|
|
122
123
|
status: parseStatus(c.req.query("status")),
|
|
123
124
|
limit: parseLimit(c.req.query("limit")),
|
|
@@ -134,6 +135,7 @@ function registerMemoryRoutes(authenticated, deps) {
|
|
|
134
135
|
providerId: typeof body.providerId === "string" ? body.providerId : void 0,
|
|
135
136
|
agentId: typeof body.agentId === "string" ? body.agentId : void 0,
|
|
136
137
|
workspaceId: typeof body.workspaceId === "string" ? body.workspaceId : void 0,
|
|
138
|
+
projectId: typeof body.projectId === "string" ? body.projectId : void 0,
|
|
137
139
|
kinds: Array.isArray(body.kinds) ? body.kinds.map(parseKind).filter((v) => Boolean(v)) : void 0,
|
|
138
140
|
statuses: Array.isArray(body.statuses) ? body.statuses.map(parseStatus).filter((v) => Boolean(v)) : void 0,
|
|
139
141
|
maxResults: typeof body.maxResults === "number" ? body.maxResults : void 0,
|
|
@@ -154,6 +156,7 @@ function registerMemoryRoutes(authenticated, deps) {
|
|
|
154
156
|
agentId,
|
|
155
157
|
workspaceId: typeof body.workspaceId === "string" ? body.workspaceId : deps.service.currentWorkspacePath,
|
|
156
158
|
sessionKey: typeof body.sessionKey === "string" ? body.sessionKey : void 0,
|
|
159
|
+
projectId: typeof body.projectId === "string" ? body.projectId : void 0,
|
|
157
160
|
content,
|
|
158
161
|
source: body.source && typeof body.source === "object" ? body.source : void 0,
|
|
159
162
|
confidence: typeof body.confidence === "number" ? body.confidence : void 0,
|
|
@@ -177,6 +180,7 @@ function registerMemoryRoutes(authenticated, deps) {
|
|
|
177
180
|
agentId: existing.scope.agentId,
|
|
178
181
|
workspaceId: existing.scope.workspaceId,
|
|
179
182
|
sessionKey: existing.scope.sessionKey,
|
|
183
|
+
projectId: typeof body.projectId === "string" ? body.projectId : existing.scope.projectId,
|
|
180
184
|
content: typeof body.content === "string" ? body.content : existing.content,
|
|
181
185
|
source: body.source && typeof body.source === "object" ? body.source : existing.source,
|
|
182
186
|
confidence: typeof body.confidence === "number" ? body.confidence : existing.confidence,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.js","names":[],"sources":["../../../../../src/gateway/hono/routes/memory.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport { BuiltinMemoryStore } from '../../../agent/memory/builtin-memory-store.js';\nimport { createMemoryManagerFromConfig } from '../../../agent/memory/create-memory-manager.js';\nimport { resolveBuiltinMemoryStoreConfig } from '../../../agent/memory/memory-config.js';\nimport { discoverMemoryPlugins } from '../../../agent/memory/plugin-discovery.js';\nimport type {\n MemoryKind,\n MemorySensitivity,\n MemoryStatus,\n} from '../../../agent/memory/types.js';\nimport { MemoryPolicySchema } from '../../../agent-manifest/schema.js';\nimport { resolveDefaultAgentId } from '../../../agent/agent-scope.js';\nimport { resolveEffectiveAgentManifestForAgent } from '../../../config/agent-profile.js';\nimport type { Config } from '../../../config/schema.js';\nimport { prepareUpdateAgent } from '../../agents-admin.js';\nimport {\n appendMemorySignal,\n appendMemoryTraceEvent,\n deleteMemoryRecord,\n getMemoryRecord,\n listMemoryRecords,\n listMemorySignals,\n listMemoryTraceEvents,\n searchMemoryRecords,\n setMemoryTraceFeedback,\n summarizeMemoryRecallFeedback,\n upsertMemoryRecord,\n} from '../../../storage/sqlite/index.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\n\nconst MEMORY_KINDS = new Set<MemoryKind>([\n 'user_profile',\n 'agent_note',\n 'workspace_fact',\n 'daily_note',\n 'session_summary',\n 'derived_insight',\n 'task_lesson',\n 'tool_preference',\n 'long_term_goal',\n]);\n\nconst MEMORY_STATUSES = new Set<MemoryStatus>([\n 'candidate',\n 'active',\n 'needs_review',\n 'stale',\n 'archived',\n 'rejected',\n]);\n\nconst MEMORY_SENSITIVITIES = new Set<MemorySensitivity>([\n 'normal',\n 'personal',\n 'secret',\n 'regulated',\n]);\n\nconst MEMORY_TRACE_FEEDBACK_OUTCOMES = new Set([\n 'helpful',\n 'not_helpful',\n 'mixed',\n 'irrelevant',\n]);\n\nfunction parseLimit(raw: string | undefined, fallback = 100): number {\n const parsed = raw ? Number.parseInt(raw, 10) : fallback;\n return Number.isFinite(parsed) ? Math.max(1, Math.min(500, parsed)) : fallback;\n}\n\nfunction parseFeedbackSummaryLimit(raw: string | undefined): number {\n const parsed = raw ? Number.parseInt(raw, 10) : 1000;\n return Number.isFinite(parsed) ? Math.max(1, Math.min(5000, parsed)) : 1000;\n}\n\nfunction parseKind(raw: unknown): MemoryKind | undefined {\n return typeof raw === 'string' && MEMORY_KINDS.has(raw as MemoryKind)\n ? (raw as MemoryKind)\n : undefined;\n}\n\nfunction parseStatus(raw: unknown): MemoryStatus | undefined {\n return typeof raw === 'string' && MEMORY_STATUSES.has(raw as MemoryStatus)\n ? (raw as MemoryStatus)\n : undefined;\n}\n\nfunction parseSensitivity(raw: unknown): MemorySensitivity | undefined {\n return typeof raw === 'string' && MEMORY_SENSITIVITIES.has(raw as MemorySensitivity)\n ? (raw as MemorySensitivity)\n : undefined;\n}\n\nexport function registerMemoryRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n authenticated.get('/api/memory/providers', async (c) => {\n const cfg = deps.service.currentConfig as Config;\n const plugins = await discoverMemoryPlugins(cfg);\n return c.json({\n providers: [\n {\n id: 'local',\n displayName: 'Local Markdown Memory',\n available: true,\n configured: true,\n capabilities: {\n search: true,\n read: true,\n write: true,\n update: true,\n delete: true,\n keywordSearch: true,\n semanticSearch: false,\n hybridSearch: false,\n citations: true,\n sync: false,\n local: true,\n },\n },\n ...plugins.map((plugin) => ({\n id: plugin.manifest?.id ?? plugin.name,\n displayName: plugin.manifest?.displayName ?? plugin.name,\n available: plugin.available,\n configured: false,\n capabilities: plugin.manifest?.capabilities ?? {},\n })),\n ],\n });\n });\n\n authenticated.get('/api/memory/config', (c) => {\n const cfg = deps.service.currentConfig as Config;\n const agentId = c.req.query('agentId') || resolveDefaultAgentId(cfg);\n const manifest = resolveEffectiveAgentManifestForAgent(cfg, agentId);\n return c.json({ agentId: manifest.id, memory: manifest.memory });\n });\n\n authenticated.patch('/api/memory/config', deps.strictRateLimitMiddleware, async (c) => {\n const cfg = deps.service.currentConfig as Config;\n const body = await c.req.json().catch(() => ({}));\n const agentId = typeof body.agentId === 'string' && body.agentId.trim()\n ? body.agentId.trim()\n : resolveDefaultAgentId(cfg);\n const parsed = MemoryPolicySchema.safeParse(body.memory);\n if (!parsed.success) {\n return c.json({ error: `memory ${parsed.error.issues[0]?.message ?? 'is invalid'}` }, 400);\n }\n const prep = prepareUpdateAgent(cfg, agentId, { memory: parsed.data });\n if (prep.ok === false) {\n return c.json({ error: prep.error }, prep.status ?? 400);\n }\n const save = await deps.service.saveConfig(prep.data.nextConfig);\n if (!save.saved) return c.json({ error: save.error ?? 'save failed' }, 500);\n const manifest = resolveEffectiveAgentManifestForAgent(deps.service.currentConfig as Config, agentId);\n return c.json({ agentId: manifest.id, memory: manifest.memory });\n });\n\n authenticated.get('/api/memory/records', (c) => {\n const records = listMemoryRecords({\n providerId: c.req.query('providerId') || undefined,\n agentId: c.req.query('agentId') || undefined,\n workspaceId: c.req.query('workspaceId') || undefined,\n kind: parseKind(c.req.query('kind')),\n status: parseStatus(c.req.query('status')),\n limit: parseLimit(c.req.query('limit')),\n offset: c.req.query('offset') ? Number.parseInt(c.req.query('offset')!, 10) : 0,\n });\n return c.json({ records });\n });\n\n authenticated.post('/api/memory/search', async (c) => {\n const body = await c.req.json().catch(() => ({}));\n const query = typeof body.query === 'string' ? body.query.trim() : '';\n if (!query) {\n return c.json({ error: 'Missing required field: query' }, 400);\n }\n const records = searchMemoryRecords({\n query,\n providerId: typeof body.providerId === 'string' ? body.providerId : undefined,\n agentId: typeof body.agentId === 'string' ? body.agentId : undefined,\n workspaceId: typeof body.workspaceId === 'string' ? body.workspaceId : undefined,\n kinds: Array.isArray(body.kinds)\n ? body.kinds.map(parseKind).filter((v): v is MemoryKind => Boolean(v))\n : undefined,\n statuses: Array.isArray(body.statuses)\n ? body.statuses.map(parseStatus).filter((v): v is MemoryStatus => Boolean(v))\n : undefined,\n maxResults: typeof body.maxResults === 'number' ? body.maxResults : undefined,\n minScore: typeof body.minScore === 'number' ? body.minScore : undefined,\n });\n return c.json({ results: records });\n });\n\n authenticated.post('/api/memory/records', async (c) => {\n const body = await c.req.json().catch(() => ({}));\n const kind = parseKind(body.kind);\n const content = typeof body.content === 'string' ? body.content.trim() : '';\n const agentId = typeof body.agentId === 'string' && body.agentId.trim() ? body.agentId.trim() : 'main';\n if (!kind || !content) {\n return c.json({ error: 'Missing required fields: kind, content' }, 400);\n }\n const record = upsertMemoryRecord({\n id: typeof body.id === 'string' && body.id.trim() ? body.id.trim() : undefined,\n providerId: typeof body.providerId === 'string' && body.providerId.trim() ? body.providerId.trim() : 'local',\n kind,\n agentId,\n workspaceId: typeof body.workspaceId === 'string' ? body.workspaceId : deps.service.currentWorkspacePath,\n sessionKey: typeof body.sessionKey === 'string' ? body.sessionKey : undefined,\n content,\n source: body.source && typeof body.source === 'object' ? body.source : undefined,\n confidence: typeof body.confidence === 'number' ? body.confidence : undefined,\n tags: Array.isArray(body.tags) ? body.tags.filter((tag): tag is string => typeof tag === 'string') : undefined,\n status: parseStatus(body.status),\n sensitivity: parseSensitivity(body.sensitivity),\n evidence: Array.isArray(body.evidence)\n ? body.evidence.filter((item: unknown): item is NonNullable<Parameters<typeof upsertMemoryRecord>[0]['evidence']>[number] =>\n Boolean(item) && typeof item === 'object',\n )\n : undefined,\n reviewAfter: typeof body.reviewAfter === 'string' ? body.reviewAfter : undefined,\n expiresAt: typeof body.expiresAt === 'string' ? body.expiresAt : undefined,\n });\n return c.json({ record }, 201);\n });\n\n authenticated.patch('/api/memory/records/:id', async (c) => {\n const existing = getMemoryRecord(c.req.param('id'));\n if (!existing) return c.json({ error: 'Memory record not found' }, 404);\n const body = await c.req.json().catch(() => ({}));\n const record = upsertMemoryRecord({\n id: existing.id,\n providerId: existing.source.provider ?? 'local',\n kind: parseKind(body.kind) ?? existing.kind,\n agentId: existing.scope.agentId,\n workspaceId: existing.scope.workspaceId,\n sessionKey: existing.scope.sessionKey,\n content: typeof body.content === 'string' ? body.content : existing.content,\n source: body.source && typeof body.source === 'object' ? body.source : existing.source,\n confidence: typeof body.confidence === 'number' ? body.confidence : existing.confidence,\n tags: Array.isArray(body.tags) ? body.tags.filter((tag): tag is string => typeof tag === 'string') : existing.tags,\n status: parseStatus(body.status) ?? existing.status,\n sensitivity: parseSensitivity(body.sensitivity) ?? existing.sensitivity,\n evidence: Array.isArray(body.evidence)\n ? body.evidence.filter((item: unknown): item is NonNullable<Parameters<typeof upsertMemoryRecord>[0]['evidence']>[number] =>\n Boolean(item) && typeof item === 'object',\n )\n : existing.evidence,\n reviewAfter: typeof body.reviewAfter === 'string' ? body.reviewAfter : existing.reviewAfter,\n expiresAt: typeof body.expiresAt === 'string' ? body.expiresAt : existing.expiresAt,\n });\n return c.json({ record });\n });\n\n authenticated.delete('/api/memory/records/:id', (c) => {\n const deleted = deleteMemoryRecord(c.req.param('id'));\n if (!deleted) return c.json({ error: 'Memory record not found' }, 404);\n return c.json({ ok: true });\n });\n\n authenticated.get('/api/memory/signals', (c) => {\n const signals = listMemorySignals({\n recordId: c.req.query('recordId') || undefined,\n providerId: c.req.query('providerId') || undefined,\n agentId: c.req.query('agentId') || undefined,\n workspaceId: c.req.query('workspaceId') || undefined,\n limit: parseLimit(c.req.query('limit')),\n });\n return c.json({ signals });\n });\n\n authenticated.get('/api/memory/traces', (c) => {\n const traces = listMemoryTraceEvents({\n providerId: c.req.query('providerId') || undefined,\n sessionKey: c.req.query('sessionKey') || undefined,\n phase: c.req.query('phase') || undefined,\n limit: parseLimit(c.req.query('limit')),\n });\n return c.json({ traces });\n });\n\n authenticated.patch('/api/memory/traces/:traceId/feedback', async (c) => {\n const body = await c.req.json().catch(() => ({}));\n const outcome = typeof body.outcome === 'string' && MEMORY_TRACE_FEEDBACK_OUTCOMES.has(body.outcome)\n ? body.outcome\n : undefined;\n if (!outcome) {\n return c.json({ error: 'Missing or invalid required field: outcome' }, 400);\n }\n const source = body.source === 'user' || body.source === 'evaluator' || body.source === 'system'\n ? body.source\n : undefined;\n const trace = setMemoryTraceFeedback({\n traceId: c.req.param('traceId'),\n feedback: {\n outcome,\n ...(typeof body.score === 'number' ? { score: body.score } : {}),\n ...(typeof body.reason === 'string' ? { reason: body.reason } : {}),\n ...(source ? { source } : {}),\n },\n });\n if (!trace) return c.json({ error: 'Memory trace not found' }, 404);\n return c.json({ trace });\n });\n\n authenticated.get('/api/memory/feedback-summary', (c) => {\n const summaries = summarizeMemoryRecallFeedback({\n recordId: c.req.query('recordId') || undefined,\n providerId: c.req.query('providerId') || undefined,\n sessionKey: c.req.query('sessionKey') || undefined,\n limit: parseFeedbackSummaryLimit(c.req.query('limit')),\n });\n return c.json({ summaries });\n });\n\n authenticated.post('/api/memory/signals', async (c) => {\n const body = await c.req.json().catch(() => ({}));\n const source = typeof body.source === 'string' ? body.source : '';\n if (!source) return c.json({ error: 'Missing required field: source' }, 400);\n const signalId = appendMemorySignal({\n providerId: typeof body.providerId === 'string' ? body.providerId : undefined,\n agentId: typeof body.agentId === 'string' ? body.agentId : undefined,\n workspaceId: typeof body.workspaceId === 'string' ? body.workspaceId : undefined,\n sessionKey: typeof body.sessionKey === 'string' ? body.sessionKey : undefined,\n signal: {\n source: source as never,\n recordId: typeof body.recordId === 'string' ? body.recordId : undefined,\n score: typeof body.score === 'number' ? body.score : undefined,\n content: typeof body.content === 'string' ? body.content : undefined,\n metadata: body.metadata && typeof body.metadata === 'object' ? body.metadata : undefined,\n },\n });\n return c.json({ signalId }, 201);\n });\n\n authenticated.post('/api/memory/providers/:id/test', deps.strictRateLimitMiddleware, async (c) => {\n const providerId = c.req.param('id');\n const cfg = deps.service.currentConfig as Config;\n const workspace = deps.service.currentWorkspacePath;\n const store = new BuiltinMemoryStore(resolveBuiltinMemoryStoreConfig(workspace, cfg));\n const manager = createMemoryManagerFromConfig(workspace, store, cfg);\n await manager.initializeAll(`memory-provider-test-${Date.now()}`, { workspace, agentId: resolveDefaultAgentId(cfg) });\n const provider = manager.providersList.find((p) => p.id === providerId);\n if (!provider) return c.json({ providerId, available: false, checks: [{ name: 'load', ok: false, message: 'Provider not loaded' }] }, 404);\n\n const token = `xopc-memory-smoke-${Date.now()}`;\n const checks: Array<{ name: string; ok: boolean; message?: string; resultCount?: number }> = [\n { name: 'load', ok: true },\n { name: 'available', ok: provider.isAvailable() },\n ];\n const started = Date.now();\n try {\n const write = await manager.write({\n kind: 'workspace_fact',\n content: `Smoke test record for ${providerId}: ${token}`,\n scope: { agentId: resolveDefaultAgentId(cfg) },\n tags: ['xopc-smoke-test'],\n });\n checks.push({ name: 'write', ok: write.success, message: write.error ?? write.message });\n const results = await manager.search({ query: token, scope: { agentId: resolveDefaultAgentId(cfg) }, maxResults: 10 });\n const ownResults = results.filter((result) => result.citation.providerId === providerId);\n checks.push({ name: 'search', ok: ownResults.length > 0, resultCount: ownResults.length });\n const recordId = ownResults[0]?.record.id ?? write.record?.id;\n if (recordId) {\n const read = await manager.read({ id: recordId, scope: { agentId: resolveDefaultAgentId(cfg) } });\n checks.push({ name: 'read', ok: Boolean(read), message: read ? undefined : 'Record was not readable' });\n } else {\n checks.push({ name: 'read', ok: false, message: 'No record id available' });\n }\n manager.recordSignal({ source: 'search_recall', content: `Smoke signal for ${providerId}: ${token}` });\n checks.push({ name: 'sync', ok: true });\n } catch (err) {\n checks.push({ name: 'error', ok: false, message: err instanceof Error ? err.message : String(err) });\n } finally {\n appendMemoryTraceEvent({\n phase: 'test',\n providerId,\n request: { token },\n resultCount: checks.filter((check) => check.ok).length,\n error: checks.some((check) => !check.ok) ? 'one or more checks failed' : undefined,\n durationMs: Date.now() - started,\n });\n await manager.shutdownAll();\n }\n return c.json({ providerId, available: provider.isAvailable(), checks });\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"memory.js","names":[],"sources":["../../../../../src/gateway/hono/routes/memory.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport { BuiltinMemoryStore } from '../../../agent/memory/builtin-memory-store.js';\nimport { createMemoryManagerFromConfig } from '../../../agent/memory/create-memory-manager.js';\nimport { resolveBuiltinMemoryStoreConfig } from '../../../agent/memory/memory-config.js';\nimport { discoverMemoryPlugins } from '../../../agent/memory/plugin-discovery.js';\nimport type {\n MemoryKind,\n MemorySensitivity,\n MemoryStatus,\n} from '../../../agent/memory/types.js';\nimport { MemoryPolicySchema } from '../../../agent-manifest/schema.js';\nimport { resolveDefaultAgentId } from '../../../agent/agent-scope.js';\nimport { resolveEffectiveAgentManifestForAgent } from '../../../config/agent-profile.js';\nimport type { Config } from '../../../config/schema.js';\nimport { prepareUpdateAgent } from '../../agents-admin.js';\nimport {\n appendMemorySignal,\n appendMemoryTraceEvent,\n deleteMemoryRecord,\n getMemoryRecord,\n listMemoryRecords,\n listMemorySignals,\n listMemoryTraceEvents,\n searchMemoryRecords,\n setMemoryTraceFeedback,\n summarizeMemoryRecallFeedback,\n upsertMemoryRecord,\n} from '../../../storage/sqlite/index.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\n\nconst MEMORY_KINDS = new Set<MemoryKind>([\n 'user_profile',\n 'agent_note',\n 'workspace_fact',\n 'daily_note',\n 'session_summary',\n 'derived_insight',\n 'task_lesson',\n 'tool_preference',\n 'long_term_goal',\n]);\n\nconst MEMORY_STATUSES = new Set<MemoryStatus>([\n 'candidate',\n 'active',\n 'needs_review',\n 'stale',\n 'archived',\n 'rejected',\n]);\n\nconst MEMORY_SENSITIVITIES = new Set<MemorySensitivity>([\n 'normal',\n 'personal',\n 'secret',\n 'regulated',\n]);\n\nconst MEMORY_TRACE_FEEDBACK_OUTCOMES = new Set([\n 'helpful',\n 'not_helpful',\n 'mixed',\n 'irrelevant',\n]);\n\nfunction parseLimit(raw: string | undefined, fallback = 100): number {\n const parsed = raw ? Number.parseInt(raw, 10) : fallback;\n return Number.isFinite(parsed) ? Math.max(1, Math.min(500, parsed)) : fallback;\n}\n\nfunction parseFeedbackSummaryLimit(raw: string | undefined): number {\n const parsed = raw ? Number.parseInt(raw, 10) : 1000;\n return Number.isFinite(parsed) ? Math.max(1, Math.min(5000, parsed)) : 1000;\n}\n\nfunction parseKind(raw: unknown): MemoryKind | undefined {\n return typeof raw === 'string' && MEMORY_KINDS.has(raw as MemoryKind)\n ? (raw as MemoryKind)\n : undefined;\n}\n\nfunction parseStatus(raw: unknown): MemoryStatus | undefined {\n return typeof raw === 'string' && MEMORY_STATUSES.has(raw as MemoryStatus)\n ? (raw as MemoryStatus)\n : undefined;\n}\n\nfunction parseSensitivity(raw: unknown): MemorySensitivity | undefined {\n return typeof raw === 'string' && MEMORY_SENSITIVITIES.has(raw as MemorySensitivity)\n ? (raw as MemorySensitivity)\n : undefined;\n}\n\nexport function registerMemoryRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n authenticated.get('/api/memory/providers', async (c) => {\n const cfg = deps.service.currentConfig as Config;\n const plugins = await discoverMemoryPlugins(cfg);\n return c.json({\n providers: [\n {\n id: 'local',\n displayName: 'Local Markdown Memory',\n available: true,\n configured: true,\n capabilities: {\n search: true,\n read: true,\n write: true,\n update: true,\n delete: true,\n keywordSearch: true,\n semanticSearch: false,\n hybridSearch: false,\n citations: true,\n sync: false,\n local: true,\n },\n },\n ...plugins.map((plugin) => ({\n id: plugin.manifest?.id ?? plugin.name,\n displayName: plugin.manifest?.displayName ?? plugin.name,\n available: plugin.available,\n configured: false,\n capabilities: plugin.manifest?.capabilities ?? {},\n })),\n ],\n });\n });\n\n authenticated.get('/api/memory/config', (c) => {\n const cfg = deps.service.currentConfig as Config;\n const agentId = c.req.query('agentId') || resolveDefaultAgentId(cfg);\n const manifest = resolveEffectiveAgentManifestForAgent(cfg, agentId);\n return c.json({ agentId: manifest.id, memory: manifest.memory });\n });\n\n authenticated.patch('/api/memory/config', deps.strictRateLimitMiddleware, async (c) => {\n const cfg = deps.service.currentConfig as Config;\n const body = await c.req.json().catch(() => ({}));\n const agentId = typeof body.agentId === 'string' && body.agentId.trim()\n ? body.agentId.trim()\n : resolveDefaultAgentId(cfg);\n const parsed = MemoryPolicySchema.safeParse(body.memory);\n if (!parsed.success) {\n return c.json({ error: `memory ${parsed.error.issues[0]?.message ?? 'is invalid'}` }, 400);\n }\n const prep = prepareUpdateAgent(cfg, agentId, { memory: parsed.data });\n if (prep.ok === false) {\n return c.json({ error: prep.error }, prep.status ?? 400);\n }\n const save = await deps.service.saveConfig(prep.data.nextConfig);\n if (!save.saved) return c.json({ error: save.error ?? 'save failed' }, 500);\n const manifest = resolveEffectiveAgentManifestForAgent(deps.service.currentConfig as Config, agentId);\n return c.json({ agentId: manifest.id, memory: manifest.memory });\n });\n\n authenticated.get('/api/memory/records', (c) => {\n const records = listMemoryRecords({\n providerId: c.req.query('providerId') || undefined,\n agentId: c.req.query('agentId') || undefined,\n workspaceId: c.req.query('workspaceId') || undefined,\n projectId: c.req.query('projectId') || undefined,\n kind: parseKind(c.req.query('kind')),\n status: parseStatus(c.req.query('status')),\n limit: parseLimit(c.req.query('limit')),\n offset: c.req.query('offset') ? Number.parseInt(c.req.query('offset')!, 10) : 0,\n });\n return c.json({ records });\n });\n\n authenticated.post('/api/memory/search', async (c) => {\n const body = await c.req.json().catch(() => ({}));\n const query = typeof body.query === 'string' ? body.query.trim() : '';\n if (!query) {\n return c.json({ error: 'Missing required field: query' }, 400);\n }\n const records = searchMemoryRecords({\n query,\n providerId: typeof body.providerId === 'string' ? body.providerId : undefined,\n agentId: typeof body.agentId === 'string' ? body.agentId : undefined,\n workspaceId: typeof body.workspaceId === 'string' ? body.workspaceId : undefined,\n projectId: typeof body.projectId === 'string' ? body.projectId : undefined,\n kinds: Array.isArray(body.kinds)\n ? body.kinds.map(parseKind).filter((v): v is MemoryKind => Boolean(v))\n : undefined,\n statuses: Array.isArray(body.statuses)\n ? body.statuses.map(parseStatus).filter((v): v is MemoryStatus => Boolean(v))\n : undefined,\n maxResults: typeof body.maxResults === 'number' ? body.maxResults : undefined,\n minScore: typeof body.minScore === 'number' ? body.minScore : undefined,\n });\n return c.json({ results: records });\n });\n\n authenticated.post('/api/memory/records', async (c) => {\n const body = await c.req.json().catch(() => ({}));\n const kind = parseKind(body.kind);\n const content = typeof body.content === 'string' ? body.content.trim() : '';\n const agentId = typeof body.agentId === 'string' && body.agentId.trim() ? body.agentId.trim() : 'main';\n if (!kind || !content) {\n return c.json({ error: 'Missing required fields: kind, content' }, 400);\n }\n const record = upsertMemoryRecord({\n id: typeof body.id === 'string' && body.id.trim() ? body.id.trim() : undefined,\n providerId: typeof body.providerId === 'string' && body.providerId.trim() ? body.providerId.trim() : 'local',\n kind,\n agentId,\n workspaceId: typeof body.workspaceId === 'string' ? body.workspaceId : deps.service.currentWorkspacePath,\n sessionKey: typeof body.sessionKey === 'string' ? body.sessionKey : undefined,\n projectId: typeof body.projectId === 'string' ? body.projectId : undefined,\n content,\n source: body.source && typeof body.source === 'object' ? body.source : undefined,\n confidence: typeof body.confidence === 'number' ? body.confidence : undefined,\n tags: Array.isArray(body.tags) ? body.tags.filter((tag): tag is string => typeof tag === 'string') : undefined,\n status: parseStatus(body.status),\n sensitivity: parseSensitivity(body.sensitivity),\n evidence: Array.isArray(body.evidence)\n ? body.evidence.filter((item: unknown): item is NonNullable<Parameters<typeof upsertMemoryRecord>[0]['evidence']>[number] =>\n Boolean(item) && typeof item === 'object',\n )\n : undefined,\n reviewAfter: typeof body.reviewAfter === 'string' ? body.reviewAfter : undefined,\n expiresAt: typeof body.expiresAt === 'string' ? body.expiresAt : undefined,\n });\n return c.json({ record }, 201);\n });\n\n authenticated.patch('/api/memory/records/:id', async (c) => {\n const existing = getMemoryRecord(c.req.param('id'));\n if (!existing) return c.json({ error: 'Memory record not found' }, 404);\n const body = await c.req.json().catch(() => ({}));\n const record = upsertMemoryRecord({\n id: existing.id,\n providerId: existing.source.provider ?? 'local',\n kind: parseKind(body.kind) ?? existing.kind,\n agentId: existing.scope.agentId,\n workspaceId: existing.scope.workspaceId,\n sessionKey: existing.scope.sessionKey,\n projectId: typeof body.projectId === 'string' ? body.projectId : existing.scope.projectId,\n content: typeof body.content === 'string' ? body.content : existing.content,\n source: body.source && typeof body.source === 'object' ? body.source : existing.source,\n confidence: typeof body.confidence === 'number' ? body.confidence : existing.confidence,\n tags: Array.isArray(body.tags) ? body.tags.filter((tag): tag is string => typeof tag === 'string') : existing.tags,\n status: parseStatus(body.status) ?? existing.status,\n sensitivity: parseSensitivity(body.sensitivity) ?? existing.sensitivity,\n evidence: Array.isArray(body.evidence)\n ? body.evidence.filter((item: unknown): item is NonNullable<Parameters<typeof upsertMemoryRecord>[0]['evidence']>[number] =>\n Boolean(item) && typeof item === 'object',\n )\n : existing.evidence,\n reviewAfter: typeof body.reviewAfter === 'string' ? body.reviewAfter : existing.reviewAfter,\n expiresAt: typeof body.expiresAt === 'string' ? body.expiresAt : existing.expiresAt,\n });\n return c.json({ record });\n });\n\n authenticated.delete('/api/memory/records/:id', (c) => {\n const deleted = deleteMemoryRecord(c.req.param('id'));\n if (!deleted) return c.json({ error: 'Memory record not found' }, 404);\n return c.json({ ok: true });\n });\n\n authenticated.get('/api/memory/signals', (c) => {\n const signals = listMemorySignals({\n recordId: c.req.query('recordId') || undefined,\n providerId: c.req.query('providerId') || undefined,\n agentId: c.req.query('agentId') || undefined,\n workspaceId: c.req.query('workspaceId') || undefined,\n limit: parseLimit(c.req.query('limit')),\n });\n return c.json({ signals });\n });\n\n authenticated.get('/api/memory/traces', (c) => {\n const traces = listMemoryTraceEvents({\n providerId: c.req.query('providerId') || undefined,\n sessionKey: c.req.query('sessionKey') || undefined,\n phase: c.req.query('phase') || undefined,\n limit: parseLimit(c.req.query('limit')),\n });\n return c.json({ traces });\n });\n\n authenticated.patch('/api/memory/traces/:traceId/feedback', async (c) => {\n const body = await c.req.json().catch(() => ({}));\n const outcome = typeof body.outcome === 'string' && MEMORY_TRACE_FEEDBACK_OUTCOMES.has(body.outcome)\n ? body.outcome\n : undefined;\n if (!outcome) {\n return c.json({ error: 'Missing or invalid required field: outcome' }, 400);\n }\n const source = body.source === 'user' || body.source === 'evaluator' || body.source === 'system'\n ? body.source\n : undefined;\n const trace = setMemoryTraceFeedback({\n traceId: c.req.param('traceId'),\n feedback: {\n outcome,\n ...(typeof body.score === 'number' ? { score: body.score } : {}),\n ...(typeof body.reason === 'string' ? { reason: body.reason } : {}),\n ...(source ? { source } : {}),\n },\n });\n if (!trace) return c.json({ error: 'Memory trace not found' }, 404);\n return c.json({ trace });\n });\n\n authenticated.get('/api/memory/feedback-summary', (c) => {\n const summaries = summarizeMemoryRecallFeedback({\n recordId: c.req.query('recordId') || undefined,\n providerId: c.req.query('providerId') || undefined,\n sessionKey: c.req.query('sessionKey') || undefined,\n limit: parseFeedbackSummaryLimit(c.req.query('limit')),\n });\n return c.json({ summaries });\n });\n\n authenticated.post('/api/memory/signals', async (c) => {\n const body = await c.req.json().catch(() => ({}));\n const source = typeof body.source === 'string' ? body.source : '';\n if (!source) return c.json({ error: 'Missing required field: source' }, 400);\n const signalId = appendMemorySignal({\n providerId: typeof body.providerId === 'string' ? body.providerId : undefined,\n agentId: typeof body.agentId === 'string' ? body.agentId : undefined,\n workspaceId: typeof body.workspaceId === 'string' ? body.workspaceId : undefined,\n sessionKey: typeof body.sessionKey === 'string' ? body.sessionKey : undefined,\n signal: {\n source: source as never,\n recordId: typeof body.recordId === 'string' ? body.recordId : undefined,\n score: typeof body.score === 'number' ? body.score : undefined,\n content: typeof body.content === 'string' ? body.content : undefined,\n metadata: body.metadata && typeof body.metadata === 'object' ? body.metadata : undefined,\n },\n });\n return c.json({ signalId }, 201);\n });\n\n authenticated.post('/api/memory/providers/:id/test', deps.strictRateLimitMiddleware, async (c) => {\n const providerId = c.req.param('id');\n const cfg = deps.service.currentConfig as Config;\n const workspace = deps.service.currentWorkspacePath;\n const store = new BuiltinMemoryStore(resolveBuiltinMemoryStoreConfig(workspace, cfg));\n const manager = createMemoryManagerFromConfig(workspace, store, cfg);\n await manager.initializeAll(`memory-provider-test-${Date.now()}`, { workspace, agentId: resolveDefaultAgentId(cfg) });\n const provider = manager.providersList.find((p) => p.id === providerId);\n if (!provider) return c.json({ providerId, available: false, checks: [{ name: 'load', ok: false, message: 'Provider not loaded' }] }, 404);\n\n const token = `xopc-memory-smoke-${Date.now()}`;\n const checks: Array<{ name: string; ok: boolean; message?: string; resultCount?: number }> = [\n { name: 'load', ok: true },\n { name: 'available', ok: provider.isAvailable() },\n ];\n const started = Date.now();\n try {\n const write = await manager.write({\n kind: 'workspace_fact',\n content: `Smoke test record for ${providerId}: ${token}`,\n scope: { agentId: resolveDefaultAgentId(cfg) },\n tags: ['xopc-smoke-test'],\n });\n checks.push({ name: 'write', ok: write.success, message: write.error ?? write.message });\n const results = await manager.search({ query: token, scope: { agentId: resolveDefaultAgentId(cfg) }, maxResults: 10 });\n const ownResults = results.filter((result) => result.citation.providerId === providerId);\n checks.push({ name: 'search', ok: ownResults.length > 0, resultCount: ownResults.length });\n const recordId = ownResults[0]?.record.id ?? write.record?.id;\n if (recordId) {\n const read = await manager.read({ id: recordId, scope: { agentId: resolveDefaultAgentId(cfg) } });\n checks.push({ name: 'read', ok: Boolean(read), message: read ? undefined : 'Record was not readable' });\n } else {\n checks.push({ name: 'read', ok: false, message: 'No record id available' });\n }\n manager.recordSignal({ source: 'search_recall', content: `Smoke signal for ${providerId}: ${token}` });\n checks.push({ name: 'sync', ok: true });\n } catch (err) {\n checks.push({ name: 'error', ok: false, message: err instanceof Error ? err.message : String(err) });\n } finally {\n appendMemoryTraceEvent({\n phase: 'test',\n providerId,\n request: { token },\n resultCount: checks.filter((check) => check.ok).length,\n error: checks.some((check) => !check.ok) ? 'one or more checks failed' : undefined,\n durationMs: Date.now() - started,\n });\n await manager.shutdownAll();\n }\n return c.json({ providerId, available: provider.isAvailable(), checks });\n });\n}\n"],"mappings":"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"}
|