@xopcai/xopc 0.0.218 → 0.0.219
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/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/{activity-store-DF2dYXG1.js → activity-store-slG02hSm.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-Dw9rF5o1.js → agent-avatar-dicebear-DZ6ETNIk.js} +1 -1
- package/dist/gateway/static/root/assets/agents-DxaIH0Ep.js +68 -0
- package/dist/gateway/static/root/assets/{api-_H0Bam-t.js → api-Tz57QxiN.js} +1 -1
- package/dist/gateway/static/root/assets/app-management-settings-panel-DdR1L4LR.js +1 -0
- package/dist/gateway/static/root/assets/appearance-settings-wYbwqmee.js +1 -0
- package/dist/gateway/static/root/assets/apps-page-CyWr6KyO.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-DZCOhXch.js → archive-plugin-DKXa160O.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-Bjb0FH2B.js → attachment-load-CzwA9g2y.js} +1 -1
- package/dist/gateway/static/root/assets/{automations-page-D4N3ZDhu.js → automations-page-DwAXyWAY.js} +1 -1
- package/dist/gateway/static/root/assets/automations-workspace-CL7ieYIt.js +6 -0
- package/dist/gateway/static/root/assets/{binary-plugins-uXPt0s47.js → binary-plugins-DoQ_DnT7.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-gukkIEro.js → block-editor-Bj_Uxxng.js} +47 -47
- package/dist/gateway/static/root/assets/browser-settings-page-BYa_FNC1.js +8 -0
- package/dist/gateway/static/root/assets/{browser-workflow-inputs-DAhdS-XZ.js → browser-workflow-inputs-D4roXE6r.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-workflows-page-LKjYzXS_.js → browser-workflows-page-CleKTAKD.js} +2 -2
- package/dist/gateway/static/root/assets/capabilities-settings-panel-DYG37N0k.js +7 -0
- package/dist/gateway/static/root/assets/{capability-presets-api-BBUkH833.js → capability-presets-api-wtEN6Ss6.js} +1 -1
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-C0Q4dFq-.js +3 -0
- package/dist/gateway/static/root/assets/{channel-recipient-api-E5mo8M3a.js → channel-recipient-api-DhuS2RJ3.js} +1 -1
- package/dist/gateway/static/root/assets/channels-settings-CpO6Xg0n.js +1 -0
- package/dist/gateway/static/root/assets/channels-status-swr-CXhPeiNj.js +1 -0
- package/dist/gateway/static/root/assets/chat-terminal-dock-ClQMDe2n.js +36 -0
- package/dist/gateway/static/root/assets/connectors-page-BvyiPdKU.js +2 -0
- package/dist/gateway/static/root/assets/{cron-expression-BGNuaqvI.js → cron-expression-4DvCFs-v.js} +1 -1
- package/dist/gateway/static/root/assets/{date-picker-k7mkklMU.js → date-picker-B6FSjt4Z.js} +1 -1
- package/dist/gateway/static/root/assets/dependency-picker-Za18eMp1.js +1 -0
- package/dist/gateway/static/root/assets/{desktop-pet-p9EZyGzV.js → desktop-pet-DUUf3yyJ.js} +1 -1
- package/dist/gateway/static/root/assets/desktop-pet-settings-Dwx3GfB8.js +1 -0
- package/dist/gateway/static/root/assets/directory-picker-path-field-C6dfTCsl.js +1 -0
- package/dist/gateway/static/root/assets/ellipsis-0k4rZLoy.js +1 -0
- package/dist/gateway/static/root/assets/{extension-debug-page-Cd4BMKm_.js → extension-debug-page-Cordpg4X.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-CzEGCkOa.js → extension-page-Dw0dGyMl.js} +1 -1
- package/dist/gateway/static/root/assets/extension-settings-page-B2pUMaXm.js +1 -0
- package/dist/gateway/static/root/assets/eye-CABVeTq0.js +1 -0
- package/dist/gateway/static/root/assets/eye-off-DEAzt3g1.js +1 -0
- package/dist/gateway/static/root/assets/file-code-corner-byQA1VfD.js +1 -0
- package/dist/gateway/static/root/assets/form-field-width-DJw_jULe.js +1 -0
- package/dist/gateway/static/root/assets/gateway-config-api-DAZUOEQh.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-config-swr-DNrttVr2.js → gateway-config-swr-BIqRg-zo.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-settings-ik2f-pmV.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-startup-retry-B1vD3vRb.js → gateway-startup-retry-BFjWYOCS.js} +1 -1
- package/dist/gateway/static/root/assets/heartbeat-settings-BE81XJ8F.js +1 -0
- package/dist/gateway/static/root/assets/home-page-BTWXJu_m.js +1 -0
- package/dist/gateway/static/root/assets/{image-generation-api-BTR0Wk_k.js → image-generation-api-HXAWlgm6.js} +1 -1
- package/dist/gateway/static/root/assets/index-B6gWYy08.js +108 -0
- package/dist/gateway/static/root/assets/index-CDkuz_YC.css +2 -0
- package/dist/gateway/static/root/assets/interaction-BmQogeqz.js +1 -0
- package/dist/gateway/static/root/assets/is-masked-secret-DOkL5b_X.js +1 -0
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-CYlS4RGA.js → keyboard-shortcuts-settings-ROqQ_Xlo.js} +1 -1
- package/dist/gateway/static/root/assets/local-app-workbench-page-Dcaf190G.js +2 -0
- package/dist/gateway/static/root/assets/{local-apps-page-CNppYVew.js → local-apps-page-Be79cyMG.js} +1 -1
- package/dist/gateway/static/root/assets/{locale-store-gf9Bg2gb.js → locale-store-DfK-Hofd.js} +1 -1
- package/dist/gateway/static/root/assets/logs-page-C2pjbXno.js +2 -0
- package/dist/gateway/static/root/assets/{management-settings-IYk9xLgt.js → management-settings-CRspx0oY.js} +1 -1
- package/dist/gateway/static/root/assets/{markdown-split-D8e6pRMH.js → markdown-split-G3PTpGw3.js} +1 -1
- package/dist/gateway/static/root/assets/{markdown-view-D0fiJjBQ.js → markdown-view-D4FPJZ91.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-CCq6TtEf.js → media-plugins-DT0P7j7u.js} +1 -1
- package/dist/gateway/static/root/assets/messages-B701TEZ5.js +3 -0
- package/dist/gateway/static/root/assets/{notes-api-BBtWnlUU.js → notes-api-q7HjYO07.js} +1 -1
- package/dist/gateway/static/root/assets/{notes-page-BKe1xa3U.js → notes-page-Cgl2h7AR.js} +1 -1
- package/dist/gateway/static/root/assets/notes-workbench-DFMQYyGJ.js +4 -0
- package/dist/gateway/static/root/assets/page-tabs-BaEQMYm_.js +1 -0
- package/dist/gateway/static/root/assets/preview-open-alternatives-CsNVTKC0.js +1 -0
- package/dist/gateway/static/root/assets/{product-open-page-DXe5iWI6.js → product-open-page-ComKLO4D.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-DUFmQscH.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-CTWxt3dv.js +1 -0
- package/dist/gateway/static/root/assets/{registry-api-xj5gOva_.js → registry-api-BBoJ7khF.js} +1 -1
- package/dist/gateway/static/root/assets/remote-access-hub-qmG-3qjj.js +1 -0
- package/dist/gateway/static/root/assets/rotate-cw-LIg3Am9S.js +1 -0
- package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-BJTvmBCA.js → runtime-tools-settings-panel-CXHQc53b.js} +2 -2
- package/dist/gateway/static/root/assets/{schema-form-DvGBa_7R.js → schema-form-3jTDF2lJ.js} +1 -1
- package/dist/gateway/static/root/assets/search-DA7gz22f.js +1 -0
- package/dist/gateway/static/root/assets/sessions-page-D_We4_MV.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-B_QhPgU0.js +1 -0
- package/dist/gateway/static/root/assets/settings-form-section-CUDozALU.js +1 -0
- package/dist/gateway/static/root/assets/{settings-loading-skeleton-sbef7GTm.js → settings-loading-skeleton-H3ZH6a6l.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-BNGxxXZe.js → settings-page-tx29z21o.js} +1 -1
- package/dist/gateway/static/root/assets/setup-status-panel-VunfXpTX.js +1 -0
- package/dist/gateway/static/root/assets/{share-preview-page-C1523ij3.js → share-preview-page-MyThymEx.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-DkZvY1cr.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-DVDOh1iY.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-BOOyMnno.js +2 -0
- package/dist/gateway/static/root/assets/{skills-page.utils-Ditgz7Vo.js → skills-page.utils-Bl5Yv3Cx.js} +1 -1
- package/dist/gateway/static/root/assets/system-settings-panel-DwQ3O1ta.js +1 -0
- package/dist/gateway/static/root/assets/task-detail-page-BwOyrADL.js +1 -0
- package/dist/gateway/static/root/assets/{theme-store-DgSjes3O.js → theme-store-Br4BtK4x.js} +1 -1
- package/dist/gateway/static/root/assets/typed-models-lib-q5-Vfqd8.js +1 -0
- package/dist/gateway/static/root/assets/{use-autosave-Bp_qFZkl.js → use-autosave-DRS3RwS9.js} +1 -1
- package/dist/gateway/static/root/assets/user-context-page-ClV2r3Cr.js +1 -0
- package/dist/gateway/static/root/assets/{voice-api-key-field-hbzDfErG.js → voice-api-key-field-CGTE5156.js} +1 -1
- package/dist/gateway/static/root/assets/{work-discovery-overlay-DZVib-04.js → work-discovery-overlay-CW-HKD7h.js} +1 -1
- package/dist/gateway/static/root/assets/{workflow-run-setup-panel-C2RKay1p.js → workflow-run-setup-panel-Dtr9fDC8.js} +2 -2
- package/dist/gateway/static/root/assets/workflows-page-CDOyNgZf.js +5 -0
- package/dist/gateway/static/root/index.html +20 -11
- package/dist/package.js +1 -1
- package/dist/packages/gateway-contract/src/new-session.js +99 -0
- package/dist/packages/gateway-contract/src/tasks.js +5 -0
- package/dist/packages/gateway-contract/src/user-message-display.js +55 -0
- package/dist/src/agent/agent-manager.js +5 -4
- package/dist/src/agent/background-review/prompts.d.ts +1 -1
- package/dist/src/agent/background-review/prompts.js +2 -2
- package/dist/src/agent/background-review/run-background-review.js +144 -16
- package/dist/src/agent/embedded/model-runtime.js +1 -1
- package/dist/src/agent/embedded/run-for-session.js +1 -1
- package/dist/src/agent/image/tool-model-config.js +1 -1
- package/dist/src/agent/inbound/turn-dispatcher.d.ts +3 -1
- package/dist/src/agent/inbound/turn-dispatcher.js +2 -1
- package/dist/src/agent/ipc/inbox.js +1 -1
- package/dist/src/agent/memory/context/types.d.ts +1 -1
- package/dist/src/agent/memory/manager.d.ts +2 -1
- package/dist/src/agent/memory/manager.js +2 -6
- package/dist/src/agent/memory/understanding/service.d.ts +1 -0
- package/dist/src/agent/memory/understanding/service.js +179 -36
- package/dist/src/agent/memory/understanding/types.d.ts +6 -0
- package/dist/src/agent/messaging/command-handler.d.ts +2 -0
- package/dist/src/agent/messaging/command-handler.js +3 -1
- package/dist/src/agent/service/direct-turn-helpers.d.ts +3 -0
- package/dist/src/agent/service/direct-turn-helpers.js +13 -3
- package/dist/src/agent/service/process-direct-streaming.d.ts +2 -1
- package/dist/src/agent/service/process-direct-streaming.js +12 -11
- package/dist/src/agent/service.js +2 -2
- package/dist/src/agent/session/session-config-service.d.ts +1 -0
- package/dist/src/agent/session/session-config-service.js +11 -0
- package/dist/src/agent/session/session-inspector.d.ts +1 -0
- package/dist/src/agent/session/session-inspector.js +2 -1
- package/dist/src/agent/skills/hub-lock.js +1 -1
- package/dist/src/agent/source-context/budget.d.ts +3 -0
- package/dist/src/agent/source-context/budget.js +21 -0
- package/dist/src/agent/source-context/index.js +3 -3
- package/dist/src/agent/source-context/injector.d.ts +2 -2
- package/dist/src/agent/source-context/injector.js +19 -9
- package/dist/src/agent/source-context/types.d.ts +16 -0
- package/dist/src/agent/source-context/types.js +25 -1
- package/dist/src/agent/tasks/task-judge-service.js +3 -3
- package/dist/src/agent/tool-manuals/xopc-use.d.ts +1 -1
- package/dist/src/agent/tool-manuals/xopc-use.js +19 -2
- package/dist/src/agent/tools/xopc-use-tool.js +62 -2
- package/dist/src/ai-assist/text-assist.js +1 -1
- package/dist/src/auth/credentials.js +2 -2
- package/dist/src/auth/profiles/store.js +1 -1
- package/dist/src/auth/sync-provider-auth.js +2 -2
- package/dist/src/browser/backend-from-config.d.ts +8 -0
- package/dist/src/browser/backend-from-config.js +16 -1
- package/dist/src/browser/providers/browser-ext-install.d.ts +3 -2
- package/dist/src/browser/providers/browser-ext-install.js +5 -3
- package/dist/src/chat-commands/builtins/review.js +11 -2
- package/dist/src/chat-commands/builtins/understanding.js +11 -4
- package/dist/src/chat-commands/types.d.ts +4 -0
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
- package/dist/src/cli/commands/extension-marketplace.js +1 -1
- package/dist/src/cli/commands/extension.js +1 -1
- package/dist/src/cli/commands/models.js +1 -1
- package/dist/src/config/index.js +4 -4
- package/dist/src/config/loader.js +1 -1
- package/dist/src/config/models-json.d.ts +20 -20
- package/dist/src/config/models-json.js +1 -1
- package/dist/src/connectors/connected-source-understanding.d.ts +1 -0
- package/dist/src/connectors/connected-source-understanding.js +82 -34
- package/dist/src/connectors/learning-coordinator.js +57 -11
- package/dist/src/extensions/lockfile.js +1 -1
- package/dist/src/extensions/update.js +1 -1
- package/dist/src/gateway/agents-admin.js +1 -1
- package/dist/src/gateway/chat-stream/mapper.js +18 -0
- package/dist/src/gateway/file-path-classifier.js +1 -1
- package/dist/src/gateway/hono/lib/config-payload.js +1 -1
- package/dist/src/gateway/hono/routes/agent-stream.js +12 -2
- package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
- package/dist/src/gateway/hono/routes/commands-skills.js +1 -0
- package/dist/src/gateway/hono/routes/models.js +1 -1
- package/dist/src/gateway/hono/routes/session-input-handler.d.ts +46 -2
- package/dist/src/gateway/hono/routes/session-input-handler.js +23 -3
- package/dist/src/gateway/hono/routes/sessions.js +17 -20
- package/dist/src/gateway/hono/routes/tasks.js +25 -0
- package/dist/src/gateway/hono/routes/understanding-sources.d.ts +9 -0
- package/dist/src/gateway/hono/routes/understanding-sources.js +127 -31
- package/dist/src/gateway/hono/routes/workflows.js +2 -2
- package/dist/src/gateway/hono/routes/you.js +71 -4
- package/dist/src/gateway/service/agent-runner.d.ts +7 -2
- package/dist/src/gateway/service/agent-runner.js +21 -1
- package/dist/src/gateway/service/config-coordinator.js +2 -2
- package/dist/src/gateway/service/run-gateway-agent.d.ts +2 -0
- package/dist/src/gateway/service/run-gateway-agent.js +2 -1
- package/dist/src/gateway/service/session-input-coordinator.d.ts +8 -2
- package/dist/src/gateway/service/session-input-coordinator.js +62 -3
- package/dist/src/gateway/service/sessions-api.d.ts +1 -0
- package/dist/src/gateway/service.d.ts +3 -2
- package/dist/src/gateway/service.js +25 -15
- package/dist/src/gateway/user-turn-input.d.ts +2 -0
- package/dist/src/gateway/xopc-cloud-capability-setup.d.ts +3 -2
- package/dist/src/gateway/xopc-cloud-capability-setup.js +16 -3
- package/dist/src/infra/update-runner.js +1 -1
- package/dist/src/knowledge/connected-understanding-pipeline.d.ts +1 -1
- package/dist/src/knowledge/connected-understanding-pipeline.js +4 -2
- package/dist/src/providers/auth-runtime/resolve-auth.js +1 -1
- package/dist/src/providers/index.js +2 -2
- package/dist/src/providers/model-registry.js +1 -1
- package/dist/src/providers/register-runtime-providers.js +1 -1
- package/dist/src/retrieval/queryProfile.d.ts +1 -0
- package/dist/src/retrieval/queryProfile.js +9 -1
- package/dist/src/session/client-history.d.ts +11 -0
- package/dist/src/session/client-history.js +24 -2
- package/dist/src/session/config-types.d.ts +1 -1
- package/dist/src/session/session-title.js +2 -3
- package/dist/src/session/store.js +1 -0
- package/dist/src/session/transcript-outline.js +5 -2
- package/dist/src/session/types.d.ts +1 -0
- package/dist/src/session/user-message-display.d.ts +4 -0
- package/dist/src/session/user-message-display.js +22 -0
- package/dist/src/storage/sqlite/context-extraction-repository.d.ts +57 -0
- package/dist/src/storage/sqlite/context-extraction-repository.js +119 -0
- package/dist/src/storage/sqlite/context-relation-repository.d.ts +50 -0
- package/dist/src/storage/sqlite/context-relation-repository.js +97 -0
- package/dist/src/storage/sqlite/index.d.ts +4 -2
- package/dist/src/storage/sqlite/index.js +5 -3
- package/dist/src/storage/sqlite/migrations/126_focus_context_governance.sql +72 -0
- package/dist/src/storage/sqlite/migrations/127_context_object_origin.sql +36 -0
- package/dist/src/storage/sqlite/migrations/128_context_extraction.sql +73 -0
- package/dist/src/storage/sqlite/migrations/129_focus_versions.sql +51 -0
- package/dist/src/storage/sqlite/migrations/130_context_evidence_provenance.sql +18 -0
- package/dist/src/storage/sqlite/migrations/131_session_input_contexts.sql +2 -0
- package/dist/src/storage/sqlite/migrations/132_transcript_source_context_metadata.sql +34 -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.ts +1 -1
- package/dist/src/storage/sqlite/schema.js +1 -1
- package/dist/src/storage/sqlite/session-input-repository.d.ts +8 -0
- package/dist/src/storage/sqlite/session-input-repository.js +19 -7
- package/dist/src/storage/sqlite/session-turn-replace-repository.d.ts +3 -0
- package/dist/src/storage/sqlite/session-turn-replace-repository.js +3 -2
- package/dist/src/storage/sqlite/transcript-repository.js +29 -3
- package/dist/src/storage/sqlite/user-context-repository.d.ts +4 -1
- package/dist/src/storage/sqlite/user-context-repository.js +65 -29
- package/dist/src/tasks/index.d.ts +1 -0
- package/dist/src/tasks/index.js +2 -1
- package/dist/src/tasks/task-deletion-service.d.ts +21 -0
- package/dist/src/tasks/task-deletion-service.js +35 -0
- package/dist/src/tasks/task-repository.js +22 -1
- package/dist/src/tui/backends/embedded-backend.js +5 -3
- package/dist/src/tui/backends/gateway-realtime-backend.js +5 -3
- package/dist/src/tui/chat-history.js +2 -1
- package/dist/src/tui/tui-agent-events.js +4 -2
- package/dist/src/tui/tui-commands.d.ts +1 -0
- package/dist/src/tui/tui-commands.js +8 -3
- package/dist/src/tui/tui-empty-session-cleanup.d.ts +0 -1
- package/dist/src/tui/tui-empty-session-cleanup.js +1 -11
- package/dist/src/tui/tui-new-session-preferences.d.ts +10 -0
- package/dist/src/tui/tui-new-session-preferences.js +32 -0
- package/dist/src/tui/tui-session-actions.d.ts +1 -0
- package/dist/src/tui/tui-session-actions.js +2 -1
- package/dist/src/tui/tui-settings.d.ts +2 -0
- package/dist/src/tui/tui-settings.js +4 -1
- package/dist/src/tui/tui-startup-resources.js +1 -1
- package/dist/src/tui/tui-types.d.ts +1 -0
- package/dist/src/tui/tui.js +58 -5
- package/dist/src/tunnel/frpc-process.js +3 -0
- package/dist/src/tunnel/tunnel-service.d.ts +2 -0
- package/dist/src/tunnel/tunnel-service.js +40 -28
- package/dist/src/user-context/context-objects.d.ts +17 -0
- package/dist/src/user-context/context-objects.js +99 -0
- package/dist/src/user-context/domain.d.ts +13 -1
- package/dist/src/user-context/evaluation/harness.d.ts +13 -0
- package/dist/src/user-context/evaluation/harness.js +31 -0
- package/dist/src/user-context/extraction/registry.d.ts +26 -0
- package/dist/src/user-context/extraction/registry.js +113 -0
- package/dist/src/user-context/extraction/repair.d.ts +19 -0
- package/dist/src/user-context/extraction/repair.js +68 -0
- package/dist/src/user-context/planner.js +214 -57
- package/dist/src/user-context/retriever.js +69 -9
- package/dist/src/user-context/sources/index.js +2 -2
- package/dist/src/user-context/sources/processing-policy.d.ts +2 -0
- package/dist/src/user-context/sources/processing-policy.js +7 -0
- package/dist/src/user-context/sources/repository.d.ts +23 -4
- package/dist/src/user-context/sources/repository.js +122 -12
- package/dist/src/user-context/sources/types.d.ts +10 -1
- package/dist/src/user-context/understanding.js +1 -1
- package/dist/src/work-discovery/service.js +21 -5
- package/dist/src/work-discovery/source-repository.js +1 -1
- package/dist/src/workflows/service/workflow-run-service.js +1 -1
- package/package.json +3 -3
- package/dist/gateway/static/root/assets/agents-Dj86bHkl.js +0 -68
- package/dist/gateway/static/root/assets/app-management-settings-panel-D-M6GN-8.js +0 -1
- package/dist/gateway/static/root/assets/appearance-settings-XDhmzdIc.js +0 -1
- package/dist/gateway/static/root/assets/apps-page-sfO835uz.js +0 -1
- package/dist/gateway/static/root/assets/automations-workspace-PptuZgoo.js +0 -6
- package/dist/gateway/static/root/assets/browser-settings-page-BoCmzMFV.js +0 -8
- package/dist/gateway/static/root/assets/capabilities-settings-panel-DhkJsU8Z.js +0 -7
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-Dm7T61fE.js +0 -3
- package/dist/gateway/static/root/assets/channels-settings-dG6UFVqt.js +0 -1
- package/dist/gateway/static/root/assets/channels-status-swr-DgJxfNyK.js +0 -1
- package/dist/gateway/static/root/assets/chat-terminal-dock-CT5yoSMD.js +0 -36
- package/dist/gateway/static/root/assets/connectors-page-BC6Ft9SU.js +0 -2
- package/dist/gateway/static/root/assets/dependency-picker-DZVSgLXH.js +0 -1
- package/dist/gateway/static/root/assets/desktop-pet-settings-Bw4cCFzI.js +0 -1
- package/dist/gateway/static/root/assets/directory-picker-path-field-Cbst7IXR.js +0 -1
- package/dist/gateway/static/root/assets/extension-settings-page-C1PAKSy2.js +0 -1
- package/dist/gateway/static/root/assets/gateway-config-api-Bch9vO6t.js +0 -1
- package/dist/gateway/static/root/assets/gateway-settings-DkDxZFGG.js +0 -1
- package/dist/gateway/static/root/assets/heartbeat-settings-DXNMxy5b.js +0 -1
- package/dist/gateway/static/root/assets/home-page-CYcpVFNT.js +0 -1
- package/dist/gateway/static/root/assets/index-Dgb1R07E.css +0 -2
- package/dist/gateway/static/root/assets/index-DlOYwVFK.js +0 -108
- package/dist/gateway/static/root/assets/local-app-workbench-page-BFrgPwGE.js +0 -2
- package/dist/gateway/static/root/assets/logs-page-CPweLw3k.js +0 -2
- package/dist/gateway/static/root/assets/messages-B9WQcZ1V.js +0 -3
- package/dist/gateway/static/root/assets/notes-workbench-wieRAd1y.js +0 -4
- package/dist/gateway/static/root/assets/page-tabs-Bsluqyfb.js +0 -1
- package/dist/gateway/static/root/assets/preview-open-alternatives-BrpTWv44.js +0 -1
- package/dist/gateway/static/root/assets/project-detail-page-Cww6V7HJ.js +0 -1
- package/dist/gateway/static/root/assets/projects-page-D0LKhCCw.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-Sf4Pde6Z.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-S5gvgfu5.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-B3XvdEy8.js +0 -1
- package/dist/gateway/static/root/assets/settings-form-section-CiGFtdD8.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-CGU_Mxjr.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-k0UQ8WxO.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-DQ1GvL1w.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-OuHd9GcN.js +0 -2
- package/dist/gateway/static/root/assets/system-settings-panel-CERqCsz2.js +0 -1
- package/dist/gateway/static/root/assets/task-detail-page-BnRNL2sn.js +0 -1
- package/dist/gateway/static/root/assets/typed-models-lib-abEJNkCO.js +0 -1
- package/dist/gateway/static/root/assets/user-context-page-Cnkaiky5.js +0 -1
- package/dist/gateway/static/root/assets/workflows-page-B_VlcKiK.js +0 -5
|
@@ -2,8 +2,31 @@ import { getSqliteDatabase, runSqliteWriteTransaction } from "./transaction.js";
|
|
|
2
2
|
import { USER_CONTEXT_PRINCIPAL_ID } from "../../user-context/domain.js";
|
|
3
3
|
import { retrievalQueryAuditValue } from "../../retrieval/audit.js";
|
|
4
4
|
import { buildFts5SearchQuery, fts5RankToScore } from "./fts.js";
|
|
5
|
-
import { randomUUID } from "node:crypto";
|
|
5
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
6
6
|
//#region src/storage/sqlite/user-context-repository.ts
|
|
7
|
+
function evidenceFromRow(row) {
|
|
8
|
+
return {
|
|
9
|
+
id: row.evidence_id,
|
|
10
|
+
sourceType: row.source_type,
|
|
11
|
+
...row.source_instance_id ? { sourceInstanceId: row.source_instance_id } : {},
|
|
12
|
+
sourceRef: row.source_ref,
|
|
13
|
+
...row.source_run_id ? { sourceRunId: row.source_run_id } : {},
|
|
14
|
+
...row.source_item_id ? { sourceItemId: row.source_item_id } : {},
|
|
15
|
+
...row.session_id ? { sessionId: row.session_id } : {},
|
|
16
|
+
...row.turn_id ? { turnId: row.turn_id } : {},
|
|
17
|
+
...row.message_id ? { messageId: row.message_id } : {},
|
|
18
|
+
...row.content_hash ? { contentHash: row.content_hash } : {},
|
|
19
|
+
...row.retention_policy ? { retentionPolicy: row.retention_policy } : {},
|
|
20
|
+
...row.processing_policy ? { processingPolicy: row.processing_policy } : {},
|
|
21
|
+
...row.extractor_id ? { extractorId: row.extractor_id } : {},
|
|
22
|
+
...row.extractor_version ? { extractorVersion: row.extractor_version } : {},
|
|
23
|
+
...row.redacted_excerpt ? { redactedExcerpt: row.redacted_excerpt } : {},
|
|
24
|
+
trustLevel: row.trust_level,
|
|
25
|
+
observedAt: row.observed_at,
|
|
26
|
+
ingestedAt: row.ingested_at ?? row.created_at,
|
|
27
|
+
createdAt: row.created_at
|
|
28
|
+
};
|
|
29
|
+
}
|
|
7
30
|
const UNDERSTANDING_SELECT = `
|
|
8
31
|
SELECT u.*, v.statement, v.payload_json
|
|
9
32
|
FROM user_understandings u
|
|
@@ -182,6 +205,16 @@ function setUnderstandingStatus(id, status, confirmation) {
|
|
|
182
205
|
confidence = COALESCE(?, confidence),
|
|
183
206
|
updated_at = ?
|
|
184
207
|
WHERE understanding_id = ?`).run(status, confirmation?.explicitness ?? null, confirmation?.confidence ?? null, now, id);
|
|
208
|
+
const assertionStatus = status === "active" ? "active" : status === "archived" ? "closed" : status === "rejected" ? "rejected" : "candidate";
|
|
209
|
+
getSqliteDatabase().prepare(`UPDATE context_temporal_assertions
|
|
210
|
+
SET status = ?, updated_at = ? WHERE object_type = 'understanding' AND object_id = ?`).run(assertionStatus, now, id);
|
|
211
|
+
const result = getUnderstanding(id);
|
|
212
|
+
if (!result) throw new Error(`User understanding not found: ${id}`);
|
|
213
|
+
return result;
|
|
214
|
+
}
|
|
215
|
+
function closeUnderstandingValidity(id, validTo = Date.now()) {
|
|
216
|
+
getSqliteDatabase().prepare(`UPDATE user_understandings SET valid_to = ?, updated_at = ?
|
|
217
|
+
WHERE understanding_id = ?`).run(validTo, validTo, id);
|
|
185
218
|
const result = getUnderstanding(id);
|
|
186
219
|
if (!result) throw new Error(`User understanding not found: ${id}`);
|
|
187
220
|
return result;
|
|
@@ -263,25 +296,36 @@ function createContextEvidence(input, principalId = USER_CONTEXT_PRINCIPAL_ID) {
|
|
|
263
296
|
const existing = getSqliteDatabase().prepare(`SELECT * FROM context_evidence
|
|
264
297
|
WHERE principal_id = ? AND source_type = ?
|
|
265
298
|
AND COALESCE(source_instance_id, '') = COALESCE(?, '') AND source_ref = ?`).get(principalId, input.sourceType, input.sourceInstanceId ?? null, input.sourceRef);
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
299
|
+
const derivedHash = input.contentHash ?? (input.redactedExcerpt ? createHash("sha256").update(input.redactedExcerpt).digest("hex") : void 0);
|
|
300
|
+
if (existing) {
|
|
301
|
+
getSqliteDatabase().prepare(`UPDATE context_evidence SET
|
|
302
|
+
source_run_id = COALESCE(source_run_id, ?), source_item_id = COALESCE(source_item_id, ?),
|
|
303
|
+
session_id = COALESCE(session_id, ?), turn_id = COALESCE(turn_id, ?),
|
|
304
|
+
message_id = COALESCE(message_id, ?), content_hash = COALESCE(content_hash, ?),
|
|
305
|
+
retention_policy = COALESCE(retention_policy, ?),
|
|
306
|
+
processing_policy = CASE
|
|
307
|
+
WHEN processing_policy = 'local_only' OR ? = 'local_only' THEN 'local_only'
|
|
308
|
+
ELSE COALESCE(processing_policy, ?)
|
|
309
|
+
END,
|
|
310
|
+
extractor_id = COALESCE(extractor_id, ?), extractor_version = COALESCE(extractor_version, ?),
|
|
311
|
+
ingested_at = COALESCE(ingested_at, ?)
|
|
312
|
+
WHERE evidence_id = ?`).run(input.sourceRunId ?? null, input.sourceItemId ?? null, input.sessionId ?? null, input.turnId ?? null, input.messageId ?? null, derivedHash ?? null, input.retentionPolicy ?? null, input.processingPolicy ?? null, input.processingPolicy ?? null, input.extractorId ?? null, input.extractorVersion ?? null, input.ingestedAt ?? Date.now(), existing.evidence_id);
|
|
313
|
+
return evidenceFromRow(getSqliteDatabase().prepare("SELECT * FROM context_evidence WHERE evidence_id = ?").get(existing.evidence_id));
|
|
314
|
+
}
|
|
315
|
+
const createdAt = Date.now();
|
|
276
316
|
const evidence = {
|
|
277
317
|
...input,
|
|
278
318
|
id: randomUUID(),
|
|
279
|
-
|
|
319
|
+
...derivedHash ? { contentHash: derivedHash } : {},
|
|
320
|
+
ingestedAt: input.ingestedAt ?? createdAt,
|
|
321
|
+
createdAt
|
|
280
322
|
};
|
|
281
323
|
getSqliteDatabase().prepare(`INSERT INTO context_evidence (
|
|
282
|
-
evidence_id, principal_id, source_type, source_instance_id, source_ref,
|
|
283
|
-
|
|
284
|
-
|
|
324
|
+
evidence_id, principal_id, source_type, source_instance_id, source_ref, source_run_id,
|
|
325
|
+
source_item_id, session_id, turn_id, message_id, content_hash, retention_policy,
|
|
326
|
+
processing_policy, extractor_id, extractor_version, redacted_excerpt, trust_level,
|
|
327
|
+
observed_at, ingested_at, created_at
|
|
328
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(evidence.id, principalId, evidence.sourceType, evidence.sourceInstanceId ?? null, evidence.sourceRef, evidence.sourceRunId ?? null, evidence.sourceItemId ?? null, evidence.sessionId ?? null, evidence.turnId ?? null, evidence.messageId ?? null, evidence.contentHash ?? null, evidence.retentionPolicy ?? null, evidence.processingPolicy ?? null, evidence.extractorId ?? null, evidence.extractorVersion ?? null, evidence.redactedExcerpt ?? null, evidence.trustLevel, evidence.observedAt, evidence.ingestedAt, evidence.createdAt);
|
|
285
329
|
return evidence;
|
|
286
330
|
}
|
|
287
331
|
function linkUnderstandingEvidence(versionId, evidenceId, relation, confidence) {
|
|
@@ -295,16 +339,7 @@ function listUnderstandingEvidence(understandingId, relation) {
|
|
|
295
339
|
JOIN understanding_evidence_links l ON l.evidence_id = e.evidence_id
|
|
296
340
|
JOIN user_understanding_versions v ON v.version_id = l.version_id
|
|
297
341
|
WHERE v.understanding_id = ? AND (? IS NULL OR l.relation = ?)
|
|
298
|
-
ORDER BY e.observed_at DESC`).all(understandingId, relation ?? null, relation ?? null).map(
|
|
299
|
-
id: row.evidence_id,
|
|
300
|
-
sourceType: row.source_type,
|
|
301
|
-
...row.source_instance_id ? { sourceInstanceId: row.source_instance_id } : {},
|
|
302
|
-
sourceRef: row.source_ref,
|
|
303
|
-
...row.redacted_excerpt ? { redactedExcerpt: row.redacted_excerpt } : {},
|
|
304
|
-
trustLevel: row.trust_level,
|
|
305
|
-
observedAt: row.observed_at,
|
|
306
|
-
createdAt: row.created_at
|
|
307
|
-
}));
|
|
342
|
+
ORDER BY e.observed_at DESC`).all(understandingId, relation ?? null, relation ?? null).map(evidenceFromRow);
|
|
308
343
|
}
|
|
309
344
|
function recordContextRun(input) {
|
|
310
345
|
const auditedQuery = retrievalQueryAuditValue(input.query);
|
|
@@ -320,9 +355,9 @@ function recordContextRun(input) {
|
|
|
320
355
|
) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`).run(runId, input.principalId ?? "local-owner", input.turnId, input.sessionKey, auditedQuery, input.budget, input.durationMs, Date.now());
|
|
321
356
|
const insert = db.prepare(`INSERT INTO context_run_items (
|
|
322
357
|
context_run_id, object_type, object_id, version_id, decision, reason, content_snapshot,
|
|
323
|
-
source_label, rank, score, injected_chars
|
|
324
|
-
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
|
|
325
|
-
for (const item of input.items) insert.run(runId, item.objectType, item.objectId, item.versionId ?? null, item.decision, item.reason, item.content, item.sourceLabel, item.rank ?? null, item.score ?? null, item.injectedChars);
|
|
358
|
+
source_label, origin, rank, score, injected_chars
|
|
359
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
|
|
360
|
+
for (const item of input.items) insert.run(runId, item.objectType, item.objectId, item.versionId ?? null, item.decision, item.reason, item.content, item.sourceLabel, item.origin, item.rank ?? null, item.score ?? null, item.injectedChars);
|
|
326
361
|
});
|
|
327
362
|
return runId;
|
|
328
363
|
}
|
|
@@ -341,6 +376,7 @@ function getTurnPersonalization(turnId) {
|
|
|
341
376
|
reason: row.reason,
|
|
342
377
|
content: row.content_snapshot,
|
|
343
378
|
sourceLabel: row.source_label,
|
|
379
|
+
origin: row.origin,
|
|
344
380
|
...row.rank === null ? {} : { rank: row.rank },
|
|
345
381
|
...row.score === null ? {} : { score: row.score },
|
|
346
382
|
injectedChars: row.injected_chars
|
|
@@ -406,4 +442,4 @@ function decideContextConsent(id, decision) {
|
|
|
406
442
|
return Number(result.changes) > 0;
|
|
407
443
|
}
|
|
408
444
|
//#endregion
|
|
409
|
-
export { consumeContextConsent, createCollaborationRule, createContextEvidence, createUnderstanding, decideContextConsent, deleteCollaborationRule, deleteUnderstanding, ensureContextConsent, getCollaborationRule, getTurnPersonalization, getUnderstanding, getUserProfile, hasContextConsent, isUnderstandingSuppressed, linkUnderstandingEvidence, listCollaborationRules, listUnderstandingEvidence, listUnderstandings, recordContextFeedback, recordContextRun, rejectUnderstanding, reviseCollaborationRule, reviseUnderstanding, searchActiveUnderstandings, setCollaborationRuleStatus, setUnderstandingStatus, updateUserProfile };
|
|
445
|
+
export { closeUnderstandingValidity, consumeContextConsent, createCollaborationRule, createContextEvidence, createUnderstanding, decideContextConsent, deleteCollaborationRule, deleteUnderstanding, ensureContextConsent, getCollaborationRule, getTurnPersonalization, getUnderstanding, getUserProfile, hasContextConsent, isUnderstandingSuppressed, linkUnderstandingEvidence, listCollaborationRules, listUnderstandingEvidence, listUnderstandings, recordContextFeedback, recordContextRun, rejectUnderstanding, reviseCollaborationRule, reviseUnderstanding, searchActiveUnderstandings, setCollaborationRuleStatus, setUnderstandingStatus, updateUserProfile };
|
|
@@ -16,6 +16,7 @@ export * from './task-context-repository.js';
|
|
|
16
16
|
export * from './task-conversation-repository.js';
|
|
17
17
|
export * from './task-handoff-service.js';
|
|
18
18
|
export * from './task-dependency-service.js';
|
|
19
|
+
export * from './task-deletion-service.js';
|
|
19
20
|
export * from './task-read-model-projector.js';
|
|
20
21
|
export * from './task-outbox-dispatcher.js';
|
|
21
22
|
export * from './task-run-dispatcher.js';
|
package/dist/src/tasks/index.js
CHANGED
|
@@ -18,7 +18,8 @@ import { ProjectMonitoringService, decideProactiveDisposition, isInQuietHours, n
|
|
|
18
18
|
import { ProjectOperatingViewService, summarizeProjectOperatingView } from "./project-operating-view-service.js";
|
|
19
19
|
import { TaskValueMetricsService } from "./task-value-metrics-service.js";
|
|
20
20
|
import { TaskHandoffService } from "./task-handoff-service.js";
|
|
21
|
+
import { TaskDeletionService } from "./task-deletion-service.js";
|
|
21
22
|
import { TaskOutboxDispatcher } from "./task-outbox-dispatcher.js";
|
|
22
23
|
import { TaskRunDispatcher } from "./task-run-dispatcher.js";
|
|
23
24
|
import { TaskSignalService } from "./task-signal-service.js";
|
|
24
|
-
export { AttentionGovernor, HomeQueryService, ModelTaskContractPlanner, ProjectMonitoringService, ProjectOperatingViewService, TaskApplicationService, TaskContextRepository, TaskConversationConflictError, TaskConversationRepository, TaskDependencyError, TaskDependencyService, TaskHandoffService, TaskOutboxDispatcher, TaskReadModelProjector, TaskRepository, TaskRunCoordinator, TaskRunDispatcher, TaskRunRepository, TaskSignalService, TaskValueMetricsService, TaskWorkflowCoordinator, assembleTaskContext, buildHomeWorkbench, buildTaskExecutionDirective, decideProactiveDisposition, decisionFromTask, defineTaskContract, enqueueTaskChanged, enqueueTaskChangedEvent, getTaskContextManifest, getTaskExecutionBrief, isInQuietHours, nextQuietHoursEnd, parseTaskContractResponse, proactiveDispositionReason, resolveExecutionContext, summarizeProjectOperatingView };
|
|
25
|
+
export { AttentionGovernor, HomeQueryService, ModelTaskContractPlanner, ProjectMonitoringService, ProjectOperatingViewService, TaskApplicationService, TaskContextRepository, TaskConversationConflictError, TaskConversationRepository, TaskDeletionService, TaskDependencyError, TaskDependencyService, TaskHandoffService, TaskOutboxDispatcher, TaskReadModelProjector, TaskRepository, TaskRunCoordinator, TaskRunDispatcher, TaskRunRepository, TaskSignalService, TaskValueMetricsService, TaskWorkflowCoordinator, assembleTaskContext, buildHomeWorkbench, buildTaskExecutionDirective, decideProactiveDisposition, decisionFromTask, defineTaskContract, enqueueTaskChanged, enqueueTaskChangedEvent, getTaskContextManifest, getTaskExecutionBrief, isInQuietHours, nextQuietHoursEnd, parseTaskContractResponse, proactiveDispositionReason, resolveExecutionContext, summarizeProjectOperatingView };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Task, TaskRun } from '@xopcai/gateway-contract';
|
|
2
|
+
import { TaskRepository } from './task-repository.js';
|
|
3
|
+
import { TaskRunRepository } from './task-run-repository.js';
|
|
4
|
+
export type TaskDeletionInspection = {
|
|
5
|
+
ok: true;
|
|
6
|
+
task: Task;
|
|
7
|
+
} | {
|
|
8
|
+
ok: false;
|
|
9
|
+
reason: 'not_found';
|
|
10
|
+
} | {
|
|
11
|
+
ok: false;
|
|
12
|
+
reason: 'active_run';
|
|
13
|
+
run: TaskRun;
|
|
14
|
+
};
|
|
15
|
+
export declare class TaskDeletionService {
|
|
16
|
+
private readonly tasks;
|
|
17
|
+
private readonly runs;
|
|
18
|
+
constructor(tasks?: TaskRepository, runs?: TaskRunRepository);
|
|
19
|
+
inspect(taskId: string): TaskDeletionInspection;
|
|
20
|
+
delete(taskId: string): TaskDeletionInspection;
|
|
21
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { TaskRepository } from "./task-repository.js";
|
|
2
|
+
import { TaskRunRepository } from "./task-run-repository.js";
|
|
3
|
+
//#region src/tasks/task-deletion-service.ts
|
|
4
|
+
var TaskDeletionService = class {
|
|
5
|
+
constructor(tasks = new TaskRepository(), runs = new TaskRunRepository()) {
|
|
6
|
+
this.tasks = tasks;
|
|
7
|
+
this.runs = runs;
|
|
8
|
+
}
|
|
9
|
+
inspect(taskId) {
|
|
10
|
+
const task = this.tasks.get(taskId);
|
|
11
|
+
if (!task) return {
|
|
12
|
+
ok: false,
|
|
13
|
+
reason: "not_found"
|
|
14
|
+
};
|
|
15
|
+
const run = this.runs.getActiveRoot(taskId);
|
|
16
|
+
return run ? {
|
|
17
|
+
ok: false,
|
|
18
|
+
reason: "active_run",
|
|
19
|
+
run
|
|
20
|
+
} : {
|
|
21
|
+
ok: true,
|
|
22
|
+
task
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
delete(taskId) {
|
|
26
|
+
const inspection = this.inspect(taskId);
|
|
27
|
+
if (!inspection.ok) return inspection;
|
|
28
|
+
return this.tasks.delete(taskId) ? inspection : {
|
|
29
|
+
ok: false,
|
|
30
|
+
reason: "not_found"
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
//#endregion
|
|
35
|
+
export { TaskDeletionService };
|
|
@@ -187,7 +187,28 @@ var TaskRepository = class {
|
|
|
187
187
|
});
|
|
188
188
|
}
|
|
189
189
|
delete(taskId) {
|
|
190
|
-
return
|
|
190
|
+
return runSqliteWriteTransaction((db) => {
|
|
191
|
+
const task = db.prepare("SELECT project_id FROM tasks WHERE task_id = ?").get(taskId);
|
|
192
|
+
if (!task) return false;
|
|
193
|
+
const runIds = db.prepare("SELECT run_id FROM task_runs WHERE task_id = ?").all(taskId).map((row) => row.run_id);
|
|
194
|
+
db.prepare(`DELETE FROM context_edges WHERE owner_kind = 'task' AND owner_id = ?`).run(taskId);
|
|
195
|
+
db.prepare(`DELETE FROM command_deduplication WHERE subject_kind = 'task' AND subject_id = ?`).run(taskId);
|
|
196
|
+
db.prepare(`DELETE FROM domain_outbox WHERE subject_kind = 'task' AND subject_id = ?`).run(taskId);
|
|
197
|
+
const deleted = db.prepare("DELETE FROM tasks WHERE task_id = ?").run(taskId).changes > 0;
|
|
198
|
+
db.prepare(`DELETE FROM context_snapshots WHERE owner_kind = 'task' AND owner_id = ?`).run(taskId);
|
|
199
|
+
if (runIds.length > 0) db.prepare(`DELETE FROM context_snapshots
|
|
200
|
+
WHERE owner_kind = 'task_run' AND owner_id IN (SELECT value FROM json_each(?))`).run(JSON.stringify(runIds));
|
|
201
|
+
const deletedAt = Date.now();
|
|
202
|
+
db.prepare(`INSERT INTO domain_outbox (
|
|
203
|
+
event_id, event_type, subject_kind, subject_id, correlation_id,
|
|
204
|
+
payload_json, created_at
|
|
205
|
+
) VALUES (?, 'task.deleted.v1', 'task', ?, ?, ?, ?)`).run(randomUUID(), taskId, randomUUID(), JSON.stringify({
|
|
206
|
+
taskId,
|
|
207
|
+
...task.project_id ? { projectId: task.project_id } : {},
|
|
208
|
+
deletedAt
|
|
209
|
+
}), deletedAt);
|
|
210
|
+
return deleted;
|
|
211
|
+
});
|
|
191
212
|
}
|
|
192
213
|
insertContract(db, contract) {
|
|
193
214
|
db.prepare(`INSERT INTO task_contracts (
|
|
@@ -15,7 +15,6 @@ import { inferSuggestedProjectDefaultAgentId } from "../../projects/project-agen
|
|
|
15
15
|
import "../../projects/index.js";
|
|
16
16
|
import { setTuiDefaultAgentConfig } from "../../commands/agents.config.js";
|
|
17
17
|
import { evictEmbeddedSessionRunner } from "../../agent/embedded/session-runner.js";
|
|
18
|
-
import { prependEnvelopeTimestamp } from "../../channels/envelope-timestamp.js";
|
|
19
18
|
import { buildSessionTimeline } from "../../session/transcript-outline.js";
|
|
20
19
|
import { transcriptRowsToClientHistory } from "../../session/client-history.js";
|
|
21
20
|
import { SessionIndex } from "../../session/manager.js";
|
|
@@ -24,6 +23,7 @@ import { parseModelRef } from "../../agent/models/selection.js";
|
|
|
24
23
|
import { buildReviewContext, resolveGitRoot } from "../../review/review-git.js";
|
|
25
24
|
import { MessageBus, MessageBusShutdownError } from "../../infra/bus/queue.js";
|
|
26
25
|
import "../../infra/bus/index.js";
|
|
26
|
+
import { prependEnvelopeTimestamp } from "../../channels/envelope-timestamp.js";
|
|
27
27
|
import { getWorkspacePath } from "../../config/workspace-path-helpers.js";
|
|
28
28
|
import "../../config/index.js";
|
|
29
29
|
import { buildWorkflowChildTools } from "../../agent/workflow/workflow-child-tools.js";
|
|
@@ -579,7 +579,8 @@ var EmbeddedBackend = class {
|
|
|
579
579
|
contextWindow: usage.contextWindow,
|
|
580
580
|
contextUsagePercent: usage.usagePercent,
|
|
581
581
|
effectiveWorkspacePath: cfg.effectiveWorkspacePath,
|
|
582
|
-
workingDirectoryLocked: cfg.workingDirectoryLocked
|
|
582
|
+
workingDirectoryLocked: cfg.workingDirectoryLocked,
|
|
583
|
+
projectId: getSessionMetadata(sessionKey)?.projectId
|
|
583
584
|
};
|
|
584
585
|
} catch (err) {
|
|
585
586
|
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
@@ -609,6 +610,7 @@ var EmbeddedBackend = class {
|
|
|
609
610
|
}
|
|
610
611
|
async patchSession(sessionKey, patch) {
|
|
611
612
|
const agent = await this.ensureAgent();
|
|
613
|
+
const hasProjectPatch = Object.prototype.hasOwnProperty.call(patch, "projectId");
|
|
612
614
|
const projectId = typeof patch.projectId === "string" ? patch.projectId.trim() : "";
|
|
613
615
|
const result = await agent.sessionConfig.patch(sessionKey, {
|
|
614
616
|
model: typeof patch.model === "string" ? patch.model : void 0,
|
|
@@ -622,7 +624,7 @@ var EmbeddedBackend = class {
|
|
|
622
624
|
await this.sessionIndexReady;
|
|
623
625
|
await this.sessionIndex?.getStore().resolveTranscriptPath(sessionKey);
|
|
624
626
|
new ProjectService().attachSession(sessionKey, projectId);
|
|
625
|
-
}
|
|
627
|
+
} else if (hasProjectPatch && patch.projectId === null) new ProjectService().detachSession(sessionKey);
|
|
626
628
|
const hiddenFromSessionList = typeof patch.hiddenFromSessionList === "boolean" ? patch.hiddenFromSessionList : void 0;
|
|
627
629
|
const customData = patch.customData && typeof patch.customData === "object" && !Array.isArray(patch.customData) ? patch.customData : void 0;
|
|
628
630
|
if (hiddenFromSessionList !== void 0 || customData !== void 0) {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
-
import { prependEnvelopeTimestamp } from "../../channels/envelope-timestamp.js";
|
|
4
3
|
import { transcriptRowsToClientHistory } from "../../session/client-history.js";
|
|
5
4
|
import { parseModelRef } from "../../agent/models/selection.js";
|
|
5
|
+
import { prependEnvelopeTimestamp } from "../../channels/envelope-timestamp.js";
|
|
6
6
|
import { gatewayCredentialAuthorization } from "../../gateway/credential.js";
|
|
7
7
|
import { RealtimeClient } from "../../../packages/realtime-client/src/index.js";
|
|
8
8
|
import { buildTuiTranscriptTree, transcriptTreeEntryIdToRowNumber } from "../tui-transcript-tree.js";
|
|
@@ -422,6 +422,7 @@ var GatewayRealtimeBackend = class {
|
|
|
422
422
|
if (session) {
|
|
423
423
|
if (session.name) out.displayName = session.name;
|
|
424
424
|
if (session.estimatedTokens != null) out.totalTokens = session.estimatedTokens;
|
|
425
|
+
if (session.projectId?.trim()) out.projectId = session.projectId.trim();
|
|
425
426
|
}
|
|
426
427
|
}
|
|
427
428
|
if (agentCfgRes.ok) {
|
|
@@ -645,12 +646,13 @@ var GatewayRealtimeBackend = class {
|
|
|
645
646
|
});
|
|
646
647
|
const json = await res.json().catch(() => ({}));
|
|
647
648
|
if (!res.ok || json.ok === false) throw new Error(json.error ?? `Session config patch failed (${res.status})`);
|
|
649
|
+
const hasProjectPatch = Object.prototype.hasOwnProperty.call(patch, "projectId");
|
|
648
650
|
const projectId = typeof patch.projectId === "string" ? patch.projectId.trim() : "";
|
|
649
651
|
const hiddenFromSessionList = typeof patch.hiddenFromSessionList === "boolean" ? patch.hiddenFromSessionList : void 0;
|
|
650
652
|
const customData = patch.customData && typeof patch.customData === "object" && !Array.isArray(patch.customData) ? patch.customData : void 0;
|
|
651
|
-
if (
|
|
653
|
+
if (hasProjectPatch || hiddenFromSessionList !== void 0 || customData !== void 0) {
|
|
652
654
|
const metadataPatch = {
|
|
653
|
-
...
|
|
655
|
+
...hasProjectPatch ? { projectId: projectId || null } : {},
|
|
654
656
|
...hiddenFromSessionList !== void 0 ? { hiddenFromSessionList } : {},
|
|
655
657
|
...customData ? { customData } : {}
|
|
656
658
|
};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { stripRuntimeContextFromUserMessage } from "../session/user-message-display.js";
|
|
1
2
|
import { createAssistantMessageFromText } from "./components/assistant-message.js";
|
|
2
3
|
//#region src/tui/chat-history.ts
|
|
3
4
|
function historyMessageKey(message, index) {
|
|
@@ -77,7 +78,7 @@ function appendHistoryToChatLog(chatLog, messages, toolsExpanded, showThinking =
|
|
|
77
78
|
return;
|
|
78
79
|
}
|
|
79
80
|
if (hm.role === "user") {
|
|
80
|
-
chatLog.addUser(historyContentText(hm.content), {
|
|
81
|
+
chatLog.addUser(stripRuntimeContextFromUserMessage(historyContentText(hm.content)), {
|
|
81
82
|
displayIndex,
|
|
82
83
|
historyIndex,
|
|
83
84
|
role: "user"
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { formatAgentRunErrorForDisplay } from "../agent/client-error-format.js";
|
|
2
|
+
import { stripRuntimeContextFromUserContent } from "../session/user-message-display.js";
|
|
2
3
|
import { createAssistantMessageFromText } from "./components/assistant-message.js";
|
|
3
4
|
import { markRunEvent, markRunIdleAfterCompletion } from "./tui-run-state.js";
|
|
4
5
|
//#region src/tui/tui-agent-events.ts
|
|
@@ -175,12 +176,13 @@ function dispatchAgentEvent(event, data, state, chatLog, tui, setActivityStatus,
|
|
|
175
176
|
break;
|
|
176
177
|
case "user_message": {
|
|
177
178
|
const message = p.message;
|
|
178
|
-
|
|
179
|
+
const content = Array.isArray(message?.content) || typeof message?.content === "string" ? stripRuntimeContextFromUserContent(message.content) : [];
|
|
180
|
+
chatLog.addUser(content);
|
|
179
181
|
tui.requestRender();
|
|
180
182
|
break;
|
|
181
183
|
}
|
|
182
184
|
case "user_transcript":
|
|
183
|
-
chatLog.addUser(String(p.text ?? ""));
|
|
185
|
+
chatLog.addUser(stripRuntimeContextFromUserContent(String(p.text ?? "")));
|
|
184
186
|
tui.requestRender();
|
|
185
187
|
break;
|
|
186
188
|
case "assistant_message_start": {
|
|
@@ -109,6 +109,7 @@ export type CommandHandlerDeps = {
|
|
|
109
109
|
extensionShortcuts?: TuiHotkeyExtensionShortcut[];
|
|
110
110
|
currentAgentId?: string;
|
|
111
111
|
setSession?: (rawKey: string) => Promise<void>;
|
|
112
|
+
newSession?: () => Promise<void>;
|
|
112
113
|
resetSession?: () => Promise<void>;
|
|
113
114
|
recoverStream?: () => void | Promise<void>;
|
|
114
115
|
retryLastMessage?: () => void | Promise<void>;
|
|
@@ -584,6 +584,7 @@ function runTuiProjectCommand(state, args) {
|
|
|
584
584
|
...parsed.projectKind ? { projectKind: parsed.projectKind } : {}
|
|
585
585
|
});
|
|
586
586
|
projects.attachSession(state.currentSessionKey, project.id);
|
|
587
|
+
state.sessionInfo.projectId = project.id;
|
|
587
588
|
return `Created and attached project:\n${formatTuiProject(project)}`;
|
|
588
589
|
}
|
|
589
590
|
if (subcommand === "switch" || subcommand === "attach") {
|
|
@@ -592,10 +593,12 @@ function runTuiProjectCommand(state, args) {
|
|
|
592
593
|
const project = resolveTuiProject(projects, ref);
|
|
593
594
|
if (!project) return `Project not found: ${ref}`;
|
|
594
595
|
projects.attachSession(state.currentSessionKey, project.id);
|
|
596
|
+
state.sessionInfo.projectId = project.id;
|
|
595
597
|
return `Attached current session to project: ${project.name}`;
|
|
596
598
|
}
|
|
597
599
|
if (subcommand === "detach") {
|
|
598
600
|
projects.detachSession(state.currentSessionKey);
|
|
601
|
+
state.sessionInfo.projectId = void 0;
|
|
599
602
|
return "Detached current session from project.";
|
|
600
603
|
}
|
|
601
604
|
if (subcommand === "archive") {
|
|
@@ -1260,9 +1263,11 @@ function createTuiCommandHandler(deps) {
|
|
|
1260
1263
|
(async () => {
|
|
1261
1264
|
try {
|
|
1262
1265
|
await abortActive();
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
+
if (deps.newSession) {
|
|
1267
|
+
await deps.newSession();
|
|
1268
|
+
chatLog.addSystem(`new session: ${state.currentSessionKey}`);
|
|
1269
|
+
} else if (setSession) {
|
|
1270
|
+
await setSession(`tui-${randomUUID()}`);
|
|
1266
1271
|
chatLog.addSystem(`new session: ${state.currentSessionKey}`);
|
|
1267
1272
|
} else {
|
|
1268
1273
|
chatLog.clearAll();
|
|
@@ -8,4 +8,3 @@ export declare const GENERATED_TUI_SESSION_SHELL_PATCH: {
|
|
|
8
8
|
export declare function isGeneratedTuiSessionKey(sessionKey: string): boolean;
|
|
9
9
|
export declare function deleteGeneratedTuiSessionIfEmpty(client: Pick<TuiBackend, 'getSessionStats' | 'deleteSession'>, sessionKey: string): Promise<boolean>;
|
|
10
10
|
export declare function cleanupAbandonedTuiSessions(client: Pick<TuiBackend, 'listSessions' | 'getSessionStats' | 'deleteSession'>, currentSessionKey: string, nowMs?: number): Promise<string[]>;
|
|
11
|
-
export declare function hideLegacyEmptyTuiSessions(client: Pick<TuiBackend, 'listSessions' | 'patchSession'>): Promise<string[]>;
|
|
@@ -23,15 +23,5 @@ async function cleanupAbandonedTuiSessions(client, currentSessionKey, nowMs = Da
|
|
|
23
23
|
for (const session of candidates) if (await deleteGeneratedTuiSessionIfEmpty(client, session.key)) deleted.push(session.key);
|
|
24
24
|
return deleted;
|
|
25
25
|
}
|
|
26
|
-
async function hideLegacyEmptyTuiSessions(client) {
|
|
27
|
-
const sessions = await client.listSessions();
|
|
28
|
-
const hidden = [];
|
|
29
|
-
for (const session of sessions) {
|
|
30
|
-
if (session.messageCount !== 0 || !isGeneratedTuiSessionKey(session.key)) continue;
|
|
31
|
-
await client.patchSession(session.key, GENERATED_TUI_SESSION_SHELL_PATCH);
|
|
32
|
-
hidden.push(session.key);
|
|
33
|
-
}
|
|
34
|
-
return hidden;
|
|
35
|
-
}
|
|
36
26
|
//#endregion
|
|
37
|
-
export { GENERATED_TUI_SESSION_SHELL_PATCH, cleanupAbandonedTuiSessions, deleteGeneratedTuiSessionIfEmpty,
|
|
27
|
+
export { GENERATED_TUI_SESSION_SHELL_PATCH, cleanupAbandonedTuiSessions, deleteGeneratedTuiSessionIfEmpty, isGeneratedTuiSessionKey };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type AgentModelPreference, type NewSessionPreferences, type SessionInitialAgentConfig } from '@xopcai/gateway-contract';
|
|
2
|
+
import type { TuiSettings } from './tui-settings.js';
|
|
3
|
+
export declare function tuiGatewayPreferenceKey(url?: string): string;
|
|
4
|
+
export declare function getTuiNewSessionPreferences(settings: TuiSettings, gatewayKey: string): NewSessionPreferences;
|
|
5
|
+
export declare function rememberTuiSessionContext(settings: TuiSettings, gatewayKey: string, context: {
|
|
6
|
+
agentId: string;
|
|
7
|
+
projectId?: string | null;
|
|
8
|
+
}): TuiSettings;
|
|
9
|
+
export declare function rememberTuiAgentModel(settings: TuiSettings, gatewayKey: string, agentId: string, preference: AgentModelPreference): TuiSettings;
|
|
10
|
+
export declare function tuiInitialAgentConfig(settings: TuiSettings, gatewayKey: string, agentId: string): SessionInitialAgentConfig | undefined;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { createDefaultNewSessionPreferences, modelPreferenceForAgent, withAgentModelPreference, withLastChatScope, withSelectedAgent } from "../../packages/gateway-contract/src/new-session.js";
|
|
2
|
+
//#region src/tui/tui-new-session-preferences.ts
|
|
3
|
+
function tuiGatewayPreferenceKey(url) {
|
|
4
|
+
return url?.trim() || "local";
|
|
5
|
+
}
|
|
6
|
+
function getTuiNewSessionPreferences(settings, gatewayKey) {
|
|
7
|
+
return settings.newSessionPreferencesByGateway[gatewayKey] ?? createDefaultNewSessionPreferences();
|
|
8
|
+
}
|
|
9
|
+
function withPreferences(settings, gatewayKey, preferences) {
|
|
10
|
+
return {
|
|
11
|
+
...settings,
|
|
12
|
+
newSessionPreferencesByGateway: {
|
|
13
|
+
...settings.newSessionPreferencesByGateway,
|
|
14
|
+
[gatewayKey]: preferences
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
function rememberTuiSessionContext(settings, gatewayKey, context) {
|
|
19
|
+
return withPreferences(settings, gatewayKey, withLastChatScope(withSelectedAgent(getTuiNewSessionPreferences(settings, gatewayKey), context.agentId), context.projectId));
|
|
20
|
+
}
|
|
21
|
+
function rememberTuiAgentModel(settings, gatewayKey, agentId, preference) {
|
|
22
|
+
return withPreferences(settings, gatewayKey, withAgentModelPreference(getTuiNewSessionPreferences(settings, gatewayKey), agentId, preference));
|
|
23
|
+
}
|
|
24
|
+
function tuiInitialAgentConfig(settings, gatewayKey, agentId) {
|
|
25
|
+
const preference = modelPreferenceForAgent(getTuiNewSessionPreferences(settings, gatewayKey), agentId);
|
|
26
|
+
return preference ? {
|
|
27
|
+
model: preference.modelRef,
|
|
28
|
+
...preference.thinkingLevel ? { thinkingLevel: preference.thinkingLevel } : {}
|
|
29
|
+
} : void 0;
|
|
30
|
+
}
|
|
31
|
+
//#endregion
|
|
32
|
+
export { getTuiNewSessionPreferences, rememberTuiAgentModel, rememberTuiSessionContext, tuiGatewayPreferenceKey, tuiInitialAgentConfig };
|
|
@@ -15,6 +15,7 @@ export type SessionActionsContext = {
|
|
|
15
15
|
historyLimit?: number;
|
|
16
16
|
onAgentIdChange?: (agentId: string) => void;
|
|
17
17
|
sessionSnapshot?: TuiSessionSnapshot;
|
|
18
|
+
onSessionInfoChange?: () => void;
|
|
18
19
|
};
|
|
19
20
|
export declare function createSessionActions(context: SessionActionsContext): {
|
|
20
21
|
refreshSessionInfo: () => Promise<void>;
|
|
@@ -6,7 +6,7 @@ import { clearSeenStreamEvents } from "./tui-agent-events.js";
|
|
|
6
6
|
//#region src/tui/tui-session-actions.ts
|
|
7
7
|
init_agent_session_key();
|
|
8
8
|
function createSessionActions(context) {
|
|
9
|
-
const { client, chatLog, tui, state, resolveSessionKey, updateHeader, updateFooter, setActivityStatus, historyLimit = 200, onAgentIdChange, sessionSnapshot } = context;
|
|
9
|
+
const { client, chatLog, tui, state, resolveSessionKey, updateHeader, updateFooter, setActivityStatus, historyLimit = 200, onAgentIdChange, sessionSnapshot, onSessionInfoChange } = context;
|
|
10
10
|
let refreshSessionInfoPromise = Promise.resolve();
|
|
11
11
|
let lastHistoryKeys = [];
|
|
12
12
|
const updateAgentFromSessionKey = (key) => {
|
|
@@ -17,6 +17,7 @@ function createSessionActions(context) {
|
|
|
17
17
|
const runRefreshSessionInfo = async () => {
|
|
18
18
|
try {
|
|
19
19
|
state.sessionInfo = await client.getSessionInfo(state.currentSessionKey);
|
|
20
|
+
onSessionInfoChange?.();
|
|
20
21
|
updateFooter();
|
|
21
22
|
tui.requestRender();
|
|
22
23
|
} catch {}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type NewSessionPreferences } from '@xopcai/gateway-contract';
|
|
1
2
|
export type TuiThemeId = 'auto' | 'dark' | 'light' | (string & {});
|
|
2
3
|
export type DoubleEscapeAction = 'none' | 'tree' | 'fork';
|
|
3
4
|
export type TreeFilterMode = 'default' | 'no-tools' | 'user-only' | 'labeled-only' | 'all';
|
|
@@ -24,6 +25,7 @@ export interface TuiSettings {
|
|
|
24
25
|
clearOnShrink: boolean;
|
|
25
26
|
/** Default transcript filter when opening `/tree`. */
|
|
26
27
|
treeFilterMode: TreeFilterMode;
|
|
28
|
+
newSessionPreferencesByGateway: Record<string, NewSessionPreferences>;
|
|
27
29
|
}
|
|
28
30
|
export declare const DEFAULT_TUI_SETTINGS: TuiSettings;
|
|
29
31
|
/** Load persisted TUI settings from `~/.xopc/tui-settings.json`. */
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { resolveStateDir } from "../config/paths-state.js";
|
|
2
2
|
import { init_paths } from "../config/paths.js";
|
|
3
|
+
import { parseNewSessionPreferences } from "../../packages/gateway-contract/src/new-session.js";
|
|
3
4
|
import { join } from "node:path";
|
|
4
5
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
5
6
|
//#region src/tui/tui-settings.ts
|
|
@@ -17,7 +18,8 @@ const DEFAULT_TUI_SETTINGS = {
|
|
|
17
18
|
editorPaddingX: 0,
|
|
18
19
|
autocompleteMaxVisible: 5,
|
|
19
20
|
clearOnShrink: false,
|
|
20
|
-
treeFilterMode: "default"
|
|
21
|
+
treeFilterMode: "default",
|
|
22
|
+
newSessionPreferencesByGateway: {}
|
|
21
23
|
};
|
|
22
24
|
const SETTINGS_PATH = join(resolveStateDir(), "tui-settings.json");
|
|
23
25
|
function isDoubleEscapeAction(value) {
|
|
@@ -43,6 +45,7 @@ function normalizeSettings(raw) {
|
|
|
43
45
|
if (typeof obj.autocompleteMaxVisible === "number" && Number.isFinite(obj.autocompleteMaxVisible)) base.autocompleteMaxVisible = Math.max(3, Math.min(20, Math.floor(obj.autocompleteMaxVisible)));
|
|
44
46
|
if (typeof obj.clearOnShrink === "boolean") base.clearOnShrink = obj.clearOnShrink;
|
|
45
47
|
if (isTreeFilterMode(obj.treeFilterMode)) base.treeFilterMode = obj.treeFilterMode;
|
|
48
|
+
if (obj.newSessionPreferencesByGateway && typeof obj.newSessionPreferencesByGateway === "object" && !Array.isArray(obj.newSessionPreferencesByGateway)) base.newSessionPreferencesByGateway = Object.fromEntries(Object.entries(obj.newSessionPreferencesByGateway).map(([gatewayId, preferences]) => [gatewayId, parseNewSessionPreferences(preferences)]));
|
|
46
49
|
return base;
|
|
47
50
|
}
|
|
48
51
|
/** Load persisted TUI settings from `~/.xopc/tui-settings.json`. */
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { resolveStateDir } from "../config/paths-state.js";
|
|
2
|
-
import { init_paths, resolveAgentProfileDir, resolveBundledSkillsDir } from "../config/paths.js";
|
|
3
2
|
import { resolveEffectiveAgentProfileForSession } from "../config/agent-profile.js";
|
|
3
|
+
import { init_paths, resolveAgentProfileDir, resolveBundledSkillsDir } from "../config/paths.js";
|
|
4
4
|
import { resolveBootstrapFilesSync } from "../agent/bootstrap/bootstrap-files.js";
|
|
5
5
|
import { createSkillConfigManager, isSkillEnabled } from "../agent/skills/config.js";
|
|
6
6
|
import { loadSkills } from "../agent/skills/index.js";
|