@xopcai/xopc 0.0.121 → 0.0.123
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -3
- package/README.zh-CN.md +23 -3
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-4AW4JgSU.js → agent-avatar-dicebear-Bicr3ZBg.js} +1 -1
- package/dist/gateway/static/root/assets/agents-CxDSFHGx.js +2 -0
- package/dist/gateway/static/root/assets/{app-management-settings-panel-CE6GkGU2.js → app-management-settings-panel-CbEy9sR1.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-BmaUjghw.js → appearance-settings-CTHja6n9.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-CyZdgqvm.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-CX4_KWut.js → archive-plugin-Bpy64GjU.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-jf-PIIUU.js → attachment-load-DMkp4xSb.js} +1 -1
- package/dist/gateway/static/root/assets/automation-suggestion-card-KnYaP7NT.js +1 -0
- package/dist/gateway/static/root/assets/automations-page-8VLKM4au.js +1 -0
- package/dist/gateway/static/root/assets/{binary-plugins-DG9XQikd.js → binary-plugins-DA9C5mCw.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-Up_VIxLJ.js → block-editor-CiSXk_YC.js} +6 -6
- package/dist/gateway/static/root/assets/browser-settings-page-5tPg0DcP.js +8 -0
- package/dist/gateway/static/root/assets/{capability-presets-api-CGM4OyMw.js → capability-presets-api-CEJ44WCU.js} +1 -1
- package/dist/gateway/static/root/assets/{capability-presets-settings-panel-CzWt0LBb.js → capability-presets-settings-panel-BJW3aVST.js} +1 -1
- package/dist/gateway/static/root/assets/{channel-recipient-api-BEByL4_o.js → channel-recipient-api-CDhrhfhN.js} +1 -1
- package/dist/gateway/static/root/assets/channels-settings-CorUCTrs.js +1 -0
- package/dist/gateway/static/root/assets/connectors-page-VKstC3sP.js +2 -0
- package/dist/gateway/static/root/assets/directory-picker-path-field-7jKfbH0J.js +1 -0
- package/dist/gateway/static/root/assets/dreaming-settings-m1-wmz4o.js +1 -0
- package/dist/gateway/static/root/assets/{extension-debug-page-DZxa_j7-.js → extension-debug-page-C9qQQrBS.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-CseziW53.js → extension-page-DcBBMEGl.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-B_9J-xyo.js → extension-settings-page-BQ-jMMP9.js} +1 -1
- package/dist/gateway/static/root/assets/{fetch-Cs4ck8zA.js → fetch-Dtpbbe0s.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-api-Dl223a7r.js → gateway-config-api-BN6pyX2c.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-settings-hQtgVmSR.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-startup-retry-IvePwjFE.js → gateway-startup-retry-BIET2x3y.js} +1 -1
- package/dist/gateway/static/root/assets/goal-create-dialog-BuIMDx6C.js +1 -0
- package/dist/gateway/static/root/assets/goal-detail-page-FEypCq74.js +1 -0
- package/dist/gateway/static/root/assets/{goals-config-api-CUCP6yCl.js → goals-config-api-CQm2r1Ty.js} +1 -1
- package/dist/gateway/static/root/assets/goals-page-C4-2_MLG.js +2 -0
- package/dist/gateway/static/root/assets/{goals-settings-Dj87qPxv.js → goals-settings-DDrdRMxB.js} +1 -1
- package/dist/gateway/static/root/assets/heartbeat-settings-BJVok3Sl.js +1 -0
- package/dist/gateway/static/root/assets/index-CBDr5xjB.css +1 -0
- package/dist/gateway/static/root/assets/index-T0SaNd5a.js +191 -0
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-DJgYw0nB.js → keyboard-shortcuts-settings-C2TuQppb.js} +1 -1
- package/dist/gateway/static/root/assets/logs-page-DwkwPgid.js +2 -0
- package/dist/gateway/static/root/assets/{markdown-split-gnQ_EiGo.js → markdown-split-DhONQ81k.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-CQV-mgJn.js → media-plugins-DS44pJzr.js} +1 -1
- package/dist/gateway/static/root/assets/messages-avfvyZuQ.js +3 -0
- package/dist/gateway/static/root/assets/models-hub-panel-huNY4A1G.js +2 -0
- package/dist/gateway/static/root/assets/notes-page-DdfGuEZ1.js +1 -0
- package/dist/gateway/static/root/assets/notes-workbench-B0bT9Hqa.js +2 -0
- package/dist/gateway/static/root/assets/{preview-open-alternatives-BPMXC-2u.js → preview-open-alternatives-Dej6zHnr.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-CjxhPorG.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-C4Z5OJMF.js +1 -0
- package/dist/gateway/static/root/assets/remote-access-hub-CVCOPUVd.js +1 -0
- package/dist/gateway/static/root/assets/{save-bar-controls-BEHqwZjz.js → save-bar-controls-Zu1FzH6z.js} +1 -1
- package/dist/gateway/static/root/assets/{schedule-field-CMY25m97.js → schedule-field-BW78mKc0.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-CxjxsFfg.js → schema-form-Cc-IOydE.js} +1 -1
- package/dist/gateway/static/root/assets/segmented-styles-BL8oLBEp.js +1 -0
- package/dist/gateway/static/root/assets/sessions-page-B4qExXHC.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-Ce8yLTBi.js +1 -0
- package/dist/gateway/static/root/assets/{settings-collapsible-section-s-kiLAxP.js → settings-collapsible-section-DIpIYht_.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-form-section-CIxIEYxU.js → settings-form-section-BFxBNxOG.js} +1 -1
- package/dist/gateway/static/root/assets/settings-page-C4fivemT.js +1 -0
- package/dist/gateway/static/root/assets/settings-page-layout-CLx4o2PN.js +1 -0
- package/dist/gateway/static/root/assets/setup-status-panel-Kyc4eUf0.js +1 -0
- package/dist/gateway/static/root/assets/share-preview-page-ZswWCrDu.js +2 -0
- package/dist/gateway/static/root/assets/shares-settings-Bu76CMiC.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-D-CFg86j.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-CUU4f6Ss.js +2 -0
- package/dist/gateway/static/root/assets/{system-settings-panel-Czjf0kLJ.js → system-settings-panel-3ZNcGRhS.js} +1 -1
- package/dist/gateway/static/root/assets/{typed-models-lib-Cmt8SYdI.js → typed-models-lib-bpzZjiVF.js} +1 -1
- package/dist/gateway/static/root/assets/{use-channel-catalog-DyM-ckEQ.js → use-channel-catalog-BCjZLZ3O.js} +1 -1
- package/dist/gateway/static/root/assets/{user-profile-settings-panel-BygLv8vm.js → user-profile-settings-panel-CIXafITi.js} +1 -1
- package/dist/gateway/static/root/assets/{utils-CloW8coB.js → utils-DXMtz5j_.js} +1 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-C1MrQD8R.js +1 -0
- package/dist/gateway/static/root/assets/workflow-run-setup-panel-DqizIcY5.js +3 -0
- package/dist/gateway/static/root/assets/workflow-start-dialog-B4sZpTDQ.js +1 -0
- package/dist/gateway/static/root/assets/workflows-page-B3sVNPFk.js +18 -0
- package/dist/gateway/static/root/index.html +5 -5
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.d.ts +2 -0
- package/dist/src/agent/agent-manager.js +47 -7
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/context/project-context.d.ts +19 -0
- package/dist/src/agent/context/project-context.js +90 -0
- package/dist/src/agent/context/project-context.js.map +1 -0
- package/dist/src/agent/goals/goal-locale.js +2 -2
- package/dist/src/agent/memory/types.d.ts +1 -0
- package/dist/src/agent/prompt/service-prompt-builder.d.ts +1 -0
- package/dist/src/agent/prompt/service-prompt-builder.js +2 -0
- package/dist/src/agent/prompt/service-prompt-builder.js.map +1 -1
- package/dist/src/agent/prompt/system-prompt-params.d.ts +2 -0
- package/dist/src/agent/prompt/system-prompt-params.js +1 -0
- package/dist/src/agent/prompt/system-prompt-params.js.map +1 -1
- package/dist/src/agent/prompt/system-prompt.d.ts +1 -0
- package/dist/src/agent/prompt/system-prompt.js +2 -1
- package/dist/src/agent/prompt/system-prompt.js.map +1 -1
- package/dist/src/agent/service.js +4 -3
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/session/session-config-service.js +6 -1
- package/dist/src/agent/session/session-config-service.js.map +1 -1
- package/dist/src/agent/session/session-hydrator.js +7 -3
- package/dist/src/agent/session/session-hydrator.js.map +1 -1
- package/dist/src/agent/session/session-inspector.js +9 -5
- package/dist/src/agent/session/session-inspector.js.map +1 -1
- package/dist/src/agent/starter-agents.js +5 -34
- package/dist/src/agent/starter-agents.js.map +1 -1
- package/dist/src/agent/tools/factory.js +1 -1
- package/dist/src/agent/tools/factory.js.map +1 -1
- package/dist/src/agent/tools/goal-tool.d.ts +5 -1
- package/dist/src/agent/tools/goal-tool.js +8 -2
- package/dist/src/agent/tools/goal-tool.js.map +1 -1
- package/dist/src/agent/tools/index.d.ts +1 -1
- package/dist/src/agent/workflow/index.js +2 -2
- package/dist/src/agent/workflow/runtime.js +1 -1
- package/dist/src/automations/api/routes.js +13 -2
- package/dist/src/automations/api/routes.js.map +1 -1
- package/dist/src/automations/domain/types.d.ts +2 -0
- package/dist/src/automations/domain/validation.d.ts +3 -0
- package/dist/src/automations/domain/validation.js +1 -0
- package/dist/src/automations/domain/validation.js.map +1 -1
- package/dist/src/automations/draft/automation-draft-validator.d.ts +1 -0
- package/dist/src/automations/service/action-executor.js +3 -1
- package/dist/src/automations/service/action-executor.js.map +1 -1
- package/dist/src/automations/service/automation-service.d.ts +4 -1
- package/dist/src/automations/service/automation-service.js +2 -2
- package/dist/src/automations/service/automation-service.js.map +1 -1
- package/dist/src/automations/storage/automation-repository.d.ts +3 -1
- package/dist/src/automations/storage/automation-repository.js +7 -5
- package/dist/src/automations/storage/automation-repository.js.map +1 -1
- package/dist/src/automations/storage/automation-run-repository.d.ts +1 -0
- package/dist/src/automations/storage/automation-run-repository.js +12 -1
- package/dist/src/automations/storage/automation-run-repository.js.map +1 -1
- package/dist/src/chat-commands/builtins/goal.js +4 -1
- package/dist/src/chat-commands/builtins/goal.js.map +1 -1
- package/dist/src/chat-commands/context.js +2 -1
- package/dist/src/chat-commands/context.js.map +1 -1
- package/dist/src/cli/command-loaders.js +1 -0
- package/dist/src/cli/command-loaders.js.map +1 -1
- package/dist/src/cli/command-manifest.js +4 -0
- package/dist/src/cli/command-manifest.js.map +1 -1
- package/dist/src/cli/commands/agent.js +2 -2
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
- package/dist/src/cli/commands/goal.js +27 -4
- package/dist/src/cli/commands/goal.js.map +1 -1
- package/dist/src/cli/commands/models.js +1 -1
- package/dist/src/cli/commands/onboard.js +1 -1
- package/dist/src/cli/commands/profile.js +1 -1
- package/dist/src/cli/commands/project.d.ts +4 -0
- package/dist/src/cli/commands/project.js +239 -0
- package/dist/src/cli/commands/project.js.map +1 -0
- package/dist/src/cli/commands/tunnel.js +1 -1
- package/dist/src/cli/commands/update.js +1 -1
- package/dist/src/cli/extension-cli-register.js +1 -1
- package/dist/src/config/index.js +1 -1
- package/dist/src/gateway/hono/routes/goals.js +51 -4
- package/dist/src/gateway/hono/routes/goals.js.map +1 -1
- package/dist/src/gateway/hono/routes/index.js +2 -0
- package/dist/src/gateway/hono/routes/index.js.map +1 -1
- package/dist/src/gateway/hono/routes/memory.js +5 -1
- package/dist/src/gateway/hono/routes/memory.js.map +1 -1
- package/dist/src/gateway/hono/routes/notes.js +5 -0
- package/dist/src/gateway/hono/routes/notes.js.map +1 -1
- package/dist/src/gateway/hono/routes/projects.d.ts +3 -0
- package/dist/src/gateway/hono/routes/projects.js +662 -0
- package/dist/src/gateway/hono/routes/projects.js.map +1 -0
- package/dist/src/gateway/hono/routes/sessions.js +47 -7
- package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
- package/dist/src/gateway/hono/routes/workflows.js +27 -4
- package/dist/src/gateway/hono/routes/workflows.js.map +1 -1
- package/dist/src/gateway/run-loop.js +1 -1
- package/dist/src/gateway/service.d.ts +3 -0
- package/dist/src/gateway/service.js +10 -3
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/goals/goal-service.d.ts +1 -1
- package/dist/src/goals/goal-service.js +2 -1
- package/dist/src/goals/goal-service.js.map +1 -1
- package/dist/src/goals/goal-store.d.ts +1 -1
- package/dist/src/goals/goal-store.js +12 -6
- package/dist/src/goals/goal-store.js.map +1 -1
- package/dist/src/goals/goal-workflow-judge.js +1 -1
- package/dist/src/goals/types.d.ts +3 -0
- package/dist/src/i18n/goals-bundle.js +1 -1
- package/dist/src/i18n/index.js +1 -1
- package/dist/src/i18n/share-tool-bundle.js +2 -2
- package/dist/src/notes/agent-context.js +2 -2
- package/dist/src/projects/automation-bind.d.ts +1 -0
- package/dist/src/projects/automation-bind.js +16 -0
- package/dist/src/projects/automation-bind.js.map +1 -0
- package/dist/src/projects/goal-bind.d.ts +4 -0
- package/dist/src/projects/goal-bind.js +40 -0
- package/dist/src/projects/goal-bind.js.map +1 -0
- package/dist/src/projects/index.d.ts +12 -0
- package/dist/src/projects/index.js +12 -0
- package/dist/src/projects/memory-bind.d.ts +1 -0
- package/dist/src/projects/memory-bind.js +16 -0
- package/dist/src/projects/memory-bind.js.map +1 -0
- package/dist/src/projects/project-agent.d.ts +10 -0
- package/dist/src/projects/project-agent.js +27 -0
- package/dist/src/projects/project-agent.js.map +1 -0
- package/dist/src/projects/project-loop.d.ts +58 -0
- package/dist/src/projects/project-loop.js +118 -0
- package/dist/src/projects/project-loop.js.map +1 -0
- package/dist/src/projects/project-service.d.ts +40 -0
- package/dist/src/projects/project-service.js +187 -0
- package/dist/src/projects/project-service.js.map +1 -0
- package/dist/src/projects/project-store.d.ts +31 -0
- package/dist/src/projects/project-store.js +193 -0
- package/dist/src/projects/project-store.js.map +1 -0
- package/dist/src/projects/session-bind.d.ts +5 -0
- package/dist/src/projects/session-bind.js +46 -0
- package/dist/src/projects/session-bind.js.map +1 -0
- package/dist/src/projects/types.d.ts +62 -0
- package/dist/src/projects/types.js +1 -0
- package/dist/src/projects/workflow-bind.d.ts +1 -0
- package/dist/src/projects/workflow-bind.js +16 -0
- package/dist/src/projects/workflow-bind.js.map +1 -0
- package/dist/src/projects/workspace-project.d.ts +22 -0
- package/dist/src/projects/workspace-project.js +143 -0
- package/dist/src/projects/workspace-project.js.map +1 -0
- package/dist/src/projects/workspace.d.ts +5 -0
- package/dist/src/projects/workspace.js +25 -0
- package/dist/src/projects/workspace.js.map +1 -0
- package/dist/src/session/index.d.ts +1 -1
- package/dist/src/session/index.js +3 -3
- package/dist/src/session/session-workspace.d.ts +4 -2
- package/dist/src/session/session-workspace.js +10 -3
- package/dist/src/session/session-workspace.js.map +1 -1
- package/dist/src/session/types.d.ts +3 -0
- package/dist/src/session/types.js.map +1 -1
- package/dist/src/storage/sqlite/memory-records-repository.d.ts +3 -0
- package/dist/src/storage/sqlite/memory-records-repository.js +16 -5
- package/dist/src/storage/sqlite/memory-records-repository.js.map +1 -1
- package/dist/src/storage/sqlite/migrations/019_projects.sql +40 -0
- package/dist/src/storage/sqlite/migrations/020_project_default_agent.sql +1 -0
- package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
- package/dist/src/storage/sqlite/migrations/runner.js +3 -3
- package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
- package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
- package/dist/src/storage/sqlite/notes-repository.js +20 -4
- package/dist/src/storage/sqlite/notes-repository.js.map +1 -1
- package/dist/src/storage/sqlite/row-mappers.d.ts +2 -0
- package/dist/src/storage/sqlite/row-mappers.js +2 -0
- package/dist/src/storage/sqlite/row-mappers.js.map +1 -1
- package/dist/src/storage/sqlite/schema.js +1 -1
- package/dist/src/storage/sqlite/session-repository.js +10 -5
- package/dist/src/storage/sqlite/session-repository.js.map +1 -1
- package/dist/src/storage/sqlite/transcript-repository.js +8 -0
- package/dist/src/storage/sqlite/transcript-repository.js.map +1 -1
- package/dist/src/tui/backends/embedded-backend.d.ts +7 -1
- package/dist/src/tui/backends/embedded-backend.js +41 -2
- package/dist/src/tui/backends/embedded-backend.js.map +1 -1
- package/dist/src/tui/backends/gateway-sse-backend.d.ts +7 -1
- package/dist/src/tui/backends/gateway-sse-backend.js +22 -0
- package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
- package/dist/src/tui/tui-backend.d.ts +16 -0
- package/dist/src/tui/tui-commands.js +145 -0
- package/dist/src/tui/tui-commands.js.map +1 -1
- package/dist/src/tui/tui.js +21 -0
- package/dist/src/tui/tui.js.map +1 -1
- package/dist/src/workflows/domain/run.d.ts +1 -0
- package/dist/src/workflows/domain/run.js.map +1 -1
- package/dist/src/workflows/index.js +1 -1
- package/dist/src/workflows/service/workflow-run-service.d.ts +1 -0
- package/dist/src/workflows/service/workflow-run-service.js +18 -4
- package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
- package/dist/src/workflows/service/workflow-run-service.types.d.ts +2 -0
- package/dist/src/workflows/service/workflow-session-bridge.d.ts +1 -0
- package/dist/src/workflows/service/workflow-session-bridge.js +3 -0
- package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
- package/dist/src/workflows/store/run-index-store.d.ts +1 -0
- package/dist/src/workflows/store/run-index-store.js +13 -3
- package/dist/src/workflows/store/run-index-store.js.map +1 -1
- package/dist/src/workflows/store/run-store.d.ts +3 -1
- package/dist/src/workflows/store/run-store.js +5 -2
- package/dist/src/workflows/store/run-store.js.map +1 -1
- package/package.json +10 -1
- package/dist/gateway/static/root/assets/agents-2SVUUPlp.js +0 -2
- package/dist/gateway/static/root/assets/apps-page-BWeQ1I49.js +0 -1
- package/dist/gateway/static/root/assets/automation-suggestion-card-BHk5rtJz.js +0 -1
- package/dist/gateway/static/root/assets/automations-page-QHotl53D.js +0 -1
- package/dist/gateway/static/root/assets/browser-settings-page-Cmwi6IIQ.js +0 -8
- package/dist/gateway/static/root/assets/channels-settings-BOMCUe2J.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-C-Dexk_F.js +0 -2
- package/dist/gateway/static/root/assets/dreaming-settings-WPEj8pir.js +0 -1
- package/dist/gateway/static/root/assets/gateway-settings-DdzbtW9R.js +0 -1
- package/dist/gateway/static/root/assets/goal-detail-page-Dxldogms.js +0 -1
- package/dist/gateway/static/root/assets/goals-page-DU5Nd6Xp.js +0 -2
- package/dist/gateway/static/root/assets/heartbeat-settings-Cgm5JmwH.js +0 -1
- package/dist/gateway/static/root/assets/index-BU1pvxmS.js +0 -191
- package/dist/gateway/static/root/assets/index-l54WfSqe.css +0 -1
- package/dist/gateway/static/root/assets/logs-page-C10aS4XO.js +0 -2
- package/dist/gateway/static/root/assets/messages-C6Kc4Jhf.js +0 -3
- package/dist/gateway/static/root/assets/models-hub-panel-B35CAfg6.js +0 -2
- package/dist/gateway/static/root/assets/note-detail-page-Brlwse8x.js +0 -2
- package/dist/gateway/static/root/assets/note-image-lightbox-BthwKjLA.js +0 -1
- package/dist/gateway/static/root/assets/note-time-hm6JO_Wi.js +0 -1
- package/dist/gateway/static/root/assets/notes-page-CoAwRc7L.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-B36RQ05h.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-73THChnj.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-CR9VsY-R.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-BJ1AhfKI.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-layout--6qT7ZJa.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-C1TtS1vJ.js +0 -1
- package/dist/gateway/static/root/assets/share-preview-page-BZADSbS1.js +0 -2
- package/dist/gateway/static/root/assets/shares-settings-gqC8Rmhy.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-C9P-WYvS.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-CEpSvOhF.js +0 -2
- package/dist/gateway/static/root/assets/voice-api-key-field-BsoqJba6.js +0 -1
- package/dist/gateway/static/root/assets/voice-player-store-DduWlJYV.js +0 -1
- package/dist/gateway/static/root/assets/workflow-run-setup-panel-CcQeX6l5.js +0 -3
- package/dist/gateway/static/root/assets/workflows-page-CeA8A9Ef.js +0 -18
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"goal-store.js","names":[],"sources":["../../../src/goals/goal-store.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport { getSqliteDatabase, runSqliteWriteTransaction } from '../storage/sqlite/transaction.js';\nimport type {\n CreateGoalInput,\n Goal,\n GoalChecklistAddedBy,\n GoalChecklistItem,\n GoalChecklistStatus,\n GoalContextAttachment,\n GoalContextMessage,\n GoalEvent,\n GoalEvidence,\n GoalListQuery,\n GoalPriority,\n GoalRun,\n GoalRunStatus,\n GoalRunVerdict,\n GoalSource,\n GoalStatus,\n} from './types.js';\n\ntype GoalRow = {\n goal_id: string;\n title: string;\n description: string | null;\n status: string;\n agent_id: string;\n priority: string;\n deadline_at: number | null;\n created_at: number;\n updated_at: number;\n completed_at: number | null;\n archived_at: number | null;\n active_session_key: string | null;\n current_run_id: string | null;\n next_action: string | null;\n blocked_reason: string | null;\n judge_model_ref: string | null;\n max_turns: number;\n turns_used: number;\n ui_locale: string | null;\n source: string;\n};\n\ntype ChecklistRow = {\n item_id: string;\n goal_id: string;\n text: string;\n status: string;\n added_by: string;\n added_at: number;\n completed_at: number | null;\n evidence_summary: string | null;\n sort_order: number;\n};\n\ntype GoalRunRow = {\n run_id: string;\n goal_id: string;\n session_key: string;\n source: string;\n status: string;\n started_at: number;\n finished_at: number | null;\n verdict: string | null;\n reason: string | null;\n next_action: string | null;\n assistant_preview: string | null;\n checklist_done: number | null;\n checklist_total: number | null;\n confidence: number | null;\n missing_evidence_json: string | null;\n user_question: string | null;\n completed_checklist_item_ids_json: string | null;\n};\n\ntype EventRow = {\n event_id: string;\n goal_id: string;\n run_id: string | null;\n kind: string;\n message: string;\n data_json: string | null;\n created_at: number;\n};\n\ntype EvidenceRow = {\n evidence_id: string;\n goal_id: string;\n run_id: string | null;\n kind: GoalEvidence['kind'];\n title: string;\n summary: string | null;\n uri: string | null;\n data_json: string | null;\n created_at: number;\n};\n\ntype GoalContextRow = {\n goal_id: string;\n text: string;\n attachments_json: string;\n created_at: number;\n updated_at: number;\n};\n\nfunction goalFromRow(row: GoalRow): Goal {\n return {\n id: row.goal_id,\n title: row.title,\n description: row.description ?? undefined,\n status: row.status as GoalStatus,\n agentId: row.agent_id,\n priority: row.priority as GoalPriority,\n deadlineAt: row.deadline_at ?? undefined,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n completedAt: row.completed_at ?? undefined,\n archivedAt: row.archived_at ?? undefined,\n activeSessionKey: row.active_session_key ?? undefined,\n currentRunId: row.current_run_id ?? undefined,\n nextAction: row.next_action ?? undefined,\n blockedReason: row.blocked_reason ?? undefined,\n judgeModelRef: row.judge_model_ref ?? undefined,\n maxTurns: row.max_turns,\n turnsUsed: row.turns_used,\n uiLocale: row.ui_locale === 'en' || row.ui_locale === 'zh' ? row.ui_locale : undefined,\n source: row.source as GoalSource,\n };\n}\n\nfunction checklistFromRow(row: ChecklistRow): GoalChecklistItem {\n return {\n id: row.item_id,\n goalId: row.goal_id,\n text: row.text,\n status: row.status as GoalChecklistStatus,\n addedBy: row.added_by as GoalChecklistAddedBy,\n addedAt: row.added_at,\n completedAt: row.completed_at ?? undefined,\n evidenceSummary: row.evidence_summary ?? undefined,\n sortOrder: row.sort_order,\n };\n}\n\nfunction runFromRow(row: GoalRunRow): GoalRun {\n return {\n id: row.run_id,\n goalId: row.goal_id,\n sessionKey: row.session_key,\n source: row.source as GoalSource,\n status: row.status as GoalRunStatus,\n startedAt: row.started_at,\n finishedAt: row.finished_at ?? undefined,\n verdict: row.verdict ? (row.verdict as GoalRunVerdict) : undefined,\n reason: row.reason ?? undefined,\n nextAction: row.next_action ?? undefined,\n assistantPreview: row.assistant_preview ?? undefined,\n checklistProgress:\n row.checklist_done != null && row.checklist_total != null\n ? { done: row.checklist_done, total: row.checklist_total }\n : undefined,\n confidence: row.confidence ?? undefined,\n missingEvidence: parseJsonStringArray(row.missing_evidence_json),\n userQuestion: row.user_question ?? undefined,\n completedChecklistItemIds: parseJsonStringArray(row.completed_checklist_item_ids_json),\n };\n}\n\nfunction parseJsonField(raw: string | null): unknown {\n if (!raw) return undefined;\n try {\n return JSON.parse(raw) as unknown;\n } catch {\n return undefined;\n }\n}\n\nfunction parseJsonStringArray(raw: string | null): string[] | undefined {\n const value = parseJsonField(raw);\n if (!Array.isArray(value)) return undefined;\n const rows = value.filter((item): item is string => typeof item === 'string' && item.trim().length > 0);\n return rows.length ? rows : undefined;\n}\n\nfunction parseGoalContextAttachments(raw: string): GoalContextAttachment[] {\n const parsed = parseJsonField(raw);\n if (!Array.isArray(parsed)) return [];\n return parsed.filter((item): item is GoalContextAttachment => {\n if (!item || typeof item !== 'object') return false;\n const ref = item as Partial<GoalContextAttachment>;\n return (\n typeof ref.id === 'string' &&\n (ref.bucket === 'inbound' || ref.bucket === 'tts' || ref.bucket === 'outbound') &&\n typeof ref.type === 'string' &&\n typeof ref.mimeType === 'string' &&\n typeof ref.name === 'string' &&\n typeof ref.size === 'number' &&\n typeof ref.uri === 'string' &&\n typeof ref.path === 'string'\n );\n });\n}\n\nfunction goalContextFromRow(row: GoalContextRow): GoalContextMessage {\n return {\n goalId: row.goal_id,\n text: row.text,\n attachments: parseGoalContextAttachments(row.attachments_json),\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n };\n}\n\nfunction eventFromRow(row: EventRow): GoalEvent {\n return {\n id: row.event_id,\n goalId: row.goal_id,\n runId: row.run_id ?? undefined,\n kind: row.kind,\n message: row.message,\n data: parseJsonField(row.data_json),\n createdAt: row.created_at,\n };\n}\n\nfunction evidenceFromRow(row: EvidenceRow): GoalEvidence {\n return {\n id: row.evidence_id,\n goalId: row.goal_id,\n runId: row.run_id ?? undefined,\n kind: row.kind,\n title: row.title,\n summary: row.summary ?? undefined,\n uri: row.uri ?? undefined,\n data: parseJsonField(row.data_json),\n createdAt: row.created_at,\n };\n}\n\nfunction clampLimit(n: number | undefined, fallback: number): number {\n return Math.min(500, Math.max(1, Math.floor(n ?? fallback)));\n}\n\nfunction insertGoalEvent(db: ReturnType<typeof getSqliteDatabase>, input: {\n goalId: string;\n runId?: string;\n kind: string;\n message: string;\n data?: unknown;\n createdAt?: number;\n}): GoalEvent {\n const event: GoalEvent = {\n id: randomUUID(),\n goalId: input.goalId,\n runId: input.runId,\n kind: input.kind,\n message: input.message,\n data: input.data,\n createdAt: input.createdAt ?? Date.now(),\n };\n db.prepare(\n `INSERT INTO goal_events (event_id, goal_id, run_id, kind, message, data_json, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n event.id,\n event.goalId,\n event.runId ?? null,\n event.kind,\n event.message,\n event.data === undefined ? null : JSON.stringify(event.data),\n event.createdAt,\n );\n return event;\n}\n\nexport class GoalStore {\n create(input: CreateGoalInput): Goal {\n const now = Date.now();\n const goal: Goal = {\n id: randomUUID(),\n title: input.title.trim(),\n description: input.description?.trim() || undefined,\n status: 'active',\n agentId: input.agentId,\n priority: input.priority ?? 'normal',\n deadlineAt: input.deadlineAt,\n createdAt: now,\n updatedAt: now,\n activeSessionKey: input.sessionKey,\n judgeModelRef: input.judgeModelRef?.trim() || undefined,\n maxTurns: Math.max(1, Math.min(500, Math.floor(input.maxTurns))),\n turnsUsed: 0,\n uiLocale: input.uiLocale,\n source: input.source ?? 'chat',\n };\n\n runSqliteWriteTransaction((db) => {\n db.prepare(\n `INSERT INTO goals (\n goal_id, title, description, status, agent_id, priority, deadline_at,\n created_at, updated_at, active_session_key, judge_model_ref,\n max_turns, turns_used, ui_locale, source\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n goal.id,\n goal.title,\n goal.description ?? null,\n goal.status,\n goal.agentId,\n goal.priority,\n goal.deadlineAt ?? null,\n goal.createdAt,\n goal.updatedAt,\n goal.activeSessionKey ?? null,\n goal.judgeModelRef ?? null,\n goal.maxTurns,\n goal.turnsUsed,\n goal.uiLocale ?? null,\n goal.source,\n );\n if (goal.activeSessionKey) {\n db.prepare(\n `INSERT OR REPLACE INTO goal_session_links (goal_id, session_key, linked_at)\n VALUES (?, ?, ?)`,\n ).run(goal.id, goal.activeSessionKey, now);\n }\n insertGoalEvent(db, { goalId: goal.id, kind: 'created', message: 'Goal created', createdAt: now });\n });\n\n return goal;\n }\n\n get(goalId: string): Goal | null {\n const row = getSqliteDatabase()\n .prepare(`SELECT * FROM goals WHERE goal_id = ?`)\n .get(goalId) as GoalRow | undefined;\n return row ? goalFromRow(row) : null;\n }\n\n setContextMessage(input: {\n goalId: string;\n text: string;\n attachments?: GoalContextAttachment[];\n }): GoalContextMessage {\n return runSqliteWriteTransaction((db) => {\n const now = Date.now();\n const existing = db\n .prepare(`SELECT created_at FROM goal_context_messages WHERE goal_id = ?`)\n .get(input.goalId) as { created_at: number } | undefined;\n db.prepare(\n `INSERT INTO goal_context_messages (goal_id, text, attachments_json, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?)\n ON CONFLICT(goal_id) DO UPDATE SET\n text = excluded.text,\n attachments_json = excluded.attachments_json,\n updated_at = excluded.updated_at`,\n ).run(\n input.goalId,\n input.text.trim(),\n JSON.stringify(input.attachments ?? []),\n existing?.created_at ?? now,\n now,\n );\n insertGoalEvent(db, {\n goalId: input.goalId,\n kind: 'context_updated',\n message: input.text.trim() || `${input.attachments?.length ?? 0} attachment(s)`,\n data: { attachmentCount: input.attachments?.length ?? 0 },\n createdAt: now,\n });\n const row = db\n .prepare(`SELECT * FROM goal_context_messages WHERE goal_id = ?`)\n .get(input.goalId) as GoalContextRow;\n return goalContextFromRow(row);\n });\n }\n\n getContextMessage(goalId: string): GoalContextMessage | null {\n const row = getSqliteDatabase()\n .prepare(`SELECT * FROM goal_context_messages WHERE goal_id = ?`)\n .get(goalId) as GoalContextRow | undefined;\n return row ? goalContextFromRow(row) : null;\n }\n\n getActiveForSession(sessionKey: string): Goal | null {\n const row = getSqliteDatabase()\n .prepare(\n `SELECT * FROM goals\n WHERE active_session_key = ?\n AND status IN ('active', 'paused', 'blocked', 'needs_input', 'done')\n ORDER BY updated_at DESC\n LIMIT 1`,\n )\n .get(sessionKey) as GoalRow | undefined;\n return row ? goalFromRow(row) : null;\n }\n\n list(query: GoalListQuery = {}): Goal[] {\n const conditions: string[] = [];\n const params: Array<string | number> = [];\n if (query.status) {\n const statuses = Array.isArray(query.status) ? query.status : [query.status];\n conditions.push(`status IN (${statuses.map(() => '?').join(', ')})`);\n params.push(...statuses);\n }\n if (query.agentId) {\n conditions.push(`agent_id = ?`);\n params.push(query.agentId);\n }\n if (query.sessionKey) {\n conditions.push(`goal_id IN (SELECT goal_id FROM goal_session_links WHERE session_key = ?)`);\n params.push(query.sessionKey);\n }\n const where = conditions.length ? `WHERE ${conditions.join(' AND ')}` : '';\n const limit = clampLimit(query.limit, 50);\n const offset = Math.max(0, Math.floor(query.offset ?? 0));\n const rows = getSqliteDatabase()\n .prepare(`SELECT * FROM goals ${where} ORDER BY updated_at DESC LIMIT ? OFFSET ?`)\n .all(...params, limit, offset) as GoalRow[];\n return rows.map(goalFromRow);\n }\n\n update(goalId: string, patch: Partial<Pick<\n Goal,\n | 'title'\n | 'description'\n | 'status'\n | 'priority'\n | 'deadlineAt'\n | 'completedAt'\n | 'archivedAt'\n | 'activeSessionKey'\n | 'currentRunId'\n | 'nextAction'\n | 'blockedReason'\n | 'judgeModelRef'\n | 'maxTurns'\n | 'turnsUsed'\n | 'uiLocale'\n >>): Goal | null {\n const before = this.get(goalId);\n if (!before) return null;\n const next = { ...before, ...patch, updatedAt: Date.now() };\n runSqliteWriteTransaction((db) => {\n db.prepare(\n `UPDATE goals SET\n title = ?, description = ?, status = ?, priority = ?, deadline_at = ?,\n updated_at = ?, completed_at = ?, archived_at = ?, active_session_key = ?,\n current_run_id = ?, next_action = ?, blocked_reason = ?, judge_model_ref = ?,\n max_turns = ?, turns_used = ?, ui_locale = ?\n WHERE goal_id = ?`,\n ).run(\n next.title,\n next.description ?? null,\n next.status,\n next.priority,\n next.deadlineAt ?? null,\n next.updatedAt,\n next.completedAt ?? null,\n next.archivedAt ?? null,\n next.activeSessionKey ?? null,\n next.currentRunId ?? null,\n next.nextAction ?? null,\n next.blockedReason ?? null,\n next.judgeModelRef ?? null,\n next.maxTurns,\n next.turnsUsed,\n next.uiLocale ?? null,\n goalId,\n );\n if (next.activeSessionKey) {\n db.prepare(\n `INSERT OR REPLACE INTO goal_session_links (goal_id, session_key, linked_at)\n VALUES (?, ?, ?)`,\n ).run(goalId, next.activeSessionKey, next.updatedAt);\n }\n });\n return this.get(goalId);\n }\n\n listChecklist(goalId: string): GoalChecklistItem[] {\n const rows = getSqliteDatabase()\n .prepare(`SELECT * FROM goal_checklist_items WHERE goal_id = ? ORDER BY sort_order ASC, added_at ASC`)\n .all(goalId) as ChecklistRow[];\n return rows.map(checklistFromRow);\n }\n\n addChecklistItem(input: {\n goalId: string;\n text: string;\n addedBy: GoalChecklistAddedBy;\n status?: GoalChecklistStatus;\n }): GoalChecklistItem {\n return runSqliteWriteTransaction((db) => {\n const maxRow = db\n .prepare(`SELECT COALESCE(MAX(sort_order), 0) AS max_sort FROM goal_checklist_items WHERE goal_id = ?`)\n .get(input.goalId) as { max_sort: number };\n const now = Date.now();\n const item: GoalChecklistItem = {\n id: randomUUID(),\n goalId: input.goalId,\n text: input.text.trim(),\n status: input.status ?? 'pending',\n addedBy: input.addedBy,\n addedAt: now,\n sortOrder: maxRow.max_sort + 1,\n };\n db.prepare(\n `INSERT INTO goal_checklist_items (\n item_id, goal_id, text, status, added_by, added_at, sort_order\n ) VALUES (?, ?, ?, ?, ?, ?, ?)`,\n ).run(item.id, item.goalId, item.text, item.status, item.addedBy, item.addedAt, item.sortOrder);\n insertGoalEvent(db, {\n goalId: input.goalId,\n kind: 'checklist_added',\n message: item.text,\n data: { itemId: item.id, addedBy: item.addedBy },\n createdAt: now,\n });\n return item;\n });\n }\n\n updateChecklistItem(\n itemId: string,\n patch: Partial<Pick<GoalChecklistItem, 'text' | 'status' | 'evidenceSummary'>>,\n ): GoalChecklistItem | null {\n return runSqliteWriteTransaction((db) => {\n const row = db\n .prepare(`SELECT * FROM goal_checklist_items WHERE item_id = ?`)\n .get(itemId) as ChecklistRow | undefined;\n if (!row) return null;\n const before = checklistFromRow(row);\n const status = patch.status ?? before.status;\n const completedAt =\n status === 'completed' || status === 'impossible'\n ? (before.completedAt ?? Date.now())\n : null;\n db.prepare(\n `UPDATE goal_checklist_items SET text = ?, status = ?, completed_at = ?, evidence_summary = ?\n WHERE item_id = ?`,\n ).run(\n patch.text?.trim() || before.text,\n status,\n completedAt,\n patch.evidenceSummary ?? before.evidenceSummary ?? null,\n itemId,\n );\n insertGoalEvent(db, {\n goalId: before.goalId,\n kind: 'checklist_updated',\n message: patch.text?.trim() || before.text,\n data: { itemId, status },\n });\n const next = db\n .prepare(`SELECT * FROM goal_checklist_items WHERE item_id = ?`)\n .get(itemId) as ChecklistRow;\n return checklistFromRow(next);\n });\n }\n\n removeChecklistItem(itemId: string): boolean {\n return runSqliteWriteTransaction((db) => {\n const row = db\n .prepare(`SELECT goal_id, text FROM goal_checklist_items WHERE item_id = ?`)\n .get(itemId) as { goal_id: string; text: string } | undefined;\n if (!row) return false;\n db.prepare(`DELETE FROM goal_checklist_items WHERE item_id = ?`).run(itemId);\n insertGoalEvent(db, {\n goalId: row.goal_id,\n kind: 'checklist_removed',\n message: row.text,\n data: { itemId },\n });\n return true;\n });\n }\n\n clearChecklist(goalId: string): void {\n runSqliteWriteTransaction((db) => {\n db.prepare(`DELETE FROM goal_checklist_items WHERE goal_id = ?`).run(goalId);\n insertGoalEvent(db, { goalId, kind: 'checklist_cleared', message: 'Checklist cleared' });\n });\n }\n\n replaceChecklist(goalId: string, items: Array<{\n text: string;\n status: GoalChecklistStatus;\n addedBy: GoalChecklistAddedBy;\n addedAt?: number;\n completedAt?: number;\n evidenceSummary?: string;\n }>): GoalChecklistItem[] {\n return runSqliteWriteTransaction((db) => {\n db.prepare(`DELETE FROM goal_checklist_items WHERE goal_id = ?`).run(goalId);\n const now = Date.now();\n const next: GoalChecklistItem[] = [];\n for (let i = 0; i < items.length; i++) {\n const raw = items[i]!;\n const item: GoalChecklistItem = {\n id: randomUUID(),\n goalId,\n text: raw.text.trim(),\n status: raw.status,\n addedBy: raw.addedBy,\n addedAt: raw.addedAt ?? now,\n completedAt: raw.completedAt,\n evidenceSummary: raw.evidenceSummary,\n sortOrder: i + 1,\n };\n if (!item.text) continue;\n db.prepare(\n `INSERT INTO goal_checklist_items (\n item_id, goal_id, text, status, added_by, added_at, completed_at, evidence_summary, sort_order\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n item.id,\n item.goalId,\n item.text,\n item.status,\n item.addedBy,\n item.addedAt,\n item.completedAt ?? null,\n item.evidenceSummary ?? null,\n item.sortOrder,\n );\n next.push(item);\n }\n insertGoalEvent(db, {\n goalId,\n kind: 'checklist_replaced',\n message: `Checklist replaced (${next.length} items)`,\n });\n return next;\n });\n }\n\n appendRun(run: Omit<GoalRun, 'id' | 'startedAt'> & { id?: string; startedAt?: number }): GoalRun {\n const record: GoalRun = {\n id: run.id ?? randomUUID(),\n goalId: run.goalId,\n sessionKey: run.sessionKey,\n source: run.source,\n status: run.status,\n startedAt: run.startedAt ?? Date.now(),\n finishedAt: run.finishedAt,\n verdict: run.verdict,\n reason: run.reason,\n nextAction: run.nextAction,\n assistantPreview: run.assistantPreview,\n checklistProgress: run.checklistProgress,\n };\n runSqliteWriteTransaction((db) => {\n db.prepare(\n `INSERT INTO goal_runs (\n run_id, goal_id, session_key, source, status, started_at, finished_at,\n verdict, reason, next_action, assistant_preview, checklist_done, checklist_total,\n confidence, missing_evidence_json, user_question, completed_checklist_item_ids_json\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n record.id,\n record.goalId,\n record.sessionKey,\n record.source,\n record.status,\n record.startedAt,\n record.finishedAt ?? null,\n record.verdict ?? null,\n record.reason ?? null,\n record.nextAction ?? null,\n record.assistantPreview ?? null,\n record.checklistProgress?.done ?? null,\n record.checklistProgress?.total ?? null,\n record.confidence ?? null,\n record.missingEvidence ? JSON.stringify(record.missingEvidence) : null,\n record.userQuestion ?? null,\n record.completedChecklistItemIds ? JSON.stringify(record.completedChecklistItemIds) : null,\n );\n db.prepare(`UPDATE goals SET current_run_id = ?, updated_at = ? WHERE goal_id = ?`).run(\n record.id,\n record.finishedAt ?? record.startedAt,\n record.goalId,\n );\n insertGoalEvent(db, {\n goalId: record.goalId,\n runId: record.id,\n kind: 'run_recorded',\n message: record.reason ?? record.status,\n data: {\n verdict: record.verdict,\n status: record.status,\n confidence: record.confidence,\n missingEvidence: record.missingEvidence,\n userQuestion: record.userQuestion,\n completedChecklistItemIds: record.completedChecklistItemIds,\n },\n createdAt: record.finishedAt ?? record.startedAt,\n });\n });\n return record;\n }\n\n listRuns(goalId: string, limit?: number): GoalRun[] {\n const rows = getSqliteDatabase()\n .prepare(`SELECT * FROM goal_runs WHERE goal_id = ? ORDER BY started_at DESC LIMIT ?`)\n .all(goalId, clampLimit(limit, 50)) as GoalRunRow[];\n return rows.map(runFromRow);\n }\n\n listRunsForSession(sessionKey: string, limit?: number): GoalRun[] {\n const rows = getSqliteDatabase()\n .prepare(`SELECT * FROM goal_runs WHERE session_key = ? ORDER BY started_at DESC LIMIT ?`)\n .all(sessionKey, clampLimit(limit, 50)) as GoalRunRow[];\n return rows.map(runFromRow);\n }\n\n listEvents(goalId: string, limit?: number): GoalEvent[] {\n const rows = getSqliteDatabase()\n .prepare(`SELECT * FROM goal_events WHERE goal_id = ? ORDER BY created_at DESC LIMIT ?`)\n .all(goalId, clampLimit(limit, 100)) as EventRow[];\n return rows.map(eventFromRow);\n }\n\n addEvidence(input: Omit<GoalEvidence, 'id' | 'createdAt'> & { id?: string; createdAt?: number }): GoalEvidence {\n const evidence: GoalEvidence = {\n id: input.id ?? randomUUID(),\n goalId: input.goalId,\n runId: input.runId,\n kind: input.kind,\n title: input.title,\n summary: input.summary,\n uri: input.uri,\n data: input.data,\n createdAt: input.createdAt ?? Date.now(),\n };\n runSqliteWriteTransaction((db) => {\n db.prepare(\n `INSERT INTO goal_evidence (\n evidence_id, goal_id, run_id, kind, title, summary, uri, data_json, created_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n evidence.id,\n evidence.goalId,\n evidence.runId ?? null,\n evidence.kind,\n evidence.title,\n evidence.summary ?? null,\n evidence.uri ?? null,\n evidence.data === undefined ? null : JSON.stringify(evidence.data),\n evidence.createdAt,\n );\n insertGoalEvent(db, {\n goalId: evidence.goalId,\n runId: evidence.runId,\n kind: 'evidence_added',\n message: evidence.title,\n data: { evidenceId: evidence.id, kind: evidence.kind },\n createdAt: evidence.createdAt,\n });\n });\n return evidence;\n }\n\n listEvidence(goalId: string, limit?: number): GoalEvidence[] {\n const rows = getSqliteDatabase()\n .prepare(`SELECT * FROM goal_evidence WHERE goal_id = ? ORDER BY created_at DESC LIMIT ?`)\n .all(goalId, clampLimit(limit, 100)) as EvidenceRow[];\n return rows.map(evidenceFromRow);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"goal-store.js","names":[],"sources":["../../../src/goals/goal-store.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport { getSqliteDatabase, runSqliteWriteTransaction } from '../storage/sqlite/transaction.js';\nimport type {\n CreateGoalInput,\n Goal,\n GoalChecklistAddedBy,\n GoalChecklistItem,\n GoalChecklistStatus,\n GoalContextAttachment,\n GoalContextMessage,\n GoalEvent,\n GoalEvidence,\n GoalListQuery,\n GoalPriority,\n GoalRun,\n GoalRunStatus,\n GoalRunVerdict,\n GoalSource,\n GoalStatus,\n} from './types.js';\n\ntype GoalRow = {\n goal_id: string;\n title: string;\n description: string | null;\n status: string;\n agent_id: string;\n priority: string;\n deadline_at: number | null;\n created_at: number;\n updated_at: number;\n completed_at: number | null;\n archived_at: number | null;\n active_session_key: string | null;\n current_run_id: string | null;\n next_action: string | null;\n blocked_reason: string | null;\n judge_model_ref: string | null;\n max_turns: number;\n turns_used: number;\n ui_locale: string | null;\n source: string;\n project_id: string | null;\n};\n\ntype ChecklistRow = {\n item_id: string;\n goal_id: string;\n text: string;\n status: string;\n added_by: string;\n added_at: number;\n completed_at: number | null;\n evidence_summary: string | null;\n sort_order: number;\n};\n\ntype GoalRunRow = {\n run_id: string;\n goal_id: string;\n session_key: string;\n source: string;\n status: string;\n started_at: number;\n finished_at: number | null;\n verdict: string | null;\n reason: string | null;\n next_action: string | null;\n assistant_preview: string | null;\n checklist_done: number | null;\n checklist_total: number | null;\n confidence: number | null;\n missing_evidence_json: string | null;\n user_question: string | null;\n completed_checklist_item_ids_json: string | null;\n};\n\ntype EventRow = {\n event_id: string;\n goal_id: string;\n run_id: string | null;\n kind: string;\n message: string;\n data_json: string | null;\n created_at: number;\n};\n\ntype EvidenceRow = {\n evidence_id: string;\n goal_id: string;\n run_id: string | null;\n kind: GoalEvidence['kind'];\n title: string;\n summary: string | null;\n uri: string | null;\n data_json: string | null;\n created_at: number;\n};\n\ntype GoalContextRow = {\n goal_id: string;\n text: string;\n attachments_json: string;\n created_at: number;\n updated_at: number;\n};\n\nfunction goalFromRow(row: GoalRow): Goal {\n return {\n id: row.goal_id,\n title: row.title,\n description: row.description ?? undefined,\n status: row.status as GoalStatus,\n agentId: row.agent_id,\n priority: row.priority as GoalPriority,\n deadlineAt: row.deadline_at ?? undefined,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n completedAt: row.completed_at ?? undefined,\n archivedAt: row.archived_at ?? undefined,\n activeSessionKey: row.active_session_key ?? undefined,\n currentRunId: row.current_run_id ?? undefined,\n nextAction: row.next_action ?? undefined,\n blockedReason: row.blocked_reason ?? undefined,\n judgeModelRef: row.judge_model_ref ?? undefined,\n maxTurns: row.max_turns,\n turnsUsed: row.turns_used,\n uiLocale: row.ui_locale === 'en' || row.ui_locale === 'zh' ? row.ui_locale : undefined,\n source: row.source as GoalSource,\n projectId: row.project_id ?? undefined,\n };\n}\n\nfunction checklistFromRow(row: ChecklistRow): GoalChecklistItem {\n return {\n id: row.item_id,\n goalId: row.goal_id,\n text: row.text,\n status: row.status as GoalChecklistStatus,\n addedBy: row.added_by as GoalChecklistAddedBy,\n addedAt: row.added_at,\n completedAt: row.completed_at ?? undefined,\n evidenceSummary: row.evidence_summary ?? undefined,\n sortOrder: row.sort_order,\n };\n}\n\nfunction runFromRow(row: GoalRunRow): GoalRun {\n return {\n id: row.run_id,\n goalId: row.goal_id,\n sessionKey: row.session_key,\n source: row.source as GoalSource,\n status: row.status as GoalRunStatus,\n startedAt: row.started_at,\n finishedAt: row.finished_at ?? undefined,\n verdict: row.verdict ? (row.verdict as GoalRunVerdict) : undefined,\n reason: row.reason ?? undefined,\n nextAction: row.next_action ?? undefined,\n assistantPreview: row.assistant_preview ?? undefined,\n checklistProgress:\n row.checklist_done != null && row.checklist_total != null\n ? { done: row.checklist_done, total: row.checklist_total }\n : undefined,\n confidence: row.confidence ?? undefined,\n missingEvidence: parseJsonStringArray(row.missing_evidence_json),\n userQuestion: row.user_question ?? undefined,\n completedChecklistItemIds: parseJsonStringArray(row.completed_checklist_item_ids_json),\n };\n}\n\nfunction parseJsonField(raw: string | null): unknown {\n if (!raw) return undefined;\n try {\n return JSON.parse(raw) as unknown;\n } catch {\n return undefined;\n }\n}\n\nfunction parseJsonStringArray(raw: string | null): string[] | undefined {\n const value = parseJsonField(raw);\n if (!Array.isArray(value)) return undefined;\n const rows = value.filter((item): item is string => typeof item === 'string' && item.trim().length > 0);\n return rows.length ? rows : undefined;\n}\n\nfunction parseGoalContextAttachments(raw: string): GoalContextAttachment[] {\n const parsed = parseJsonField(raw);\n if (!Array.isArray(parsed)) return [];\n return parsed.filter((item): item is GoalContextAttachment => {\n if (!item || typeof item !== 'object') return false;\n const ref = item as Partial<GoalContextAttachment>;\n return (\n typeof ref.id === 'string' &&\n (ref.bucket === 'inbound' || ref.bucket === 'tts' || ref.bucket === 'outbound') &&\n typeof ref.type === 'string' &&\n typeof ref.mimeType === 'string' &&\n typeof ref.name === 'string' &&\n typeof ref.size === 'number' &&\n typeof ref.uri === 'string' &&\n typeof ref.path === 'string'\n );\n });\n}\n\nfunction goalContextFromRow(row: GoalContextRow): GoalContextMessage {\n return {\n goalId: row.goal_id,\n text: row.text,\n attachments: parseGoalContextAttachments(row.attachments_json),\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n };\n}\n\nfunction eventFromRow(row: EventRow): GoalEvent {\n return {\n id: row.event_id,\n goalId: row.goal_id,\n runId: row.run_id ?? undefined,\n kind: row.kind,\n message: row.message,\n data: parseJsonField(row.data_json),\n createdAt: row.created_at,\n };\n}\n\nfunction evidenceFromRow(row: EvidenceRow): GoalEvidence {\n return {\n id: row.evidence_id,\n goalId: row.goal_id,\n runId: row.run_id ?? undefined,\n kind: row.kind,\n title: row.title,\n summary: row.summary ?? undefined,\n uri: row.uri ?? undefined,\n data: parseJsonField(row.data_json),\n createdAt: row.created_at,\n };\n}\n\nfunction clampLimit(n: number | undefined, fallback: number): number {\n return Math.min(500, Math.max(1, Math.floor(n ?? fallback)));\n}\n\nfunction insertGoalEvent(db: ReturnType<typeof getSqliteDatabase>, input: {\n goalId: string;\n runId?: string;\n kind: string;\n message: string;\n data?: unknown;\n createdAt?: number;\n}): GoalEvent {\n const event: GoalEvent = {\n id: randomUUID(),\n goalId: input.goalId,\n runId: input.runId,\n kind: input.kind,\n message: input.message,\n data: input.data,\n createdAt: input.createdAt ?? Date.now(),\n };\n db.prepare(\n `INSERT INTO goal_events (event_id, goal_id, run_id, kind, message, data_json, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n event.id,\n event.goalId,\n event.runId ?? null,\n event.kind,\n event.message,\n event.data === undefined ? null : JSON.stringify(event.data),\n event.createdAt,\n );\n return event;\n}\n\nexport class GoalStore {\n create(input: CreateGoalInput): Goal {\n const now = Date.now();\n const goal: Goal = {\n id: randomUUID(),\n title: input.title.trim(),\n description: input.description?.trim() || undefined,\n status: 'active',\n agentId: input.agentId,\n priority: input.priority ?? 'normal',\n deadlineAt: input.deadlineAt,\n createdAt: now,\n updatedAt: now,\n activeSessionKey: input.sessionKey,\n judgeModelRef: input.judgeModelRef?.trim() || undefined,\n maxTurns: Math.max(1, Math.min(500, Math.floor(input.maxTurns))),\n turnsUsed: 0,\n uiLocale: input.uiLocale,\n source: input.source ?? 'chat',\n projectId: input.projectId?.trim() || undefined,\n };\n\n runSqliteWriteTransaction((db) => {\n db.prepare(\n `INSERT INTO goals (\n goal_id, title, description, status, agent_id, priority, deadline_at,\n created_at, updated_at, active_session_key, judge_model_ref,\n max_turns, turns_used, ui_locale, source, project_id\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n goal.id,\n goal.title,\n goal.description ?? null,\n goal.status,\n goal.agentId,\n goal.priority,\n goal.deadlineAt ?? null,\n goal.createdAt,\n goal.updatedAt,\n goal.activeSessionKey ?? null,\n goal.judgeModelRef ?? null,\n goal.maxTurns,\n goal.turnsUsed,\n goal.uiLocale ?? null,\n goal.source,\n goal.projectId ?? null,\n );\n if (goal.activeSessionKey) {\n db.prepare(\n `INSERT OR REPLACE INTO goal_session_links (goal_id, session_key, linked_at)\n VALUES (?, ?, ?)`,\n ).run(goal.id, goal.activeSessionKey, now);\n }\n insertGoalEvent(db, { goalId: goal.id, kind: 'created', message: 'Goal created', createdAt: now });\n });\n\n return goal;\n }\n\n get(goalId: string): Goal | null {\n const row = getSqliteDatabase()\n .prepare(`SELECT * FROM goals WHERE goal_id = ?`)\n .get(goalId) as GoalRow | undefined;\n return row ? goalFromRow(row) : null;\n }\n\n setContextMessage(input: {\n goalId: string;\n text: string;\n attachments?: GoalContextAttachment[];\n }): GoalContextMessage {\n return runSqliteWriteTransaction((db) => {\n const now = Date.now();\n const existing = db\n .prepare(`SELECT created_at FROM goal_context_messages WHERE goal_id = ?`)\n .get(input.goalId) as { created_at: number } | undefined;\n db.prepare(\n `INSERT INTO goal_context_messages (goal_id, text, attachments_json, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?)\n ON CONFLICT(goal_id) DO UPDATE SET\n text = excluded.text,\n attachments_json = excluded.attachments_json,\n updated_at = excluded.updated_at`,\n ).run(\n input.goalId,\n input.text.trim(),\n JSON.stringify(input.attachments ?? []),\n existing?.created_at ?? now,\n now,\n );\n insertGoalEvent(db, {\n goalId: input.goalId,\n kind: 'context_updated',\n message: input.text.trim() || `${input.attachments?.length ?? 0} attachment(s)`,\n data: { attachmentCount: input.attachments?.length ?? 0 },\n createdAt: now,\n });\n const row = db\n .prepare(`SELECT * FROM goal_context_messages WHERE goal_id = ?`)\n .get(input.goalId) as GoalContextRow;\n return goalContextFromRow(row);\n });\n }\n\n getContextMessage(goalId: string): GoalContextMessage | null {\n const row = getSqliteDatabase()\n .prepare(`SELECT * FROM goal_context_messages WHERE goal_id = ?`)\n .get(goalId) as GoalContextRow | undefined;\n return row ? goalContextFromRow(row) : null;\n }\n\n getActiveForSession(sessionKey: string): Goal | null {\n const row = getSqliteDatabase()\n .prepare(\n `SELECT * FROM goals\n WHERE active_session_key = ?\n AND status IN ('active', 'paused', 'blocked', 'needs_input', 'done')\n ORDER BY updated_at DESC\n LIMIT 1`,\n )\n .get(sessionKey) as GoalRow | undefined;\n return row ? goalFromRow(row) : null;\n }\n\n list(query: GoalListQuery = {}): Goal[] {\n const conditions: string[] = [];\n const params: Array<string | number> = [];\n if (query.status) {\n const statuses = Array.isArray(query.status) ? query.status : [query.status];\n conditions.push(`status IN (${statuses.map(() => '?').join(', ')})`);\n params.push(...statuses);\n }\n if (query.agentId) {\n conditions.push(`agent_id = ?`);\n params.push(query.agentId);\n }\n if (query.sessionKey) {\n conditions.push(`goal_id IN (SELECT goal_id FROM goal_session_links WHERE session_key = ?)`);\n params.push(query.sessionKey);\n }\n if (query.projectId) {\n conditions.push(`project_id = ?`);\n params.push(query.projectId);\n }\n const where = conditions.length ? `WHERE ${conditions.join(' AND ')}` : '';\n const limit = clampLimit(query.limit, 50);\n const offset = Math.max(0, Math.floor(query.offset ?? 0));\n const rows = getSqliteDatabase()\n .prepare(`SELECT * FROM goals ${where} ORDER BY updated_at DESC LIMIT ? OFFSET ?`)\n .all(...params, limit, offset) as GoalRow[];\n return rows.map(goalFromRow);\n }\n\n update(goalId: string, patch: Partial<Pick<\n Goal,\n | 'title'\n | 'description'\n | 'status'\n | 'priority'\n | 'deadlineAt'\n | 'completedAt'\n | 'archivedAt'\n | 'activeSessionKey'\n | 'currentRunId'\n | 'nextAction'\n | 'blockedReason'\n | 'judgeModelRef'\n | 'maxTurns'\n | 'turnsUsed'\n | 'uiLocale'\n | 'projectId'\n >>): Goal | null {\n const before = this.get(goalId);\n if (!before) return null;\n const next = { ...before, ...patch, updatedAt: Date.now() };\n runSqliteWriteTransaction((db) => {\n db.prepare(\n `UPDATE goals SET\n title = ?, description = ?, status = ?, priority = ?, deadline_at = ?,\n updated_at = ?, completed_at = ?, archived_at = ?, active_session_key = ?,\n current_run_id = ?, next_action = ?, blocked_reason = ?, judge_model_ref = ?,\n max_turns = ?, turns_used = ?, ui_locale = ?, project_id = ?\n WHERE goal_id = ?`,\n ).run(\n next.title,\n next.description ?? null,\n next.status,\n next.priority,\n next.deadlineAt ?? null,\n next.updatedAt,\n next.completedAt ?? null,\n next.archivedAt ?? null,\n next.activeSessionKey ?? null,\n next.currentRunId ?? null,\n next.nextAction ?? null,\n next.blockedReason ?? null,\n next.judgeModelRef ?? null,\n next.maxTurns,\n next.turnsUsed,\n next.uiLocale ?? null,\n next.projectId ?? null,\n goalId,\n );\n if (next.activeSessionKey) {\n db.prepare(\n `INSERT OR REPLACE INTO goal_session_links (goal_id, session_key, linked_at)\n VALUES (?, ?, ?)`,\n ).run(goalId, next.activeSessionKey, next.updatedAt);\n }\n });\n return this.get(goalId);\n }\n\n listChecklist(goalId: string): GoalChecklistItem[] {\n const rows = getSqliteDatabase()\n .prepare(`SELECT * FROM goal_checklist_items WHERE goal_id = ? ORDER BY sort_order ASC, added_at ASC`)\n .all(goalId) as ChecklistRow[];\n return rows.map(checklistFromRow);\n }\n\n addChecklistItem(input: {\n goalId: string;\n text: string;\n addedBy: GoalChecklistAddedBy;\n status?: GoalChecklistStatus;\n }): GoalChecklistItem {\n return runSqliteWriteTransaction((db) => {\n const maxRow = db\n .prepare(`SELECT COALESCE(MAX(sort_order), 0) AS max_sort FROM goal_checklist_items WHERE goal_id = ?`)\n .get(input.goalId) as { max_sort: number };\n const now = Date.now();\n const item: GoalChecklistItem = {\n id: randomUUID(),\n goalId: input.goalId,\n text: input.text.trim(),\n status: input.status ?? 'pending',\n addedBy: input.addedBy,\n addedAt: now,\n sortOrder: maxRow.max_sort + 1,\n };\n db.prepare(\n `INSERT INTO goal_checklist_items (\n item_id, goal_id, text, status, added_by, added_at, sort_order\n ) VALUES (?, ?, ?, ?, ?, ?, ?)`,\n ).run(item.id, item.goalId, item.text, item.status, item.addedBy, item.addedAt, item.sortOrder);\n insertGoalEvent(db, {\n goalId: input.goalId,\n kind: 'checklist_added',\n message: item.text,\n data: { itemId: item.id, addedBy: item.addedBy },\n createdAt: now,\n });\n return item;\n });\n }\n\n updateChecklistItem(\n itemId: string,\n patch: Partial<Pick<GoalChecklistItem, 'text' | 'status' | 'evidenceSummary'>>,\n ): GoalChecklistItem | null {\n return runSqliteWriteTransaction((db) => {\n const row = db\n .prepare(`SELECT * FROM goal_checklist_items WHERE item_id = ?`)\n .get(itemId) as ChecklistRow | undefined;\n if (!row) return null;\n const before = checklistFromRow(row);\n const status = patch.status ?? before.status;\n const completedAt =\n status === 'completed' || status === 'impossible'\n ? (before.completedAt ?? Date.now())\n : null;\n db.prepare(\n `UPDATE goal_checklist_items SET text = ?, status = ?, completed_at = ?, evidence_summary = ?\n WHERE item_id = ?`,\n ).run(\n patch.text?.trim() || before.text,\n status,\n completedAt,\n patch.evidenceSummary ?? before.evidenceSummary ?? null,\n itemId,\n );\n insertGoalEvent(db, {\n goalId: before.goalId,\n kind: 'checklist_updated',\n message: patch.text?.trim() || before.text,\n data: { itemId, status },\n });\n const next = db\n .prepare(`SELECT * FROM goal_checklist_items WHERE item_id = ?`)\n .get(itemId) as ChecklistRow;\n return checklistFromRow(next);\n });\n }\n\n removeChecklistItem(itemId: string): boolean {\n return runSqliteWriteTransaction((db) => {\n const row = db\n .prepare(`SELECT goal_id, text FROM goal_checklist_items WHERE item_id = ?`)\n .get(itemId) as { goal_id: string; text: string } | undefined;\n if (!row) return false;\n db.prepare(`DELETE FROM goal_checklist_items WHERE item_id = ?`).run(itemId);\n insertGoalEvent(db, {\n goalId: row.goal_id,\n kind: 'checklist_removed',\n message: row.text,\n data: { itemId },\n });\n return true;\n });\n }\n\n clearChecklist(goalId: string): void {\n runSqliteWriteTransaction((db) => {\n db.prepare(`DELETE FROM goal_checklist_items WHERE goal_id = ?`).run(goalId);\n insertGoalEvent(db, { goalId, kind: 'checklist_cleared', message: 'Checklist cleared' });\n });\n }\n\n replaceChecklist(goalId: string, items: Array<{\n text: string;\n status: GoalChecklistStatus;\n addedBy: GoalChecklistAddedBy;\n addedAt?: number;\n completedAt?: number;\n evidenceSummary?: string;\n }>): GoalChecklistItem[] {\n return runSqliteWriteTransaction((db) => {\n db.prepare(`DELETE FROM goal_checklist_items WHERE goal_id = ?`).run(goalId);\n const now = Date.now();\n const next: GoalChecklistItem[] = [];\n for (let i = 0; i < items.length; i++) {\n const raw = items[i]!;\n const item: GoalChecklistItem = {\n id: randomUUID(),\n goalId,\n text: raw.text.trim(),\n status: raw.status,\n addedBy: raw.addedBy,\n addedAt: raw.addedAt ?? now,\n completedAt: raw.completedAt,\n evidenceSummary: raw.evidenceSummary,\n sortOrder: i + 1,\n };\n if (!item.text) continue;\n db.prepare(\n `INSERT INTO goal_checklist_items (\n item_id, goal_id, text, status, added_by, added_at, completed_at, evidence_summary, sort_order\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n item.id,\n item.goalId,\n item.text,\n item.status,\n item.addedBy,\n item.addedAt,\n item.completedAt ?? null,\n item.evidenceSummary ?? null,\n item.sortOrder,\n );\n next.push(item);\n }\n insertGoalEvent(db, {\n goalId,\n kind: 'checklist_replaced',\n message: `Checklist replaced (${next.length} items)`,\n });\n return next;\n });\n }\n\n appendRun(run: Omit<GoalRun, 'id' | 'startedAt'> & { id?: string; startedAt?: number }): GoalRun {\n const record: GoalRun = {\n id: run.id ?? randomUUID(),\n goalId: run.goalId,\n sessionKey: run.sessionKey,\n source: run.source,\n status: run.status,\n startedAt: run.startedAt ?? Date.now(),\n finishedAt: run.finishedAt,\n verdict: run.verdict,\n reason: run.reason,\n nextAction: run.nextAction,\n assistantPreview: run.assistantPreview,\n checklistProgress: run.checklistProgress,\n };\n runSqliteWriteTransaction((db) => {\n db.prepare(\n `INSERT INTO goal_runs (\n run_id, goal_id, session_key, source, status, started_at, finished_at,\n verdict, reason, next_action, assistant_preview, checklist_done, checklist_total,\n confidence, missing_evidence_json, user_question, completed_checklist_item_ids_json\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n record.id,\n record.goalId,\n record.sessionKey,\n record.source,\n record.status,\n record.startedAt,\n record.finishedAt ?? null,\n record.verdict ?? null,\n record.reason ?? null,\n record.nextAction ?? null,\n record.assistantPreview ?? null,\n record.checklistProgress?.done ?? null,\n record.checklistProgress?.total ?? null,\n record.confidence ?? null,\n record.missingEvidence ? JSON.stringify(record.missingEvidence) : null,\n record.userQuestion ?? null,\n record.completedChecklistItemIds ? JSON.stringify(record.completedChecklistItemIds) : null,\n );\n db.prepare(`UPDATE goals SET current_run_id = ?, updated_at = ? WHERE goal_id = ?`).run(\n record.id,\n record.finishedAt ?? record.startedAt,\n record.goalId,\n );\n insertGoalEvent(db, {\n goalId: record.goalId,\n runId: record.id,\n kind: 'run_recorded',\n message: record.reason ?? record.status,\n data: {\n verdict: record.verdict,\n status: record.status,\n confidence: record.confidence,\n missingEvidence: record.missingEvidence,\n userQuestion: record.userQuestion,\n completedChecklistItemIds: record.completedChecklistItemIds,\n },\n createdAt: record.finishedAt ?? record.startedAt,\n });\n });\n return record;\n }\n\n listRuns(goalId: string, limit?: number): GoalRun[] {\n const rows = getSqliteDatabase()\n .prepare(`SELECT * FROM goal_runs WHERE goal_id = ? ORDER BY started_at DESC LIMIT ?`)\n .all(goalId, clampLimit(limit, 50)) as GoalRunRow[];\n return rows.map(runFromRow);\n }\n\n listRunsForSession(sessionKey: string, limit?: number): GoalRun[] {\n const rows = getSqliteDatabase()\n .prepare(`SELECT * FROM goal_runs WHERE session_key = ? ORDER BY started_at DESC LIMIT ?`)\n .all(sessionKey, clampLimit(limit, 50)) as GoalRunRow[];\n return rows.map(runFromRow);\n }\n\n listEvents(goalId: string, limit?: number): GoalEvent[] {\n const rows = getSqliteDatabase()\n .prepare(`SELECT * FROM goal_events WHERE goal_id = ? ORDER BY created_at DESC LIMIT ?`)\n .all(goalId, clampLimit(limit, 100)) as EventRow[];\n return rows.map(eventFromRow);\n }\n\n addEvidence(input: Omit<GoalEvidence, 'id' | 'createdAt'> & { id?: string; createdAt?: number }): GoalEvidence {\n const evidence: GoalEvidence = {\n id: input.id ?? randomUUID(),\n goalId: input.goalId,\n runId: input.runId,\n kind: input.kind,\n title: input.title,\n summary: input.summary,\n uri: input.uri,\n data: input.data,\n createdAt: input.createdAt ?? Date.now(),\n };\n runSqliteWriteTransaction((db) => {\n db.prepare(\n `INSERT INTO goal_evidence (\n evidence_id, goal_id, run_id, kind, title, summary, uri, data_json, created_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n evidence.id,\n evidence.goalId,\n evidence.runId ?? null,\n evidence.kind,\n evidence.title,\n evidence.summary ?? null,\n evidence.uri ?? null,\n evidence.data === undefined ? null : JSON.stringify(evidence.data),\n evidence.createdAt,\n );\n insertGoalEvent(db, {\n goalId: evidence.goalId,\n runId: evidence.runId,\n kind: 'evidence_added',\n message: evidence.title,\n data: { evidenceId: evidence.id, kind: evidence.kind },\n createdAt: evidence.createdAt,\n });\n });\n return evidence;\n }\n\n listEvidence(goalId: string, limit?: number): GoalEvidence[] {\n const rows = getSqliteDatabase()\n .prepare(`SELECT * FROM goal_evidence WHERE goal_id = ? ORDER BY created_at DESC LIMIT ?`)\n .all(goalId, clampLimit(limit, 100)) as EvidenceRow[];\n return rows.map(evidenceFromRow);\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { getAgentDefaultModelRef, init_schema } from "../config/schema.js";
|
|
2
2
|
import { createLogger } from "../utils/logger/index.js";
|
|
3
3
|
import { init_logger } from "../utils/logger.js";
|
|
4
|
-
import { renderWorkflowText } from "../agent/workflow/snapshot.js";
|
|
5
4
|
import { GoalService } from "./goal-service.js";
|
|
5
|
+
import { renderWorkflowText } from "../agent/workflow/snapshot.js";
|
|
6
6
|
import { resolveGoalUiLocale } from "../agent/goals/goal-locale.js";
|
|
7
7
|
import { evaluateAfterTurnHermesLike } from "../agent/goals/evaluate-turn.js";
|
|
8
8
|
import { runViewToSnapshot } from "../workflows/service/run-view-to-snapshot.js";
|
|
@@ -28,6 +28,7 @@ export interface Goal {
|
|
|
28
28
|
turnsUsed: number;
|
|
29
29
|
uiLocale?: GoalUiLocale;
|
|
30
30
|
source: GoalSource;
|
|
31
|
+
projectId?: string;
|
|
31
32
|
}
|
|
32
33
|
export interface GoalChecklistItem {
|
|
33
34
|
id: string;
|
|
@@ -98,6 +99,7 @@ export interface GoalListQuery {
|
|
|
98
99
|
status?: GoalStatus | GoalStatus[];
|
|
99
100
|
agentId?: string;
|
|
100
101
|
sessionKey?: string;
|
|
102
|
+
projectId?: string;
|
|
101
103
|
limit?: number;
|
|
102
104
|
offset?: number;
|
|
103
105
|
}
|
|
@@ -112,6 +114,7 @@ export interface CreateGoalInput {
|
|
|
112
114
|
maxTurns: number;
|
|
113
115
|
uiLocale?: GoalUiLocale;
|
|
114
116
|
source?: GoalSource;
|
|
117
|
+
projectId?: string;
|
|
115
118
|
}
|
|
116
119
|
export interface GoalJudgeDecision {
|
|
117
120
|
verdict: GoalRunVerdict;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { formatI18n } from "./format.js";
|
|
2
|
-
import { serverLocaleOrFallback } from "./locale.js";
|
|
3
2
|
import goals_en_default, { judgeReason } from "./locales/goals.en.js";
|
|
4
3
|
import goals_zh_default from "./locales/goals.zh.js";
|
|
4
|
+
import { serverLocaleOrFallback } from "./locale.js";
|
|
5
5
|
//#region src/i18n/goals-bundle.ts
|
|
6
6
|
/** Canonical English strings for judge parse / API contract (from `goals.en.json`). */
|
|
7
7
|
const JUDGE_REASON_EN = judgeReason;
|
package/dist/src/i18n/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { formatI18n } from "./format.js";
|
|
2
2
|
import { DEFAULT_SERVER_LOCALE, SERVER_LOCALES, isServerLocale, normalizeServerLocale, serverLocaleOrFallback } from "./locale.js";
|
|
3
|
-
import { resolveToolLocale, shareToolErrorLine, shareToolMessages, shareToolSuccessLines } from "./share-tool-bundle.js";
|
|
4
3
|
import { JUDGE_REASON_EN, goalsChecklistProgressSuffix, goalsContinuationChecklistTemplate, goalsContinuationPlainTemplate, goalsEvaluateCopy, goalsJudgeReason, goalsJudgeResponseLanguageNote, goalsMessages } from "./goals-bundle.js";
|
|
4
|
+
import { resolveToolLocale, shareToolErrorLine, shareToolMessages, shareToolSuccessLines } from "./share-tool-bundle.js";
|
|
5
5
|
export { DEFAULT_SERVER_LOCALE, JUDGE_REASON_EN, SERVER_LOCALES, formatI18n, goalsChecklistProgressSuffix, goalsContinuationChecklistTemplate, goalsContinuationPlainTemplate, goalsEvaluateCopy, goalsJudgeReason, goalsJudgeResponseLanguageNote, goalsMessages, isServerLocale, normalizeServerLocale, resolveToolLocale, serverLocaleOrFallback, shareToolErrorLine, shareToolMessages, shareToolSuccessLines };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import share_tool_en_default from "./locales/share-tool.en.js";
|
|
2
|
-
import share_tool_zh_default from "./locales/share-tool.zh.js";
|
|
3
1
|
import { formatI18n } from "./format.js";
|
|
4
2
|
import { normalizeServerLocale, serverLocaleOrFallback } from "./locale.js";
|
|
3
|
+
import share_tool_en_default from "./locales/share-tool.en.js";
|
|
4
|
+
import share_tool_zh_default from "./locales/share-tool.zh.js";
|
|
5
5
|
//#region src/i18n/share-tool-bundle.ts
|
|
6
6
|
const byLocale = {
|
|
7
7
|
en: share_tool_en_default,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { resolveImageModelConfigForTool } from "../agent/image/tool-model-config.js";
|
|
2
|
-
import { describeImagesWithFallback } from "../agent/image/understanding/runtime.js";
|
|
3
1
|
import { getNoteAgentContextRecord, upsertNoteAgentContextRecord } from "../storage/sqlite/note-agent-context-repository.js";
|
|
4
2
|
import "../storage/sqlite/index.js";
|
|
3
|
+
import { resolveImageModelConfigForTool } from "../agent/image/tool-model-config.js";
|
|
4
|
+
import { describeImagesWithFallback } from "../agent/image/understanding/runtime.js";
|
|
5
5
|
import { transcribe } from "../voice/stt/transcribe-core.js";
|
|
6
6
|
import { isSTTAvailable } from "../voice/stt/availability.js";
|
|
7
7
|
import "../voice/stt/index.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function bindAutomationToProject(automationId: string, projectId: string): void;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { getSqliteDatabase, runSqliteWriteTransaction } from "../storage/sqlite/transaction.js";
|
|
2
|
+
//#region src/projects/automation-bind.ts
|
|
3
|
+
function bindAutomationToProject(automationId, projectId) {
|
|
4
|
+
const db = getSqliteDatabase();
|
|
5
|
+
if (!db.prepare(`SELECT 1 FROM projects WHERE project_id = ?`).get(projectId)) throw new Error(`Project not found: ${projectId}`);
|
|
6
|
+
if (!db.prepare(`SELECT 1 FROM automations WHERE automation_id = ?`).get(automationId)) throw new Error(`Automation not found: ${automationId}`);
|
|
7
|
+
runSqliteWriteTransaction((tx) => {
|
|
8
|
+
const now = Date.now();
|
|
9
|
+
tx.prepare(`UPDATE automations SET project_id = ?, updated_at_ms = ? WHERE automation_id = ?`).run(projectId, now, automationId);
|
|
10
|
+
tx.prepare(`UPDATE projects SET last_active_at = ?, updated_at = ? WHERE project_id = ?`).run(now, now, projectId);
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
//#endregion
|
|
14
|
+
export { bindAutomationToProject };
|
|
15
|
+
|
|
16
|
+
//# sourceMappingURL=automation-bind.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"automation-bind.js","names":[],"sources":["../../../src/projects/automation-bind.ts"],"sourcesContent":["import { getSqliteDatabase, runSqliteWriteTransaction } from '../storage/sqlite/transaction.js';\n\nexport function bindAutomationToProject(automationId: string, projectId: string): void {\n const db = getSqliteDatabase();\n if (!db.prepare(`SELECT 1 FROM projects WHERE project_id = ?`).get(projectId)) throw new Error(`Project not found: ${projectId}`);\n if (!db.prepare(`SELECT 1 FROM automations WHERE automation_id = ?`).get(automationId)) throw new Error(`Automation not found: ${automationId}`);\n runSqliteWriteTransaction((tx) => {\n const now = Date.now();\n tx.prepare(`UPDATE automations SET project_id = ?, updated_at_ms = ? WHERE automation_id = ?`).run(projectId, now, automationId);\n tx.prepare(`UPDATE projects SET last_active_at = ?, updated_at = ? WHERE project_id = ?`).run(now, now, projectId);\n });\n}\n"],"mappings":";;AAEA,SAAgB,wBAAwB,cAAsB,WAAyB;CACrF,MAAM,KAAK,mBAAmB;AAC9B,KAAI,CAAC,GAAG,QAAQ,8CAA8C,CAAC,IAAI,UAAU,CAAE,OAAM,IAAI,MAAM,sBAAsB,YAAY;AACjI,KAAI,CAAC,GAAG,QAAQ,oDAAoD,CAAC,IAAI,aAAa,CAAE,OAAM,IAAI,MAAM,yBAAyB,eAAe;AAChJ,4BAA2B,OAAO;EAChC,MAAM,MAAM,KAAK,KAAK;AACtB,KAAG,QAAQ,mFAAmF,CAAC,IAAI,WAAW,KAAK,aAAa;AAChI,KAAG,QAAQ,8EAA8E,CAAC,IAAI,KAAK,KAAK,UAAU;GAClH"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function bindGoalToProject(goalId: string, projectId: string): void;
|
|
2
|
+
export declare function unbindGoalFromProject(goalId: string): void;
|
|
3
|
+
export declare function listProjectGoalIds(projectId: string, limit?: number, offset?: number): string[];
|
|
4
|
+
export declare function bindGoalsToProject(goalIds: string[], projectId: string): void;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { getSqliteDatabase, runSqliteWriteTransaction } from "../storage/sqlite/transaction.js";
|
|
2
|
+
//#region src/projects/goal-bind.ts
|
|
3
|
+
function assertProjectExists(projectId) {
|
|
4
|
+
if (!getSqliteDatabase().prepare(`SELECT 1 FROM projects WHERE project_id = ?`).get(projectId)) throw new Error(`Project not found: ${projectId}`);
|
|
5
|
+
}
|
|
6
|
+
function assertGoalExists(goalId) {
|
|
7
|
+
if (!getSqliteDatabase().prepare(`SELECT 1 FROM goals WHERE goal_id = ?`).get(goalId)) throw new Error(`Goal not found: ${goalId}`);
|
|
8
|
+
}
|
|
9
|
+
function bindGoalToProject(goalId, projectId) {
|
|
10
|
+
assertProjectExists(projectId);
|
|
11
|
+
assertGoalExists(goalId);
|
|
12
|
+
runSqliteWriteTransaction((db) => {
|
|
13
|
+
const now = Date.now();
|
|
14
|
+
db.prepare(`UPDATE goals SET project_id = ?, updated_at = ? WHERE goal_id = ?`).run(projectId, now, goalId);
|
|
15
|
+
db.prepare(`UPDATE projects SET last_active_at = ?, updated_at = ? WHERE project_id = ?`).run(now, now, projectId);
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
function unbindGoalFromProject(goalId) {
|
|
19
|
+
assertGoalExists(goalId);
|
|
20
|
+
runSqliteWriteTransaction((db) => {
|
|
21
|
+
db.prepare(`UPDATE goals SET project_id = NULL, updated_at = ? WHERE goal_id = ?`).run(Date.now(), goalId);
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
function listProjectGoalIds(projectId, limit = 100, offset = 0) {
|
|
25
|
+
assertProjectExists(projectId);
|
|
26
|
+
return getSqliteDatabase().prepare(`SELECT goal_id FROM goals WHERE project_id = ? ORDER BY updated_at DESC LIMIT ? OFFSET ?`).all(projectId, Math.min(500, Math.max(1, Math.floor(limit))), Math.max(0, Math.floor(offset))).map((row) => row.goal_id);
|
|
27
|
+
}
|
|
28
|
+
function bindGoalsToProject(goalIds, projectId) {
|
|
29
|
+
assertProjectExists(projectId);
|
|
30
|
+
runSqliteWriteTransaction((db) => {
|
|
31
|
+
const now = Date.now();
|
|
32
|
+
const stmt = db.prepare(`UPDATE goals SET project_id = ?, updated_at = ? WHERE goal_id = ?`);
|
|
33
|
+
for (const goalId of goalIds) stmt.run(projectId, now, goalId);
|
|
34
|
+
db.prepare(`UPDATE projects SET last_active_at = ?, updated_at = ? WHERE project_id = ?`).run(now, now, projectId);
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
//#endregion
|
|
38
|
+
export { bindGoalToProject, bindGoalsToProject, listProjectGoalIds, unbindGoalFromProject };
|
|
39
|
+
|
|
40
|
+
//# sourceMappingURL=goal-bind.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"goal-bind.js","names":[],"sources":["../../../src/projects/goal-bind.ts"],"sourcesContent":["import { getSqliteDatabase, runSqliteWriteTransaction } from '../storage/sqlite/transaction.js';\n\nfunction assertProjectExists(projectId: string): void {\n const row = getSqliteDatabase().prepare(`SELECT 1 FROM projects WHERE project_id = ?`).get(projectId);\n if (!row) throw new Error(`Project not found: ${projectId}`);\n}\n\nfunction assertGoalExists(goalId: string): void {\n const row = getSqliteDatabase().prepare(`SELECT 1 FROM goals WHERE goal_id = ?`).get(goalId);\n if (!row) throw new Error(`Goal not found: ${goalId}`);\n}\n\nexport function bindGoalToProject(goalId: string, projectId: string): void {\n assertProjectExists(projectId);\n assertGoalExists(goalId);\n runSqliteWriteTransaction((db) => {\n const now = Date.now();\n db.prepare(`UPDATE goals SET project_id = ?, updated_at = ? WHERE goal_id = ?`).run(projectId, now, goalId);\n db.prepare(`UPDATE projects SET last_active_at = ?, updated_at = ? WHERE project_id = ?`).run(now, now, projectId);\n });\n}\n\nexport function unbindGoalFromProject(goalId: string): void {\n assertGoalExists(goalId);\n runSqliteWriteTransaction((db) => {\n db.prepare(`UPDATE goals SET project_id = NULL, updated_at = ? WHERE goal_id = ?`).run(Date.now(), goalId);\n });\n}\n\nexport function listProjectGoalIds(projectId: string, limit = 100, offset = 0): string[] {\n assertProjectExists(projectId);\n const rows = getSqliteDatabase()\n .prepare(`SELECT goal_id FROM goals WHERE project_id = ? ORDER BY updated_at DESC LIMIT ? OFFSET ?`)\n .all(projectId, Math.min(500, Math.max(1, Math.floor(limit))), Math.max(0, Math.floor(offset))) as Array<{ goal_id: string }>;\n return rows.map((row) => row.goal_id);\n}\n\nexport function bindGoalsToProject(goalIds: string[], projectId: string): void {\n assertProjectExists(projectId);\n runSqliteWriteTransaction((db) => {\n const now = Date.now();\n const stmt = db.prepare(`UPDATE goals SET project_id = ?, updated_at = ? WHERE goal_id = ?`);\n for (const goalId of goalIds) {\n stmt.run(projectId, now, goalId);\n }\n db.prepare(`UPDATE projects SET last_active_at = ?, updated_at = ? WHERE project_id = ?`).run(now, now, projectId);\n });\n}\n"],"mappings":";;AAEA,SAAS,oBAAoB,WAAyB;AAEpD,KAAI,CADQ,mBAAmB,CAAC,QAAQ,8CAA8C,CAAC,IAAI,UACnF,CAAE,OAAM,IAAI,MAAM,sBAAsB,YAAY;;AAG9D,SAAS,iBAAiB,QAAsB;AAE9C,KAAI,CADQ,mBAAmB,CAAC,QAAQ,wCAAwC,CAAC,IAAI,OAC7E,CAAE,OAAM,IAAI,MAAM,mBAAmB,SAAS;;AAGxD,SAAgB,kBAAkB,QAAgB,WAAyB;AACzE,qBAAoB,UAAU;AAC9B,kBAAiB,OAAO;AACxB,4BAA2B,OAAO;EAChC,MAAM,MAAM,KAAK,KAAK;AACtB,KAAG,QAAQ,oEAAoE,CAAC,IAAI,WAAW,KAAK,OAAO;AAC3G,KAAG,QAAQ,8EAA8E,CAAC,IAAI,KAAK,KAAK,UAAU;GAClH;;AAGJ,SAAgB,sBAAsB,QAAsB;AAC1D,kBAAiB,OAAO;AACxB,4BAA2B,OAAO;AAChC,KAAG,QAAQ,uEAAuE,CAAC,IAAI,KAAK,KAAK,EAAE,OAAO;GAC1G;;AAGJ,SAAgB,mBAAmB,WAAmB,QAAQ,KAAK,SAAS,GAAa;AACvF,qBAAoB,UAAU;AAI9B,QAHa,mBAAmB,CAC7B,QAAQ,2FAA2F,CACnG,IAAI,WAAW,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,CAAC,CAAC,EAAE,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,CAAC,CACrF,CAAC,KAAK,QAAQ,IAAI,QAAQ;;AAGvC,SAAgB,mBAAmB,SAAmB,WAAyB;AAC7E,qBAAoB,UAAU;AAC9B,4BAA2B,OAAO;EAChC,MAAM,MAAM,KAAK,KAAK;EACtB,MAAM,OAAO,GAAG,QAAQ,oEAAoE;AAC5F,OAAK,MAAM,UAAU,QACnB,MAAK,IAAI,WAAW,KAAK,OAAO;AAElC,KAAG,QAAQ,8EAA8E,CAAC,IAAI,KAAK,KAAK,UAAU;GAClH"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export * from './types.js';
|
|
2
|
+
export * from './project-store.js';
|
|
3
|
+
export * from './project-service.js';
|
|
4
|
+
export * from './project-agent.js';
|
|
5
|
+
export * from './project-loop.js';
|
|
6
|
+
export * from './session-bind.js';
|
|
7
|
+
export * from './goal-bind.js';
|
|
8
|
+
export * from './workflow-bind.js';
|
|
9
|
+
export * from './automation-bind.js';
|
|
10
|
+
export * from './memory-bind.js';
|
|
11
|
+
export * from './workspace.js';
|
|
12
|
+
export * from './workspace-project.js';
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ProjectStore, slugifyProjectName } from "./project-store.js";
|
|
2
|
+
import { getProjectForSession, getProjectWorkspacePathForSession, resolveProjectWorkspacePath } from "./workspace.js";
|
|
3
|
+
import { bindGoalToProject, bindGoalsToProject, listProjectGoalIds, unbindGoalFromProject } from "./goal-bind.js";
|
|
4
|
+
import { bindSessionToProject, bindSessionsToProject, listProjectSessionKeys, moveSessionToProject, unbindSessionFromProject } from "./session-bind.js";
|
|
5
|
+
import { ProjectWorkspaceConflictError, ProjectWorkspaceMissingError, canonicalWorkspacePath, ensureWorkspaceDirectory, inferProjectNameFromWorkspaceRoot, isPathSameOrInsideWorkspace, isSafeAutoCreateWorkspaceRoot, resolveWorkspaceProjectRoot, workspaceDirectoryExists } from "./workspace-project.js";
|
|
6
|
+
import { ProjectService } from "./project-service.js";
|
|
7
|
+
import { isValidProjectAgentId, normalizeProjectAgentId, resolveProjectAgentId } from "./project-agent.js";
|
|
8
|
+
import { buildProjectLoopOverview } from "./project-loop.js";
|
|
9
|
+
import { bindWorkflowRunToProject } from "./workflow-bind.js";
|
|
10
|
+
import { bindAutomationToProject } from "./automation-bind.js";
|
|
11
|
+
import { bindMemoryRecordToProject } from "./memory-bind.js";
|
|
12
|
+
export { ProjectService, ProjectStore, ProjectWorkspaceConflictError, ProjectWorkspaceMissingError, bindAutomationToProject, bindGoalToProject, bindGoalsToProject, bindMemoryRecordToProject, bindSessionToProject, bindSessionsToProject, bindWorkflowRunToProject, buildProjectLoopOverview, canonicalWorkspacePath, ensureWorkspaceDirectory, getProjectForSession, getProjectWorkspacePathForSession, inferProjectNameFromWorkspaceRoot, isPathSameOrInsideWorkspace, isSafeAutoCreateWorkspaceRoot, isValidProjectAgentId, listProjectGoalIds, listProjectSessionKeys, moveSessionToProject, normalizeProjectAgentId, resolveProjectAgentId, resolveProjectWorkspacePath, resolveWorkspaceProjectRoot, slugifyProjectName, unbindGoalFromProject, unbindSessionFromProject, workspaceDirectoryExists };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function bindMemoryRecordToProject(recordId: string, projectId: string): void;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { getSqliteDatabase, runSqliteWriteTransaction } from "../storage/sqlite/transaction.js";
|
|
2
|
+
//#region src/projects/memory-bind.ts
|
|
3
|
+
function bindMemoryRecordToProject(recordId, projectId) {
|
|
4
|
+
const db = getSqliteDatabase();
|
|
5
|
+
if (!db.prepare(`SELECT 1 FROM projects WHERE project_id = ?`).get(projectId)) throw new Error(`Project not found: ${projectId}`);
|
|
6
|
+
if (!db.prepare(`SELECT 1 FROM memory_records WHERE record_id = ?`).get(recordId)) throw new Error(`Memory record not found: ${recordId}`);
|
|
7
|
+
runSqliteWriteTransaction((tx) => {
|
|
8
|
+
const now = Date.now();
|
|
9
|
+
tx.prepare(`UPDATE memory_records SET project_id = ?, updated_at = ? WHERE record_id = ?`).run(projectId, now, recordId);
|
|
10
|
+
tx.prepare(`UPDATE projects SET last_active_at = ?, updated_at = ? WHERE project_id = ?`).run(now, now, projectId);
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
//#endregion
|
|
14
|
+
export { bindMemoryRecordToProject };
|
|
15
|
+
|
|
16
|
+
//# sourceMappingURL=memory-bind.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-bind.js","names":[],"sources":["../../../src/projects/memory-bind.ts"],"sourcesContent":["import { getSqliteDatabase, runSqliteWriteTransaction } from '../storage/sqlite/transaction.js';\n\nexport function bindMemoryRecordToProject(recordId: string, projectId: string): void {\n const db = getSqliteDatabase();\n if (!db.prepare(`SELECT 1 FROM projects WHERE project_id = ?`).get(projectId)) throw new Error(`Project not found: ${projectId}`);\n if (!db.prepare(`SELECT 1 FROM memory_records WHERE record_id = ?`).get(recordId)) throw new Error(`Memory record not found: ${recordId}`);\n runSqliteWriteTransaction((tx) => {\n const now = Date.now();\n tx.prepare(`UPDATE memory_records SET project_id = ?, updated_at = ? WHERE record_id = ?`).run(projectId, now, recordId);\n tx.prepare(`UPDATE projects SET last_active_at = ?, updated_at = ? WHERE project_id = ?`).run(now, now, projectId);\n });\n}\n"],"mappings":";;AAEA,SAAgB,0BAA0B,UAAkB,WAAyB;CACnF,MAAM,KAAK,mBAAmB;AAC9B,KAAI,CAAC,GAAG,QAAQ,8CAA8C,CAAC,IAAI,UAAU,CAAE,OAAM,IAAI,MAAM,sBAAsB,YAAY;AACjI,KAAI,CAAC,GAAG,QAAQ,mDAAmD,CAAC,IAAI,SAAS,CAAE,OAAM,IAAI,MAAM,4BAA4B,WAAW;AAC1I,4BAA2B,OAAO;EAChC,MAAM,MAAM,KAAK,KAAK;AACtB,KAAG,QAAQ,+EAA+E,CAAC,IAAI,WAAW,KAAK,SAAS;AACxH,KAAG,QAAQ,8EAA8E,CAAC,IAAI,KAAK,KAAK,UAAU;GAClH"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Config } from '../config/schema.js';
|
|
2
|
+
import type { ProjectService } from './project-service.js';
|
|
3
|
+
export declare function resolveProjectAgentId(input: {
|
|
4
|
+
config: Config;
|
|
5
|
+
projects: ProjectService;
|
|
6
|
+
explicitAgentId?: string | null;
|
|
7
|
+
projectId?: string | null;
|
|
8
|
+
}): string;
|
|
9
|
+
export declare function isValidProjectAgentId(config: Config, agentId: string | null | undefined): boolean;
|
|
10
|
+
export declare function normalizeProjectAgentId(agentId: string | null | undefined): string | undefined;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { agentExists, getDefaultAgentId, init_resolve_route } from "../routing/resolve-route.js";
|
|
2
|
+
//#region src/projects/project-agent.ts
|
|
3
|
+
init_resolve_route();
|
|
4
|
+
function normalizeAgentId(value) {
|
|
5
|
+
const trimmed = value?.trim();
|
|
6
|
+
return trimmed ? trimmed.toLowerCase() : void 0;
|
|
7
|
+
}
|
|
8
|
+
function resolveProjectAgentId(input) {
|
|
9
|
+
const fallback = getDefaultAgentId(input.config);
|
|
10
|
+
const explicitAgentId = normalizeAgentId(input.explicitAgentId);
|
|
11
|
+
if (explicitAgentId) return agentExists(explicitAgentId, input.config) ? explicitAgentId : fallback;
|
|
12
|
+
const projectId = input.projectId?.trim();
|
|
13
|
+
const projectAgentId = projectId ? normalizeAgentId(input.projects.get(projectId)?.defaultAgentId) : void 0;
|
|
14
|
+
if (projectAgentId && agentExists(projectAgentId, input.config)) return projectAgentId;
|
|
15
|
+
return fallback;
|
|
16
|
+
}
|
|
17
|
+
function isValidProjectAgentId(config, agentId) {
|
|
18
|
+
const normalized = normalizeAgentId(agentId);
|
|
19
|
+
return !normalized || agentExists(normalized, config);
|
|
20
|
+
}
|
|
21
|
+
function normalizeProjectAgentId(agentId) {
|
|
22
|
+
return normalizeAgentId(agentId);
|
|
23
|
+
}
|
|
24
|
+
//#endregion
|
|
25
|
+
export { isValidProjectAgentId, normalizeProjectAgentId, resolveProjectAgentId };
|
|
26
|
+
|
|
27
|
+
//# sourceMappingURL=project-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-agent.js","names":[],"sources":["../../../src/projects/project-agent.ts"],"sourcesContent":["import type { Config } from '../config/schema.js';\nimport { agentExists, getDefaultAgentId } from '../routing/resolve-route.js';\nimport type { ProjectService } from './project-service.js';\n\nfunction normalizeAgentId(value: string | undefined | null): string | undefined {\n const trimmed = value?.trim();\n return trimmed ? trimmed.toLowerCase() : undefined;\n}\n\nexport function resolveProjectAgentId(input: {\n config: Config;\n projects: ProjectService;\n explicitAgentId?: string | null;\n projectId?: string | null;\n}): string {\n const fallback = getDefaultAgentId(input.config);\n const explicitAgentId = normalizeAgentId(input.explicitAgentId);\n if (explicitAgentId) {\n return agentExists(explicitAgentId, input.config) ? explicitAgentId : fallback;\n }\n\n const projectId = input.projectId?.trim();\n const projectAgentId = projectId ? normalizeAgentId(input.projects.get(projectId)?.defaultAgentId) : undefined;\n if (projectAgentId && agentExists(projectAgentId, input.config)) {\n return projectAgentId;\n }\n return fallback;\n}\n\nexport function isValidProjectAgentId(config: Config, agentId: string | null | undefined): boolean {\n const normalized = normalizeAgentId(agentId);\n return !normalized || agentExists(normalized, config);\n}\n\nexport function normalizeProjectAgentId(agentId: string | null | undefined): string | undefined {\n return normalizeAgentId(agentId);\n}\n"],"mappings":";;oBAC6E;AAG7E,SAAS,iBAAiB,OAAsD;CAC9E,MAAM,UAAU,OAAO,MAAM;AAC7B,QAAO,UAAU,QAAQ,aAAa,GAAG,KAAA;;AAG3C,SAAgB,sBAAsB,OAK3B;CACT,MAAM,WAAW,kBAAkB,MAAM,OAAO;CAChD,MAAM,kBAAkB,iBAAiB,MAAM,gBAAgB;AAC/D,KAAI,gBACF,QAAO,YAAY,iBAAiB,MAAM,OAAO,GAAG,kBAAkB;CAGxE,MAAM,YAAY,MAAM,WAAW,MAAM;CACzC,MAAM,iBAAiB,YAAY,iBAAiB,MAAM,SAAS,IAAI,UAAU,EAAE,eAAe,GAAG,KAAA;AACrG,KAAI,kBAAkB,YAAY,gBAAgB,MAAM,OAAO,CAC7D,QAAO;AAET,QAAO;;AAGT,SAAgB,sBAAsB,QAAgB,SAA6C;CACjG,MAAM,aAAa,iBAAiB,QAAQ;AAC5C,QAAO,CAAC,cAAc,YAAY,YAAY,OAAO;;AAGvD,SAAgB,wBAAwB,SAAwD;AAC9F,QAAO,iBAAiB,QAAQ"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { GoalWithDetails } from '../goals/index.js';
|
|
2
|
+
import type { MemoryRecord } from '../agent/memory/types.js';
|
|
3
|
+
import type { ProjectWithDetails } from './types.js';
|
|
4
|
+
export type ProjectWorkflowRunBrief = {
|
|
5
|
+
runId: string;
|
|
6
|
+
definitionId: string;
|
|
7
|
+
status: string;
|
|
8
|
+
createdAt: number;
|
|
9
|
+
errorMessage?: string;
|
|
10
|
+
};
|
|
11
|
+
export type ProjectAttentionItem = {
|
|
12
|
+
id: string;
|
|
13
|
+
kind: 'blocked_goal' | 'stale_goal' | 'failed_workflow';
|
|
14
|
+
title: string;
|
|
15
|
+
detail?: string;
|
|
16
|
+
status?: string;
|
|
17
|
+
href?: string;
|
|
18
|
+
updatedAt?: number;
|
|
19
|
+
};
|
|
20
|
+
export type ProjectTimelineItem = {
|
|
21
|
+
id: string;
|
|
22
|
+
kind: 'session' | 'goal' | 'workflow' | 'memory';
|
|
23
|
+
title: string;
|
|
24
|
+
detail?: string;
|
|
25
|
+
timestamp: number;
|
|
26
|
+
status?: string;
|
|
27
|
+
href?: string;
|
|
28
|
+
};
|
|
29
|
+
export type ProjectLoopOverview = {
|
|
30
|
+
activeGoals: GoalWithDetails[];
|
|
31
|
+
blockedGoals: GoalWithDetails[];
|
|
32
|
+
staleGoals: GoalWithDetails[];
|
|
33
|
+
nextActions: Array<{
|
|
34
|
+
goalId: string;
|
|
35
|
+
title: string;
|
|
36
|
+
nextAction?: string;
|
|
37
|
+
status: string;
|
|
38
|
+
updatedAt?: number;
|
|
39
|
+
}>;
|
|
40
|
+
attentionItems: ProjectAttentionItem[];
|
|
41
|
+
timeline: ProjectTimelineItem[];
|
|
42
|
+
digest: {
|
|
43
|
+
status: 'healthy' | 'attention' | 'idle' | 'empty';
|
|
44
|
+
summary: string;
|
|
45
|
+
nextAction?: string;
|
|
46
|
+
};
|
|
47
|
+
failedWorkflowRuns: ProjectWorkflowRunBrief[];
|
|
48
|
+
recommendedAction?: string;
|
|
49
|
+
};
|
|
50
|
+
export declare function buildProjectLoopOverview(input: {
|
|
51
|
+
project: ProjectWithDetails;
|
|
52
|
+
goals: GoalWithDetails[];
|
|
53
|
+
recentWorkflowRuns: ProjectWorkflowRunBrief[];
|
|
54
|
+
failedWorkflowRuns?: ProjectWorkflowRunBrief[];
|
|
55
|
+
memoryRecords?: MemoryRecord[];
|
|
56
|
+
nowMs?: number;
|
|
57
|
+
staleAfterMs?: number;
|
|
58
|
+
}): ProjectLoopOverview;
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
//#region src/projects/project-loop.ts
|
|
2
|
+
const ACTIVE_GOAL_STATUSES = new Set([
|
|
3
|
+
"active",
|
|
4
|
+
"paused",
|
|
5
|
+
"blocked",
|
|
6
|
+
"needs_input"
|
|
7
|
+
]);
|
|
8
|
+
const STALE_GOAL_STATUSES = new Set(["active", "paused"]);
|
|
9
|
+
const DEFAULT_STALE_AFTER_MS = 10080 * 60 * 1e3;
|
|
10
|
+
function goalUpdatedAtDesc(left, right) {
|
|
11
|
+
return right.updatedAt - left.updatedAt;
|
|
12
|
+
}
|
|
13
|
+
function compactText(value, max = 180) {
|
|
14
|
+
const trimmed = value?.trim().replace(/\s+/g, " ");
|
|
15
|
+
if (!trimmed) return void 0;
|
|
16
|
+
return trimmed.length <= max ? trimmed : `${trimmed.slice(0, max - 3).trimEnd()}...`;
|
|
17
|
+
}
|
|
18
|
+
function buildProjectLoopOverview(input) {
|
|
19
|
+
const staleCutoff = (input.nowMs ?? Date.now()) - (input.staleAfterMs ?? DEFAULT_STALE_AFTER_MS);
|
|
20
|
+
const projectGoals = [...input.goals].sort(goalUpdatedAtDesc);
|
|
21
|
+
const activeGoals = projectGoals.filter((goal) => ACTIVE_GOAL_STATUSES.has(goal.status)).slice(0, 6);
|
|
22
|
+
const blockedGoals = projectGoals.filter((goal) => goal.status === "blocked" || goal.status === "needs_input").slice(0, 4);
|
|
23
|
+
const staleGoals = projectGoals.filter((goal) => STALE_GOAL_STATUSES.has(goal.status) && goal.updatedAt < staleCutoff).slice(0, 5);
|
|
24
|
+
const nextActions = activeGoals.filter((goal) => goal.nextAction?.trim()).slice(0, 5).map((goal) => ({
|
|
25
|
+
goalId: goal.id,
|
|
26
|
+
title: goal.title,
|
|
27
|
+
nextAction: goal.nextAction,
|
|
28
|
+
status: goal.status,
|
|
29
|
+
updatedAt: goal.updatedAt
|
|
30
|
+
}));
|
|
31
|
+
const failedWorkflowRuns = (input.failedWorkflowRuns ?? input.recentWorkflowRuns.filter((run) => run.status === "failed" || run.status === "timeout" || run.status === "cancelled")).slice(0, 5);
|
|
32
|
+
const attentionItems = [
|
|
33
|
+
...blockedGoals.map((goal) => ({
|
|
34
|
+
id: `goal:${goal.id}:blocked`,
|
|
35
|
+
kind: "blocked_goal",
|
|
36
|
+
title: goal.title,
|
|
37
|
+
detail: compactText(goal.blockedReason || goal.nextAction || goal.description),
|
|
38
|
+
status: goal.status,
|
|
39
|
+
href: `/goals/${encodeURIComponent(goal.id)}`,
|
|
40
|
+
updatedAt: goal.updatedAt
|
|
41
|
+
})),
|
|
42
|
+
...staleGoals.map((goal) => ({
|
|
43
|
+
id: `goal:${goal.id}:stale`,
|
|
44
|
+
kind: "stale_goal",
|
|
45
|
+
title: goal.title,
|
|
46
|
+
detail: compactText(goal.nextAction || goal.description || "Goal has not changed recently."),
|
|
47
|
+
status: goal.status,
|
|
48
|
+
href: `/goals/${encodeURIComponent(goal.id)}`,
|
|
49
|
+
updatedAt: goal.updatedAt
|
|
50
|
+
})),
|
|
51
|
+
...failedWorkflowRuns.map((run) => ({
|
|
52
|
+
id: `workflow:${run.runId}:failed`,
|
|
53
|
+
kind: "failed_workflow",
|
|
54
|
+
title: run.definitionId,
|
|
55
|
+
detail: compactText(run.errorMessage || run.status),
|
|
56
|
+
status: run.status,
|
|
57
|
+
href: `/workflows/runs/${encodeURIComponent(run.runId)}`,
|
|
58
|
+
updatedAt: run.createdAt
|
|
59
|
+
}))
|
|
60
|
+
].slice(0, 8);
|
|
61
|
+
const timeline = [
|
|
62
|
+
...input.project.recentSessions.map((session) => ({
|
|
63
|
+
id: `session:${session.key}`,
|
|
64
|
+
kind: "session",
|
|
65
|
+
title: session.name ?? session.key,
|
|
66
|
+
detail: session.agentId,
|
|
67
|
+
timestamp: Date.parse(session.updatedAt),
|
|
68
|
+
href: `/chat/${encodeURIComponent(session.key)}`
|
|
69
|
+
})),
|
|
70
|
+
...projectGoals.slice(0, 8).map((goal) => ({
|
|
71
|
+
id: `goal:${goal.id}`,
|
|
72
|
+
kind: "goal",
|
|
73
|
+
title: goal.title,
|
|
74
|
+
detail: compactText(goal.nextAction || goal.blockedReason || goal.description),
|
|
75
|
+
timestamp: goal.updatedAt,
|
|
76
|
+
status: goal.status,
|
|
77
|
+
href: `/goals/${encodeURIComponent(goal.id)}`
|
|
78
|
+
})),
|
|
79
|
+
...input.recentWorkflowRuns.map((run) => ({
|
|
80
|
+
id: `workflow:${run.runId}`,
|
|
81
|
+
kind: "workflow",
|
|
82
|
+
title: run.definitionId,
|
|
83
|
+
detail: run.status,
|
|
84
|
+
timestamp: run.createdAt,
|
|
85
|
+
status: run.status,
|
|
86
|
+
href: `/workflows/runs/${encodeURIComponent(run.runId)}`
|
|
87
|
+
})),
|
|
88
|
+
...(input.memoryRecords ?? []).slice(0, 5).map((record) => ({
|
|
89
|
+
id: `memory:${record.id}`,
|
|
90
|
+
kind: "memory",
|
|
91
|
+
title: record.kind,
|
|
92
|
+
detail: compactText(record.content),
|
|
93
|
+
timestamp: Date.parse(record.updatedAt),
|
|
94
|
+
status: record.status
|
|
95
|
+
}))
|
|
96
|
+
].filter((item) => Number.isFinite(item.timestamp)).sort((left, right) => right.timestamp - left.timestamp).slice(0, 12);
|
|
97
|
+
const recommendedAction = nextActions[0]?.nextAction ?? blockedGoals[0]?.blockedReason ?? staleGoals[0]?.nextAction ?? activeGoals[0]?.title ?? (input.project.brief ? "Open a new chat to continue from the project brief." : void 0);
|
|
98
|
+
const digestStatus = attentionItems.length > 0 ? "attention" : activeGoals.length > 0 || input.recentWorkflowRuns.some((run) => run.status === "running" || run.status === "queued") ? "healthy" : timeline.length > 0 ? "idle" : "empty";
|
|
99
|
+
return {
|
|
100
|
+
activeGoals,
|
|
101
|
+
blockedGoals,
|
|
102
|
+
staleGoals,
|
|
103
|
+
nextActions,
|
|
104
|
+
attentionItems,
|
|
105
|
+
timeline,
|
|
106
|
+
digest: {
|
|
107
|
+
status: digestStatus,
|
|
108
|
+
summary: digestStatus === "attention" ? `${attentionItems.length} item(s) need attention: ${blockedGoals.length} blocker(s), ${staleGoals.length} stale goal(s), ${failedWorkflowRuns.length} failed workflow run(s).` : digestStatus === "healthy" ? `${activeGoals.length} active goal(s), ${nextActions.length} next action(s), and ${input.recentWorkflowRuns.length} recent workflow run(s).` : digestStatus === "idle" ? "Recent activity exists, but no active goal is driving the project." : "No project activity has been recorded yet.",
|
|
109
|
+
nextAction: recommendedAction
|
|
110
|
+
},
|
|
111
|
+
failedWorkflowRuns,
|
|
112
|
+
recommendedAction
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
//#endregion
|
|
116
|
+
export { buildProjectLoopOverview };
|
|
117
|
+
|
|
118
|
+
//# sourceMappingURL=project-loop.js.map
|