@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
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { PaginatedResult } from '../session/types.js';
|
|
2
|
+
export type ProjectStatus = 'active' | 'paused' | 'archived';
|
|
3
|
+
export interface Project {
|
|
4
|
+
id: string;
|
|
5
|
+
name: string;
|
|
6
|
+
slug: string;
|
|
7
|
+
description?: string;
|
|
8
|
+
status: ProjectStatus;
|
|
9
|
+
defaultAgentId?: string;
|
|
10
|
+
workspaceRoot?: string;
|
|
11
|
+
brief?: string;
|
|
12
|
+
instructions?: string;
|
|
13
|
+
createdAt: number;
|
|
14
|
+
updatedAt: number;
|
|
15
|
+
lastActiveAt?: number;
|
|
16
|
+
}
|
|
17
|
+
export interface ProjectWithDetails extends Project {
|
|
18
|
+
sessionCount: number;
|
|
19
|
+
goalCount: number;
|
|
20
|
+
activeGoalCount: number;
|
|
21
|
+
recentSessions: Array<{
|
|
22
|
+
key: string;
|
|
23
|
+
name?: string;
|
|
24
|
+
updatedAt: string;
|
|
25
|
+
agentId: string;
|
|
26
|
+
}>;
|
|
27
|
+
recentWorkflowRuns: Array<{
|
|
28
|
+
runId: string;
|
|
29
|
+
definitionId: string;
|
|
30
|
+
status: string;
|
|
31
|
+
createdAt: number;
|
|
32
|
+
}>;
|
|
33
|
+
}
|
|
34
|
+
export interface ProjectListQuery {
|
|
35
|
+
status?: ProjectStatus | ProjectStatus[];
|
|
36
|
+
search?: string;
|
|
37
|
+
sortBy?: 'updatedAt' | 'createdAt' | 'name';
|
|
38
|
+
sortOrder?: 'asc' | 'desc';
|
|
39
|
+
limit?: number;
|
|
40
|
+
offset?: number;
|
|
41
|
+
}
|
|
42
|
+
export interface CreateProjectInput {
|
|
43
|
+
name?: string;
|
|
44
|
+
slug?: string;
|
|
45
|
+
description?: string;
|
|
46
|
+
defaultAgentId?: string;
|
|
47
|
+
workspaceRoot?: string;
|
|
48
|
+
createWorkspaceRoot?: boolean;
|
|
49
|
+
brief?: string;
|
|
50
|
+
instructions?: string;
|
|
51
|
+
}
|
|
52
|
+
export interface UpdateProjectInput {
|
|
53
|
+
name?: string;
|
|
54
|
+
description?: string | null;
|
|
55
|
+
defaultAgentId?: string | null;
|
|
56
|
+
status?: ProjectStatus;
|
|
57
|
+
workspaceRoot?: string | null;
|
|
58
|
+
createWorkspaceRoot?: boolean;
|
|
59
|
+
brief?: string | null;
|
|
60
|
+
instructions?: string | null;
|
|
61
|
+
}
|
|
62
|
+
export type ProjectListResult = PaginatedResult<Project>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function bindWorkflowRunToProject(runId: string, projectId: string): void;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { getSqliteDatabase, runSqliteWriteTransaction } from "../storage/sqlite/transaction.js";
|
|
2
|
+
//#region src/projects/workflow-bind.ts
|
|
3
|
+
function bindWorkflowRunToProject(runId, 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 workflow_runs WHERE run_id = ?`).get(runId)) throw new Error(`Workflow run not found: ${runId}`);
|
|
7
|
+
runSqliteWriteTransaction((tx) => {
|
|
8
|
+
const now = Date.now();
|
|
9
|
+
tx.prepare(`UPDATE workflow_runs SET project_id = ? WHERE run_id = ?`).run(projectId, runId);
|
|
10
|
+
tx.prepare(`UPDATE projects SET last_active_at = ?, updated_at = ? WHERE project_id = ?`).run(now, now, projectId);
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
//#endregion
|
|
14
|
+
export { bindWorkflowRunToProject };
|
|
15
|
+
|
|
16
|
+
//# sourceMappingURL=workflow-bind.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-bind.js","names":[],"sources":["../../../src/projects/workflow-bind.ts"],"sourcesContent":["import { getSqliteDatabase, runSqliteWriteTransaction } from '../storage/sqlite/transaction.js';\n\nexport function bindWorkflowRunToProject(runId: 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 workflow_runs WHERE run_id = ?`).get(runId)) throw new Error(`Workflow run not found: ${runId}`);\n runSqliteWriteTransaction((tx) => {\n const now = Date.now();\n tx.prepare(`UPDATE workflow_runs SET project_id = ? WHERE run_id = ?`).run(projectId, runId);\n tx.prepare(`UPDATE projects SET last_active_at = ?, updated_at = ? WHERE project_id = ?`).run(now, now, projectId);\n });\n}\n"],"mappings":";;AAEA,SAAgB,yBAAyB,OAAe,WAAyB;CAC/E,MAAM,KAAK,mBAAmB;AAC9B,KAAI,CAAC,GAAG,QAAQ,8CAA8C,CAAC,IAAI,UAAU,CAAE,OAAM,IAAI,MAAM,sBAAsB,YAAY;AACjI,KAAI,CAAC,GAAG,QAAQ,+CAA+C,CAAC,IAAI,MAAM,CAAE,OAAM,IAAI,MAAM,2BAA2B,QAAQ;AAC/H,4BAA2B,OAAO;EAChC,MAAM,MAAM,KAAK,KAAK;AACtB,KAAG,QAAQ,2DAA2D,CAAC,IAAI,WAAW,MAAM;AAC5F,KAAG,QAAQ,8EAA8E,CAAC,IAAI,KAAK,KAAK,UAAU;GAClH"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Project } from './types.js';
|
|
2
|
+
export type WorkspaceProjectMatchReason = 'exact' | 'contained' | 'auto_created';
|
|
3
|
+
export type WorkspaceProjectMatch = {
|
|
4
|
+
project: Project;
|
|
5
|
+
reason: WorkspaceProjectMatchReason;
|
|
6
|
+
created: boolean;
|
|
7
|
+
};
|
|
8
|
+
export declare class ProjectWorkspaceConflictError extends Error {
|
|
9
|
+
readonly project: Project;
|
|
10
|
+
constructor(project: Project, message?: string);
|
|
11
|
+
}
|
|
12
|
+
export declare class ProjectWorkspaceMissingError extends Error {
|
|
13
|
+
readonly workspaceRoot: string;
|
|
14
|
+
constructor(workspaceRoot: string, message?: string);
|
|
15
|
+
}
|
|
16
|
+
export declare function canonicalWorkspacePath(raw: string | null | undefined): string | null;
|
|
17
|
+
export declare function workspaceDirectoryExists(workspaceRoot: string | null | undefined): boolean;
|
|
18
|
+
export declare function ensureWorkspaceDirectory(workspaceRoot: string): void;
|
|
19
|
+
export declare function resolveWorkspaceProjectRoot(raw: string | null | undefined): string | null;
|
|
20
|
+
export declare function isPathSameOrInsideWorkspace(workspaceRoot: string, candidatePath: string): boolean;
|
|
21
|
+
export declare function inferProjectNameFromWorkspaceRoot(workspaceRoot: string | null | undefined): string | null;
|
|
22
|
+
export declare function isSafeAutoCreateWorkspaceRoot(workspaceRoot: string | null | undefined): boolean;
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { init_paths_state, resolveStateDir } from "../config/paths-state.js";
|
|
2
|
+
import { init_workspace_path, normalizeWorkspaceDir } from "../config/workspace-path.js";
|
|
3
|
+
import { init_agent_scope, resolveUserPath } from "../agent/agent-scope.js";
|
|
4
|
+
import { homedir, tmpdir } from "node:os";
|
|
5
|
+
import { basename, dirname, isAbsolute, join, parse, relative, resolve } from "node:path";
|
|
6
|
+
import { existsSync, mkdirSync, realpathSync, statSync } from "node:fs";
|
|
7
|
+
import { execFileSync } from "node:child_process";
|
|
8
|
+
//#region src/projects/workspace-project.ts
|
|
9
|
+
init_agent_scope();
|
|
10
|
+
init_workspace_path();
|
|
11
|
+
init_paths_state();
|
|
12
|
+
var ProjectWorkspaceConflictError = class extends Error {
|
|
13
|
+
constructor(project, message = `Workspace is already bound to project: ${project.name}`) {
|
|
14
|
+
super(message);
|
|
15
|
+
this.project = project;
|
|
16
|
+
this.name = "ProjectWorkspaceConflictError";
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
var ProjectWorkspaceMissingError = class extends Error {
|
|
20
|
+
constructor(workspaceRoot, message = `Workspace root does not exist: ${workspaceRoot}`) {
|
|
21
|
+
super(message);
|
|
22
|
+
this.workspaceRoot = workspaceRoot;
|
|
23
|
+
this.name = "ProjectWorkspaceMissingError";
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
const PROJECT_ROOT_MARKERS = [
|
|
27
|
+
".git",
|
|
28
|
+
"pnpm-workspace.yaml",
|
|
29
|
+
"package.json",
|
|
30
|
+
"go.mod",
|
|
31
|
+
"pyproject.toml",
|
|
32
|
+
"Cargo.toml",
|
|
33
|
+
"deno.json",
|
|
34
|
+
"deno.jsonc",
|
|
35
|
+
"bun.lockb",
|
|
36
|
+
"pnpm-lock.yaml",
|
|
37
|
+
"yarn.lock",
|
|
38
|
+
"package-lock.json",
|
|
39
|
+
"composer.json",
|
|
40
|
+
"Gemfile"
|
|
41
|
+
];
|
|
42
|
+
function canonicalWorkspacePath(raw) {
|
|
43
|
+
const trimmed = raw?.trim();
|
|
44
|
+
if (!trimmed) return null;
|
|
45
|
+
const normalized = normalizeWorkspaceDir(resolveUserPath(trimmed));
|
|
46
|
+
if (!normalized) return null;
|
|
47
|
+
try {
|
|
48
|
+
if (!statSync(normalized).isDirectory()) return normalized;
|
|
49
|
+
return realpathSync.native(normalized);
|
|
50
|
+
} catch {
|
|
51
|
+
return normalized;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function workspaceDirectoryExists(workspaceRoot) {
|
|
55
|
+
const canonical = canonicalWorkspacePath(workspaceRoot);
|
|
56
|
+
if (!canonical) return false;
|
|
57
|
+
try {
|
|
58
|
+
return statSync(canonical).isDirectory();
|
|
59
|
+
} catch {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function ensureWorkspaceDirectory(workspaceRoot) {
|
|
64
|
+
mkdirSync(workspaceRoot, { recursive: true });
|
|
65
|
+
}
|
|
66
|
+
function directoryForWorkspaceProbe(pathValue) {
|
|
67
|
+
try {
|
|
68
|
+
return statSync(pathValue).isDirectory() ? pathValue : dirname(pathValue);
|
|
69
|
+
} catch {
|
|
70
|
+
return pathValue;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function findGitRoot(startDir) {
|
|
74
|
+
try {
|
|
75
|
+
return canonicalWorkspacePath(execFileSync("git", [
|
|
76
|
+
"-C",
|
|
77
|
+
startDir,
|
|
78
|
+
"rev-parse",
|
|
79
|
+
"--show-toplevel"
|
|
80
|
+
], {
|
|
81
|
+
encoding: "utf8",
|
|
82
|
+
stdio: [
|
|
83
|
+
"ignore",
|
|
84
|
+
"pipe",
|
|
85
|
+
"ignore"
|
|
86
|
+
],
|
|
87
|
+
timeout: 1e3
|
|
88
|
+
}).trim());
|
|
89
|
+
} catch {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
function findMarkerRoot(startDir) {
|
|
94
|
+
let current = startDir;
|
|
95
|
+
while (true) {
|
|
96
|
+
if (PROJECT_ROOT_MARKERS.some((marker) => existsSync(join(current, marker)))) return current;
|
|
97
|
+
const parent = dirname(current);
|
|
98
|
+
if (parent === current) return null;
|
|
99
|
+
current = parent;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
function resolveWorkspaceProjectRoot(raw) {
|
|
103
|
+
const canonical = canonicalWorkspacePath(raw);
|
|
104
|
+
if (!canonical) return null;
|
|
105
|
+
const startDir = directoryForWorkspaceProbe(canonical);
|
|
106
|
+
const gitRoot = findGitRoot(startDir);
|
|
107
|
+
if (gitRoot) return gitRoot;
|
|
108
|
+
return canonicalWorkspacePath(findMarkerRoot(startDir)) ?? canonical;
|
|
109
|
+
}
|
|
110
|
+
function normalizeComparablePath(pathValue) {
|
|
111
|
+
const resolved = resolve(pathValue);
|
|
112
|
+
return process.platform === "win32" ? resolved.toLowerCase() : resolved;
|
|
113
|
+
}
|
|
114
|
+
function isPathSameOrInsideWorkspace(workspaceRoot, candidatePath) {
|
|
115
|
+
const rel = relative(normalizeComparablePath(workspaceRoot), normalizeComparablePath(candidatePath));
|
|
116
|
+
return rel === "" || !!rel && !rel.startsWith("..") && !isAbsolute(rel);
|
|
117
|
+
}
|
|
118
|
+
function inferProjectNameFromWorkspaceRoot(workspaceRoot) {
|
|
119
|
+
const canonical = canonicalWorkspacePath(workspaceRoot);
|
|
120
|
+
if (!canonical) return null;
|
|
121
|
+
return basename(canonical).trim() || null;
|
|
122
|
+
}
|
|
123
|
+
function isSafeAutoCreateWorkspaceRoot(workspaceRoot) {
|
|
124
|
+
const canonical = canonicalWorkspacePath(workspaceRoot);
|
|
125
|
+
if (!canonical) return false;
|
|
126
|
+
const normalized = normalizeComparablePath(canonical);
|
|
127
|
+
if ([
|
|
128
|
+
homedir(),
|
|
129
|
+
tmpdir(),
|
|
130
|
+
resolveStateDir()
|
|
131
|
+
].map((p) => canonicalWorkspacePath(p)).filter((p) => Boolean(p)).map(normalizeComparablePath).includes(normalized)) return false;
|
|
132
|
+
if (normalizeComparablePath(canonical) === normalizeComparablePath(parse(canonical).root)) return false;
|
|
133
|
+
if (!basename(canonical).trim()) return false;
|
|
134
|
+
try {
|
|
135
|
+
return statSync(canonical).isDirectory();
|
|
136
|
+
} catch {
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
//#endregion
|
|
141
|
+
export { ProjectWorkspaceConflictError, ProjectWorkspaceMissingError, canonicalWorkspacePath, ensureWorkspaceDirectory, inferProjectNameFromWorkspaceRoot, isPathSameOrInsideWorkspace, isSafeAutoCreateWorkspaceRoot, resolveWorkspaceProjectRoot, workspaceDirectoryExists };
|
|
142
|
+
|
|
143
|
+
//# sourceMappingURL=workspace-project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-project.js","names":[],"sources":["../../../src/projects/workspace-project.ts"],"sourcesContent":["import { existsSync, mkdirSync, realpathSync, statSync } from 'node:fs';\nimport { execFileSync } from 'node:child_process';\nimport { homedir, tmpdir } from 'node:os';\nimport { basename, dirname, isAbsolute, join, parse, relative, resolve } from 'node:path';\n\nimport { resolveUserPath } from '../agent/agent-scope.js';\nimport { normalizeWorkspaceDir } from '../config/workspace-path.js';\nimport { resolveStateDir } from '../config/paths-state.js';\nimport type { Project } from './types.js';\n\nexport type WorkspaceProjectMatchReason = 'exact' | 'contained' | 'auto_created';\n\nexport type WorkspaceProjectMatch = {\n project: Project;\n reason: WorkspaceProjectMatchReason;\n created: boolean;\n};\n\nexport class ProjectWorkspaceConflictError extends Error {\n constructor(readonly project: Project, message = `Workspace is already bound to project: ${project.name}`) {\n super(message);\n this.name = 'ProjectWorkspaceConflictError';\n }\n}\n\nexport class ProjectWorkspaceMissingError extends Error {\n constructor(readonly workspaceRoot: string, message = `Workspace root does not exist: ${workspaceRoot}`) {\n super(message);\n this.name = 'ProjectWorkspaceMissingError';\n }\n}\n\nconst PROJECT_ROOT_MARKERS = [\n '.git',\n 'pnpm-workspace.yaml',\n 'package.json',\n 'go.mod',\n 'pyproject.toml',\n 'Cargo.toml',\n 'deno.json',\n 'deno.jsonc',\n 'bun.lockb',\n 'pnpm-lock.yaml',\n 'yarn.lock',\n 'package-lock.json',\n 'composer.json',\n 'Gemfile',\n] as const;\n\nexport function canonicalWorkspacePath(raw: string | null | undefined): string | null {\n const trimmed = raw?.trim();\n if (!trimmed) return null;\n const resolved = resolveUserPath(trimmed);\n const normalized = normalizeWorkspaceDir(resolved);\n if (!normalized) return null;\n try {\n const stat = statSync(normalized);\n if (!stat.isDirectory()) return normalized;\n return realpathSync.native(normalized);\n } catch {\n return normalized;\n }\n}\n\nexport function workspaceDirectoryExists(workspaceRoot: string | null | undefined): boolean {\n const canonical = canonicalWorkspacePath(workspaceRoot);\n if (!canonical) return false;\n try {\n return statSync(canonical).isDirectory();\n } catch {\n return false;\n }\n}\n\nexport function ensureWorkspaceDirectory(workspaceRoot: string): void {\n mkdirSync(workspaceRoot, { recursive: true });\n}\n\nfunction directoryForWorkspaceProbe(pathValue: string): string {\n try {\n return statSync(pathValue).isDirectory() ? pathValue : dirname(pathValue);\n } catch {\n return pathValue;\n }\n}\n\nfunction findGitRoot(startDir: string): string | null {\n try {\n const output = execFileSync('git', ['-C', startDir, 'rev-parse', '--show-toplevel'], {\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore'],\n timeout: 1000,\n }).trim();\n return canonicalWorkspacePath(output);\n } catch {\n return null;\n }\n}\n\nfunction findMarkerRoot(startDir: string): string | null {\n let current = startDir;\n while (true) {\n if (PROJECT_ROOT_MARKERS.some((marker) => existsSync(join(current, marker)))) {\n return current;\n }\n const parent = dirname(current);\n if (parent === current) {\n return null;\n }\n current = parent;\n }\n}\n\nexport function resolveWorkspaceProjectRoot(raw: string | null | undefined): string | null {\n const canonical = canonicalWorkspacePath(raw);\n if (!canonical) return null;\n const startDir = directoryForWorkspaceProbe(canonical);\n const gitRoot = findGitRoot(startDir);\n if (gitRoot) return gitRoot;\n const markerRoot = findMarkerRoot(startDir);\n return canonicalWorkspacePath(markerRoot) ?? canonical;\n}\n\nfunction normalizeComparablePath(pathValue: string): string {\n const resolved = resolve(pathValue);\n return process.platform === 'win32' ? resolved.toLowerCase() : resolved;\n}\n\nexport function isPathSameOrInsideWorkspace(workspaceRoot: string, candidatePath: string): boolean {\n const root = normalizeComparablePath(workspaceRoot);\n const candidate = normalizeComparablePath(candidatePath);\n const rel = relative(root, candidate);\n return rel === '' || (!!rel && !rel.startsWith('..') && !isAbsolute(rel));\n}\n\nexport function inferProjectNameFromWorkspaceRoot(workspaceRoot: string | null | undefined): string | null {\n const canonical = canonicalWorkspacePath(workspaceRoot);\n if (!canonical) return null;\n const name = basename(canonical).trim();\n return name || null;\n}\n\nexport function isSafeAutoCreateWorkspaceRoot(workspaceRoot: string | null | undefined): boolean {\n const canonical = canonicalWorkspacePath(workspaceRoot);\n if (!canonical) return false;\n const normalized = normalizeComparablePath(canonical);\n const forbidden = [homedir(), tmpdir(), resolveStateDir()]\n .map((p) => canonicalWorkspacePath(p))\n .filter((p): p is string => Boolean(p))\n .map(normalizeComparablePath);\n if (forbidden.includes(normalized)) return false;\n // `normalizeWorkspaceDir` already rejects filesystem roots; keep this function\n // conservative for callers that pass unusual platform-specific roots.\n if (normalizeComparablePath(canonical) === normalizeComparablePath(parse(canonical).root)) return false;\n if (!basename(canonical).trim()) return false;\n try {\n return statSync(canonical).isDirectory();\n } catch {\n return false;\n }\n}\n"],"mappings":";;;;;;;;kBAK0D;qBACU;kBACT;AAW3D,IAAa,gCAAb,cAAmD,MAAM;CACvD,YAAY,SAA2B,UAAU,0CAA0C,QAAQ,QAAQ;AACzG,QAAM,QAAQ;AADK,OAAA,UAAA;AAEnB,OAAK,OAAO;;;AAIhB,IAAa,+BAAb,cAAkD,MAAM;CACtD,YAAY,eAAgC,UAAU,kCAAkC,iBAAiB;AACvG,QAAM,QAAQ;AADK,OAAA,gBAAA;AAEnB,OAAK,OAAO;;;AAIhB,MAAM,uBAAuB;CAC3B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,SAAgB,uBAAuB,KAA+C;CACpF,MAAM,UAAU,KAAK,MAAM;AAC3B,KAAI,CAAC,QAAS,QAAO;CAErB,MAAM,aAAa,sBADF,gBAAgB,QACgB,CAAC;AAClD,KAAI,CAAC,WAAY,QAAO;AACxB,KAAI;AAEF,MAAI,CADS,SAAS,WACb,CAAC,aAAa,CAAE,QAAO;AAChC,SAAO,aAAa,OAAO,WAAW;SAChC;AACN,SAAO;;;AAIX,SAAgB,yBAAyB,eAAmD;CAC1F,MAAM,YAAY,uBAAuB,cAAc;AACvD,KAAI,CAAC,UAAW,QAAO;AACvB,KAAI;AACF,SAAO,SAAS,UAAU,CAAC,aAAa;SAClC;AACN,SAAO;;;AAIX,SAAgB,yBAAyB,eAA6B;AACpE,WAAU,eAAe,EAAE,WAAW,MAAM,CAAC;;AAG/C,SAAS,2BAA2B,WAA2B;AAC7D,KAAI;AACF,SAAO,SAAS,UAAU,CAAC,aAAa,GAAG,YAAY,QAAQ,UAAU;SACnE;AACN,SAAO;;;AAIX,SAAS,YAAY,UAAiC;AACpD,KAAI;AAMF,SAAO,uBALQ,aAAa,OAAO;GAAC;GAAM;GAAU;GAAa;GAAkB,EAAE;GACnF,UAAU;GACV,OAAO;IAAC;IAAU;IAAQ;IAAS;GACnC,SAAS;GACV,CAAC,CAAC,MACiC,CAAC;SAC/B;AACN,SAAO;;;AAIX,SAAS,eAAe,UAAiC;CACvD,IAAI,UAAU;AACd,QAAO,MAAM;AACX,MAAI,qBAAqB,MAAM,WAAW,WAAW,KAAK,SAAS,OAAO,CAAC,CAAC,CAC1E,QAAO;EAET,MAAM,SAAS,QAAQ,QAAQ;AAC/B,MAAI,WAAW,QACb,QAAO;AAET,YAAU;;;AAId,SAAgB,4BAA4B,KAA+C;CACzF,MAAM,YAAY,uBAAuB,IAAI;AAC7C,KAAI,CAAC,UAAW,QAAO;CACvB,MAAM,WAAW,2BAA2B,UAAU;CACtD,MAAM,UAAU,YAAY,SAAS;AACrC,KAAI,QAAS,QAAO;AAEpB,QAAO,uBADY,eAAe,SACM,CAAC,IAAI;;AAG/C,SAAS,wBAAwB,WAA2B;CAC1D,MAAM,WAAW,QAAQ,UAAU;AACnC,QAAO,QAAQ,aAAa,UAAU,SAAS,aAAa,GAAG;;AAGjE,SAAgB,4BAA4B,eAAuB,eAAgC;CAGjG,MAAM,MAAM,SAFC,wBAAwB,cAEZ,EADP,wBAAwB,cACN,CAAC;AACrC,QAAO,QAAQ,MAAO,CAAC,CAAC,OAAO,CAAC,IAAI,WAAW,KAAK,IAAI,CAAC,WAAW,IAAI;;AAG1E,SAAgB,kCAAkC,eAAyD;CACzG,MAAM,YAAY,uBAAuB,cAAc;AACvD,KAAI,CAAC,UAAW,QAAO;AAEvB,QADa,SAAS,UAAU,CAAC,MACtB,IAAI;;AAGjB,SAAgB,8BAA8B,eAAmD;CAC/F,MAAM,YAAY,uBAAuB,cAAc;AACvD,KAAI,CAAC,UAAW,QAAO;CACvB,MAAM,aAAa,wBAAwB,UAAU;AAKrD,KAJkB;EAAC,SAAS;EAAE,QAAQ;EAAE,iBAAiB;EAAC,CACvD,KAAK,MAAM,uBAAuB,EAAE,CAAC,CACrC,QAAQ,MAAmB,QAAQ,EAAE,CAAC,CACtC,IAAI,wBACM,CAAC,SAAS,WAAW,CAAE,QAAO;AAG3C,KAAI,wBAAwB,UAAU,KAAK,wBAAwB,MAAM,UAAU,CAAC,KAAK,CAAE,QAAO;AAClG,KAAI,CAAC,SAAS,UAAU,CAAC,MAAM,CAAE,QAAO;AACxC,KAAI;AACF,SAAO,SAAS,UAAU,CAAC,aAAa;SAClC;AACN,SAAO"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Config } from '../config/schema.js';
|
|
2
|
+
import type { Project } from './types.js';
|
|
3
|
+
export declare function resolveProjectWorkspacePath(config: Config, sessionKey: string, project: Project | null): string;
|
|
4
|
+
export declare function getProjectForSession(sessionKey: string): Project | null;
|
|
5
|
+
export declare function getProjectWorkspacePathForSession(sessionKey: string): string | null;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { resolveEffectiveAgentProfileForSession } from "../config/agent-profile.js";
|
|
2
|
+
import { isXopcDatabaseOpen } from "../storage/sqlite/connection.js";
|
|
3
|
+
import { getSessionMetadata } from "../storage/sqlite/session-repository.js";
|
|
4
|
+
import "../storage/sqlite/index.js";
|
|
5
|
+
import { projectWorkspacePath } from "../session/session-workspace.js";
|
|
6
|
+
import { ProjectStore } from "./project-store.js";
|
|
7
|
+
//#region src/projects/workspace.ts
|
|
8
|
+
function resolveProjectWorkspacePath(config, sessionKey, project) {
|
|
9
|
+
const projectWorkspace = projectWorkspacePath(project);
|
|
10
|
+
if (projectWorkspace) return projectWorkspace;
|
|
11
|
+
return resolveEffectiveAgentProfileForSession(config, sessionKey).resolvedWorkspacePath;
|
|
12
|
+
}
|
|
13
|
+
function getProjectForSession(sessionKey) {
|
|
14
|
+
if (!isXopcDatabaseOpen()) return null;
|
|
15
|
+
const projectId = getSessionMetadata(sessionKey)?.projectId;
|
|
16
|
+
if (!projectId) return null;
|
|
17
|
+
return new ProjectStore().get(projectId);
|
|
18
|
+
}
|
|
19
|
+
function getProjectWorkspacePathForSession(sessionKey) {
|
|
20
|
+
return projectWorkspacePath(getProjectForSession(sessionKey));
|
|
21
|
+
}
|
|
22
|
+
//#endregion
|
|
23
|
+
export { getProjectForSession, getProjectWorkspacePathForSession, resolveProjectWorkspacePath };
|
|
24
|
+
|
|
25
|
+
//# sourceMappingURL=workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.js","names":[],"sources":["../../../src/projects/workspace.ts"],"sourcesContent":["import { resolveEffectiveAgentProfileForSession } from '../config/agent-profile.js';\nimport type { Config } from '../config/schema.js';\nimport {\n getSessionMetadata,\n isXopcDatabaseOpen,\n} from '../storage/sqlite/index.js';\nimport { projectWorkspacePath } from '../session/session-workspace.js';\nimport { ProjectStore } from './project-store.js';\nimport type { Project } from './types.js';\n\nexport function resolveProjectWorkspacePath(\n config: Config,\n sessionKey: string,\n project: Project | null,\n): string {\n const projectWorkspace = projectWorkspacePath(project);\n if (projectWorkspace) {\n return projectWorkspace;\n }\n return resolveEffectiveAgentProfileForSession(config, sessionKey).resolvedWorkspacePath;\n}\n\nexport function getProjectForSession(sessionKey: string): Project | null {\n if (!isXopcDatabaseOpen()) {\n return null;\n }\n const projectId = getSessionMetadata(sessionKey)?.projectId;\n if (!projectId) {\n return null;\n }\n return new ProjectStore().get(projectId);\n}\n\nexport function getProjectWorkspacePathForSession(sessionKey: string): string | null {\n return projectWorkspacePath(getProjectForSession(sessionKey));\n}\n"],"mappings":";;;;;;;AAUA,SAAgB,4BACd,QACA,YACA,SACQ;CACR,MAAM,mBAAmB,qBAAqB,QAAQ;AACtD,KAAI,iBACF,QAAO;AAET,QAAO,uCAAuC,QAAQ,WAAW,CAAC;;AAGpE,SAAgB,qBAAqB,YAAoC;AACvE,KAAI,CAAC,oBAAoB,CACvB,QAAO;CAET,MAAM,YAAY,mBAAmB,WAAW,EAAE;AAClD,KAAI,CAAC,UACH,QAAO;AAET,QAAO,IAAI,cAAc,CAAC,IAAI,UAAU;;AAG1C,SAAgB,kCAAkC,YAAmC;AACnF,QAAO,qBAAqB,qBAAqB,WAAW,CAAC"}
|
|
@@ -5,7 +5,7 @@ export type { SessionStoreOptions } from './store.js';
|
|
|
5
5
|
export { SessionConfigStore, resolveThinkingLevel, resolveReasoningLevel, resolveVerboseLevel } from './config-store.js';
|
|
6
6
|
export { resolveEffectiveThinkingLevel, resolveEffectiveReasoningLevel } from './thinking-resolve.js';
|
|
7
7
|
export type { SessionAgentConfig } from './config-types.js';
|
|
8
|
-
export { normalizeWorkingDirectoryInput, effectiveWorkspacePathForSession, } from './session-workspace.js';
|
|
8
|
+
export { normalizeWorkingDirectoryInput, effectiveWorkspacePathForSession, projectWorkspacePath, } from './session-workspace.js';
|
|
9
9
|
export { SessionStatus, type SessionMetadata, type SessionDetail, type SessionListQuery, type PaginatedResult, type SessionStats, type ExportFormat, type SessionExport, type SessionTranscriptSummary, type CompactionCheckpointSummary, type CompactionCheckpointDetail, } from './types.js';
|
|
10
10
|
export { normalizeCompactionCheckpointId } from './compaction-checkpoints.js';
|
|
11
11
|
export { shouldSkipWebchatInboundByAbortCutoff } from './abort-cutoff.js';
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { emitSessionTranscriptUpdate, onSessionTranscriptUpdate } from "./transcript-events.js";
|
|
2
1
|
import { SessionStatus } from "./types.js";
|
|
3
2
|
import { buildSessionContextForLlm, isTranscriptContextEntry, mergeLlmMessagesPreservingContextRows, transcriptRowsFromJsonArray } from "./session-context-for-llm.js";
|
|
3
|
+
import { effectiveWorkspacePathForSession, normalizeWorkingDirectoryInput, projectWorkspacePath } from "./session-workspace.js";
|
|
4
|
+
import { emitSessionTranscriptUpdate, onSessionTranscriptUpdate } from "./transcript-events.js";
|
|
4
5
|
import { fallbackTitleFromMessages, generateSessionTitleFromMessages, getSessionTitleSource, isWebchatSessionKey, maybeRefineSessionTitleWithLlm, maybeSetProvisionalSessionTitle, provisionalTitleFromUserText, sanitizeSessionTitle, shouldAutoTitleSessionKey, shouldRefineSessionTitleWithLlm } from "./session-title.js";
|
|
5
6
|
import { normalizeCompactionCheckpointId } from "./compaction-checkpoints.js";
|
|
6
7
|
import { SessionStore } from "./store.js";
|
|
@@ -8,7 +9,6 @@ import { applySessionPatchToMetadata } from "./patch-metadata.js";
|
|
|
8
9
|
import { SessionIndex } from "./manager.js";
|
|
9
10
|
import { SessionConfigStore, resolveReasoningLevel, resolveThinkingLevel, resolveVerboseLevel } from "./config-store.js";
|
|
10
11
|
import { resolveEffectiveReasoningLevel, resolveEffectiveThinkingLevel } from "./thinking-resolve.js";
|
|
11
|
-
import { effectiveWorkspacePathForSession, normalizeWorkingDirectoryInput } from "./session-workspace.js";
|
|
12
12
|
import { shouldSkipWebchatInboundByAbortCutoff } from "./abort-cutoff.js";
|
|
13
13
|
import { DEFAULT_IDLE_MINUTES, DEFAULT_RESET_AT_HOUR, DEFAULT_RESET_MODE, evaluateSessionFreshness, resolveDailyResetAtMs, resolveSessionResetPolicy } from "./reset-policy.js";
|
|
14
14
|
import { resolveChannelResetConfig, resolveSessionResetType } from "./reset-type.js";
|
|
@@ -18,4 +18,4 @@ import { DEFAULT_RESET_TRIGGERS, RESET_OVERLAP_COMMANDS, bareResetAckMessage, ma
|
|
|
18
18
|
import { initSessionTurn } from "./init-session-turn.js";
|
|
19
19
|
import { flattenMessageContent, messagesToClientHistory } from "./client-history.js";
|
|
20
20
|
import { CURRENT_SESSION_TRANSCRIPT_VERSION, XOPC_SESSION_TRANSCRIPT_TYPE } from "./transcript-format.js";
|
|
21
|
-
export { CURRENT_SESSION_TRANSCRIPT_VERSION, DEFAULT_IDLE_MINUTES, DEFAULT_RESET_AT_HOUR, DEFAULT_RESET_MODE, DEFAULT_RESET_TRIGGERS, RESET_OVERLAP_COMMANDS, SessionConfigStore, SessionIndex, SessionStatus, SessionStore, XOPC_SESSION_TRANSCRIPT_TYPE, applySessionPatchToMetadata, bareResetAckMessage, buildSessionContextForLlm, effectiveWorkspacePathForSession, emitSessionTranscriptUpdate, evaluateSessionFreshness, fallbackTitleFromMessages, flattenMessageContent, generateSessionTitleFromMessages, getSessionTitleSource, initSessionTurn, isTranscriptContextEntry, isWebchatSessionKey, matchResetTriggers, maybeRefineSessionTitleWithLlm, maybeSetProvisionalSessionTitle, mergeLlmMessagesPreservingContextRows, messagesToClientHistory, normalizeCompactionCheckpointId, normalizeWorkingDirectoryInput, onSessionTranscriptUpdate, provisionalTitleFromUserText, resolveChannelResetConfig, resolveDailyResetAtMs, resolveEffectiveReasoningLevel, resolveEffectiveThinkingLevel, resolveReasoningLevel, resolveResetTriggers, resolveSession, resolveSessionKeyForRequest, resolveSessionLifecycleTimestamps, resolveSessionResetPolicy, resolveSessionResetType, resolveThinkingLevel, resolveVerboseLevel, sanitizeSessionTitle, shouldAutoTitleSessionKey, shouldRefineSessionTitleWithLlm, shouldSkipResetOverlapCommand, shouldSkipWebchatInboundByAbortCutoff, stripLeadingEnvelopeTimestamp, transcriptRowsFromJsonArray };
|
|
21
|
+
export { CURRENT_SESSION_TRANSCRIPT_VERSION, DEFAULT_IDLE_MINUTES, DEFAULT_RESET_AT_HOUR, DEFAULT_RESET_MODE, DEFAULT_RESET_TRIGGERS, RESET_OVERLAP_COMMANDS, SessionConfigStore, SessionIndex, SessionStatus, SessionStore, XOPC_SESSION_TRANSCRIPT_TYPE, applySessionPatchToMetadata, bareResetAckMessage, buildSessionContextForLlm, effectiveWorkspacePathForSession, emitSessionTranscriptUpdate, evaluateSessionFreshness, fallbackTitleFromMessages, flattenMessageContent, generateSessionTitleFromMessages, getSessionTitleSource, initSessionTurn, isTranscriptContextEntry, isWebchatSessionKey, matchResetTriggers, maybeRefineSessionTitleWithLlm, maybeSetProvisionalSessionTitle, mergeLlmMessagesPreservingContextRows, messagesToClientHistory, normalizeCompactionCheckpointId, normalizeWorkingDirectoryInput, onSessionTranscriptUpdate, projectWorkspacePath, provisionalTitleFromUserText, resolveChannelResetConfig, resolveDailyResetAtMs, resolveEffectiveReasoningLevel, resolveEffectiveThinkingLevel, resolveReasoningLevel, resolveResetTriggers, resolveSession, resolveSessionKeyForRequest, resolveSessionLifecycleTimestamps, resolveSessionResetPolicy, resolveSessionResetType, resolveThinkingLevel, resolveVerboseLevel, sanitizeSessionTitle, shouldAutoTitleSessionKey, shouldRefineSessionTitleWithLlm, shouldSkipResetOverlapCommand, shouldSkipWebchatInboundByAbortCutoff, stripLeadingEnvelopeTimestamp, transcriptRowsFromJsonArray };
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* Per-session markdown workspace override (stored in SessionAgentConfig).
|
|
3
3
|
*/
|
|
4
4
|
import type { Config } from '../config/schema.js';
|
|
5
|
+
import type { Project } from '../projects/types.js';
|
|
5
6
|
import type { SessionAgentConfig } from './config-types.js';
|
|
6
7
|
/**
|
|
7
8
|
* Normalize user input for `workingDirectoryOverride`. Rejects empty and filesystem roots.
|
|
@@ -13,7 +14,8 @@ export declare function normalizeWorkingDirectoryInput(raw: string): {
|
|
|
13
14
|
ok: false;
|
|
14
15
|
error: string;
|
|
15
16
|
};
|
|
17
|
+
export declare function projectWorkspacePath(project: Pick<Project, 'workspaceRoot'> | null | undefined): string | null;
|
|
16
18
|
/**
|
|
17
|
-
* Resolved markdown workspace for tools/shell: session override or merged agent profile default.
|
|
19
|
+
* Resolved markdown workspace for tools/shell: project workspace, session override, or merged agent profile default.
|
|
18
20
|
*/
|
|
19
|
-
export declare function effectiveWorkspacePathForSession(cfg: Config, sessionKey: string, sessionAgentConfig: SessionAgentConfig | null | undefined): string;
|
|
21
|
+
export declare function effectiveWorkspacePathForSession(cfg: Config, sessionKey: string, sessionAgentConfig: SessionAgentConfig | null | undefined, project?: Pick<Project, 'workspaceRoot'> | null): string;
|
|
@@ -23,16 +23,23 @@ function normalizeWorkingDirectoryInput(raw) {
|
|
|
23
23
|
path: normalized
|
|
24
24
|
};
|
|
25
25
|
}
|
|
26
|
+
function projectWorkspacePath(project) {
|
|
27
|
+
const raw = project?.workspaceRoot?.trim();
|
|
28
|
+
if (!raw) return null;
|
|
29
|
+
return normalizeWorkspaceDir(resolveUserPath(raw));
|
|
30
|
+
}
|
|
26
31
|
/**
|
|
27
|
-
* Resolved markdown workspace for tools/shell: session override or merged agent profile default.
|
|
32
|
+
* Resolved markdown workspace for tools/shell: project workspace, session override, or merged agent profile default.
|
|
28
33
|
*/
|
|
29
|
-
function effectiveWorkspacePathForSession(cfg, sessionKey, sessionAgentConfig) {
|
|
34
|
+
function effectiveWorkspacePathForSession(cfg, sessionKey, sessionAgentConfig, project) {
|
|
30
35
|
const base = resolveEffectiveAgentProfileForSession(cfg, sessionKey).resolvedWorkspacePath;
|
|
36
|
+
const projectWorkspace = projectWorkspacePath(project);
|
|
37
|
+
if (projectWorkspace) return projectWorkspace;
|
|
31
38
|
const o = sessionAgentConfig?.workingDirectoryOverride?.trim();
|
|
32
39
|
if (!o) return base;
|
|
33
40
|
return normalizeWorkspaceDir(resolveUserPath(o)) ?? base;
|
|
34
41
|
}
|
|
35
42
|
//#endregion
|
|
36
|
-
export { effectiveWorkspacePathForSession, normalizeWorkingDirectoryInput };
|
|
43
|
+
export { effectiveWorkspacePathForSession, normalizeWorkingDirectoryInput, projectWorkspacePath };
|
|
37
44
|
|
|
38
45
|
//# sourceMappingURL=session-workspace.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-workspace.js","names":[],"sources":["../../../src/session/session-workspace.ts"],"sourcesContent":["/**\n * Per-session markdown workspace override (stored in SessionAgentConfig).\n */\n\nimport type { Config } from '../config/schema.js';\nimport { resolveEffectiveAgentProfileForSession } from '../config/agent-profile.js';\nimport { resolveUserPath } from '../agent/agent-scope.js';\nimport { normalizeWorkspaceDir } from '../config/workspace-path.js';\nimport type { SessionAgentConfig } from './config-types.js';\n\n/**\n * Normalize user input for `workingDirectoryOverride`. Rejects empty and filesystem roots.\n */\nexport function normalizeWorkingDirectoryInput(raw: string): { ok: true; path: string } | { ok: false; error: string } {\n const trimmed = raw.trim();\n if (!trimmed) {\n return { ok: false, error: 'working directory is empty' };\n }\n const resolved = resolveUserPath(trimmed);\n const normalized = normalizeWorkspaceDir(resolved);\n if (!normalized) {\n return { ok: false, error: 'invalid working directory path' };\n }\n return { ok: true, path: normalized };\n}\n\n/**\n * Resolved markdown workspace for tools/shell: session override or merged agent profile default.\n */\nexport function effectiveWorkspacePathForSession(\n cfg: Config,\n sessionKey: string,\n sessionAgentConfig: SessionAgentConfig | null | undefined,\n): string {\n const base = resolveEffectiveAgentProfileForSession(cfg, sessionKey).resolvedWorkspacePath;\n const o = sessionAgentConfig?.workingDirectoryOverride?.trim();\n if (!o) {\n return base;\n }\n const resolved = resolveUserPath(o);\n const normalized = normalizeWorkspaceDir(resolved);\n return normalized ?? base;\n}\n"],"mappings":";;;;kBAM0D;qBACU;;;;
|
|
1
|
+
{"version":3,"file":"session-workspace.js","names":[],"sources":["../../../src/session/session-workspace.ts"],"sourcesContent":["/**\n * Per-session markdown workspace override (stored in SessionAgentConfig).\n */\n\nimport type { Config } from '../config/schema.js';\nimport { resolveEffectiveAgentProfileForSession } from '../config/agent-profile.js';\nimport { resolveUserPath } from '../agent/agent-scope.js';\nimport { normalizeWorkspaceDir } from '../config/workspace-path.js';\nimport type { Project } from '../projects/types.js';\nimport type { SessionAgentConfig } from './config-types.js';\n\n/**\n * Normalize user input for `workingDirectoryOverride`. Rejects empty and filesystem roots.\n */\nexport function normalizeWorkingDirectoryInput(raw: string): { ok: true; path: string } | { ok: false; error: string } {\n const trimmed = raw.trim();\n if (!trimmed) {\n return { ok: false, error: 'working directory is empty' };\n }\n const resolved = resolveUserPath(trimmed);\n const normalized = normalizeWorkspaceDir(resolved);\n if (!normalized) {\n return { ok: false, error: 'invalid working directory path' };\n }\n return { ok: true, path: normalized };\n}\n\nexport function projectWorkspacePath(\n project: Pick<Project, 'workspaceRoot'> | null | undefined,\n): string | null {\n const raw = project?.workspaceRoot?.trim();\n if (!raw) return null;\n const resolved = resolveUserPath(raw);\n return normalizeWorkspaceDir(resolved);\n}\n\n/**\n * Resolved markdown workspace for tools/shell: project workspace, session override, or merged agent profile default.\n */\nexport function effectiveWorkspacePathForSession(\n cfg: Config,\n sessionKey: string,\n sessionAgentConfig: SessionAgentConfig | null | undefined,\n project?: Pick<Project, 'workspaceRoot'> | null,\n): string {\n const base = resolveEffectiveAgentProfileForSession(cfg, sessionKey).resolvedWorkspacePath;\n const projectWorkspace = projectWorkspacePath(project);\n if (projectWorkspace) {\n return projectWorkspace;\n }\n const o = sessionAgentConfig?.workingDirectoryOverride?.trim();\n if (!o) {\n return base;\n }\n const resolved = resolveUserPath(o);\n const normalized = normalizeWorkspaceDir(resolved);\n return normalized ?? base;\n}\n"],"mappings":";;;;kBAM0D;qBACU;;;;AAOpE,SAAgB,+BAA+B,KAAwE;CACrH,MAAM,UAAU,IAAI,MAAM;AAC1B,KAAI,CAAC,QACH,QAAO;EAAE,IAAI;EAAO,OAAO;EAA8B;CAG3D,MAAM,aAAa,sBADF,gBAAgB,QACgB,CAAC;AAClD,KAAI,CAAC,WACH,QAAO;EAAE,IAAI;EAAO,OAAO;EAAkC;AAE/D,QAAO;EAAE,IAAI;EAAM,MAAM;EAAY;;AAGvC,SAAgB,qBACd,SACe;CACf,MAAM,MAAM,SAAS,eAAe,MAAM;AAC1C,KAAI,CAAC,IAAK,QAAO;AAEjB,QAAO,sBADU,gBAAgB,IACI,CAAC;;;;;AAMxC,SAAgB,iCACd,KACA,YACA,oBACA,SACQ;CACR,MAAM,OAAO,uCAAuC,KAAK,WAAW,CAAC;CACrE,MAAM,mBAAmB,qBAAqB,QAAQ;AACtD,KAAI,iBACF,QAAO;CAET,MAAM,IAAI,oBAAoB,0BAA0B,MAAM;AAC9D,KAAI,CAAC,EACH,QAAO;AAIT,QADmB,sBADF,gBAAgB,EACgB,CAChC,IAAI"}
|
|
@@ -93,6 +93,8 @@ export interface SessionMetadata {
|
|
|
93
93
|
sourceChannel: string;
|
|
94
94
|
sourceChatId: string;
|
|
95
95
|
customData?: Record<string, unknown>;
|
|
96
|
+
/** Optional project grouping for sessions, goals, workflows, and related context. */
|
|
97
|
+
projectId?: string;
|
|
96
98
|
/** Routing metadata */
|
|
97
99
|
routing?: SessionRoutingMeta;
|
|
98
100
|
/** Session statistics */
|
|
@@ -147,6 +149,7 @@ export interface SessionListQuery {
|
|
|
147
149
|
search?: string;
|
|
148
150
|
sessionTypes?: SessionType[];
|
|
149
151
|
includeHidden?: boolean;
|
|
152
|
+
projectId?: string;
|
|
150
153
|
sortBy?: 'updatedAt' | 'createdAt' | 'messageCount' | 'lastAccessedAt';
|
|
151
154
|
sortOrder?: 'asc' | 'desc';
|
|
152
155
|
limit?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","names":[],"sources":["../../../src/session/types.ts"],"sourcesContent":["// Session management types\n\nimport type { TranscriptStoredRow } from './session-context-for-llm.js';\n\nexport interface Message {\n role: 'system' | 'user' | 'assistant' | 'tool' | 'toolResult';\n /** Plain string or structured content blocks (tool calls, multimodal). */\n content: string | unknown[];\n timestamp?: string;\n tool_call_id?: string;\n tool_calls?: Array<{\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n }>;\n tool_call_id$?: string;\n toolName?: string;\n isError?: boolean;\n name?: string;\n /** Token usage from the LLM response (assistant messages only). */\n usage?: {\n inputTokens?: number;\n outputTokens?: number;\n cacheReadTokens?: number;\n cacheWriteTokens?: number;\n totalTokens?: number;\n };\n /** Inbound attachment metadata (no base64). */\n media?: Array<{\n id: string;\n bucket: string;\n type: string;\n mimeType: string;\n name: string;\n size: number;\n uri: string;\n path: string;\n }>;\n}\n\n/** Session status enum */\nexport enum SessionStatus {\n ACTIVE = 'active',\n IDLE = 'idle',\n ARCHIVED = 'archived',\n PINNED = 'pinned',\n}\n\n/** Session routing metadata */\nexport interface SessionRoutingMeta {\n agentId: string;\n source: string;\n accountId: string;\n peerKind: string;\n peerId: string;\n threadId?: string;\n scopeId?: string;\n mainSessionKey?: string;\n lastRoutePolicy?: 'main' | 'session';\n}\n\n/** Session-level statistics (per session) */\nexport interface SessionStats {\n messageCount: number;\n tokenCount: number;\n turnCount?: number;\n lastTurnAt?: number;\n}\n\n/** Global session statistics (aggregate) */\nexport interface GlobalSessionStats {\n totalSessions: number;\n activeSessions: number;\n archivedSessions: number;\n pinnedSessions: number;\n totalMessages: number;\n totalTokens: number;\n oldestSession?: string;\n newestSession?: string;\n byChannel: Record<string, number>;\n}\n\nexport type SessionType = 'chat' | 'workflow-run' | 'workflow-subagent' | 'cron' | 'heartbeat';\n\n/** Session metadata (stored in index) */\nexport interface SessionMetadata {\n key: string;\n name?: string;\n status: SessionStatus;\n tags: string[];\n createdAt: string;\n updatedAt: string;\n lastAccessedAt: string;\n messageCount: number;\n estimatedTokens: number;\n compactedCount: number;\n lastFlushedAt?: string;\n flushCount?: number;\n sourceChannel: string;\n sourceChatId: string;\n customData?: Record<string, unknown>;\n /** Routing metadata */\n routing?: SessionRoutingMeta;\n /** Session statistics */\n stats?: SessionStats;\n /**\n * High-level origin for filtering/UI (e.g. `cron`, `heartbeat`, `webchat`).\n * Distinct from `sourceChannel` (routing namespace).\n */\n sessionType: SessionType;\n hiddenFromSessionList?: boolean;\n parentSessionKey?: string;\n workflowRunId?: string;\n workflowDefinitionId?: string;\n workflowAgentId?: string;\n workflowAgentLabel?: string;\n /** Active OpenClaw-style session instance id. Rotates on reset while `key` stays stable. */\n sessionId?: string;\n /** Workspace/cwd recorded for the active transcript. */\n cwd?: string;\n /** First activity time for this session row (ISO), from transcript header when available. */\n sessionStartedAt?: string;\n /** Last transcript write / interaction (ISO), updated on each persist. */\n lastInteractionAt?: string;\n /**\n * Epoch ms when the last webchat run was aborted (`POST /api/agent/abort`).\n * Used with `clientCreatedAtMs` on the next POST /api/agent to drop stale queued sends.\n */\n abortCutoffTimestamp?: number;\n}\n\n/** Summary of wrapped transcript (no duplicate message bodies). */\nexport interface SessionTranscriptSummary {\n id: string;\n version: number;\n createdAt: string;\n updatedAt: string;\n compactionCount: number;\n}\n\n/** Session detail (metadata + messages) */\nexport interface SessionDetail extends SessionMetadata {\n messages: Message[];\n /** Present when loaded with `includeTranscriptSummary` (gateway `?include=transcript`). */\n transcriptSummary?: SessionTranscriptSummary;\n /** Present when loaded with `include=transcriptRows` (full on-disk rows, LLM + `kind: 'context'`). */\n transcriptRows?: TranscriptStoredRow[];\n}\n\n/** Session list query parameters */\nexport interface SessionListQuery {\n status?: SessionStatus | SessionStatus[];\n /** Single `sourceChannel`, or comma-separated list (e.g. `telegram,weixin`). */\n channel?: string;\n tags?: string[];\n search?: string;\n sessionTypes?: SessionType[];\n includeHidden?: boolean;\n sortBy?: 'updatedAt' | 'createdAt' | 'messageCount' | 'lastAccessedAt';\n sortOrder?: 'asc' | 'desc';\n limit?: number;\n offset?: number;\n}\n\n/** Paginated result */\nexport interface PaginatedResult<T> {\n items: T[];\n total: number;\n limit: number;\n offset: number;\n hasMore: boolean;\n}\n\n/** Export format */\nexport type ExportFormat = 'json' | 'markdown';\n\n/** Session export data */\nexport interface SessionExport {\n version: string;\n exportedAt: string;\n metadata: SessionMetadata;\n messages: Message[];\n /** Full on-disk rows (LLM + `kind: 'context'`) for audit / round-trip. */\n transcriptRows: TranscriptStoredRow[];\n}\n\n/** On-disk pre-compaction snapshot (OpenClaw-style checkpoint list). */\nexport interface CompactionCheckpointSummary {\n id: string;\n sizeBytes: number;\n modifiedAt: string;\n}\n\nexport interface CompactionCheckpointDetail extends CompactionCheckpointSummary {\n messageCount: number;\n}\n"],"mappings":";;AA4CA,IAAY,gBAAL,yBAAA,eAAA;AACL,eAAA,YAAA;AACA,eAAA,UAAA;AACA,eAAA,cAAA;AACA,eAAA,YAAA;;KACD"}
|
|
1
|
+
{"version":3,"file":"types.js","names":[],"sources":["../../../src/session/types.ts"],"sourcesContent":["// Session management types\n\nimport type { TranscriptStoredRow } from './session-context-for-llm.js';\n\nexport interface Message {\n role: 'system' | 'user' | 'assistant' | 'tool' | 'toolResult';\n /** Plain string or structured content blocks (tool calls, multimodal). */\n content: string | unknown[];\n timestamp?: string;\n tool_call_id?: string;\n tool_calls?: Array<{\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n }>;\n tool_call_id$?: string;\n toolName?: string;\n isError?: boolean;\n name?: string;\n /** Token usage from the LLM response (assistant messages only). */\n usage?: {\n inputTokens?: number;\n outputTokens?: number;\n cacheReadTokens?: number;\n cacheWriteTokens?: number;\n totalTokens?: number;\n };\n /** Inbound attachment metadata (no base64). */\n media?: Array<{\n id: string;\n bucket: string;\n type: string;\n mimeType: string;\n name: string;\n size: number;\n uri: string;\n path: string;\n }>;\n}\n\n/** Session status enum */\nexport enum SessionStatus {\n ACTIVE = 'active',\n IDLE = 'idle',\n ARCHIVED = 'archived',\n PINNED = 'pinned',\n}\n\n/** Session routing metadata */\nexport interface SessionRoutingMeta {\n agentId: string;\n source: string;\n accountId: string;\n peerKind: string;\n peerId: string;\n threadId?: string;\n scopeId?: string;\n mainSessionKey?: string;\n lastRoutePolicy?: 'main' | 'session';\n}\n\n/** Session-level statistics (per session) */\nexport interface SessionStats {\n messageCount: number;\n tokenCount: number;\n turnCount?: number;\n lastTurnAt?: number;\n}\n\n/** Global session statistics (aggregate) */\nexport interface GlobalSessionStats {\n totalSessions: number;\n activeSessions: number;\n archivedSessions: number;\n pinnedSessions: number;\n totalMessages: number;\n totalTokens: number;\n oldestSession?: string;\n newestSession?: string;\n byChannel: Record<string, number>;\n}\n\nexport type SessionType = 'chat' | 'workflow-run' | 'workflow-subagent' | 'cron' | 'heartbeat';\n\n/** Session metadata (stored in index) */\nexport interface SessionMetadata {\n key: string;\n name?: string;\n status: SessionStatus;\n tags: string[];\n createdAt: string;\n updatedAt: string;\n lastAccessedAt: string;\n messageCount: number;\n estimatedTokens: number;\n compactedCount: number;\n lastFlushedAt?: string;\n flushCount?: number;\n sourceChannel: string;\n sourceChatId: string;\n customData?: Record<string, unknown>;\n /** Optional project grouping for sessions, goals, workflows, and related context. */\n projectId?: string;\n /** Routing metadata */\n routing?: SessionRoutingMeta;\n /** Session statistics */\n stats?: SessionStats;\n /**\n * High-level origin for filtering/UI (e.g. `cron`, `heartbeat`, `webchat`).\n * Distinct from `sourceChannel` (routing namespace).\n */\n sessionType: SessionType;\n hiddenFromSessionList?: boolean;\n parentSessionKey?: string;\n workflowRunId?: string;\n workflowDefinitionId?: string;\n workflowAgentId?: string;\n workflowAgentLabel?: string;\n /** Active OpenClaw-style session instance id. Rotates on reset while `key` stays stable. */\n sessionId?: string;\n /** Workspace/cwd recorded for the active transcript. */\n cwd?: string;\n /** First activity time for this session row (ISO), from transcript header when available. */\n sessionStartedAt?: string;\n /** Last transcript write / interaction (ISO), updated on each persist. */\n lastInteractionAt?: string;\n /**\n * Epoch ms when the last webchat run was aborted (`POST /api/agent/abort`).\n * Used with `clientCreatedAtMs` on the next POST /api/agent to drop stale queued sends.\n */\n abortCutoffTimestamp?: number;\n}\n\n/** Summary of wrapped transcript (no duplicate message bodies). */\nexport interface SessionTranscriptSummary {\n id: string;\n version: number;\n createdAt: string;\n updatedAt: string;\n compactionCount: number;\n}\n\n/** Session detail (metadata + messages) */\nexport interface SessionDetail extends SessionMetadata {\n messages: Message[];\n /** Present when loaded with `includeTranscriptSummary` (gateway `?include=transcript`). */\n transcriptSummary?: SessionTranscriptSummary;\n /** Present when loaded with `include=transcriptRows` (full on-disk rows, LLM + `kind: 'context'`). */\n transcriptRows?: TranscriptStoredRow[];\n}\n\n/** Session list query parameters */\nexport interface SessionListQuery {\n status?: SessionStatus | SessionStatus[];\n /** Single `sourceChannel`, or comma-separated list (e.g. `telegram,weixin`). */\n channel?: string;\n tags?: string[];\n search?: string;\n sessionTypes?: SessionType[];\n includeHidden?: boolean;\n projectId?: string;\n sortBy?: 'updatedAt' | 'createdAt' | 'messageCount' | 'lastAccessedAt';\n sortOrder?: 'asc' | 'desc';\n limit?: number;\n offset?: number;\n}\n\n/** Paginated result */\nexport interface PaginatedResult<T> {\n items: T[];\n total: number;\n limit: number;\n offset: number;\n hasMore: boolean;\n}\n\n/** Export format */\nexport type ExportFormat = 'json' | 'markdown';\n\n/** Session export data */\nexport interface SessionExport {\n version: string;\n exportedAt: string;\n metadata: SessionMetadata;\n messages: Message[];\n /** Full on-disk rows (LLM + `kind: 'context'`) for audit / round-trip. */\n transcriptRows: TranscriptStoredRow[];\n}\n\n/** On-disk pre-compaction snapshot (OpenClaw-style checkpoint list). */\nexport interface CompactionCheckpointSummary {\n id: string;\n sizeBytes: number;\n modifiedAt: string;\n}\n\nexport interface CompactionCheckpointDetail extends CompactionCheckpointSummary {\n messageCount: number;\n}\n"],"mappings":";;AA4CA,IAAY,gBAAL,yBAAA,eAAA;AACL,eAAA,YAAA;AACA,eAAA,UAAA;AACA,eAAA,cAAA;AACA,eAAA,YAAA;;KACD"}
|
|
@@ -6,6 +6,7 @@ export interface UpsertMemoryRecordInput {
|
|
|
6
6
|
agentId: string;
|
|
7
7
|
workspaceId?: string;
|
|
8
8
|
sessionKey?: string;
|
|
9
|
+
projectId?: string;
|
|
9
10
|
content: string;
|
|
10
11
|
source?: MemoryRecord['source'];
|
|
11
12
|
confidence?: number;
|
|
@@ -21,6 +22,7 @@ export interface ListMemoryRecordsOptions {
|
|
|
21
22
|
providerId?: string;
|
|
22
23
|
agentId?: string;
|
|
23
24
|
workspaceId?: string;
|
|
25
|
+
projectId?: string;
|
|
24
26
|
kind?: MemoryKind;
|
|
25
27
|
status?: MemoryStatus;
|
|
26
28
|
limit?: number;
|
|
@@ -30,6 +32,7 @@ export interface SearchMemoryRecordsOptions {
|
|
|
30
32
|
query: string;
|
|
31
33
|
agentId?: string;
|
|
32
34
|
workspaceId?: string;
|
|
35
|
+
projectId?: string;
|
|
33
36
|
providerId?: string;
|
|
34
37
|
kinds?: MemoryKind[];
|
|
35
38
|
statuses?: MemoryStatus[];
|
|
@@ -93,7 +93,8 @@ function rowToRecord(row) {
|
|
|
93
93
|
scope: {
|
|
94
94
|
agentId: row.agent_id,
|
|
95
95
|
...row.workspace_id ? { workspaceId: row.workspace_id } : {},
|
|
96
|
-
...row.session_key ? { sessionKey: row.session_key } : {}
|
|
96
|
+
...row.session_key ? { sessionKey: row.session_key } : {},
|
|
97
|
+
...row.project_id ? { projectId: row.project_id } : {}
|
|
97
98
|
},
|
|
98
99
|
content: row.content,
|
|
99
100
|
source: parseSource(row.source_json),
|
|
@@ -130,16 +131,17 @@ function upsertMemoryRecord(input) {
|
|
|
130
131
|
};
|
|
131
132
|
runSqliteWriteTransaction((db) => {
|
|
132
133
|
db.prepare(`INSERT INTO memory_records (
|
|
133
|
-
record_id, provider_id, kind, agent_id, workspace_id, session_key,
|
|
134
|
+
record_id, provider_id, kind, agent_id, workspace_id, session_key, project_id,
|
|
134
135
|
content, source_json, confidence, tags_json, status, sensitivity,
|
|
135
136
|
evidence_json, review_after, expires_at, created_at, updated_at
|
|
136
|
-
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
137
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
137
138
|
ON CONFLICT(record_id) DO UPDATE SET
|
|
138
139
|
provider_id = excluded.provider_id,
|
|
139
140
|
kind = excluded.kind,
|
|
140
141
|
agent_id = excluded.agent_id,
|
|
141
142
|
workspace_id = excluded.workspace_id,
|
|
142
143
|
session_key = excluded.session_key,
|
|
144
|
+
project_id = excluded.project_id,
|
|
143
145
|
content = excluded.content,
|
|
144
146
|
source_json = excluded.source_json,
|
|
145
147
|
confidence = excluded.confidence,
|
|
@@ -149,7 +151,7 @@ function upsertMemoryRecord(input) {
|
|
|
149
151
|
evidence_json = excluded.evidence_json,
|
|
150
152
|
review_after = excluded.review_after,
|
|
151
153
|
expires_at = excluded.expires_at,
|
|
152
|
-
updated_at = excluded.updated_at`).run(id, input.providerId, input.kind, input.agentId, input.workspaceId ?? null, input.sessionKey ?? null, input.content, JSON.stringify(source), input.confidence ?? null, JSON.stringify(input.tags ?? []), status, sensitivity, JSON.stringify(input.evidence ?? []), reviewAfter, expiresAt, now, now);
|
|
154
|
+
updated_at = excluded.updated_at`).run(id, input.providerId, input.kind, input.agentId, input.workspaceId ?? null, input.sessionKey ?? null, input.projectId ?? null, input.content, JSON.stringify(source), input.confidence ?? null, JSON.stringify(input.tags ?? []), status, sensitivity, JSON.stringify(input.evidence ?? []), reviewAfter, expiresAt, now, now);
|
|
153
155
|
upsertMemoryRecordFts(db, {
|
|
154
156
|
...input,
|
|
155
157
|
id
|
|
@@ -162,7 +164,8 @@ function upsertMemoryRecord(input) {
|
|
|
162
164
|
scope: {
|
|
163
165
|
agentId: input.agentId,
|
|
164
166
|
...input.workspaceId ? { workspaceId: input.workspaceId } : {},
|
|
165
|
-
...input.sessionKey ? { sessionKey: input.sessionKey } : {}
|
|
167
|
+
...input.sessionKey ? { sessionKey: input.sessionKey } : {},
|
|
168
|
+
...input.projectId ? { projectId: input.projectId } : {}
|
|
166
169
|
},
|
|
167
170
|
content: input.content,
|
|
168
171
|
source,
|
|
@@ -195,6 +198,10 @@ function listMemoryRecords(options = {}) {
|
|
|
195
198
|
where.push("workspace_id = ?");
|
|
196
199
|
params.push(options.workspaceId);
|
|
197
200
|
}
|
|
201
|
+
if (options.projectId) {
|
|
202
|
+
where.push("project_id = ?");
|
|
203
|
+
params.push(options.projectId);
|
|
204
|
+
}
|
|
198
205
|
if (options.kind) {
|
|
199
206
|
where.push("kind = ?");
|
|
200
207
|
params.push(options.kind);
|
|
@@ -223,6 +230,10 @@ function searchMemoryRecords(options) {
|
|
|
223
230
|
filters.push("f.workspace_id = ?");
|
|
224
231
|
params.push(options.workspaceId);
|
|
225
232
|
}
|
|
233
|
+
if (options.projectId) {
|
|
234
|
+
filters.push("r.project_id = ?");
|
|
235
|
+
params.push(options.projectId);
|
|
236
|
+
}
|
|
226
237
|
if (options.providerId) {
|
|
227
238
|
filters.push("f.provider_id = ?");
|
|
228
239
|
params.push(options.providerId);
|