@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
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { getSqliteDatabase, runSqliteWriteTransaction } from "../storage/sqlite/transaction.js";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
//#region src/goals/goal-queue-store.ts
|
|
4
|
+
function parsePayload(raw) {
|
|
5
|
+
try {
|
|
6
|
+
const parsed = JSON.parse(raw);
|
|
7
|
+
return parsed && typeof parsed === "object" ? parsed : {};
|
|
8
|
+
} catch {
|
|
9
|
+
return {};
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
function rowToSnapshot(row) {
|
|
13
|
+
const payload = parsePayload(row.payload_json);
|
|
14
|
+
return {
|
|
15
|
+
id: row.queue_id,
|
|
16
|
+
goalId: row.goal_id,
|
|
17
|
+
status: row.status,
|
|
18
|
+
attempts: row.attempts,
|
|
19
|
+
maxRetries: row.max_retries,
|
|
20
|
+
enqueuedAt: row.enqueued_at,
|
|
21
|
+
startedAt: row.started_at ?? void 0,
|
|
22
|
+
finishedAt: row.finished_at ?? void 0,
|
|
23
|
+
nextRunAt: row.next_run_at ?? void 0,
|
|
24
|
+
sessionKey: row.session_key ?? void 0,
|
|
25
|
+
message: payload.message,
|
|
26
|
+
lastError: row.last_error ?? void 0,
|
|
27
|
+
source: row.source
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
var GoalQueueStore = class {
|
|
31
|
+
enqueue(input) {
|
|
32
|
+
return runSqliteWriteTransaction((db) => {
|
|
33
|
+
const existing = db.prepare(`SELECT * FROM goal_queue
|
|
34
|
+
WHERE goal_id = ?
|
|
35
|
+
AND status IN ('queued', 'running', 'retry_waiting')
|
|
36
|
+
ORDER BY enqueued_at DESC
|
|
37
|
+
LIMIT 1`).get(input.goalId);
|
|
38
|
+
if (existing) return rowToSnapshot(existing);
|
|
39
|
+
const now = Date.now();
|
|
40
|
+
const row = {
|
|
41
|
+
queue_id: randomUUID(),
|
|
42
|
+
goal_id: input.goalId,
|
|
43
|
+
status: "queued",
|
|
44
|
+
payload_json: JSON.stringify({ message: input.message }),
|
|
45
|
+
attempts: 0,
|
|
46
|
+
max_retries: input.maxRetries,
|
|
47
|
+
enqueued_at: now,
|
|
48
|
+
started_at: null,
|
|
49
|
+
finished_at: null,
|
|
50
|
+
next_run_at: null,
|
|
51
|
+
session_key: null,
|
|
52
|
+
last_error: null,
|
|
53
|
+
source: input.source
|
|
54
|
+
};
|
|
55
|
+
db.prepare(`INSERT INTO goal_queue (
|
|
56
|
+
queue_id, goal_id, status, payload_json, attempts, max_retries,
|
|
57
|
+
enqueued_at, source
|
|
58
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`).run(row.queue_id, row.goal_id, row.status, row.payload_json, row.attempts, row.max_retries, row.enqueued_at, row.source);
|
|
59
|
+
return rowToSnapshot(row);
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
claimNext(now = Date.now()) {
|
|
63
|
+
return runSqliteWriteTransaction((db) => {
|
|
64
|
+
const row = db.prepare(`SELECT * FROM goal_queue
|
|
65
|
+
WHERE status = 'queued'
|
|
66
|
+
OR (status = 'retry_waiting' AND COALESCE(next_run_at, 0) <= ?)
|
|
67
|
+
ORDER BY enqueued_at ASC
|
|
68
|
+
LIMIT 1`).get(now);
|
|
69
|
+
if (!row) return null;
|
|
70
|
+
const startedAt = Date.now();
|
|
71
|
+
db.prepare(`UPDATE goal_queue
|
|
72
|
+
SET status = 'running',
|
|
73
|
+
started_at = ?,
|
|
74
|
+
attempts = attempts + 1,
|
|
75
|
+
last_error = NULL
|
|
76
|
+
WHERE queue_id = ?`).run(startedAt, row.queue_id);
|
|
77
|
+
return rowToSnapshot(db.prepare(`SELECT * FROM goal_queue WHERE queue_id = ?`).get(row.queue_id));
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
markRetry(itemId, error, nextRunAt) {
|
|
81
|
+
return this.update(itemId, {
|
|
82
|
+
status: "retry_waiting",
|
|
83
|
+
next_run_at: nextRunAt,
|
|
84
|
+
last_error: error,
|
|
85
|
+
finished_at: null
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
markFinished(itemId, status, error) {
|
|
89
|
+
return this.update(itemId, {
|
|
90
|
+
status,
|
|
91
|
+
finished_at: Date.now(),
|
|
92
|
+
last_error: error ?? null
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
setSessionKey(itemId, sessionKey) {
|
|
96
|
+
return this.update(itemId, { session_key: sessionKey });
|
|
97
|
+
}
|
|
98
|
+
list(limit = 200) {
|
|
99
|
+
const safeLimit = Math.min(500, Math.max(1, Math.floor(limit)));
|
|
100
|
+
return getSqliteDatabase().prepare(`SELECT * FROM goal_queue ORDER BY enqueued_at DESC LIMIT ?`).all(safeLimit).map(rowToSnapshot);
|
|
101
|
+
}
|
|
102
|
+
resetRunningToRetry(reason = "Gateway restarted during goal run") {
|
|
103
|
+
return runSqliteWriteTransaction((db) => {
|
|
104
|
+
const result = db.prepare(`UPDATE goal_queue
|
|
105
|
+
SET status = 'retry_waiting',
|
|
106
|
+
next_run_at = ?,
|
|
107
|
+
last_error = ?
|
|
108
|
+
WHERE status = 'running'`).run(Date.now(), reason);
|
|
109
|
+
return Number(result.changes ?? 0);
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
update(itemId, patch) {
|
|
113
|
+
return runSqliteWriteTransaction((db) => {
|
|
114
|
+
const row = db.prepare(`SELECT * FROM goal_queue WHERE queue_id = ?`).get(itemId);
|
|
115
|
+
if (!row) return null;
|
|
116
|
+
const next = {
|
|
117
|
+
...row,
|
|
118
|
+
...patch
|
|
119
|
+
};
|
|
120
|
+
db.prepare(`UPDATE goal_queue SET
|
|
121
|
+
status = ?, attempts = ?, started_at = ?, finished_at = ?,
|
|
122
|
+
next_run_at = ?, session_key = ?, last_error = ?
|
|
123
|
+
WHERE queue_id = ?`).run(next.status, next.attempts, next.started_at, next.finished_at, next.next_run_at, next.session_key, next.last_error, itemId);
|
|
124
|
+
return rowToSnapshot(db.prepare(`SELECT * FROM goal_queue WHERE queue_id = ?`).get(itemId));
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
//#endregion
|
|
129
|
+
export { GoalQueueStore };
|
|
130
|
+
|
|
131
|
+
//# sourceMappingURL=goal-queue-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"goal-queue-store.js","names":[],"sources":["../../../src/goals/goal-queue-store.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport { getSqliteDatabase, runSqliteWriteTransaction } from '../storage/sqlite/transaction.js';\n\nimport type { GoalQueueItemSnapshot, GoalQueueStatus } from './goal-queue-types.js';\n\ntype GoalQueueRow = {\n queue_id: string;\n goal_id: string;\n status: GoalQueueStatus;\n payload_json: string;\n attempts: number;\n max_retries: number;\n enqueued_at: number;\n started_at: number | null;\n finished_at: number | null;\n next_run_at: number | null;\n session_key: string | null;\n last_error: string | null;\n source: GoalQueueItemSnapshot['source'];\n};\n\ntype GoalQueuePayload = {\n message?: string;\n};\n\nfunction parsePayload(raw: string): GoalQueuePayload {\n try {\n const parsed = JSON.parse(raw) as GoalQueuePayload;\n return parsed && typeof parsed === 'object' ? parsed : {};\n } catch {\n return {};\n }\n}\n\nfunction rowToSnapshot(row: GoalQueueRow): GoalQueueItemSnapshot {\n const payload = parsePayload(row.payload_json);\n return {\n id: row.queue_id,\n goalId: row.goal_id,\n status: row.status,\n attempts: row.attempts,\n maxRetries: row.max_retries,\n enqueuedAt: row.enqueued_at,\n startedAt: row.started_at ?? undefined,\n finishedAt: row.finished_at ?? undefined,\n nextRunAt: row.next_run_at ?? undefined,\n sessionKey: row.session_key ?? undefined,\n message: payload.message,\n lastError: row.last_error ?? undefined,\n source: row.source,\n };\n}\n\nexport class GoalQueueStore {\n enqueue(input: {\n goalId: string;\n message?: string;\n maxRetries: number;\n source: GoalQueueItemSnapshot['source'];\n }): GoalQueueItemSnapshot {\n return runSqliteWriteTransaction((db) => {\n const existing = db\n .prepare(\n `SELECT * FROM goal_queue\n WHERE goal_id = ?\n AND status IN ('queued', 'running', 'retry_waiting')\n ORDER BY enqueued_at DESC\n LIMIT 1`,\n )\n .get(input.goalId) as GoalQueueRow | undefined;\n if (existing) return rowToSnapshot(existing);\n\n const now = Date.now();\n const row: GoalQueueRow = {\n queue_id: randomUUID(),\n goal_id: input.goalId,\n status: 'queued',\n payload_json: JSON.stringify({ message: input.message }),\n attempts: 0,\n max_retries: input.maxRetries,\n enqueued_at: now,\n started_at: null,\n finished_at: null,\n next_run_at: null,\n session_key: null,\n last_error: null,\n source: input.source,\n };\n db.prepare(\n `INSERT INTO goal_queue (\n queue_id, goal_id, status, payload_json, attempts, max_retries,\n enqueued_at, source\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n row.queue_id,\n row.goal_id,\n row.status,\n row.payload_json,\n row.attempts,\n row.max_retries,\n row.enqueued_at,\n row.source,\n );\n return rowToSnapshot(row);\n });\n }\n\n claimNext(now = Date.now()): GoalQueueItemSnapshot | null {\n return runSqliteWriteTransaction((db) => {\n const row = db\n .prepare(\n `SELECT * FROM goal_queue\n WHERE status = 'queued'\n OR (status = 'retry_waiting' AND COALESCE(next_run_at, 0) <= ?)\n ORDER BY enqueued_at ASC\n LIMIT 1`,\n )\n .get(now) as GoalQueueRow | undefined;\n if (!row) return null;\n\n const startedAt = Date.now();\n db.prepare(\n `UPDATE goal_queue\n SET status = 'running',\n started_at = ?,\n attempts = attempts + 1,\n last_error = NULL\n WHERE queue_id = ?`,\n ).run(startedAt, row.queue_id);\n\n const next = db\n .prepare(`SELECT * FROM goal_queue WHERE queue_id = ?`)\n .get(row.queue_id) as GoalQueueRow;\n return rowToSnapshot(next);\n });\n }\n\n markRetry(itemId: string, error: string, nextRunAt: number): GoalQueueItemSnapshot | null {\n return this.update(itemId, {\n status: 'retry_waiting',\n next_run_at: nextRunAt,\n last_error: error,\n finished_at: null,\n });\n }\n\n markFinished(itemId: string, status: GoalQueueStatus, error?: string): GoalQueueItemSnapshot | null {\n return this.update(itemId, {\n status,\n finished_at: Date.now(),\n last_error: error ?? null,\n });\n }\n\n setSessionKey(itemId: string, sessionKey: string): GoalQueueItemSnapshot | null {\n return this.update(itemId, { session_key: sessionKey });\n }\n\n list(limit = 200): GoalQueueItemSnapshot[] {\n const safeLimit = Math.min(500, Math.max(1, Math.floor(limit)));\n const rows = getSqliteDatabase()\n .prepare(`SELECT * FROM goal_queue ORDER BY enqueued_at DESC LIMIT ?`)\n .all(safeLimit) as GoalQueueRow[];\n return rows.map(rowToSnapshot);\n }\n\n resetRunningToRetry(reason = 'Gateway restarted during goal run'): number {\n return runSqliteWriteTransaction((db) => {\n const result = db\n .prepare(\n `UPDATE goal_queue\n SET status = 'retry_waiting',\n next_run_at = ?,\n last_error = ?\n WHERE status = 'running'`,\n )\n .run(Date.now(), reason);\n return Number(result.changes ?? 0);\n });\n }\n\n private update(itemId: string, patch: Partial<GoalQueueRow>): GoalQueueItemSnapshot | null {\n return runSqliteWriteTransaction((db) => {\n const row = db\n .prepare(`SELECT * FROM goal_queue WHERE queue_id = ?`)\n .get(itemId) as GoalQueueRow | undefined;\n if (!row) return null;\n const next = { ...row, ...patch };\n db.prepare(\n `UPDATE goal_queue SET\n status = ?, attempts = ?, started_at = ?, finished_at = ?,\n next_run_at = ?, session_key = ?, last_error = ?\n WHERE queue_id = ?`,\n ).run(\n next.status,\n next.attempts,\n next.started_at,\n next.finished_at,\n next.next_run_at,\n next.session_key,\n next.last_error,\n itemId,\n );\n const updated = db\n .prepare(`SELECT * FROM goal_queue WHERE queue_id = ?`)\n .get(itemId) as GoalQueueRow;\n return rowToSnapshot(updated);\n });\n }\n}\n\n"],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { GoalWithDetails } from './types.js';
|
|
2
|
+
export type GoalQueueStatus = 'queued' | 'running' | 'retry_waiting' | 'succeeded' | 'failed' | 'skipped';
|
|
3
|
+
export interface GoalQueueItemSnapshot {
|
|
4
|
+
id: string;
|
|
5
|
+
goalId: string;
|
|
6
|
+
status: GoalQueueStatus;
|
|
7
|
+
attempts: number;
|
|
8
|
+
maxRetries: number;
|
|
9
|
+
enqueuedAt: number;
|
|
10
|
+
startedAt?: number;
|
|
11
|
+
finishedAt?: number;
|
|
12
|
+
nextRunAt?: number;
|
|
13
|
+
sessionKey?: string;
|
|
14
|
+
message?: string;
|
|
15
|
+
lastError?: string;
|
|
16
|
+
source: 'api' | 'cron' | 'workflow' | 'system';
|
|
17
|
+
}
|
|
18
|
+
export interface GoalRunnerOptions {
|
|
19
|
+
maxConcurrent?: number;
|
|
20
|
+
defaultMaxRetries?: number;
|
|
21
|
+
retryBaseMs?: number;
|
|
22
|
+
ensureSession: (goal: GoalWithDetails) => Promise<string>;
|
|
23
|
+
hasActiveRun: (sessionKey: string) => boolean;
|
|
24
|
+
runContinuation: (sessionKey: string, message: string) => Promise<void>;
|
|
25
|
+
emit?: (type: string, payload: unknown) => void;
|
|
26
|
+
}
|
|
27
|
+
export interface EnqueueGoalRunOptions {
|
|
28
|
+
message?: string;
|
|
29
|
+
maxRetries?: number;
|
|
30
|
+
source?: GoalQueueItemSnapshot['source'];
|
|
31
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { EnqueueGoalRunOptions, GoalQueueItemSnapshot, GoalRunnerOptions } from './goal-queue-types.js';
|
|
2
|
+
export declare class GoalRunner {
|
|
3
|
+
private readonly opts;
|
|
4
|
+
private readonly goals;
|
|
5
|
+
private readonly store;
|
|
6
|
+
private active;
|
|
7
|
+
private pumpTimer;
|
|
8
|
+
constructor(opts: GoalRunnerOptions);
|
|
9
|
+
enqueue(goalId: string, options?: EnqueueGoalRunOptions): GoalQueueItemSnapshot;
|
|
10
|
+
snapshot(): GoalQueueItemSnapshot[];
|
|
11
|
+
private schedulePump;
|
|
12
|
+
private pump;
|
|
13
|
+
private runItem;
|
|
14
|
+
private retry;
|
|
15
|
+
private finish;
|
|
16
|
+
private emit;
|
|
17
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { createLogger } from "../utils/logger/index.js";
|
|
2
|
+
import { init_logger } from "../utils/logger.js";
|
|
3
|
+
import { GoalService } from "./goal-service.js";
|
|
4
|
+
import { GoalQueueStore } from "./goal-queue-store.js";
|
|
5
|
+
//#region src/goals/goal-runner.ts
|
|
6
|
+
init_logger();
|
|
7
|
+
const log = createLogger("GoalRunner");
|
|
8
|
+
function terminalGoalStatus(status) {
|
|
9
|
+
return status === "done" || status === "archived";
|
|
10
|
+
}
|
|
11
|
+
var GoalRunner = class {
|
|
12
|
+
goals = new GoalService();
|
|
13
|
+
store = new GoalQueueStore();
|
|
14
|
+
active = 0;
|
|
15
|
+
pumpTimer = null;
|
|
16
|
+
constructor(opts) {
|
|
17
|
+
this.opts = opts;
|
|
18
|
+
this.store.resetRunningToRetry();
|
|
19
|
+
this.schedulePump(0);
|
|
20
|
+
}
|
|
21
|
+
enqueue(goalId, options = {}) {
|
|
22
|
+
const item = this.store.enqueue({
|
|
23
|
+
goalId,
|
|
24
|
+
maxRetries: Math.max(0, Math.floor(options.maxRetries ?? this.opts.defaultMaxRetries ?? 2)),
|
|
25
|
+
message: options.message?.trim() || void 0,
|
|
26
|
+
source: options.source ?? "api"
|
|
27
|
+
});
|
|
28
|
+
this.emit("goal.queue.updated", item);
|
|
29
|
+
this.schedulePump(0);
|
|
30
|
+
return item;
|
|
31
|
+
}
|
|
32
|
+
snapshot() {
|
|
33
|
+
return this.store.list();
|
|
34
|
+
}
|
|
35
|
+
schedulePump(delayMs) {
|
|
36
|
+
if (this.pumpTimer) return;
|
|
37
|
+
this.pumpTimer = setTimeout(() => {
|
|
38
|
+
this.pumpTimer = null;
|
|
39
|
+
this.pump();
|
|
40
|
+
}, delayMs);
|
|
41
|
+
}
|
|
42
|
+
async pump() {
|
|
43
|
+
const maxConcurrent = Math.max(1, Math.floor(this.opts.maxConcurrent ?? 1));
|
|
44
|
+
while (this.active < maxConcurrent) {
|
|
45
|
+
const item = this.store.claimNext();
|
|
46
|
+
if (!item) break;
|
|
47
|
+
this.active += 1;
|
|
48
|
+
this.runItem(item).finally(() => {
|
|
49
|
+
this.active -= 1;
|
|
50
|
+
this.schedulePump(0);
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
const nextRetry = this.store.list().filter((item) => item.status === "retry_waiting" && item.nextRunAt).sort((a, b) => (a.nextRunAt ?? 0) - (b.nextRunAt ?? 0))[0];
|
|
54
|
+
if (nextRetry) this.schedulePump(Math.max(0, (nextRetry.nextRunAt ?? Date.now()) - Date.now()));
|
|
55
|
+
}
|
|
56
|
+
async runItem(item) {
|
|
57
|
+
this.emit("goal.queue.updated", item);
|
|
58
|
+
try {
|
|
59
|
+
const goal = this.goals.get(item.goalId);
|
|
60
|
+
if (!goal) {
|
|
61
|
+
this.finish(item, "failed", "Goal not found");
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
if (terminalGoalStatus(goal.status)) {
|
|
65
|
+
this.finish(item, "skipped", `Goal is ${goal.status}`);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
const activeGoal = goal.status === "paused" || goal.status === "blocked" || goal.status === "needs_input" ? this.goals.resume(goal.id) : goal;
|
|
69
|
+
if (!activeGoal) {
|
|
70
|
+
this.finish(item, "failed", "Goal not found");
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const sessionKey = activeGoal.activeSessionKey ?? await this.opts.ensureSession(activeGoal);
|
|
74
|
+
item = this.store.setSessionKey(item.id, sessionKey) ?? {
|
|
75
|
+
...item,
|
|
76
|
+
sessionKey
|
|
77
|
+
};
|
|
78
|
+
if (this.opts.hasActiveRun(sessionKey)) {
|
|
79
|
+
this.retry(item, "Goal session already has an active run");
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const message = item.message || activeGoal.nextAction || activeGoal.title;
|
|
83
|
+
await this.opts.runContinuation(sessionKey, message);
|
|
84
|
+
this.finish(item, "succeeded");
|
|
85
|
+
} catch (err) {
|
|
86
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
87
|
+
if (item.attempts <= item.maxRetries) this.retry(item, message);
|
|
88
|
+
else this.finish(item, "failed", message);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
retry(item, error) {
|
|
92
|
+
const base = Math.max(1e3, this.opts.retryBaseMs ?? 5e3);
|
|
93
|
+
item.status = "retry_waiting";
|
|
94
|
+
item.lastError = error;
|
|
95
|
+
item.nextRunAt = Date.now() + base * 2 ** Math.max(0, item.attempts - 1);
|
|
96
|
+
item = this.store.markRetry(item.id, error, item.nextRunAt) ?? item;
|
|
97
|
+
log.warn({
|
|
98
|
+
goalId: item.goalId,
|
|
99
|
+
attempts: item.attempts,
|
|
100
|
+
nextRunAt: item.nextRunAt,
|
|
101
|
+
errorMessage: error
|
|
102
|
+
}, `Goal run queued for retry: ${error}`);
|
|
103
|
+
this.emit("goal.queue.updated", item);
|
|
104
|
+
this.schedulePump(Math.max(0, item.nextRunAt - Date.now()));
|
|
105
|
+
}
|
|
106
|
+
finish(item, status, error) {
|
|
107
|
+
item = this.store.markFinished(item.id, status, error) ?? {
|
|
108
|
+
...item,
|
|
109
|
+
status,
|
|
110
|
+
finishedAt: Date.now(),
|
|
111
|
+
lastError: error
|
|
112
|
+
};
|
|
113
|
+
if (status === "failed") log.warn({
|
|
114
|
+
goalId: item.goalId,
|
|
115
|
+
attempts: item.attempts,
|
|
116
|
+
errorMessage: error
|
|
117
|
+
}, `Goal run failed: ${error}`);
|
|
118
|
+
this.emit("goal.queue.updated", item);
|
|
119
|
+
}
|
|
120
|
+
emit(type, item) {
|
|
121
|
+
this.opts.emit?.(type, { item: { ...item } });
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
//#endregion
|
|
125
|
+
export { GoalRunner };
|
|
126
|
+
|
|
127
|
+
//# sourceMappingURL=goal-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"goal-runner.js","names":[],"sources":["../../../src/goals/goal-runner.ts"],"sourcesContent":["import { GoalQueueStore } from './goal-queue-store.js';\nimport { GoalService } from './goal-service.js';\nimport type { EnqueueGoalRunOptions, GoalQueueItemSnapshot, GoalQueueStatus, GoalRunnerOptions } from './goal-queue-types.js';\nimport type { GoalWithDetails } from './types.js';\nimport { createLogger } from '../utils/logger.js';\n\nconst log = createLogger('GoalRunner');\n\nfunction terminalGoalStatus(status: GoalWithDetails['status']): boolean {\n return status === 'done' || status === 'archived';\n}\n\nexport class GoalRunner {\n private readonly goals = new GoalService();\n private readonly store = new GoalQueueStore();\n private active = 0;\n private pumpTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(private readonly opts: GoalRunnerOptions) {\n this.store.resetRunningToRetry();\n this.schedulePump(0);\n }\n\n enqueue(goalId: string, options: EnqueueGoalRunOptions = {}): GoalQueueItemSnapshot {\n const item = this.store.enqueue({\n goalId,\n maxRetries: Math.max(0, Math.floor(options.maxRetries ?? this.opts.defaultMaxRetries ?? 2)),\n message: options.message?.trim() || undefined,\n source: options.source ?? 'api',\n });\n this.emit('goal.queue.updated', item);\n this.schedulePump(0);\n return item;\n }\n\n snapshot(): GoalQueueItemSnapshot[] {\n return this.store.list();\n }\n\n private schedulePump(delayMs: number): void {\n if (this.pumpTimer) return;\n this.pumpTimer = setTimeout(() => {\n this.pumpTimer = null;\n void this.pump();\n }, delayMs);\n }\n\n private async pump(): Promise<void> {\n const maxConcurrent = Math.max(1, Math.floor(this.opts.maxConcurrent ?? 1));\n while (this.active < maxConcurrent) {\n const item = this.store.claimNext();\n if (!item) break;\n this.active += 1;\n void this.runItem(item).finally(() => {\n this.active -= 1;\n this.schedulePump(0);\n });\n }\n\n const nextRetry = this.store.list()\n .filter((item) => item.status === 'retry_waiting' && item.nextRunAt)\n .sort((a, b) => (a.nextRunAt ?? 0) - (b.nextRunAt ?? 0))[0];\n if (nextRetry) this.schedulePump(Math.max(0, (nextRetry.nextRunAt ?? Date.now()) - Date.now()));\n }\n\n private async runItem(item: GoalQueueItemSnapshot): Promise<void> {\n this.emit('goal.queue.updated', item);\n try {\n const goal = this.goals.get(item.goalId);\n if (!goal) {\n this.finish(item, 'failed', 'Goal not found');\n return;\n }\n if (terminalGoalStatus(goal.status)) {\n this.finish(item, 'skipped', `Goal is ${goal.status}`);\n return;\n }\n const activeGoal =\n goal.status === 'paused' || goal.status === 'blocked' || goal.status === 'needs_input'\n ? this.goals.resume(goal.id)\n : goal;\n if (!activeGoal) {\n this.finish(item, 'failed', 'Goal not found');\n return;\n }\n const sessionKey = activeGoal.activeSessionKey ?? (await this.opts.ensureSession(activeGoal));\n item = this.store.setSessionKey(item.id, sessionKey) ?? { ...item, sessionKey };\n if (this.opts.hasActiveRun(sessionKey)) {\n this.retry(item, 'Goal session already has an active run');\n return;\n }\n const message = item.message || activeGoal.nextAction || activeGoal.title;\n await this.opts.runContinuation(sessionKey, message);\n this.finish(item, 'succeeded');\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n if (item.attempts <= item.maxRetries) {\n this.retry(item, message);\n } else {\n this.finish(item, 'failed', message);\n }\n }\n }\n\n private retry(item: GoalQueueItemSnapshot, error: string): void {\n const base = Math.max(1_000, this.opts.retryBaseMs ?? 5_000);\n item.status = 'retry_waiting';\n item.lastError = error;\n item.nextRunAt = Date.now() + base * 2 ** Math.max(0, item.attempts - 1);\n item = this.store.markRetry(item.id, error, item.nextRunAt) ?? item;\n log.warn({ goalId: item.goalId, attempts: item.attempts, nextRunAt: item.nextRunAt, errorMessage: error }, `Goal run queued for retry: ${error}`);\n this.emit('goal.queue.updated', item);\n this.schedulePump(Math.max(0, item.nextRunAt - Date.now()));\n }\n\n private finish(item: GoalQueueItemSnapshot, status: GoalQueueStatus, error?: string): void {\n item = this.store.markFinished(item.id, status, error) ?? { ...item, status, finishedAt: Date.now(), lastError: error };\n if (status === 'failed') {\n log.warn({ goalId: item.goalId, attempts: item.attempts, errorMessage: error }, `Goal run failed: ${error}`);\n }\n this.emit('goal.queue.updated', item);\n }\n\n private emit(type: string, item: GoalQueueItemSnapshot): void {\n this.opts.emit?.(type, { item: { ...item } });\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import type { Config } from '../config/schema.js';
|
|
2
|
+
import { GoalStore } from './goal-store.js';
|
|
3
|
+
import type { CreateGoalInput, Goal, GoalChecklistAddedBy, GoalChecklistStatus, GoalJudgeDecision, GoalListQuery, GoalSource, GoalStatus, GoalUiLocale, GoalWithDetails } from './types.js';
|
|
4
|
+
export declare class GoalService {
|
|
5
|
+
private readonly store;
|
|
6
|
+
constructor(store?: GoalStore);
|
|
7
|
+
create(input: Omit<CreateGoalInput, 'maxTurns' | 'agentId'> & {
|
|
8
|
+
maxTurns?: number;
|
|
9
|
+
agentId?: string;
|
|
10
|
+
config?: Config;
|
|
11
|
+
}): Goal;
|
|
12
|
+
get(goalId: string): GoalWithDetails | null;
|
|
13
|
+
getActiveForSession(sessionKey: string): GoalWithDetails | null;
|
|
14
|
+
list(query?: GoalListQuery): GoalWithDetails[];
|
|
15
|
+
update(goalId: string, patch: Partial<Pick<Goal, 'title' | 'description' | 'priority' | 'deadlineAt' | 'maxTurns' | 'judgeModelRef' | 'nextAction' | 'blockedReason' | 'activeSessionKey' | 'uiLocale'>>): GoalWithDetails | null;
|
|
16
|
+
setStatus(goalId: string, status: GoalStatus, opts?: {
|
|
17
|
+
reason?: string;
|
|
18
|
+
}): GoalWithDetails | null;
|
|
19
|
+
pause(goalId: string, reason?: string): GoalWithDetails | null;
|
|
20
|
+
resume(goalId: string): GoalWithDetails | null;
|
|
21
|
+
reopen(goalId: string): GoalWithDetails | null;
|
|
22
|
+
complete(goalId: string): GoalWithDetails | null;
|
|
23
|
+
archive(goalId: string): GoalWithDetails | null;
|
|
24
|
+
unarchive(goalId: string): GoalWithDetails | null;
|
|
25
|
+
attachSession(goalId: string, sessionKey: string): GoalWithDetails | null;
|
|
26
|
+
updateChecklist(goalId: string, op: {
|
|
27
|
+
type: 'add';
|
|
28
|
+
text: string;
|
|
29
|
+
addedBy?: GoalChecklistAddedBy;
|
|
30
|
+
} | {
|
|
31
|
+
type: 'mark';
|
|
32
|
+
itemId: string;
|
|
33
|
+
status: GoalChecklistStatus;
|
|
34
|
+
evidenceSummary?: string;
|
|
35
|
+
} | {
|
|
36
|
+
type: 'remove';
|
|
37
|
+
itemId: string;
|
|
38
|
+
} | {
|
|
39
|
+
type: 'reset';
|
|
40
|
+
}): GoalWithDetails | null;
|
|
41
|
+
recordJudgeDecision(input: {
|
|
42
|
+
goalId: string;
|
|
43
|
+
sessionKey: string;
|
|
44
|
+
source: GoalSource;
|
|
45
|
+
decision: GoalJudgeDecision;
|
|
46
|
+
}): GoalWithDetails | null;
|
|
47
|
+
syncPostTurnState(input: {
|
|
48
|
+
goalId: string;
|
|
49
|
+
sessionKey: string;
|
|
50
|
+
source: GoalSource;
|
|
51
|
+
status: GoalStatus;
|
|
52
|
+
turnsUsed: number;
|
|
53
|
+
maxTurns: number;
|
|
54
|
+
reason?: string;
|
|
55
|
+
nextAction?: string;
|
|
56
|
+
assistantPreview?: string;
|
|
57
|
+
verdict: 'continue' | 'done' | 'blocked' | 'needs_input' | 'decompose';
|
|
58
|
+
confidence?: number;
|
|
59
|
+
missingEvidence?: string[];
|
|
60
|
+
userQuestion?: string;
|
|
61
|
+
completedChecklistItemIds?: string[];
|
|
62
|
+
checklist?: Array<{
|
|
63
|
+
text: string;
|
|
64
|
+
status: 'pending' | 'completed' | 'impossible';
|
|
65
|
+
addedBy: 'user' | 'judge';
|
|
66
|
+
addedAt?: number;
|
|
67
|
+
completedAt?: number;
|
|
68
|
+
evidenceSummary?: string;
|
|
69
|
+
}>;
|
|
70
|
+
}): GoalWithDetails | null;
|
|
71
|
+
listRuns(goalId: string, limit?: number): import("./types.js").GoalRun[];
|
|
72
|
+
listRunsForSession(sessionKey: string, limit?: number): import("./types.js").GoalRun[];
|
|
73
|
+
listEvents(goalId: string, limit?: number): import("./types.js").GoalEvent[];
|
|
74
|
+
addEvidence(input: Parameters<GoalStore['addEvidence']>[0]): import("./types.js").GoalEvidence;
|
|
75
|
+
listEvidence(goalId: string, limit?: number): import("./types.js").GoalEvidence[];
|
|
76
|
+
}
|
|
77
|
+
export declare function normalizeGoalUiLocale(raw: unknown): GoalUiLocale | undefined;
|