@xopcai/xopc 0.0.113 → 0.0.115
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/feishu/src/outbound/media-load.js +1 -1
- package/dist/extensions/feishu/src/workflow-progress.js +1 -1
- package/dist/extensions/telegram/src/adapters/streaming-adapter.js +1 -1
- package/dist/extensions/telegram/src/inbound-processor.js +1 -1
- package/dist/extensions/telegram/src/plugin.js +1 -1
- package/dist/extensions/telegram/src/routing-integration.js +2 -2
- package/dist/extensions/telegram/src/update-offset-store.js +1 -1
- package/dist/extensions/telegram/src/workflow-progress.js +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/extensions/weixin/src/api/api.js +2 -2
- package/dist/extensions/weixin/src/auth/accounts.js +1 -1
- package/dist/extensions/weixin/src/cdn/upload.js +1 -1
- package/dist/extensions/weixin/src/media/data-url.js +1 -1
- package/dist/extensions/weixin/src/messaging/debug-mode.js +1 -1
- package/dist/extensions/weixin/src/messaging/inbound.js +1 -1
- package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
- package/dist/extensions/weixin/src/plugin.js +1 -1
- package/dist/extensions/weixin/src/storage/sync-buf.js +1 -1
- package/dist/extensions/weixin/src/workflow-progress.js +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-CBlklyNr.js → agent-avatar-dicebear-DVnBfANm.js} +1 -1
- package/dist/gateway/static/root/assets/agent-browser-settings-page-DPXc4hz8.js +6 -0
- package/dist/gateway/static/root/assets/agent-defaults-tabbed-page-CTJ0YnRQ.js +1 -0
- package/dist/gateway/static/root/assets/agents-zJXQfJ_W.js +71 -0
- package/dist/gateway/static/root/assets/{app-management-settings-panel-28E_WfMe.js → app-management-settings-panel-DzGbdr04.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-Do1z0XgJ.js → appearance-settings-BQpPSTHD.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-CPjfyzSD.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-BAFlsov_.js → archive-plugin-CXu-Csep.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-V3qGPC3x.js → attachment-load-BAjgOoGY.js} +1 -1
- package/dist/gateway/static/root/assets/{binary-plugins-DT8NvA6W.js → binary-plugins-BSBgB2hO.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-CdLMEcHd.js → block-editor-BpXw9TTR.js} +3 -3
- package/dist/gateway/static/root/assets/channels-settings-BbPUpzWB.js +1 -0
- package/dist/gateway/static/root/assets/{config-api-Bf5mjpu7.js → config-api-NOoPiIYz.js} +1 -1
- package/dist/gateway/static/root/assets/connectors-settings-CAXYMOdp.js +2 -0
- package/dist/gateway/static/root/assets/{cron-api--pAB_rps.js → cron-api-C9BOqAXd.js} +1 -1
- package/dist/gateway/static/root/assets/cron-page-DuUbBeKI.js +3 -0
- package/dist/gateway/static/root/assets/{dreaming-settings-6UZE1FSK.js → dreaming-settings-DQ4DtiK1.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-BGhE7msg.js → extension-debug-page-D9kgUHCc.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-CvpI45WG.js → extension-page-CGyhXqzR.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-DAmR5FUe.js → extension-settings-page-DL8Xquqd.js} +1 -1
- package/dist/gateway/static/root/assets/{fetch-NZmjSXLl.js → fetch-D0VXA932.js} +1 -1
- package/dist/gateway/static/root/assets/{format-interval-label-qhth3BMV.js → format-interval-label-Be8SmgUw.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-api-CaXBt-9R.js → gateway-config-api-C-xjn__h.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-settings-DphpbLBc.js → gateway-settings-BMPwIjKI.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-startup-retry-Be1omjh3.js → gateway-startup-retry-DERUH61L.js} +1 -1
- package/dist/gateway/static/root/assets/goal-detail-page-BJsyjJnF.js +1 -0
- package/dist/gateway/static/root/assets/goals-config-api-BPmqWk90.js +1 -0
- package/dist/gateway/static/root/assets/goals-page-BerDgIhw.js +2 -0
- package/dist/gateway/static/root/assets/goals-settings-ByTjeAto.js +1 -0
- package/dist/gateway/static/root/assets/{heartbeat-config-api-BzO6G4fD.js → heartbeat-config-api-Bfdzr8oV.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-settings-DCST9-du.js → heartbeat-settings-TbHgcjTn.js} +1 -1
- package/dist/gateway/static/root/assets/index-AkTrf6Pb.js +122 -0
- package/dist/gateway/static/root/assets/index-fh5sXTj9.css +1 -0
- package/dist/gateway/static/root/assets/{interval-presets-DJmshV8n.js → interval-presets-utKbuCRY.js} +1 -1
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-9AUUlQ5Q.js → keyboard-shortcuts-settings-CjqS6c6V.js} +1 -1
- package/dist/gateway/static/root/assets/logs-page-DGXuPf5B.js +2 -0
- package/dist/gateway/static/root/assets/{markdown-split-CYYELqAr.js → markdown-split-DW8C47iB.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-BEcMR2M8.js → media-plugins-D6HwDhDT.js} +1 -1
- package/dist/gateway/static/root/assets/messages-upgxw6Ub.js +3 -0
- package/dist/gateway/static/root/assets/models-hub-panel-Bot16nn7.js +2 -0
- package/dist/gateway/static/root/assets/note-detail-page-Brlyou8M.js +2 -0
- package/dist/gateway/static/root/assets/{note-image-lightbox-DNAoPcmm.js → note-image-lightbox-pJM35Pz5.js} +1 -1
- package/dist/gateway/static/root/assets/notes-page-DvZ4pwc-.js +1 -0
- package/dist/gateway/static/root/assets/{preview-open-alternatives-BPLz0AIv.js → preview-open-alternatives-CVwHuyN6.js} +1 -1
- package/dist/gateway/static/root/assets/remote-access-hub-BZEDmxbZ.js +1 -0
- package/dist/gateway/static/root/assets/{save-bar-controls-CrWwWRVK.js → save-bar-controls-Ba-UEk7x.js} +1 -1
- package/dist/gateway/static/root/assets/{schedule-field-CF2sadvN.js → schedule-field-CNN9595U.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-Di5cKjYE.js → schema-form-DnNMmtD5.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-DdGGlsfn.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-DlkEkPf9.js +1 -0
- package/dist/gateway/static/root/assets/{settings-collapsible-section-Chh282jW.js → settings-collapsible-section-CmOz80i5.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-form-section-Dq-83cQd.js → settings-form-section-BmK7JJOV.js} +1 -1
- package/dist/gateway/static/root/assets/settings-page-DFPTrsPF.js +1 -0
- package/dist/gateway/static/root/assets/setup-status-panel-CYCCfgh4.js +1 -0
- package/dist/gateway/static/root/assets/{share-preview-page-0FXYnSUA.js → share-preview-page-Dp2qGrHC.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-Bff1pGd0.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-CJGKpBur.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-C6ocduTD.js +2 -0
- package/dist/gateway/static/root/assets/{system-settings-panel-W1pTcojB.js → system-settings-panel-5jrIEr5b.js} +1 -1
- package/dist/gateway/static/root/assets/{use-agent-defaults-form-BVRvkK7m.js → use-agent-defaults-form-BuiXLIs5.js} +1 -1
- package/dist/gateway/static/root/assets/{use-channel-catalog-CgJibfMM.js → use-channel-catalog-CHlO8J9G.js} +1 -1
- package/dist/gateway/static/root/assets/{use-settings-tab-guard-Bw_qkRQE.js → use-settings-tab-guard-CW5JORnl.js} +1 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-DDoQyghO.js +1 -0
- package/dist/gateway/static/root/assets/{voice-player-store-C7lziaAx.js → voice-player-store-DDDWYHvg.js} +1 -1
- package/dist/gateway/static/root/assets/workflow-page.utils-CKjeEGqx.js +1 -0
- package/dist/gateway/static/root/assets/workflows-page-B604ehHG.js +18 -0
- package/dist/gateway/static/root/index.html +5 -5
- package/dist/gateway/static/root/logo.svg +4 -3
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.d.ts +8 -0
- package/dist/src/agent/agent-manager.js +63 -28
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/agent-scope.js +1 -1
- package/dist/src/agent/bootstrap/load-bootstrap-files.js +1 -1
- package/dist/src/agent/bootstrap/project-agents-context.d.ts +2 -0
- package/dist/src/agent/bootstrap/project-agents-context.js +32 -0
- package/dist/src/agent/bootstrap/project-agents-context.js.map +1 -0
- package/dist/src/agent/context/workspace-seed.js +2 -2
- package/dist/src/agent/context/workspace-state.js +1 -1
- package/dist/src/agent/context/workspace.js +1 -1
- package/dist/src/agent/embedded/session-tool-result-guard.js +8 -1
- package/dist/src/agent/embedded/session-tool-result-guard.js.map +1 -1
- package/dist/src/agent/goals/checklist-judge.d.ts +1 -0
- package/dist/src/agent/goals/checklist-judge.js +3 -2
- package/dist/src/agent/goals/checklist-judge.js.map +1 -1
- package/dist/src/agent/goals/evaluate-turn.d.ts +1 -1
- package/dist/src/agent/goals/evaluate-turn.js +1 -0
- package/dist/src/agent/goals/evaluate-turn.js.map +1 -1
- package/dist/src/agent/goals/goal-locale.js +2 -2
- package/dist/src/agent/goals/persistent-goal-service.js +2 -4
- package/dist/src/agent/goals/persistent-goal-service.js.map +1 -1
- package/dist/src/agent/goals/post-turn.d.ts +6 -1
- package/dist/src/agent/goals/post-turn.js +15 -6
- package/dist/src/agent/goals/post-turn.js.map +1 -1
- package/dist/src/agent/image/load-image-media.js +2 -2
- package/dist/src/agent/inbound/inbound-loop.js +5 -1
- package/dist/src/agent/inbound/inbound-loop.js.map +1 -1
- package/dist/src/agent/inbound/turn-dispatcher.d.ts +2 -2
- package/dist/src/agent/inbound/turn-dispatcher.js +2 -2
- package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -1
- package/dist/src/agent/ipc/inbox.js +3 -3
- package/dist/src/agent/ipc/socket.js +1 -1
- package/dist/src/agent/mcp/bundle-mcp-materialize.d.ts +27 -0
- package/dist/src/agent/mcp/bundle-mcp-materialize.js +50 -2
- package/dist/src/agent/mcp/bundle-mcp-materialize.js.map +1 -1
- package/dist/src/agent/mcp/bundle-mcp-runtime.js +79 -4
- package/dist/src/agent/mcp/bundle-mcp-runtime.js.map +1 -1
- package/dist/src/agent/mcp/bundle-mcp-types.d.ts +19 -0
- package/dist/src/agent/mcp/mcp-transport-config.js +1 -1
- package/dist/src/agent/mcp/mcp-transport.js +1 -1
- package/dist/src/agent/memory/builtin-memory-store.js +1 -1
- package/dist/src/agent/memory/dreaming/deep-promotion.js +1 -1
- package/dist/src/agent/memory/dreaming/events.js +1 -1
- package/dist/src/agent/memory/dreaming/last-run.js +1 -1
- package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
- package/dist/src/agent/memory/dreaming/preview.js +1 -1
- package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
- package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
- package/dist/src/agent/memory/dreaming/utils.js +1 -1
- package/dist/src/agent/memory/memory-flush.js +1 -1
- package/dist/src/agent/memory/plugin-discovery.js +1 -1
- package/dist/src/agent/models/manager.js +1 -1
- package/dist/src/agent/prompt/memory/index.js +1 -1
- package/dist/src/agent/prompt/service-prompt-builder.js +2 -2
- package/dist/src/agent/reply/post-compaction-context.js +1 -1
- package/dist/src/agent/reply/workspace-boundary-read.js +1 -1
- package/dist/src/agent/sandbox/path-policy.js +2 -2
- package/dist/src/agent/service/btw-query.js +11 -3
- package/dist/src/agent/service/btw-query.js.map +1 -1
- package/dist/src/agent/service/parse-outbound-session-key.js +13 -8
- package/dist/src/agent/service/parse-outbound-session-key.js.map +1 -1
- package/dist/src/agent/service/process-direct-one-shot.d.ts +2 -2
- package/dist/src/agent/service/process-direct-one-shot.js +1 -1
- package/dist/src/agent/service/process-direct-one-shot.js.map +1 -1
- package/dist/src/agent/service/process-direct-streaming.d.ts +2 -2
- package/dist/src/agent/service/process-direct-streaming.js +1 -1
- package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
- package/dist/src/agent/service.d.ts +1 -1
- package/dist/src/agent/service.js +13 -9
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/service.types.d.ts +5 -0
- package/dist/src/agent/session/session-inspector.js +1 -1
- package/dist/src/agent/skills/config.js +2 -2
- package/dist/src/agent/skills/filesystem-watcher.js +5 -4
- package/dist/src/agent/skills/filesystem-watcher.js.map +1 -1
- package/dist/src/agent/skills/hub-hash.js +2 -2
- package/dist/src/agent/skills/hub-lock.js +1 -1
- package/dist/src/agent/skills/hub-pull.js +2 -2
- package/dist/src/agent/skills/index.js +4 -3
- package/dist/src/agent/skills/index.js.map +1 -1
- package/dist/src/agent/skills/installer.js +2 -2
- package/dist/src/agent/skills/managed-store.js +1 -1
- package/dist/src/agent/skills/skill-manage-ops.js +3 -2
- package/dist/src/agent/skills/skill-manage-ops.js.map +1 -1
- package/dist/src/agent/skills/skill-manager.js +1 -1
- package/dist/src/agent/skills/skill-view-path.js +1 -1
- package/dist/src/agent/skills/test-framework.js +1 -1
- package/dist/src/agent/skills/types.d.ts +1 -1
- package/dist/src/agent/skills/watcher.js +2 -5
- package/dist/src/agent/skills/watcher.js.map +1 -1
- package/dist/src/agent/skills/workspace-skills-dir.d.ts +1 -0
- package/dist/src/agent/skills/workspace-skills-dir.js +11 -0
- package/dist/src/agent/skills/workspace-skills-dir.js.map +1 -0
- package/dist/src/agent/starter-agents.js +1 -1
- package/dist/src/agent/tool-manuals/browser.d.ts +1 -1
- package/dist/src/agent/tool-manuals/browser.js +62 -3
- package/dist/src/agent/tool-manuals/browser.js.map +1 -1
- package/dist/src/agent/tools/browser/tool/browser-use-tool.d.ts +4 -1
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js +13 -4
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
- package/dist/src/agent/tools/browser/tool/schemas.d.ts +0 -2
- package/dist/src/agent/tools/browser/tool/schemas.js +1 -2
- package/dist/src/agent/tools/browser/tool/schemas.js.map +1 -1
- package/dist/src/agent/tools/dreaming-tool.js +1 -1
- package/dist/src/agent/tools/factory.js +1 -10
- package/dist/src/agent/tools/factory.js.map +1 -1
- package/dist/src/agent/tools/find.js +1 -1
- package/dist/src/agent/tools/grep.js +1 -1
- package/dist/src/agent/tools/image-generate-tool.js +1 -1
- package/dist/src/agent/tools/skill-manage-tool.js +2 -2
- package/dist/src/agent/tools/skill-manage-tool.js.map +1 -1
- package/dist/src/agent/tools/workflow-tool.js +1 -1
- package/dist/src/agent/workflow/catalog.js +1 -1
- package/dist/src/agent/workflow/snapshot.d.ts +10 -0
- package/dist/src/agent/workflow/snapshot.js +136 -1
- package/dist/src/agent/workflow/snapshot.js.map +1 -1
- package/dist/src/agent/workflow/subagent-runner.js +18 -1
- package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
- 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 +2 -2
- package/dist/src/auth/sync-provider-auth.js +1 -1
- package/dist/src/browser/actions/extension-registry-bridge.js +91 -7
- package/dist/src/browser/actions/extension-registry-bridge.js.map +1 -1
- package/dist/src/browser/actions/registry.js +383 -7
- package/dist/src/browser/actions/registry.js.map +1 -1
- package/dist/src/browser/actions/types.d.ts +11 -3
- package/dist/src/browser/cache-dir-policy.js +1 -1
- package/dist/src/browser/cdp-local-launcher.js +2 -2
- package/dist/src/browser/index.js +2 -2
- package/dist/src/browser/pipeline/output.d.ts +18 -16
- package/dist/src/browser/pipeline/output.js +28 -20
- package/dist/src/browser/pipeline/output.js.map +1 -1
- package/dist/src/browser/pipeline/runner.d.ts +7 -14
- package/dist/src/browser/pipeline/runner.js +349 -102
- package/dist/src/browser/pipeline/runner.js.map +1 -1
- package/dist/src/browser/pipeline/schema.d.ts +1 -0
- package/dist/src/browser/pipeline/schema.js +35 -58
- package/dist/src/browser/pipeline/schema.js.map +1 -1
- package/dist/src/browser/pipeline/source.d.ts +2 -0
- package/dist/src/browser/pipeline/source.js +10 -1
- package/dist/src/browser/pipeline/source.js.map +1 -1
- package/dist/src/browser/pipeline/template.d.ts +10 -2
- package/dist/src/browser/pipeline/template.js +50 -8
- package/dist/src/browser/pipeline/template.js.map +1 -1
- package/dist/src/browser/providers/browser-ext-install.js +4 -4
- package/dist/src/browser/providers/cloakbrowser.js +5 -5
- package/dist/src/browser/providers/playwright-doctor.js +1 -1
- package/dist/src/browser/stealth.js +1 -1
- package/dist/src/channels/catalog/channel-catalog-service.d.ts +2 -1
- package/dist/src/channels/catalog/channel-catalog-service.js +133 -16
- package/dist/src/channels/catalog/channel-catalog-service.js.map +1 -1
- package/dist/src/channels/catalog/channel-catalog-types.d.ts +13 -0
- package/dist/src/channels/outbound/persist-store.js +1 -1
- package/dist/src/channels/pairing/allow-from-file.js +1 -1
- package/dist/src/channels/pairing/pairing-store.js +2 -2
- package/dist/src/chat-commands/agent-edit.js +2 -2
- package/dist/src/chat-commands/builtins/config.js +5 -7
- package/dist/src/chat-commands/builtins/config.js.map +1 -1
- package/dist/src/chat-commands/context.d.ts +5 -0
- package/dist/src/chat-commands/context.js +18 -9
- package/dist/src/chat-commands/context.js.map +1 -1
- package/dist/src/chat-commands/index.d.ts +1 -1
- package/dist/src/chat-commands/index.js +2 -2
- package/dist/src/chat-commands/index.js.map +1 -1
- package/dist/src/chat-commands/processor.js +22 -21
- package/dist/src/chat-commands/processor.js.map +1 -1
- package/dist/src/chat-commands/session-key.d.ts +3 -15
- package/dist/src/chat-commands/session-key.js +3 -49
- package/dist/src/chat-commands/session-key.js.map +1 -1
- package/dist/src/chat-commands/types.d.ts +4 -0
- package/dist/src/cli/commands/browser-cli-helpers.js +11 -5
- package/dist/src/cli/commands/browser-cli-helpers.js.map +1 -1
- package/dist/src/cli/commands/config.js +1 -1
- package/dist/src/cli/commands/doctor/checks/channel-config.js +14 -1
- package/dist/src/cli/commands/doctor/checks/channel-config.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/config-health.js +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
- package/dist/src/cli/commands/doctor/checks/session-integrity.js +8 -8
- package/dist/src/cli/commands/doctor/checks/session-integrity.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/state-integrity.js +1 -1
- package/dist/src/cli/commands/doctor/checks/workspace-status.js +1 -1
- package/dist/src/cli/commands/extension-create.js +1 -1
- package/dist/src/cli/commands/extension-dev.js +2 -2
- package/dist/src/cli/commands/extension-marketplace.js +2 -2
- package/dist/src/cli/commands/extension-pack.js +2 -2
- package/dist/src/cli/commands/extension.js +3 -3
- package/dist/src/cli/commands/gateway/logs.js +1 -1
- package/dist/src/cli/commands/image.js +1 -1
- package/dist/src/cli/commands/init.js +2 -2
- package/dist/src/cli/commands/models.js +1 -1
- package/dist/src/cli/commands/skills-test.js +1 -1
- package/dist/src/cli/templates.js +1 -1
- package/dist/src/cli/utils/gateway-client.js +1 -1
- package/dist/src/cli/utils/init-workspace-core.js +2 -2
- package/dist/src/config/agent-profile.js +1 -1
- package/dist/src/config/agent-typed-models.js +1 -1
- package/dist/src/config/gateway-bind.js +1 -1
- package/dist/src/config/index.js +7 -7
- package/dist/src/config/loader.js +4 -4
- package/dist/src/config/models-json.js +2 -2
- package/dist/src/config/paths-state.js +1 -1
- package/dist/src/config/paths.js +1 -1
- package/dist/src/config/profile.js +1 -1
- package/dist/src/config/reload.js +1 -1
- package/dist/src/config/rules.js +5 -0
- package/dist/src/config/rules.js.map +1 -1
- package/dist/src/config/schema.d.ts +8 -0
- package/dist/src/config/schema.js +7 -0
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/config/web-patch.d.ts +1 -0
- package/dist/src/config/web-patch.js +1 -0
- package/dist/src/config/web-patch.js.map +1 -1
- package/dist/src/config/workspace-path.js +1 -1
- package/dist/src/connectors/builtin-catalog.js +180 -1
- package/dist/src/connectors/builtin-catalog.js.map +1 -1
- package/dist/src/connectors/health.js +18 -9
- package/dist/src/connectors/health.js.map +1 -1
- package/dist/src/connectors/types.d.ts +19 -0
- package/dist/src/connectors/usage.js +12 -4
- package/dist/src/connectors/usage.js.map +1 -1
- package/dist/src/cron/executor.js +1 -1
- package/dist/src/cron/service.js +1 -1
- package/dist/src/daemon/constants.js +1 -1
- package/dist/src/daemon/install-plan.js +2 -2
- package/dist/src/daemon/launchd.js +2 -2
- package/dist/src/daemon/schtasks.js +2 -2
- package/dist/src/daemon/systemd.js +2 -2
- package/dist/src/extensions/bundle-mcp.js +1 -1
- package/dist/src/extensions/discover-extensions.js +2 -2
- package/dist/src/extensions/health.js +1 -1
- package/dist/src/extensions/install.js +2 -2
- package/dist/src/extensions/loader.js +2 -2
- package/dist/src/extensions/lockfile.js +3 -3
- package/dist/src/extensions/security.js +1 -1
- package/dist/src/extensions/types/tui.d.ts +2 -0
- package/dist/src/extensions/update.js +2 -2
- package/dist/src/gateway/agents-admin.js +2 -2
- package/dist/src/gateway/file-path-classifier.js +2 -2
- package/dist/src/gateway/heartbeat/service.js +13 -1
- package/dist/src/gateway/heartbeat/service.js.map +1 -1
- package/dist/src/gateway/hono/app.js +18 -5
- package/dist/src/gateway/hono/app.js.map +1 -1
- package/dist/src/gateway/hono/lib/config-payload.d.ts +3 -1
- package/dist/src/gateway/hono/lib/config-payload.js +7 -4
- package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
- package/dist/src/gateway/hono/lib/extension-store.js +2 -2
- package/dist/src/gateway/hono/lib/static-ui.js +2 -2
- package/dist/src/gateway/hono/middleware/strict-rate-limit.d.ts +4 -0
- package/dist/src/gateway/hono/middleware/strict-rate-limit.js +19 -5
- package/dist/src/gateway/hono/middleware/strict-rate-limit.js.map +1 -1
- package/dist/src/gateway/hono/oauth-async.js +1 -1
- package/dist/src/gateway/hono/routes/agent-stream.js +6 -6
- package/dist/src/gateway/hono/routes/agent-stream.js.map +1 -1
- package/dist/src/gateway/hono/routes/agents.js +1 -1
- package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
- package/dist/src/gateway/hono/routes/channels.js +18 -14
- package/dist/src/gateway/hono/routes/channels.js.map +1 -1
- package/dist/src/gateway/hono/routes/config-patch/gateway.d.ts +1 -1
- package/dist/src/gateway/hono/routes/config-patch/gateway.js +6 -0
- package/dist/src/gateway/hono/routes/config-patch/gateway.js.map +1 -1
- package/dist/src/gateway/hono/routes/config-patch/misc.js +1 -1
- package/dist/src/gateway/hono/routes/deps.d.ts +1 -0
- package/dist/src/gateway/hono/routes/dreaming.js +1 -1
- package/dist/src/gateway/hono/routes/goals.js +16 -3
- package/dist/src/gateway/hono/routes/goals.js.map +1 -1
- package/dist/src/gateway/hono/routes/host-fs.js +2 -2
- package/dist/src/gateway/hono/routes/logs.js +1 -0
- package/dist/src/gateway/hono/routes/logs.js.map +1 -1
- package/dist/src/gateway/hono/routes/mcp.js +27 -8
- package/dist/src/gateway/hono/routes/mcp.js.map +1 -1
- package/dist/src/gateway/hono/routes/models.js +1 -1
- package/dist/src/gateway/hono/routes/notes.js +14 -2
- package/dist/src/gateway/hono/routes/notes.js.map +1 -1
- package/dist/src/gateway/hono/routes/sessions.js +62 -4
- package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
- package/dist/src/gateway/hono/routes/shares.js +1 -1
- package/dist/src/gateway/hono/routes/workflows.js +1 -1
- package/dist/src/gateway/hono/routes/workspace.js +5 -68
- package/dist/src/gateway/hono/routes/workspace.js.map +1 -1
- package/dist/src/gateway/hono/sse.d.ts +2 -2
- package/dist/src/gateway/hono/sse.js +7 -15
- package/dist/src/gateway/hono/sse.js.map +1 -1
- package/dist/src/gateway/lock.js +3 -3
- package/dist/src/gateway/ports.js +1 -1
- package/dist/src/gateway/rate-limit/buckets.d.ts +3 -0
- package/dist/src/gateway/rate-limit/buckets.js +12 -0
- package/dist/src/gateway/rate-limit/buckets.js.map +1 -1
- package/dist/src/gateway/resolve-webchat-session-key.d.ts +2 -6
- package/dist/src/gateway/resolve-webchat-session-key.js +5 -31
- package/dist/src/gateway/resolve-webchat-session-key.js.map +1 -1
- package/dist/src/gateway/service/agent-runner.d.ts +2 -3
- package/dist/src/gateway/service/agent-runner.js +9 -22
- package/dist/src/gateway/service/agent-runner.js.map +1 -1
- package/dist/src/gateway/service/config-coordinator.js +1 -1
- package/dist/src/gateway/service/marketplace-service.js +2 -2
- package/dist/src/gateway/service/run-gateway-agent.js +9 -7
- package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
- package/dist/src/gateway/service/sessions-api.d.ts +9 -0
- package/dist/src/gateway/service/sessions-api.js +11 -0
- package/dist/src/gateway/service/sessions-api.js.map +1 -1
- package/dist/src/gateway/service.d.ts +1 -1
- package/dist/src/gateway/service.js +23 -9
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/gateway/workspace-file-search.d.ts +9 -0
- package/dist/src/gateway/workspace-file-search.js +76 -0
- package/dist/src/gateway/workspace-file-search.js.map +1 -0
- package/dist/src/gateway/workspace-fs-file-list.js +1 -1
- package/dist/src/goals/goal-notifications.d.ts +2 -0
- package/dist/src/goals/goal-notifications.js +16 -11
- package/dist/src/goals/goal-notifications.js.map +1 -1
- package/dist/src/goals/goal-service.js +1 -6
- package/dist/src/goals/goal-service.js.map +1 -1
- package/dist/src/goals/goal-workflow-judge.js +2 -2
- package/dist/src/i18n/goals-bundle.js +1 -1
- package/dist/src/i18n/index.js +1 -1
- package/dist/src/i18n/share-tool-bundle.js +2 -2
- package/dist/src/infra/brew.js +1 -1
- package/dist/src/infra/package-json.js +1 -1
- package/dist/src/infra/package-update-steps.js +1 -1
- package/dist/src/infra/path-env.js +2 -2
- package/dist/src/infra/restart.js +1 -1
- package/dist/src/infra/stable-node-path.js +1 -1
- package/dist/src/infra/update-check.js +1 -1
- package/dist/src/infra/update-global.js +1 -1
- package/dist/src/infra/update-lock.js +2 -2
- package/dist/src/infra/update-restart.js +1 -1
- package/dist/src/infra/update-runner.js +1 -1
- package/dist/src/infra/update-startup.js +1 -1
- package/dist/src/infra/write-file-atomic.js +2 -2
- package/dist/src/media/store.js +1 -1
- package/dist/src/notes/agent-context.js +1 -1
- package/dist/src/notes/service.js +1 -1
- package/dist/src/notes/store.js +2 -2
- package/dist/src/project-trust/trust-store.js +4 -2
- package/dist/src/project-trust/trust-store.js.map +1 -1
- package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
- package/dist/src/providers/index.js +1 -1
- package/dist/src/providers/model-registry.js +4 -4
- package/dist/src/session/index.d.ts +1 -1
- package/dist/src/session/index.js +2 -2
- package/dist/src/session/init-session-turn.js +7 -10
- package/dist/src/session/init-session-turn.js.map +1 -1
- package/dist/src/session/manager.d.ts +5 -1
- package/dist/src/session/manager.js +5 -2
- package/dist/src/session/manager.js.map +1 -1
- package/dist/src/session/reset-type.d.ts +0 -2
- package/dist/src/session/reset-type.js +3 -9
- package/dist/src/session/reset-type.js.map +1 -1
- package/dist/src/session/resolve-session.js +10 -21
- package/dist/src/session/resolve-session.js.map +1 -1
- package/dist/src/session/session-title.js +2 -2
- package/dist/src/session/store.d.ts +11 -3
- package/dist/src/session/store.js +30 -14
- package/dist/src/session/store.js.map +1 -1
- package/dist/src/session/types.d.ts +2 -4
- package/dist/src/session/types.js.map +1 -1
- package/dist/src/share/share-auto.js +2 -2
- package/dist/src/share/share-store.js +3 -3
- package/dist/src/share/share-thumbnail.js +2 -2
- package/dist/src/share/share-zip.js +1 -1
- package/dist/src/share/site-share-store.js +3 -3
- package/dist/src/share/site-static-serve.js +1 -1
- package/dist/src/storage/sqlite/connection.js +1 -1
- package/dist/src/storage/sqlite/index.d.ts +2 -2
- package/dist/src/storage/sqlite/index.js +3 -3
- package/dist/src/storage/sqlite/memory-index-repository.js +2 -2
- package/dist/src/storage/sqlite/migrations/010_session_id_identity.sql +30 -0
- package/dist/src/storage/sqlite/migrations/discover.js +1 -1
- package/dist/src/storage/sqlite/migrations/runner.d.ts +2 -2
- package/dist/src/storage/sqlite/migrations/runner.js +5 -5
- package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
- package/dist/src/storage/sqlite/migrations/runner.ts +2 -2
- package/dist/src/storage/sqlite/row-mappers.d.ts +4 -4
- package/dist/src/storage/sqlite/row-mappers.js +11 -14
- package/dist/src/storage/sqlite/row-mappers.js.map +1 -1
- package/dist/src/storage/sqlite/schema.js +4 -4
- package/dist/src/storage/sqlite/schema.js.map +1 -1
- package/dist/src/storage/sqlite/schema.sql +37 -10
- package/dist/src/storage/sqlite/session-metadata.d.ts +2 -7
- package/dist/src/storage/sqlite/session-metadata.js +18 -72
- package/dist/src/storage/sqlite/session-metadata.js.map +1 -1
- package/dist/src/storage/sqlite/session-repository.d.ts +6 -5
- package/dist/src/storage/sqlite/session-repository.js +34 -40
- package/dist/src/storage/sqlite/session-repository.js.map +1 -1
- package/dist/src/storage/sqlite/transcript-repository.d.ts +2 -2
- package/dist/src/storage/sqlite/transcript-repository.js +52 -52
- package/dist/src/storage/sqlite/transcript-repository.js.map +1 -1
- package/dist/src/tui/backends/embedded-backend.d.ts +18 -4
- package/dist/src/tui/backends/embedded-backend.js +100 -1
- package/dist/src/tui/backends/embedded-backend.js.map +1 -1
- package/dist/src/tui/backends/gateway-sse-backend.d.ts +5 -1
- package/dist/src/tui/backends/gateway-sse-backend.js +45 -2
- package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
- package/dist/src/tui/clipboard-image.js +3 -3
- package/dist/src/tui/components/chat-log.d.ts +2 -0
- package/dist/src/tui/components/chat-log.js +19 -0
- package/dist/src/tui/components/chat-log.js.map +1 -1
- package/dist/src/tui/extension-host/autocomplete.d.ts +3 -2
- package/dist/src/tui/extension-host/autocomplete.js +29 -12
- package/dist/src/tui/extension-host/autocomplete.js.map +1 -1
- package/dist/src/tui/extension-host/load-extensions.js +1 -1
- package/dist/src/tui/extension-host/runtime.d.ts +12 -0
- package/dist/src/tui/extension-host/runtime.js +6 -4
- package/dist/src/tui/extension-host/runtime.js.map +1 -1
- package/dist/src/tui/theme-manager.js +1 -1
- package/dist/src/tui/tui-backend.d.ts +23 -0
- package/dist/src/tui/tui-command-formatters.js +4 -4
- package/dist/src/tui/tui-commands.d.ts +16 -3
- package/dist/src/tui/tui-commands.js +134 -27
- package/dist/src/tui/tui-commands.js.map +1 -1
- package/dist/src/tui/tui-file-autocomplete.d.ts +5 -0
- package/dist/src/tui/tui-file-autocomplete.js +26 -0
- package/dist/src/tui/tui-file-autocomplete.js.map +1 -0
- package/dist/src/tui/tui-keybindings-file.js +1 -1
- package/dist/src/tui/tui-picker-overlay.js +1 -1
- package/dist/src/tui/tui-scoped-models.js +2 -2
- package/dist/src/tui/tui-settings.js +1 -1
- package/dist/src/tui/tui-startup-resources.js +1 -1
- package/dist/src/tui/tui-startup-text.js +1 -1
- package/dist/src/tui/tui-startup-text.js.map +1 -1
- package/dist/src/tui/tui.js +106 -17
- package/dist/src/tui/tui.js.map +1 -1
- package/dist/src/tunnel/frpc-binary.js +4 -4
- package/dist/src/tunnel/frpc-config.js +1 -1
- package/dist/src/tunnel/frpc-extract.js +1 -1
- package/dist/src/tunnel/tunnel-state.js +1 -1
- package/dist/src/utils/logger/audit.js +1 -1
- package/dist/src/utils/logger/context.d.ts +2 -2
- package/dist/src/utils/logger/context.js +2 -1
- package/dist/src/utils/logger/context.js.map +1 -1
- package/dist/src/utils/logger/log-store.js +2 -1
- package/dist/src/utils/logger/log-store.js.map +1 -1
- package/dist/src/utils/logger/pino-record.js +3 -0
- package/dist/src/utils/logger/pino-record.js.map +1 -1
- package/dist/src/utils/logger/rotation.js +1 -1
- package/dist/src/utils/logger/streams.js +1 -1
- package/dist/src/utils/logger/types.d.ts +5 -0
- package/dist/src/utils/logger/types.js.map +1 -1
- package/dist/src/voice/tts/audio.js +1 -1
- package/dist/src/voice/tts/providers/edge-speech.js +2 -2
- package/dist/src/workflows/draft/workflow-draft-service.js +1 -1
- package/dist/src/workflows/service/workflow-run-service.js +1 -1
- package/dist/src/workflows/service/workflow-session-bridge.js +13 -1
- package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
- package/dist/src/workflows/store/event-store.js +1 -1
- package/dist/src/workflows/store/run-store.js +1 -1
- package/package.json +1 -1
- package/dist/gateway/static/root/assets/agent-browser-settings-page-rGbKc2Hh.js +0 -6
- package/dist/gateway/static/root/assets/agent-defaults-tabbed-page-CtwVbjOA.js +0 -1
- package/dist/gateway/static/root/assets/agents-CCBmGcwc.js +0 -71
- package/dist/gateway/static/root/assets/apps-page-xwCsJS15.js +0 -1
- package/dist/gateway/static/root/assets/channels-settings-C044DcYk.js +0 -1
- package/dist/gateway/static/root/assets/connectors-settings-8VEWUOTj.js +0 -2
- package/dist/gateway/static/root/assets/cron-page-DqmNGNOy.js +0 -3
- package/dist/gateway/static/root/assets/goal-detail-page-bv0VRDaf.js +0 -1
- package/dist/gateway/static/root/assets/goals-page-1Ywnt4Cb.js +0 -2
- package/dist/gateway/static/root/assets/goals-settings-ceEBjnfc.js +0 -1
- package/dist/gateway/static/root/assets/index-Cxm6xsps.js +0 -122
- package/dist/gateway/static/root/assets/index-b_R4tKqt.css +0 -1
- package/dist/gateway/static/root/assets/logs-page-B_wrxhee.js +0 -2
- package/dist/gateway/static/root/assets/messages-CkT-lcgP.js +0 -3
- package/dist/gateway/static/root/assets/models-hub-panel-D0JDSbNu.js +0 -2
- package/dist/gateway/static/root/assets/note-detail-page-DpFV-EO6.js +0 -2
- package/dist/gateway/static/root/assets/notes-page-CdkjTch8.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-DSYVAi96.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-CenkcVjF.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-D9sva86V.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-DL35U0x0.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-Ctwbp9Er.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-DIM3JNsr.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-DAlNaNzL.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-CLrHVzAt.js +0 -2
- package/dist/gateway/static/root/assets/voice-api-key-field-vYAO71Gn.js +0 -1
- package/dist/gateway/static/root/assets/workflow-page.utils-sgHjOXOm.js +0 -1
- package/dist/gateway/static/root/assets/workflows-page-DYyOTmFx.js +0 -18
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { resolveConfigPath } from "../config/paths.js";
|
|
2
|
-
import { loadConfig } from "../config/loader.js";
|
|
3
1
|
import { parseAgentSessionKey } from "../routing/session-key-utils.js";
|
|
4
2
|
import { init_agent_session_key, isValidAgentId, normalizeAgentId } from "../routing/agent-session-key.js";
|
|
3
|
+
import { resolveConfigPath } from "../config/paths.js";
|
|
4
|
+
import { loadConfig } from "../config/loader.js";
|
|
5
5
|
import { init_providers, providerSupportsOAuth } from "../providers/index.js";
|
|
6
6
|
import { createWorkflowCatalog } from "../agent/workflow/catalog.js";
|
|
7
7
|
import { normalizeReasoningLevel, normalizeThinkLevel, normalizeVerboseLevel } from "../agent/transcript/thinking-types.js";
|
|
@@ -125,7 +125,7 @@ function getSlashCommands(_isLocal, keybindings) {
|
|
|
125
125
|
},
|
|
126
126
|
{
|
|
127
127
|
name: "clear",
|
|
128
|
-
description: "
|
|
128
|
+
description: "Clear the TUI view without resetting the session"
|
|
129
129
|
},
|
|
130
130
|
{
|
|
131
131
|
name: "list",
|
|
@@ -165,7 +165,7 @@ function getSlashCommands(_isLocal, keybindings) {
|
|
|
165
165
|
},
|
|
166
166
|
{
|
|
167
167
|
name: "config",
|
|
168
|
-
description: "Show
|
|
168
|
+
description: "Show current configuration"
|
|
169
169
|
},
|
|
170
170
|
{
|
|
171
171
|
name: "context",
|
|
@@ -175,6 +175,10 @@ function getSlashCommands(_isLocal, keybindings) {
|
|
|
175
175
|
name: "btw",
|
|
176
176
|
description: "Side question without saving to session"
|
|
177
177
|
},
|
|
178
|
+
{
|
|
179
|
+
name: "aside",
|
|
180
|
+
description: "Alias for /btw"
|
|
181
|
+
},
|
|
178
182
|
{
|
|
179
183
|
name: "export",
|
|
180
184
|
description: "Export session (markdown/html/json)"
|
|
@@ -211,18 +215,13 @@ function getSlashCommands(_isLocal, keybindings) {
|
|
|
211
215
|
name: "changelog",
|
|
212
216
|
description: "Show version history"
|
|
213
217
|
},
|
|
214
|
-
{
|
|
215
|
-
name: "workflows",
|
|
216
|
-
description: "List saved workflows (built-in + ~/.xopc/workflows/)"
|
|
217
|
-
},
|
|
218
218
|
{
|
|
219
219
|
name: "workflow",
|
|
220
|
-
description: "Workflow subcommands: list, view <name
|
|
220
|
+
description: "Workflow subcommands: list, view <name>"
|
|
221
221
|
}
|
|
222
222
|
];
|
|
223
223
|
}
|
|
224
|
-
function formatExtraSlashCommands(commands) {
|
|
225
|
-
const seen = new Set(getSlashCommands(true).map((command) => command.name));
|
|
224
|
+
function formatExtraSlashCommands(commands, seen) {
|
|
226
225
|
const lines = [];
|
|
227
226
|
for (const command of commands) {
|
|
228
227
|
const name = command.name.replace(/^\//, "").trim().toLowerCase();
|
|
@@ -233,7 +232,7 @@ function formatExtraSlashCommands(commands) {
|
|
|
233
232
|
}
|
|
234
233
|
return lines;
|
|
235
234
|
}
|
|
236
|
-
function formatTuiHelpText(isLocal, keybindings, extraSlashCommands = []) {
|
|
235
|
+
function formatTuiHelpText(isLocal, keybindings, extraSlashCommands = [], skillSlashCommands = [], workflowSlashCommands = []) {
|
|
237
236
|
const commands = getSlashCommands(isLocal, keybindings);
|
|
238
237
|
const interrupt = keyLabel(keybindings, "app.interrupt", "Escape");
|
|
239
238
|
const thinkCycle = keyLabel(keybindings, "app.thinking.cycle", "Shift+Tab");
|
|
@@ -254,7 +253,18 @@ function formatTuiHelpText(isLocal, keybindings, extraSlashCommands = []) {
|
|
|
254
253
|
const exit = keyLabel(keybindings, "app.exit", "Ctrl+D");
|
|
255
254
|
const lines = ["Available commands:"];
|
|
256
255
|
for (const c of commands) lines.push(` /${c.name} — ${c.description}`);
|
|
257
|
-
const
|
|
256
|
+
const seenCommands = new Set(commands.map((command) => command.name));
|
|
257
|
+
const skillCommandLines = formatExtraSlashCommands(skillSlashCommands, seenCommands);
|
|
258
|
+
if (skillCommandLines.length > 0) {
|
|
259
|
+
lines.push("", "Skill commands:");
|
|
260
|
+
lines.push(...skillCommandLines);
|
|
261
|
+
}
|
|
262
|
+
const workflowCommandLines = formatExtraSlashCommands(workflowSlashCommands, seenCommands);
|
|
263
|
+
if (workflowCommandLines.length > 0) {
|
|
264
|
+
lines.push("", "Workflow commands:");
|
|
265
|
+
lines.push(...workflowCommandLines);
|
|
266
|
+
}
|
|
267
|
+
const extraCommandLines = formatExtraSlashCommands(extraSlashCommands, seenCommands);
|
|
258
268
|
if (extraCommandLines.length > 0) {
|
|
259
269
|
lines.push("", "Extension commands:");
|
|
260
270
|
lines.push(...extraCommandLines);
|
|
@@ -333,7 +343,7 @@ function formatCurrentAgent(state) {
|
|
|
333
343
|
return lines.join("\n");
|
|
334
344
|
}
|
|
335
345
|
function createTuiCommandHandler(deps) {
|
|
336
|
-
const { state, chatLog, tui, isLocalMode, abortActive, sendMessage, requestExit, updateFooter, keybindings, uiOverlays, extensionSlashCommands = [], extensionShortcuts = [], setSession, resetSession } = deps;
|
|
346
|
+
const { state, chatLog, tui, isLocalMode, abortActive, sendMessage, requestExit, updateFooter, keybindings, uiOverlays, skillSlashCommands = [], workflowSlashCommands = [], extensionSlashCommands = [], extensionShortcuts = [], setSession, resetSession } = deps;
|
|
337
347
|
const runReset = async () => {
|
|
338
348
|
await abortActive();
|
|
339
349
|
if (resetSession) {
|
|
@@ -353,7 +363,7 @@ function createTuiCommandHandler(deps) {
|
|
|
353
363
|
const commandArgs = restParts.join(" ");
|
|
354
364
|
switch (normalizedCommand) {
|
|
355
365
|
case "help":
|
|
356
|
-
chatLog.addSystem(formatTuiHelpText(isLocalMode, keybindings, extensionSlashCommands));
|
|
366
|
+
chatLog.addSystem(formatTuiHelpText(isLocalMode, keybindings, extensionSlashCommands, skillSlashCommands, workflowSlashCommands));
|
|
357
367
|
tui.requestRender();
|
|
358
368
|
return;
|
|
359
369
|
case "start":
|
|
@@ -540,15 +550,6 @@ function createTuiCommandHandler(deps) {
|
|
|
540
550
|
});
|
|
541
551
|
return;
|
|
542
552
|
}
|
|
543
|
-
case "workflows":
|
|
544
|
-
try {
|
|
545
|
-
chatLog.addSystem(formatTuiWorkflowsInfo(createWorkflowCatalog().list()));
|
|
546
|
-
} catch (err) {
|
|
547
|
-
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
548
|
-
chatLog.addSystem(`Workflow list failed: ${errorMessage}`);
|
|
549
|
-
}
|
|
550
|
-
tui.requestRender();
|
|
551
|
-
return;
|
|
552
553
|
case "workflow": {
|
|
553
554
|
const [subcommandRaw, ...workflowRest] = commandArgs.trim().split(/\s+/);
|
|
554
555
|
const subcommand = (subcommandRaw || "list").toLowerCase();
|
|
@@ -579,11 +580,11 @@ function createTuiCommandHandler(deps) {
|
|
|
579
580
|
return;
|
|
580
581
|
}
|
|
581
582
|
if (subcommand === "save") {
|
|
582
|
-
chatLog.addSystem("/workflow save is
|
|
583
|
+
chatLog.addSystem("/workflow save is not a TUI command. Save generated workflows through the workflow tool.");
|
|
583
584
|
tui.requestRender();
|
|
584
585
|
return;
|
|
585
586
|
}
|
|
586
|
-
chatLog.addSystem("Usage: /workflow list | /workflow view <name>
|
|
587
|
+
chatLog.addSystem("Usage: /workflow list | /workflow view <name>");
|
|
587
588
|
tui.requestRender();
|
|
588
589
|
return;
|
|
589
590
|
}
|
|
@@ -633,6 +634,11 @@ function createTuiCommandHandler(deps) {
|
|
|
633
634
|
tui.requestRender();
|
|
634
635
|
return;
|
|
635
636
|
}
|
|
637
|
+
if (!deps.switchModel) {
|
|
638
|
+
chatLog.addSystem("Model switching is not available in this mode.");
|
|
639
|
+
tui.requestRender();
|
|
640
|
+
return;
|
|
641
|
+
}
|
|
636
642
|
Promise.resolve(deps.switchModel?.(modelRef)).then(() => {
|
|
637
643
|
tui.requestRender();
|
|
638
644
|
});
|
|
@@ -690,12 +696,22 @@ function createTuiCommandHandler(deps) {
|
|
|
690
696
|
});
|
|
691
697
|
return;
|
|
692
698
|
case "recover":
|
|
699
|
+
if (!deps.recoverStream) {
|
|
700
|
+
chatLog.addSystem("Stream recovery is not available in this mode.");
|
|
701
|
+
tui.requestRender();
|
|
702
|
+
return;
|
|
703
|
+
}
|
|
693
704
|
Promise.resolve(deps.recoverStream?.()).catch((err) => {
|
|
694
705
|
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
695
706
|
chatLog.addSystem(`Recover failed: ${errorMessage}`);
|
|
696
707
|
}).finally(() => tui.requestRender());
|
|
697
708
|
return;
|
|
698
709
|
case "retry":
|
|
710
|
+
if (!deps.retryLastMessage) {
|
|
711
|
+
chatLog.addSystem("Retry is not available in this mode.");
|
|
712
|
+
tui.requestRender();
|
|
713
|
+
return;
|
|
714
|
+
}
|
|
699
715
|
Promise.resolve(deps.retryLastMessage?.()).catch((err) => {
|
|
700
716
|
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
701
717
|
chatLog.addSystem(`Retry failed: ${errorMessage}`);
|
|
@@ -715,6 +731,11 @@ function createTuiCommandHandler(deps) {
|
|
|
715
731
|
tui.requestRender();
|
|
716
732
|
return;
|
|
717
733
|
case "copy":
|
|
734
|
+
if (!deps.copyLastAssistant) {
|
|
735
|
+
chatLog.addSystem("Copy is not available in this mode.");
|
|
736
|
+
tui.requestRender();
|
|
737
|
+
return;
|
|
738
|
+
}
|
|
718
739
|
Promise.resolve(deps.copyLastAssistant?.()).then(() => {
|
|
719
740
|
tui.requestRender();
|
|
720
741
|
});
|
|
@@ -727,6 +748,11 @@ function createTuiCommandHandler(deps) {
|
|
|
727
748
|
tui.requestRender();
|
|
728
749
|
return;
|
|
729
750
|
}
|
|
751
|
+
if (!deps.renameCurrentSession) {
|
|
752
|
+
chatLog.addSystem("Session rename is not available in this mode.");
|
|
753
|
+
tui.requestRender();
|
|
754
|
+
return;
|
|
755
|
+
}
|
|
730
756
|
Promise.resolve(deps.renameCurrentSession?.(name)).then(() => {
|
|
731
757
|
tui.requestRender();
|
|
732
758
|
});
|
|
@@ -734,15 +760,31 @@ function createTuiCommandHandler(deps) {
|
|
|
734
760
|
}
|
|
735
761
|
case "resume":
|
|
736
762
|
case "sessions":
|
|
763
|
+
if (!uiOverlays) {
|
|
764
|
+
chatLog.addSystem("Session picker is not available in this mode. Use /list to show sessions.");
|
|
765
|
+
tui.requestRender();
|
|
766
|
+
return;
|
|
767
|
+
}
|
|
737
768
|
uiOverlays?.openSessionPicker();
|
|
738
769
|
return;
|
|
739
770
|
case "scoped-models":
|
|
740
771
|
case "scopedmodels":
|
|
772
|
+
if (!uiOverlays) {
|
|
773
|
+
chatLog.addSystem("Scoped model picker is not available in this mode.");
|
|
774
|
+
tui.requestRender();
|
|
775
|
+
return;
|
|
776
|
+
}
|
|
741
777
|
uiOverlays?.openScopedModels();
|
|
742
778
|
return;
|
|
743
779
|
case "think": {
|
|
744
780
|
const level = normalizeThinkLevel(commandArgs);
|
|
745
781
|
if (!commandArgs.trim()) {
|
|
782
|
+
if (!uiOverlays) {
|
|
783
|
+
const current = state.sessionInfo.thinkingLevel?.trim();
|
|
784
|
+
chatLog.addSystem(current ? `Thinking level: ${current}` : "Usage: /think <off|low|medium|high>");
|
|
785
|
+
tui.requestRender();
|
|
786
|
+
return;
|
|
787
|
+
}
|
|
746
788
|
uiOverlays?.openThinkingSelector();
|
|
747
789
|
return;
|
|
748
790
|
}
|
|
@@ -751,6 +793,11 @@ function createTuiCommandHandler(deps) {
|
|
|
751
793
|
tui.requestRender();
|
|
752
794
|
return;
|
|
753
795
|
}
|
|
796
|
+
if (!deps.setThinkingLevel) {
|
|
797
|
+
chatLog.addSystem("Thinking level changes are not available in this mode.");
|
|
798
|
+
tui.requestRender();
|
|
799
|
+
return;
|
|
800
|
+
}
|
|
754
801
|
Promise.resolve(deps.setThinkingLevel?.(level)).then(() => {
|
|
755
802
|
tui.requestRender();
|
|
756
803
|
});
|
|
@@ -769,6 +816,11 @@ function createTuiCommandHandler(deps) {
|
|
|
769
816
|
tui.requestRender();
|
|
770
817
|
return;
|
|
771
818
|
}
|
|
819
|
+
if (!deps.setReasoningLevel) {
|
|
820
|
+
chatLog.addSystem("Reasoning visibility changes are not available in this mode.");
|
|
821
|
+
tui.requestRender();
|
|
822
|
+
return;
|
|
823
|
+
}
|
|
772
824
|
Promise.resolve(deps.setReasoningLevel?.(level)).then(() => {
|
|
773
825
|
tui.requestRender();
|
|
774
826
|
});
|
|
@@ -782,17 +834,32 @@ function createTuiCommandHandler(deps) {
|
|
|
782
834
|
tui.requestRender();
|
|
783
835
|
return;
|
|
784
836
|
}
|
|
837
|
+
if (!deps.setVerboseLevel) {
|
|
838
|
+
chatLog.addSystem("Verbose mode changes are not available in this mode.");
|
|
839
|
+
tui.requestRender();
|
|
840
|
+
return;
|
|
841
|
+
}
|
|
785
842
|
Promise.resolve(deps.setVerboseLevel?.(level)).then(() => {
|
|
786
843
|
tui.requestRender();
|
|
787
844
|
});
|
|
788
845
|
return;
|
|
789
846
|
}
|
|
790
847
|
case "settings":
|
|
848
|
+
if (!uiOverlays) {
|
|
849
|
+
chatLog.addSystem("Settings are not available in this mode.");
|
|
850
|
+
tui.requestRender();
|
|
851
|
+
return;
|
|
852
|
+
}
|
|
791
853
|
uiOverlays?.openSettings();
|
|
792
854
|
return;
|
|
793
855
|
case "reload":
|
|
794
856
|
case "reload-keybindings":
|
|
795
857
|
case "reload-keybind":
|
|
858
|
+
if (!uiOverlays) {
|
|
859
|
+
chatLog.addSystem("Reload is not available in this mode.");
|
|
860
|
+
tui.requestRender();
|
|
861
|
+
return;
|
|
862
|
+
}
|
|
796
863
|
Promise.resolve(uiOverlays?.reloadKeybindings()).then(() => {
|
|
797
864
|
chatLog.addSystem("Reloaded keybindings, TUI settings, theme, and extension UI.");
|
|
798
865
|
tui.requestRender();
|
|
@@ -803,6 +870,11 @@ function createTuiCommandHandler(deps) {
|
|
|
803
870
|
});
|
|
804
871
|
return;
|
|
805
872
|
case "compact":
|
|
873
|
+
if (!deps.runCompaction) {
|
|
874
|
+
chatLog.addSystem("Compaction is not available in this mode.");
|
|
875
|
+
tui.requestRender();
|
|
876
|
+
return;
|
|
877
|
+
}
|
|
806
878
|
deps.runCompaction?.(commandArgs.trim() || void 0);
|
|
807
879
|
return;
|
|
808
880
|
default: break;
|
|
@@ -849,7 +921,11 @@ function createTuiCommandHandler(deps) {
|
|
|
849
921
|
runReset();
|
|
850
922
|
return;
|
|
851
923
|
case "clear":
|
|
852
|
-
|
|
924
|
+
chatLog.clearAll();
|
|
925
|
+
state.messageFollowUpQueue.length = 0;
|
|
926
|
+
state.steeringQueue.length = 0;
|
|
927
|
+
chatLog.addSystem("TUI view cleared. Session transcript was not reset.");
|
|
928
|
+
tui.requestRender();
|
|
853
929
|
return;
|
|
854
930
|
default: break;
|
|
855
931
|
}
|
|
@@ -860,6 +936,37 @@ function createTuiCommandHandler(deps) {
|
|
|
860
936
|
});
|
|
861
937
|
return;
|
|
862
938
|
}
|
|
939
|
+
if (normalizedCommand.startsWith("skill:")) {
|
|
940
|
+
sendMessage(input);
|
|
941
|
+
return;
|
|
942
|
+
}
|
|
943
|
+
if (normalizedCommand.startsWith("workflow:")) {
|
|
944
|
+
const workflowName = normalizedCommand.slice(9).trim();
|
|
945
|
+
if (!workflowName) {
|
|
946
|
+
chatLog.addSystem("Usage: /workflow:<name> [goal]");
|
|
947
|
+
tui.requestRender();
|
|
948
|
+
return;
|
|
949
|
+
}
|
|
950
|
+
if (!deps.startWorkflowRun) {
|
|
951
|
+
chatLog.addSystem("Workflow runs are not available in this mode.");
|
|
952
|
+
tui.requestRender();
|
|
953
|
+
return;
|
|
954
|
+
}
|
|
955
|
+
chatLog.addSystem(`▶ Starting workflow: ${workflowName}`);
|
|
956
|
+
tui.requestRender();
|
|
957
|
+
Promise.resolve(deps.startWorkflowRun({
|
|
958
|
+
definitionId: workflowName,
|
|
959
|
+
goal: commandArgs.trim() || void 0
|
|
960
|
+
})).then((result) => {
|
|
961
|
+
chatLog.addSystem(`Workflow started: ${result.definitionId}\nrunId: ${result.runId}\nsessionKey: ${result.sessionKey}`);
|
|
962
|
+
tui.requestRender();
|
|
963
|
+
}).catch((err) => {
|
|
964
|
+
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
965
|
+
chatLog.addSystem(`Workflow start failed: ${errorMessage}`);
|
|
966
|
+
tui.requestRender();
|
|
967
|
+
});
|
|
968
|
+
return;
|
|
969
|
+
}
|
|
863
970
|
if (input.trimStart().startsWith("/")) {
|
|
864
971
|
const rewritten = rewriteUnknownSlashAsWorkflow(normalizedCommand, commandArgs);
|
|
865
972
|
if (rewritten) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tui-commands.js","names":["listAllAuthProfiles"],"sources":["../../../src/tui/tui-commands.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport type { KeybindingsManager, TUI } from '@earendil-works/pi-tui';\n\nimport type {\n TuiCompactionResult,\n TuiModelChoice,\n TuiShareRequest,\n TuiSessionStats,\n TuiSessionItem,\n TuiStartupResources,\n TuiTranscriptTreeEntry,\n TuiAgentInfo,\n} from './tui-backend.js';\nimport type { ChatLog } from './components/chat-log.js';\nimport {\n formatKeyIds,\n formatXopcTuiHotkeys,\n type TuiHotkeyExtensionShortcut,\n} from './format-tui-hotkeys.js';\nimport { getTuiKeybindingsPath } from './tui-keybindings-file.js';\nimport type { TuiState } from './tui-types.js';\nimport { createWorkflowCatalog } from '../agent/workflow/catalog.js';\nimport {\n isValidAgentId,\n normalizeAgentId,\n parseAgentSessionKey,\n} from '../routing/agent-session-key.js';\nimport {\n normalizeReasoningLevel,\n normalizeThinkLevel,\n normalizeVerboseLevel,\n type ReasoningLevel,\n type ThinkLevel,\n type VerboseLevel,\n} from '../agent/transcript/thinking-types.js';\nimport {\n getAuthStorePath,\n listAllProfiles as listAllAuthProfiles,\n listProfilesForProvider,\n removeAuthProfile,\n type AuthProfileEntry,\n} from '../auth/profiles/index.js';\nimport { loadConfig, resolveConfigPath } from '../config/index.js';\nimport type { TuiSlashCommandContext, TuiSlashCommandHandler } from '../extensions/types/tui.js';\nimport { provenanceTracker } from '../extensions/security.js';\nimport type { ProjectTrustStoreEntry } from '../project-trust/trust-store.js';\nimport { providerSupportsOAuth } from '../providers/index.js';\n\nimport { rewriteUnknownSlashAsWorkflow } from './tui-workflow-slash.js';\nimport { formatTuiStartupText } from './tui-startup-text.js';\n\ninterface SlashCommandDef {\n name: string;\n originalName?: string;\n description: string;\n}\n\nexport type TuiExtensionSlashCommandEntry = SlashCommandDef & {\n handler: TuiSlashCommandHandler;\n getContext?: () => TuiSlashCommandContext;\n};\n\nfunction keyLabel(\n keybindings: KeybindingsManager | undefined,\n id: Parameters<KeybindingsManager['getKeys']>[0],\n fallback: string,\n): string {\n return keybindings ? formatKeyIds(keybindings, id, { capitalize: true }) : fallback;\n}\n\nexport function getSlashCommands(\n _isLocal: boolean,\n keybindings?: KeybindingsManager,\n): SlashCommandDef[] {\n const abortKey = keyLabel(keybindings, 'app.interrupt', 'Escape');\n const toolsKey = keyLabel(keybindings, 'app.tools.expand', 'Ctrl+O');\n const thinkingKey = keyLabel(keybindings, 'app.thinking.toggle', 'Ctrl+T');\n const sessionKey = keyLabel(keybindings, 'app.session.resume', 'Ctrl+Shift+P');\n const modelCycleKey = keyLabel(keybindings, 'app.model.cycleForward', 'Ctrl+P');\n return [\n { name: 'help', description: 'Show available commands' },\n { name: 'abort', description: `Abort active run (or press ${abortKey})` },\n { name: 'recover', description: 'Reload history and reattach to a stalled run' },\n { name: 'retry', description: 'Abort current run if needed and resend the last user message' },\n { name: 'tools', description: `Toggle tool output expanded/collapsed (or ${toolsKey})` },\n { name: 'thinking', description: `Toggle thinking display (or ${thinkingKey})` },\n { name: 'copy', description: 'Copy last assistant message to clipboard' },\n { name: 'exit', description: 'Exit the TUI' },\n { name: 'quit', description: 'Quit the TUI' },\n { name: 'model', description: 'Open model picker (optional search text)' },\n { name: 'models', description: 'List available models' },\n { name: 'switch', description: 'Switch model — copy `provider/model` from /models' },\n { name: 'login', description: 'Login to an OAuth provider' },\n { name: 'logout', description: 'Remove stored provider auth profiles' },\n { name: 'usage', description: 'Show token usage statistics' },\n { name: 'session', description: 'Show current session info' },\n { name: 'agent', description: 'Show or switch agent for this TUI session' },\n { name: 'agents', description: 'List available agents' },\n { name: 'new', description: 'Start a new isolated TUI session (tui-{uuid})' },\n { name: 'fork', description: 'Fork current session transcript into a new session' },\n { name: 'clone', description: 'Duplicate current session transcript into a new session' },\n { name: 'trust', description: 'Manage project trust and show extension security policy' },\n { name: 'name', description: 'Show or set current session display name' },\n { name: 'reset', description: 'Reset current session transcript and reload history' },\n { name: 'clear', description: 'Alias for /reset' },\n { name: 'list', description: 'List sessions' },\n { name: 'resume', description: `Open session picker (or ${sessionKey})` },\n { name: 'tree', description: 'Show grouped session tree' },\n { name: 'scoped-models', description: `Choose models for ${modelCycleKey} cycling` },\n { name: 'compact', description: 'Compact session history (local API)' },\n { name: 'think', description: 'Set thinking level (e.g. /think high)' },\n { name: 'reasoning', description: 'Set reasoning visibility (e.g. /reasoning stream)' },\n { name: 'verbose', description: 'Toggle verbose mode' },\n { name: 'status', description: 'Show agent status' },\n { name: 'config', description: 'Show or update configuration' },\n { name: 'context', description: 'Show context budget' },\n { name: 'btw', description: 'Side question without saving to session' },\n { name: 'export', description: 'Export session (markdown/html/json)' },\n { name: 'import', description: 'Import an xopc JSON session export' },\n { name: 'share', description: 'Create a share link for a workspace file/folder/site' },\n { name: 'settings', description: 'Open TUI settings overlay' },\n { name: 'reload', description: 'Reload keybindings, TUI settings, theme, and extension UI' },\n { name: 'reload-keybindings', description: `Reload ${getTuiKeybindingsPath()}` },\n { name: 'start', description: 'Show welcome message' },\n { name: 'hotkeys', description: 'Show resolved keyboard shortcuts (pi-style)' },\n { name: 'changelog', description: 'Show version history' },\n { name: 'workflows', description: 'List saved workflows (built-in + ~/.xopc/workflows/)' },\n { name: 'workflow', description: 'Workflow subcommands: list, view <name>, save <name>' },\n ];\n}\n\nfunction formatExtraSlashCommands(commands: SlashCommandDef[]): string[] {\n const seen = new Set(getSlashCommands(true).map((command) => command.name));\n const lines: string[] = [];\n for (const command of commands) {\n const name = command.name.replace(/^\\//, '').trim().toLowerCase();\n const originalName = command.originalName?.replace(/^\\//, '').trim().toLowerCase();\n if (!name || seen.has(name) || (originalName && seen.has(originalName))) continue;\n seen.add(name);\n lines.push(` /${name} — ${command.description}`);\n }\n return lines;\n}\n\nexport function formatTuiHelpText(\n isLocal: boolean,\n keybindings?: KeybindingsManager,\n extraSlashCommands: SlashCommandDef[] = [],\n): string {\n const commands = getSlashCommands(isLocal, keybindings);\n const interrupt = keyLabel(keybindings, 'app.interrupt', 'Escape');\n const thinkCycle = keyLabel(keybindings, 'app.thinking.cycle', 'Shift+Tab');\n const modelNext = keyLabel(keybindings, 'app.model.cycleForward', 'Ctrl+P');\n const modelPrev = keyLabel(keybindings, 'app.model.cycleBackward', 'Shift+Ctrl+P');\n const modelPicker = keyLabel(keybindings, 'app.model.select', 'Ctrl+L');\n const sessionPicker = keyLabel(keybindings, 'app.session.resume', 'Ctrl+Shift+P');\n const sessionTree = keyLabel(keybindings, 'app.session.tree', '(not bound)');\n const sessionFork = keyLabel(keybindings, 'app.session.fork', '(not bound)');\n const toolExpand = keyLabel(keybindings, 'app.tools.expand', 'Ctrl+O');\n const thinkingToggle = keyLabel(keybindings, 'app.thinking.toggle', 'Ctrl+T');\n const editorExternal = keyLabel(keybindings, 'app.editor.external', 'Ctrl+G');\n const suspend = keyLabel(keybindings, 'app.suspend', 'Ctrl+Z');\n const followUp = keyLabel(keybindings, 'app.message.followUp', 'Alt+Enter');\n const dequeue = keyLabel(keybindings, 'app.message.dequeue', 'Alt+Up');\n const pasteImage = keyLabel(keybindings, 'app.clipboard.pasteImage', 'Ctrl+V / Alt+V');\n const clearInput = keyLabel(keybindings, 'app.clear', 'Ctrl+C');\n const exit = keyLabel(keybindings, 'app.exit', 'Ctrl+D');\n const lines = ['Available commands:'];\n for (const c of commands) {\n lines.push(` /${c.name} — ${c.description}`);\n }\n const extraCommandLines = formatExtraSlashCommands(extraSlashCommands);\n if (extraCommandLines.length > 0) {\n lines.push('', 'Extension commands:');\n lines.push(...extraCommandLines);\n }\n lines.push('', 'Keyboard shortcuts (defaults align with pi coding-agent where noted):');\n lines.push(` ${interrupt} — Abort active run`);\n lines.push(` ${thinkCycle} — Cycle /think level`);\n lines.push(` ${modelNext} / ${modelPrev} — Next / previous model (/switch)`);\n lines.push(` ${modelPicker} — Model picker`);\n lines.push(` ${sessionPicker} — Session picker (rename/delete)`);\n lines.push(` ${sessionTree} — Session tree`);\n lines.push(` ${sessionFork} — Fork current session`);\n lines.push(` /scoped-models — Limit ${modelNext} model cycle set`);\n lines.push(` ${toolExpand} — Toggle tool output`);\n lines.push(` ${thinkingToggle} — Toggle thinking block display`);\n lines.push(` ${editorExternal} — Edit draft in $EDITOR`);\n lines.push(` ${suspend} — Suspend to shell (Unix)`);\n lines.push(` ${followUp} — Queue follow-up while busy (sends when this reply finishes)`);\n lines.push(` ${dequeue} — Restore queued messages to editor`);\n lines.push(' Enter (while busy) — Steer: inject at next tool boundary');\n lines.push(` ${pasteImage} — Paste image from clipboard`);\n lines.push(' /settings — Theme, thinking display, terminal progress, …');\n lines.push(` ${getTuiKeybindingsPath()} — Custom shortcuts (use /reload)`);\n lines.push(` ${clearInput} — Clear input; repeat within ~0.5s to exit when empty`);\n lines.push(` ${exit} — Exit when input empty`);\n lines.push(' !cmd — Local shell (gated; runs on this machine)');\n lines.push('', 'Use /hotkeys for the resolved binding list from the active keymap.');\n return lines.join('\\n');\n}\n\nexport function formatTuiStartText(\n state: TuiState,\n isLocal: boolean,\n keybindings?: KeybindingsManager,\n resources?: TuiStartupResources,\n): string {\n return formatTuiStartupText({\n state,\n isLocal,\n keybindings,\n resources,\n expanded: true,\n });\n}\n\nimport {\n formatTuiConfigInfo,\n formatTuiContextInfo,\n formatTuiLoginInfo,\n formatTuiModelsInfo,\n formatTuiSessionInfo,\n formatTuiSessionListInfo,\n formatTuiSessionTreeInfo,\n formatTuiStoredAuthProfilesInfo,\n formatTuiTranscriptTreeInfo,\n formatTuiTrustInfo,\n formatTuiUsageInfo,\n formatTuiWorkflowDetail,\n formatTuiWorkflowsInfo,\n loadTuiChangelogInfo,\n nextVerboseLevel,\n parseTuiExportRequest,\n parseTuiImportRequest,\n parseTuiShareRequest,\n writeTuiDebugInfo,\n type TuiExportRequest,\n type TuiImportRequest,\n} from './tui-command-formatters.js';\n\nexport type CommandHandlerDeps = {\n state: TuiState;\n chatLog: ChatLog;\n tui: TUI;\n isLocalMode: boolean;\n abortActive: () => Promise<void>;\n sendMessage: (text: string) => void;\n requestExit: () => void;\n updateFooter: () => void;\n keybindings: KeybindingsManager;\n uiOverlays?: {\n openModelPicker: (initialSearch?: string) => void;\n openAgentPicker?: () => void;\n openSessionPicker: () => void;\n openSessionTree: () => void;\n openTranscriptTree: () => void;\n openUserMessageFork: () => void;\n openScopedModels: () => void;\n openThinkingSelector: () => void;\n openSettings: () => void;\n openProjectTrust: () => void;\n reloadKeybindings: () => void | Promise<void>;\n };\n setThinkingLevel?: (level: ThinkLevel) => void | Promise<void>;\n setReasoningLevel?: (level: ReasoningLevel) => void | Promise<void>;\n setVerboseLevel?: (level: VerboseLevel) => void | Promise<void>;\n copyLastAssistant?: () => void | Promise<void>;\n renameCurrentSession?: (name: string) => void | Promise<void>;\n runCompaction?: (instructions?: string) => void | Promise<void | TuiCompactionResult>;\n listModels?: () => TuiModelChoice[] | Promise<TuiModelChoice[]>;\n switchModel?: (modelRef: string) => void | Promise<void>;\n listSessions?: () => TuiSessionItem[] | Promise<TuiSessionItem[]>;\n listAgents?: () => TuiAgentInfo[] | Promise<TuiAgentInfo[]>;\n switchAgentSession?: (sessionKey: string, agentId: string) => void | Promise<void>;\n getSessionStats?: () => TuiSessionStats | Promise<TuiSessionStats>;\n getStartupResources?: () => TuiStartupResources | undefined;\n loadTranscriptTree?: () => TuiTranscriptTreeEntry[] | Promise<TuiTranscriptTreeEntry[]>;\n exportSession?: (request: TuiExportRequest) => void | Promise<void>;\n importSession?: (request: TuiImportRequest) => void | Promise<void>;\n createShare?: (request: TuiShareRequest) => void | Promise<void>;\n authProfiles?: {\n listAll: () => AuthProfileEntry[] | Promise<AuthProfileEntry[]>;\n listProvider: (provider: string) => AuthProfileEntry[] | Promise<AuthProfileEntry[]>;\n remove: (profileId: string) => boolean | Promise<boolean>;\n getStorePath: () => string;\n };\n projectTrust?: {\n cwd: string;\n hasProjectResources: () => boolean;\n getStorePath: () => string;\n getEntry: () => ProjectTrustStoreEntry | null;\n getSessionDecision: () => boolean | null;\n };\n runLogin?: (provider?: string) => void | Promise<void>;\n runBtwQuery?: (question: string) => void | Promise<void>;\n forkSession?: (rawKey?: string) => void | Promise<void>;\n extensionSlashCommands?: TuiExtensionSlashCommandEntry[];\n extensionShortcuts?: TuiHotkeyExtensionShortcut[];\n currentAgentId?: string;\n setSession?: (rawKey: string) => Promise<void>;\n resetSession?: () => Promise<void>;\n recoverStream?: () => void | Promise<void>;\n retryLastMessage?: () => void | Promise<void>;\n};\n\nfunction defaultAuthProfiles(): NonNullable<CommandHandlerDeps['authProfiles']> {\n return {\n listAll: () => listAllAuthProfiles(),\n listProvider: (provider) => listProfilesForProvider(provider),\n remove: (profileId) => removeAuthProfile(profileId),\n getStorePath: () => getAuthStorePath(),\n };\n}\n\nfunction formatAgentsList(agents: TuiAgentInfo[], currentAgentId?: string): string {\n if (agents.length === 0) {\n return 'No agents available.';\n }\n const current = currentAgentId?.trim().toLowerCase();\n const sorted = [...agents].sort((a, b) => {\n if (a.id === current && b.id !== current) return -1;\n if (b.id === current && a.id !== current) return 1;\n if (a.id === 'coder' && b.id !== 'coder') return -1;\n if (b.id === 'coder' && a.id !== 'coder') return 1;\n return a.id.localeCompare(b.id);\n });\n return [\n 'Available agents:',\n ...sorted.map((agent) => {\n const marker = agent.id === current ? '*' : ' ';\n const label = agent.displayName ? ` — ${agent.displayName}` : '';\n return `${marker} ${agent.id}${label}`;\n }),\n '',\n 'Switch with: /agent <id>',\n ].join('\\n');\n}\n\nfunction formatCurrentAgent(state: TuiState): string {\n const parsed = parseAgentSessionKey(state.currentSessionKey);\n if (!parsed) {\n return `Current session is not an agent session.\\nSession: ${state.currentSessionKey}`;\n }\n const lines = [\n `Current agent: ${parsed.agentId}`,\n `Session: ${state.currentSessionKey}`,\n ];\n const workspace = state.sessionInfo.effectiveWorkspacePath?.trim();\n if (workspace) lines.push(`Workspace: ${workspace}`);\n const provider = state.sessionInfo.modelProvider?.trim();\n const model = state.sessionInfo.model?.trim();\n if (model) lines.push(`Model: ${provider ? `${provider}/${model}` : model}`);\n return lines.join('\\n');\n}\n\nexport function createTuiCommandHandler(deps: CommandHandlerDeps): (input: string) => void {\n const {\n state,\n chatLog,\n tui,\n isLocalMode,\n abortActive,\n sendMessage,\n requestExit,\n updateFooter,\n keybindings,\n uiOverlays,\n extensionSlashCommands = [],\n extensionShortcuts = [],\n setSession,\n resetSession,\n } = deps;\n\n const runReset = async () => {\n await abortActive();\n if (resetSession) {\n await resetSession();\n chatLog.addSystem(`session ${state.currentSessionKey} reset`);\n } else {\n chatLog.clearAll();\n state.messageFollowUpQueue.length = 0;\n state.steeringQueue.length = 0;\n chatLog.addSystem('Session cleared (reset not available in this mode).');\n }\n tui.requestRender();\n };\n\n return (input: string) => {\n const trimmed = input.replace(/^\\//, '').trim();\n const [commandName, ...restParts] = trimmed.split(/\\s+/);\n const normalizedCommand = (commandName ?? '').toLowerCase();\n const commandArgs = restParts.join(' ');\n\n switch (normalizedCommand) {\n case 'help':\n chatLog.addSystem(formatTuiHelpText(isLocalMode, keybindings, extensionSlashCommands));\n tui.requestRender();\n return;\n case 'start':\n chatLog.addSystem(formatTuiStartText(state, isLocalMode, keybindings, deps.getStartupResources?.()));\n tui.requestRender();\n return;\n case 'hotkeys':\n case 'keys':\n chatLog.addSystem(formatXopcTuiHotkeys(keybindings, extensionShortcuts));\n tui.requestRender();\n return;\n case 'changelog':\n chatLog.addSystem(loadTuiChangelogInfo());\n tui.requestRender();\n return;\n case 'debug':\n try {\n const debugPath = writeTuiDebugInfo({ state, tui });\n chatLog.addSystem(`Debug log written\\n${debugPath}`);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Debug log failed: ${errorMessage}`);\n }\n tui.requestRender();\n return;\n case 'session':\n case 'status':\n void Promise.resolve(deps.getSessionStats?.())\n .catch(() => undefined)\n .then((stats) => {\n chatLog.addSystem(formatTuiSessionInfo(state, stats));\n tui.requestRender();\n });\n return;\n case 'agents':\n if (uiOverlays?.openAgentPicker) {\n uiOverlays.openAgentPicker();\n return;\n }\n void Promise.resolve(deps.listAgents?.() ?? [])\n .then((agents) => {\n const current = parseAgentSessionKey(state.currentSessionKey)?.agentId;\n chatLog.addSystem(formatAgentsList(agents, current));\n tui.requestRender();\n })\n .catch((err: unknown) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Agents list failed: ${errorMessage}`);\n tui.requestRender();\n });\n return;\n case 'agent': {\n const targetRaw = commandArgs.trim();\n if (!targetRaw) {\n chatLog.addSystem(formatCurrentAgent(state));\n tui.requestRender();\n return;\n }\n void (async () => {\n const parsedCurrent = parseAgentSessionKey(state.currentSessionKey);\n if (!parsedCurrent) {\n chatLog.addSystem('Cannot switch agent: current session is not an agent session.');\n tui.requestRender();\n return;\n }\n if (state.activeRunId) {\n chatLog.addSystem('Cannot switch agent while a run is active. Abort first.');\n tui.requestRender();\n return;\n }\n if (!isValidAgentId(targetRaw)) {\n chatLog.addSystem(`Invalid agent id: ${targetRaw}`);\n tui.requestRender();\n return;\n }\n const targetAgentId = normalizeAgentId(targetRaw);\n const agents = await Promise.resolve(deps.listAgents?.() ?? []);\n if (!agents.some((agent) => agent.enabled !== false && agent.id === targetAgentId)) {\n chatLog.addSystem(`Unknown agent: ${targetAgentId}`);\n tui.requestRender();\n return;\n }\n const targetSessionKey = `agent:${targetAgentId}:${parsedCurrent.rest}`;\n if (targetSessionKey === state.currentSessionKey) {\n chatLog.addSystem(`Already using agent: ${targetAgentId}`);\n tui.requestRender();\n return;\n }\n if (!deps.switchAgentSession) {\n chatLog.addSystem('Agent switching is not available in this mode.');\n tui.requestRender();\n return;\n }\n await deps.switchAgentSession(targetSessionKey, targetAgentId);\n chatLog.addSystem(`Switched to agent: ${targetAgentId}\\nSession: ${targetSessionKey}`);\n tui.requestRender();\n })().catch((err: unknown) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Agent switch failed: ${errorMessage}`);\n tui.requestRender();\n });\n return;\n }\n case 'usage':\n void Promise.resolve(deps.getSessionStats?.())\n .catch(() => undefined)\n .then((stats) => {\n chatLog.addSystem(formatTuiUsageInfo(state, stats));\n tui.requestRender();\n });\n return;\n case 'context':\n chatLog.addSystem(formatTuiContextInfo(state));\n tui.requestRender();\n return;\n case 'config':\n chatLog.addSystem(formatTuiConfigInfo(state));\n tui.requestRender();\n return;\n case 'trust':\n if (uiOverlays?.openProjectTrust) {\n uiOverlays.openProjectTrust();\n return;\n }\n chatLog.addSystem(\n formatTuiTrustInfo(loadConfig(), {\n configPath: resolveConfigPath(),\n provenance: provenanceTracker.getAll(),\n cwd: deps.projectTrust?.cwd,\n hasProjectResources: deps.projectTrust?.hasProjectResources(),\n projectTrustStorePath: deps.projectTrust?.getStorePath(),\n projectTrustEntry: deps.projectTrust?.getEntry(),\n projectTrustSessionDecision: deps.projectTrust?.getSessionDecision(),\n }),\n );\n tui.requestRender();\n return;\n case 'export':\n if (!deps.exportSession) {\n chatLog.addSystem('Export is not available in this mode.');\n tui.requestRender();\n return;\n }\n void Promise.resolve(deps.exportSession(parseTuiExportRequest(commandArgs))).then(() => {\n tui.requestRender();\n });\n return;\n case 'import':\n if (!deps.importSession) {\n chatLog.addSystem('Import is not available in this mode.');\n tui.requestRender();\n return;\n }\n void Promise.resolve(deps.importSession(parseTuiImportRequest(commandArgs))).then(() => {\n tui.requestRender();\n });\n return;\n case 'share': {\n if (!deps.createShare) {\n chatLog.addSystem('Share is not available in this mode.');\n tui.requestRender();\n return;\n }\n const request = parseTuiShareRequest(commandArgs);\n if (!request) {\n chatLog.addSystem(\n [\n 'Usage: /share <workspace-path> [friend|colleague|public] [--site|--zip|--file]',\n 'Optional: --title \"Title\" --description \"Description\"',\n ].join('\\n'),\n );\n tui.requestRender();\n return;\n }\n void Promise.resolve(deps.createShare(request)).then(() => {\n tui.requestRender();\n });\n return;\n }\n case 'btw':\n case 'aside': {\n const question = commandArgs.trim();\n if (!question) {\n chatLog.addSystem(\n 'Usage: /btw <question>\\nAnswers use the current session as read-only background and are not saved.',\n );\n tui.requestRender();\n return;\n }\n if (!deps.runBtwQuery) {\n chatLog.addSystem('/btw is not available in this mode.');\n tui.requestRender();\n return;\n }\n void Promise.resolve(deps.runBtwQuery(question)).then(() => {\n tui.requestRender();\n });\n return;\n }\n case 'workflows':\n try {\n chatLog.addSystem(formatTuiWorkflowsInfo(createWorkflowCatalog().list()));\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Workflow list failed: ${errorMessage}`);\n }\n tui.requestRender();\n return;\n case 'workflow': {\n const [subcommandRaw, ...workflowRest] = commandArgs.trim().split(/\\s+/);\n const subcommand = (subcommandRaw || 'list').toLowerCase();\n if (subcommand === 'list' || subcommand === 'ls') {\n try {\n chatLog.addSystem(formatTuiWorkflowsInfo(createWorkflowCatalog().list()));\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Workflow list failed: ${errorMessage}`);\n }\n tui.requestRender();\n return;\n }\n if (subcommand === 'view' || subcommand === 'show') {\n const name = workflowRest[0]?.trim();\n if (!name) {\n chatLog.addSystem('Usage: /workflow view <name>');\n tui.requestRender();\n return;\n }\n try {\n chatLog.addSystem(formatTuiWorkflowDetail(name));\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Workflow view failed: ${errorMessage}`);\n }\n tui.requestRender();\n return;\n }\n if (subcommand === 'save') {\n chatLog.addSystem('/workflow save is available through the workflow tool after a generated workflow run.');\n tui.requestRender();\n return;\n }\n chatLog.addSystem('Usage: /workflow list | /workflow view <name> | /workflow save <name>');\n tui.requestRender();\n return;\n }\n case 'models':\n void Promise.resolve(deps.listModels?.() ?? []).then((models) => {\n chatLog.addSystem(formatTuiModelsInfo(models));\n tui.requestRender();\n });\n return;\n case 'model':\n if (uiOverlays) {\n uiOverlays.openModelPicker(commandArgs.trim() || undefined);\n return;\n }\n chatLog.addSystem('Model picker is not available in this mode. Use /models and /switch <provider/model>.');\n tui.requestRender();\n return;\n case 'list':\n void Promise.resolve(deps.listSessions?.() ?? []).then((sessions) => {\n chatLog.addSystem(\n formatTuiSessionListInfo(sessions, { currentSessionKey: state.currentSessionKey }),\n );\n tui.requestRender();\n });\n return;\n case 'tree':\n if (uiOverlays) {\n uiOverlays.openTranscriptTree();\n return;\n }\n if (deps.loadTranscriptTree) {\n void Promise.resolve(deps.loadTranscriptTree()).then((entries) => {\n chatLog.addSystem(formatTuiTranscriptTreeInfo(entries));\n tui.requestRender();\n });\n return;\n }\n uiOverlays?.openSessionTree();\n if (uiOverlays) return;\n void Promise.resolve(deps.listSessions?.() ?? []).then((sessions) => {\n chatLog.addSystem(\n formatTuiSessionTreeInfo(sessions, { currentSessionKey: state.currentSessionKey }),\n );\n tui.requestRender();\n });\n return;\n case 'switch': {\n const modelRef = commandArgs.trim();\n if (!modelRef) {\n chatLog.addSystem('Usage: /switch <provider/model>');\n tui.requestRender();\n return;\n }\n void Promise.resolve(deps.switchModel?.(modelRef)).then(() => {\n tui.requestRender();\n });\n return;\n }\n case 'login':\n if (deps.runLogin && (!commandArgs.trim() || providerSupportsOAuth(commandArgs.trim()))) {\n void Promise.resolve(deps.runLogin(commandArgs.trim() || undefined))\n .catch((err) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Login failed: ${errorMessage}`);\n })\n .finally(() => tui.requestRender());\n return;\n }\n chatLog.addSystem(formatTuiLoginInfo(commandArgs));\n tui.requestRender();\n return;\n case 'logout': {\n const provider = commandArgs.trim();\n const authProfiles = deps.authProfiles ?? defaultAuthProfiles();\n void (async () => {\n try {\n if (!provider) {\n const profiles = await authProfiles.listAll();\n chatLog.addSystem(\n formatTuiStoredAuthProfilesInfo(profiles, { authStorePath: authProfiles.getStorePath() }),\n );\n tui.requestRender();\n return;\n }\n\n const profiles = await authProfiles.listProvider(provider);\n if (profiles.length === 0) {\n chatLog.addSystem(\n [\n `No stored auth profiles found for provider: ${provider}`,\n 'Environment variables and config credentials are unchanged.',\n ].join('\\n'),\n );\n tui.requestRender();\n return;\n }\n\n let removed = 0;\n for (const profile of profiles) {\n if (await authProfiles.remove(profile.profileId)) {\n removed += 1;\n }\n }\n chatLog.addSystem(\n [\n `Logged out from ${provider}: removed ${removed} stored auth profile${removed === 1 ? '' : 's'}.`,\n 'Environment variables and config credentials are unchanged.',\n ].join('\\n'),\n );\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Logout failed: ${errorMessage}`);\n }\n tui.requestRender();\n })();\n return;\n }\n case 'exit':\n case 'quit':\n requestExit();\n return;\n case 'abort':\n case 'stop':\n case 'cancel':\n void abortActive().then(() => {\n chatLog.addSystem('Aborted.');\n tui.requestRender();\n });\n return;\n case 'recover':\n void Promise.resolve(deps.recoverStream?.())\n .catch((err: unknown) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Recover failed: ${errorMessage}`);\n })\n .finally(() => tui.requestRender());\n return;\n case 'retry':\n void Promise.resolve(deps.retryLastMessage?.())\n .catch((err: unknown) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Retry failed: ${errorMessage}`);\n })\n .finally(() => tui.requestRender());\n return;\n case 'tools':\n state.toolsExpanded = !state.toolsExpanded;\n chatLog.setToolsExpanded(state.toolsExpanded);\n chatLog.addSystem(`Tools: ${state.toolsExpanded ? 'expanded' : 'collapsed'}`);\n tui.requestRender();\n return;\n case 'thinking':\n state.showThinking = !state.showThinking;\n chatLog.setShowThinking(state.showThinking);\n chatLog.addSystem(`Thinking display: ${state.showThinking ? 'on' : 'off'}`);\n updateFooter();\n tui.requestRender();\n return;\n case 'copy':\n void Promise.resolve(deps.copyLastAssistant?.()).then(() => {\n tui.requestRender();\n });\n return;\n case 'name': {\n const name = commandArgs.trim();\n if (!name) {\n const currentName = state.sessionInfo.displayName?.trim();\n chatLog.addSystem(currentName ? `Session name: ${currentName}` : 'Usage: /name <name>');\n tui.requestRender();\n return;\n }\n void Promise.resolve(deps.renameCurrentSession?.(name)).then(() => {\n tui.requestRender();\n });\n return;\n }\n case 'resume':\n case 'sessions':\n uiOverlays?.openSessionPicker();\n return;\n case 'scoped-models':\n case 'scopedmodels':\n uiOverlays?.openScopedModels();\n return;\n case 'think': {\n const level = normalizeThinkLevel(commandArgs);\n if (!commandArgs.trim()) {\n uiOverlays?.openThinkingSelector();\n return;\n }\n if (!level) {\n chatLog.addSystem(`Invalid thinking level: ${commandArgs}`);\n tui.requestRender();\n return;\n }\n void Promise.resolve(deps.setThinkingLevel?.(level)).then(() => {\n tui.requestRender();\n });\n return;\n }\n case 'reasoning': {\n const level = normalizeReasoningLevel(commandArgs);\n if (!commandArgs.trim()) {\n const current = state.sessionInfo.reasoningLevel?.trim();\n chatLog.addSystem(\n current\n ? `Reasoning visibility: ${current}`\n : 'Usage: /reasoning <off|on|stream>',\n );\n tui.requestRender();\n return;\n }\n if (!level) {\n chatLog.addSystem(`Invalid reasoning visibility: ${commandArgs}`);\n tui.requestRender();\n return;\n }\n void Promise.resolve(deps.setReasoningLevel?.(level)).then(() => {\n tui.requestRender();\n });\n return;\n }\n case 'verbose': {\n const raw = commandArgs.trim();\n const level = raw ? normalizeVerboseLevel(raw) : nextVerboseLevel(state.sessionInfo.verboseLevel);\n if (raw && !level) {\n chatLog.addSystem(`Invalid verbose level: ${commandArgs}`);\n tui.requestRender();\n return;\n }\n void Promise.resolve(deps.setVerboseLevel?.(level)).then(() => {\n tui.requestRender();\n });\n return;\n }\n case 'settings':\n uiOverlays?.openSettings();\n return;\n case 'reload':\n case 'reload-keybindings':\n case 'reload-keybind':\n void Promise.resolve(uiOverlays?.reloadKeybindings())\n .then(() => {\n chatLog.addSystem('Reloaded keybindings, TUI settings, theme, and extension UI.');\n tui.requestRender();\n })\n .catch((err: unknown) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Reload failed: ${errorMessage}`);\n tui.requestRender();\n });\n return;\n case 'compact':\n void deps.runCompaction?.(commandArgs.trim() || undefined);\n return;\n default:\n break;\n }\n\n switch (normalizedCommand) {\n case 'new': {\n void (async () => {\n try {\n await abortActive();\n const uniqueKey = `tui-${randomUUID()}`;\n if (setSession) {\n await setSession(uniqueKey);\n chatLog.addSystem(`new session: ${state.currentSessionKey}`);\n } else {\n chatLog.clearAll();\n state.messageFollowUpQueue.length = 0;\n state.steeringQueue.length = 0;\n chatLog.addSystem('New session requires gateway or local session support.');\n }\n tui.requestRender();\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`new session failed: ${errorMessage}`);\n tui.requestRender();\n }\n })();\n return;\n }\n case 'fork': {\n if (!commandArgs.trim() && uiOverlays) {\n uiOverlays.openUserMessageFork();\n return;\n }\n void Promise.resolve(deps.forkSession?.(commandArgs.trim() || undefined)).then(() => {\n tui.requestRender();\n });\n return;\n }\n case 'clone':\n void Promise.resolve(deps.forkSession?.(commandArgs.trim() || undefined)).then(() => {\n tui.requestRender();\n });\n return;\n case 'reset':\n case 'restart':\n void runReset();\n return;\n case 'clear':\n void runReset();\n return;\n default:\n break;\n }\n\n const extensionCmd = extensionSlashCommands.find((c) => c.name === normalizedCommand);\n if (extensionCmd) {\n void Promise.resolve(\n extensionCmd.handler(commandArgs, extensionCmd.getContext?.()),\n ).then(() => {\n tui.requestRender();\n });\n return;\n }\n\n // Unknown slash that names a known workflow → rewrite into a natural prompt\n // so the assistant deterministically calls workflow({name}) instead of\n // depending on the model to puzzle out \"/audit_repo\".\n if (input.trimStart().startsWith('/')) {\n const rewritten = rewriteUnknownSlashAsWorkflow(normalizedCommand, commandArgs);\n if (rewritten) {\n chatLog.addSystem(`▶ Running workflow: ${normalizedCommand}`);\n tui.requestRender();\n sendMessage(rewritten);\n return;\n }\n }\n\n sendMessage(input);\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tui-commands.js","names":["listAllAuthProfiles"],"sources":["../../../src/tui/tui-commands.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport type { KeybindingsManager, TUI } from '@earendil-works/pi-tui';\n\nimport type {\n TuiCompactionResult,\n TuiModelChoice,\n TuiShareRequest,\n TuiSessionStats,\n TuiSessionItem,\n TuiStartupResources,\n TuiTranscriptTreeEntry,\n TuiAgentInfo,\n} from './tui-backend.js';\nimport type { ChatLog } from './components/chat-log.js';\nimport {\n formatKeyIds,\n formatXopcTuiHotkeys,\n type TuiHotkeyExtensionShortcut,\n} from './format-tui-hotkeys.js';\nimport { getTuiKeybindingsPath } from './tui-keybindings-file.js';\nimport type { TuiState } from './tui-types.js';\nimport { createWorkflowCatalog } from '../agent/workflow/catalog.js';\nimport {\n isValidAgentId,\n normalizeAgentId,\n parseAgentSessionKey,\n} from '../routing/agent-session-key.js';\nimport {\n normalizeReasoningLevel,\n normalizeThinkLevel,\n normalizeVerboseLevel,\n type ReasoningLevel,\n type ThinkLevel,\n type VerboseLevel,\n} from '../agent/transcript/thinking-types.js';\nimport {\n getAuthStorePath,\n listAllProfiles as listAllAuthProfiles,\n listProfilesForProvider,\n removeAuthProfile,\n type AuthProfileEntry,\n} from '../auth/profiles/index.js';\nimport { loadConfig, resolveConfigPath } from '../config/index.js';\nimport type { TuiSlashCommandContext, TuiSlashCommandHandler } from '../extensions/types/tui.js';\nimport { provenanceTracker } from '../extensions/security.js';\nimport type { ProjectTrustStoreEntry } from '../project-trust/trust-store.js';\nimport { providerSupportsOAuth } from '../providers/index.js';\n\nimport { rewriteUnknownSlashAsWorkflow } from './tui-workflow-slash.js';\nimport { formatTuiStartupText } from './tui-startup-text.js';\n\nexport interface SlashCommandDef {\n name: string;\n originalName?: string;\n description: string;\n}\n\nexport type TuiExtensionSlashCommandEntry = SlashCommandDef & {\n handler: TuiSlashCommandHandler;\n getContext?: () => TuiSlashCommandContext;\n};\n\nfunction keyLabel(\n keybindings: KeybindingsManager | undefined,\n id: Parameters<KeybindingsManager['getKeys']>[0],\n fallback: string,\n): string {\n return keybindings ? formatKeyIds(keybindings, id, { capitalize: true }) : fallback;\n}\n\nexport function getSlashCommands(\n _isLocal: boolean,\n keybindings?: KeybindingsManager,\n): SlashCommandDef[] {\n const abortKey = keyLabel(keybindings, 'app.interrupt', 'Escape');\n const toolsKey = keyLabel(keybindings, 'app.tools.expand', 'Ctrl+O');\n const thinkingKey = keyLabel(keybindings, 'app.thinking.toggle', 'Ctrl+T');\n const sessionKey = keyLabel(keybindings, 'app.session.resume', 'Ctrl+Shift+P');\n const modelCycleKey = keyLabel(keybindings, 'app.model.cycleForward', 'Ctrl+P');\n return [\n { name: 'help', description: 'Show available commands' },\n { name: 'abort', description: `Abort active run (or press ${abortKey})` },\n { name: 'recover', description: 'Reload history and reattach to a stalled run' },\n { name: 'retry', description: 'Abort current run if needed and resend the last user message' },\n { name: 'tools', description: `Toggle tool output expanded/collapsed (or ${toolsKey})` },\n { name: 'thinking', description: `Toggle thinking display (or ${thinkingKey})` },\n { name: 'copy', description: 'Copy last assistant message to clipboard' },\n { name: 'exit', description: 'Exit the TUI' },\n { name: 'quit', description: 'Quit the TUI' },\n { name: 'model', description: 'Open model picker (optional search text)' },\n { name: 'models', description: 'List available models' },\n { name: 'switch', description: 'Switch model — copy `provider/model` from /models' },\n { name: 'login', description: 'Login to an OAuth provider' },\n { name: 'logout', description: 'Remove stored provider auth profiles' },\n { name: 'usage', description: 'Show token usage statistics' },\n { name: 'session', description: 'Show current session info' },\n { name: 'agent', description: 'Show or switch agent for this TUI session' },\n { name: 'agents', description: 'List available agents' },\n { name: 'new', description: 'Start a new isolated TUI session (tui-{uuid})' },\n { name: 'fork', description: 'Fork current session transcript into a new session' },\n { name: 'clone', description: 'Duplicate current session transcript into a new session' },\n { name: 'trust', description: 'Manage project trust and show extension security policy' },\n { name: 'name', description: 'Show or set current session display name' },\n { name: 'reset', description: 'Reset current session transcript and reload history' },\n { name: 'clear', description: 'Clear the TUI view without resetting the session' },\n { name: 'list', description: 'List sessions' },\n { name: 'resume', description: `Open session picker (or ${sessionKey})` },\n { name: 'tree', description: 'Show grouped session tree' },\n { name: 'scoped-models', description: `Choose models for ${modelCycleKey} cycling` },\n { name: 'compact', description: 'Compact session history (local API)' },\n { name: 'think', description: 'Set thinking level (e.g. /think high)' },\n { name: 'reasoning', description: 'Set reasoning visibility (e.g. /reasoning stream)' },\n { name: 'verbose', description: 'Toggle verbose mode' },\n { name: 'status', description: 'Show agent status' },\n { name: 'config', description: 'Show current configuration' },\n { name: 'context', description: 'Show context budget' },\n { name: 'btw', description: 'Side question without saving to session' },\n { name: 'aside', description: 'Alias for /btw' },\n { name: 'export', description: 'Export session (markdown/html/json)' },\n { name: 'import', description: 'Import an xopc JSON session export' },\n { name: 'share', description: 'Create a share link for a workspace file/folder/site' },\n { name: 'settings', description: 'Open TUI settings overlay' },\n { name: 'reload', description: 'Reload keybindings, TUI settings, theme, and extension UI' },\n { name: 'reload-keybindings', description: `Reload ${getTuiKeybindingsPath()}` },\n { name: 'start', description: 'Show welcome message' },\n { name: 'hotkeys', description: 'Show resolved keyboard shortcuts (pi-style)' },\n { name: 'changelog', description: 'Show version history' },\n { name: 'workflow', description: 'Workflow subcommands: list, view <name>' },\n ];\n}\n\nfunction formatExtraSlashCommands(commands: SlashCommandDef[], seen: Set<string>): string[] {\n const lines: string[] = [];\n for (const command of commands) {\n const name = command.name.replace(/^\\//, '').trim().toLowerCase();\n const originalName = command.originalName?.replace(/^\\//, '').trim().toLowerCase();\n if (!name || seen.has(name) || (originalName && seen.has(originalName))) continue;\n seen.add(name);\n lines.push(` /${name} — ${command.description}`);\n }\n return lines;\n}\n\nexport function formatTuiHelpText(\n isLocal: boolean,\n keybindings?: KeybindingsManager,\n extraSlashCommands: SlashCommandDef[] = [],\n skillSlashCommands: SlashCommandDef[] = [],\n workflowSlashCommands: SlashCommandDef[] = [],\n): string {\n const commands = getSlashCommands(isLocal, keybindings);\n const interrupt = keyLabel(keybindings, 'app.interrupt', 'Escape');\n const thinkCycle = keyLabel(keybindings, 'app.thinking.cycle', 'Shift+Tab');\n const modelNext = keyLabel(keybindings, 'app.model.cycleForward', 'Ctrl+P');\n const modelPrev = keyLabel(keybindings, 'app.model.cycleBackward', 'Shift+Ctrl+P');\n const modelPicker = keyLabel(keybindings, 'app.model.select', 'Ctrl+L');\n const sessionPicker = keyLabel(keybindings, 'app.session.resume', 'Ctrl+Shift+P');\n const sessionTree = keyLabel(keybindings, 'app.session.tree', '(not bound)');\n const sessionFork = keyLabel(keybindings, 'app.session.fork', '(not bound)');\n const toolExpand = keyLabel(keybindings, 'app.tools.expand', 'Ctrl+O');\n const thinkingToggle = keyLabel(keybindings, 'app.thinking.toggle', 'Ctrl+T');\n const editorExternal = keyLabel(keybindings, 'app.editor.external', 'Ctrl+G');\n const suspend = keyLabel(keybindings, 'app.suspend', 'Ctrl+Z');\n const followUp = keyLabel(keybindings, 'app.message.followUp', 'Alt+Enter');\n const dequeue = keyLabel(keybindings, 'app.message.dequeue', 'Alt+Up');\n const pasteImage = keyLabel(keybindings, 'app.clipboard.pasteImage', 'Ctrl+V / Alt+V');\n const clearInput = keyLabel(keybindings, 'app.clear', 'Ctrl+C');\n const exit = keyLabel(keybindings, 'app.exit', 'Ctrl+D');\n const lines = ['Available commands:'];\n for (const c of commands) {\n lines.push(` /${c.name} — ${c.description}`);\n }\n const seenCommands = new Set(commands.map((command) => command.name));\n const skillCommandLines = formatExtraSlashCommands(skillSlashCommands, seenCommands);\n if (skillCommandLines.length > 0) {\n lines.push('', 'Skill commands:');\n lines.push(...skillCommandLines);\n }\n const workflowCommandLines = formatExtraSlashCommands(workflowSlashCommands, seenCommands);\n if (workflowCommandLines.length > 0) {\n lines.push('', 'Workflow commands:');\n lines.push(...workflowCommandLines);\n }\n const extraCommandLines = formatExtraSlashCommands(extraSlashCommands, seenCommands);\n if (extraCommandLines.length > 0) {\n lines.push('', 'Extension commands:');\n lines.push(...extraCommandLines);\n }\n lines.push('', 'Keyboard shortcuts (defaults align with pi coding-agent where noted):');\n lines.push(` ${interrupt} — Abort active run`);\n lines.push(` ${thinkCycle} — Cycle /think level`);\n lines.push(` ${modelNext} / ${modelPrev} — Next / previous model (/switch)`);\n lines.push(` ${modelPicker} — Model picker`);\n lines.push(` ${sessionPicker} — Session picker (rename/delete)`);\n lines.push(` ${sessionTree} — Session tree`);\n lines.push(` ${sessionFork} — Fork current session`);\n lines.push(` /scoped-models — Limit ${modelNext} model cycle set`);\n lines.push(` ${toolExpand} — Toggle tool output`);\n lines.push(` ${thinkingToggle} — Toggle thinking block display`);\n lines.push(` ${editorExternal} — Edit draft in $EDITOR`);\n lines.push(` ${suspend} — Suspend to shell (Unix)`);\n lines.push(` ${followUp} — Queue follow-up while busy (sends when this reply finishes)`);\n lines.push(` ${dequeue} — Restore queued messages to editor`);\n lines.push(' Enter (while busy) — Steer: inject at next tool boundary');\n lines.push(` ${pasteImage} — Paste image from clipboard`);\n lines.push(' /settings — Theme, thinking display, terminal progress, …');\n lines.push(` ${getTuiKeybindingsPath()} — Custom shortcuts (use /reload)`);\n lines.push(` ${clearInput} — Clear input; repeat within ~0.5s to exit when empty`);\n lines.push(` ${exit} — Exit when input empty`);\n lines.push(' !cmd — Local shell (gated; runs on this machine)');\n lines.push('', 'Use /hotkeys for the resolved binding list from the active keymap.');\n return lines.join('\\n');\n}\n\nexport function formatTuiStartText(\n state: TuiState,\n isLocal: boolean,\n keybindings?: KeybindingsManager,\n resources?: TuiStartupResources,\n): string {\n return formatTuiStartupText({\n state,\n isLocal,\n keybindings,\n resources,\n expanded: true,\n });\n}\n\nimport {\n formatTuiConfigInfo,\n formatTuiContextInfo,\n formatTuiLoginInfo,\n formatTuiModelsInfo,\n formatTuiSessionInfo,\n formatTuiSessionListInfo,\n formatTuiSessionTreeInfo,\n formatTuiStoredAuthProfilesInfo,\n formatTuiTranscriptTreeInfo,\n formatTuiTrustInfo,\n formatTuiUsageInfo,\n formatTuiWorkflowDetail,\n formatTuiWorkflowsInfo,\n loadTuiChangelogInfo,\n nextVerboseLevel,\n parseTuiExportRequest,\n parseTuiImportRequest,\n parseTuiShareRequest,\n writeTuiDebugInfo,\n type TuiExportRequest,\n type TuiImportRequest,\n} from './tui-command-formatters.js';\n\nexport type CommandHandlerDeps = {\n state: TuiState;\n chatLog: ChatLog;\n tui: TUI;\n isLocalMode: boolean;\n abortActive: () => Promise<void>;\n sendMessage: (text: string) => void;\n requestExit: () => void;\n updateFooter: () => void;\n keybindings: KeybindingsManager;\n uiOverlays?: {\n openModelPicker: (initialSearch?: string) => void;\n openAgentPicker?: () => void;\n openSessionPicker: () => void;\n openSessionTree: () => void;\n openTranscriptTree: () => void;\n openUserMessageFork: () => void;\n openScopedModels: () => void;\n openThinkingSelector: () => void;\n openSettings: () => void;\n openProjectTrust: () => void;\n reloadKeybindings: () => void | Promise<void>;\n };\n setThinkingLevel?: (level: ThinkLevel) => void | Promise<void>;\n setReasoningLevel?: (level: ReasoningLevel) => void | Promise<void>;\n setVerboseLevel?: (level: VerboseLevel) => void | Promise<void>;\n copyLastAssistant?: () => void | Promise<void>;\n renameCurrentSession?: (name: string) => void | Promise<void>;\n runCompaction?: (instructions?: string) => void | Promise<void | TuiCompactionResult>;\n listModels?: () => TuiModelChoice[] | Promise<TuiModelChoice[]>;\n switchModel?: (modelRef: string) => void | Promise<void>;\n listSessions?: () => TuiSessionItem[] | Promise<TuiSessionItem[]>;\n listAgents?: () => TuiAgentInfo[] | Promise<TuiAgentInfo[]>;\n switchAgentSession?: (sessionKey: string, agentId: string) => void | Promise<void>;\n getSessionStats?: () => TuiSessionStats | Promise<TuiSessionStats>;\n getStartupResources?: () => TuiStartupResources | undefined;\n loadTranscriptTree?: () => TuiTranscriptTreeEntry[] | Promise<TuiTranscriptTreeEntry[]>;\n exportSession?: (request: TuiExportRequest) => void | Promise<void>;\n importSession?: (request: TuiImportRequest) => void | Promise<void>;\n createShare?: (request: TuiShareRequest) => void | Promise<void>;\n startWorkflowRun?: (request: { definitionId: string; goal?: string }) => {\n runId: string;\n sessionKey: string;\n definitionId: string;\n } | Promise<{\n runId: string;\n sessionKey: string;\n definitionId: string;\n }>;\n authProfiles?: {\n listAll: () => AuthProfileEntry[] | Promise<AuthProfileEntry[]>;\n listProvider: (provider: string) => AuthProfileEntry[] | Promise<AuthProfileEntry[]>;\n remove: (profileId: string) => boolean | Promise<boolean>;\n getStorePath: () => string;\n };\n projectTrust?: {\n cwd: string;\n hasProjectResources: () => boolean;\n getStorePath: () => string;\n getEntry: () => ProjectTrustStoreEntry | null;\n getSessionDecision: () => boolean | null;\n };\n runLogin?: (provider?: string) => void | Promise<void>;\n runBtwQuery?: (question: string) => void | Promise<void>;\n forkSession?: (rawKey?: string) => void | Promise<void>;\n skillSlashCommands?: SlashCommandDef[];\n workflowSlashCommands?: SlashCommandDef[];\n extensionSlashCommands?: TuiExtensionSlashCommandEntry[];\n extensionShortcuts?: TuiHotkeyExtensionShortcut[];\n currentAgentId?: string;\n setSession?: (rawKey: string) => Promise<void>;\n resetSession?: () => Promise<void>;\n recoverStream?: () => void | Promise<void>;\n retryLastMessage?: () => void | Promise<void>;\n};\n\nfunction defaultAuthProfiles(): NonNullable<CommandHandlerDeps['authProfiles']> {\n return {\n listAll: () => listAllAuthProfiles(),\n listProvider: (provider) => listProfilesForProvider(provider),\n remove: (profileId) => removeAuthProfile(profileId),\n getStorePath: () => getAuthStorePath(),\n };\n}\n\nfunction formatAgentsList(agents: TuiAgentInfo[], currentAgentId?: string): string {\n if (agents.length === 0) {\n return 'No agents available.';\n }\n const current = currentAgentId?.trim().toLowerCase();\n const sorted = [...agents].sort((a, b) => {\n if (a.id === current && b.id !== current) return -1;\n if (b.id === current && a.id !== current) return 1;\n if (a.id === 'coder' && b.id !== 'coder') return -1;\n if (b.id === 'coder' && a.id !== 'coder') return 1;\n return a.id.localeCompare(b.id);\n });\n return [\n 'Available agents:',\n ...sorted.map((agent) => {\n const marker = agent.id === current ? '*' : ' ';\n const label = agent.displayName ? ` — ${agent.displayName}` : '';\n return `${marker} ${agent.id}${label}`;\n }),\n '',\n 'Switch with: /agent <id>',\n ].join('\\n');\n}\n\nfunction formatCurrentAgent(state: TuiState): string {\n const parsed = parseAgentSessionKey(state.currentSessionKey);\n if (!parsed) {\n return `Current session is not an agent session.\\nSession: ${state.currentSessionKey}`;\n }\n const lines = [\n `Current agent: ${parsed.agentId}`,\n `Session: ${state.currentSessionKey}`,\n ];\n const workspace = state.sessionInfo.effectiveWorkspacePath?.trim();\n if (workspace) lines.push(`Workspace: ${workspace}`);\n const provider = state.sessionInfo.modelProvider?.trim();\n const model = state.sessionInfo.model?.trim();\n if (model) lines.push(`Model: ${provider ? `${provider}/${model}` : model}`);\n return lines.join('\\n');\n}\n\nexport function createTuiCommandHandler(deps: CommandHandlerDeps): (input: string) => void {\n const {\n state,\n chatLog,\n tui,\n isLocalMode,\n abortActive,\n sendMessage,\n requestExit,\n updateFooter,\n keybindings,\n uiOverlays,\n skillSlashCommands = [],\n workflowSlashCommands = [],\n extensionSlashCommands = [],\n extensionShortcuts = [],\n setSession,\n resetSession,\n } = deps;\n\n const runReset = async () => {\n await abortActive();\n if (resetSession) {\n await resetSession();\n chatLog.addSystem(`session ${state.currentSessionKey} reset`);\n } else {\n chatLog.clearAll();\n state.messageFollowUpQueue.length = 0;\n state.steeringQueue.length = 0;\n chatLog.addSystem('Session cleared (reset not available in this mode).');\n }\n tui.requestRender();\n };\n\n return (input: string) => {\n const trimmed = input.replace(/^\\//, '').trim();\n const [commandName, ...restParts] = trimmed.split(/\\s+/);\n const normalizedCommand = (commandName ?? '').toLowerCase();\n const commandArgs = restParts.join(' ');\n\n switch (normalizedCommand) {\n case 'help':\n chatLog.addSystem(formatTuiHelpText(\n isLocalMode,\n keybindings,\n extensionSlashCommands,\n skillSlashCommands,\n workflowSlashCommands,\n ));\n tui.requestRender();\n return;\n case 'start':\n chatLog.addSystem(formatTuiStartText(state, isLocalMode, keybindings, deps.getStartupResources?.()));\n tui.requestRender();\n return;\n case 'hotkeys':\n case 'keys':\n chatLog.addSystem(formatXopcTuiHotkeys(keybindings, extensionShortcuts));\n tui.requestRender();\n return;\n case 'changelog':\n chatLog.addSystem(loadTuiChangelogInfo());\n tui.requestRender();\n return;\n case 'debug':\n try {\n const debugPath = writeTuiDebugInfo({ state, tui });\n chatLog.addSystem(`Debug log written\\n${debugPath}`);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Debug log failed: ${errorMessage}`);\n }\n tui.requestRender();\n return;\n case 'session':\n case 'status':\n void Promise.resolve(deps.getSessionStats?.())\n .catch(() => undefined)\n .then((stats) => {\n chatLog.addSystem(formatTuiSessionInfo(state, stats));\n tui.requestRender();\n });\n return;\n case 'agents':\n if (uiOverlays?.openAgentPicker) {\n uiOverlays.openAgentPicker();\n return;\n }\n void Promise.resolve(deps.listAgents?.() ?? [])\n .then((agents) => {\n const current = parseAgentSessionKey(state.currentSessionKey)?.agentId;\n chatLog.addSystem(formatAgentsList(agents, current));\n tui.requestRender();\n })\n .catch((err: unknown) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Agents list failed: ${errorMessage}`);\n tui.requestRender();\n });\n return;\n case 'agent': {\n const targetRaw = commandArgs.trim();\n if (!targetRaw) {\n chatLog.addSystem(formatCurrentAgent(state));\n tui.requestRender();\n return;\n }\n void (async () => {\n const parsedCurrent = parseAgentSessionKey(state.currentSessionKey);\n if (!parsedCurrent) {\n chatLog.addSystem('Cannot switch agent: current session is not an agent session.');\n tui.requestRender();\n return;\n }\n if (state.activeRunId) {\n chatLog.addSystem('Cannot switch agent while a run is active. Abort first.');\n tui.requestRender();\n return;\n }\n if (!isValidAgentId(targetRaw)) {\n chatLog.addSystem(`Invalid agent id: ${targetRaw}`);\n tui.requestRender();\n return;\n }\n const targetAgentId = normalizeAgentId(targetRaw);\n const agents = await Promise.resolve(deps.listAgents?.() ?? []);\n if (!agents.some((agent) => agent.enabled !== false && agent.id === targetAgentId)) {\n chatLog.addSystem(`Unknown agent: ${targetAgentId}`);\n tui.requestRender();\n return;\n }\n const targetSessionKey = `agent:${targetAgentId}:${parsedCurrent.rest}`;\n if (targetSessionKey === state.currentSessionKey) {\n chatLog.addSystem(`Already using agent: ${targetAgentId}`);\n tui.requestRender();\n return;\n }\n if (!deps.switchAgentSession) {\n chatLog.addSystem('Agent switching is not available in this mode.');\n tui.requestRender();\n return;\n }\n await deps.switchAgentSession(targetSessionKey, targetAgentId);\n chatLog.addSystem(`Switched to agent: ${targetAgentId}\\nSession: ${targetSessionKey}`);\n tui.requestRender();\n })().catch((err: unknown) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Agent switch failed: ${errorMessage}`);\n tui.requestRender();\n });\n return;\n }\n case 'usage':\n void Promise.resolve(deps.getSessionStats?.())\n .catch(() => undefined)\n .then((stats) => {\n chatLog.addSystem(formatTuiUsageInfo(state, stats));\n tui.requestRender();\n });\n return;\n case 'context':\n chatLog.addSystem(formatTuiContextInfo(state));\n tui.requestRender();\n return;\n case 'config':\n chatLog.addSystem(formatTuiConfigInfo(state));\n tui.requestRender();\n return;\n case 'trust':\n if (uiOverlays?.openProjectTrust) {\n uiOverlays.openProjectTrust();\n return;\n }\n chatLog.addSystem(\n formatTuiTrustInfo(loadConfig(), {\n configPath: resolveConfigPath(),\n provenance: provenanceTracker.getAll(),\n cwd: deps.projectTrust?.cwd,\n hasProjectResources: deps.projectTrust?.hasProjectResources(),\n projectTrustStorePath: deps.projectTrust?.getStorePath(),\n projectTrustEntry: deps.projectTrust?.getEntry(),\n projectTrustSessionDecision: deps.projectTrust?.getSessionDecision(),\n }),\n );\n tui.requestRender();\n return;\n case 'export':\n if (!deps.exportSession) {\n chatLog.addSystem('Export is not available in this mode.');\n tui.requestRender();\n return;\n }\n void Promise.resolve(deps.exportSession(parseTuiExportRequest(commandArgs))).then(() => {\n tui.requestRender();\n });\n return;\n case 'import':\n if (!deps.importSession) {\n chatLog.addSystem('Import is not available in this mode.');\n tui.requestRender();\n return;\n }\n void Promise.resolve(deps.importSession(parseTuiImportRequest(commandArgs))).then(() => {\n tui.requestRender();\n });\n return;\n case 'share': {\n if (!deps.createShare) {\n chatLog.addSystem('Share is not available in this mode.');\n tui.requestRender();\n return;\n }\n const request = parseTuiShareRequest(commandArgs);\n if (!request) {\n chatLog.addSystem(\n [\n 'Usage: /share <workspace-path> [friend|colleague|public] [--site|--zip|--file]',\n 'Optional: --title \"Title\" --description \"Description\"',\n ].join('\\n'),\n );\n tui.requestRender();\n return;\n }\n void Promise.resolve(deps.createShare(request)).then(() => {\n tui.requestRender();\n });\n return;\n }\n case 'btw':\n case 'aside': {\n const question = commandArgs.trim();\n if (!question) {\n chatLog.addSystem(\n 'Usage: /btw <question>\\nAnswers use the current session as read-only background and are not saved.',\n );\n tui.requestRender();\n return;\n }\n if (!deps.runBtwQuery) {\n chatLog.addSystem('/btw is not available in this mode.');\n tui.requestRender();\n return;\n }\n void Promise.resolve(deps.runBtwQuery(question)).then(() => {\n tui.requestRender();\n });\n return;\n }\n case 'workflow': {\n const [subcommandRaw, ...workflowRest] = commandArgs.trim().split(/\\s+/);\n const subcommand = (subcommandRaw || 'list').toLowerCase();\n if (subcommand === 'list' || subcommand === 'ls') {\n try {\n chatLog.addSystem(formatTuiWorkflowsInfo(createWorkflowCatalog().list()));\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Workflow list failed: ${errorMessage}`);\n }\n tui.requestRender();\n return;\n }\n if (subcommand === 'view' || subcommand === 'show') {\n const name = workflowRest[0]?.trim();\n if (!name) {\n chatLog.addSystem('Usage: /workflow view <name>');\n tui.requestRender();\n return;\n }\n try {\n chatLog.addSystem(formatTuiWorkflowDetail(name));\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Workflow view failed: ${errorMessage}`);\n }\n tui.requestRender();\n return;\n }\n if (subcommand === 'save') {\n chatLog.addSystem('/workflow save is not a TUI command. Save generated workflows through the workflow tool.');\n tui.requestRender();\n return;\n }\n chatLog.addSystem('Usage: /workflow list | /workflow view <name>');\n tui.requestRender();\n return;\n }\n case 'models':\n void Promise.resolve(deps.listModels?.() ?? []).then((models) => {\n chatLog.addSystem(formatTuiModelsInfo(models));\n tui.requestRender();\n });\n return;\n case 'model':\n if (uiOverlays) {\n uiOverlays.openModelPicker(commandArgs.trim() || undefined);\n return;\n }\n chatLog.addSystem('Model picker is not available in this mode. Use /models and /switch <provider/model>.');\n tui.requestRender();\n return;\n case 'list':\n void Promise.resolve(deps.listSessions?.() ?? []).then((sessions) => {\n chatLog.addSystem(\n formatTuiSessionListInfo(sessions, { currentSessionKey: state.currentSessionKey }),\n );\n tui.requestRender();\n });\n return;\n case 'tree':\n if (uiOverlays) {\n uiOverlays.openTranscriptTree();\n return;\n }\n if (deps.loadTranscriptTree) {\n void Promise.resolve(deps.loadTranscriptTree()).then((entries) => {\n chatLog.addSystem(formatTuiTranscriptTreeInfo(entries));\n tui.requestRender();\n });\n return;\n }\n uiOverlays?.openSessionTree();\n if (uiOverlays) return;\n void Promise.resolve(deps.listSessions?.() ?? []).then((sessions) => {\n chatLog.addSystem(\n formatTuiSessionTreeInfo(sessions, { currentSessionKey: state.currentSessionKey }),\n );\n tui.requestRender();\n });\n return;\n case 'switch': {\n const modelRef = commandArgs.trim();\n if (!modelRef) {\n chatLog.addSystem('Usage: /switch <provider/model>');\n tui.requestRender();\n return;\n }\n if (!deps.switchModel) {\n chatLog.addSystem('Model switching is not available in this mode.');\n tui.requestRender();\n return;\n }\n void Promise.resolve(deps.switchModel?.(modelRef)).then(() => {\n tui.requestRender();\n });\n return;\n }\n case 'login':\n if (deps.runLogin && (!commandArgs.trim() || providerSupportsOAuth(commandArgs.trim()))) {\n void Promise.resolve(deps.runLogin(commandArgs.trim() || undefined))\n .catch((err) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Login failed: ${errorMessage}`);\n })\n .finally(() => tui.requestRender());\n return;\n }\n chatLog.addSystem(formatTuiLoginInfo(commandArgs));\n tui.requestRender();\n return;\n case 'logout': {\n const provider = commandArgs.trim();\n const authProfiles = deps.authProfiles ?? defaultAuthProfiles();\n void (async () => {\n try {\n if (!provider) {\n const profiles = await authProfiles.listAll();\n chatLog.addSystem(\n formatTuiStoredAuthProfilesInfo(profiles, { authStorePath: authProfiles.getStorePath() }),\n );\n tui.requestRender();\n return;\n }\n\n const profiles = await authProfiles.listProvider(provider);\n if (profiles.length === 0) {\n chatLog.addSystem(\n [\n `No stored auth profiles found for provider: ${provider}`,\n 'Environment variables and config credentials are unchanged.',\n ].join('\\n'),\n );\n tui.requestRender();\n return;\n }\n\n let removed = 0;\n for (const profile of profiles) {\n if (await authProfiles.remove(profile.profileId)) {\n removed += 1;\n }\n }\n chatLog.addSystem(\n [\n `Logged out from ${provider}: removed ${removed} stored auth profile${removed === 1 ? '' : 's'}.`,\n 'Environment variables and config credentials are unchanged.',\n ].join('\\n'),\n );\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Logout failed: ${errorMessage}`);\n }\n tui.requestRender();\n })();\n return;\n }\n case 'exit':\n case 'quit':\n requestExit();\n return;\n case 'abort':\n case 'stop':\n case 'cancel':\n void abortActive().then(() => {\n chatLog.addSystem('Aborted.');\n tui.requestRender();\n });\n return;\n case 'recover':\n if (!deps.recoverStream) {\n chatLog.addSystem('Stream recovery is not available in this mode.');\n tui.requestRender();\n return;\n }\n void Promise.resolve(deps.recoverStream?.())\n .catch((err: unknown) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Recover failed: ${errorMessage}`);\n })\n .finally(() => tui.requestRender());\n return;\n case 'retry':\n if (!deps.retryLastMessage) {\n chatLog.addSystem('Retry is not available in this mode.');\n tui.requestRender();\n return;\n }\n void Promise.resolve(deps.retryLastMessage?.())\n .catch((err: unknown) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Retry failed: ${errorMessage}`);\n })\n .finally(() => tui.requestRender());\n return;\n case 'tools':\n state.toolsExpanded = !state.toolsExpanded;\n chatLog.setToolsExpanded(state.toolsExpanded);\n chatLog.addSystem(`Tools: ${state.toolsExpanded ? 'expanded' : 'collapsed'}`);\n tui.requestRender();\n return;\n case 'thinking':\n state.showThinking = !state.showThinking;\n chatLog.setShowThinking(state.showThinking);\n chatLog.addSystem(`Thinking display: ${state.showThinking ? 'on' : 'off'}`);\n updateFooter();\n tui.requestRender();\n return;\n case 'copy':\n if (!deps.copyLastAssistant) {\n chatLog.addSystem('Copy is not available in this mode.');\n tui.requestRender();\n return;\n }\n void Promise.resolve(deps.copyLastAssistant?.()).then(() => {\n tui.requestRender();\n });\n return;\n case 'name': {\n const name = commandArgs.trim();\n if (!name) {\n const currentName = state.sessionInfo.displayName?.trim();\n chatLog.addSystem(currentName ? `Session name: ${currentName}` : 'Usage: /name <name>');\n tui.requestRender();\n return;\n }\n if (!deps.renameCurrentSession) {\n chatLog.addSystem('Session rename is not available in this mode.');\n tui.requestRender();\n return;\n }\n void Promise.resolve(deps.renameCurrentSession?.(name)).then(() => {\n tui.requestRender();\n });\n return;\n }\n case 'resume':\n case 'sessions':\n if (!uiOverlays) {\n chatLog.addSystem('Session picker is not available in this mode. Use /list to show sessions.');\n tui.requestRender();\n return;\n }\n uiOverlays?.openSessionPicker();\n return;\n case 'scoped-models':\n case 'scopedmodels':\n if (!uiOverlays) {\n chatLog.addSystem('Scoped model picker is not available in this mode.');\n tui.requestRender();\n return;\n }\n uiOverlays?.openScopedModels();\n return;\n case 'think': {\n const level = normalizeThinkLevel(commandArgs);\n if (!commandArgs.trim()) {\n if (!uiOverlays) {\n const current = state.sessionInfo.thinkingLevel?.trim();\n chatLog.addSystem(\n current ? `Thinking level: ${current}` : 'Usage: /think <off|low|medium|high>',\n );\n tui.requestRender();\n return;\n }\n uiOverlays?.openThinkingSelector();\n return;\n }\n if (!level) {\n chatLog.addSystem(`Invalid thinking level: ${commandArgs}`);\n tui.requestRender();\n return;\n }\n if (!deps.setThinkingLevel) {\n chatLog.addSystem('Thinking level changes are not available in this mode.');\n tui.requestRender();\n return;\n }\n void Promise.resolve(deps.setThinkingLevel?.(level)).then(() => {\n tui.requestRender();\n });\n return;\n }\n case 'reasoning': {\n const level = normalizeReasoningLevel(commandArgs);\n if (!commandArgs.trim()) {\n const current = state.sessionInfo.reasoningLevel?.trim();\n chatLog.addSystem(\n current\n ? `Reasoning visibility: ${current}`\n : 'Usage: /reasoning <off|on|stream>',\n );\n tui.requestRender();\n return;\n }\n if (!level) {\n chatLog.addSystem(`Invalid reasoning visibility: ${commandArgs}`);\n tui.requestRender();\n return;\n }\n if (!deps.setReasoningLevel) {\n chatLog.addSystem('Reasoning visibility changes are not available in this mode.');\n tui.requestRender();\n return;\n }\n void Promise.resolve(deps.setReasoningLevel?.(level)).then(() => {\n tui.requestRender();\n });\n return;\n }\n case 'verbose': {\n const raw = commandArgs.trim();\n const level = raw ? normalizeVerboseLevel(raw) : nextVerboseLevel(state.sessionInfo.verboseLevel);\n if (raw && !level) {\n chatLog.addSystem(`Invalid verbose level: ${commandArgs}`);\n tui.requestRender();\n return;\n }\n if (!deps.setVerboseLevel) {\n chatLog.addSystem('Verbose mode changes are not available in this mode.');\n tui.requestRender();\n return;\n }\n void Promise.resolve(deps.setVerboseLevel?.(level)).then(() => {\n tui.requestRender();\n });\n return;\n }\n case 'settings':\n if (!uiOverlays) {\n chatLog.addSystem('Settings are not available in this mode.');\n tui.requestRender();\n return;\n }\n uiOverlays?.openSettings();\n return;\n case 'reload':\n case 'reload-keybindings':\n case 'reload-keybind':\n if (!uiOverlays) {\n chatLog.addSystem('Reload is not available in this mode.');\n tui.requestRender();\n return;\n }\n void Promise.resolve(uiOverlays?.reloadKeybindings())\n .then(() => {\n chatLog.addSystem('Reloaded keybindings, TUI settings, theme, and extension UI.');\n tui.requestRender();\n })\n .catch((err: unknown) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Reload failed: ${errorMessage}`);\n tui.requestRender();\n });\n return;\n case 'compact':\n if (!deps.runCompaction) {\n chatLog.addSystem('Compaction is not available in this mode.');\n tui.requestRender();\n return;\n }\n void deps.runCompaction?.(commandArgs.trim() || undefined);\n return;\n default:\n break;\n }\n\n switch (normalizedCommand) {\n case 'new': {\n void (async () => {\n try {\n await abortActive();\n const uniqueKey = `tui-${randomUUID()}`;\n if (setSession) {\n await setSession(uniqueKey);\n chatLog.addSystem(`new session: ${state.currentSessionKey}`);\n } else {\n chatLog.clearAll();\n state.messageFollowUpQueue.length = 0;\n state.steeringQueue.length = 0;\n chatLog.addSystem('New session requires gateway or local session support.');\n }\n tui.requestRender();\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`new session failed: ${errorMessage}`);\n tui.requestRender();\n }\n })();\n return;\n }\n case 'fork': {\n if (!commandArgs.trim() && uiOverlays) {\n uiOverlays.openUserMessageFork();\n return;\n }\n void Promise.resolve(deps.forkSession?.(commandArgs.trim() || undefined)).then(() => {\n tui.requestRender();\n });\n return;\n }\n case 'clone':\n void Promise.resolve(deps.forkSession?.(commandArgs.trim() || undefined)).then(() => {\n tui.requestRender();\n });\n return;\n case 'reset':\n case 'restart':\n void runReset();\n return;\n case 'clear':\n chatLog.clearAll();\n state.messageFollowUpQueue.length = 0;\n state.steeringQueue.length = 0;\n chatLog.addSystem('TUI view cleared. Session transcript was not reset.');\n tui.requestRender();\n return;\n default:\n break;\n }\n\n const extensionCmd = extensionSlashCommands.find((c) => c.name === normalizedCommand);\n if (extensionCmd) {\n void Promise.resolve(\n extensionCmd.handler(commandArgs, extensionCmd.getContext?.()),\n ).then(() => {\n tui.requestRender();\n });\n return;\n }\n\n if (normalizedCommand.startsWith('skill:')) {\n sendMessage(input);\n return;\n }\n\n if (normalizedCommand.startsWith('workflow:')) {\n const workflowName = normalizedCommand.slice('workflow:'.length).trim();\n if (!workflowName) {\n chatLog.addSystem('Usage: /workflow:<name> [goal]');\n tui.requestRender();\n return;\n }\n if (!deps.startWorkflowRun) {\n chatLog.addSystem('Workflow runs are not available in this mode.');\n tui.requestRender();\n return;\n }\n chatLog.addSystem(`▶ Starting workflow: ${workflowName}`);\n tui.requestRender();\n void Promise.resolve(deps.startWorkflowRun({\n definitionId: workflowName,\n goal: commandArgs.trim() || undefined,\n })).then((result) => {\n chatLog.addSystem(\n `Workflow started: ${result.definitionId}\\nrunId: ${result.runId}\\nsessionKey: ${result.sessionKey}`,\n );\n tui.requestRender();\n }).catch((err: unknown) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Workflow start failed: ${errorMessage}`);\n tui.requestRender();\n });\n return;\n }\n\n // Unknown slash that names a known workflow → rewrite into a natural prompt\n // so the assistant deterministically calls workflow({name}) instead of\n // depending on the model to puzzle out \"/audit_repo\".\n if (input.trimStart().startsWith('/')) {\n const rewritten = rewriteUnknownSlashAsWorkflow(normalizedCommand, commandArgs);\n if (rewritten) {\n chatLog.addSystem(`▶ Running workflow: ${normalizedCommand}`);\n tui.requestRender();\n sendMessage(rewritten);\n return;\n }\n }\n\n sendMessage(input);\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { TuiAutocompleteProvider } from '../extensions/types/tui.js';
|
|
2
|
+
import type { TuiWorkspaceFileSearchEntry } from './tui-backend.js';
|
|
3
|
+
export declare function createTuiFileAutocompleteProvider(searchWorkspaceFiles: (sessionKey: string, query: string, options?: {
|
|
4
|
+
limit?: number;
|
|
5
|
+
}) => Promise<TuiWorkspaceFileSearchEntry[]>): TuiAutocompleteProvider;
|