@xopcai/xopc 0.0.103 → 0.0.104
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -4
- package/README.zh-CN.md +7 -4
- package/dist/_virtual/_rolldown/runtime.js +2 -3
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/feishu/src/adapters/cli-login.d.ts +1 -1
- package/dist/extensions/feishu/src/adapters/cli-login.js +1 -1
- package/dist/extensions/feishu/src/adapters/cli-login.js.map +1 -1
- package/dist/extensions/feishu/src/adapters/gateway-setup.d.ts +2 -0
- package/dist/extensions/feishu/src/adapters/gateway-setup.js +225 -0
- package/dist/extensions/feishu/src/adapters/gateway-setup.js.map +1 -0
- package/dist/extensions/feishu/src/index.d.ts +8 -1
- package/dist/extensions/feishu/src/index.js +14 -1
- package/dist/extensions/feishu/src/index.js.map +1 -0
- package/dist/extensions/feishu/src/outbound/outbound-adapter.js +1 -1
- package/dist/extensions/feishu/src/plugin.d.ts +2 -1
- package/dist/extensions/feishu/src/plugin.js +2 -0
- package/dist/extensions/feishu/src/plugin.js.map +1 -1
- package/dist/extensions/feishu/src/streaming/streaming-adapter.js +1 -1
- package/dist/extensions/feishu/src/transport/webhook/monitor.js +1 -1
- package/dist/extensions/feishu/xopc.extension.json +66 -1
- package/dist/extensions/telegram/src/adapters/gateway-setup.d.ts +2 -0
- package/dist/extensions/telegram/src/adapters/gateway-setup.js +146 -0
- package/dist/extensions/telegram/src/adapters/gateway-setup.js.map +1 -0
- package/dist/extensions/telegram/src/adapters/security-adapter.js +1 -1
- package/dist/extensions/telegram/src/command-handler.js +1 -2
- package/dist/extensions/telegram/src/command-handler.js.map +1 -1
- package/dist/extensions/telegram/src/config-schema.js +2 -2
- package/dist/extensions/telegram/src/config-schema.js.map +1 -1
- package/dist/extensions/telegram/src/doctor.d.ts +1 -0
- package/dist/extensions/telegram/src/doctor.js +68 -0
- package/dist/extensions/telegram/src/doctor.js.map +1 -1
- package/dist/extensions/telegram/src/index.d.ts +8 -1
- package/dist/extensions/telegram/src/index.js +15 -2
- package/dist/extensions/telegram/src/index.js.map +1 -0
- package/dist/extensions/telegram/src/plugin.d.ts +13 -5
- package/dist/extensions/telegram/src/plugin.js +32 -12
- package/dist/extensions/telegram/src/plugin.js.map +1 -1
- package/dist/extensions/telegram/src/proxy-fetch.js +22 -5
- package/dist/extensions/telegram/src/proxy-fetch.js.map +1 -1
- package/dist/extensions/telegram/xopc.extension.json +412 -5
- package/dist/extensions/weixin/src/adapters/onboard-cli.js +2 -2
- package/dist/extensions/weixin/src/adapters/onboard-cli.js.map +1 -1
- package/dist/extensions/weixin/src/api/api.js +1 -1
- package/dist/extensions/weixin/src/index.d.ts +8 -0
- package/dist/extensions/weixin/src/index.js +12 -1
- package/dist/extensions/weixin/src/index.js.map +1 -0
- package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
- package/dist/extensions/weixin/src/plugin.d.ts +2 -1
- package/dist/extensions/weixin/src/plugin.js +77 -2
- package/dist/extensions/weixin/src/plugin.js.map +1 -1
- package/dist/extensions/weixin/xopc.extension.json +52 -0
- package/dist/gateway/static/root/assets/agents-CvsBrBfi.js +396 -0
- package/dist/gateway/static/root/assets/{apps-page-C5RmwmTT.js → apps-page-L-IwQTe0.js} +1 -1
- package/dist/gateway/static/root/assets/browser-BLJWD7WI.js +8 -0
- package/dist/gateway/static/root/assets/channels-settings-D95KuPeP.js +1 -0
- package/dist/gateway/static/root/assets/cron-page-CfkWXDAI.js +1 -0
- package/dist/gateway/static/root/assets/{dist-CWm8hTXZ.js → dist-C6vclgEL.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-BzYgTkS9.js → extension-debug-page-D4JYAbsX.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-BmTZH6gL.js → extension-page-_T62gi6e.js} +1 -1
- package/dist/gateway/static/root/assets/extension-settings-page-CkJbjyM-.js +1 -0
- package/dist/gateway/static/root/assets/{fetch-CMoWY2Si.js → fetch-B5aiIguv.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-startup-retry-DqmLXhs6.js +1 -0
- package/dist/gateway/static/root/assets/heartbeat-config-api-HwJV1K_Y.js +1 -0
- package/dist/gateway/static/root/assets/index-BPYKW7FB.css +1 -0
- package/dist/gateway/static/root/assets/index-DvTb6wNR.js +4845 -0
- package/dist/gateway/static/root/assets/{logs-page-BjdQjHwk.js → logs-page-DsjtTjBy.js} +2 -2
- package/dist/gateway/static/root/assets/{note-detail-page-8Er4197b.js → note-detail-page-B2V7RhgD.js} +43 -43
- package/dist/gateway/static/root/assets/{note-time-CF3vf1jm.js → note-time-BG8GCTr4.js} +1 -1
- package/dist/gateway/static/root/assets/notes-page-xrcVBQ6Z.js +1 -0
- package/dist/gateway/static/root/assets/schema-form-S-QUvhul.js +1 -0
- package/dist/gateway/static/root/assets/sessions-page-CrQer6Au.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-DujQl9c7.js +2 -0
- package/dist/gateway/static/root/assets/{settings-form-section-C7qA7y0J.js → settings-form-section-r1V7dRV6.js} +1 -1
- package/dist/gateway/static/root/assets/settings-page-C9nrONQ2.js +3 -0
- package/dist/gateway/static/root/assets/{share-preview-page-Tvr5Mtq5.js → share-preview-page-DOFy0FNt.js} +1 -1
- package/dist/gateway/static/root/assets/skills-page-DmTsrs_a.js +2 -0
- package/dist/gateway/static/root/assets/{theme-store-HTvJlFLL.js → theme-store-Bo3j5Ovv.js} +1 -1
- package/dist/gateway/static/root/assets/url-WgQIjFZu.js +3 -0
- package/dist/gateway/static/root/assets/voice-api-key-field-AjmUAlEQ.js +1 -0
- package/dist/gateway/static/root/assets/{workflow-page.utils-CeBkAjP7.js → workflow-page.utils-DLEJ92gK.js} +1 -1
- package/dist/gateway/static/root/assets/workflows-page-BnjjKrM1.js +27 -0
- package/dist/gateway/static/root/index.html +6 -5
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.d.ts +18 -6
- package/dist/src/agent/agent-manager.js +60 -35
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/builtin-agent-ids.d.ts +2 -0
- package/dist/src/agent/builtin-agent-ids.js +17 -0
- package/dist/src/agent/builtin-agent-ids.js.map +1 -0
- package/dist/src/agent/child-agent-factory.d.ts +4 -0
- package/dist/src/agent/child-agent-factory.js +28 -8
- package/dist/src/agent/child-agent-factory.js.map +1 -1
- package/dist/src/agent/context/workspace-seed.js +1 -1
- package/dist/src/agent/context/workspace-templates/AGENTS.md +23 -184
- package/dist/src/agent/embedded/run-turn.js +8 -2
- package/dist/src/agent/embedded/run-turn.js.map +1 -1
- package/dist/src/agent/embedded/session-tool-result-guard.js +1 -1
- package/dist/src/agent/embedded/subscribe-session.js +33 -51
- package/dist/src/agent/embedded/subscribe-session.js.map +1 -1
- package/dist/src/agent/embedded/types.d.ts +36 -35
- package/dist/src/agent/fallback/candidates.js +1 -1
- package/dist/src/agent/fallback/candidates.js.map +1 -1
- package/dist/src/agent/inbound/inbound-loop.js +1 -1
- package/dist/src/agent/inbound/turn-dispatcher.d.ts +1 -0
- package/dist/src/agent/inbound/turn-dispatcher.js +24 -5
- package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -1
- package/dist/src/agent/models/manager.d.ts +1 -1
- package/dist/src/agent/models/manager.js +1 -1
- package/dist/src/agent/models/manager.js.map +1 -1
- package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.d.ts +1 -1
- package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js +1 -1
- package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js.map +1 -1
- package/dist/src/agent/prompt/sections/tooling.js +4 -0
- package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
- package/dist/src/agent/service/direct-turn-helpers.d.ts +1 -0
- package/dist/src/agent/service/direct-turn-helpers.js +1 -1
- package/dist/src/agent/service/direct-turn-helpers.js.map +1 -1
- package/dist/src/agent/service/process-direct-streaming.d.ts +1 -0
- package/dist/src/agent/service/process-direct-streaming.js +35 -18
- package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
- package/dist/src/agent/service-inbound-utils.d.ts +0 -1
- package/dist/src/agent/service-inbound-utils.js +1 -17
- package/dist/src/agent/service-inbound-utils.js.map +1 -1
- package/dist/src/agent/service.d.ts +4 -4
- package/dist/src/agent/service.js +27 -15
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/session/session-config-service.d.ts +1 -0
- package/dist/src/agent/session/session-config-service.js +9 -1
- package/dist/src/agent/session/session-config-service.js.map +1 -1
- package/dist/src/agent/session/session-inspector.d.ts +2 -1
- package/dist/src/agent/session/session-inspector.js +4 -0
- package/dist/src/agent/session/session-inspector.js.map +1 -1
- package/dist/src/agent/skills/config.js +1 -3
- package/dist/src/agent/skills/config.js.map +1 -1
- package/dist/src/agent/skills/format-skills-prompt.d.ts +1 -0
- package/dist/src/agent/skills/format-skills-prompt.js +3 -2
- package/dist/src/agent/skills/format-skills-prompt.js.map +1 -1
- package/dist/src/agent/skills/hub-pull.js +1 -1
- package/dist/src/agent/skills/index.js +20 -5
- package/dist/src/agent/skills/index.js.map +1 -1
- package/dist/src/agent/skills/installer.js +14 -27
- package/dist/src/agent/skills/installer.js.map +1 -1
- package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js +11 -1
- package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js.map +1 -1
- package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js +18 -4
- package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js.map +1 -1
- package/dist/src/agent/skills/marketplace/adapters/store/adapter.js +11 -2
- package/dist/src/agent/skills/marketplace/adapters/store/adapter.js.map +1 -1
- package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.d.ts +2 -2
- package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js.map +1 -1
- package/dist/src/agent/skills/skill-manager.d.ts +4 -1
- package/dist/src/agent/skills/skill-manager.js +3 -3
- package/dist/src/agent/skills/skill-manager.js.map +1 -1
- package/dist/src/agent/skills/skill-view-path.d.ts +1 -17
- package/dist/src/agent/skills/skill-view-path.js +3 -66
- package/dist/src/agent/skills/skill-view-path.js.map +1 -1
- package/dist/src/agent/skills/test-framework.js +2 -3
- package/dist/src/agent/skills/test-framework.js.map +1 -1
- package/dist/src/agent/streaming/reasoning-visibility-sse.js +1 -0
- package/dist/src/agent/streaming/reasoning-visibility-sse.js.map +1 -1
- package/dist/src/agent/tool-manuals/browser.d.ts +1 -0
- package/{skills/browser/SKILL.md → dist/src/agent/tool-manuals/browser.js} +51 -54
- package/dist/src/agent/tool-manuals/browser.js.map +1 -0
- package/dist/src/agent/tool-manuals/index.d.ts +10 -0
- package/dist/src/agent/tool-manuals/index.js +28 -0
- package/dist/src/agent/tool-manuals/index.js.map +1 -0
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js +1 -1
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
- package/dist/src/agent/tools/factory.js +7 -5
- package/dist/src/agent/tools/factory.js.map +1 -1
- package/dist/src/agent/tools/index.d.ts +1 -0
- package/dist/src/agent/tools/index.js +5 -4
- package/dist/src/agent/tools/session-search-tool.js +1 -1
- package/dist/src/agent/tools/shell.js +1 -1
- package/dist/src/agent/tools/skills-tools.js +37 -8
- package/dist/src/agent/tools/skills-tools.js.map +1 -1
- package/dist/src/agent/tools/tool-manual-tool.d.ts +6 -0
- package/dist/src/agent/tools/tool-manual-tool.js +34 -0
- package/dist/src/agent/tools/tool-manual-tool.js.map +1 -0
- package/dist/src/agent/tools/web-extract.js +2 -2
- package/dist/src/agent/tools/web.js +1 -1
- package/dist/src/agent/workflow/catalog.d.ts +7 -2
- package/dist/src/agent/workflow/catalog.js +66 -25
- package/dist/src/agent/workflow/catalog.js.map +1 -1
- package/dist/src/agent/workflow/subagent-runner.d.ts +3 -0
- package/dist/src/agent/workflow/subagent-runner.js +50 -4
- package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
- package/dist/src/agent/workflow/types.d.ts +10 -0
- package/dist/src/auth/credentials.js +10 -5
- package/dist/src/auth/credentials.js.map +1 -1
- package/dist/src/browser/actions/extension-registry-bridge.js +1 -1
- package/dist/src/browser/actions/registry.js +2 -2
- package/dist/src/browser/cdp-local-launcher.js +1 -1
- package/dist/src/browser/index.js +3 -3
- package/dist/src/browser/providers/browser-ext-install.js +1 -1
- package/dist/src/browser/providers/cloakbrowser.js +1 -1
- package/dist/src/channels/catalog/channel-catalog-service.d.ts +11 -0
- package/dist/src/channels/catalog/channel-catalog-service.js +168 -0
- package/dist/src/channels/catalog/channel-catalog-service.js.map +1 -0
- package/dist/src/channels/catalog/channel-catalog-types.d.ts +22 -0
- package/dist/src/channels/catalog/channel-catalog-types.js +1 -0
- package/dist/src/channels/dock.d.ts +0 -7
- package/dist/src/channels/dock.js +1 -21
- package/dist/src/channels/index.d.ts +1 -3
- package/dist/src/channels/index.js +1 -5
- package/dist/src/channels/lifecycle-supervisor.d.ts +1 -0
- package/dist/src/channels/lifecycle-supervisor.js +11 -0
- package/dist/src/channels/lifecycle-supervisor.js.map +1 -1
- package/dist/src/channels/manager.d.ts +1 -0
- package/dist/src/channels/manager.js +3 -0
- package/dist/src/channels/manager.js.map +1 -1
- package/dist/src/channels/pairing/pairing-channel.d.ts +2 -3
- package/dist/src/channels/pairing/pairing-messages.js +1 -1
- package/dist/src/channels/pairing/pairing-messages.js.map +1 -1
- package/dist/src/channels/pairing/pairing-service.d.ts +1 -1
- package/dist/src/channels/pairing/pairing-service.js +8 -27
- package/dist/src/channels/pairing/pairing-service.js.map +1 -1
- package/dist/src/channels/plugin-types.d.ts +3 -1
- package/dist/src/channels/plugins/types.adapters.d.ts +55 -2
- package/dist/src/channels/telegram/index.js +1 -1
- package/dist/src/chat-commands/builtins/config.js +4 -4
- package/dist/src/chat-commands/builtins/config.js.map +1 -1
- package/dist/src/chat-commands/config-paths.js +1 -1
- package/dist/src/chat-commands/config-paths.js.map +1 -1
- package/dist/src/chat-commands/context.js +1 -1
- package/dist/src/chat-commands/context.js.map +1 -1
- package/dist/src/cli/bin.js +1 -1
- package/dist/src/cli/command-manifest.js +1 -1
- package/dist/src/cli/command-manifest.js.map +1 -1
- package/dist/src/cli/commands/agent.js +2 -2
- package/dist/src/cli/commands/agent.js.map +1 -1
- package/dist/src/cli/commands/agents.js +2 -4
- package/dist/src/cli/commands/agents.js.map +1 -1
- package/dist/src/cli/commands/auth.js +1 -1
- package/dist/src/cli/commands/browser-cli-helpers.js +1 -1
- package/dist/src/cli/commands/channels.d.ts +1 -5
- package/dist/src/cli/commands/channels.js +115 -281
- package/dist/src/cli/commands/channels.js.map +1 -1
- package/dist/src/cli/commands/config.js +2 -2
- package/dist/src/cli/commands/config.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/channel-config.js +16 -69
- package/dist/src/cli/commands/doctor/checks/channel-config.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/channel-pairing-pending.js +6 -4
- package/dist/src/cli/commands/doctor/checks/channel-pairing-pending.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/channel-plugins.js +2 -2
- package/dist/src/cli/commands/doctor/checks/channel-plugins.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/doctor/checks/provider-auth.js +13 -9
- package/dist/src/cli/commands/doctor/checks/provider-auth.js.map +1 -1
- package/dist/src/cli/commands/extension-dev.js +2 -1
- package/dist/src/cli/commands/extension-dev.js.map +1 -1
- package/dist/src/cli/commands/extension-marketplace.js +2 -1
- package/dist/src/cli/commands/extension-marketplace.js.map +1 -1
- package/dist/src/cli/commands/extension-pack.js +2 -1
- package/dist/src/cli/commands/extension-pack.js.map +1 -1
- package/dist/src/cli/commands/models.js +7 -4
- package/dist/src/cli/commands/models.js.map +1 -1
- package/dist/src/cli/commands/onboard/channels/index.js +1 -1
- package/dist/src/cli/commands/onboard/channels/index.js.map +1 -1
- package/dist/src/cli/commands/onboard/channels/registry.d.ts +2 -1
- package/dist/src/cli/commands/onboard/channels/registry.js +32 -8
- package/dist/src/cli/commands/onboard/channels/registry.js.map +1 -1
- package/dist/src/cli/commands/onboard/model.js +8 -5
- package/dist/src/cli/commands/onboard/model.js.map +1 -1
- package/dist/src/cli/commands/onboard.js +4 -6
- package/dist/src/cli/commands/onboard.js.map +1 -1
- package/dist/src/cli/commands/setup-shared/runner.d.ts +1 -1
- package/dist/src/cli/commands/setup-shared/runner.js.map +1 -1
- package/dist/src/cli/commands/setup-shared/types.d.ts +1 -1
- package/dist/src/cli/commands/setup-shared/types.js.map +1 -1
- package/dist/src/cli/commands/tui.js +13 -5
- package/dist/src/cli/commands/tui.js.map +1 -1
- package/dist/src/cli/extension-cli-register.js +1 -1
- package/dist/src/commands/agents.config.d.ts +3 -3
- package/dist/src/commands/agents.config.js +7 -7
- package/dist/src/commands/agents.config.js.map +1 -1
- package/dist/src/config/agent-profile.d.ts +1 -1
- package/dist/src/config/agent-profile.js +6 -2
- package/dist/src/config/agent-profile.js.map +1 -1
- package/dist/src/config/agent-typed-models.d.ts +2 -2
- package/dist/src/config/agent-typed-models.js +13 -2
- package/dist/src/config/agent-typed-models.js.map +1 -1
- package/dist/src/config/index.js +3 -3
- package/dist/src/config/integration.d.ts +1 -1
- package/dist/src/config/loader.d.ts +0 -1
- package/dist/src/config/loader.js +4 -9
- package/dist/src/config/loader.js.map +1 -1
- package/dist/src/config/models-json.d.ts +6 -6
- package/dist/src/config/rules.js +2 -12
- package/dist/src/config/rules.js.map +1 -1
- package/dist/src/config/schema.d.ts +74 -47
- package/dist/src/config/schema.js +28 -66
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/config/validate-channel-configs.d.ts +0 -3
- package/dist/src/config/validate-channel-configs.js +29 -10
- package/dist/src/config/validate-channel-configs.js.map +1 -1
- package/dist/src/cron/executor.js +1 -4
- package/dist/src/cron/executor.js.map +1 -1
- package/dist/src/extensions/activation-context.js +3 -1
- package/dist/src/extensions/activation-context.js.map +1 -1
- package/dist/src/extensions/activation-planner.js +12 -0
- package/dist/src/extensions/activation-planner.js.map +1 -1
- package/dist/src/extensions/api.d.ts +5 -1
- package/dist/src/extensions/api.js +12 -0
- package/dist/src/extensions/api.js.map +1 -1
- package/dist/src/extensions/discover-extensions.js +17 -13
- package/dist/src/extensions/discover-extensions.js.map +1 -1
- package/dist/src/extensions/extension-metadata-snapshot.js +11 -5
- package/dist/src/extensions/extension-metadata-snapshot.js.map +1 -1
- package/dist/src/extensions/index.js +12 -4
- package/dist/src/extensions/index.js.map +1 -0
- package/dist/src/extensions/loader.d.ts +5 -1
- package/dist/src/extensions/loader.js +12 -11
- package/dist/src/extensions/loader.js.map +1 -1
- package/dist/src/extensions/manifest-registry.js +98 -93
- package/dist/src/extensions/manifest-registry.js.map +1 -1
- package/dist/src/extensions/normalize-manifest.js +91 -15
- package/dist/src/extensions/normalize-manifest.js.map +1 -1
- package/dist/src/extensions/sdk/index.js +1 -1
- package/dist/src/extensions/sdk/testing.js +4 -0
- package/dist/src/extensions/sdk/testing.js.map +1 -1
- package/dist/src/extensions/types/core.d.ts +32 -1
- package/dist/src/extensions/types/manifest.d.ts +60 -0
- package/dist/src/extensions/types/tui.d.ts +414 -5
- package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
- package/dist/src/gateway/agent-builtin-tools.js +16 -0
- package/dist/src/gateway/agent-builtin-tools.js.map +1 -1
- package/dist/src/gateway/agent-run-relay.d.ts +2 -3
- package/dist/src/gateway/agent-run-relay.js +10 -3
- package/dist/src/gateway/agent-run-relay.js.map +1 -1
- package/dist/src/gateway/agents-admin.d.ts +32 -19
- package/dist/src/gateway/agents-admin.js +113 -93
- package/dist/src/gateway/agents-admin.js.map +1 -1
- package/dist/src/gateway/chat-stream/mapper.d.ts +34 -0
- package/dist/src/gateway/chat-stream/mapper.js +244 -0
- package/dist/src/gateway/chat-stream/mapper.js.map +1 -0
- package/dist/src/gateway/chat-stream/protocol.d.ts +100 -0
- package/dist/src/gateway/chat-stream/protocol.js +1 -0
- package/dist/src/gateway/heartbeat/service.js +1 -1
- package/dist/src/gateway/hono/lib/agent-model.d.ts +4 -4
- package/dist/src/gateway/hono/lib/agent-model.js +13 -11
- package/dist/src/gateway/hono/lib/agent-model.js.map +1 -1
- package/dist/src/gateway/hono/lib/config-payload.d.ts +19 -7
- package/dist/src/gateway/hono/lib/config-payload.js +16 -15
- package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
- package/dist/src/gateway/hono/routes/agents.js +83 -48
- package/dist/src/gateway/hono/routes/agents.js.map +1 -1
- package/dist/src/gateway/hono/routes/channels.js +134 -214
- package/dist/src/gateway/hono/routes/channels.js.map +1 -1
- package/dist/src/gateway/hono/routes/commands-skills.js +10 -4
- package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
- package/dist/src/gateway/hono/routes/config-patch/agents.js +26 -13
- package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -1
- package/dist/src/gateway/hono/routes/config-patch/channels.d.ts +1 -11
- package/dist/src/gateway/hono/routes/config-patch/channels.js +18 -165
- package/dist/src/gateway/hono/routes/config-patch/channels.js.map +1 -1
- package/dist/src/gateway/hono/routes/config.js +5 -2
- package/dist/src/gateway/hono/routes/config.js.map +1 -1
- package/dist/src/gateway/hono/routes/dreaming.js +1 -1
- package/dist/src/gateway/hono/routes/lazy-bundles.js +13 -1
- package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
- package/dist/src/gateway/hono/routes/public-gateway.js +2 -4
- package/dist/src/gateway/hono/routes/public-gateway.js.map +1 -1
- package/dist/src/gateway/hono/routes/sessions.js +179 -0
- package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
- package/dist/src/gateway/hono/routes/tui.d.ts +3 -0
- package/dist/src/gateway/hono/routes/tui.js +16 -0
- package/dist/src/gateway/hono/routes/tui.js.map +1 -0
- package/dist/src/gateway/hono/routes/workflows.js +25 -1
- package/dist/src/gateway/hono/routes/workflows.js.map +1 -1
- package/dist/src/gateway/hono/sse.d.ts +5 -7
- package/dist/src/gateway/hono/sse.js +21 -38
- package/dist/src/gateway/hono/sse.js.map +1 -1
- package/dist/src/gateway/protocol.js.map +1 -1
- package/dist/src/gateway/service/agent-runner.d.ts +2 -4
- package/dist/src/gateway/service/agent-runner.js +1 -1
- package/dist/src/gateway/service/agent-runner.js.map +1 -1
- package/dist/src/gateway/service/marketplace-service.d.ts +4 -3
- package/dist/src/gateway/service/marketplace-service.js +7 -4
- package/dist/src/gateway/service/marketplace-service.js.map +1 -1
- package/dist/src/gateway/service/run-gateway-agent.d.ts +2 -6
- package/dist/src/gateway/service/run-gateway-agent.js +63 -36
- package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
- package/dist/src/gateway/service/sessions-api.d.ts +19 -0
- package/dist/src/gateway/service/sessions-api.js +12 -0
- package/dist/src/gateway/service/sessions-api.js.map +1 -1
- package/dist/src/gateway/service.d.ts +6 -0
- package/dist/src/gateway/service.js +73 -57
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/heartbeat/index.js +1 -1
- package/dist/src/mcp/channel-bridge.js +1 -1
- package/dist/src/project-trust/trust-store.d.ts +30 -0
- package/dist/src/project-trust/trust-store.js +194 -0
- package/dist/src/project-trust/trust-store.js.map +1 -0
- package/dist/src/providers/index.d.ts +1 -1
- package/dist/src/providers/index.js +18 -7
- package/dist/src/providers/index.js.map +1 -1
- package/dist/src/routing/resolve-route.d.ts +0 -3
- package/dist/src/routing/resolve-route.js.map +1 -1
- package/dist/src/routing/resolve-tui-session-key.d.ts +2 -0
- package/dist/src/routing/resolve-tui-session-key.js +8 -3
- package/dist/src/routing/resolve-tui-session-key.js.map +1 -1
- package/dist/src/session/client-history.d.ts +32 -0
- package/dist/src/session/client-history.js +232 -1
- package/dist/src/session/client-history.js.map +1 -1
- package/dist/src/session/manager.d.ts +37 -4
- package/dist/src/session/manager.js +39 -15
- package/dist/src/session/manager.js.map +1 -1
- package/dist/src/session/session-context-for-llm.d.ts +93 -1
- package/dist/src/session/session-context-for-llm.js +105 -2
- package/dist/src/session/session-context-for-llm.js.map +1 -1
- package/dist/src/session/store.d.ts +37 -0
- package/dist/src/session/store.js +127 -2
- package/dist/src/session/store.js.map +1 -1
- package/dist/src/session/stored-rows-to-file-entries.js +37 -1
- package/dist/src/session/stored-rows-to-file-entries.js.map +1 -1
- package/dist/src/session/types.d.ts +14 -1
- package/dist/src/session/types.js.map +1 -1
- package/dist/src/share/share-thumbnail.js +1 -1
- package/dist/src/storage/sqlite/migrations/004_add_session_type_metadata.sql +15 -0
- package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
- package/dist/src/storage/sqlite/migrations/runner.js +3 -3
- package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
- package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
- package/dist/src/storage/sqlite/row-mappers.d.ts +14 -1
- package/dist/src/storage/sqlite/row-mappers.js +14 -1
- package/dist/src/storage/sqlite/row-mappers.js.map +1 -1
- package/dist/src/storage/sqlite/schema.js +1 -1
- package/dist/src/storage/sqlite/session-metadata.js +1 -0
- package/dist/src/storage/sqlite/session-metadata.js.map +1 -1
- package/dist/src/storage/sqlite/session-repository.js +52 -25
- package/dist/src/storage/sqlite/session-repository.js.map +1 -1
- package/dist/src/tui/backends/embedded-backend.d.ts +53 -4
- package/dist/src/tui/backends/embedded-backend.js +227 -39
- package/dist/src/tui/backends/embedded-backend.js.map +1 -1
- package/dist/src/tui/backends/gateway-sse-backend.d.ts +59 -3
- package/dist/src/tui/backends/gateway-sse-backend.js +416 -26
- package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
- package/dist/src/tui/chat-history.d.ts +5 -1
- package/dist/src/tui/chat-history.js +78 -8
- package/dist/src/tui/chat-history.js.map +1 -1
- package/dist/src/tui/clipboard-text.d.ts +5 -0
- package/dist/src/tui/clipboard-text.js +46 -0
- package/dist/src/tui/clipboard-text.js.map +1 -0
- package/dist/src/tui/components/assistant-message.d.ts +19 -3
- package/dist/src/tui/components/assistant-message.js +115 -9
- package/dist/src/tui/components/assistant-message.js.map +1 -1
- package/dist/src/tui/components/bash-execution.d.ts +3 -2
- package/dist/src/tui/components/bash-execution.js +31 -3
- package/dist/src/tui/components/bash-execution.js.map +1 -1
- package/dist/src/tui/components/bash-summary.d.ts +23 -0
- package/dist/src/tui/components/bash-summary.js +87 -0
- package/dist/src/tui/components/bash-summary.js.map +1 -0
- package/dist/src/tui/components/branch-message-summary.d.ts +17 -0
- package/dist/src/tui/components/branch-message-summary.js +43 -0
- package/dist/src/tui/components/branch-message-summary.js.map +1 -0
- package/dist/src/tui/components/branch-summary.d.ts +13 -0
- package/dist/src/tui/components/branch-summary.js +51 -0
- package/dist/src/tui/components/branch-summary.js.map +1 -0
- package/dist/src/tui/components/chat-log.d.ts +46 -6
- package/dist/src/tui/components/chat-log.js +183 -21
- package/dist/src/tui/components/chat-log.js.map +1 -1
- package/dist/src/tui/components/compaction-summary.d.ts +13 -0
- package/dist/src/tui/components/compaction-summary.js +46 -0
- package/dist/src/tui/components/compaction-summary.js.map +1 -0
- package/dist/src/tui/components/custom-editor.d.ts +1 -0
- package/dist/src/tui/components/custom-editor.js +2 -0
- package/dist/src/tui/components/custom-editor.js.map +1 -1
- package/dist/src/tui/components/custom-message.d.ts +23 -0
- package/dist/src/tui/components/custom-message.js +65 -0
- package/dist/src/tui/components/custom-message.js.map +1 -0
- package/dist/src/tui/components/extension-dialog.d.ts +42 -0
- package/dist/src/tui/components/extension-dialog.js +127 -0
- package/dist/src/tui/components/extension-dialog.js.map +1 -0
- package/dist/src/tui/components/scoped-models-selector.d.ts +7 -2
- package/dist/src/tui/components/scoped-models-selector.js +89 -16
- package/dist/src/tui/components/scoped-models-selector.js.map +1 -1
- package/dist/src/tui/components/searchable-select-list.d.ts +30 -3
- package/dist/src/tui/components/searchable-select-list.js +82 -10
- package/dist/src/tui/components/searchable-select-list.js.map +1 -1
- package/dist/src/tui/components/session-selector.d.ts +18 -4
- package/dist/src/tui/components/session-selector.js +207 -40
- package/dist/src/tui/components/session-selector.js.map +1 -1
- package/dist/src/tui/components/settings-selector.d.ts +6 -2
- package/dist/src/tui/components/settings-selector.js +126 -7
- package/dist/src/tui/components/settings-selector.js.map +1 -1
- package/dist/src/tui/components/thinking-selector.d.ts +12 -0
- package/dist/src/tui/components/thinking-selector.js +48 -0
- package/dist/src/tui/components/thinking-selector.js.map +1 -0
- package/dist/src/tui/components/tool-execution.d.ts +57 -3
- package/dist/src/tui/components/tool-execution.js +378 -28
- package/dist/src/tui/components/tool-execution.js.map +1 -1
- package/dist/src/tui/components/tui-bottom-bar.d.ts +9 -1
- package/dist/src/tui/components/tui-bottom-bar.js +56 -11
- package/dist/src/tui/components/tui-bottom-bar.js.map +1 -1
- package/dist/src/tui/components/tui-header.d.ts +9 -2
- package/dist/src/tui/components/tui-header.js +25 -5
- package/dist/src/tui/components/tui-header.js.map +1 -1
- package/dist/src/tui/components/user-message.d.ts +4 -2
- package/dist/src/tui/components/user-message.js +42 -9
- package/dist/src/tui/components/user-message.js.map +1 -1
- package/dist/src/tui/components/visual-truncate.d.ts +11 -0
- package/dist/src/tui/components/visual-truncate.js +27 -0
- package/dist/src/tui/components/visual-truncate.js.map +1 -0
- package/dist/src/tui/extension-host/autocomplete.d.ts +43 -0
- package/dist/src/tui/extension-host/autocomplete.js +116 -0
- package/dist/src/tui/extension-host/autocomplete.js.map +1 -0
- package/dist/src/tui/extension-host/host.d.ts +31 -1
- package/dist/src/tui/extension-host/host.js +123 -6
- package/dist/src/tui/extension-host/host.js.map +1 -1
- package/dist/src/tui/extension-host/load-extensions.d.ts +6 -1
- package/dist/src/tui/extension-host/load-extensions.js +4 -3
- package/dist/src/tui/extension-host/load-extensions.js.map +1 -1
- package/dist/src/tui/extension-host/runtime-context.d.ts +21 -0
- package/dist/src/tui/extension-host/runtime-context.js +152 -0
- package/dist/src/tui/extension-host/runtime-context.js.map +1 -0
- package/dist/src/tui/extension-host/runtime.d.ts +52 -4
- package/dist/src/tui/extension-host/runtime.js +547 -85
- package/dist/src/tui/extension-host/runtime.js.map +1 -1
- package/dist/src/tui/extension-host/surface.d.ts +20 -0
- package/dist/src/tui/extension-host/surface.js +30 -6
- package/dist/src/tui/extension-host/surface.js.map +1 -1
- package/dist/src/tui/extension-host/tool-renderers.d.ts +6 -3
- package/dist/src/tui/extension-host/tool-renderers.js +43 -5
- package/dist/src/tui/extension-host/tool-renderers.js.map +1 -1
- package/dist/src/tui/format-tui-hotkeys.d.ts +12 -2
- package/dist/src/tui/format-tui-hotkeys.js +22 -5
- package/dist/src/tui/format-tui-hotkeys.js.map +1 -1
- package/dist/src/tui/tui-agent-events.d.ts +8 -6
- package/dist/src/tui/tui-agent-events.js +200 -59
- package/dist/src/tui/tui-agent-events.js.map +1 -1
- package/dist/src/tui/tui-backend.d.ts +169 -3
- package/dist/src/tui/tui-command-formatters.d.ts +76 -0
- package/dist/src/tui/tui-command-formatters.js +594 -0
- package/dist/src/tui/tui-command-formatters.js.map +1 -0
- package/dist/src/tui/tui-commands.d.ts +57 -7
- package/dist/src/tui/tui-commands.js +639 -43
- package/dist/src/tui/tui-commands.js.map +1 -1
- package/dist/src/tui/tui-context-usage.d.ts +1 -1
- package/dist/src/tui/tui-context-usage.js +9 -1
- package/dist/src/tui/tui-context-usage.js.map +1 -1
- package/dist/src/tui/tui-extension-user-message.d.ts +8 -0
- package/dist/src/tui/tui-extension-user-message.js +32 -0
- package/dist/src/tui/tui-extension-user-message.js.map +1 -0
- package/dist/src/tui/tui-follow-up-queue.d.ts +9 -0
- package/dist/src/tui/tui-follow-up-queue.js +18 -0
- package/dist/src/tui/tui-follow-up-queue.js.map +1 -0
- package/dist/src/tui/tui-local-shell.d.ts +11 -1
- package/dist/src/tui/tui-local-shell.js +50 -8
- package/dist/src/tui/tui-local-shell.js.map +1 -1
- package/dist/src/tui/tui-model-picker.d.ts +26 -0
- package/dist/src/tui/tui-model-picker.js +152 -0
- package/dist/src/tui/tui-model-picker.js.map +1 -0
- package/dist/src/tui/tui-oauth-login.d.ts +16 -0
- package/dist/src/tui/tui-oauth-login.js +189 -0
- package/dist/src/tui/tui-oauth-login.js.map +1 -0
- package/dist/src/tui/tui-overlays.d.ts +3 -3
- package/dist/src/tui/tui-overlays.js +6 -7
- package/dist/src/tui/tui-overlays.js.map +1 -1
- package/dist/src/tui/tui-picker-overlay.d.ts +27 -32
- package/dist/src/tui/tui-picker-overlay.js +340 -30
- package/dist/src/tui/tui-picker-overlay.js.map +1 -1
- package/dist/src/tui/tui-picker-services.d.ts +41 -0
- package/dist/src/tui/tui-picker-services.js +1 -0
- package/dist/src/tui/tui-run-state.d.ts +11 -0
- package/dist/src/tui/tui-run-state.js +114 -0
- package/dist/src/tui/tui-run-state.js.map +1 -0
- package/dist/src/tui/tui-runtime-hints.d.ts +4 -0
- package/dist/src/tui/tui-runtime-hints.js +18 -0
- package/dist/src/tui/tui-runtime-hints.js.map +1 -0
- package/dist/src/tui/tui-scoped-models.d.ts +1 -1
- package/dist/src/tui/tui-scoped-models.js +2 -2
- package/dist/src/tui/tui-scoped-models.js.map +1 -1
- package/dist/src/tui/tui-session-actions.d.ts +5 -3
- package/dist/src/tui/tui-session-actions.js +21 -9
- package/dist/src/tui/tui-session-actions.js.map +1 -1
- package/dist/src/tui/tui-session-format.d.ts +4 -1
- package/dist/src/tui/tui-session-format.js +17 -3
- package/dist/src/tui/tui-session-format.js.map +1 -1
- package/dist/src/tui/tui-session-snapshot.d.ts +82 -0
- package/dist/src/tui/tui-session-snapshot.js +184 -0
- package/dist/src/tui/tui-session-snapshot.js.map +1 -0
- package/dist/src/tui/tui-session-stats.d.ts +3 -0
- package/dist/src/tui/tui-session-stats.js +59 -0
- package/dist/src/tui/tui-session-stats.js.map +1 -0
- package/dist/src/tui/tui-settings.d.ts +21 -0
- package/dist/src/tui/tui-settings.js +28 -1
- package/dist/src/tui/tui-settings.js.map +1 -1
- package/dist/src/tui/tui-skills-autocomplete.js +1 -1
- package/dist/src/tui/tui-skills-autocomplete.js.map +1 -1
- package/dist/src/tui/tui-startup-resources.d.ts +3 -0
- package/dist/src/tui/tui-startup-resources.js +39 -0
- package/dist/src/tui/tui-startup-resources.js.map +1 -0
- package/dist/src/tui/tui-startup-text.d.ts +10 -0
- package/dist/src/tui/tui-startup-text.js +58 -0
- package/dist/src/tui/tui-startup-text.js.map +1 -0
- package/dist/src/tui/tui-stdio-filter.d.ts +1 -0
- package/dist/src/tui/tui-stdio-filter.js +11 -7
- package/dist/src/tui/tui-stdio-filter.js.map +1 -1
- package/dist/src/tui/tui-submit.d.ts +2 -0
- package/dist/src/tui/tui-submit.js +2 -1
- package/dist/src/tui/tui-submit.js.map +1 -1
- package/dist/src/tui/tui-tool-diff.js +61 -7
- package/dist/src/tui/tui-tool-diff.js.map +1 -1
- package/dist/src/tui/tui-tool-result.d.ts +17 -0
- package/dist/src/tui/tui-tool-result.js +74 -0
- package/dist/src/tui/tui-tool-result.js.map +1 -0
- package/dist/src/tui/tui-transcript-tree-picker.d.ts +57 -0
- package/dist/src/tui/tui-transcript-tree-picker.js +604 -0
- package/dist/src/tui/tui-transcript-tree-picker.js.map +1 -0
- package/dist/src/tui/tui-transcript-tree.d.ts +7 -0
- package/dist/src/tui/tui-transcript-tree.js +316 -0
- package/dist/src/tui/tui-transcript-tree.js.map +1 -0
- package/dist/src/tui/tui-types.d.ts +25 -34
- package/dist/src/tui/tui-types.js +12 -0
- package/dist/src/tui/tui-types.js.map +1 -1
- package/dist/src/tui/tui.js +1288 -112
- package/dist/src/tui/tui.js.map +1 -1
- package/dist/src/tui/xopc-tui-keybindings.d.ts +127 -2
- package/dist/src/tui/xopc-tui-keybindings.js +127 -2
- package/dist/src/tui/xopc-tui-keybindings.js.map +1 -1
- package/dist/src/workflows/domain/definition-utils.d.ts +2 -1
- package/dist/src/workflows/domain/definition-utils.js +18 -8
- package/dist/src/workflows/domain/definition-utils.js.map +1 -1
- package/dist/src/workflows/domain/definition.d.ts +25 -0
- package/dist/src/workflows/domain/event.d.ts +1 -0
- package/dist/src/workflows/domain/result.d.ts +15 -0
- package/dist/src/workflows/domain/run.d.ts +2 -0
- package/dist/src/workflows/domain/run.js.map +1 -1
- package/dist/src/workflows/engine/projector.js +4 -0
- package/dist/src/workflows/engine/projector.js.map +1 -1
- package/dist/src/workflows/engine/workflow-engine.d.ts +37 -1
- package/dist/src/workflows/engine/workflow-engine.js +75 -11
- package/dist/src/workflows/engine/workflow-engine.js.map +1 -1
- package/dist/src/workflows/index.d.ts +1 -0
- package/dist/src/workflows/index.js +4 -1
- package/dist/src/workflows/registry/catalog-workflow-definition-registry.d.ts +9 -0
- package/dist/src/workflows/registry/catalog-workflow-definition-registry.js +40 -0
- package/dist/src/workflows/registry/catalog-workflow-definition-registry.js.map +1 -0
- package/dist/src/workflows/registry/index.d.ts +2 -0
- package/dist/src/workflows/registry/index.js +2 -0
- package/dist/src/workflows/registry/workflow-definition-registry.d.ts +15 -0
- package/dist/src/workflows/registry/workflow-definition-registry.js +1 -0
- package/dist/src/workflows/runtime/index.d.ts +2 -0
- package/dist/src/workflows/runtime/index.js +2 -1
- package/dist/src/workflows/runtime/script-workflow-runtime.d.ts +5 -0
- package/dist/src/workflows/runtime/script-workflow-runtime.js +15 -0
- package/dist/src/workflows/runtime/script-workflow-runtime.js.map +1 -0
- package/dist/src/workflows/runtime/workflow-runtime-port.d.ts +16 -0
- package/dist/src/workflows/runtime/workflow-runtime-port.js +1 -0
- package/dist/src/workflows/service/run-view-to-snapshot.js +3 -0
- package/dist/src/workflows/service/run-view-to-snapshot.js.map +1 -1
- package/dist/src/workflows/service/workflow-run-service.d.ts +3 -0
- package/dist/src/workflows/service/workflow-run-service.js +10 -15
- package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
- package/dist/src/workflows/service/workflow-session-bridge.d.ts +1 -1
- package/dist/src/workflows/service/workflow-session-bridge.js +4 -1
- package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
- package/package.json +21 -15
- package/skills/creative/frontend-design/SKILL.md +1 -1
- package/skills/creative/theme-factory/SKILL.md +1 -1
- package/skills/documents/xlsx/SKILL.md +1 -1
- package/skills/engineering/diagnose/SKILL.md +2 -2
- package/skills/engineering/tdd/SKILL.md +1 -1
- package/skills/tools/github/SKILL.md +6 -1
- package/skills/tools/webapp-testing/SKILL.md +4 -1
- package/dist/extensions/telegram/src/adapters/config-surface.d.ts +0 -2
- package/dist/extensions/telegram/src/adapters/config-surface.js +0 -26
- package/dist/extensions/telegram/src/adapters/config-surface.js.map +0 -1
- package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js +0 -158
- package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js.map +0 -1
- package/dist/gateway/static/root/assets/agents-BwXkia_W.js +0 -222
- package/dist/gateway/static/root/assets/channels-settings-tlOTdaXw.js +0 -1
- package/dist/gateway/static/root/assets/channels-status-swr-D4XjqwqC.js +0 -8
- package/dist/gateway/static/root/assets/cron-api-DcmfGuj0.js +0 -1
- package/dist/gateway/static/root/assets/cron-page-CijJ4G6F.js +0 -1
- package/dist/gateway/static/root/assets/extension-settings-page-CyJk_G64.js +0 -1
- package/dist/gateway/static/root/assets/field-primitives-C4GpxsDo.js +0 -1
- package/dist/gateway/static/root/assets/heartbeat-config-api-CLD0Gpi3.js +0 -1
- package/dist/gateway/static/root/assets/index-0HmunJW9.js +0 -4845
- package/dist/gateway/static/root/assets/index-Bk75Phrd.css +0 -1
- package/dist/gateway/static/root/assets/notes-page-BBnTh0uI.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-B0riYK7j.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-DiP_WHu_.js +0 -2
- package/dist/gateway/static/root/assets/settings-page-1ZPhcCZ9.js +0 -3
- package/dist/gateway/static/root/assets/skills-page-BQ1hllKD.js +0 -2
- package/dist/gateway/static/root/assets/url-F3_D_6zZ.js +0 -3
- package/dist/gateway/static/root/assets/utils-CPr3FBh2.js +0 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-BkbDl6dH.js +0 -1
- package/dist/gateway/static/root/assets/workflows-page-D059ysoF.js +0 -27
- package/dist/src/agent/embedded/map-stream-events.d.ts +0 -9
- package/dist/src/agent/embedded/map-stream-events.js +0 -63
- package/dist/src/agent/embedded/map-stream-events.js.map +0 -1
- package/dist/src/channels/dock.js.map +0 -1
- package/dist/src/channels/plugins/bundled.d.ts +0 -11
- package/dist/src/channels/plugins/bundled.js +0 -10
- package/dist/src/channels/plugins/bundled.js.map +0 -1
- package/dist/src/channels/registry.d.ts +0 -25
- package/dist/src/channels/registry.js +0 -82
- package/dist/src/channels/registry.js.map +0 -1
- package/dist/src/config/localized-text.d.ts +0 -6
- package/dist/src/config/localized-text.js +0 -42
- package/dist/src/config/localized-text.js.map +0 -1
- package/dist/src/generated/bundled-channel-plugins.d.ts +0 -10
- package/dist/src/generated/bundled-channel-plugins.js +0 -16
- package/dist/src/generated/bundled-channel-plugins.js.map +0 -1
- package/dist/src/tui/stream-assembler.d.ts +0 -22
- package/dist/src/tui/stream-assembler.js +0 -63
- package/dist/src/tui/stream-assembler.js.map +0 -1
- package/skills/browser/SKILL-zh.md +0 -188
- package/skills/business/company-values/SKILL-zh.md +0 -80
- package/skills/business/company-values/SKILL.md +0 -80
- package/skills/business/find-community/SKILL-zh.md +0 -50
- package/skills/business/find-community/SKILL.md +0 -50
- package/skills/business/first-customers/SKILL-zh.md +0 -76
- package/skills/business/first-customers/SKILL.md +0 -76
- package/skills/business/grow-sustainably/SKILL-zh.md +0 -92
- package/skills/business/grow-sustainably/SKILL.md +0 -92
- package/skills/business/marketing-plan/SKILL-zh.md +0 -100
- package/skills/business/marketing-plan/SKILL.md +0 -100
- package/skills/business/minimalist-review/SKILL-zh.md +0 -82
- package/skills/business/minimalist-review/SKILL.md +0 -82
- package/skills/business/mvp/SKILL-zh.md +0 -81
- package/skills/business/mvp/SKILL.md +0 -81
- package/skills/business/pricing/SKILL-zh.md +0 -64
- package/skills/business/pricing/SKILL.md +0 -64
- package/skills/business/processize/SKILL-zh.md +0 -91
- package/skills/business/processize/SKILL.md +0 -91
- package/skills/business/validate-idea/SKILL-zh.md +0 -68
- package/skills/business/validate-idea/SKILL.md +0 -68
- package/skills/creative/algorithmic-art/LICENSE.txt +0 -202
- package/skills/creative/algorithmic-art/SKILL-zh.md +0 -405
- package/skills/creative/algorithmic-art/SKILL.md +0 -405
- package/skills/creative/algorithmic-art/templates/generator_template.js +0 -223
- package/skills/creative/algorithmic-art/templates/viewer.html +0 -599
- package/skills/creative/frontend-design/SKILL-zh.md +0 -42
- package/skills/creative/theme-factory/SKILL-zh.md +0 -59
- package/skills/creative/web-artifacts-builder/LICENSE.txt +0 -202
- package/skills/creative/web-artifacts-builder/SKILL-zh.md +0 -74
- package/skills/creative/web-artifacts-builder/SKILL.md +0 -74
- package/skills/creative/web-artifacts-builder/scripts/bundle-artifact.sh +0 -54
- package/skills/creative/web-artifacts-builder/scripts/init-artifact.sh +0 -322
- package/skills/creative/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
- package/skills/documents/doc-coauthoring/SKILL-zh.md +0 -375
- package/skills/documents/doc-coauthoring/SKILL.md +0 -375
- package/skills/documents/docx/LICENSE.txt +0 -30
- package/skills/documents/docx/SKILL-zh.md +0 -590
- package/skills/documents/docx/SKILL.md +0 -590
- package/skills/documents/docx/scripts/__init__.py +0 -1
- package/skills/documents/docx/scripts/accept_changes.py +0 -135
- package/skills/documents/docx/scripts/comment.py +0 -318
- package/skills/documents/docx/scripts/office/helpers/__init__.py +0 -0
- package/skills/documents/docx/scripts/office/helpers/merge_runs.py +0 -199
- package/skills/documents/docx/scripts/office/helpers/simplify_redlines.py +0 -197
- package/skills/documents/docx/scripts/office/pack.py +0 -159
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
- package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
- package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
- package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
- package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
- package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
- package/skills/documents/docx/scripts/office/schemas/mce/mc.xsd +0 -75
- package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2010.xsd +0 -560
- package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2012.xsd +0 -67
- package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2018.xsd +0 -14
- package/skills/documents/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -20
- package/skills/documents/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -13
- package/skills/documents/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
- package/skills/documents/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -8
- package/skills/documents/docx/scripts/office/soffice.py +0 -183
- package/skills/documents/docx/scripts/office/unpack.py +0 -132
- package/skills/documents/docx/scripts/office/validate.py +0 -111
- package/skills/documents/docx/scripts/office/validators/__init__.py +0 -15
- package/skills/documents/docx/scripts/office/validators/base.py +0 -847
- package/skills/documents/docx/scripts/office/validators/docx.py +0 -446
- package/skills/documents/docx/scripts/office/validators/pptx.py +0 -275
- package/skills/documents/docx/scripts/office/validators/redlining.py +0 -247
- package/skills/documents/docx/scripts/templates/comments.xml +0 -3
- package/skills/documents/docx/scripts/templates/commentsExtended.xml +0 -3
- package/skills/documents/docx/scripts/templates/commentsExtensible.xml +0 -3
- package/skills/documents/docx/scripts/templates/commentsIds.xml +0 -3
- package/skills/documents/docx/scripts/templates/people.xml +0 -3
- package/skills/documents/pdf/LICENSE.txt +0 -30
- package/skills/documents/pdf/SKILL-zh.md +0 -314
- package/skills/documents/pdf/SKILL.md +0 -314
- package/skills/documents/pdf/forms.md +0 -294
- package/skills/documents/pdf/reference.md +0 -612
- package/skills/documents/pdf/scripts/check_bounding_boxes.py +0 -65
- package/skills/documents/pdf/scripts/check_fillable_fields.py +0 -11
- package/skills/documents/pdf/scripts/convert_pdf_to_images.py +0 -33
- package/skills/documents/pdf/scripts/create_validation_image.py +0 -37
- package/skills/documents/pdf/scripts/extract_form_field_info.py +0 -122
- package/skills/documents/pdf/scripts/extract_form_structure.py +0 -115
- package/skills/documents/pdf/scripts/fill_fillable_fields.py +0 -98
- package/skills/documents/pdf/scripts/fill_pdf_form_with_annotations.py +0 -107
- package/skills/documents/pptx/LICENSE.txt +0 -30
- package/skills/documents/pptx/SKILL-zh.md +0 -232
- package/skills/documents/pptx/SKILL.md +0 -232
- package/skills/documents/pptx/editing.md +0 -205
- package/skills/documents/pptx/pptxgenjs.md +0 -420
- package/skills/documents/pptx/scripts/__init__.py +0 -0
- package/skills/documents/pptx/scripts/add_slide.py +0 -195
- package/skills/documents/pptx/scripts/clean.py +0 -286
- package/skills/documents/pptx/scripts/office/helpers/__init__.py +0 -0
- package/skills/documents/pptx/scripts/office/helpers/merge_runs.py +0 -199
- package/skills/documents/pptx/scripts/office/helpers/simplify_redlines.py +0 -197
- package/skills/documents/pptx/scripts/office/pack.py +0 -159
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
- package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
- package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
- package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
- package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
- package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
- package/skills/documents/pptx/scripts/office/schemas/mce/mc.xsd +0 -75
- package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2010.xsd +0 -560
- package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2012.xsd +0 -67
- package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2018.xsd +0 -14
- package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -20
- package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -13
- package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
- package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -8
- package/skills/documents/pptx/scripts/office/soffice.py +0 -183
- package/skills/documents/pptx/scripts/office/unpack.py +0 -132
- package/skills/documents/pptx/scripts/office/validate.py +0 -111
- package/skills/documents/pptx/scripts/office/validators/__init__.py +0 -15
- package/skills/documents/pptx/scripts/office/validators/base.py +0 -847
- package/skills/documents/pptx/scripts/office/validators/docx.py +0 -446
- package/skills/documents/pptx/scripts/office/validators/pptx.py +0 -275
- package/skills/documents/pptx/scripts/office/validators/redlining.py +0 -247
- package/skills/documents/pptx/scripts/thumbnail.py +0 -289
- package/skills/documents/xlsx/SKILL-zh.md +0 -292
- package/skills/engineering/diagnose/SKILL-zh.md +0 -117
- package/skills/engineering/grill-with-docs/ADR-FORMAT.md +0 -47
- package/skills/engineering/grill-with-docs/CONTEXT-FORMAT.md +0 -77
- package/skills/engineering/grill-with-docs/SKILL-zh.md +0 -88
- package/skills/engineering/grill-with-docs/SKILL.md +0 -88
- package/skills/engineering/improve-codebase-architecture/DEEPENING.md +0 -37
- package/skills/engineering/improve-codebase-architecture/INTERFACE-DESIGN.md +0 -44
- package/skills/engineering/improve-codebase-architecture/LANGUAGE.md +0 -53
- package/skills/engineering/improve-codebase-architecture/SKILL-zh.md +0 -71
- package/skills/engineering/improve-codebase-architecture/SKILL.md +0 -71
- package/skills/engineering/tdd/SKILL-zh.md +0 -109
- package/skills/engineering/to-issues/SKILL-zh.md +0 -81
- package/skills/engineering/to-issues/SKILL.md +0 -81
- package/skills/engineering/to-prd/SKILL-zh.md +0 -76
- package/skills/engineering/to-prd/SKILL.md +0 -74
- package/skills/engineering/zoom-out/SKILL-zh.md +0 -7
- package/skills/engineering/zoom-out/SKILL.md +0 -7
- package/skills/tools/find-skills/SKILL-zh.md +0 -440
- package/skills/tools/github/SKILL-zh.md +0 -48
- package/skills/tools/internal-comms/LICENSE.txt +0 -202
- package/skills/tools/internal-comms/SKILL-zh.md +0 -32
- package/skills/tools/internal-comms/SKILL.md +0 -32
- package/skills/tools/internal-comms/examples/3p-updates.md +0 -47
- package/skills/tools/internal-comms/examples/company-newsletter.md +0 -65
- package/skills/tools/internal-comms/examples/faq-answers.md +0 -30
- package/skills/tools/internal-comms/examples/general-comms.md +0 -16
- package/skills/tools/skill-creator/LICENSE.txt +0 -202
- package/skills/tools/skill-creator/SKILL-zh.md +0 -483
- package/skills/tools/skill-creator/SKILL.md +0 -485
- package/skills/tools/skill-creator/agents/analyzer.md +0 -274
- package/skills/tools/skill-creator/agents/comparator.md +0 -202
- package/skills/tools/skill-creator/agents/grader.md +0 -223
- package/skills/tools/skill-creator/assets/eval_review.html +0 -146
- package/skills/tools/skill-creator/eval-viewer/generate_review.py +0 -471
- package/skills/tools/skill-creator/eval-viewer/viewer.html +0 -1325
- package/skills/tools/skill-creator/references/schemas.md +0 -430
- package/skills/tools/skill-creator/scripts/__init__.py +0 -0
- package/skills/tools/skill-creator/scripts/aggregate_benchmark.py +0 -401
- package/skills/tools/skill-creator/scripts/generate_report.py +0 -326
- package/skills/tools/skill-creator/scripts/improve_description.py +0 -247
- package/skills/tools/skill-creator/scripts/package_skill.py +0 -136
- package/skills/tools/skill-creator/scripts/quick_validate.py +0 -103
- package/skills/tools/skill-creator/scripts/run_eval.py +0 -310
- package/skills/tools/skill-creator/scripts/run_loop.py +0 -328
- package/skills/tools/skill-creator/scripts/utils.py +0 -47
- package/skills/tools/summarize/SKILL-zh.md +0 -47
- package/skills/tools/weather/SKILL-zh.md +0 -46
- package/skills/tools/weather/SKILL.md +0 -46
- package/skills/tools/webapp-testing/SKILL-zh.md +0 -96
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tui-commands.js","names":[],"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 { ChatLog } from './components/chat-log.js';\nimport { formatXopcTuiHotkeys } from './format-tui-hotkeys.js';\nimport { getTuiKeybindingsPath } from './tui-keybindings-file.js';\nimport type { StreamAssembler } from './stream-assembler.js';\nimport type { TuiState } from './tui-types.js';\n\nimport { rewriteUnknownSlashAsWorkflow } from './tui-workflow-slash.js';\n\ninterface SlashCommandDef {\n name: string;\n description: string;\n}\n\nexport type TuiExtensionSlashCommandEntry = SlashCommandDef & {\n handler: (args: string) => void | Promise<void>;\n};\n\nexport function getSlashCommands(_isLocal: boolean): SlashCommandDef[] {\n return [\n { name: 'help', description: 'Show available commands' },\n { name: 'abort', description: 'Abort active run (or press Escape)' },\n { name: 'tools', description: 'Toggle tool output expanded/collapsed (or Ctrl+O)' },\n { name: 'thinking', description: 'Toggle thinking display (or Ctrl+T)' },\n { name: 'exit', description: 'Exit the TUI' },\n { name: 'models', description: 'List available models' },\n { name: 'switch', description: 'Switch model — copy `provider/model` from /models' },\n { name: 'usage', description: 'Show token usage statistics' },\n { name: 'new', description: 'Start a new isolated TUI session (tui-{uuid})' },\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 Ctrl+Shift+P)' },\n { name: 'scoped-models', description: 'Choose models for Ctrl+P 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: 'settings', description: 'Open TUI settings overlay' },\n { name: 'reload-keybindings', description: 'Reload ~/.xopc/keybindings.json' },\n { name: 'start', description: 'Show welcome message' },\n { name: 'hotkeys', description: 'Show resolved keyboard shortcuts (pi-style)' },\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\nexport function formatTuiHelpText(isLocal: boolean): string {\n const commands = getSlashCommands(isLocal);\n const lines = ['Available commands:'];\n for (const c of commands) {\n lines.push(` /${c.name} — ${c.description}`);\n }\n lines.push('', 'Keyboard shortcuts (defaults align with pi coding-agent where noted):');\n lines.push(' Escape — Abort active run');\n lines.push(' Shift+Tab — Cycle /think level');\n lines.push(' Ctrl+P / Shift+Ctrl+P — Next / previous model (/switch)');\n lines.push(' Ctrl+L — Model picker');\n lines.push(' Ctrl+Shift+P — Session picker (rename/delete)');\n lines.push(' /scoped-models — Limit Ctrl+P model cycle set');\n lines.push(' Ctrl+O — Toggle tool output');\n lines.push(' Ctrl+T — Toggle thinking block display');\n lines.push(' Ctrl+G — Edit draft in $EDITOR');\n lines.push(' Ctrl+Z — Suspend to shell (Unix)');\n lines.push(' Alt+Enter — Queue follow-up while busy (sends when this reply finishes)');\n lines.push(' Alt+Up — Restore queued follow-up messages to editor');\n lines.push(' Enter (while busy) — Steer: inject at next tool boundary');\n lines.push(' Ctrl+V (mac/Linux) / Alt+V (Win) — Paste image from clipboard');\n lines.push(' /settings — Theme, thinking display, terminal progress, …');\n lines.push(' ~/.xopc/keybindings.json — Custom shortcuts (use /reload-keybindings)');\n lines.push(' Ctrl+C — Clear input; repeat within ~0.5s to exit when empty');\n lines.push(' Ctrl+D — 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 type CommandHandlerDeps = {\n state: TuiState;\n chatLog: ChatLog;\n tui: TUI;\n assembler: StreamAssembler;\n isLocalMode: boolean;\n abortActive: () => Promise<void>;\n sendMessage: (text: string) => void;\n requestExit: () => void;\n updateFooter: () => void;\n keybindings: KeybindingsManager;\n uiOverlays?: {\n openSessionPicker: () => void;\n openScopedModels: () => void;\n openSettings: () => void;\n reloadKeybindings: () => void;\n };\n runCompaction?: () => void | Promise<void>;\n extensionSlashCommands?: TuiExtensionSlashCommandEntry[];\n currentAgentId?: string;\n setSession?: (rawKey: string) => Promise<void>;\n resetSession?: () => Promise<void>;\n};\n\nexport function createTuiCommandHandler(deps: CommandHandlerDeps): (input: string) => void {\n const {\n state,\n chatLog,\n tui,\n assembler,\n isLocalMode,\n abortActive,\n sendMessage,\n requestExit,\n updateFooter,\n keybindings,\n uiOverlays,\n extensionSlashCommands = [],\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 assembler.clear();\n chatLog.clearAll();\n state.messageFollowUpQueue.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 const extensionCmd = extensionSlashCommands.find((c) => c.name === normalizedCommand);\n if (extensionCmd) {\n void Promise.resolve(extensionCmd.handler(commandArgs)).then(() => {\n tui.requestRender();\n });\n return;\n }\n\n switch (normalizedCommand) {\n case 'help':\n chatLog.addSystem(formatTuiHelpText(isLocalMode));\n tui.requestRender();\n return;\n case 'hotkeys':\n case 'keys':\n chatLog.addSystem(formatXopcTuiHotkeys(keybindings));\n tui.requestRender();\n return;\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 '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.addSystem(`Thinking display: ${state.showThinking ? 'on' : 'off'}`);\n updateFooter();\n tui.requestRender();\n return;\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 'settings':\n uiOverlays?.openSettings();\n return;\n case 'reload-keybindings':\n case 'reload-keybind':\n uiOverlays?.reloadKeybindings();\n chatLog.addSystem(`Keybindings reloaded from ${getTuiKeybindingsPath()}`);\n tui.requestRender();\n return;\n case 'compact':\n void deps.runCompaction?.();\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 assembler.clear();\n chatLog.clearAll();\n state.messageFollowUpQueue.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 'reset':\n case 'restart':\n void runReset();\n return;\n case 'clear':\n void runReset();\n return;\n default:\n break;\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\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} (${agent.source})${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,3 +1,3 @@
|
|
|
1
1
|
/** Compute context window usage percent (0–100), rounded. */
|
|
2
2
|
export declare function computeContextUsagePercent(estimatedTokens: number | null | undefined, contextWindow: number | null | undefined): number | null;
|
|
3
|
-
export declare function formatContextUsageLabel(percent: number | null): string | null;
|
|
3
|
+
export declare function formatContextUsageLabel(percent: number | null, contextWindow?: number | null): string | null;
|
|
@@ -4,7 +4,15 @@ function computeContextUsagePercent(estimatedTokens, contextWindow) {
|
|
|
4
4
|
if (estimatedTokens == null || contextWindow == null || contextWindow <= 0) return null;
|
|
5
5
|
return Math.min(100, Math.round(estimatedTokens / contextWindow * 100));
|
|
6
6
|
}
|
|
7
|
-
function
|
|
7
|
+
function formatTokens(count) {
|
|
8
|
+
if (count < 1e3) return count.toString();
|
|
9
|
+
if (count < 1e4) return `${(count / 1e3).toFixed(1)}k`;
|
|
10
|
+
if (count < 1e6) return `${Math.round(count / 1e3)}k`;
|
|
11
|
+
if (count < 1e7) return `${(count / 1e6).toFixed(1)}M`;
|
|
12
|
+
return `${Math.round(count / 1e6)}M`;
|
|
13
|
+
}
|
|
14
|
+
function formatContextUsageLabel(percent, contextWindow) {
|
|
15
|
+
if (contextWindow != null && contextWindow > 0) return `${percent == null ? "?" : `${percent}%`}/${formatTokens(contextWindow)} ctx`;
|
|
8
16
|
if (percent == null) return null;
|
|
9
17
|
return `${percent}% ctx`;
|
|
10
18
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tui-context-usage.js","names":[],"sources":["../../../src/tui/tui-context-usage.ts"],"sourcesContent":["/** Compute context window usage percent (0–100), rounded. */\nexport function computeContextUsagePercent(\n estimatedTokens: number | null | undefined,\n contextWindow: number | null | undefined,\n): number | null {\n if (estimatedTokens == null || contextWindow == null || contextWindow <= 0) {\n return null;\n }\n return Math.min(100, Math.round((estimatedTokens / contextWindow) * 100));\n}\n\nexport function formatContextUsageLabel(percent: number | null): string | null {\n if (percent == null) return null;\n return `${percent}% ctx`;\n}\n"],"mappings":";;AACA,SAAgB,2BACd,iBACA,eACe;AACf,KAAI,mBAAmB,QAAQ,iBAAiB,QAAQ,iBAAiB,EACvE,QAAO;AAET,QAAO,KAAK,IAAI,KAAK,KAAK,MAAO,kBAAkB,gBAAiB,IAAI,CAAC;;AAG3E,SAAgB,
|
|
1
|
+
{"version":3,"file":"tui-context-usage.js","names":[],"sources":["../../../src/tui/tui-context-usage.ts"],"sourcesContent":["/** Compute context window usage percent (0–100), rounded. */\nexport function computeContextUsagePercent(\n estimatedTokens: number | null | undefined,\n contextWindow: number | null | undefined,\n): number | null {\n if (estimatedTokens == null || contextWindow == null || contextWindow <= 0) {\n return null;\n }\n return Math.min(100, Math.round((estimatedTokens / contextWindow) * 100));\n}\n\nfunction formatTokens(count: number): string {\n if (count < 1000) return count.toString();\n if (count < 10000) return `${(count / 1000).toFixed(1)}k`;\n if (count < 1_000_000) return `${Math.round(count / 1000)}k`;\n if (count < 10_000_000) return `${(count / 1_000_000).toFixed(1)}M`;\n return `${Math.round(count / 1_000_000)}M`;\n}\n\nexport function formatContextUsageLabel(\n percent: number | null,\n contextWindow?: number | null,\n): string | null {\n if (contextWindow != null && contextWindow > 0) {\n const percentLabel = percent == null ? '?' : `${percent}%`;\n return `${percentLabel}/${formatTokens(contextWindow)} ctx`;\n }\n if (percent == null) return null;\n return `${percent}% ctx`;\n}\n"],"mappings":";;AACA,SAAgB,2BACd,iBACA,eACe;AACf,KAAI,mBAAmB,QAAQ,iBAAiB,QAAQ,iBAAiB,EACvE,QAAO;AAET,QAAO,KAAK,IAAI,KAAK,KAAK,MAAO,kBAAkB,gBAAiB,IAAI,CAAC;;AAG3E,SAAS,aAAa,OAAuB;AAC3C,KAAI,QAAQ,IAAM,QAAO,MAAM,UAAU;AACzC,KAAI,QAAQ,IAAO,QAAO,IAAI,QAAQ,KAAM,QAAQ,EAAE,CAAC;AACvD,KAAI,QAAQ,IAAW,QAAO,GAAG,KAAK,MAAM,QAAQ,IAAK,CAAC;AAC1D,KAAI,QAAQ,IAAY,QAAO,IAAI,QAAQ,KAAW,QAAQ,EAAE,CAAC;AACjE,QAAO,GAAG,KAAK,MAAM,QAAQ,IAAU,CAAC;;AAG1C,SAAgB,wBACd,SACA,eACe;AACf,KAAI,iBAAiB,QAAQ,gBAAgB,EAE3C,QAAO,GADc,WAAW,OAAO,MAAM,GAAG,QAAQ,GACjC,GAAG,aAAa,cAAc,CAAC;AAExD,KAAI,WAAW,KAAM,QAAO;AAC5B,QAAO,GAAG,QAAQ"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ExtensionUserMessageContent } from '../extensions/types/core.js';
|
|
2
|
+
export declare function extensionUserMessageContentToText(content: ExtensionUserMessageContent): string;
|
|
3
|
+
export declare function extensionCustomMessageContentToText(content: string | unknown[] | undefined): string;
|
|
4
|
+
export declare function extensionCustomMessageToTurnText(message: {
|
|
5
|
+
customType: string;
|
|
6
|
+
content?: string | unknown[];
|
|
7
|
+
details?: unknown;
|
|
8
|
+
}): string;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
//#region src/tui/tui-extension-user-message.ts
|
|
2
|
+
function extensionUserMessageContentToText(content) {
|
|
3
|
+
if (typeof content === "string") return content;
|
|
4
|
+
const parts = [];
|
|
5
|
+
for (const block of content) if (block.type === "text" && typeof block.text === "string") parts.push(block.text);
|
|
6
|
+
return parts.join("");
|
|
7
|
+
}
|
|
8
|
+
function extensionCustomMessageContentToText(content) {
|
|
9
|
+
if (typeof content === "string") return content;
|
|
10
|
+
if (!Array.isArray(content)) return "";
|
|
11
|
+
const parts = [];
|
|
12
|
+
for (const block of content) {
|
|
13
|
+
if (typeof block !== "object" || block === null) continue;
|
|
14
|
+
const record = block;
|
|
15
|
+
if (record.type === "text" && typeof record.text === "string") parts.push(record.text);
|
|
16
|
+
}
|
|
17
|
+
return parts.join("");
|
|
18
|
+
}
|
|
19
|
+
function extensionCustomMessageToTurnText(message) {
|
|
20
|
+
const type = message.customType.trim();
|
|
21
|
+
const content = extensionCustomMessageContentToText(message.content).trim();
|
|
22
|
+
const details = message.details == null ? "" : typeof message.details === "string" ? message.details.trim() : JSON.stringify(message.details, null, 2);
|
|
23
|
+
return [
|
|
24
|
+
`Extension message: ${type}`,
|
|
25
|
+
content ? `Content:\n${content}` : "",
|
|
26
|
+
details ? `Details:\n${details}` : ""
|
|
27
|
+
].filter(Boolean).join("\n\n");
|
|
28
|
+
}
|
|
29
|
+
//#endregion
|
|
30
|
+
export { extensionCustomMessageContentToText, extensionCustomMessageToTurnText, extensionUserMessageContentToText };
|
|
31
|
+
|
|
32
|
+
//# sourceMappingURL=tui-extension-user-message.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui-extension-user-message.js","names":[],"sources":["../../../src/tui/tui-extension-user-message.ts"],"sourcesContent":["import type { ExtensionUserMessageContent } from '../extensions/types/core.js';\n\nexport function extensionUserMessageContentToText(content: ExtensionUserMessageContent): string {\n if (typeof content === 'string') return content;\n const parts: string[] = [];\n for (const block of content) {\n if (block.type === 'text' && typeof block.text === 'string') {\n parts.push(block.text);\n }\n }\n return parts.join('');\n}\n\nexport function extensionCustomMessageContentToText(content: string | unknown[] | undefined): string {\n if (typeof content === 'string') return content;\n if (!Array.isArray(content)) return '';\n const parts: string[] = [];\n for (const block of content) {\n if (typeof block !== 'object' || block === null) continue;\n const record = block as { type?: unknown; text?: unknown };\n if (record.type === 'text' && typeof record.text === 'string') {\n parts.push(record.text);\n }\n }\n return parts.join('');\n}\n\nexport function extensionCustomMessageToTurnText(message: {\n customType: string;\n content?: string | unknown[];\n details?: unknown;\n}): string {\n const type = message.customType.trim();\n const content = extensionCustomMessageContentToText(message.content).trim();\n const details =\n message.details == null\n ? ''\n : typeof message.details === 'string'\n ? message.details.trim()\n : JSON.stringify(message.details, null, 2);\n const sections = [\n `Extension message: ${type}`,\n content ? `Content:\\n${content}` : '',\n details ? `Details:\\n${details}` : '',\n ].filter(Boolean);\n return sections.join('\\n\\n');\n}\n"],"mappings":";AAEA,SAAgB,kCAAkC,SAA8C;AAC9F,KAAI,OAAO,YAAY,SAAU,QAAO;CACxC,MAAM,QAAkB,EAAE;AAC1B,MAAK,MAAM,SAAS,QAClB,KAAI,MAAM,SAAS,UAAU,OAAO,MAAM,SAAS,SACjD,OAAM,KAAK,MAAM,KAAK;AAG1B,QAAO,MAAM,KAAK,GAAG;;AAGvB,SAAgB,oCAAoC,SAAiD;AACnG,KAAI,OAAO,YAAY,SAAU,QAAO;AACxC,KAAI,CAAC,MAAM,QAAQ,QAAQ,CAAE,QAAO;CACpC,MAAM,QAAkB,EAAE;AAC1B,MAAK,MAAM,SAAS,SAAS;AAC3B,MAAI,OAAO,UAAU,YAAY,UAAU,KAAM;EACjD,MAAM,SAAS;AACf,MAAI,OAAO,SAAS,UAAU,OAAO,OAAO,SAAS,SACnD,OAAM,KAAK,OAAO,KAAK;;AAG3B,QAAO,MAAM,KAAK,GAAG;;AAGvB,SAAgB,iCAAiC,SAItC;CACT,MAAM,OAAO,QAAQ,WAAW,MAAM;CACtC,MAAM,UAAU,oCAAoC,QAAQ,QAAQ,CAAC,MAAM;CAC3E,MAAM,UACJ,QAAQ,WAAW,OACf,KACA,OAAO,QAAQ,YAAY,WACzB,QAAQ,QAAQ,MAAM,GACtB,KAAK,UAAU,QAAQ,SAAS,MAAM,EAAE;AAMhD,QALiB;EACf,sBAAsB;EACtB,UAAU,aAAa,YAAY;EACnC,UAAU,aAAa,YAAY;EACpC,CAAC,OAAO,QACM,CAAC,KAAK,OAAO"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { FollowUpMode } from './tui-settings.js';
|
|
2
|
+
export declare function drainFollowUpQueue(queue: string[], mode: FollowUpMode): string | undefined;
|
|
3
|
+
export declare function restoreQueuedMessages(queues: {
|
|
4
|
+
steeringQueue: string[];
|
|
5
|
+
followUpQueue: string[];
|
|
6
|
+
}, currentText: string): {
|
|
7
|
+
text: string;
|
|
8
|
+
restoredCount: number;
|
|
9
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
//#region src/tui/tui-follow-up-queue.ts
|
|
2
|
+
function drainFollowUpQueue(queue, mode) {
|
|
3
|
+
if (mode === "all") return queue.splice(0).join("\n\n").trim() || void 0;
|
|
4
|
+
return queue.shift();
|
|
5
|
+
}
|
|
6
|
+
function restoreQueuedMessages(queues, currentText) {
|
|
7
|
+
const steering = queues.steeringQueue.splice(0);
|
|
8
|
+
const followUp = queues.followUpQueue.splice(0);
|
|
9
|
+
const restored = [...steering, ...followUp];
|
|
10
|
+
return {
|
|
11
|
+
text: [restored.join("\n\n"), currentText.trim()].filter(Boolean).join("\n\n"),
|
|
12
|
+
restoredCount: restored.length
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
//#endregion
|
|
16
|
+
export { drainFollowUpQueue, restoreQueuedMessages };
|
|
17
|
+
|
|
18
|
+
//# sourceMappingURL=tui-follow-up-queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui-follow-up-queue.js","names":[],"sources":["../../../src/tui/tui-follow-up-queue.ts"],"sourcesContent":["import type { FollowUpMode } from './tui-settings.js';\n\nexport function drainFollowUpQueue(queue: string[], mode: FollowUpMode): string | undefined {\n if (mode === 'all') {\n const combined = queue.splice(0).join('\\n\\n').trim();\n return combined || undefined;\n }\n return queue.shift();\n}\n\nexport function restoreQueuedMessages(\n queues: {\n steeringQueue: string[];\n followUpQueue: string[];\n },\n currentText: string,\n): { text: string; restoredCount: number } {\n const steering = queues.steeringQueue.splice(0);\n const followUp = queues.followUpQueue.splice(0);\n const restored = [...steering, ...followUp];\n const text = [restored.join('\\n\\n'), currentText.trim()].filter(Boolean).join('\\n\\n');\n return { text, restoredCount: restored.length };\n}\n"],"mappings":";AAEA,SAAgB,mBAAmB,OAAiB,MAAwC;AAC1F,KAAI,SAAS,MAEX,QADiB,MAAM,OAAO,EAAE,CAAC,KAAK,OAAO,CAAC,MAC/B,IAAI,KAAA;AAErB,QAAO,MAAM,OAAO;;AAGtB,SAAgB,sBACd,QAIA,aACyC;CACzC,MAAM,WAAW,OAAO,cAAc,OAAO,EAAE;CAC/C,MAAM,WAAW,OAAO,cAAc,OAAO,EAAE;CAC/C,MAAM,WAAW,CAAC,GAAG,UAAU,GAAG,SAAS;AAE3C,QAAO;EAAE,MADI,CAAC,SAAS,KAAK,OAAO,EAAE,YAAY,MAAM,CAAC,CAAC,OAAO,QAAQ,CAAC,KAAK,OACjE;EAAE,eAAe,SAAS;EAAQ"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { spawn } from 'node:child_process';
|
|
2
|
-
import type { Component, TUI } from '@earendil-works/pi-tui';
|
|
2
|
+
import type { Component, KeybindingsManager, TUI } from '@earendil-works/pi-tui';
|
|
3
3
|
import type { BashExecutionComponent } from './components/bash-execution.js';
|
|
4
4
|
type LocalShellDeps = {
|
|
5
5
|
chatLog: {
|
|
@@ -17,12 +17,22 @@ type LocalShellDeps = {
|
|
|
17
17
|
getCwd?: () => string;
|
|
18
18
|
env?: NodeJS.ProcessEnv;
|
|
19
19
|
maxOutputChars?: number;
|
|
20
|
+
keybindings?: KeybindingsManager;
|
|
20
21
|
/** Pause stdout/stderr filtering before handing the terminal to a child (`stdio: 'inherit'`). */
|
|
21
22
|
pauseStdioFilter?: () => void;
|
|
22
23
|
resumeStdioFilter?: () => void;
|
|
23
24
|
/** Wrap work while the TUI is stopped (full-screen subprocess). */
|
|
24
25
|
runWithInheritedStdio?: (work: () => Promise<void>) => Promise<void>;
|
|
26
|
+
onComplete?: (entry: {
|
|
27
|
+
command: string;
|
|
28
|
+
output?: string;
|
|
29
|
+
exitCode?: number | null;
|
|
30
|
+
signal?: string | null;
|
|
31
|
+
excludeFromContext: boolean;
|
|
32
|
+
truncated?: boolean;
|
|
33
|
+
}) => void | Promise<void>;
|
|
25
34
|
};
|
|
35
|
+
export declare function formatLocalShellConsentHint(keybindings?: KeybindingsManager): string;
|
|
26
36
|
/** `!command` runs on the local machine (gated by in-session consent). `!!command` uses inherited stdio. */
|
|
27
37
|
export declare function createLocalShellRunner(deps: LocalShellDeps): {
|
|
28
38
|
runLocalShellLine: (line: string) => Promise<void>;
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import { selectListTheme } from "./theme.js";
|
|
2
|
+
import { formatKeyIds } from "./format-tui-hotkeys.js";
|
|
2
3
|
import { spawn } from "node:child_process";
|
|
3
4
|
import { SelectList } from "@earendil-works/pi-tui";
|
|
4
5
|
//#region src/tui/tui-local-shell.ts
|
|
6
|
+
function formatLocalShellConsentHint(keybindings) {
|
|
7
|
+
return `↑/↓ + ${keybindings ? formatKeyIds(keybindings, "tui.select.confirm", { capitalize: true }) : "Enter"} to choose, ${keybindings ? formatKeyIds(keybindings, "tui.select.cancel", { capitalize: true }) : "Esc"} to cancel.`;
|
|
8
|
+
}
|
|
5
9
|
/** `!command` runs on the local machine (gated by in-session consent). `!!command` uses inherited stdio. */
|
|
6
10
|
function createLocalShellRunner(deps) {
|
|
7
11
|
let localExecAsked = false;
|
|
@@ -17,7 +21,7 @@ function createLocalShellRunner(deps) {
|
|
|
17
21
|
return await new Promise((resolve) => {
|
|
18
22
|
deps.chatLog.addSystem("Allow local shell commands for this session?");
|
|
19
23
|
deps.chatLog.addSystem("Runs on YOUR machine (not the gateway); may delete files or expose secrets.");
|
|
20
|
-
deps.chatLog.addSystem(
|
|
24
|
+
deps.chatLog.addSystem(formatLocalShellConsentHint(deps.keybindings));
|
|
21
25
|
const selector = new SelectList([{
|
|
22
26
|
value: "no",
|
|
23
27
|
label: "No"
|
|
@@ -66,6 +70,15 @@ function createLocalShellRunner(deps) {
|
|
|
66
70
|
return;
|
|
67
71
|
}
|
|
68
72
|
if (!await ensureLocalExecAllowed()) return;
|
|
73
|
+
let cwd;
|
|
74
|
+
try {
|
|
75
|
+
cwd = getCwd();
|
|
76
|
+
} catch (err) {
|
|
77
|
+
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
78
|
+
deps.chatLog.addSystem(`[local] workspace error: ${errorMessage}`);
|
|
79
|
+
deps.tui.requestRender();
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
69
82
|
if (inheritStdio && deps.runWithInheritedStdio && deps.pauseStdioFilter && deps.resumeStdioFilter) {
|
|
70
83
|
deps.pauseStdioFilter();
|
|
71
84
|
try {
|
|
@@ -73,15 +86,22 @@ function createLocalShellRunner(deps) {
|
|
|
73
86
|
await new Promise((resolve, reject) => {
|
|
74
87
|
const child = spawnCommand(cmd, {
|
|
75
88
|
shell: true,
|
|
76
|
-
cwd
|
|
89
|
+
cwd,
|
|
77
90
|
env: {
|
|
78
91
|
...env,
|
|
79
92
|
XOPC_SHELL: "tui-local"
|
|
80
93
|
},
|
|
81
94
|
stdio: "inherit"
|
|
82
95
|
});
|
|
83
|
-
child.on("close", (code, signal) => {
|
|
96
|
+
child.on("close", async (code, signal) => {
|
|
84
97
|
deps.chatLog.addSystem(`[local] !! $ ${cmd} — exit ${code ?? "?"}${signal ? ` (signal ${signal})` : ""} (excluded from agent context)`);
|
|
98
|
+
await deps.onComplete?.({
|
|
99
|
+
command: cmd,
|
|
100
|
+
output: "",
|
|
101
|
+
exitCode: code,
|
|
102
|
+
signal,
|
|
103
|
+
excludeFromContext: true
|
|
104
|
+
});
|
|
85
105
|
resolve();
|
|
86
106
|
});
|
|
87
107
|
child.on("error", (err) => {
|
|
@@ -107,28 +127,50 @@ function createLocalShellRunner(deps) {
|
|
|
107
127
|
await new Promise((resolve) => {
|
|
108
128
|
const child = spawnCommand(cmd, {
|
|
109
129
|
shell: true,
|
|
110
|
-
cwd
|
|
130
|
+
cwd,
|
|
111
131
|
env: {
|
|
112
132
|
...env,
|
|
113
133
|
XOPC_SHELL: "tui-local"
|
|
114
134
|
}
|
|
115
135
|
});
|
|
116
136
|
let totalChars = 0;
|
|
137
|
+
let output = "";
|
|
138
|
+
let truncated = false;
|
|
117
139
|
const appendCapped = (chunk) => {
|
|
118
|
-
if (totalChars >= maxChars)
|
|
140
|
+
if (totalChars >= maxChars) {
|
|
141
|
+
truncated = true;
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
119
144
|
const slice = chunk.slice(0, maxChars - totalChars);
|
|
120
145
|
totalChars += slice.length;
|
|
146
|
+
output += slice;
|
|
147
|
+
if (slice.length < chunk.length) truncated = true;
|
|
121
148
|
bashBlock.appendOutput(slice);
|
|
122
149
|
deps.tui.requestRender();
|
|
123
150
|
};
|
|
124
151
|
child.stdout?.on("data", (buf) => appendCapped(buf.toString("utf8")));
|
|
125
152
|
child.stderr?.on("data", (buf) => appendCapped(buf.toString("utf8")));
|
|
126
|
-
child.on("close", (code, signal) => {
|
|
153
|
+
child.on("close", async (code, signal) => {
|
|
154
|
+
await deps.onComplete?.({
|
|
155
|
+
command: cmd,
|
|
156
|
+
output,
|
|
157
|
+
exitCode: code,
|
|
158
|
+
signal,
|
|
159
|
+
excludeFromContext: false,
|
|
160
|
+
truncated
|
|
161
|
+
});
|
|
127
162
|
bashBlock.setComplete(code, signal);
|
|
128
163
|
deps.tui.requestRender();
|
|
129
164
|
resolve();
|
|
130
165
|
});
|
|
131
|
-
child.on("error", (err) => {
|
|
166
|
+
child.on("error", async (err) => {
|
|
167
|
+
await deps.onComplete?.({
|
|
168
|
+
command: cmd,
|
|
169
|
+
output: String(err),
|
|
170
|
+
exitCode: null,
|
|
171
|
+
signal: null,
|
|
172
|
+
excludeFromContext: false
|
|
173
|
+
});
|
|
132
174
|
bashBlock.setError(String(err));
|
|
133
175
|
deps.tui.requestRender();
|
|
134
176
|
resolve();
|
|
@@ -138,6 +180,6 @@ function createLocalShellRunner(deps) {
|
|
|
138
180
|
return { runLocalShellLine };
|
|
139
181
|
}
|
|
140
182
|
//#endregion
|
|
141
|
-
export { createLocalShellRunner };
|
|
183
|
+
export { createLocalShellRunner, formatLocalShellConsentHint };
|
|
142
184
|
|
|
143
185
|
//# sourceMappingURL=tui-local-shell.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tui-local-shell.js","names":[],"sources":["../../../src/tui/tui-local-shell.ts"],"sourcesContent":["import { spawn } from 'node:child_process';\n\nimport type { Component, TUI } from '@earendil-works/pi-tui';\nimport { SelectList } from '@earendil-works/pi-tui';\n\nimport type { BashExecutionComponent } from './components/bash-execution.js';\nimport { selectListTheme } from './theme.js';\n\ntype LocalShellDeps = {\n chatLog: {\n addSystem: (line: string) => void;\n addBashExecution: (\n command: string,\n ui: TUI,\n excludeFromContext: boolean,\n ) => BashExecutionComponent;\n };\n tui: TUI & { requestRender: () => void; setFocus: (c: Component) => void };\n editor: Component;\n openOverlay: (component: Component) => void;\n closeOverlay: () => void;\n spawnCommand?: typeof spawn;\n getCwd?: () => string;\n env?: NodeJS.ProcessEnv;\n maxOutputChars?: number;\n /** Pause stdout/stderr filtering before handing the terminal to a child (`stdio: 'inherit'`). */\n pauseStdioFilter?: () => void;\n resumeStdioFilter?: () => void;\n /** Wrap work while the TUI is stopped (full-screen subprocess). */\n runWithInheritedStdio?: (work: () => Promise<void>) => Promise<void>;\n};\n\n/** `!command` runs on the local machine (gated by in-session consent). `!!command` uses inherited stdio. */\nexport function createLocalShellRunner(deps: LocalShellDeps) {\n let localExecAsked = false;\n let localExecAllowed = false;\n const spawnCommand = deps.spawnCommand ?? spawn;\n const getCwd = deps.getCwd ?? (() => process.cwd());\n const env = deps.env ?? process.env;\n const maxChars = deps.maxOutputChars ?? 40_000;\n\n const ensureLocalExecAllowed = async (): Promise<boolean> => {\n if (localExecAllowed) {\n return true;\n }\n if (localExecAsked) {\n return false;\n }\n localExecAsked = true;\n\n return await new Promise<boolean>((resolve) => {\n deps.chatLog.addSystem('Allow local shell commands for this session?');\n deps.chatLog.addSystem(\n 'Runs on YOUR machine (not the gateway); may delete files or expose secrets.',\n );\n deps.chatLog.addSystem('↑/↓ + Enter to choose, Esc to cancel.');\n const selector = new SelectList(\n [\n { value: 'no', label: 'No' },\n { value: 'yes', label: 'Yes' },\n ],\n 2,\n selectListTheme,\n );\n selector.onSelect = (item) => {\n deps.closeOverlay();\n if (item.value === 'yes') {\n localExecAllowed = true;\n deps.chatLog.addSystem('local shell: enabled for this session');\n resolve(true);\n } else {\n deps.chatLog.addSystem('local shell: not enabled');\n resolve(false);\n }\n deps.tui.requestRender();\n };\n selector.onCancel = () => {\n deps.closeOverlay();\n deps.chatLog.addSystem('local shell: cancelled');\n deps.tui.requestRender();\n resolve(false);\n };\n deps.openOverlay(selector);\n deps.tui.requestRender();\n });\n };\n\n const runLocalShellLine = async (line: string) => {\n let cmd = line.slice(1);\n if (cmd === '') {\n return;\n }\n\n let inheritStdio = false;\n if (cmd.startsWith('!')) {\n inheritStdio = true;\n cmd = cmd.slice(1);\n if (cmd === '') {\n deps.chatLog.addSystem('[local] !! requires a command (e.g. !!vim file)');\n deps.tui.requestRender();\n return;\n }\n }\n\n if (localExecAsked && !localExecAllowed) {\n deps.chatLog.addSystem('local shell: not enabled for this session');\n deps.tui.requestRender();\n return;\n }\n\n const allowed = await ensureLocalExecAllowed();\n if (!allowed) {\n return;\n }\n\n if (\n inheritStdio &&\n deps.runWithInheritedStdio &&\n deps.pauseStdioFilter &&\n deps.resumeStdioFilter\n ) {\n deps.pauseStdioFilter();\n try {\n await deps.runWithInheritedStdio(async () => {\n await new Promise<void>((resolve, reject) => {\n const child = spawnCommand(cmd, {\n shell: true,\n cwd: getCwd(),\n env: { ...env, XOPC_SHELL: 'tui-local' },\n stdio: 'inherit',\n });\n child.on('close', (code, signal) => {\n deps.chatLog.addSystem(\n `[local] !! $ ${cmd} — exit ${code ?? '?'}${signal ? ` (signal ${signal})` : ''} (excluded from agent context)`,\n );\n resolve();\n });\n child.on('error', (err) => {\n deps.chatLog.addSystem(`[local] error: ${String(err)}`);\n reject(err);\n });\n });\n });\n } catch {\n // logged above\n } finally {\n deps.resumeStdioFilter();\n deps.tui.setFocus(deps.editor);\n deps.tui.requestRender();\n }\n return;\n }\n\n if (inheritStdio && !deps.runWithInheritedStdio) {\n deps.chatLog.addSystem('[local] inherited stdio requires full TUI wiring; use single ! instead.');\n deps.tui.requestRender();\n return;\n }\n\n const bashBlock = deps.chatLog.addBashExecution(cmd, deps.tui, false);\n deps.tui.requestRender();\n\n await new Promise<void>((resolve) => {\n const child = spawnCommand(cmd, {\n shell: true,\n cwd: getCwd(),\n env: { ...env, XOPC_SHELL: 'tui-local' },\n });\n\n let totalChars = 0;\n const appendCapped = (chunk: string) => {\n if (totalChars >= maxChars) return;\n const slice = chunk.slice(0, maxChars - totalChars);\n totalChars += slice.length;\n bashBlock.appendOutput(slice);\n deps.tui.requestRender();\n };\n\n child.stdout?.on('data', (buf) => appendCapped(buf.toString('utf8')));\n child.stderr?.on('data', (buf) => appendCapped(buf.toString('utf8')));\n\n child.on('close', (code, signal) => {\n bashBlock.setComplete(code, signal);\n deps.tui.requestRender();\n resolve();\n });\n\n child.on('error', (err) => {\n bashBlock.setError(String(err));\n deps.tui.requestRender();\n resolve();\n });\n });\n };\n\n return { runLocalShellLine };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tui-local-shell.js","names":[],"sources":["../../../src/tui/tui-local-shell.ts"],"sourcesContent":["import { spawn } from 'node:child_process';\n\nimport type { Component, KeybindingsManager, TUI } from '@earendil-works/pi-tui';\nimport { SelectList } from '@earendil-works/pi-tui';\n\nimport type { BashExecutionComponent } from './components/bash-execution.js';\nimport { formatKeyIds } from './format-tui-hotkeys.js';\nimport { selectListTheme } from './theme.js';\n\ntype LocalShellDeps = {\n chatLog: {\n addSystem: (line: string) => void;\n addBashExecution: (\n command: string,\n ui: TUI,\n excludeFromContext: boolean,\n ) => BashExecutionComponent;\n };\n tui: TUI & { requestRender: () => void; setFocus: (c: Component) => void };\n editor: Component;\n openOverlay: (component: Component) => void;\n closeOverlay: () => void;\n spawnCommand?: typeof spawn;\n getCwd?: () => string;\n env?: NodeJS.ProcessEnv;\n maxOutputChars?: number;\n keybindings?: KeybindingsManager;\n /** Pause stdout/stderr filtering before handing the terminal to a child (`stdio: 'inherit'`). */\n pauseStdioFilter?: () => void;\n resumeStdioFilter?: () => void;\n /** Wrap work while the TUI is stopped (full-screen subprocess). */\n runWithInheritedStdio?: (work: () => Promise<void>) => Promise<void>;\n onComplete?: (entry: {\n command: string;\n output?: string;\n exitCode?: number | null;\n signal?: string | null;\n excludeFromContext: boolean;\n truncated?: boolean;\n }) => void | Promise<void>;\n};\n\nexport function formatLocalShellConsentHint(keybindings?: KeybindingsManager): string {\n const confirm = keybindings\n ? formatKeyIds(keybindings, 'tui.select.confirm', { capitalize: true })\n : 'Enter';\n const cancel = keybindings\n ? formatKeyIds(keybindings, 'tui.select.cancel', { capitalize: true })\n : 'Esc';\n return `↑/↓ + ${confirm} to choose, ${cancel} to cancel.`;\n}\n\n/** `!command` runs on the local machine (gated by in-session consent). `!!command` uses inherited stdio. */\nexport function createLocalShellRunner(deps: LocalShellDeps) {\n let localExecAsked = false;\n let localExecAllowed = false;\n const spawnCommand = deps.spawnCommand ?? spawn;\n const getCwd = deps.getCwd ?? (() => process.cwd());\n const env = deps.env ?? process.env;\n const maxChars = deps.maxOutputChars ?? 40_000;\n\n const ensureLocalExecAllowed = async (): Promise<boolean> => {\n if (localExecAllowed) {\n return true;\n }\n if (localExecAsked) {\n return false;\n }\n localExecAsked = true;\n\n return await new Promise<boolean>((resolve) => {\n deps.chatLog.addSystem('Allow local shell commands for this session?');\n deps.chatLog.addSystem(\n 'Runs on YOUR machine (not the gateway); may delete files or expose secrets.',\n );\n deps.chatLog.addSystem(formatLocalShellConsentHint(deps.keybindings));\n const selector = new SelectList(\n [\n { value: 'no', label: 'No' },\n { value: 'yes', label: 'Yes' },\n ],\n 2,\n selectListTheme,\n );\n selector.onSelect = (item) => {\n deps.closeOverlay();\n if (item.value === 'yes') {\n localExecAllowed = true;\n deps.chatLog.addSystem('local shell: enabled for this session');\n resolve(true);\n } else {\n deps.chatLog.addSystem('local shell: not enabled');\n resolve(false);\n }\n deps.tui.requestRender();\n };\n selector.onCancel = () => {\n deps.closeOverlay();\n deps.chatLog.addSystem('local shell: cancelled');\n deps.tui.requestRender();\n resolve(false);\n };\n deps.openOverlay(selector);\n deps.tui.requestRender();\n });\n };\n\n const runLocalShellLine = async (line: string) => {\n let cmd = line.slice(1);\n if (cmd === '') {\n return;\n }\n\n let inheritStdio = false;\n if (cmd.startsWith('!')) {\n inheritStdio = true;\n cmd = cmd.slice(1);\n if (cmd === '') {\n deps.chatLog.addSystem('[local] !! requires a command (e.g. !!vim file)');\n deps.tui.requestRender();\n return;\n }\n }\n\n if (localExecAsked && !localExecAllowed) {\n deps.chatLog.addSystem('local shell: not enabled for this session');\n deps.tui.requestRender();\n return;\n }\n\n const allowed = await ensureLocalExecAllowed();\n if (!allowed) {\n return;\n }\n\n let cwd: string;\n try {\n cwd = getCwd();\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n deps.chatLog.addSystem(`[local] workspace error: ${errorMessage}`);\n deps.tui.requestRender();\n return;\n }\n\n if (\n inheritStdio &&\n deps.runWithInheritedStdio &&\n deps.pauseStdioFilter &&\n deps.resumeStdioFilter\n ) {\n deps.pauseStdioFilter();\n try {\n await deps.runWithInheritedStdio(async () => {\n await new Promise<void>((resolve, reject) => {\n const child = spawnCommand(cmd, {\n shell: true,\n cwd,\n env: { ...env, XOPC_SHELL: 'tui-local' },\n stdio: 'inherit',\n });\n child.on('close', async (code, signal) => {\n deps.chatLog.addSystem(\n `[local] !! $ ${cmd} — exit ${code ?? '?'}${signal ? ` (signal ${signal})` : ''} (excluded from agent context)`,\n );\n await deps.onComplete?.({\n command: cmd,\n output: '',\n exitCode: code,\n signal,\n excludeFromContext: true,\n });\n resolve();\n });\n child.on('error', (err) => {\n deps.chatLog.addSystem(`[local] error: ${String(err)}`);\n reject(err);\n });\n });\n });\n } catch {\n // logged above\n } finally {\n deps.resumeStdioFilter();\n deps.tui.setFocus(deps.editor);\n deps.tui.requestRender();\n }\n return;\n }\n\n if (inheritStdio && !deps.runWithInheritedStdio) {\n deps.chatLog.addSystem('[local] inherited stdio requires full TUI wiring; use single ! instead.');\n deps.tui.requestRender();\n return;\n }\n\n const bashBlock = deps.chatLog.addBashExecution(cmd, deps.tui, false);\n deps.tui.requestRender();\n\n await new Promise<void>((resolve) => {\n const child = spawnCommand(cmd, {\n shell: true,\n cwd,\n env: { ...env, XOPC_SHELL: 'tui-local' },\n });\n\n let totalChars = 0;\n let output = '';\n let truncated = false;\n const appendCapped = (chunk: string) => {\n if (totalChars >= maxChars) {\n truncated = true;\n return;\n }\n const slice = chunk.slice(0, maxChars - totalChars);\n totalChars += slice.length;\n output += slice;\n if (slice.length < chunk.length) {\n truncated = true;\n }\n bashBlock.appendOutput(slice);\n deps.tui.requestRender();\n };\n\n child.stdout?.on('data', (buf) => appendCapped(buf.toString('utf8')));\n child.stderr?.on('data', (buf) => appendCapped(buf.toString('utf8')));\n\n child.on('close', async (code, signal) => {\n await deps.onComplete?.({\n command: cmd,\n output,\n exitCode: code,\n signal,\n excludeFromContext: false,\n truncated,\n });\n bashBlock.setComplete(code, signal);\n deps.tui.requestRender();\n resolve();\n });\n\n child.on('error', async (err) => {\n await deps.onComplete?.({\n command: cmd,\n output: String(err),\n exitCode: null,\n signal: null,\n excludeFromContext: false,\n });\n bashBlock.setError(String(err));\n deps.tui.requestRender();\n resolve();\n });\n });\n };\n\n return { runLocalShellLine };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type Component, type Focusable, type KeybindingsManager, type SelectItem } from '@earendil-works/pi-tui';
|
|
2
|
+
import type { TuiModelChoice } from './tui-backend.js';
|
|
3
|
+
import type { PickerServices } from './tui-picker-services.js';
|
|
4
|
+
import type { TuiState } from './tui-types.js';
|
|
5
|
+
export declare function formatModelPickerHint(keybindings: KeybindingsManager): string;
|
|
6
|
+
export declare function modelPickerSelectItems(models: TuiModelChoice[], state: Pick<TuiState, 'sessionInfo'>): SelectItem[];
|
|
7
|
+
export declare class ModelPickerSelectList implements Component, Focusable {
|
|
8
|
+
private readonly keybindings?;
|
|
9
|
+
private scope;
|
|
10
|
+
private readonly list;
|
|
11
|
+
private readonly allItems;
|
|
12
|
+
private readonly scopedItems;
|
|
13
|
+
onSelect?: (item: SelectItem) => void;
|
|
14
|
+
onCancel?: () => void;
|
|
15
|
+
constructor(models: TuiModelChoice[], state: Pick<TuiState, 'sessionInfo'>, scopedRefs: string[], initialQuery?: string, keybindings?: KeybindingsManager);
|
|
16
|
+
get focused(): boolean;
|
|
17
|
+
set focused(value: boolean);
|
|
18
|
+
private itemsForScope;
|
|
19
|
+
private toggleScope;
|
|
20
|
+
getSelectedItem(): SelectItem | null;
|
|
21
|
+
invalidate(): void;
|
|
22
|
+
render(width: number): string[];
|
|
23
|
+
handleInput(keyData: string): void;
|
|
24
|
+
}
|
|
25
|
+
/** Ctrl+L or `/model` — pick model and apply it to the current session. */
|
|
26
|
+
export declare function openModelPickerOverlay(svc: PickerServices, initialSearch?: string): Promise<void>;
|