@xopcai/xopc 0.0.110 → 0.0.112
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 +46 -4
- package/README.zh-CN.md +46 -4
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/feishu/src/outbound/media-load.js +1 -1
- package/dist/extensions/feishu/src/workflow-progress.js +1 -1
- package/dist/extensions/telegram/src/adapters/streaming-adapter.js +1 -1
- package/dist/extensions/telegram/src/inbound-processor.js +1 -1
- package/dist/extensions/telegram/src/plugin.js +1 -1
- package/dist/extensions/telegram/src/routing-integration.js +2 -2
- package/dist/extensions/telegram/src/update-offset-store.js +1 -1
- package/dist/extensions/telegram/src/workflow-progress.js +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/extensions/weixin/src/api/api.js +2 -2
- package/dist/extensions/weixin/src/auth/accounts.js +1 -1
- package/dist/extensions/weixin/src/cdn/upload.js +1 -1
- package/dist/extensions/weixin/src/media/data-url.js +1 -1
- package/dist/extensions/weixin/src/messaging/debug-mode.js +1 -1
- package/dist/extensions/weixin/src/messaging/inbound.js +1 -1
- package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
- package/dist/extensions/weixin/src/plugin.js +1 -1
- package/dist/extensions/weixin/src/storage/sync-buf.js +1 -1
- package/dist/extensions/weixin/src/workflow-progress.js +1 -1
- package/dist/gateway/static/root/apple-touch-icon.png +0 -0
- package/dist/gateway/static/root/assets/Combination-BzaXOLd9.js +41 -0
- package/dist/gateway/static/root/assets/agent-avatar-dicebear-EhRp-ZMa.js +1 -0
- package/dist/gateway/static/root/assets/agent-browser-settings-page-H4foVCiS.js +6 -0
- package/dist/gateway/static/root/assets/agent-defaults-tabbed-page-DDNw2oNU.js +1 -0
- package/dist/gateway/static/root/assets/agents-E_X2kzS1.js +71 -0
- package/dist/gateway/static/root/assets/app-management-settings-panel-BIy7KEsM.js +1 -0
- package/dist/gateway/static/root/assets/appearance-settings-DGQG8NwA.js +1 -0
- package/dist/gateway/static/root/assets/apps-page-BZLvInLr.js +1 -0
- package/dist/gateway/static/root/assets/archive-plugin-uuQPupqx.js +1 -0
- package/dist/gateway/static/root/assets/attachment-load-DBkv0cAv.js +2 -0
- package/dist/gateway/static/root/assets/{attachment-preview-renderer-CybMSIoS.js → attachment-preview-renderer-DonnL2dL.js} +1 -1
- package/dist/gateway/static/root/assets/binary-plugins-DxxN_VAR.js +2 -0
- package/dist/gateway/static/root/assets/block-editor-CwnUlRmO.js +180 -0
- package/dist/gateway/static/root/assets/channels-settings-BHvUKlzw.js +1 -0
- package/dist/gateway/static/root/assets/cn-JdwAhgNB.js +1 -0
- package/dist/gateway/static/root/assets/code-editor-dZTY2dRW.js +1 -0
- package/dist/gateway/static/root/assets/config-api-BD-NcD5d.js +3 -0
- package/dist/gateway/static/root/assets/config-reload-event-Bjh2zoKp.js +1 -0
- package/dist/gateway/static/root/assets/connectors-settings-VBzXcEXL.js +2 -0
- package/dist/gateway/static/root/assets/cron-api-C5DoipZA.js +1 -0
- package/dist/gateway/static/root/assets/cron-dreaming-jobs-nCMWCf0p.js +1 -0
- package/dist/gateway/static/root/assets/cron-page-BLTpdm34.js +3 -0
- package/dist/gateway/static/root/assets/dist-By6Rh2ee.js +1 -0
- package/dist/gateway/static/root/assets/dist-CkobR7mk.js +1 -0
- package/dist/gateway/static/root/assets/dist-DokQNVMQ.js +1 -0
- package/dist/gateway/static/root/assets/dreaming-scene-BHMRVEUS.js +4585 -0
- package/dist/gateway/static/root/assets/dreaming-settings-DSVhXTPq.js +1 -0
- package/dist/gateway/static/root/assets/extension-debug-page-BDHA9o_e.js +1 -0
- package/dist/gateway/static/root/assets/{extension-page-W1wiG38F.js → extension-page-DmDLVSPE.js} +1 -1
- package/dist/gateway/static/root/assets/extension-settings-page-1124aHw_.js +1 -0
- package/dist/gateway/static/root/assets/fetch-DOe56Wmy.js +1 -0
- package/dist/gateway/static/root/assets/format-cron-label-BsotZDO5.js +2 -0
- package/dist/gateway/static/root/assets/format-interval-label-tsMSvBSR.js +1 -0
- package/dist/gateway/static/root/assets/gateway-config-api-CsD4FC9D.js +1 -0
- package/dist/gateway/static/root/assets/gateway-settings-HQ8FBhY2.js +1 -0
- package/dist/gateway/static/root/assets/gateway-startup-retry-C1zg7pH3.js +1 -0
- package/dist/gateway/static/root/assets/goal-detail-page-BG3Onph0.js +1 -0
- package/dist/gateway/static/root/assets/goals-page-DgeKn8zL.js +2 -0
- package/dist/gateway/static/root/assets/goals-settings-B5nI6lgz.js +1 -0
- package/dist/gateway/static/root/assets/heartbeat-config-api-CIv42nJD.js +1 -0
- package/dist/gateway/static/root/assets/heartbeat-settings-DFcVuJ3M.js +1 -0
- package/dist/gateway/static/root/assets/html-workspace-editor-CQLWDiwE.js +1 -0
- package/dist/gateway/static/root/assets/index-5A_ZaABy.css +1 -0
- package/dist/gateway/static/root/assets/index-BTmbp2AU.js +121 -0
- package/dist/gateway/static/root/assets/interval-presets-DGP3S7OB.js +1 -0
- package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-fETaDYQP.js +1 -0
- package/dist/gateway/static/root/assets/locale-store-DjbfSsfA.js +1 -0
- package/dist/gateway/static/root/assets/logs-page-B1-b27lK.js +2 -0
- package/dist/gateway/static/root/assets/markdown-editor-AssmZFx4.js +2 -0
- package/dist/gateway/static/root/assets/markdown-split-CgeBJMOD.js +1 -0
- package/dist/gateway/static/root/assets/media-plugins-C30GzlV2.js +1 -0
- package/dist/gateway/static/root/assets/mermaid-render-BbqDc_LQ.js +134 -0
- package/dist/gateway/static/root/assets/messages-BUUfPaZ9.js +3 -0
- package/dist/gateway/static/root/assets/middleware-Pd0e8Igk.js +1 -0
- package/dist/gateway/static/root/assets/models-hub-panel-DPcTS1-u.js +2 -0
- package/dist/gateway/static/root/assets/note-detail-page-xeGb4owe.js +2 -0
- package/dist/gateway/static/root/assets/note-image-lightbox-t1g0qZYh.js +1 -0
- package/dist/gateway/static/root/assets/note-time-hm6JO_Wi.js +1 -0
- package/dist/gateway/static/root/assets/notes-page-C_TdnKBe.js +1 -0
- package/dist/gateway/static/root/assets/preview-open-alternatives-DeWp9x5g.js +1 -0
- package/dist/gateway/static/root/assets/remote-access-hub-BtkPmJIN.js +1 -0
- package/dist/gateway/static/root/assets/save-bar-controls-BOaAOJI3.js +1 -0
- package/dist/gateway/static/root/assets/schedule-field-BLWLKqgw.js +1 -0
- package/dist/gateway/static/root/assets/schema-form-plqRFYT8.js +1 -0
- package/dist/gateway/static/root/assets/sessions-page-DOUjxzJm.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-qK_bnTrw.js +1 -0
- package/dist/gateway/static/root/assets/settings-collapsible-section-BP5zRrDI.js +1 -0
- package/dist/gateway/static/root/assets/settings-form-section-Bv8MZplG.js +1 -0
- package/dist/gateway/static/root/assets/settings-page-DmDfE1ww.js +1 -0
- package/dist/gateway/static/root/assets/setup-status-panel-BEFwNcIZ.js +1 -0
- package/dist/gateway/static/root/assets/share-preview-page-4OX1YCgp.js +2 -0
- package/dist/gateway/static/root/assets/shares-settings-CbKmJZot.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-YdtnUHtK.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-DwW1IzQ0.js +2 -0
- package/dist/gateway/static/root/assets/system-settings-panel-CGy4f_s2.js +1 -0
- package/dist/gateway/static/root/assets/theme-store-CD2wtgZV.js +1 -0
- package/dist/gateway/static/root/assets/use-agent-defaults-form-BMuMvzl_.js +1 -0
- package/dist/gateway/static/root/assets/use-blob-object-url-D4BFuzZB.js +1 -0
- package/dist/gateway/static/root/assets/use-channel-catalog-CjGHnDvN.js +1 -0
- package/dist/gateway/static/root/assets/use-settings-tab-guard-BMMFa0oA.js +1 -0
- package/dist/gateway/static/root/assets/vendor-codemirror-CNP1wPe7.js +45 -0
- package/dist/gateway/static/root/assets/voice-api-key-field-DnRbhMNq.js +1 -0
- package/dist/gateway/static/root/assets/voice-player-store-D5vzWwls.js +1 -0
- package/dist/gateway/static/root/assets/{workflow-page.utils-EYg_xBQS.js → workflow-page.utils-tjGpRVnw.js} +1 -1
- package/dist/gateway/static/root/assets/workflows-page-DqqHKGj2.js +18 -0
- package/dist/gateway/static/root/favicon-16x16.png +0 -0
- package/dist/gateway/static/root/favicon-32x32.png +0 -0
- package/dist/gateway/static/root/favicon.ico +0 -0
- package/dist/gateway/static/root/favicon.svg +14 -12
- package/dist/gateway/static/root/index.html +18 -15
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.d.ts +28 -2
- package/dist/src/agent/agent-manager.js +82 -11
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/agent-scope.js +1 -1
- package/dist/src/agent/bootstrap/load-bootstrap-files.js +1 -1
- package/dist/src/agent/context/workspace-seed.js +2 -2
- package/dist/src/agent/context/workspace-state.js +1 -1
- package/dist/src/agent/context/workspace.js +1 -1
- package/dist/src/agent/goals/checklist-judge.d.ts +5 -0
- package/dist/src/agent/goals/checklist-judge.js +26 -2
- package/dist/src/agent/goals/checklist-judge.js.map +1 -1
- package/dist/src/agent/goals/evaluate-turn.d.ts +5 -1
- package/dist/src/agent/goals/evaluate-turn.js +29 -3
- package/dist/src/agent/goals/evaluate-turn.js.map +1 -1
- package/dist/src/agent/goals/goal-locale.d.ts +0 -2
- package/dist/src/agent/goals/goal-locale.js +3 -16
- package/dist/src/agent/goals/goal-locale.js.map +1 -1
- package/dist/src/agent/goals/persistent-goal-service.d.ts +9 -0
- package/dist/src/agent/goals/persistent-goal-service.js +3 -2
- package/dist/src/agent/goals/persistent-goal-service.js.map +1 -1
- package/dist/src/agent/goals/post-turn.d.ts +7 -0
- package/dist/src/agent/goals/post-turn.js +70 -25
- package/dist/src/agent/goals/post-turn.js.map +1 -1
- package/dist/src/agent/goals/state.d.ts +0 -5
- package/dist/src/agent/goals/state.js +1 -96
- package/dist/src/agent/goals/state.js.map +1 -1
- package/dist/src/agent/image/load-image-media.js +2 -2
- package/dist/src/agent/ipc/inbox.js +3 -3
- package/dist/src/agent/ipc/socket.js +1 -1
- package/dist/src/agent/mcp/bundle-mcp-materialize.js +1 -1
- package/dist/src/agent/mcp/bundle-mcp-runtime.js +1 -1
- package/dist/src/agent/mcp/mcp-transport-config.js +1 -1
- package/dist/src/agent/mcp/mcp-transport.js +1 -1
- package/dist/src/agent/memory/builtin-memory-store.js +1 -1
- package/dist/src/agent/memory/dreaming/deep-promotion.js +1 -1
- package/dist/src/agent/memory/dreaming/events.js +1 -1
- package/dist/src/agent/memory/dreaming/last-run.js +1 -1
- package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
- package/dist/src/agent/memory/dreaming/preview.js +1 -1
- package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
- package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
- package/dist/src/agent/memory/dreaming/utils.js +1 -1
- package/dist/src/agent/memory/memory-flush.js +1 -1
- package/dist/src/agent/memory/plugin-discovery.js +1 -1
- package/dist/src/agent/messaging/command-handler.d.ts +7 -0
- package/dist/src/agent/messaging/command-handler.js +11 -2
- package/dist/src/agent/messaging/command-handler.js.map +1 -1
- package/dist/src/agent/models/manager.js +1 -1
- package/dist/src/agent/prompt/memory/index.js +1 -1
- package/dist/src/agent/prompt/service-prompt-builder.js +2 -2
- package/dist/src/agent/reply/post-compaction-context.js +1 -1
- package/dist/src/agent/reply/workspace-boundary-read.js +1 -1
- package/dist/src/agent/sandbox/path-policy.js +2 -2
- package/dist/src/agent/service/direct-turn-helpers.d.ts +2 -0
- package/dist/src/agent/service/direct-turn-helpers.js +3 -2
- package/dist/src/agent/service/direct-turn-helpers.js.map +1 -1
- package/dist/src/agent/service/process-direct-streaming.js +10 -1
- package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
- package/dist/src/agent/service/reconcile-dreaming-cron.js +8 -5
- package/dist/src/agent/service/reconcile-dreaming-cron.js.map +1 -1
- package/dist/src/agent/service.d.ts +2 -1
- package/dist/src/agent/service.js +30 -6
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/service.types.d.ts +12 -0
- package/dist/src/agent/session/session-config-service.d.ts +8 -0
- package/dist/src/agent/session/session-config-service.js +20 -0
- package/dist/src/agent/session/session-config-service.js.map +1 -1
- package/dist/src/agent/session/session-inspector.js +1 -1
- package/dist/src/agent/skills/config.js +2 -2
- package/dist/src/agent/skills/filesystem-watcher.d.ts +19 -0
- package/dist/src/agent/skills/filesystem-watcher.js +182 -0
- package/dist/src/agent/skills/filesystem-watcher.js.map +1 -0
- package/dist/src/agent/skills/hub-hash.js +2 -2
- package/dist/src/agent/skills/hub-lock.js +1 -1
- package/dist/src/agent/skills/hub-pull.js +30 -36
- package/dist/src/agent/skills/hub-pull.js.map +1 -1
- package/dist/src/agent/skills/index.js +82 -38
- package/dist/src/agent/skills/index.js.map +1 -1
- package/dist/src/agent/skills/installer.js +2 -2
- package/dist/src/agent/skills/managed-store.d.ts +19 -0
- package/dist/src/agent/skills/managed-store.js +97 -38
- package/dist/src/agent/skills/managed-store.js.map +1 -1
- package/dist/src/agent/skills/skill-manage-ops.js +1 -1
- package/dist/src/agent/skills/skill-manager.d.ts +16 -6
- package/dist/src/agent/skills/skill-manager.js +79 -24
- package/dist/src/agent/skills/skill-manager.js.map +1 -1
- package/dist/src/agent/skills/skill-view-path.js +1 -1
- package/dist/src/agent/skills/test-framework.js +1 -1
- package/dist/src/agent/skills/types.d.ts +11 -0
- package/dist/src/agent/skills/watcher.js +1 -1
- package/dist/src/agent/starter-agents.js +1 -1
- package/dist/src/agent/tools/cronjob-tool.d.ts +8 -3
- package/dist/src/agent/tools/cronjob-tool.js +82 -24
- package/dist/src/agent/tools/cronjob-tool.js.map +1 -1
- package/dist/src/agent/tools/dreaming-tool.js +1 -1
- package/dist/src/agent/tools/edit.d.ts +2 -0
- package/dist/src/agent/tools/edit.js +10 -0
- package/dist/src/agent/tools/edit.js.map +1 -1
- package/dist/src/agent/tools/factory.js +17 -4
- package/dist/src/agent/tools/factory.js.map +1 -1
- package/dist/src/agent/tools/find.js +1 -1
- package/dist/src/agent/tools/goal-evidence-recorder.d.ts +6 -0
- package/dist/src/agent/tools/goal-evidence-recorder.js +34 -0
- package/dist/src/agent/tools/goal-evidence-recorder.js.map +1 -0
- package/dist/src/agent/tools/goal-tool.d.ts +19 -0
- package/dist/src/agent/tools/goal-tool.js +101 -0
- package/dist/src/agent/tools/goal-tool.js.map +1 -0
- package/dist/src/agent/tools/grep.js +1 -1
- package/dist/src/agent/tools/image-generate-tool.js +1 -1
- package/dist/src/agent/tools/index.d.ts +1 -0
- package/dist/src/agent/tools/index.js +2 -1
- package/dist/src/agent/tools/shell.d.ts +2 -0
- package/dist/src/agent/tools/shell.js +17 -2
- package/dist/src/agent/tools/shell.js.map +1 -1
- package/dist/src/agent/tools/skill-manage-tool.js +1 -1
- package/dist/src/agent/tools/workflow-tool.d.ts +1 -0
- package/dist/src/agent/tools/workflow-tool.js +11 -3
- package/dist/src/agent/tools/workflow-tool.js.map +1 -1
- package/dist/src/agent/tools/write.d.ts +2 -0
- package/dist/src/agent/tools/write.js +11 -0
- package/dist/src/agent/tools/write.js.map +1 -1
- package/dist/src/agent/workflow/catalog.js +1 -1
- package/dist/src/agent/workspace-runtime/registry.d.ts +5 -0
- package/dist/src/agent/workspace-runtime/registry.js +7 -0
- package/dist/src/agent/workspace-runtime/registry.js.map +1 -1
- package/dist/src/ai-assist/text-assist.d.ts +39 -0
- package/dist/src/ai-assist/text-assist.js +234 -0
- package/dist/src/ai-assist/text-assist.js.map +1 -0
- package/dist/src/auth/credentials.js +2 -2
- package/dist/src/auth/profiles/store.js +2 -2
- package/dist/src/auth/sync-provider-auth.js +1 -1
- package/dist/src/browser/cache-dir-policy.js +1 -1
- package/dist/src/browser/cdp-local-launcher.js +2 -2
- package/dist/src/browser/providers/browser-ext-install.js +4 -4
- package/dist/src/browser/providers/cloakbrowser.js +5 -5
- package/dist/src/browser/providers/playwright-doctor.js +1 -1
- package/dist/src/browser/stealth.js +1 -1
- package/dist/src/channels/attachments/inbound-persist.d.ts +7 -0
- package/dist/src/channels/attachments/inbound-persist.js +20 -2
- package/dist/src/channels/attachments/inbound-persist.js.map +1 -1
- package/dist/src/channels/outbound/persist-store.js +1 -1
- package/dist/src/channels/pairing/allow-from-file.js +1 -1
- package/dist/src/channels/pairing/pairing-store.js +2 -2
- package/dist/src/chat-commands/agent-edit.js +2 -2
- package/dist/src/chat-commands/builtins/config.js +3 -3
- package/dist/src/chat-commands/builtins/goal.d.ts +1 -1
- package/dist/src/chat-commands/builtins/goal.js +55 -97
- package/dist/src/chat-commands/builtins/goal.js.map +1 -1
- package/dist/src/chat-commands/builtins/subgoal.d.ts +1 -1
- package/dist/src/chat-commands/builtins/subgoal.js +49 -108
- package/dist/src/chat-commands/builtins/subgoal.js.map +1 -1
- package/dist/src/chat-commands/builtins/system.js +11 -4
- package/dist/src/chat-commands/builtins/system.js.map +1 -1
- package/dist/src/chat-commands/builtins/workflow.js +132 -8
- package/dist/src/chat-commands/builtins/workflow.js.map +1 -1
- package/dist/src/chat-commands/context.d.ts +6 -0
- package/dist/src/chat-commands/context.js +12 -0
- package/dist/src/chat-commands/context.js.map +1 -1
- package/dist/src/chat-commands/types.d.ts +7 -0
- package/dist/src/cli/command-catalog.js +43 -0
- package/dist/src/cli/command-catalog.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/config.js +1 -1
- package/dist/src/cli/commands/cron.js +55 -16
- package/dist/src/cli/commands/cron.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/config-health.js +1 -1
- package/dist/src/cli/commands/doctor/checks/cron-health.js +2 -83
- package/dist/src/cli/commands/doctor/checks/cron-health.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
- package/dist/src/cli/commands/doctor/checks/state-integrity.js +1 -1
- package/dist/src/cli/commands/doctor/checks/workspace-status.js +1 -1
- package/dist/src/cli/commands/extension-create.js +1 -1
- package/dist/src/cli/commands/extension-dev.js +2 -2
- package/dist/src/cli/commands/extension-marketplace.js +2 -2
- package/dist/src/cli/commands/extension-pack.js +2 -2
- package/dist/src/cli/commands/extension.js +3 -3
- package/dist/src/cli/commands/gateway/logs.js +1 -1
- package/dist/src/cli/commands/goal.d.ts +4 -0
- package/dist/src/cli/commands/goal.js +213 -0
- package/dist/src/cli/commands/goal.js.map +1 -0
- package/dist/src/cli/commands/image.js +1 -1
- package/dist/src/cli/commands/init.js +2 -2
- package/dist/src/cli/commands/models.js +1 -1
- package/dist/src/cli/commands/onboard.js +11 -5
- package/dist/src/cli/commands/onboard.js.map +1 -1
- package/dist/src/cli/commands/skills-test.js +1 -1
- package/dist/src/cli/templates.js +1 -1
- package/dist/src/cli/utils/gateway-client.js +1 -1
- package/dist/src/cli/utils/init-workspace-core.js +2 -2
- package/dist/src/config/agent-profile.js +1 -1
- package/dist/src/config/agent-typed-models.js +1 -1
- package/dist/src/config/gateway-bind.js +1 -1
- package/dist/src/config/index.js +8 -8
- package/dist/src/config/loader.js +4 -4
- package/dist/src/config/models-json.js +2 -2
- package/dist/src/config/paths-state.js +1 -1
- package/dist/src/config/paths.js +1 -1
- package/dist/src/config/profile.js +1 -1
- package/dist/src/config/reload.js +1 -1
- package/dist/src/config/schema.d.ts +115 -2
- package/dist/src/config/schema.js +63 -7
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/config/web-patch.d.ts +14 -1
- package/dist/src/config/web-patch.js +45 -8
- package/dist/src/config/web-patch.js.map +1 -1
- package/dist/src/config/workspace-path.js +1 -1
- package/dist/src/cron/executor.d.ts +2 -0
- package/dist/src/cron/executor.js +126 -70
- package/dist/src/cron/executor.js.map +1 -1
- package/dist/src/cron/index.d.ts +1 -1
- package/dist/src/cron/index.js +3 -3
- package/dist/src/cron/job-content.js +1 -0
- package/dist/src/cron/job-content.js.map +1 -1
- package/dist/src/cron/run-log-store.d.ts +1 -0
- package/dist/src/cron/run-log-store.js +4 -2
- package/dist/src/cron/run-log-store.js.map +1 -1
- package/dist/src/cron/schedule.d.ts +10 -0
- package/dist/src/cron/schedule.js +85 -0
- package/dist/src/cron/schedule.js.map +1 -0
- package/dist/src/cron/service.d.ts +34 -77
- package/dist/src/cron/service.js +327 -264
- package/dist/src/cron/service.js.map +1 -1
- package/dist/src/cron/types.d.ts +97 -49
- package/dist/src/cron/validation.d.ts +374 -86
- package/dist/src/cron/validation.js +156 -129
- package/dist/src/cron/validation.js.map +1 -1
- package/dist/src/cron/workflow-run-completion.js +1 -1
- package/dist/src/daemon/constants.js +1 -1
- package/dist/src/daemon/install-plan.js +2 -2
- package/dist/src/daemon/launchd.js +2 -2
- package/dist/src/daemon/schtasks.js +2 -2
- package/dist/src/daemon/systemd.js +2 -2
- package/dist/src/extensions/bundle-mcp.js +1 -1
- package/dist/src/extensions/discover-extensions.js +2 -2
- package/dist/src/extensions/health.js +1 -1
- package/dist/src/extensions/install.js +2 -2
- package/dist/src/extensions/loader.js +2 -2
- package/dist/src/extensions/lockfile.js +3 -3
- package/dist/src/extensions/security.js +1 -1
- package/dist/src/extensions/update.js +2 -2
- package/dist/src/gateway/agents-admin.js +2 -2
- package/dist/src/gateway/chat-stream/mapper.d.ts +1 -0
- package/dist/src/gateway/chat-stream/mapper.js +6 -2
- package/dist/src/gateway/chat-stream/mapper.js.map +1 -1
- package/dist/src/gateway/chat-stream/protocol.d.ts +2 -0
- package/dist/src/gateway/file-path-classifier.js +2 -2
- package/dist/src/gateway/hono/lib/config-payload.d.ts +14 -1
- package/dist/src/gateway/hono/lib/config-payload.js +1 -1
- package/dist/src/gateway/hono/lib/extension-store.js +2 -2
- package/dist/src/gateway/hono/lib/static-ui.js +2 -2
- package/dist/src/gateway/hono/oauth-async.js +1 -1
- package/dist/src/gateway/hono/routes/agents.js +1 -1
- package/dist/src/gateway/hono/routes/ai-assist.d.ts +3 -0
- package/dist/src/gateway/hono/routes/ai-assist.js +66 -0
- package/dist/src/gateway/hono/routes/ai-assist.js.map +1 -0
- package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
- package/dist/src/gateway/hono/routes/commands-skills.js +7 -0
- package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
- package/dist/src/gateway/hono/routes/config-patch/misc.js +1 -1
- package/dist/src/gateway/hono/routes/cron.js +24 -5
- package/dist/src/gateway/hono/routes/cron.js.map +1 -1
- package/dist/src/gateway/hono/routes/dreaming.js +1 -1
- package/dist/src/gateway/hono/routes/goals.d.ts +1 -1
- package/dist/src/gateway/hono/routes/goals.js +670 -173
- package/dist/src/gateway/hono/routes/goals.js.map +1 -1
- package/dist/src/gateway/hono/routes/home.d.ts +5 -0
- package/dist/src/gateway/hono/routes/home.js +90 -3
- package/dist/src/gateway/hono/routes/home.js.map +1 -1
- package/dist/src/gateway/hono/routes/host-fs.js +2 -2
- package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
- package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
- package/dist/src/gateway/hono/routes/models.js +1 -1
- package/dist/src/gateway/hono/routes/notes.js +20 -14
- package/dist/src/gateway/hono/routes/notes.js.map +1 -1
- package/dist/src/gateway/hono/routes/shares.js +1 -1
- package/dist/src/gateway/hono/routes/workflows.js +8 -4
- package/dist/src/gateway/hono/routes/workflows.js.map +1 -1
- package/dist/src/gateway/hono/routes/workspace.js +2 -2
- package/dist/src/gateway/hono/sse.js.map +1 -1
- package/dist/src/gateway/lock.js +3 -3
- package/dist/src/gateway/ports.js +1 -1
- package/dist/src/gateway/service/agent-runner.d.ts +2 -0
- package/dist/src/gateway/service/agent-runner.js +8 -4
- package/dist/src/gateway/service/agent-runner.js.map +1 -1
- package/dist/src/gateway/service/config-coordinator.js +1 -1
- package/dist/src/gateway/service/marketplace-service.d.ts +22 -10
- package/dist/src/gateway/service/marketplace-service.js +46 -5
- package/dist/src/gateway/service/marketplace-service.js.map +1 -1
- package/dist/src/gateway/service/run-gateway-agent.d.ts +3 -0
- package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
- package/dist/src/gateway/service.d.ts +8 -0
- package/dist/src/gateway/service.js +79 -6
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/gateway/workspace-fs-file-list.js +1 -1
- package/dist/src/goals/goal-notifications.d.ts +29 -0
- package/dist/src/goals/goal-notifications.js +154 -0
- package/dist/src/goals/goal-notifications.js.map +1 -0
- package/dist/src/goals/goal-queue-store.d.ts +16 -0
- package/dist/src/goals/goal-queue-store.js +131 -0
- package/dist/src/goals/goal-queue-store.js.map +1 -0
- package/dist/src/goals/goal-queue-types.d.ts +31 -0
- package/dist/src/goals/goal-queue-types.js +1 -0
- package/dist/src/goals/goal-runner.d.ts +17 -0
- package/dist/src/goals/goal-runner.js +127 -0
- package/dist/src/goals/goal-runner.js.map +1 -0
- package/dist/src/goals/goal-service.d.ts +77 -0
- package/dist/src/goals/goal-service.js +261 -0
- package/dist/src/goals/goal-service.js.map +1 -0
- package/dist/src/goals/goal-store.d.ts +38 -0
- package/dist/src/goals/goal-store.js +404 -0
- package/dist/src/goals/goal-store.js.map +1 -0
- package/dist/src/goals/goal-workflow-judge.d.ts +13 -0
- package/dist/src/goals/goal-workflow-judge.js +147 -0
- package/dist/src/goals/goal-workflow-judge.js.map +1 -0
- package/dist/src/goals/index.d.ts +10 -0
- package/dist/src/goals/index.js +7 -0
- package/dist/src/goals/types.d.ts +119 -0
- package/dist/src/goals/types.js +1 -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/infra/brew.js +1 -1
- package/dist/src/infra/package-json.js +1 -1
- package/dist/src/infra/package-update-steps.js +1 -1
- package/dist/src/infra/path-env.js +2 -2
- package/dist/src/infra/restart.js +1 -1
- package/dist/src/infra/stable-node-path.js +1 -1
- package/dist/src/infra/update-check.js +1 -1
- package/dist/src/infra/update-global.js +1 -1
- package/dist/src/infra/update-lock.js +2 -2
- package/dist/src/infra/update-restart.js +1 -1
- package/dist/src/infra/update-runner.js +1 -1
- package/dist/src/infra/update-startup.js +1 -1
- package/dist/src/infra/write-file-atomic.js +2 -2
- package/dist/src/media/store.js +1 -1
- package/dist/src/notes/agent-context.js +1 -1
- package/dist/src/notes/service.js +1 -1
- package/dist/src/notes/store.js +2 -2
- package/dist/src/project-trust/trust-store.js +2 -2
- package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
- package/dist/src/providers/index.js +1 -1
- package/dist/src/providers/model-registry.js +4 -4
- package/dist/src/session/init-session-turn.js +2 -2
- package/dist/src/session/resolve-session.js +3 -3
- package/dist/src/session/session-title.js +2 -2
- package/dist/src/session/store.js +1 -1
- package/dist/src/share/share-auto.js +2 -2
- package/dist/src/share/share-store.js +3 -3
- package/dist/src/share/share-thumbnail.js +2 -2
- package/dist/src/share/share-zip.js +1 -1
- package/dist/src/share/site-share-store.js +3 -3
- package/dist/src/share/site-static-serve.js +1 -1
- package/dist/src/storage/sqlite/connection.js +1 -1
- package/dist/src/storage/sqlite/cron-job-repository.d.ts +6 -0
- package/dist/src/storage/sqlite/cron-job-repository.js +70 -0
- package/dist/src/storage/sqlite/cron-job-repository.js.map +1 -0
- package/dist/src/storage/sqlite/cron-run-repository.js +0 -1
- package/dist/src/storage/sqlite/cron-run-repository.js.map +1 -1
- package/dist/src/storage/sqlite/index.d.ts +1 -0
- package/dist/src/storage/sqlite/index.js +2 -1
- package/dist/src/storage/sqlite/memory-index-repository.js +2 -2
- package/dist/src/storage/sqlite/migrations/006_add_goals.sql +108 -0
- package/dist/src/storage/sqlite/migrations/007_goal_run_judge_schema.sql +4 -0
- package/dist/src/storage/sqlite/migrations/008_goal_queue_workflow_runs.sql +53 -0
- package/dist/src/storage/sqlite/migrations/009_cron_jobs.sql +24 -0
- package/dist/src/storage/sqlite/migrations/discover.js +1 -1
- package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
- package/dist/src/storage/sqlite/migrations/runner.js +4 -4
- package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
- package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
- package/dist/src/storage/sqlite/schema.js +2 -2
- package/dist/src/storage/sqlite/schema.sql +188 -0
- package/dist/src/tui/clipboard-image.js +3 -3
- package/dist/src/tui/extension-host/load-extensions.js +1 -1
- package/dist/src/tui/theme-manager.js +1 -1
- package/dist/src/tui/tui-command-formatters.js +4 -4
- package/dist/src/tui/tui-commands.js +2 -2
- package/dist/src/tui/tui-keybindings-file.js +1 -1
- package/dist/src/tui/tui-scoped-models.js +2 -2
- package/dist/src/tui/tui-settings.js +1 -1
- package/dist/src/tui/tui-startup-resources.js +1 -1
- package/dist/src/tui/tui.js +6 -6
- package/dist/src/tunnel/frpc-binary.js +4 -4
- package/dist/src/tunnel/frpc-config.js +1 -1
- package/dist/src/tunnel/frpc-extract.js +1 -1
- package/dist/src/tunnel/tunnel-state.js +1 -1
- package/dist/src/utils/logger/audit.js +1 -1
- package/dist/src/utils/logger/log-store.js +1 -1
- package/dist/src/utils/logger/rotation.js +1 -1
- package/dist/src/utils/logger/stats.d.ts +1 -1
- package/dist/src/utils/logger/streams.js +1 -1
- package/dist/src/voice/tts/audio.js +1 -1
- package/dist/src/voice/tts/providers/edge-speech.js +2 -2
- package/dist/src/workflows/domain/run.d.ts +1 -0
- package/dist/src/workflows/domain/run.js.map +1 -1
- package/dist/src/workflows/draft/workflow-draft-service.js +1 -1
- package/dist/src/workflows/engine/projector.js +23 -14
- package/dist/src/workflows/engine/projector.js.map +1 -1
- package/dist/src/workflows/engine/workflow-engine.d.ts +1 -0
- package/dist/src/workflows/engine/workflow-engine.js +36 -0
- package/dist/src/workflows/engine/workflow-engine.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 +7 -3
- package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
- package/dist/src/workflows/service/workflow-run-service.types.d.ts +1 -0
- package/dist/src/workflows/service/workflow-session-bridge.js +8 -1
- package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
- package/dist/src/workflows/store/event-store.js +1 -1
- package/dist/src/workflows/store/run-index-store.d.ts +8 -0
- package/dist/src/workflows/store/run-index-store.js +58 -0
- package/dist/src/workflows/store/run-index-store.js.map +1 -0
- package/dist/src/workflows/store/run-store.d.ts +2 -0
- package/dist/src/workflows/store/run-store.js +15 -22
- package/dist/src/workflows/store/run-store.js.map +1 -1
- package/package.json +10 -5
- package/dist/gateway/static/root/assets/Combination-HAlzriaz.js +0 -41
- package/dist/gateway/static/root/assets/agents-CFFioJCI.js +0 -78
- package/dist/gateway/static/root/assets/apps-page-BYDmkbzG.js +0 -1
- package/dist/gateway/static/root/assets/channels-settings-CsbDaMvd.js +0 -1
- package/dist/gateway/static/root/assets/circle-check-C23XjkUj.js +0 -1
- package/dist/gateway/static/root/assets/copy-Dv6d4Dvw.js +0 -1
- package/dist/gateway/static/root/assets/cron-page-Apk-7p4p.js +0 -1
- package/dist/gateway/static/root/assets/dist-DmGDgpy2.js +0 -1
- package/dist/gateway/static/root/assets/extension-debug-page-pxFC-tUa.js +0 -1
- package/dist/gateway/static/root/assets/extension-settings-page-COXSv6xP.js +0 -1
- package/dist/gateway/static/root/assets/fetch-CFdKBnE6.js +0 -1
- package/dist/gateway/static/root/assets/gateway-startup-retry-DdngdObI.js +0 -1
- package/dist/gateway/static/root/assets/heartbeat-config-api-DcmAMYmN.js +0 -1
- package/dist/gateway/static/root/assets/index-C_2yKRJX.js +0 -4845
- package/dist/gateway/static/root/assets/index-DI5_GsZt.css +0 -1
- package/dist/gateway/static/root/assets/logs-page-DvTWUOzd.js +0 -2
- package/dist/gateway/static/root/assets/note-detail-page-CZbdugWZ.js +0 -180
- package/dist/gateway/static/root/assets/note-time-RdyBZxj3.js +0 -1
- package/dist/gateway/static/root/assets/notes-page-mEAwy3e1.js +0 -1
- package/dist/gateway/static/root/assets/schema-form-DEvdni_r.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-BsgffzV4.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-t6v8Dwb8.js +0 -2
- package/dist/gateway/static/root/assets/settings-form-section-BoYYZmJG.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-ClIthYF8.js +0 -3
- package/dist/gateway/static/root/assets/share-preview-page-Dd9et7KD.js +0 -2
- package/dist/gateway/static/root/assets/skills-page-DEXtxyfQ.js +0 -2
- package/dist/gateway/static/root/assets/theme-store-BZozwAeK.js +0 -1
- package/dist/gateway/static/root/assets/url-DQRqHuL-.js +0 -3
- package/dist/gateway/static/root/assets/vendor-codemirror-DYoKfS8f.js +0 -45
- package/dist/gateway/static/root/assets/voice-api-key-field-CNrKzQrf.js +0 -1
- package/dist/gateway/static/root/assets/workflows-page-EMZkzJNN.js +0 -18
- package/dist/gateway/static/root/favicon-16.png +0 -0
- package/dist/gateway/static/root/favicon-32.png +0 -0
- package/dist/src/agent/goals/checklist-user.d.ts +0 -24
- package/dist/src/agent/goals/checklist-user.js +0 -92
- package/dist/src/agent/goals/checklist-user.js.map +0 -1
- package/dist/src/agent/goals/goal-run-store.d.ts +0 -19
- package/dist/src/agent/goals/goal-run-store.js +0 -138
- package/dist/src/agent/goals/goal-run-store.js.map +0 -1
- package/dist/src/agent/goals/goal-run-types.d.ts +0 -28
- package/dist/src/agent/goals/goal-run-types.js +0 -6
- package/dist/src/agent/goals/goal-run-types.js.map +0 -1
- package/dist/src/agent/goals/patch-from-user-action.d.ts +0 -20
- package/dist/src/agent/goals/patch-from-user-action.js +0 -103
- package/dist/src/agent/goals/patch-from-user-action.js.map +0 -1
- package/dist/src/cron/persistence.d.ts +0 -62
- package/dist/src/cron/persistence.js +0 -188
- package/dist/src/cron/persistence.js.map +0 -1
- /package/dist/gateway/static/root/assets/{note-detail-page-D4ZIVQbk.css → block-editor-D4ZIVQbk.css} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"goals.js","names":[],"sources":["../../../../../src/gateway/hono/routes/goals.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport {\n defaultMaxTurns,\n mergeCustomDataPatch,\n readPersistentGoal,\n serializePersistentGoal,\n PERSISTENT_GOAL_CUSTOM_KEY,\n} from '../../../agent/goals/state.js';\nimport {\n applyPersistentGoalUserAction,\n type PersistentGoalUserAction,\n} from '../../../agent/goals/patch-from-user-action.js';\nimport { mergePersistentGoalUiLocale, normalizeGoalUiLocale } from '../../../agent/goals/goal-locale.js';\nimport { listGoalRuns } from '../../../agent/goals/goal-run-store.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\nimport { applyChecklistUserMutation } from '../../../agent/goals/checklist-user.js';\n\nfunction isGoalAction(x: unknown): x is PersistentGoalUserAction {\n return x === 'pause' || x === 'resume' || x === 'clear' || x === 'restart';\n}\n\n/** Webchat persistent `/goal` REST API. */\nexport function registerGoalsRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const sm = deps.service.sessionIndexInstance;\n const cfg = () => deps.service.currentConfig;\n\n authenticated.get('/api/goals/webchat', async (c) => {\n const sessionKey = c.req.query('sessionKey')?.trim();\n if (!sessionKey) {\n return c.json({ ok: false, error: 'Missing sessionKey' }, 400);\n }\n const uiLocale = normalizeGoalUiLocale(c.req.query('uiLocale'));\n let m = await sm.getSessionMetadata(sessionKey);\n if (uiLocale && m) {\n const merged = mergePersistentGoalUiLocale(m.customData as Record<string, unknown> | undefined, uiLocale);\n if (merged !== m.customData) {\n await sm.updateSessionMetadata(sessionKey, { customData: merged });\n m = await sm.getSessionMetadata(sessionKey);\n }\n }\n const goal = readPersistentGoal(m?.customData as Record<string, unknown> | undefined);\n return c.json({ ok: true, sessionKey, persistentGoal: goal });\n });\n\n authenticated.get('/api/goals/webchat/runs', async (c) => {\n const sessionKey = c.req.query('sessionKey')?.trim();\n if (!sessionKey) {\n return c.json({ ok: false, error: 'Missing sessionKey' }, 400);\n }\n const limitRaw = c.req.query('limit')?.trim();\n let limit = 50;\n if (limitRaw) {\n const n = Number.parseInt(limitRaw, 10);\n if (Number.isFinite(n)) {\n limit = Math.min(500, Math.max(1, n));\n }\n }\n const runs = await listGoalRuns(cfg(), sessionKey, { limit });\n return c.json({ ok: true, sessionKey, runs });\n });\n\n authenticated.post('/api/goals/webchat', async (c) => {\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) {\n return c.json({ ok: false, error: 'Missing sessionKey' }, 400);\n }\n\n const goalsSlice = cfg().goals;\n const actionRaw = body.action ?? (body.clear === true ? 'clear' : undefined);\n if (isGoalAction(actionRaw)) {\n const meta = await sm.getSessionMetadata(sessionKey);\n if (!meta) {\n return c.json({ ok: false, error: 'Session not found' }, 404);\n }\n const applied = applyPersistentGoalUserAction(\n meta.customData as Record<string, unknown> | undefined,\n actionRaw,\n goalsSlice,\n );\n if (applied.kind === 'error') {\n return c.json({ ok: false, error: applied.error }, 400);\n }\n if (applied.kind === 'noop') {\n const persistentGoal = readPersistentGoal(meta.customData as Record<string, unknown> | undefined);\n return c.json({ ok: true, sessionKey, noop: true, message: applied.message, persistentGoal });\n }\n const uiLocale = normalizeGoalUiLocale(body.uiLocale);\n const customData =\n uiLocale != null\n ? (mergePersistentGoalUiLocale(applied.customData, uiLocale) ?? applied.customData)\n : applied.customData;\n await sm.updateSessionMetadata(sessionKey, { customData });\n const m2 = await sm.getSessionMetadata(sessionKey);\n const persistentGoal = readPersistentGoal(m2?.customData as Record<string, unknown> | undefined);\n if (applied.kickoff) {\n deps.service.enqueueWebchatPersistentGoalKickoff(sessionKey, applied.kickoff);\n }\n return c.json({ ok: true, sessionKey, action: actionRaw, persistentGoal });\n }\n\n if (body.clear === true) {\n const meta = await sm.getSessionMetadata(sessionKey);\n if (!meta) {\n return c.json({ ok: false, error: 'Session not found' }, 404);\n }\n const base = { ...(meta.customData as Record<string, unknown> | undefined) };\n delete base[PERSISTENT_GOAL_CUSTOM_KEY];\n await sm.updateSessionMetadata(sessionKey, { customData: base });\n return c.json({ ok: true, sessionKey, cleared: true });\n }\n const goalText = typeof body.goalText === 'string' ? body.goalText.trim() : '';\n if (!goalText) {\n return c.json({ ok: false, error: 'Missing goalText (or set clear:true)' }, 400);\n }\n const meta = await sm.getSessionMetadata(sessionKey);\n if (!meta) {\n return c.json({ ok: false, error: 'Session not found' }, 404);\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 : defaultMaxTurns(cfg().goals);\n const judgeModelRef =\n typeof body.judgeModelRef === 'string' && body.judgeModelRef.trim()\n ? body.judgeModelRef.trim()\n : typeof cfg().goals?.judgeModelRef === 'string'\n ? cfg().goals!.judgeModelRef!.trim()\n : undefined;\n\n const uiLocale = normalizeGoalUiLocale(body.uiLocale);\n\n const next = {\n goal: goalText,\n status: 'active' as const,\n turnsUsed: 0,\n maxTurns,\n createdAt: Date.now(),\n lastTurnAt: 0,\n decomposed: false,\n consecutiveParseFailures: 0,\n ...(judgeModelRef ? { judgeModelRef } : {}),\n ...(uiLocale ? { uiLocale } : {}),\n };\n\n const base = { ...(meta.customData as Record<string, unknown> | undefined) };\n const customData = mergeCustomDataPatch(base, {\n [PERSISTENT_GOAL_CUSTOM_KEY]: serializePersistentGoal(next),\n });\n await sm.updateSessionMetadata(sessionKey, { customData });\n const m2 = await sm.getSessionMetadata(sessionKey);\n const persistentGoal = readPersistentGoal(m2?.customData as Record<string, unknown> | undefined);\n deps.service.enqueueWebchatPersistentGoalKickoff(sessionKey, goalText);\n return c.json({ ok: true, sessionKey, persistentGoal });\n });\n\n /** Checklist CRUD for standing goals (`/subgoal` parity for webchat). */\n authenticated.post('/api/goals/webchat/checklist', async (c) => {\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) {\n return c.json({ ok: false, error: 'Missing sessionKey' }, 400);\n }\n const op = typeof body.op === 'string' ? body.op.trim().toLowerCase() : '';\n const meta = await sm.getSessionMetadata(sessionKey);\n if (!meta) {\n return c.json({ ok: false, error: 'Session not found' }, 404);\n }\n\n let mutation: ReturnType<typeof applyChecklistUserMutation> | null = null;\n if (op === 'reset') {\n mutation = applyChecklistUserMutation(meta.customData as Record<string, unknown> | undefined, {\n type: 'reset',\n });\n } else if (op === 'add') {\n const text = typeof body.text === 'string' ? body.text : '';\n mutation = applyChecklistUserMutation(meta.customData as Record<string, unknown> | undefined, {\n type: 'add',\n text,\n });\n } else if (op === 'remove') {\n const index =\n typeof body.index === 'number' && Number.isFinite(body.index) ? Math.floor(body.index) : undefined;\n if (index === undefined || index < 1) {\n return c.json({ ok: false, error: 'Missing or invalid index (1-based)' }, 400);\n }\n mutation = applyChecklistUserMutation(meta.customData as Record<string, unknown> | undefined, {\n type: 'remove',\n index1Based: index,\n });\n } else if (op === 'mark') {\n const index =\n typeof body.index === 'number' && Number.isFinite(body.index) ? Math.floor(body.index) : undefined;\n const status = typeof body.status === 'string' ? body.status.trim().toLowerCase() : '';\n if (index === undefined || index < 1) {\n return c.json({ ok: false, error: 'Missing or invalid index (1-based)' }, 400);\n }\n if (status !== 'pending' && status !== 'completed' && status !== 'impossible') {\n return c.json({ ok: false, error: 'status must be pending, completed, or impossible' }, 400);\n }\n mutation = applyChecklistUserMutation(meta.customData as Record<string, unknown> | undefined, {\n type: 'mark',\n index1Based: index,\n status,\n });\n } else {\n return c.json({ ok: false, error: 'Invalid op (add|remove|mark|reset)' }, 400);\n }\n\n if (mutation.kind === 'error') {\n return c.json({ ok: false, error: mutation.error }, 400);\n }\n if (mutation.kind === 'noop') {\n const persistentGoal = readPersistentGoal(meta.customData as Record<string, unknown> | undefined);\n return c.json({ ok: true, sessionKey, noop: true, message: mutation.message, persistentGoal });\n }\n const uiLocale = normalizeGoalUiLocale(body.uiLocale);\n const customData =\n uiLocale != null\n ? (mergePersistentGoalUiLocale(mutation.customData, uiLocale) ?? mutation.customData)\n : mutation.customData;\n await sm.updateSessionMetadata(sessionKey, { customData });\n const m2 = await sm.getSessionMetadata(sessionKey);\n const persistentGoal = readPersistentGoal(m2?.customData as Record<string, unknown> | undefined);\n return c.json({ ok: true, sessionKey, op, persistentGoal });\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 { 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';\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\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.message || 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 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: typeof body.description === 'string' ? body.description : 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 if (sessionKey) {\n deps.service.enqueueWebchatPersistentGoalKickoff(sessionKey, title);\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 sessionKey = buildSessionKey({\n agentId: goal.agentId || getDefaultAgentId(cfg()),\n source: 'webchat',\n accountId: 'default',\n peerKind: 'direct',\n peerId: `goal-${sanitizeSegment(goal.id) || Date.now()}`,\n });\n await deps.service.sessionIndexInstance.saveMessages(sessionKey, []);\n goals.attachSession(goalId, sessionKey);\n }\n\n const queued = deps.service.enqueueGoalRun(goalId, {\n message: typeof body.message === 'string' ? body.message : undefined,\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 message: typeof body.message === 'string' ? body.message : undefined,\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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"}
|
|
@@ -8,5 +8,10 @@ import type { AuthenticatedRouteDeps } from './deps.js';
|
|
|
8
8
|
* - inboxCount: number of notes with status === 'inbox'
|
|
9
9
|
* - pendingTasks: task notes where done === false
|
|
10
10
|
* - recentSessions: last 5 active AI sessions (threads)
|
|
11
|
+
* - activeAgent: default agent identity for this gateway
|
|
12
|
+
* - gateway: readiness + public tunnel status
|
|
13
|
+
* - workflowRuns: active / attention / recent workflow runs
|
|
14
|
+
* - nextCronJobs: upcoming enabled schedules
|
|
15
|
+
* - recentCronRuns: latest cron executions
|
|
11
16
|
*/
|
|
12
17
|
export declare function registerHomeRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void;
|
|
@@ -1,4 +1,50 @@
|
|
|
1
|
+
import { describeSchedule } from "../../../cron/schedule.js";
|
|
2
|
+
import "../../../cron/index.js";
|
|
3
|
+
import { listGatewayAgents } from "../../agents-admin.js";
|
|
4
|
+
import { getTunnelService } from "../../../tunnel/tunnel-service.js";
|
|
5
|
+
import "../../../tunnel/index.js";
|
|
1
6
|
//#region src/gateway/hono/routes/home.ts
|
|
7
|
+
function toHomeWorkflowRun(run) {
|
|
8
|
+
return {
|
|
9
|
+
id: run.id,
|
|
10
|
+
definitionId: run.definitionId,
|
|
11
|
+
title: run.title,
|
|
12
|
+
status: run.status,
|
|
13
|
+
sessionKey: run.metadata?.sessionKey,
|
|
14
|
+
createdAtMs: run.createdAtMs,
|
|
15
|
+
startedAtMs: run.startedAtMs,
|
|
16
|
+
completedAtMs: run.completedAtMs,
|
|
17
|
+
metrics: run.metrics
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function payloadKind(job) {
|
|
21
|
+
const payload = job.payload;
|
|
22
|
+
return typeof payload?.kind === "string" ? payload.kind : "unknown";
|
|
23
|
+
}
|
|
24
|
+
function toHomeCronJob(job) {
|
|
25
|
+
if (!job.enabled || !job.state.nextRunAtMs) return null;
|
|
26
|
+
return {
|
|
27
|
+
id: job.id,
|
|
28
|
+
name: job.name,
|
|
29
|
+
schedule: describeSchedule(job.schedule),
|
|
30
|
+
nextRunAt: new Date(job.state.nextRunAtMs).toISOString(),
|
|
31
|
+
payloadKind: payloadKind(job)
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function toHomeCronRun(run) {
|
|
35
|
+
return {
|
|
36
|
+
id: run.id,
|
|
37
|
+
jobId: run.jobId,
|
|
38
|
+
jobName: run.jobName,
|
|
39
|
+
status: run.status,
|
|
40
|
+
startedAt: run.startedAt,
|
|
41
|
+
endedAt: run.endedAt,
|
|
42
|
+
error: run.error,
|
|
43
|
+
summary: run.summary,
|
|
44
|
+
sessionKey: run.sessionKey,
|
|
45
|
+
workflowRunId: run.workflowRunId
|
|
46
|
+
};
|
|
47
|
+
}
|
|
2
48
|
/**
|
|
3
49
|
* GET /api/home — Aggregated home screen data for the mobile app.
|
|
4
50
|
*
|
|
@@ -7,13 +53,23 @@
|
|
|
7
53
|
* - inboxCount: number of notes with status === 'inbox'
|
|
8
54
|
* - pendingTasks: task notes where done === false
|
|
9
55
|
* - recentSessions: last 5 active AI sessions (threads)
|
|
56
|
+
* - activeAgent: default agent identity for this gateway
|
|
57
|
+
* - gateway: readiness + public tunnel status
|
|
58
|
+
* - workflowRuns: active / attention / recent workflow runs
|
|
59
|
+
* - nextCronJobs: upcoming enabled schedules
|
|
60
|
+
* - recentCronRuns: latest cron executions
|
|
10
61
|
*/
|
|
11
62
|
function registerHomeRoutes(authenticated, deps) {
|
|
12
63
|
const { service } = deps;
|
|
13
64
|
authenticated.get("/api/home", async (c) => {
|
|
14
65
|
const notes = service.notesServiceInstance;
|
|
15
66
|
const sessions = service.sessions;
|
|
16
|
-
const
|
|
67
|
+
const agents = await listGatewayAgents(service.currentConfig);
|
|
68
|
+
const defaultAgent = agents.agents.find((agent) => agent.id === agents.defaultId) ?? agents.agents[0];
|
|
69
|
+
const workflowRunStore = service.createWorkflowRunService().createRunStore(defaultAgent?.id ?? agents.defaultId);
|
|
70
|
+
const tunnel = getTunnelService().getStatus();
|
|
71
|
+
const health = service.getHealth();
|
|
72
|
+
const [recentlyOpened, inbox, pendingTasks, recentSessions, workflowRuns, cronJobs, recentCronRuns] = await Promise.all([
|
|
17
73
|
notes.listNotes({
|
|
18
74
|
sortBy: "lastOpenedAt",
|
|
19
75
|
sortOrder: "desc",
|
|
@@ -33,14 +89,45 @@ function registerHomeRoutes(authenticated, deps) {
|
|
|
33
89
|
sortBy: "updatedAt",
|
|
34
90
|
sortOrder: "desc",
|
|
35
91
|
limit: 5
|
|
36
|
-
})
|
|
92
|
+
}),
|
|
93
|
+
workflowRunStore.listRunSummaries(20),
|
|
94
|
+
service.cronServiceInstance.listJobs(),
|
|
95
|
+
service.cronServiceInstance.getAllRunsHistory(10)
|
|
37
96
|
]);
|
|
97
|
+
const activeWorkflowRuns = workflowRuns.filter((run) => run.status === "queued" || run.status === "running").slice(0, 5).map(toHomeWorkflowRun);
|
|
98
|
+
const attentionWorkflowRuns = workflowRuns.filter((run) => run.status === "failed" || run.status === "timeout").slice(0, 5).map(toHomeWorkflowRun);
|
|
99
|
+
const recentWorkflowRuns = workflowRuns.slice(0, 5).map(toHomeWorkflowRun);
|
|
100
|
+
const nextCronJobs = cronJobs.map(toHomeCronJob).filter((job) => Boolean(job)).sort((a, b) => Date.parse(a.nextRunAt) - Date.parse(b.nextRunAt)).slice(0, 5);
|
|
38
101
|
return c.json({
|
|
39
102
|
recentlyOpened: recentlyOpened.items.filter((n) => n.lastOpenedAt),
|
|
40
103
|
inboxCount: inbox.total,
|
|
41
104
|
pendingTasks: pendingTasks.items,
|
|
42
105
|
pendingTaskCount: pendingTasks.total,
|
|
43
|
-
recentSessions: recentSessions.items
|
|
106
|
+
recentSessions: recentSessions.items,
|
|
107
|
+
activeAgent: defaultAgent ? {
|
|
108
|
+
id: defaultAgent.id,
|
|
109
|
+
name: defaultAgent.name,
|
|
110
|
+
description: defaultAgent.description
|
|
111
|
+
} : { id: agents.defaultId },
|
|
112
|
+
gateway: {
|
|
113
|
+
status: health.status,
|
|
114
|
+
ready: health.ready,
|
|
115
|
+
httpListening: health.httpListening,
|
|
116
|
+
version: health.version,
|
|
117
|
+
uptime: health.uptime,
|
|
118
|
+
tunnel: {
|
|
119
|
+
state: tunnel.state,
|
|
120
|
+
publicUrl: tunnel.publicUrl,
|
|
121
|
+
connected: tunnel.state === "connected"
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
workflowRuns: {
|
|
125
|
+
active: activeWorkflowRuns,
|
|
126
|
+
attention: attentionWorkflowRuns,
|
|
127
|
+
recent: recentWorkflowRuns
|
|
128
|
+
},
|
|
129
|
+
nextCronJobs,
|
|
130
|
+
recentCronRuns: recentCronRuns.slice(0, 5).map(toHomeCronRun)
|
|
44
131
|
});
|
|
45
132
|
});
|
|
46
133
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"home.js","names":[],"sources":["../../../../../src/gateway/hono/routes/home.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport type { AuthenticatedRouteDeps } from './deps.js';\n\n/**\n * GET /api/home — Aggregated home screen data for the mobile app.\n *\n * Returns:\n * - recentlyOpened: notes sorted by lastOpenedAt (continue rail)\n * - inboxCount: number of notes with status === 'inbox'\n * - pendingTasks: task notes where done === false\n * - recentSessions: last 5 active AI sessions (threads)\n */\nexport function registerHomeRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const { service } = deps;\n\n authenticated.get('/api/home', async (c) => {\n const notes = service.notesServiceInstance;\n const sessions = service.sessions;\n\n const [recentlyOpened
|
|
1
|
+
{"version":3,"file":"home.js","names":[],"sources":["../../../../../src/gateway/hono/routes/home.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport { listGatewayAgents } from '../../agents-admin.js';\nimport { getTunnelService } from '../../../tunnel/index.js';\nimport { describeSchedule } from '../../../cron/index.js';\nimport type { CronRunHistoryRow, JobData } from '../../../cron/types.js';\nimport type { WorkflowRunSummary } from '../../../workflows/domain/index.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\n\ntype HomeWorkflowRun = {\n id: string;\n definitionId: string;\n title: string;\n status: WorkflowRunSummary['status'];\n sessionKey?: string;\n createdAtMs: number;\n startedAtMs?: number;\n completedAtMs?: number;\n metrics: WorkflowRunSummary['metrics'];\n};\n\ntype HomeCronJob = {\n id: string;\n name?: string;\n schedule: string;\n nextRunAt: string;\n payloadKind: string;\n};\n\ntype HomeCronRun = {\n id: string;\n jobId: string;\n jobName?: string;\n status: CronRunHistoryRow['status'];\n startedAt: string;\n endedAt?: string;\n error?: string;\n summary?: string;\n sessionKey?: string;\n workflowRunId?: string;\n};\n\nfunction toHomeWorkflowRun(run: WorkflowRunSummary): HomeWorkflowRun {\n return {\n id: run.id,\n definitionId: run.definitionId,\n title: run.title,\n status: run.status,\n sessionKey: run.metadata?.sessionKey,\n createdAtMs: run.createdAtMs,\n startedAtMs: run.startedAtMs,\n completedAtMs: run.completedAtMs,\n metrics: run.metrics,\n };\n}\n\nfunction payloadKind(job: JobData): string {\n const payload = job.payload as { kind?: unknown } | undefined;\n return typeof payload?.kind === 'string' ? payload.kind : 'unknown';\n}\n\nfunction toHomeCronJob(job: JobData): HomeCronJob | null {\n if (!job.enabled || !job.state.nextRunAtMs) return null;\n return {\n id: job.id,\n name: job.name,\n schedule: describeSchedule(job.schedule),\n nextRunAt: new Date(job.state.nextRunAtMs).toISOString(),\n payloadKind: payloadKind(job),\n };\n}\n\nfunction toHomeCronRun(run: CronRunHistoryRow): HomeCronRun {\n return {\n id: run.id,\n jobId: run.jobId,\n jobName: run.jobName,\n status: run.status,\n startedAt: run.startedAt,\n endedAt: run.endedAt,\n error: run.error,\n summary: run.summary,\n sessionKey: run.sessionKey,\n workflowRunId: run.workflowRunId,\n };\n}\n\n/**\n * GET /api/home — Aggregated home screen data for the mobile app.\n *\n * Returns:\n * - recentlyOpened: notes sorted by lastOpenedAt (continue rail)\n * - inboxCount: number of notes with status === 'inbox'\n * - pendingTasks: task notes where done === false\n * - recentSessions: last 5 active AI sessions (threads)\n * - activeAgent: default agent identity for this gateway\n * - gateway: readiness + public tunnel status\n * - workflowRuns: active / attention / recent workflow runs\n * - nextCronJobs: upcoming enabled schedules\n * - recentCronRuns: latest cron executions\n */\nexport function registerHomeRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const { service } = deps;\n\n authenticated.get('/api/home', async (c) => {\n const notes = service.notesServiceInstance;\n const sessions = service.sessions;\n const agents = await listGatewayAgents(service.currentConfig);\n const defaultAgent = agents.agents.find((agent) => agent.id === agents.defaultId) ?? agents.agents[0];\n const workflowRunService = service.createWorkflowRunService();\n const workflowRunStore = workflowRunService.createRunStore(defaultAgent?.id ?? agents.defaultId);\n const tunnel = getTunnelService().getStatus();\n const health = service.getHealth();\n\n const [\n recentlyOpened,\n inbox,\n pendingTasks,\n recentSessions,\n workflowRuns,\n cronJobs,\n recentCronRuns,\n ] = await Promise.all([\n notes.listNotes({ sortBy: 'lastOpenedAt', sortOrder: 'desc', limit: 10 }),\n notes.listNotes({ status: 'inbox', limit: 0 }),\n notes.listNotes({ pendingTasksOnly: true, sortBy: 'createdAt', sortOrder: 'desc', limit: 10 }),\n sessions.listSessions({ sortBy: 'updatedAt', sortOrder: 'desc', limit: 5 }),\n workflowRunStore.listRunSummaries(20),\n service.cronServiceInstance.listJobs(),\n service.cronServiceInstance.getAllRunsHistory(10),\n ]);\n\n const activeWorkflowRuns = workflowRuns\n .filter((run) => run.status === 'queued' || run.status === 'running')\n .slice(0, 5)\n .map(toHomeWorkflowRun);\n const attentionWorkflowRuns = workflowRuns\n .filter((run) => run.status === 'failed' || run.status === 'timeout')\n .slice(0, 5)\n .map(toHomeWorkflowRun);\n const recentWorkflowRuns = workflowRuns.slice(0, 5).map(toHomeWorkflowRun);\n const nextCronJobs = cronJobs\n .map(toHomeCronJob)\n .filter((job): job is HomeCronJob => Boolean(job))\n .sort((a, b) => Date.parse(a.nextRunAt) - Date.parse(b.nextRunAt))\n .slice(0, 5);\n\n return c.json({\n recentlyOpened: recentlyOpened.items.filter((n) => n.lastOpenedAt),\n inboxCount: inbox.total,\n pendingTasks: pendingTasks.items,\n pendingTaskCount: pendingTasks.total,\n recentSessions: recentSessions.items,\n activeAgent: defaultAgent\n ? {\n id: defaultAgent.id,\n name: defaultAgent.name,\n description: defaultAgent.description,\n }\n : { id: agents.defaultId },\n gateway: {\n status: health.status,\n ready: health.ready,\n httpListening: health.httpListening,\n version: health.version,\n uptime: health.uptime,\n tunnel: {\n state: tunnel.state,\n publicUrl: tunnel.publicUrl,\n connected: tunnel.state === 'connected',\n },\n },\n workflowRuns: {\n active: activeWorkflowRuns,\n attention: attentionWorkflowRuns,\n recent: recentWorkflowRuns,\n },\n nextCronJobs,\n recentCronRuns: recentCronRuns.slice(0, 5).map(toHomeCronRun),\n });\n });\n}\n"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createGatewayRouteLogger } from "../lib/route-logger.js";
|
|
2
|
-
import * as os$1 from "node:os";
|
|
3
|
-
import * as path$1 from "node:path";
|
|
4
2
|
import { readdir, realpath, stat } from "node:fs/promises";
|
|
3
|
+
import * as path$1 from "node:path";
|
|
4
|
+
import * as os$1 from "node:os";
|
|
5
5
|
//#region src/gateway/hono/routes/host-fs.ts
|
|
6
6
|
const log = createGatewayRouteLogger("HostFs");
|
|
7
7
|
function jsonError(status, message) {
|
|
@@ -115,6 +115,14 @@ const AUTHENTICATED_LAZY_ROUTE_BUNDLES = [
|
|
|
115
115
|
return { register: registerModelsRoutes };
|
|
116
116
|
}
|
|
117
117
|
},
|
|
118
|
+
{
|
|
119
|
+
id: "ai-assist",
|
|
120
|
+
match: (path) => startsWithAny(path, ["/api/ai"]),
|
|
121
|
+
load: async () => {
|
|
122
|
+
const { registerAiAssistRoutes } = await import("./ai-assist.js");
|
|
123
|
+
return { register: registerAiAssistRoutes };
|
|
124
|
+
}
|
|
125
|
+
},
|
|
118
126
|
{
|
|
119
127
|
id: "commands-skills",
|
|
120
128
|
match: (path) => startsWithAny(path, [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lazy-bundles.js","names":[],"sources":["../../../../../src/gateway/hono/routes/lazy-bundles.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport type { GatewayService } from '../../service.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\n\nexport type AuthenticatedLazyRouteBundle = {\n id: string;\n match: (path: string) => boolean;\n load: () => Promise<{ register: (authenticated: Hono, deps: AuthenticatedRouteDeps) => void }>;\n};\n\nexport type AppLazyRouteBundle = {\n id: string;\n prefixes: readonly string[];\n match: (path: string) => boolean;\n load: () => Promise<{\n registerOnApp: (app: Hono, service: GatewayService) => void;\n }>;\n};\n\nfunction startsWithAny(path: string, prefixes: readonly string[]): boolean {\n return prefixes.some((prefix) => path === prefix || path.startsWith(`${prefix}/`));\n}\n\nexport const AUTHENTICATED_LAZY_ROUTE_BUNDLES: readonly AuthenticatedLazyRouteBundle[] = [\n {\n id: 'media',\n match: (path) => startsWithAny(path, ['/api/media']),\n load: async () => {\n const { registerMediaRoutes } = await import('./media.js');\n return { register: registerMediaRoutes };\n },\n },\n {\n id: 'workspace',\n match: (path) => startsWithAny(path, ['/api/workspace']),\n load: async () => {\n const { registerWorkspaceRoutes } = await import('./workspace.js');\n return { register: registerWorkspaceRoutes };\n },\n },\n {\n id: 'host-fs',\n match: (path) => startsWithAny(path, ['/api/host/fs']),\n load: async () => {\n const { registerHostFsRoutes } = await import('./host-fs.js');\n return { register: registerHostFsRoutes };\n },\n },\n {\n id: 'channels',\n match: (path) => startsWithAny(path, ['/api/channels']),\n load: async () => {\n const { registerChannelRoutes } = await import('./channels.js');\n return { register: registerChannelRoutes };\n },\n },\n {\n id: 'browser-install',\n match: (path) =>\n path === '/api/browser/playwright/install/stream' ||\n path === '/api/browser/cloakbrowser/install/stream',\n load: async () => {\n const { registerBrowserInstallRoutes } = await import('./browser-install.js');\n return { register: registerBrowserInstallRoutes };\n },\n },\n {\n id: 'browser',\n // `browser-install` above already matched the SSE install streams; this\n // catches the remaining /api/browser/* handlers (extension, cdp,\n // cloakbrowser doctor/launch/install, playwright doctor/install, cloud).\n match: (path) => startsWithAny(path, ['/api/browser']),\n load: async () => {\n const { registerBrowserRoutes } = await import('./browser.js');\n return { register: registerBrowserRoutes };\n },\n },\n {\n id: 'config',\n match: (path) =>\n startsWithAny(path, [\n '/api/config',\n '/api/heartbeat/trigger',\n // Secret reveal handlers live in config routes but use /api/gateway and\n // /api/tools paths; without these prefixes the extension-gateway bundle\n // matches first and returns 404 (no handler for multi-segment paths).\n '/api/gateway/reveal-auth-secret',\n '/api/tools/web/reveal-search-api-key',\n ]),\n load: async () => {\n const { registerConfigRoutes } = await import('./config.js');\n return { register: registerConfigRoutes };\n },\n },\n {\n id: 'doctor',\n match: (path) => startsWithAny(path, ['/api/doctor']),\n load: async () => {\n const { registerDoctorRoutes } = await import('./doctor.js');\n return { register: registerDoctorRoutes };\n },\n },\n {\n id: 'dreaming',\n match: (path) => startsWithAny(path, ['/api/dreaming']),\n load: async () => {\n const { registerDreamingRoutes } = await import('./dreaming.js');\n return { register: registerDreamingRoutes };\n },\n },\n {\n id: 'agents',\n match: (path) => startsWithAny(path, ['/api/agents', '/api/voice/models']),\n load: async () => {\n const { registerAgentsRoutes } = await import('./agents.js');\n return { register: registerAgentsRoutes };\n },\n },\n {\n id: 'auth-registry-extensions',\n match: (path) =>\n startsWithAny(path, [\n '/api/auth',\n '/api/registry',\n '/api/extensions',\n '/api/context',\n '/api/marketplace',\n ]),\n load: async () => {\n const { registerAuthRegistryExtensionsRoutes } = await import('./auth-registry-extensions.js');\n return { register: registerAuthRegistryExtensionsRoutes };\n },\n },\n {\n id: 'models',\n match: (path) =>\n startsWithAny(path, ['/api/models', '/api/models-json', '/api/providers', '/api/image']),\n load: async () => {\n const { registerModelsRoutes } = await import('./models.js');\n return { register: registerModelsRoutes };\n },\n },\n {\n id: 'commands-skills',\n match: (path) => startsWithAny(path, ['/api/commands', '/api/skills', '/api/chat/skills']),\n load: async () => {\n const { registerCommandsSkillsRoutes } = await import('./commands-skills.js');\n return { register: registerCommandsSkillsRoutes };\n },\n },\n {\n id: 'cron',\n match: (path) => startsWithAny(path, ['/api/cron']),\n load: async () => {\n const { registerCronRoutes } = await import('./cron.js');\n return { register: registerCronRoutes };\n },\n },\n {\n id: 'goals',\n match: (path) => startsWithAny(path, ['/api/goals']),\n load: async () => {\n const { registerGoalsRoutes } = await import('./goals.js');\n return { register: registerGoalsRoutes };\n },\n },\n {\n id: 'notes',\n match: (path) => startsWithAny(path, ['/api/notes']),\n load: async () => {\n const { registerNotesRoutes } = await import('./notes.js');\n return { register: registerNotesRoutes };\n },\n },\n {\n id: 'home',\n match: (path) => startsWithAny(path, ['/api/home']),\n load: async () => {\n const { registerHomeRoutes } = await import('./home.js');\n return { register: registerHomeRoutes };\n },\n },\n {\n id: 'workflows',\n match: (path) => startsWithAny(path, ['/api/workflows']),\n load: async () => {\n const { registerWorkflowRoutes } = await import('./workflows.js');\n return { register: registerWorkflowRoutes };\n },\n },\n {\n id: 'logs',\n match: (path) => startsWithAny(path, ['/api/logs']),\n load: async () => {\n const { registerLogsRoutes } = await import('./logs.js');\n return { register: registerLogsRoutes };\n },\n },\n {\n id: 'shares',\n match: (path) => startsWithAny(path, ['/api/shares']),\n load: async () => {\n const { registerShareRoutes } = await import('./shares.js');\n return { register: registerShareRoutes };\n },\n },\n {\n id: 'site-shares',\n match: (path) => startsWithAny(path, ['/api/site-shares']),\n load: async () => {\n const { registerSiteShareRoutes } = await import('./site-shares.js');\n return { register: registerSiteShareRoutes };\n },\n },\n {\n id: 'tunnel',\n match: (path) => startsWithAny(path, ['/api/tunnel']),\n load: async () => {\n const { registerTunnelRoutes } = await import('./tunnel.js');\n return { register: registerTunnelRoutes };\n },\n },\n {\n id: 'exposure',\n match: (path) => startsWithAny(path, ['/api/exposure']),\n load: async () => {\n const { registerExposureRoutes } = await import('./exposure.js');\n return { register: registerExposureRoutes };\n },\n },\n {\n id: 'extension-gateway',\n match: (path) => startsWithAny(path, ['/api/gateway']),\n load: async () => {\n const { registerExtensionGatewayRoutes } = await import('./extension-gateway.js');\n return { register: registerExtensionGatewayRoutes };\n },\n },\n {\n id: 'update',\n match: (path) => startsWithAny(path, ['/api/update']),\n load: async () => {\n const { registerUpdateRoutes } = await import('./update.js');\n return { register: registerUpdateRoutes };\n },\n },\n {\n id: 'voice',\n match: (path) => startsWithAny(path, ['/api/voice']) && path !== '/api/voice/models',\n load: async () => {\n const { registerVoiceRoutes } = await import('./voice.js');\n return { register: registerVoiceRoutes };\n },\n },\n {\n id: 'connectors',\n match: (path) => startsWithAny(path, ['/api/connectors']),\n load: async () => {\n const { registerConnectorRoutes } = await import('./connectors.js');\n return { register: registerConnectorRoutes };\n },\n },\n {\n id: 'tui',\n match: (path) => startsWithAny(path, ['/api/tui']),\n load: async () => {\n const { registerTuiRoutes } = await import('./tui.js');\n return { register: registerTuiRoutes };\n },\n },\n {\n id: 'mcp',\n match: (path) => startsWithAny(path, ['/api/mcp']),\n load: async () => {\n const { registerMcpRoutes } = await import('./mcp.js');\n return { register: registerMcpRoutes };\n },\n },\n];\n\nexport const APP_LAZY_ROUTE_BUNDLES: readonly AppLazyRouteBundle[] = [\n {\n id: 'shares-public',\n prefixes: ['/s'],\n match: (path) => startsWithAny(path, ['/s']),\n load: async () => {\n const { registerSharePublicRoutes } = await import('./shares.js');\n return { registerOnApp: registerSharePublicRoutes };\n },\n },\n {\n id: 'tunnel-public',\n prefixes: [\n '/api/tunnel/pair/ping',\n '/api/tunnel/pair/validate-url',\n '/api/tunnel/exchange-token',\n ],\n match: (path) =>\n path === '/api/tunnel/exchange-token' ||\n path === '/api/tunnel/pair/ping' ||\n path === '/api/tunnel/pair/validate-url',\n load: async () => {\n const { registerTunnelPublicRoutes } = await import('./tunnel.js');\n return { registerOnApp: registerTunnelPublicRoutes };\n },\n },\n];\n\nexport function findAuthenticatedLazyRouteBundle(path: string): AuthenticatedLazyRouteBundle | undefined {\n return AUTHENTICATED_LAZY_ROUTE_BUNDLES.find((bundle) => bundle.match(path));\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"lazy-bundles.js","names":[],"sources":["../../../../../src/gateway/hono/routes/lazy-bundles.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport type { GatewayService } from '../../service.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\n\nexport type AuthenticatedLazyRouteBundle = {\n id: string;\n match: (path: string) => boolean;\n load: () => Promise<{ register: (authenticated: Hono, deps: AuthenticatedRouteDeps) => void }>;\n};\n\nexport type AppLazyRouteBundle = {\n id: string;\n prefixes: readonly string[];\n match: (path: string) => boolean;\n load: () => Promise<{\n registerOnApp: (app: Hono, service: GatewayService) => void;\n }>;\n};\n\nfunction startsWithAny(path: string, prefixes: readonly string[]): boolean {\n return prefixes.some((prefix) => path === prefix || path.startsWith(`${prefix}/`));\n}\n\nexport const AUTHENTICATED_LAZY_ROUTE_BUNDLES: readonly AuthenticatedLazyRouteBundle[] = [\n {\n id: 'media',\n match: (path) => startsWithAny(path, ['/api/media']),\n load: async () => {\n const { registerMediaRoutes } = await import('./media.js');\n return { register: registerMediaRoutes };\n },\n },\n {\n id: 'workspace',\n match: (path) => startsWithAny(path, ['/api/workspace']),\n load: async () => {\n const { registerWorkspaceRoutes } = await import('./workspace.js');\n return { register: registerWorkspaceRoutes };\n },\n },\n {\n id: 'host-fs',\n match: (path) => startsWithAny(path, ['/api/host/fs']),\n load: async () => {\n const { registerHostFsRoutes } = await import('./host-fs.js');\n return { register: registerHostFsRoutes };\n },\n },\n {\n id: 'channels',\n match: (path) => startsWithAny(path, ['/api/channels']),\n load: async () => {\n const { registerChannelRoutes } = await import('./channels.js');\n return { register: registerChannelRoutes };\n },\n },\n {\n id: 'browser-install',\n match: (path) =>\n path === '/api/browser/playwright/install/stream' ||\n path === '/api/browser/cloakbrowser/install/stream',\n load: async () => {\n const { registerBrowserInstallRoutes } = await import('./browser-install.js');\n return { register: registerBrowserInstallRoutes };\n },\n },\n {\n id: 'browser',\n // `browser-install` above already matched the SSE install streams; this\n // catches the remaining /api/browser/* handlers (extension, cdp,\n // cloakbrowser doctor/launch/install, playwright doctor/install, cloud).\n match: (path) => startsWithAny(path, ['/api/browser']),\n load: async () => {\n const { registerBrowserRoutes } = await import('./browser.js');\n return { register: registerBrowserRoutes };\n },\n },\n {\n id: 'config',\n match: (path) =>\n startsWithAny(path, [\n '/api/config',\n '/api/heartbeat/trigger',\n // Secret reveal handlers live in config routes but use /api/gateway and\n // /api/tools paths; without these prefixes the extension-gateway bundle\n // matches first and returns 404 (no handler for multi-segment paths).\n '/api/gateway/reveal-auth-secret',\n '/api/tools/web/reveal-search-api-key',\n ]),\n load: async () => {\n const { registerConfigRoutes } = await import('./config.js');\n return { register: registerConfigRoutes };\n },\n },\n {\n id: 'doctor',\n match: (path) => startsWithAny(path, ['/api/doctor']),\n load: async () => {\n const { registerDoctorRoutes } = await import('./doctor.js');\n return { register: registerDoctorRoutes };\n },\n },\n {\n id: 'dreaming',\n match: (path) => startsWithAny(path, ['/api/dreaming']),\n load: async () => {\n const { registerDreamingRoutes } = await import('./dreaming.js');\n return { register: registerDreamingRoutes };\n },\n },\n {\n id: 'agents',\n match: (path) => startsWithAny(path, ['/api/agents', '/api/voice/models']),\n load: async () => {\n const { registerAgentsRoutes } = await import('./agents.js');\n return { register: registerAgentsRoutes };\n },\n },\n {\n id: 'auth-registry-extensions',\n match: (path) =>\n startsWithAny(path, [\n '/api/auth',\n '/api/registry',\n '/api/extensions',\n '/api/context',\n '/api/marketplace',\n ]),\n load: async () => {\n const { registerAuthRegistryExtensionsRoutes } = await import('./auth-registry-extensions.js');\n return { register: registerAuthRegistryExtensionsRoutes };\n },\n },\n {\n id: 'models',\n match: (path) =>\n startsWithAny(path, ['/api/models', '/api/models-json', '/api/providers', '/api/image']),\n load: async () => {\n const { registerModelsRoutes } = await import('./models.js');\n return { register: registerModelsRoutes };\n },\n },\n {\n id: 'ai-assist',\n match: (path) => startsWithAny(path, ['/api/ai']),\n load: async () => {\n const { registerAiAssistRoutes } = await import('./ai-assist.js');\n return { register: registerAiAssistRoutes };\n },\n },\n {\n id: 'commands-skills',\n match: (path) => startsWithAny(path, ['/api/commands', '/api/skills', '/api/chat/skills']),\n load: async () => {\n const { registerCommandsSkillsRoutes } = await import('./commands-skills.js');\n return { register: registerCommandsSkillsRoutes };\n },\n },\n {\n id: 'cron',\n match: (path) => startsWithAny(path, ['/api/cron']),\n load: async () => {\n const { registerCronRoutes } = await import('./cron.js');\n return { register: registerCronRoutes };\n },\n },\n {\n id: 'goals',\n match: (path) => startsWithAny(path, ['/api/goals']),\n load: async () => {\n const { registerGoalsRoutes } = await import('./goals.js');\n return { register: registerGoalsRoutes };\n },\n },\n {\n id: 'notes',\n match: (path) => startsWithAny(path, ['/api/notes']),\n load: async () => {\n const { registerNotesRoutes } = await import('./notes.js');\n return { register: registerNotesRoutes };\n },\n },\n {\n id: 'home',\n match: (path) => startsWithAny(path, ['/api/home']),\n load: async () => {\n const { registerHomeRoutes } = await import('./home.js');\n return { register: registerHomeRoutes };\n },\n },\n {\n id: 'workflows',\n match: (path) => startsWithAny(path, ['/api/workflows']),\n load: async () => {\n const { registerWorkflowRoutes } = await import('./workflows.js');\n return { register: registerWorkflowRoutes };\n },\n },\n {\n id: 'logs',\n match: (path) => startsWithAny(path, ['/api/logs']),\n load: async () => {\n const { registerLogsRoutes } = await import('./logs.js');\n return { register: registerLogsRoutes };\n },\n },\n {\n id: 'shares',\n match: (path) => startsWithAny(path, ['/api/shares']),\n load: async () => {\n const { registerShareRoutes } = await import('./shares.js');\n return { register: registerShareRoutes };\n },\n },\n {\n id: 'site-shares',\n match: (path) => startsWithAny(path, ['/api/site-shares']),\n load: async () => {\n const { registerSiteShareRoutes } = await import('./site-shares.js');\n return { register: registerSiteShareRoutes };\n },\n },\n {\n id: 'tunnel',\n match: (path) => startsWithAny(path, ['/api/tunnel']),\n load: async () => {\n const { registerTunnelRoutes } = await import('./tunnel.js');\n return { register: registerTunnelRoutes };\n },\n },\n {\n id: 'exposure',\n match: (path) => startsWithAny(path, ['/api/exposure']),\n load: async () => {\n const { registerExposureRoutes } = await import('./exposure.js');\n return { register: registerExposureRoutes };\n },\n },\n {\n id: 'extension-gateway',\n match: (path) => startsWithAny(path, ['/api/gateway']),\n load: async () => {\n const { registerExtensionGatewayRoutes } = await import('./extension-gateway.js');\n return { register: registerExtensionGatewayRoutes };\n },\n },\n {\n id: 'update',\n match: (path) => startsWithAny(path, ['/api/update']),\n load: async () => {\n const { registerUpdateRoutes } = await import('./update.js');\n return { register: registerUpdateRoutes };\n },\n },\n {\n id: 'voice',\n match: (path) => startsWithAny(path, ['/api/voice']) && path !== '/api/voice/models',\n load: async () => {\n const { registerVoiceRoutes } = await import('./voice.js');\n return { register: registerVoiceRoutes };\n },\n },\n {\n id: 'connectors',\n match: (path) => startsWithAny(path, ['/api/connectors']),\n load: async () => {\n const { registerConnectorRoutes } = await import('./connectors.js');\n return { register: registerConnectorRoutes };\n },\n },\n {\n id: 'tui',\n match: (path) => startsWithAny(path, ['/api/tui']),\n load: async () => {\n const { registerTuiRoutes } = await import('./tui.js');\n return { register: registerTuiRoutes };\n },\n },\n {\n id: 'mcp',\n match: (path) => startsWithAny(path, ['/api/mcp']),\n load: async () => {\n const { registerMcpRoutes } = await import('./mcp.js');\n return { register: registerMcpRoutes };\n },\n },\n];\n\nexport const APP_LAZY_ROUTE_BUNDLES: readonly AppLazyRouteBundle[] = [\n {\n id: 'shares-public',\n prefixes: ['/s'],\n match: (path) => startsWithAny(path, ['/s']),\n load: async () => {\n const { registerSharePublicRoutes } = await import('./shares.js');\n return { registerOnApp: registerSharePublicRoutes };\n },\n },\n {\n id: 'tunnel-public',\n prefixes: [\n '/api/tunnel/pair/ping',\n '/api/tunnel/pair/validate-url',\n '/api/tunnel/exchange-token',\n ],\n match: (path) =>\n path === '/api/tunnel/exchange-token' ||\n path === '/api/tunnel/pair/ping' ||\n path === '/api/tunnel/pair/validate-url',\n load: async () => {\n const { registerTunnelPublicRoutes } = await import('./tunnel.js');\n return { registerOnApp: registerTunnelPublicRoutes };\n },\n },\n];\n\nexport function findAuthenticatedLazyRouteBundle(path: string): AuthenticatedLazyRouteBundle | undefined {\n return AUTHENTICATED_LAZY_ROUTE_BUNDLES.find((bundle) => bundle.match(path));\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { resolveModelsJsonPath } from "../../../config/paths.js";
|
|
2
1
|
import { init_resolve_config_value, testApiKeyResolution } from "../../../config/resolve-config-value.js";
|
|
2
|
+
import { resolveModelsJsonPath } from "../../../config/paths.js";
|
|
3
3
|
import { init_models_json, loadModelsJson, saveModelsJson, validateModelsConfig } from "../../../config/models-json.js";
|
|
4
4
|
import { getModelRegistry } from "../../../providers/model-registry.js";
|
|
5
5
|
import { CredentialResolver, init_credentials } from "../../../auth/credentials.js";
|
|
@@ -31,6 +31,12 @@ const VALID_CHANNELS = new Set([
|
|
|
31
31
|
"wechat",
|
|
32
32
|
"feishu"
|
|
33
33
|
]);
|
|
34
|
+
function noteNotFound() {
|
|
35
|
+
return {
|
|
36
|
+
error: "Note not found",
|
|
37
|
+
code: "note_not_found"
|
|
38
|
+
};
|
|
39
|
+
}
|
|
34
40
|
function parseCaptureSource(body) {
|
|
35
41
|
return {
|
|
36
42
|
channel: typeof body.channel === "string" && VALID_CHANNELS.has(body.channel) ? body.channel : "web",
|
|
@@ -81,7 +87,7 @@ function registerNotesRoutes(authenticated, deps) {
|
|
|
81
87
|
pinned: pinnedRaw === "true" ? true : pinnedRaw === "false" ? false : void 0,
|
|
82
88
|
limit: limitRaw ? parseInt(limitRaw, 10) : void 0,
|
|
83
89
|
offset: offsetRaw ? parseInt(offsetRaw, 10) : void 0,
|
|
84
|
-
sortBy: sortBy === "createdAt" || sortBy === "updatedAt" ? sortBy : void 0,
|
|
90
|
+
sortBy: sortBy === "createdAt" || sortBy === "updatedAt" || sortBy === "lastOpenedAt" ? sortBy : void 0,
|
|
85
91
|
sortOrder: sortOrder === "asc" || sortOrder === "desc" ? sortOrder : void 0
|
|
86
92
|
});
|
|
87
93
|
return c.json(result);
|
|
@@ -149,7 +155,7 @@ function registerNotesRoutes(authenticated, deps) {
|
|
|
149
155
|
const baseRemoteVersion = typeof body.baseRemoteVersion === "number" ? body.baseRemoteVersion : void 0;
|
|
150
156
|
const patch = buildNotePatch(body);
|
|
151
157
|
const result = await service.notesServiceInstance.syncNote(noteId, patch, baseRemoteVersion);
|
|
152
|
-
if (!result.note) return c.json(
|
|
158
|
+
if (!result.note) return c.json(noteNotFound(), 404);
|
|
153
159
|
if (result.conflict) return c.json({
|
|
154
160
|
conflict: true,
|
|
155
161
|
note: result.note
|
|
@@ -161,20 +167,20 @@ function registerNotesRoutes(authenticated, deps) {
|
|
|
161
167
|
});
|
|
162
168
|
authenticated.post("/api/notes/:id/catalyze", async (c) => {
|
|
163
169
|
const result = await service.notesServiceInstance.catalyzeNote(c.req.param("id"), service.currentConfig);
|
|
164
|
-
if (!result) return c.json(
|
|
170
|
+
if (!result) return c.json(noteNotFound(), 404);
|
|
165
171
|
return c.json(result);
|
|
166
172
|
});
|
|
167
173
|
authenticated.post("/api/notes/:id/catalysis-feedback", async (c) => {
|
|
168
174
|
const feedback = (await c.req.json().catch(() => ({}))).feedback;
|
|
169
175
|
if (feedback !== "helpful" && feedback !== "not_helpful" && feedback !== "neutral") return c.json({ error: "Invalid feedback" }, 400);
|
|
170
176
|
const note = await service.notesServiceInstance.recordCatalysisFeedback(c.req.param("id"), feedback);
|
|
171
|
-
if (!note) return c.json(
|
|
177
|
+
if (!note) return c.json(noteNotFound(), 404);
|
|
172
178
|
return c.json({ note });
|
|
173
179
|
});
|
|
174
180
|
authenticated.post("/api/notes/:id/chat", async (c) => {
|
|
175
181
|
const noteId = c.req.param("id");
|
|
176
182
|
const note = await service.notesServiceInstance.getNote(noteId);
|
|
177
|
-
if (!note) return c.json(
|
|
183
|
+
if (!note) return c.json(noteNotFound(), 404);
|
|
178
184
|
const body = await c.req.json().catch(() => ({}));
|
|
179
185
|
const routingCfg = service.currentConfig;
|
|
180
186
|
let agentId = typeof body.agentId === "string" && body.agentId.trim() ? body.agentId.trim().toLowerCase() : getDefaultAgentId(routingCfg);
|
|
@@ -243,18 +249,18 @@ function registerNotesRoutes(authenticated, deps) {
|
|
|
243
249
|
}
|
|
244
250
|
authenticated.get("/api/notes/:id/context-status", async (c) => {
|
|
245
251
|
const result = await service.notesServiceInstance.getAgentContextStatus(c.req.param("id"), service.currentConfig);
|
|
246
|
-
if (!result) return c.json(
|
|
252
|
+
if (!result) return c.json(noteNotFound(), 404);
|
|
247
253
|
return c.json(noteContextStatusPayload(result));
|
|
248
254
|
});
|
|
249
255
|
authenticated.post("/api/notes/:id/context-rebuild", async (c) => {
|
|
250
256
|
const result = await service.notesServiceInstance.getAgentContextStatus(c.req.param("id"), service.currentConfig, true);
|
|
251
|
-
if (!result) return c.json(
|
|
257
|
+
if (!result) return c.json(noteNotFound(), 404);
|
|
252
258
|
return c.json(noteContextStatusPayload(result));
|
|
253
259
|
});
|
|
254
260
|
authenticated.get("/api/notes/:id/threads", async (c) => {
|
|
255
261
|
const noteId = c.req.param("id");
|
|
256
262
|
const keys = await service.notesServiceInstance.listNoteThreads(noteId);
|
|
257
|
-
if (!keys) return c.json(
|
|
263
|
+
if (!keys) return c.json(noteNotFound(), 404);
|
|
258
264
|
const sessions = [];
|
|
259
265
|
for (const key of keys) {
|
|
260
266
|
const session = await service.sessions.getSession(key);
|
|
@@ -271,13 +277,13 @@ function registerNotesRoutes(authenticated, deps) {
|
|
|
271
277
|
const heading = typeof body.heading === "string" && body.heading.trim() ? body.heading.trim() : void 0;
|
|
272
278
|
if (!content) return c.json({ error: "Missing required field: content" }, 400);
|
|
273
279
|
const note = await service.notesServiceInstance.appendTextToNote(c.req.param("id"), content, heading);
|
|
274
|
-
if (!note) return c.json(
|
|
280
|
+
if (!note) return c.json(noteNotFound(), 404);
|
|
275
281
|
return c.json({ note });
|
|
276
282
|
});
|
|
277
283
|
authenticated.get("/api/notes/:id", async (c) => {
|
|
278
284
|
const id = c.req.param("id");
|
|
279
285
|
const note = await service.notesServiceInstance.getNote(id);
|
|
280
|
-
if (!note) return c.json(
|
|
286
|
+
if (!note) return c.json(noteNotFound(), 404);
|
|
281
287
|
return c.json({ note });
|
|
282
288
|
});
|
|
283
289
|
authenticated.patch("/api/notes/:id", async (c) => {
|
|
@@ -286,12 +292,12 @@ function registerNotesRoutes(authenticated, deps) {
|
|
|
286
292
|
const patch = buildNotePatch(body);
|
|
287
293
|
const trigger = body.trigger === "ai_edit" || body.trigger === "sync" || body.trigger === "restore" ? body.trigger : "edit";
|
|
288
294
|
const updated = await service.notesServiceInstance.updateNote(id, patch, trigger);
|
|
289
|
-
if (!updated) return c.json(
|
|
295
|
+
if (!updated) return c.json(noteNotFound(), 404);
|
|
290
296
|
return c.json({ note: updated });
|
|
291
297
|
});
|
|
292
298
|
authenticated.delete("/api/notes/:id", async (c) => {
|
|
293
299
|
const id = c.req.param("id");
|
|
294
|
-
if (!await service.notesServiceInstance.deleteNote(id)) return c.json(
|
|
300
|
+
if (!await service.notesServiceInstance.deleteNote(id)) return c.json(noteNotFound(), 404);
|
|
295
301
|
return c.json({ deleted: true });
|
|
296
302
|
});
|
|
297
303
|
authenticated.get("/api/notes/:id/history", async (c) => {
|
|
@@ -323,7 +329,7 @@ function registerNotesRoutes(authenticated, deps) {
|
|
|
323
329
|
if (!instruction) return c.json({ error: "Missing required field: instruction" }, 400);
|
|
324
330
|
const markdown = typeof body.markdown === "string" ? body.markdown : void 0;
|
|
325
331
|
const result = await service.notesServiceInstance.createAiEditPatch(id, instruction, markdown);
|
|
326
|
-
if (!result) return c.json(
|
|
332
|
+
if (!result) return c.json(noteNotFound(), 404);
|
|
327
333
|
return c.json(result);
|
|
328
334
|
});
|
|
329
335
|
authenticated.post("/api/notes/:id/media", async (c) => {
|
|
@@ -353,7 +359,7 @@ function registerNotesRoutes(authenticated, deps) {
|
|
|
353
359
|
mimeType,
|
|
354
360
|
duration: Number.isFinite(duration) ? duration : void 0
|
|
355
361
|
});
|
|
356
|
-
if (!attachment) return c.json(
|
|
362
|
+
if (!attachment) return c.json(noteNotFound(), 404);
|
|
357
363
|
return c.json({ attachment }, 201);
|
|
358
364
|
});
|
|
359
365
|
authenticated.get("/api/notes/:id/media/:attachmentId", async (c) => {
|