@xopcai/xopc 0.0.124 → 0.0.126
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 +56 -102
- package/README.zh-CN.md +51 -98
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/feishu/src/schema/config-schema.d.ts +6 -6
- package/dist/extensions/feishu/src/workflow-progress.js +1 -1
- package/dist/extensions/telegram/src/adapters/streaming-adapter.js +1 -1
- package/dist/extensions/telegram/src/config-schema.d.ts +8 -8
- package/dist/extensions/telegram/src/inbound-processor.js +1 -1
- package/dist/extensions/telegram/src/plugin.js +1 -1
- package/dist/extensions/telegram/src/routing-integration.js +2 -2
- package/dist/extensions/telegram/src/workflow-progress.js +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/extensions/weixin/src/api/api.js +1 -1
- package/dist/extensions/weixin/src/config-schema.d.ts +3 -3
- package/dist/extensions/weixin/src/plugin.js +1 -1
- package/dist/extensions/weixin/src/workflow-progress.js +1 -1
- package/dist/gateway/static/root/assets/Combination-BzaXOLd9.js +41 -0
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-B5uSVAyJ.js → agent-avatar-dicebear-C70vgt60.js} +1 -1
- package/dist/gateway/static/root/assets/agents-DRYVahI-.js +2 -0
- package/dist/gateway/static/root/assets/app-management-settings-panel-D9-HW6cy.js +1 -0
- package/dist/gateway/static/root/assets/appearance-settings-BHlahIDL.js +1 -0
- package/dist/gateway/static/root/assets/apps-page-BdJ1eQg3.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-CXUGRp2i.js → archive-plugin-B-aoIt0w.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-Cmiub3Wg.js → attachment-load-BD0G0FD5.js} +1 -1
- package/dist/gateway/static/root/assets/automation-suggestion-card-iJRVI7aZ.js +1 -0
- package/dist/gateway/static/root/assets/automations-page-D8hYQbkl.js +4 -0
- package/dist/gateway/static/root/assets/{binary-plugins-0Izz-N3p.js → binary-plugins-B0mNlVSz.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-C1Kv0IkJ.js → block-editor-CJY9Lu5G.js} +3 -3
- package/dist/gateway/static/root/assets/browser-settings-page-CiWEO-Iy.js +8 -0
- package/dist/gateway/static/root/assets/capability-presets-api-Bgc8ag55.js +1 -0
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-B1nIi0TC.js +1 -0
- package/dist/gateway/static/root/assets/{channel-recipient-api-BeA2aVor.js → channel-recipient-api-0sauApoC.js} +1 -1
- package/dist/gateway/static/root/assets/channels-settings-BddPdqVo.js +1 -0
- package/dist/gateway/static/root/assets/code-editor-gbRgS14t.js +1 -0
- package/dist/gateway/static/root/assets/connectors-page-Ba2GDhSE.js +2 -0
- package/dist/gateway/static/root/assets/{directory-picker-path-field-2rjzUu57.js → directory-picker-path-field-CiEc4KmY.js} +1 -1
- package/dist/gateway/static/root/assets/dist-By6Rh2ee.js +1 -0
- package/dist/gateway/static/root/assets/dist-CkobR7mk.js +1 -0
- package/dist/gateway/static/root/assets/dist-DokQNVMQ.js +1 -0
- package/dist/gateway/static/root/assets/dreaming-settings-4bvpk5wr.js +3 -0
- package/dist/gateway/static/root/assets/extension-debug-page-BbyczVZ3.js +1 -0
- package/dist/gateway/static/root/assets/extension-page-DLN1I3DR.js +1 -0
- package/dist/gateway/static/root/assets/extension-settings-page-D9VGHmYJ.js +1 -0
- package/dist/gateway/static/root/assets/{fetch-BU5S0Sn7.js → fetch-5V96dUz3.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-api-BIPGwrl1.js → gateway-config-api-BtIzObwp.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-settings-KFsGGDhg.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-startup-retry-Cd0Zz30N.js → gateway-startup-retry-DEMad2wt.js} +1 -1
- package/dist/gateway/static/root/assets/goal-create-dialog-4PcF6Sh6.js +1 -0
- package/dist/gateway/static/root/assets/goal-detail-page-B482PSaG.js +1 -0
- package/dist/gateway/static/root/assets/{goals-config-api-B95KdGMj.js → goals-config-api-CVN7-pdM.js} +1 -1
- package/dist/gateway/static/root/assets/goals-page-CUdgJuDn.js +2 -0
- package/dist/gateway/static/root/assets/goals-settings-IYCH3-Pi.js +1 -0
- package/dist/gateway/static/root/assets/heartbeat-settings-Cf_a2Bmz.js +1 -0
- package/dist/gateway/static/root/assets/{html-workspace-editor-CQLWDiwE.js → html-workspace-editor-DV90ddkE.js} +1 -1
- package/dist/gateway/static/root/assets/index-CA2tR2vm.js +256 -0
- package/dist/gateway/static/root/assets/index-Ds3u0LOk.css +1 -0
- package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-lKTg6St7.js +1 -0
- package/dist/gateway/static/root/assets/logs-page-BCporcNH.js +2 -0
- package/dist/gateway/static/root/assets/{markdown-editor-AssmZFx4.js → markdown-editor-BFOjBBla.js} +2 -2
- package/dist/gateway/static/root/assets/markdown-split-Bv4k6iGJ.js +1 -0
- package/dist/gateway/static/root/assets/{media-plugins-BhIQU5yS.js → media-plugins-Bbi8g3N8.js} +1 -1
- package/dist/gateway/static/root/assets/messages-C22hxE1N.js +3 -0
- package/dist/gateway/static/root/assets/models-hub-panel-D68Pyow7.js +2 -0
- package/dist/gateway/static/root/assets/notes-page-CuUMOiyv.js +1 -0
- package/dist/gateway/static/root/assets/notes-workbench-Dx2N5zTk.js +2 -0
- package/dist/gateway/static/root/assets/page-tabs-Cp395RYD.js +1 -0
- package/dist/gateway/static/root/assets/{preview-open-alternatives-DGzet1d7.js → preview-open-alternatives-DqV5OM4m.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-sB8AzZi3.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-LBnJqWK2.js +1 -0
- package/dist/gateway/static/root/assets/remote-access-hub-Dbj0o6SC.js +1 -0
- package/dist/gateway/static/root/assets/{save-bar-controls-Cqgb-jqa.js → save-bar-controls-BItmzAzI.js} +1 -1
- package/dist/gateway/static/root/assets/{schedule-field-DVZcI8Yt.js → schedule-field-BQ8IjjCn.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-Bj7sOxC8.js → schema-form-BRpD6x3d.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-DhDZKspB.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-BvXLMNL6.js +1 -0
- package/dist/gateway/static/root/assets/{settings-collapsible-section-BmXn-8N6.js → settings-collapsible-section-BKSPQM4R.js} +1 -1
- package/dist/gateway/static/root/assets/settings-form-section-BmyfthNQ.js +1 -0
- package/dist/gateway/static/root/assets/settings-page-Cfm9UxAr.js +1 -0
- package/dist/gateway/static/root/assets/settings-page-layout-Bls5tfbH.js +1 -0
- package/dist/gateway/static/root/assets/setup-status-panel-kQEsTGAs.js +1 -0
- package/dist/gateway/static/root/assets/{share-preview-page-IB1v8i86.js → share-preview-page-DbYZNAPb.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-BtR4B0kn.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-CJNVOWoK.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-DcWDHrt3.js +2 -0
- package/dist/gateway/static/root/assets/{system-settings-panel-BxQ384RC.js → system-settings-panel-DKDAojWM.js} +1 -1
- package/dist/gateway/static/root/assets/{typed-models-lib-BkcpvFYO.js → typed-models-lib-BCCV4Kkp.js} +1 -1
- package/dist/gateway/static/root/assets/{use-channel-catalog-Cd0FaEQ4.js → use-channel-catalog-NBqg3iFY.js} +1 -1
- package/dist/gateway/static/root/assets/{user-profile-settings-panel-DQ7NnRSY.js → user-profile-settings-panel-suQ2x-LB.js} +1 -1
- package/dist/gateway/static/root/assets/{utils-YKhVf7Ka.js → utils-DPGVr3tS.js} +1 -1
- package/dist/gateway/static/root/assets/{vendor-codemirror-CNP1wPe7.js → vendor-codemirror-BvNgyE1Q.js} +1 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-DaJASKFP.js +1 -0
- package/dist/gateway/static/root/assets/work-item-detail-page-BrCZpAWh.js +1 -0
- package/dist/gateway/static/root/assets/workflow-run-setup-panel-BTkRVNAh.js +3 -0
- package/dist/gateway/static/root/assets/{workflow-start-dialog-BNJVCWoS.js → workflow-start-dialog-DAImVtdO.js} +1 -1
- package/dist/gateway/static/root/assets/workflows-page-vyJ8wSXm.js +18 -0
- package/dist/gateway/static/root/index.html +8 -7
- package/dist/package.js +1 -1
- package/dist/src/activity/context.d.ts +11 -0
- package/dist/src/activity/context.js +36 -0
- package/dist/src/activity/context.js.map +1 -0
- package/dist/src/activity/emitter.d.ts +6 -0
- package/dist/src/activity/emitter.js +43 -0
- package/dist/src/activity/emitter.js.map +1 -0
- package/dist/src/activity/index.d.ts +3 -0
- package/dist/src/activity/index.js +3 -0
- package/dist/src/activity/service.d.ts +12 -0
- package/dist/src/activity/service.js +59 -0
- package/dist/src/activity/service.js.map +1 -0
- package/dist/src/activity/types.d.ts +109 -0
- package/dist/src/activity/types.js +1 -0
- package/dist/src/agent/agent-manager.d.ts +7 -0
- package/dist/src/agent/agent-manager.js +12 -5
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/child-agent-factory.d.ts +2 -0
- package/dist/src/agent/child-agent-factory.js +2 -0
- package/dist/src/agent/child-agent-factory.js.map +1 -1
- package/dist/src/agent/coding/index.d.ts +1 -0
- package/dist/src/agent/coding/index.js +2 -0
- package/dist/src/agent/coding/turn-diff-tracker.d.ts +67 -0
- package/dist/src/agent/coding/turn-diff-tracker.js +233 -0
- package/dist/src/agent/coding/turn-diff-tracker.js.map +1 -0
- package/dist/src/agent/context/project-context.js +2 -2
- package/dist/src/agent/context/workspace-seed.js +2 -2
- package/dist/src/agent/embedded/run-for-session.js +1 -1
- package/dist/src/agent/goals/post-turn.js +2 -2
- package/dist/src/agent/ipc/bus.js +1 -1
- package/dist/src/agent/mcp/bundle-mcp-materialize.js +1 -1
- package/dist/src/agent/mcp/bundle-mcp-runtime.js +1 -1
- package/dist/src/agent/mcp/mcp-transport-config.js +1 -1
- package/dist/src/agent/mcp/mcp-transport.js +1 -1
- package/dist/src/agent/memory/dreaming/config.d.ts +2 -2
- package/dist/src/agent/memory/dreaming/config.js +3 -3
- package/dist/src/agent/memory/dreaming/config.js.map +1 -1
- package/dist/src/agent/memory/dreaming/constants.d.ts +1 -1
- package/dist/src/agent/memory/dreaming/constants.js +1 -1
- package/dist/src/agent/memory/dreaming/constants.js.map +1 -1
- package/dist/src/agent/memory/dreaming/deep-promotion.d.ts +1 -0
- package/dist/src/agent/memory/dreaming/deep-promotion.js +11 -20
- package/dist/src/agent/memory/dreaming/deep-promotion.js.map +1 -1
- package/dist/src/agent/memory/dreaming/events.d.ts +3 -3
- package/dist/src/agent/memory/dreaming/events.js +6 -6
- package/dist/src/agent/memory/dreaming/events.js.map +1 -1
- package/dist/src/agent/memory/dreaming/last-run.d.ts +2 -2
- package/dist/src/agent/memory/dreaming/last-run.js +1 -1
- package/dist/src/agent/memory/dreaming/last-run.js.map +1 -1
- package/dist/src/agent/memory/dreaming/light-sweep.d.ts +1 -1
- package/dist/src/agent/memory/dreaming/light-sweep.js +3 -3
- package/dist/src/agent/memory/dreaming/light-sweep.js.map +1 -1
- package/dist/src/agent/memory/dreaming/preview.d.ts +1 -0
- package/dist/src/agent/memory/dreaming/preview.js +2 -2
- package/dist/src/agent/memory/dreaming/preview.js.map +1 -1
- package/dist/src/agent/memory/dreaming/rem-patterns.d.ts +1 -1
- package/dist/src/agent/memory/dreaming/rem-patterns.js +13 -13
- package/dist/src/agent/memory/dreaming/rem-patterns.js.map +1 -1
- package/dist/src/agent/memory/dreaming/scope.d.ts +14 -0
- package/dist/src/agent/memory/dreaming/scope.js +27 -0
- package/dist/src/agent/memory/dreaming/scope.js.map +1 -0
- package/dist/src/agent/memory/dreaming/short-term-store.d.ts +4 -4
- package/dist/src/agent/memory/dreaming/short-term-store.js +17 -17
- package/dist/src/agent/memory/dreaming/short-term-store.js.map +1 -1
- package/dist/src/agent/memory/plugin-discovery.js +1 -1
- package/dist/src/agent/models/manager.js +1 -1
- package/dist/src/agent/orchestration/agent-event-handler.d.ts +2 -0
- package/dist/src/agent/orchestration/agent-event-handler.js +13 -0
- package/dist/src/agent/orchestration/agent-event-handler.js.map +1 -1
- package/dist/src/agent/orchestration/agent-orchestrator.js +22 -12
- package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
- package/dist/src/agent/sandbox/command-validator.js +12 -0
- package/dist/src/agent/sandbox/command-validator.js.map +1 -1
- package/dist/src/agent/service.d.ts +2 -1
- package/dist/src/agent/service.js +24 -9
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/service.types.d.ts +7 -0
- package/dist/src/agent/session/session-inspector.d.ts +5 -3
- package/dist/src/agent/session/session-inspector.js +17 -8
- package/dist/src/agent/session/session-inspector.js.map +1 -1
- package/dist/src/agent/skills/hub-pull.js +1 -1
- package/dist/src/agent/source-context/types.d.ts +1 -1
- package/dist/src/agent/source-context/types.js +1 -1
- package/dist/src/agent/source-context/types.js.map +1 -1
- package/dist/src/agent/tool-manuals/index.js +15 -6
- package/dist/src/agent/tool-manuals/index.js.map +1 -1
- package/dist/src/agent/tool-manuals/xopc-use.d.ts +1 -0
- package/dist/src/agent/tool-manuals/xopc-use.js +204 -0
- package/dist/src/agent/tool-manuals/xopc-use.js.map +1 -0
- package/dist/src/agent/tools/apply-patch.js +116 -62
- package/dist/src/agent/tools/apply-patch.js.map +1 -1
- package/dist/src/agent/tools/concurrency.d.ts +8 -0
- package/dist/src/agent/tools/concurrency.js +31 -0
- package/dist/src/agent/tools/concurrency.js.map +1 -0
- package/dist/src/agent/tools/dreaming-tool.d.ts +2 -0
- package/dist/src/agent/tools/dreaming-tool.js +13 -10
- package/dist/src/agent/tools/dreaming-tool.js.map +1 -1
- package/dist/src/agent/tools/exec-command.js +4 -0
- package/dist/src/agent/tools/exec-command.js.map +1 -1
- package/dist/src/agent/tools/executor.d.ts +6 -4
- package/dist/src/agent/tools/executor.js +7 -4
- package/dist/src/agent/tools/executor.js.map +1 -1
- package/dist/src/agent/tools/factory.d.ts +10 -0
- package/dist/src/agent/tools/factory.js +16 -1
- package/dist/src/agent/tools/factory.js.map +1 -1
- package/dist/src/agent/tools/find.js +2 -0
- package/dist/src/agent/tools/find.js.map +1 -1
- package/dist/src/agent/tools/goal-tool.js +2 -2
- package/dist/src/agent/tools/grep.js +2 -0
- package/dist/src/agent/tools/grep.js.map +1 -1
- package/dist/src/agent/tools/index.d.ts +3 -0
- package/dist/src/agent/tools/index.js +4 -1
- package/dist/src/agent/tools/list-dir.js +2 -0
- package/dist/src/agent/tools/list-dir.js.map +1 -1
- package/dist/src/agent/tools/memory-tool.d.ts +1 -0
- package/dist/src/agent/tools/memory-tool.js +2 -2
- package/dist/src/agent/tools/memory-tool.js.map +1 -1
- package/dist/src/agent/tools/metadata.d.ts +15 -0
- package/dist/src/agent/tools/metadata.js +26 -0
- package/dist/src/agent/tools/metadata.js.map +1 -0
- package/dist/src/agent/tools/read.js +2 -0
- package/dist/src/agent/tools/read.js.map +1 -1
- package/dist/src/agent/tools/workflow-tool.js +1 -1
- package/dist/src/agent/tools/write.js +6 -0
- package/dist/src/agent/tools/write.js.map +1 -1
- package/dist/src/agent/tools/xopc-use-tool.d.ts +34 -0
- package/dist/src/agent/tools/xopc-use-tool.js +636 -0
- package/dist/src/agent/tools/xopc-use-tool.js.map +1 -0
- package/dist/src/agent/workflow/subagent-runner.d.ts +1 -0
- package/dist/src/agent/workflow/subagent-runner.js +5 -1
- package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
- package/dist/src/agent/workflow/workflow-child-tools.js +5 -0
- package/dist/src/agent/workflow/workflow-child-tools.js.map +1 -1
- package/dist/src/agent-manifest/schema.d.ts +27 -27
- package/dist/src/automations/api/routes.js +1 -1
- package/dist/src/automations/domain/validation.d.ts +55 -55
- package/dist/src/automations/draft/automation-draft-validator.d.ts +25 -25
- package/dist/src/automations/service/action-executor.js +2 -2
- package/dist/src/browser/cdp-local-launcher.js +1 -1
- package/dist/src/browser/providers/browser-ext-install.js +3 -3
- package/dist/src/browser/providers/cloakbrowser.js +2 -2
- package/dist/src/browser/providers/playwright-doctor.js +1 -1
- package/dist/src/browser/stealth.js +1 -1
- package/dist/src/chat-commands/agent-edit.js +1 -1
- package/dist/src/chat-commands/builtins/config.js +1 -1
- package/dist/src/chat-commands/builtins/goal.js +2 -2
- package/dist/src/chat-commands/context.js +1 -1
- package/dist/src/cli/commands/agent.js +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +2 -2
- package/dist/src/cli/commands/doctor/checks/session-integrity.js +1 -1
- package/dist/src/cli/commands/extension-marketplace.js +1 -1
- package/dist/src/cli/commands/extension-pack.js +1 -1
- package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
- package/dist/src/cli/commands/goal.js +3 -3
- package/dist/src/cli/commands/init.js +1 -1
- package/dist/src/cli/commands/project.js +4 -4
- package/dist/src/config/agent-profile.js +1 -1
- package/dist/src/config/gateway-bind.js +1 -1
- package/dist/src/config/index.js +1 -1
- package/dist/src/config/loader.js +1 -1
- package/dist/src/config/models-json.d.ts +14 -14
- package/dist/src/config/models-json.js +1 -1
- package/dist/src/config/schema.d.ts +60 -60
- package/dist/src/connectors/health.d.ts +2 -1
- package/dist/src/connectors/health.js +59 -1
- package/dist/src/connectors/health.js.map +1 -1
- package/dist/src/connectors/install.d.ts +1 -0
- package/dist/src/connectors/install.js +28 -1
- package/dist/src/connectors/install.js.map +1 -1
- package/dist/src/connectors/instances.js +7 -0
- package/dist/src/connectors/instances.js.map +1 -1
- package/dist/src/connectors/materialize.js +2 -1
- package/dist/src/connectors/materialize.js.map +1 -1
- package/dist/src/connectors/registries/modelscope.js +38 -13
- package/dist/src/connectors/registries/modelscope.js.map +1 -1
- package/dist/src/connectors/types.d.ts +2 -0
- package/dist/src/daemon/launchd.js +1 -1
- package/dist/src/daemon/systemd.js +1 -1
- package/dist/src/extensions/discover-extensions.js +1 -1
- package/dist/src/extensions/loader.js +2 -2
- package/dist/src/gateway/agents-admin.js +1 -1
- package/dist/src/gateway/dreaming-automation-reconciler.d.ts +1 -0
- package/dist/src/gateway/dreaming-automation-reconciler.js +62 -42
- package/dist/src/gateway/dreaming-automation-reconciler.js.map +1 -1
- package/dist/src/gateway/hono/app.js +7 -1
- package/dist/src/gateway/hono/app.js.map +1 -1
- package/dist/src/gateway/hono/lib/config-payload.d.ts +14 -14
- package/dist/src/gateway/hono/lib/static-ui.js +1 -1
- package/dist/src/gateway/hono/middleware/log-context.js +8 -1
- package/dist/src/gateway/hono/middleware/log-context.js.map +1 -1
- package/dist/src/gateway/hono/routes/activity.d.ts +14 -0
- package/dist/src/gateway/hono/routes/activity.js +72 -0
- package/dist/src/gateway/hono/routes/activity.js.map +1 -0
- package/dist/src/gateway/hono/routes/connectors.js +46 -2
- package/dist/src/gateway/hono/routes/connectors.js.map +1 -1
- package/dist/src/gateway/hono/routes/dreaming.js +111 -66
- package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
- package/dist/src/gateway/hono/routes/goals.js +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 +2 -2
- package/dist/src/gateway/hono/routes/projects.js +903 -50
- package/dist/src/gateway/hono/routes/projects.js.map +1 -1
- package/dist/src/gateway/hono/routes/sessions.js +102 -2
- package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
- package/dist/src/gateway/hono/routes/workflows.js +2 -2
- package/dist/src/gateway/lock.js +1 -1
- package/dist/src/gateway/ports.js +1 -1
- package/dist/src/gateway/service/sessions-api.d.ts +10 -0
- package/dist/src/gateway/service/sessions-api.js +31 -0
- package/dist/src/gateway/service/sessions-api.js.map +1 -1
- package/dist/src/gateway/service.js +28 -16
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/goals/goal-store.js +1 -1
- package/dist/src/goals/goal-store.js.map +1 -1
- package/dist/src/goals/goal-workflow-judge.js +1 -1
- package/dist/src/infra/ports.js +1 -1
- package/dist/src/infra/ssh-tunnel.js +1 -1
- package/dist/src/infra/update-check.js +1 -1
- package/dist/src/infra/update-restart.js +1 -1
- package/dist/src/mcp/channel-bridge.js +1 -1
- package/dist/src/media/store.js +1 -1
- package/dist/src/media/store.js.map +1 -1
- package/dist/src/media/types.d.ts +1 -1
- package/dist/src/media/uri.js +2 -1
- package/dist/src/media/uri.js.map +1 -1
- package/dist/src/migrations/runner.js +1 -1
- package/dist/src/notes/service.js +65 -6
- package/dist/src/notes/service.js.map +1 -1
- package/dist/src/notes/store.js +1 -1
- package/dist/src/projects/project-service.d.ts +2 -1
- package/dist/src/projects/project-service.js +59 -2
- package/dist/src/projects/project-service.js.map +1 -1
- package/dist/src/projects/project-store.d.ts +2 -1
- package/dist/src/projects/project-store.js +43 -0
- package/dist/src/projects/project-store.js.map +1 -1
- package/dist/src/projects/types.d.ts +10 -0
- package/dist/src/projects/workspace.js +1 -1
- package/dist/src/routing/agent-session-key.js +1 -1
- package/dist/src/routing/resolve-route.js +1 -1
- package/dist/src/routing/resolve-tui-session-key.js +1 -1
- package/dist/src/session/client-history.d.ts +3 -0
- package/dist/src/session/client-history.js +24 -9
- package/dist/src/session/client-history.js.map +1 -1
- package/dist/src/session/init-session-turn.js +1 -1
- package/dist/src/session/resolve-session.js +1 -1
- package/dist/src/session/session-context-for-llm.d.ts +2 -0
- package/dist/src/session/session-context-for-llm.js +14 -1
- package/dist/src/session/session-context-for-llm.js.map +1 -1
- package/dist/src/session/session-title.js +2 -2
- package/dist/src/session/store.js +3 -3
- package/dist/src/session/store.js.map +1 -1
- package/dist/src/session/types.d.ts +4 -0
- package/dist/src/session/types.js.map +1 -1
- package/dist/src/storage/sqlite/activity-repository.d.ts +8 -0
- package/dist/src/storage/sqlite/activity-repository.js +208 -0
- package/dist/src/storage/sqlite/activity-repository.js.map +1 -0
- package/dist/src/storage/sqlite/connection.js +1 -1
- package/dist/src/storage/sqlite/index.d.ts +1 -0
- package/dist/src/storage/sqlite/index.js +2 -1
- package/dist/src/storage/sqlite/migrations/022_work_items.sql +61 -0
- package/dist/src/storage/sqlite/migrations/023_work_item_attachments.sql +15 -0
- package/dist/src/storage/sqlite/migrations/024_activity_events.sql +62 -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/row-mappers.js +1 -1
- package/dist/src/storage/sqlite/schema.js +1 -1
- package/dist/src/storage/sqlite/schema.sql +141 -0
- package/dist/src/storage/sqlite/session-repository.js +11 -0
- package/dist/src/storage/sqlite/session-repository.js.map +1 -1
- package/dist/src/tui/backends/embedded-backend.d.ts +13 -0
- package/dist/src/tui/backends/embedded-backend.js +76 -7
- package/dist/src/tui/backends/embedded-backend.js.map +1 -1
- package/dist/src/tui/backends/gateway-sse-backend.d.ts +13 -0
- package/dist/src/tui/backends/gateway-sse-backend.js +53 -0
- package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
- package/dist/src/tui/chat-history.js +16 -3
- package/dist/src/tui/chat-history.js.map +1 -1
- package/dist/src/tui/clipboard-image.js +1 -1
- package/dist/src/tui/components/assistant-message.js +12 -2
- package/dist/src/tui/components/assistant-message.js.map +1 -1
- package/dist/src/tui/components/chat-log.d.ts +23 -3
- package/dist/src/tui/components/chat-log.js +68 -9
- package/dist/src/tui/components/chat-log.js.map +1 -1
- package/dist/src/tui/components/tool-execution.d.ts +8 -0
- package/dist/src/tui/components/tool-execution.js +87 -77
- package/dist/src/tui/components/tool-execution.js.map +1 -1
- package/dist/src/tui/components/tui-bottom-bar.js +9 -5
- package/dist/src/tui/components/tui-bottom-bar.js.map +1 -1
- package/dist/src/tui/components/visual-truncate.d.ts +1 -0
- package/dist/src/tui/components/visual-truncate.js +28 -1
- package/dist/src/tui/components/visual-truncate.js.map +1 -1
- package/dist/src/tui/tool-summary.d.ts +22 -0
- package/dist/src/tui/tool-summary.js +212 -0
- package/dist/src/tui/tool-summary.js.map +1 -0
- package/dist/src/tui/tui-backend.d.ts +16 -0
- package/dist/src/tui/tui-command-formatters.js +2 -2
- package/dist/src/tui/tui-commands.d.ts +9 -0
- package/dist/src/tui/tui-commands.js +95 -6
- package/dist/src/tui/tui-commands.js.map +1 -1
- package/dist/src/tui/tui-picker-overlay.d.ts +1 -0
- package/dist/src/tui/tui-picker-overlay.js +36 -1
- package/dist/src/tui/tui-picker-overlay.js.map +1 -1
- package/dist/src/tui/tui-picker-services.d.ts +13 -0
- package/dist/src/tui/tui-run-state.js +11 -0
- package/dist/src/tui/tui-run-state.js.map +1 -1
- package/dist/src/tui/tui-run-status-format.d.ts +3 -0
- package/dist/src/tui/tui-run-status-format.js +33 -0
- package/dist/src/tui/tui-run-status-format.js.map +1 -0
- package/dist/src/tui/tui-session-actions.d.ts +5 -0
- package/dist/src/tui/tui-session-actions.js +24 -0
- package/dist/src/tui/tui-session-actions.js.map +1 -1
- package/dist/src/tui/tui-timeline-picker.d.ts +19 -0
- package/dist/src/tui/tui-timeline-picker.js +81 -0
- package/dist/src/tui/tui-timeline-picker.js.map +1 -0
- package/dist/src/tui/tui-timeline.d.ts +15 -0
- package/dist/src/tui/tui-timeline.js +65 -0
- package/dist/src/tui/tui-timeline.js.map +1 -0
- package/dist/src/tui/tui-tool-diff.d.ts +15 -0
- package/dist/src/tui/tui-tool-diff.js +178 -7
- package/dist/src/tui/tui-tool-diff.js.map +1 -1
- package/dist/src/tui/tui-types.d.ts +1 -0
- package/dist/src/tui/tui-types.js +1 -0
- package/dist/src/tui/tui-types.js.map +1 -1
- package/dist/src/tui/tui.js +31 -25
- package/dist/src/tui/tui.js.map +1 -1
- package/dist/src/utils/index.js +1 -1
- package/dist/src/utils/logger/index.js +1 -1
- package/dist/src/utils/logger/stats.d.ts +3 -3
- package/dist/src/utils/logger.js +1 -1
- package/dist/src/work-items/agent-context.d.ts +7 -0
- package/dist/src/work-items/agent-context.js +75 -0
- package/dist/src/work-items/agent-context.js.map +1 -0
- package/dist/src/work-items/index.d.ts +4 -0
- package/dist/src/work-items/index.js +4 -0
- package/dist/src/work-items/types.d.ts +112 -0
- package/dist/src/work-items/types.js +1 -0
- package/dist/src/work-items/work-item-service.d.ts +35 -0
- package/dist/src/work-items/work-item-service.js +277 -0
- package/dist/src/work-items/work-item-service.js.map +1 -0
- package/dist/src/work-items/work-item-store.d.ts +21 -0
- package/dist/src/work-items/work-item-store.js +302 -0
- package/dist/src/work-items/work-item-store.js.map +1 -0
- package/dist/src/workflows/draft/workflow-draft-service.js +1 -1
- package/dist/src/workflows/service/workflow-run-service.js +4 -3
- package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
- package/dist/src/workflows/service/workflow-session-bridge.js +4 -1
- package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
- package/package.json +5 -5
- package/dist/gateway/static/root/assets/Combination-HAlzriaz.js +0 -41
- package/dist/gateway/static/root/assets/agents-BjIxt67Z.js +0 -2
- package/dist/gateway/static/root/assets/app-management-settings-panel-CYCONLIL.js +0 -1
- package/dist/gateway/static/root/assets/appearance-settings-Clw3ryKg.js +0 -1
- package/dist/gateway/static/root/assets/apps-page-QICTeGjX.js +0 -1
- package/dist/gateway/static/root/assets/automation-suggestion-card-CU0-4nQ-.js +0 -1
- package/dist/gateway/static/root/assets/automations-page-Car-jtiz.js +0 -1
- package/dist/gateway/static/root/assets/browser-settings-page-CMeBJzlS.js +0 -8
- package/dist/gateway/static/root/assets/capability-presets-api-BmQTM9Il.js +0 -1
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-DZEJEoCF.js +0 -1
- package/dist/gateway/static/root/assets/channels-settings-kkW-xFau.js +0 -1
- package/dist/gateway/static/root/assets/code-editor-dZTY2dRW.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-BvaQvO5F.js +0 -2
- package/dist/gateway/static/root/assets/dist-Mys7eFJ5.js +0 -1
- package/dist/gateway/static/root/assets/dist-wO9a2_ID.js +0 -1
- package/dist/gateway/static/root/assets/dreaming-settings-DnHO686d.js +0 -1
- package/dist/gateway/static/root/assets/extension-debug-page-BGLRuWVN.js +0 -1
- package/dist/gateway/static/root/assets/extension-page-D978ePp9.js +0 -1
- package/dist/gateway/static/root/assets/extension-settings-page-B6Ih4Swx.js +0 -1
- package/dist/gateway/static/root/assets/gateway-settings-CMEA3r5u.js +0 -1
- package/dist/gateway/static/root/assets/goal-create-dialog-B-KHKeXN.js +0 -1
- package/dist/gateway/static/root/assets/goal-detail-page-BxrSoWdj.js +0 -1
- package/dist/gateway/static/root/assets/goals-page-BTJzIl28.js +0 -2
- package/dist/gateway/static/root/assets/goals-settings-BJyEuLLm.js +0 -1
- package/dist/gateway/static/root/assets/heartbeat-settings-wkOjYNQT.js +0 -1
- package/dist/gateway/static/root/assets/index-BLaXr6Ev.css +0 -1
- package/dist/gateway/static/root/assets/index-c_9TVr_C.js +0 -191
- package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-BT8T4DyC.js +0 -1
- package/dist/gateway/static/root/assets/logs-page-CrxBJUgI.js +0 -2
- package/dist/gateway/static/root/assets/markdown-split-Dv66bO2b.js +0 -1
- package/dist/gateway/static/root/assets/messages-O6TAtdFC.js +0 -3
- package/dist/gateway/static/root/assets/models-hub-panel-DOOpz6y1.js +0 -2
- package/dist/gateway/static/root/assets/notes-page-Br16pK9v.js +0 -1
- package/dist/gateway/static/root/assets/notes-workbench-PSJAi0ZC.js +0 -2
- package/dist/gateway/static/root/assets/project-detail-page-CIGGgKuw.js +0 -1
- package/dist/gateway/static/root/assets/projects-page-B2grhsBt.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-CXMORxBD.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-Bi2wkBzU.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-B1L3G4IA.js +0 -1
- package/dist/gateway/static/root/assets/settings-form-section-BnqYMWHR.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-BfRSHJmO.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-layout-CdWZU1hd.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-CWtPM7RK.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-ngbsBgij.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-BIe442Gv.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-BfchZRVa.js +0 -2
- package/dist/gateway/static/root/assets/voice-api-key-field-C5Ov8Uk_.js +0 -1
- package/dist/gateway/static/root/assets/workflow-run-setup-panel-BYD9BtOq.js +0 -3
- package/dist/gateway/static/root/assets/workflows-page-BYF29ANm.js +0 -18
|
@@ -3,6 +3,9 @@ import type { Config } from '../config/schema.js';
|
|
|
3
3
|
import type { SessionStore } from '../session/store.js';
|
|
4
4
|
import type { AutomationService } from '../automations/index.js';
|
|
5
5
|
import type { ExtensionRegistryImpl as ExtensionRegistry } from '../extensions/index.js';
|
|
6
|
+
import type { NotesService } from '../notes/index.js';
|
|
7
|
+
import type { ProjectService } from '../projects/index.js';
|
|
8
|
+
import type { WorkItemService } from '../work-items/index.js';
|
|
6
9
|
import type { GatewayClarifyRequestFn } from './tools/clarify-tool.js';
|
|
7
10
|
import type { ProgressStage } from './lifecycle/progress.js';
|
|
8
11
|
import type { AgentSourceContextResolver } from './source-context/types.js';
|
|
@@ -24,6 +27,10 @@ export interface AgentServiceConfig {
|
|
|
24
27
|
requestClarification: GatewayClarifyRequestFn;
|
|
25
28
|
};
|
|
26
29
|
getAutomationService?: () => AutomationService | undefined;
|
|
30
|
+
/** Gateway: exposes first-class xopc product objects for the `xopc_use` tool. */
|
|
31
|
+
getNotesService?: () => NotesService | undefined;
|
|
32
|
+
getProjectService?: () => ProjectService | undefined;
|
|
33
|
+
getWorkItemService?: () => WorkItemService | undefined;
|
|
27
34
|
/**
|
|
28
35
|
* Gateway: reuse the gateway `SessionManager` store so web API and agent share one index + files.
|
|
29
36
|
* When omitted, `AgentService` creates its own `SessionStore` (CLI / embedded).
|
|
@@ -31,10 +31,10 @@ export interface SessionInspectorOptions {
|
|
|
31
31
|
/** Effective config snapshot accessor (honours runtime overrides). */
|
|
32
32
|
getConfig: () => Config | undefined;
|
|
33
33
|
/**
|
|
34
|
-
* Nominal context window the session is budgeted against.
|
|
35
|
-
*
|
|
34
|
+
* Nominal context window the session is budgeted against. Derived from the
|
|
35
|
+
* effective session model metadata, defaulting to 128k.
|
|
36
36
|
*/
|
|
37
|
-
getContextWindow: () => number;
|
|
37
|
+
getContextWindow: (sessionKey: string) => number;
|
|
38
38
|
}
|
|
39
39
|
export interface SessionContextUsage {
|
|
40
40
|
estimatedTokens: number;
|
|
@@ -52,6 +52,8 @@ export interface SessionAgentConfigView {
|
|
|
52
52
|
export declare class SessionInspector {
|
|
53
53
|
private readonly opts;
|
|
54
54
|
constructor(opts: SessionInspectorOptions);
|
|
55
|
+
private ensureEffectiveSessionModel;
|
|
56
|
+
private contextWindowForSession;
|
|
55
57
|
/**
|
|
56
58
|
* Manual compaction triggered by a user / API. Always forces a compaction
|
|
57
59
|
* pass (`force: true` by default) and evicts the in-memory agent so the
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { resolveEffectiveAgentProfileForSession } from "../../config/agent-profile.js";
|
|
2
1
|
import { createLogger } from "../../utils/logger/index.js";
|
|
3
2
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
+
import { resolveEffectiveAgentProfileForSession } from "../../config/agent-profile.js";
|
|
4
4
|
import { effectiveWorkspacePathForSession, projectWorkspacePath } from "../../session/session-workspace.js";
|
|
5
5
|
import { getProjectForSession } from "../../projects/workspace.js";
|
|
6
6
|
import { resolveVerboseLevel } from "../../session/config-store.js";
|
|
@@ -16,6 +16,18 @@ var SessionInspector = class {
|
|
|
16
16
|
constructor(opts) {
|
|
17
17
|
this.opts = opts;
|
|
18
18
|
}
|
|
19
|
+
async ensureEffectiveSessionModel(sessionKey) {
|
|
20
|
+
await this.opts.sessionHydrator.model(sessionKey);
|
|
21
|
+
const cfg = this.opts.getConfig();
|
|
22
|
+
if (!cfg) return;
|
|
23
|
+
const profile = resolveEffectiveAgentProfileForSession(cfg, sessionKey);
|
|
24
|
+
const profileModelRef = profile.primaryModelRef?.trim();
|
|
25
|
+
if (profileModelRef) this.opts.modelManager.setSessionProfileDefault(sessionKey, profileModelRef, profile.fallbacks);
|
|
26
|
+
}
|
|
27
|
+
async contextWindowForSession(sessionKey) {
|
|
28
|
+
await this.ensureEffectiveSessionModel(sessionKey);
|
|
29
|
+
return this.opts.getContextWindow(sessionKey);
|
|
30
|
+
}
|
|
19
31
|
/**
|
|
20
32
|
* Manual compaction triggered by a user / API. Always forces a compaction
|
|
21
33
|
* pass (`force: true` by default) and evicts the in-memory agent so the
|
|
@@ -23,7 +35,7 @@ var SessionInspector = class {
|
|
|
23
35
|
*/
|
|
24
36
|
async compact(sessionKey, options) {
|
|
25
37
|
const messages = await this.opts.sessionStore.load(sessionKey);
|
|
26
|
-
const contextWindow = this.
|
|
38
|
+
const contextWindow = await this.contextWindowForSession(sessionKey);
|
|
27
39
|
const result = await this.opts.sessionStore.compact(sessionKey, messages, contextWindow, options?.instructions, options?.force ?? true);
|
|
28
40
|
if (result.compacted) this.opts.agentManager.removeAgent(sessionKey);
|
|
29
41
|
log.info({
|
|
@@ -53,7 +65,7 @@ var SessionInspector = class {
|
|
|
53
65
|
/** Rough context usage for TUI footer (estimated tokens vs nominal budget). */
|
|
54
66
|
async contextUsage(sessionKey) {
|
|
55
67
|
const messages = await this.opts.sessionStore.load(sessionKey);
|
|
56
|
-
const contextWindow = this.
|
|
68
|
+
const contextWindow = await this.contextWindowForSession(sessionKey);
|
|
57
69
|
const estimatedTokens = await this.opts.sessionStore.estimateTokenUsage(sessionKey, messages);
|
|
58
70
|
return {
|
|
59
71
|
estimatedTokens,
|
|
@@ -66,7 +78,7 @@ var SessionInspector = class {
|
|
|
66
78
|
const cfg = this.opts.getConfig();
|
|
67
79
|
if (!cfg) throw new Error("SessionInspector requires a config snapshot to render report");
|
|
68
80
|
const messages = await this.opts.sessionStore.load(sessionKey);
|
|
69
|
-
const cw = this.
|
|
81
|
+
const cw = await this.contextWindowForSession(sessionKey);
|
|
70
82
|
const computed = this.stats(sessionKey, messages);
|
|
71
83
|
const model = this.opts.modelManager.getModelForSession(sessionKey);
|
|
72
84
|
const workspace = effectiveWorkspacePathForSession(cfg, sessionKey, await this.opts.sessionConfigStore.get(sessionKey), getProjectForSession(sessionKey));
|
|
@@ -94,13 +106,10 @@ var SessionInspector = class {
|
|
|
94
106
|
}
|
|
95
107
|
/** Resolved thinking / model / workspace for the Web UI. */
|
|
96
108
|
async agentConfig(sessionKey) {
|
|
97
|
-
await this.
|
|
109
|
+
await this.ensureEffectiveSessionModel(sessionKey);
|
|
98
110
|
const cfg = this.opts.getConfig();
|
|
99
111
|
if (!cfg) throw new Error("SessionInspector requires a config snapshot to resolve agent config");
|
|
100
112
|
const sc = await this.opts.sessionConfigStore.get(sessionKey);
|
|
101
|
-
const profile = resolveEffectiveAgentProfileForSession(cfg, sessionKey);
|
|
102
|
-
const profileModelRef = profile.primaryModelRef?.trim();
|
|
103
|
-
if (profileModelRef) this.opts.modelManager.setSessionProfileDefault(sessionKey, profileModelRef, profile.fallbacks);
|
|
104
113
|
const level = await resolveEffectiveThinkingLevel(this.opts.sessionConfigStore, sessionKey, null, "medium");
|
|
105
114
|
const reasoningLevel = await resolveEffectiveReasoningLevel(this.opts.sessionConfigStore, sessionKey, "stream");
|
|
106
115
|
const verboseLevel = await resolveVerboseLevel(this.opts.sessionConfigStore, sessionKey, "full");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-inspector.js","names":[],"sources":["../../../../src/agent/session/session-inspector.ts"],"sourcesContent":["/**\n * SessionInspector — read-only / introspection-oriented operations on a session.\n *\n * Owns the five methods previously scattered across `AgentService` that all\n * compute a \"summary view\" of one session:\n * - `compact` (manual user-triggered compaction)\n * - `btwQuery` (one-shot LLM answer with transcript as background)\n * - `report` (Markdown / JSON `/context` summary)\n * - `agentConfig` (resolved thinking + model + workspace for the Web UI)\n * - `contextUsage` (rough token budget vs estimated transcript)\n *\n * The shared helper `computeStats` keeps the three callsites that need\n * `getWindowStats` / `getCompactionStats` / `estimateTokenUsage` in lockstep.\n */\n\nimport type { AgentMessage } from '@earendil-works/pi-agent-core';\nimport type { ThinkingLevel } from '@earendil-works/pi-agent-core';\n\nimport type { Config } from '../../config/schema.js';\nimport { resolveEffectiveAgentProfileForSession } from '../../config/agent-profile.js';\nimport {\n effectiveWorkspacePathForSession,\n projectWorkspacePath,\n resolveEffectiveReasoningLevel,\n resolveEffectiveThinkingLevel,\n resolveVerboseLevel,\n type SessionConfigStore,\n} from '../../session/index.js';\nimport { getProjectForSession } from '../../projects/workspace.js';\nimport type { SessionStore } from '../../session/store.js';\nimport type { CompactionResult } from '../memory/compaction.js';\nimport type { ModelManager } from '../models/index.js';\nimport type { AgentInstanceGateway } from '../agent-instance-gateway.js';\nimport { runBtwQuery } from '../service/btw-query.js';\nimport { formatSessionContextReport } from '../service/session-context-report.js';\nimport type { ReasoningLevel, VerboseLevel } from '../transcript/thinking-types.js';\nimport { createLogger } from '../../utils/logger.js';\nimport type { SessionHydrator } from './session-hydrator.js';\n\nconst log = createLogger('SessionInspector');\n\nexport interface SessionInspectorOptions {\n sessionStore: SessionStore;\n sessionConfigStore: SessionConfigStore;\n modelManager: ModelManager;\n agentManager: AgentInstanceGateway;\n sessionHydrator: SessionHydrator;\n /** Effective config snapshot accessor (honours runtime overrides). */\n getConfig: () => Config | undefined;\n /**\n * Nominal context window the session is budgeted against. Currently derived\n * from the active model metadata, defaulting to 128k.\n */\n getContextWindow: () => number;\n}\n\nexport interface SessionContextUsage {\n estimatedTokens: number;\n contextWindow: number;\n usagePercent: number | null;\n}\n\nexport interface SessionAgentConfigView {\n thinkingLevel: ThinkingLevel;\n model: string;\n reasoningLevel: ReasoningLevel;\n verboseLevel: VerboseLevel;\n effectiveWorkspacePath: string;\n workingDirectoryLocked: boolean;\n}\n\nexport class SessionInspector {\n private readonly opts: SessionInspectorOptions;\n\n constructor(opts: SessionInspectorOptions) {\n this.opts = opts;\n }\n\n /**\n * Manual compaction triggered by a user / API. Always forces a compaction\n * pass (`force: true` by default) and evicts the in-memory agent so the\n * next turn reloads from the compacted transcript.\n */\n async compact(\n sessionKey: string,\n options?: { instructions?: string; force?: boolean },\n ): Promise<CompactionResult> {\n const messages = await this.opts.sessionStore.load(sessionKey);\n const contextWindow = this.opts.getContextWindow();\n const result = await this.opts.sessionStore.compact(\n sessionKey,\n messages,\n contextWindow,\n options?.instructions,\n options?.force ?? true,\n );\n if (result.compacted) {\n this.opts.agentManager.removeAgent(sessionKey);\n }\n log.info({ sessionKey, result }, 'Manual compaction complete');\n return result;\n }\n\n /** One-shot LLM answer for `/btw`: transcript as background, not persisted. */\n btwQuery(sessionKey: string, question: string): Promise<{ text: string; error?: string }> {\n return runBtwQuery({\n sessionKey,\n question,\n sessionStore: this.opts.sessionStore,\n modelForSession: this.opts.modelManager.getModelForSession(sessionKey),\n log,\n });\n }\n\n /** Cheap stats used by both the report and other callers. */\n stats(sessionKey: string, messages: AgentMessage[]): {\n windowStats: ReturnType<SessionStore['getWindowStats']>;\n compactionStats: ReturnType<SessionStore['getCompactionStats']>;\n tokenEstimate: ReturnType<SessionStore['estimateTokenUsage']>;\n } {\n return {\n windowStats: this.opts.sessionStore.getWindowStats(messages),\n compactionStats: this.opts.sessionStore.getCompactionStats(sessionKey),\n tokenEstimate: this.opts.sessionStore.estimateTokenUsage(sessionKey, messages),\n };\n }\n\n /** Rough context usage for TUI footer (estimated tokens vs nominal budget). */\n async contextUsage(sessionKey: string): Promise<SessionContextUsage> {\n const messages = await this.opts.sessionStore.load(sessionKey);\n const contextWindow = this.opts.getContextWindow();\n const estimatedTokens = await this.opts.sessionStore.estimateTokenUsage(sessionKey, messages);\n const usagePercent =\n contextWindow > 0 ? Math.min(100, Math.round((estimatedTokens / contextWindow) * 100)) : null;\n return { estimatedTokens, contextWindow, usagePercent };\n }\n\n /** Markdown or JSON summary for `/context`. */\n async report(sessionKey: string, mode: 'list' | 'detail' | 'json'): Promise<string> {\n const cfg = this.opts.getConfig();\n if (!cfg) {\n throw new Error('SessionInspector requires a config snapshot to render report');\n }\n const messages = await this.opts.sessionStore.load(sessionKey);\n const cw = this.opts.getContextWindow();\n const computed = this.stats(sessionKey, messages);\n const model = this.opts.modelManager.getModelForSession(sessionKey);\n const sc = await this.opts.sessionConfigStore.get(sessionKey);\n const project = getProjectForSession(sessionKey);\n const workspace = effectiveWorkspacePathForSession(cfg, sessionKey, sc, project);\n const estTokens = await this.opts.sessionStore.estimateTokenUsage(sessionKey, messages);\n const profile = resolveEffectiveAgentProfileForSession(cfg, sessionKey);\n const deniedTools = [...profile.tools.denied].sort((a, b) => a.localeCompare(b));\n const toolsSummary = deniedTools.length > 0 ? `denied: ${deniedTools.join(', ')}` : '(no denied tools)';\n\n return formatSessionContextReport({\n sessionKey,\n mode,\n model,\n workspacePath: workspace,\n agentId: profile.agentId,\n messageCount: messages.length,\n contextWindowNominal: cw,\n estimatedTranscriptTokens: estTokens,\n thinkingDefault: undefined,\n reasoningDefault: undefined,\n verboseDefault: undefined,\n compaction: undefined,\n toolsFlagsSummary: toolsSummary,\n windowStats: computed.windowStats,\n compactionRunStats: computed.compactionStats,\n });\n }\n\n /** Resolved thinking / model / workspace for the Web UI. */\n async agentConfig(sessionKey: string): Promise<SessionAgentConfigView> {\n await this.opts.sessionHydrator.model(sessionKey);\n const cfg = this.opts.getConfig();\n if (!cfg) {\n throw new Error('SessionInspector requires a config snapshot to resolve agent config');\n }\n const sc = await this.opts.sessionConfigStore.get(sessionKey);\n\n // Ensure model display matches the effective agent profile even before an Agent instance exists.\n // Otherwise `ModelManager.getModelForSession()` falls back to the global default until the first turn creates the agent.\n const profile = resolveEffectiveAgentProfileForSession(cfg, sessionKey);\n const profileModelRef = profile.primaryModelRef?.trim();\n if (profileModelRef) {\n this.opts.modelManager.setSessionProfileDefault(sessionKey, profileModelRef, profile.fallbacks);\n }\n\n const defThink = 'medium';\n const level = await resolveEffectiveThinkingLevel(this.opts.sessionConfigStore, sessionKey, null, defThink);\n const defReason = 'stream' as ReasoningLevel;\n const reasoningLevel = await resolveEffectiveReasoningLevel(this.opts.sessionConfigStore, sessionKey, defReason);\n const defVerbose = 'full' as VerboseLevel;\n const verboseLevel = await resolveVerboseLevel(this.opts.sessionConfigStore, sessionKey, defVerbose);\n const model = this.opts.modelManager.getModelForSession(sessionKey);\n const project = getProjectForSession(sessionKey);\n const projectWorkspace = projectWorkspacePath(project);\n return {\n thinkingLevel: level,\n model,\n reasoningLevel,\n verboseLevel,\n effectiveWorkspacePath: effectiveWorkspacePathForSession(cfg, sessionKey, sc, project),\n workingDirectoryLocked: Boolean(projectWorkspace || sc?.workingDirectoryOverride?.trim()),\n };\n }\n}\n"],"mappings":";;;;;;;;;;;aAoCqD;AAGrD,MAAM,MAAM,aAAa,mBAAmB;AAgC5C,IAAa,mBAAb,MAA8B;CAC5B;CAEA,YAAY,MAA+B;AACzC,OAAK,OAAO;;;;;;;CAQd,MAAM,QACJ,YACA,SAC2B;EAC3B,MAAM,WAAW,MAAM,KAAK,KAAK,aAAa,KAAK,WAAW;EAC9D,MAAM,gBAAgB,KAAK,KAAK,kBAAkB;EAClD,MAAM,SAAS,MAAM,KAAK,KAAK,aAAa,QAC1C,YACA,UACA,eACA,SAAS,cACT,SAAS,SAAS,KACnB;AACD,MAAI,OAAO,UACT,MAAK,KAAK,aAAa,YAAY,WAAW;AAEhD,MAAI,KAAK;GAAE;GAAY;GAAQ,EAAE,6BAA6B;AAC9D,SAAO;;;CAIT,SAAS,YAAoB,UAA6D;AACxF,SAAO,YAAY;GACjB;GACA;GACA,cAAc,KAAK,KAAK;GACxB,iBAAiB,KAAK,KAAK,aAAa,mBAAmB,WAAW;GACtE;GACD,CAAC;;;CAIJ,MAAM,YAAoB,UAIxB;AACA,SAAO;GACL,aAAa,KAAK,KAAK,aAAa,eAAe,SAAS;GAC5D,iBAAiB,KAAK,KAAK,aAAa,mBAAmB,WAAW;GACtE,eAAe,KAAK,KAAK,aAAa,mBAAmB,YAAY,SAAS;GAC/E;;;CAIH,MAAM,aAAa,YAAkD;EACnE,MAAM,WAAW,MAAM,KAAK,KAAK,aAAa,KAAK,WAAW;EAC9D,MAAM,gBAAgB,KAAK,KAAK,kBAAkB;EAClD,MAAM,kBAAkB,MAAM,KAAK,KAAK,aAAa,mBAAmB,YAAY,SAAS;AAG7F,SAAO;GAAE;GAAiB;GAAe,cADvC,gBAAgB,IAAI,KAAK,IAAI,KAAK,KAAK,MAAO,kBAAkB,gBAAiB,IAAI,CAAC,GAAG;GACpC;;;CAIzD,MAAM,OAAO,YAAoB,MAAmD;EAClF,MAAM,MAAM,KAAK,KAAK,WAAW;AACjC,MAAI,CAAC,IACH,OAAM,IAAI,MAAM,+DAA+D;EAEjF,MAAM,WAAW,MAAM,KAAK,KAAK,aAAa,KAAK,WAAW;EAC9D,MAAM,KAAK,KAAK,KAAK,kBAAkB;EACvC,MAAM,WAAW,KAAK,MAAM,YAAY,SAAS;EACjD,MAAM,QAAQ,KAAK,KAAK,aAAa,mBAAmB,WAAW;EAGnE,MAAM,YAAY,iCAAiC,KAAK,YAAY,MAFnD,KAAK,KAAK,mBAAmB,IAAI,WAAW,EAC7C,qBAAqB,WAC0C,CAAC;EAChF,MAAM,YAAY,MAAM,KAAK,KAAK,aAAa,mBAAmB,YAAY,SAAS;EACvF,MAAM,UAAU,uCAAuC,KAAK,WAAW;EACvE,MAAM,cAAc,CAAC,GAAG,QAAQ,MAAM,OAAO,CAAC,MAAM,GAAG,MAAM,EAAE,cAAc,EAAE,CAAC;EAChF,MAAM,eAAe,YAAY,SAAS,IAAI,WAAW,YAAY,KAAK,KAAK,KAAK;AAEpF,SAAO,2BAA2B;GAChC;GACA;GACA;GACA,eAAe;GACf,SAAS,QAAQ;GACjB,cAAc,SAAS;GACvB,sBAAsB;GACtB,2BAA2B;GAC3B,iBAAiB,KAAA;GACjB,kBAAkB,KAAA;GAClB,gBAAgB,KAAA;GAChB,YAAY,KAAA;GACZ,mBAAmB;GACnB,aAAa,SAAS;GACtB,oBAAoB,SAAS;GAC9B,CAAC;;;CAIJ,MAAM,YAAY,YAAqD;AACrE,QAAM,KAAK,KAAK,gBAAgB,MAAM,WAAW;EACjD,MAAM,MAAM,KAAK,KAAK,WAAW;AACjC,MAAI,CAAC,IACH,OAAM,IAAI,MAAM,sEAAsE;EAExF,MAAM,KAAK,MAAM,KAAK,KAAK,mBAAmB,IAAI,WAAW;EAI7D,MAAM,UAAU,uCAAuC,KAAK,WAAW;EACvE,MAAM,kBAAkB,QAAQ,iBAAiB,MAAM;AACvD,MAAI,gBACF,MAAK,KAAK,aAAa,yBAAyB,YAAY,iBAAiB,QAAQ,UAAU;EAIjG,MAAM,QAAQ,MAAM,8BAA8B,KAAK,KAAK,oBAAoB,YAAY,MAAM,SAAS;EAE3G,MAAM,iBAAiB,MAAM,+BAA+B,KAAK,KAAK,oBAAoB,YAAY,SAAU;EAEhH,MAAM,eAAe,MAAM,oBAAoB,KAAK,KAAK,oBAAoB,YAAY,OAAW;EACpG,MAAM,QAAQ,KAAK,KAAK,aAAa,mBAAmB,WAAW;EACnE,MAAM,UAAU,qBAAqB,WAAW;EAChD,MAAM,mBAAmB,qBAAqB,QAAQ;AACtD,SAAO;GACL,eAAe;GACf;GACA;GACA;GACA,wBAAwB,iCAAiC,KAAK,YAAY,IAAI,QAAQ;GACtF,wBAAwB,QAAQ,oBAAoB,IAAI,0BAA0B,MAAM,CAAC;GAC1F"}
|
|
1
|
+
{"version":3,"file":"session-inspector.js","names":[],"sources":["../../../../src/agent/session/session-inspector.ts"],"sourcesContent":["/**\n * SessionInspector — read-only / introspection-oriented operations on a session.\n *\n * Owns the five methods previously scattered across `AgentService` that all\n * compute a \"summary view\" of one session:\n * - `compact` (manual user-triggered compaction)\n * - `btwQuery` (one-shot LLM answer with transcript as background)\n * - `report` (Markdown / JSON `/context` summary)\n * - `agentConfig` (resolved thinking + model + workspace for the Web UI)\n * - `contextUsage` (rough token budget vs estimated transcript)\n *\n * The shared helper `computeStats` keeps the three callsites that need\n * `getWindowStats` / `getCompactionStats` / `estimateTokenUsage` in lockstep.\n */\n\nimport type { AgentMessage } from '@earendil-works/pi-agent-core';\nimport type { ThinkingLevel } from '@earendil-works/pi-agent-core';\n\nimport type { Config } from '../../config/schema.js';\nimport { resolveEffectiveAgentProfileForSession } from '../../config/agent-profile.js';\nimport {\n effectiveWorkspacePathForSession,\n projectWorkspacePath,\n resolveEffectiveReasoningLevel,\n resolveEffectiveThinkingLevel,\n resolveVerboseLevel,\n type SessionConfigStore,\n} from '../../session/index.js';\nimport { getProjectForSession } from '../../projects/workspace.js';\nimport type { SessionStore } from '../../session/store.js';\nimport type { CompactionResult } from '../memory/compaction.js';\nimport type { ModelManager } from '../models/index.js';\nimport type { AgentInstanceGateway } from '../agent-instance-gateway.js';\nimport { runBtwQuery } from '../service/btw-query.js';\nimport { formatSessionContextReport } from '../service/session-context-report.js';\nimport type { ReasoningLevel, VerboseLevel } from '../transcript/thinking-types.js';\nimport { createLogger } from '../../utils/logger.js';\nimport type { SessionHydrator } from './session-hydrator.js';\n\nconst log = createLogger('SessionInspector');\n\nexport interface SessionInspectorOptions {\n sessionStore: SessionStore;\n sessionConfigStore: SessionConfigStore;\n modelManager: ModelManager;\n agentManager: AgentInstanceGateway;\n sessionHydrator: SessionHydrator;\n /** Effective config snapshot accessor (honours runtime overrides). */\n getConfig: () => Config | undefined;\n /**\n * Nominal context window the session is budgeted against. Derived from the\n * effective session model metadata, defaulting to 128k.\n */\n getContextWindow: (sessionKey: string) => number;\n}\n\nexport interface SessionContextUsage {\n estimatedTokens: number;\n contextWindow: number;\n usagePercent: number | null;\n}\n\nexport interface SessionAgentConfigView {\n thinkingLevel: ThinkingLevel;\n model: string;\n reasoningLevel: ReasoningLevel;\n verboseLevel: VerboseLevel;\n effectiveWorkspacePath: string;\n workingDirectoryLocked: boolean;\n}\n\nexport class SessionInspector {\n private readonly opts: SessionInspectorOptions;\n\n constructor(opts: SessionInspectorOptions) {\n this.opts = opts;\n }\n\n private async ensureEffectiveSessionModel(sessionKey: string): Promise<void> {\n await this.opts.sessionHydrator.model(sessionKey);\n const cfg = this.opts.getConfig();\n if (!cfg) return;\n\n const profile = resolveEffectiveAgentProfileForSession(cfg, sessionKey);\n const profileModelRef = profile.primaryModelRef?.trim();\n if (profileModelRef) {\n this.opts.modelManager.setSessionProfileDefault(sessionKey, profileModelRef, profile.fallbacks);\n }\n }\n\n private async contextWindowForSession(sessionKey: string): Promise<number> {\n await this.ensureEffectiveSessionModel(sessionKey);\n return this.opts.getContextWindow(sessionKey);\n }\n\n /**\n * Manual compaction triggered by a user / API. Always forces a compaction\n * pass (`force: true` by default) and evicts the in-memory agent so the\n * next turn reloads from the compacted transcript.\n */\n async compact(\n sessionKey: string,\n options?: { instructions?: string; force?: boolean },\n ): Promise<CompactionResult> {\n const messages = await this.opts.sessionStore.load(sessionKey);\n const contextWindow = await this.contextWindowForSession(sessionKey);\n const result = await this.opts.sessionStore.compact(\n sessionKey,\n messages,\n contextWindow,\n options?.instructions,\n options?.force ?? true,\n );\n if (result.compacted) {\n this.opts.agentManager.removeAgent(sessionKey);\n }\n log.info({ sessionKey, result }, 'Manual compaction complete');\n return result;\n }\n\n /** One-shot LLM answer for `/btw`: transcript as background, not persisted. */\n btwQuery(sessionKey: string, question: string): Promise<{ text: string; error?: string }> {\n return runBtwQuery({\n sessionKey,\n question,\n sessionStore: this.opts.sessionStore,\n modelForSession: this.opts.modelManager.getModelForSession(sessionKey),\n log,\n });\n }\n\n /** Cheap stats used by both the report and other callers. */\n stats(sessionKey: string, messages: AgentMessage[]): {\n windowStats: ReturnType<SessionStore['getWindowStats']>;\n compactionStats: ReturnType<SessionStore['getCompactionStats']>;\n tokenEstimate: ReturnType<SessionStore['estimateTokenUsage']>;\n } {\n return {\n windowStats: this.opts.sessionStore.getWindowStats(messages),\n compactionStats: this.opts.sessionStore.getCompactionStats(sessionKey),\n tokenEstimate: this.opts.sessionStore.estimateTokenUsage(sessionKey, messages),\n };\n }\n\n /** Rough context usage for TUI footer (estimated tokens vs nominal budget). */\n async contextUsage(sessionKey: string): Promise<SessionContextUsage> {\n const messages = await this.opts.sessionStore.load(sessionKey);\n const contextWindow = await this.contextWindowForSession(sessionKey);\n const estimatedTokens = await this.opts.sessionStore.estimateTokenUsage(sessionKey, messages);\n const usagePercent =\n contextWindow > 0 ? Math.min(100, Math.round((estimatedTokens / contextWindow) * 100)) : null;\n return { estimatedTokens, contextWindow, usagePercent };\n }\n\n /** Markdown or JSON summary for `/context`. */\n async report(sessionKey: string, mode: 'list' | 'detail' | 'json'): Promise<string> {\n const cfg = this.opts.getConfig();\n if (!cfg) {\n throw new Error('SessionInspector requires a config snapshot to render report');\n }\n const messages = await this.opts.sessionStore.load(sessionKey);\n const cw = await this.contextWindowForSession(sessionKey);\n const computed = this.stats(sessionKey, messages);\n const model = this.opts.modelManager.getModelForSession(sessionKey);\n const sc = await this.opts.sessionConfigStore.get(sessionKey);\n const project = getProjectForSession(sessionKey);\n const workspace = effectiveWorkspacePathForSession(cfg, sessionKey, sc, project);\n const estTokens = await this.opts.sessionStore.estimateTokenUsage(sessionKey, messages);\n const profile = resolveEffectiveAgentProfileForSession(cfg, sessionKey);\n const deniedTools = [...profile.tools.denied].sort((a, b) => a.localeCompare(b));\n const toolsSummary = deniedTools.length > 0 ? `denied: ${deniedTools.join(', ')}` : '(no denied tools)';\n\n return formatSessionContextReport({\n sessionKey,\n mode,\n model,\n workspacePath: workspace,\n agentId: profile.agentId,\n messageCount: messages.length,\n contextWindowNominal: cw,\n estimatedTranscriptTokens: estTokens,\n thinkingDefault: undefined,\n reasoningDefault: undefined,\n verboseDefault: undefined,\n compaction: undefined,\n toolsFlagsSummary: toolsSummary,\n windowStats: computed.windowStats,\n compactionRunStats: computed.compactionStats,\n });\n }\n\n /** Resolved thinking / model / workspace for the Web UI. */\n async agentConfig(sessionKey: string): Promise<SessionAgentConfigView> {\n await this.ensureEffectiveSessionModel(sessionKey);\n const cfg = this.opts.getConfig();\n if (!cfg) {\n throw new Error('SessionInspector requires a config snapshot to resolve agent config');\n }\n const sc = await this.opts.sessionConfigStore.get(sessionKey);\n\n const defThink = 'medium';\n const level = await resolveEffectiveThinkingLevel(this.opts.sessionConfigStore, sessionKey, null, defThink);\n const defReason = 'stream' as ReasoningLevel;\n const reasoningLevel = await resolveEffectiveReasoningLevel(this.opts.sessionConfigStore, sessionKey, defReason);\n const defVerbose = 'full' as VerboseLevel;\n const verboseLevel = await resolveVerboseLevel(this.opts.sessionConfigStore, sessionKey, defVerbose);\n const model = this.opts.modelManager.getModelForSession(sessionKey);\n const project = getProjectForSession(sessionKey);\n const projectWorkspace = projectWorkspacePath(project);\n return {\n thinkingLevel: level,\n model,\n reasoningLevel,\n verboseLevel,\n effectiveWorkspacePath: effectiveWorkspacePathForSession(cfg, sessionKey, sc, project),\n workingDirectoryLocked: Boolean(projectWorkspace || sc?.workingDirectoryOverride?.trim()),\n };\n }\n}\n"],"mappings":"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"}
|
|
@@ -6,8 +6,8 @@ import { computeSkillTreeHashSync } from "./hub-hash.js";
|
|
|
6
6
|
import { tmpdir } from "node:os";
|
|
7
7
|
import { basename, join, normalize, resolve } from "node:path";
|
|
8
8
|
import { cpSync, existsSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
9
|
-
import { execFileSync } from "node:child_process";
|
|
10
9
|
import { fileURLToPath } from "node:url";
|
|
10
|
+
import { execFileSync } from "node:child_process";
|
|
11
11
|
import { fetch } from "undici";
|
|
12
12
|
//#region src/agent/skills/hub-pull.ts
|
|
13
13
|
/**
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
function isSessionSourceBinding(value) {
|
|
3
3
|
if (!value || typeof value !== "object") return false;
|
|
4
4
|
const row = value;
|
|
5
|
-
return row.kind === "note" && typeof row.sourceId === "string" && row.sourceId.trim().length > 0 && typeof row.version === "string" && typeof row.attachedAt === "number";
|
|
5
|
+
return (row.kind === "note" || row.kind === "work_item") && typeof row.sourceId === "string" && row.sourceId.trim().length > 0 && typeof row.version === "string" && typeof row.attachedAt === "number";
|
|
6
6
|
}
|
|
7
7
|
//#endregion
|
|
8
8
|
export { isSessionSourceBinding };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","names":[],"sources":["../../../../src/agent/source-context/types.ts"],"sourcesContent":["import type { ImageContent } from '@earendil-works/pi-ai';\n\nexport interface SessionSourceBinding {\n kind: 'note';\n sourceId: string;\n version: string;\n attachedAt: number;\n}\n\nexport interface AgentSourceContext {\n kind: SessionSourceBinding['kind'];\n sourceId: string;\n version: string;\n title: string;\n text: string;\n images?: ImageContent[];\n tokenEstimate?: number;\n truncated?: boolean;\n}\n\nexport type AgentSourceContextResolver = (\n binding: SessionSourceBinding,\n sessionKey: string,\n) => Promise<AgentSourceContext | null>;\n\nexport function isSessionSourceBinding(value: unknown): value is SessionSourceBinding {\n if (!value || typeof value !== 'object') return false;\n const row = value as Record<string, unknown>;\n return row.kind === 'note'\n && typeof row.sourceId === 'string'\n && row.sourceId.trim().length > 0\n && typeof row.version === 'string'\n && typeof row.attachedAt === 'number';\n}\n"],"mappings":";AAyBA,SAAgB,uBAAuB,OAA+C;AACpF,KAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;CAChD,MAAM,MAAM;AACZ,
|
|
1
|
+
{"version":3,"file":"types.js","names":[],"sources":["../../../../src/agent/source-context/types.ts"],"sourcesContent":["import type { ImageContent } from '@earendil-works/pi-ai';\n\nexport interface SessionSourceBinding {\n kind: 'note' | 'work_item';\n sourceId: string;\n version: string;\n attachedAt: number;\n}\n\nexport interface AgentSourceContext {\n kind: SessionSourceBinding['kind'];\n sourceId: string;\n version: string;\n title: string;\n text: string;\n images?: ImageContent[];\n tokenEstimate?: number;\n truncated?: boolean;\n}\n\nexport type AgentSourceContextResolver = (\n binding: SessionSourceBinding,\n sessionKey: string,\n) => Promise<AgentSourceContext | null>;\n\nexport function isSessionSourceBinding(value: unknown): value is SessionSourceBinding {\n if (!value || typeof value !== 'object') return false;\n const row = value as Record<string, unknown>;\n return (row.kind === 'note' || row.kind === 'work_item')\n && typeof row.sourceId === 'string'\n && row.sourceId.trim().length > 0\n && typeof row.version === 'string'\n && typeof row.attachedAt === 'number';\n}\n"],"mappings":";AAyBA,SAAgB,uBAAuB,OAA+C;AACpF,KAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;CAChD,MAAM,MAAM;AACZ,SAAQ,IAAI,SAAS,UAAU,IAAI,SAAS,gBACvC,OAAO,IAAI,aAAa,YACxB,IAAI,SAAS,MAAM,CAAC,SAAS,KAC7B,OAAO,IAAI,YAAY,YACvB,OAAO,IAAI,eAAe"}
|
|
@@ -1,11 +1,20 @@
|
|
|
1
1
|
import { browserUseManual } from "./browser.js";
|
|
2
|
+
import { xopcUseManual } from "./xopc-use.js";
|
|
2
3
|
//#region src/agent/tool-manuals/index.ts
|
|
3
|
-
const TOOL_MANUALS = {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
4
|
+
const TOOL_MANUALS = {
|
|
5
|
+
browser_use: {
|
|
6
|
+
toolName: "browser_use",
|
|
7
|
+
title: "Browser Tool Manual",
|
|
8
|
+
description: "Usage guide for browser navigation, inspection, interaction, screenshots, and pipelines.",
|
|
9
|
+
content: browserUseManual
|
|
10
|
+
},
|
|
11
|
+
xopc_use: {
|
|
12
|
+
toolName: "xopc_use",
|
|
13
|
+
title: "XOPC Use Tool Manual",
|
|
14
|
+
description: "Usage guide for operating XOPC projects, notes, and project work items.",
|
|
15
|
+
content: xopcUseManual
|
|
16
|
+
}
|
|
17
|
+
};
|
|
9
18
|
function normalizeToolName(toolName) {
|
|
10
19
|
return toolName.trim().toLowerCase();
|
|
11
20
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../src/agent/tool-manuals/index.ts"],"sourcesContent":["import { browserUseManual } from './browser.js';\n\nexport interface ToolManual {\n toolName: string;\n title: string;\n description: string;\n content: string;\n}\n\nexport type ToolManualSummary = Omit<ToolManual, 'content'>;\n\nconst TOOL_MANUALS: Record<string, ToolManual> = {\n browser_use: {\n toolName: 'browser_use',\n title: 'Browser Tool Manual',\n description: 'Usage guide for browser navigation, inspection, interaction, screenshots, and pipelines.',\n content: browserUseManual,\n },\n};\n\nfunction normalizeToolName(toolName: string): string {\n return toolName.trim().toLowerCase();\n}\n\nexport function getToolManual(toolName: string): ToolManual | null {\n return TOOL_MANUALS[normalizeToolName(toolName)] ?? null;\n}\n\nexport function hasToolManual(toolName: string): boolean {\n return getToolManual(toolName) !== null;\n}\n\nexport function listToolManuals(): ToolManualSummary[] {\n return Object.values(TOOL_MANUALS)\n .map(({ toolName, title, description }) => ({ toolName, title, description }))\n .sort((a, b) => a.toolName.localeCompare(b.toolName));\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../src/agent/tool-manuals/index.ts"],"sourcesContent":["import { browserUseManual } from './browser.js';\nimport { xopcUseManual } from './xopc-use.js';\n\nexport interface ToolManual {\n toolName: string;\n title: string;\n description: string;\n content: string;\n}\n\nexport type ToolManualSummary = Omit<ToolManual, 'content'>;\n\nconst TOOL_MANUALS: Record<string, ToolManual> = {\n browser_use: {\n toolName: 'browser_use',\n title: 'Browser Tool Manual',\n description: 'Usage guide for browser navigation, inspection, interaction, screenshots, and pipelines.',\n content: browserUseManual,\n },\n xopc_use: {\n toolName: 'xopc_use',\n title: 'XOPC Use Tool Manual',\n description: 'Usage guide for operating XOPC projects, notes, and project work items.',\n content: xopcUseManual,\n },\n};\n\nfunction normalizeToolName(toolName: string): string {\n return toolName.trim().toLowerCase();\n}\n\nexport function getToolManual(toolName: string): ToolManual | null {\n return TOOL_MANUALS[normalizeToolName(toolName)] ?? null;\n}\n\nexport function hasToolManual(toolName: string): boolean {\n return getToolManual(toolName) !== null;\n}\n\nexport function listToolManuals(): ToolManualSummary[] {\n return Object.values(TOOL_MANUALS)\n .map(({ toolName, title, description }) => ({ toolName, title, description }))\n .sort((a, b) => a.toolName.localeCompare(b.toolName));\n}\n"],"mappings":";;;AAYA,MAAM,eAA2C;CAC/C,aAAa;EACX,UAAU;EACV,OAAO;EACP,aAAa;EACb,SAAS;EACV;CACD,UAAU;EACR,UAAU;EACV,OAAO;EACP,aAAa;EACb,SAAS;EACV;CACF;AAED,SAAS,kBAAkB,UAA0B;AACnD,QAAO,SAAS,MAAM,CAAC,aAAa;;AAGtC,SAAgB,cAAc,UAAqC;AACjE,QAAO,aAAa,kBAAkB,SAAS,KAAK;;AAGtD,SAAgB,cAAc,UAA2B;AACvD,QAAO,cAAc,SAAS,KAAK;;AAGrC,SAAgB,kBAAuC;AACrD,QAAO,OAAO,OAAO,aAAa,CAC/B,KAAK,EAAE,UAAU,OAAO,mBAAmB;EAAE;EAAU;EAAO;EAAa,EAAE,CAC7E,MAAM,GAAG,MAAM,EAAE,SAAS,cAAc,EAAE,SAAS,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const xopcUseManual = "# XOPC Use Tool Manual\n\n## Overview\n\n`xopc_use` is the unified tool for operating XOPC product objects. Use it instead of editing storage files or database rows directly.\n\nBasic shape:\n\n```json\n{\n \"mode\": \"project | note | work_item\",\n \"command\": \"list | get | create | update | append | preview_edit | resolve_workspace\",\n \"args\": { \"...\": \"...\" },\n \"dryRun\": false\n}\n```\n\n## General Rules\n\n- Use `list` or `get` first when the target object is ambiguous.\n- Use `dryRun: true` before a broad or risky change.\n- Prefer additive operations over destructive replacement.\n- Do not invent ids. If an id is not known, search/list first.\n- Do not attempt delete/archive workflows through this tool unless the command is explicitly supported.\n- For non-trivial note rewrites, use `note.preview_edit` before `note.update`.\n\n## Projects\n\nProjects group sessions, work items, goals, workflows, files, and project instructions.\n\n### Find projects\n\n```json\n{ \"mode\": \"project\", \"command\": \"list\", \"args\": { \"search\": \"release\", \"limit\": 10 } }\n```\n\n### Read project detail\n\n```json\n{ \"mode\": \"project\", \"command\": \"get\", \"args\": { \"projectId\": \"project_id\" } }\n```\n\n### Create a project\n\nUse when the user asks to start or formalize a project. Include `workspaceRoot` when the project maps to a local repository or directory. Include `brief` for the concise product idea and `instructions` for agent-operating guidance.\n\n```json\n{\n \"mode\": \"project\",\n \"command\": \"create\",\n \"args\": {\n \"name\": \"AI Product Research\",\n \"workspaceRoot\": \"/path/to/repo\",\n \"brief\": \"Explore demand and feasibility for an AI product.\",\n \"instructions\": \"Keep decisions and open questions current.\"\n }\n}\n```\n\n### Update a project\n\nUse for metadata, brief, status, or instructions. Use `dryRun` first when changing `workspaceRoot` or broad instructions.\n\n```json\n{\n \"mode\": \"project\",\n \"command\": \"update\",\n \"args\": {\n \"projectId\": \"project_id\",\n \"status\": \"active\",\n \"instructions\": \"Prioritize safe previews before changing notes.\"\n }\n}\n```\n\n### Resolve workspace\n\nUse when a file path or current working directory should be mapped to a project.\n\n```json\n{\n \"mode\": \"project\",\n \"command\": \"resolve_workspace\",\n \"args\": { \"workspacePath\": \"/path/to/repo\", \"autoCreate\": false }\n}\n```\n\n## Notes\n\nNotes are user-owned markdown objects. Treat them as durable user content.\n\n### Find notes\n\n```json\n{ \"mode\": \"note\", \"command\": \"list\", \"args\": { \"search\": \"pricing\", \"limit\": 10 } }\n```\n\n### Create a note\n\n```json\n{\n \"mode\": \"note\",\n \"command\": \"create\",\n \"args\": {\n \"title\": \"Product direction\",\n \"markdown\": \"Initial notes...\",\n \"tags\": [\"product\"]\n }\n}\n```\n\n### Append to a note\n\nPrefer append when preserving original user notes and adding AI output.\n\n```json\n{\n \"mode\": \"note\",\n \"command\": \"append\",\n \"args\": {\n \"noteId\": \"note_id\",\n \"heading\": \"AI synthesis\",\n \"content\": \"Key points...\"\n }\n}\n```\n\n### Preview an edit\n\nUse before rewriting or restructuring a note.\n\n```json\n{\n \"mode\": \"note\",\n \"command\": \"preview_edit\",\n \"args\": {\n \"noteId\": \"note_id\",\n \"instruction\": \"Summarize this as action items\"\n }\n}\n```\n\n### Update a note\n\nUse only when the user clearly wants the canonical note changed. Prefer `append` or `preview_edit` otherwise.\n\n```json\n{\n \"mode\": \"note\",\n \"command\": \"update\",\n \"args\": {\n \"noteId\": \"note_id\",\n \"status\": \"processed\",\n \"tags\": [\"product\", \"validated\"]\n }\n}\n```\n\n## Work Items\n\nWork items are project-scoped tasks. If `projectId` is omitted, the tool may inherit the current session's project binding.\n\n### Create a work item\n\n```json\n{\n \"mode\": \"work_item\",\n \"command\": \"create\",\n \"args\": {\n \"projectId\": \"project_id\",\n \"title\": \"Validate technical feasibility\",\n \"description\": \"Check API, storage, UI, and safety implications.\",\n \"priority\": \"high\",\n \"status\": \"todo\"\n }\n}\n```\n\n### Update a work item\n\n```json\n{\n \"mode\": \"work_item\",\n \"command\": \"update\",\n \"args\": {\n \"workItemId\": \"work_item_id\",\n \"status\": \"in_progress\",\n \"nextAction\": \"Prototype the xopc_use tool path.\"\n }\n}\n```\n\n## Safety\n\n- `note.update` can replace canonical user content. Use `preview_edit` first for content rewrites.\n- `project.update.workspaceRoot` changes project-file scope. Use `dryRun` and ask the user if intent is unclear.\n- `work_item.update.archivedAt` hides work from normal active views. Confirm before archiving.\n- If the user asks for deletion, explain that deletion is not exposed through `xopc_use` yet.\n";
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
//#region src/agent/tool-manuals/xopc-use.ts
|
|
2
|
+
const xopcUseManual = `# XOPC Use Tool Manual
|
|
3
|
+
|
|
4
|
+
## Overview
|
|
5
|
+
|
|
6
|
+
\`xopc_use\` is the unified tool for operating XOPC product objects. Use it instead of editing storage files or database rows directly.
|
|
7
|
+
|
|
8
|
+
Basic shape:
|
|
9
|
+
|
|
10
|
+
\`\`\`json
|
|
11
|
+
{
|
|
12
|
+
"mode": "project | note | work_item",
|
|
13
|
+
"command": "list | get | create | update | append | preview_edit | resolve_workspace",
|
|
14
|
+
"args": { "...": "..." },
|
|
15
|
+
"dryRun": false
|
|
16
|
+
}
|
|
17
|
+
\`\`\`
|
|
18
|
+
|
|
19
|
+
## General Rules
|
|
20
|
+
|
|
21
|
+
- Use \`list\` or \`get\` first when the target object is ambiguous.
|
|
22
|
+
- Use \`dryRun: true\` before a broad or risky change.
|
|
23
|
+
- Prefer additive operations over destructive replacement.
|
|
24
|
+
- Do not invent ids. If an id is not known, search/list first.
|
|
25
|
+
- Do not attempt delete/archive workflows through this tool unless the command is explicitly supported.
|
|
26
|
+
- For non-trivial note rewrites, use \`note.preview_edit\` before \`note.update\`.
|
|
27
|
+
|
|
28
|
+
## Projects
|
|
29
|
+
|
|
30
|
+
Projects group sessions, work items, goals, workflows, files, and project instructions.
|
|
31
|
+
|
|
32
|
+
### Find projects
|
|
33
|
+
|
|
34
|
+
\`\`\`json
|
|
35
|
+
{ "mode": "project", "command": "list", "args": { "search": "release", "limit": 10 } }
|
|
36
|
+
\`\`\`
|
|
37
|
+
|
|
38
|
+
### Read project detail
|
|
39
|
+
|
|
40
|
+
\`\`\`json
|
|
41
|
+
{ "mode": "project", "command": "get", "args": { "projectId": "project_id" } }
|
|
42
|
+
\`\`\`
|
|
43
|
+
|
|
44
|
+
### Create a project
|
|
45
|
+
|
|
46
|
+
Use when the user asks to start or formalize a project. Include \`workspaceRoot\` when the project maps to a local repository or directory. Include \`brief\` for the concise product idea and \`instructions\` for agent-operating guidance.
|
|
47
|
+
|
|
48
|
+
\`\`\`json
|
|
49
|
+
{
|
|
50
|
+
"mode": "project",
|
|
51
|
+
"command": "create",
|
|
52
|
+
"args": {
|
|
53
|
+
"name": "AI Product Research",
|
|
54
|
+
"workspaceRoot": "/path/to/repo",
|
|
55
|
+
"brief": "Explore demand and feasibility for an AI product.",
|
|
56
|
+
"instructions": "Keep decisions and open questions current."
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
\`\`\`
|
|
60
|
+
|
|
61
|
+
### Update a project
|
|
62
|
+
|
|
63
|
+
Use for metadata, brief, status, or instructions. Use \`dryRun\` first when changing \`workspaceRoot\` or broad instructions.
|
|
64
|
+
|
|
65
|
+
\`\`\`json
|
|
66
|
+
{
|
|
67
|
+
"mode": "project",
|
|
68
|
+
"command": "update",
|
|
69
|
+
"args": {
|
|
70
|
+
"projectId": "project_id",
|
|
71
|
+
"status": "active",
|
|
72
|
+
"instructions": "Prioritize safe previews before changing notes."
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
\`\`\`
|
|
76
|
+
|
|
77
|
+
### Resolve workspace
|
|
78
|
+
|
|
79
|
+
Use when a file path or current working directory should be mapped to a project.
|
|
80
|
+
|
|
81
|
+
\`\`\`json
|
|
82
|
+
{
|
|
83
|
+
"mode": "project",
|
|
84
|
+
"command": "resolve_workspace",
|
|
85
|
+
"args": { "workspacePath": "/path/to/repo", "autoCreate": false }
|
|
86
|
+
}
|
|
87
|
+
\`\`\`
|
|
88
|
+
|
|
89
|
+
## Notes
|
|
90
|
+
|
|
91
|
+
Notes are user-owned markdown objects. Treat them as durable user content.
|
|
92
|
+
|
|
93
|
+
### Find notes
|
|
94
|
+
|
|
95
|
+
\`\`\`json
|
|
96
|
+
{ "mode": "note", "command": "list", "args": { "search": "pricing", "limit": 10 } }
|
|
97
|
+
\`\`\`
|
|
98
|
+
|
|
99
|
+
### Create a note
|
|
100
|
+
|
|
101
|
+
\`\`\`json
|
|
102
|
+
{
|
|
103
|
+
"mode": "note",
|
|
104
|
+
"command": "create",
|
|
105
|
+
"args": {
|
|
106
|
+
"title": "Product direction",
|
|
107
|
+
"markdown": "Initial notes...",
|
|
108
|
+
"tags": ["product"]
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
\`\`\`
|
|
112
|
+
|
|
113
|
+
### Append to a note
|
|
114
|
+
|
|
115
|
+
Prefer append when preserving original user notes and adding AI output.
|
|
116
|
+
|
|
117
|
+
\`\`\`json
|
|
118
|
+
{
|
|
119
|
+
"mode": "note",
|
|
120
|
+
"command": "append",
|
|
121
|
+
"args": {
|
|
122
|
+
"noteId": "note_id",
|
|
123
|
+
"heading": "AI synthesis",
|
|
124
|
+
"content": "Key points..."
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
\`\`\`
|
|
128
|
+
|
|
129
|
+
### Preview an edit
|
|
130
|
+
|
|
131
|
+
Use before rewriting or restructuring a note.
|
|
132
|
+
|
|
133
|
+
\`\`\`json
|
|
134
|
+
{
|
|
135
|
+
"mode": "note",
|
|
136
|
+
"command": "preview_edit",
|
|
137
|
+
"args": {
|
|
138
|
+
"noteId": "note_id",
|
|
139
|
+
"instruction": "Summarize this as action items"
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
\`\`\`
|
|
143
|
+
|
|
144
|
+
### Update a note
|
|
145
|
+
|
|
146
|
+
Use only when the user clearly wants the canonical note changed. Prefer \`append\` or \`preview_edit\` otherwise.
|
|
147
|
+
|
|
148
|
+
\`\`\`json
|
|
149
|
+
{
|
|
150
|
+
"mode": "note",
|
|
151
|
+
"command": "update",
|
|
152
|
+
"args": {
|
|
153
|
+
"noteId": "note_id",
|
|
154
|
+
"status": "processed",
|
|
155
|
+
"tags": ["product", "validated"]
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
\`\`\`
|
|
159
|
+
|
|
160
|
+
## Work Items
|
|
161
|
+
|
|
162
|
+
Work items are project-scoped tasks. If \`projectId\` is omitted, the tool may inherit the current session's project binding.
|
|
163
|
+
|
|
164
|
+
### Create a work item
|
|
165
|
+
|
|
166
|
+
\`\`\`json
|
|
167
|
+
{
|
|
168
|
+
"mode": "work_item",
|
|
169
|
+
"command": "create",
|
|
170
|
+
"args": {
|
|
171
|
+
"projectId": "project_id",
|
|
172
|
+
"title": "Validate technical feasibility",
|
|
173
|
+
"description": "Check API, storage, UI, and safety implications.",
|
|
174
|
+
"priority": "high",
|
|
175
|
+
"status": "todo"
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
\`\`\`
|
|
179
|
+
|
|
180
|
+
### Update a work item
|
|
181
|
+
|
|
182
|
+
\`\`\`json
|
|
183
|
+
{
|
|
184
|
+
"mode": "work_item",
|
|
185
|
+
"command": "update",
|
|
186
|
+
"args": {
|
|
187
|
+
"workItemId": "work_item_id",
|
|
188
|
+
"status": "in_progress",
|
|
189
|
+
"nextAction": "Prototype the xopc_use tool path."
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
\`\`\`
|
|
193
|
+
|
|
194
|
+
## Safety
|
|
195
|
+
|
|
196
|
+
- \`note.update\` can replace canonical user content. Use \`preview_edit\` first for content rewrites.
|
|
197
|
+
- \`project.update.workspaceRoot\` changes project-file scope. Use \`dryRun\` and ask the user if intent is unclear.
|
|
198
|
+
- \`work_item.update.archivedAt\` hides work from normal active views. Confirm before archiving.
|
|
199
|
+
- If the user asks for deletion, explain that deletion is not exposed through \`xopc_use\` yet.
|
|
200
|
+
`;
|
|
201
|
+
//#endregion
|
|
202
|
+
export { xopcUseManual };
|
|
203
|
+
|
|
204
|
+
//# sourceMappingURL=xopc-use.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xopc-use.js","names":[],"sources":["../../../../src/agent/tool-manuals/xopc-use.ts"],"sourcesContent":["export const xopcUseManual = `# XOPC Use Tool Manual\n\n## Overview\n\n\\`xopc_use\\` is the unified tool for operating XOPC product objects. Use it instead of editing storage files or database rows directly.\n\nBasic shape:\n\n\\`\\`\\`json\n{\n \"mode\": \"project | note | work_item\",\n \"command\": \"list | get | create | update | append | preview_edit | resolve_workspace\",\n \"args\": { \"...\": \"...\" },\n \"dryRun\": false\n}\n\\`\\`\\`\n\n## General Rules\n\n- Use \\`list\\` or \\`get\\` first when the target object is ambiguous.\n- Use \\`dryRun: true\\` before a broad or risky change.\n- Prefer additive operations over destructive replacement.\n- Do not invent ids. If an id is not known, search/list first.\n- Do not attempt delete/archive workflows through this tool unless the command is explicitly supported.\n- For non-trivial note rewrites, use \\`note.preview_edit\\` before \\`note.update\\`.\n\n## Projects\n\nProjects group sessions, work items, goals, workflows, files, and project instructions.\n\n### Find projects\n\n\\`\\`\\`json\n{ \"mode\": \"project\", \"command\": \"list\", \"args\": { \"search\": \"release\", \"limit\": 10 } }\n\\`\\`\\`\n\n### Read project detail\n\n\\`\\`\\`json\n{ \"mode\": \"project\", \"command\": \"get\", \"args\": { \"projectId\": \"project_id\" } }\n\\`\\`\\`\n\n### Create a project\n\nUse when the user asks to start or formalize a project. Include \\`workspaceRoot\\` when the project maps to a local repository or directory. Include \\`brief\\` for the concise product idea and \\`instructions\\` for agent-operating guidance.\n\n\\`\\`\\`json\n{\n \"mode\": \"project\",\n \"command\": \"create\",\n \"args\": {\n \"name\": \"AI Product Research\",\n \"workspaceRoot\": \"/path/to/repo\",\n \"brief\": \"Explore demand and feasibility for an AI product.\",\n \"instructions\": \"Keep decisions and open questions current.\"\n }\n}\n\\`\\`\\`\n\n### Update a project\n\nUse for metadata, brief, status, or instructions. Use \\`dryRun\\` first when changing \\`workspaceRoot\\` or broad instructions.\n\n\\`\\`\\`json\n{\n \"mode\": \"project\",\n \"command\": \"update\",\n \"args\": {\n \"projectId\": \"project_id\",\n \"status\": \"active\",\n \"instructions\": \"Prioritize safe previews before changing notes.\"\n }\n}\n\\`\\`\\`\n\n### Resolve workspace\n\nUse when a file path or current working directory should be mapped to a project.\n\n\\`\\`\\`json\n{\n \"mode\": \"project\",\n \"command\": \"resolve_workspace\",\n \"args\": { \"workspacePath\": \"/path/to/repo\", \"autoCreate\": false }\n}\n\\`\\`\\`\n\n## Notes\n\nNotes are user-owned markdown objects. Treat them as durable user content.\n\n### Find notes\n\n\\`\\`\\`json\n{ \"mode\": \"note\", \"command\": \"list\", \"args\": { \"search\": \"pricing\", \"limit\": 10 } }\n\\`\\`\\`\n\n### Create a note\n\n\\`\\`\\`json\n{\n \"mode\": \"note\",\n \"command\": \"create\",\n \"args\": {\n \"title\": \"Product direction\",\n \"markdown\": \"Initial notes...\",\n \"tags\": [\"product\"]\n }\n}\n\\`\\`\\`\n\n### Append to a note\n\nPrefer append when preserving original user notes and adding AI output.\n\n\\`\\`\\`json\n{\n \"mode\": \"note\",\n \"command\": \"append\",\n \"args\": {\n \"noteId\": \"note_id\",\n \"heading\": \"AI synthesis\",\n \"content\": \"Key points...\"\n }\n}\n\\`\\`\\`\n\n### Preview an edit\n\nUse before rewriting or restructuring a note.\n\n\\`\\`\\`json\n{\n \"mode\": \"note\",\n \"command\": \"preview_edit\",\n \"args\": {\n \"noteId\": \"note_id\",\n \"instruction\": \"Summarize this as action items\"\n }\n}\n\\`\\`\\`\n\n### Update a note\n\nUse only when the user clearly wants the canonical note changed. Prefer \\`append\\` or \\`preview_edit\\` otherwise.\n\n\\`\\`\\`json\n{\n \"mode\": \"note\",\n \"command\": \"update\",\n \"args\": {\n \"noteId\": \"note_id\",\n \"status\": \"processed\",\n \"tags\": [\"product\", \"validated\"]\n }\n}\n\\`\\`\\`\n\n## Work Items\n\nWork items are project-scoped tasks. If \\`projectId\\` is omitted, the tool may inherit the current session's project binding.\n\n### Create a work item\n\n\\`\\`\\`json\n{\n \"mode\": \"work_item\",\n \"command\": \"create\",\n \"args\": {\n \"projectId\": \"project_id\",\n \"title\": \"Validate technical feasibility\",\n \"description\": \"Check API, storage, UI, and safety implications.\",\n \"priority\": \"high\",\n \"status\": \"todo\"\n }\n}\n\\`\\`\\`\n\n### Update a work item\n\n\\`\\`\\`json\n{\n \"mode\": \"work_item\",\n \"command\": \"update\",\n \"args\": {\n \"workItemId\": \"work_item_id\",\n \"status\": \"in_progress\",\n \"nextAction\": \"Prototype the xopc_use tool path.\"\n }\n}\n\\`\\`\\`\n\n## Safety\n\n- \\`note.update\\` can replace canonical user content. Use \\`preview_edit\\` first for content rewrites.\n- \\`project.update.workspaceRoot\\` changes project-file scope. Use \\`dryRun\\` and ask the user if intent is unclear.\n- \\`work_item.update.archivedAt\\` hides work from normal active views. Confirm before archiving.\n- If the user asks for deletion, explain that deletion is not exposed through \\`xopc_use\\` yet.\n`;\n"],"mappings":";AAAA,MAAa,gBAAgB"}
|