@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
package/dist/src/tui/tui.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tui.js","names":["packageJson.version"],"sources":["../../../src/tui/tui.ts"],"sourcesContent":["import {\n Container,\n Loader,\n ProcessTerminal,\n setKeybindings,\n TUI,\n} from '@earendil-works/pi-tui';\nimport { mkdtempSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { join } from 'node:path';\nimport { spawnSync } from 'node:child_process';\n\nimport type { ThinkLevel } from '../agent/transcript/thinking-types.js';\nimport { loadConfig } from '../config/index.js';\nimport { resolveTuiSessionKey, resolveTuiStartupSessionKey } from '../routing/resolve-tui-session-key.js';\nimport { parseAgentSessionKey } from '../routing/agent-session-key.js';\nimport type { TuiBackend, TuiEvent, TuiModelChoice } from './tui-backend.js';\nimport { EmbeddedBackend } from './backends/embedded-backend.js';\nimport { GatewaySseBackend } from './backends/gateway-sse-backend.js';\nimport {\n clearPendingToolCallIds,\n DEFAULT_STREAMING_WATCHDOG_MS,\n dispatchAgentSSE,\n} from './tui-agent-events.js';\nimport { ChatLog } from './components/chat-log.js';\nimport { CustomEditor } from './components/custom-editor.js';\nimport { TuiBottomBar } from './components/tui-bottom-bar.js';\nimport { TuiHeader } from './components/tui-header.js';\nimport { StreamAssembler } from './stream-assembler.js';\nimport { createTuiCommandHandler, getSlashCommands } from './tui-commands.js';\nimport { createLocalShellRunner } from './tui-local-shell.js';\nimport {\n createBackspaceDeduper,\n drainAndStopTuiSafely,\n resolveCtrlCAction,\n} from './tui-lifecycle.js';\nimport {\n openModelPickerOverlay,\n openScopedModelsOverlay,\n openSessionPickerOverlay,\n openSettingsOverlay,\n} from './tui-picker-overlay.js';\nimport { createOverlayHandlers } from './tui-overlays.js';\nimport {\n createEditorSubmitHandler,\n createSubmitBurstCoalescer,\n shouldEnableWindowsGitBashPasteFallback,\n} from './tui-submit.js';\nimport { installTuiStdioFilter } from './tui-stdio-filter.js';\nimport { withTuiSuspended } from './tui-suspend.js';\nimport { saveClipboardImageToTempFile } from './clipboard-image.js';\nimport {\n applyThemeById,\n getBashExcludeBorderColor,\n getBashModeBorderColor,\n getThinkingBorderColor,\n initTuiTheme,\n} from './theme-manager.js';\nimport { editorTheme, theme } from './theme.js';\nimport { loadTuiSettings, saveTuiSettings, type TuiSettings } from './tui-settings.js';\nimport { resolveFdPath } from './tui-fd-path.js';\nimport packageJson from '../../package.json' with { type: 'json' };\nimport { createSessionActions } from './tui-session-actions.js';\nimport { createInitialState, type TuiOptions, type TuiResult, type TuiState } from './tui-types.js';\nimport { createXopcTuiKeybindingsManager } from './tui-keybindings-file.js';\nimport {\n filterModelsForCycle,\n loadScopedModelRefs,\n saveScopedModelRefs,\n} from './tui-scoped-models.js';\nimport { loadExtensionsForTuiLocalMode } from './extension-host/load-extensions.js';\nimport { createTuiExtensionRuntime } from './extension-host/runtime.js';\nimport type { ExtensionRegistryImpl } from '../extensions/loader.js';\n\nexport type { TuiOptions, TuiResult };\n\nexport {\n createBackspaceDeduper,\n drainAndStopTuiSafely,\n type DrainableTui,\n isIgnorableTuiStopError,\n resolveCtrlCAction,\n stopTuiSafely,\n} from './tui-lifecycle.js';\n\nexport { withTuiSuspended } from './tui-suspend.js';\n\nconst THINK_LEVEL_CYCLE: ThinkLevel[] = [\n 'off',\n 'minimal',\n 'low',\n 'medium',\n 'high',\n 'xhigh',\n 'adaptive',\n];\n\nfunction nextThinkLevel(current: string | undefined): ThinkLevel {\n const c = (current ?? 'medium').toLowerCase();\n const idx = THINK_LEVEL_CYCLE.indexOf(c as ThinkLevel);\n const mediumIdx = THINK_LEVEL_CYCLE.indexOf('medium');\n const base = idx >= 0 ? idx : mediumIdx >= 0 ? mediumIdx : 0;\n return THINK_LEVEL_CYCLE[(base + 1) % THINK_LEVEL_CYCLE.length]!;\n}\n\nconst DOUBLE_ESCAPE_WINDOW_MS = 500;\n\nexport async function runTui(opts: TuiOptions): Promise<TuiResult> {\n const stdioFilter = installTuiStdioFilter();\n const restoreStdio = () => stdioFilter.restore();\n\n const isLocalMode = opts.local === true;\n const config = loadConfig();\n const startup = resolveTuiStartupSessionKey({\n cfg: config,\n sessionOption: opts.session,\n cwd: process.cwd(),\n });\n let currentAgentId = startup.agentId;\n const sessionScope = startup.sessionScope;\n const sessionMainKey = startup.sessionMainKey;\n const resolveSessionKey = (raw?: string) =>\n resolveTuiSessionKey({\n raw,\n sessionScope,\n currentAgentId,\n sessionMainKey,\n });\n let tuiSettings = loadTuiSettings();\n initTuiTheme({ themeId: opts.theme ?? tuiSettings.theme });\n const state = createInitialState(startup.sessionKey);\n state.scopedModelRefs = loadScopedModelRefs();\n state.showThinking = tuiSettings.showThinking;\n state.toolsExpanded = tuiSettings.toolsExpanded;\n const assembler = new StreamAssembler();\n\n let extensionRegistry: ExtensionRegistryImpl | undefined;\n if (isLocalMode) {\n extensionRegistry = await loadExtensionsForTuiLocalMode();\n }\n\n const client: TuiBackend = isLocalMode\n ? new EmbeddedBackend({ extensionRegistry })\n : new GatewaySseBackend({ url: opts.url ?? 'http://localhost:3120', token: opts.token });\n\n const keybindings = createXopcTuiKeybindingsManager();\n setKeybindings(keybindings);\n\n let modelChoices: TuiModelChoice[] = [];\n const cycleModelChoices = (): TuiModelChoice[] =>\n filterModelsForCycle(modelChoices, state.scopedModelRefs);\n\n const refreshCycleModels = () => {\n bottomBar.invalidate();\n tui.requestRender();\n };\n\n const tui = new TUI(new ProcessTerminal());\n const dedupeBackspace = createBackspaceDeduper();\n tui.addInputListener((data) => {\n const next = dedupeBackspace(data);\n if (next.length === 0) {\n return { consume: true };\n }\n return { data: next };\n });\n\n const header = new TuiHeader(() => ({\n version: packageJson.version ?? 'dev',\n connectionLabel: client.connectionLabel,\n sessionKey: state.currentSessionKey,\n showHints: tuiSettings.showStartupHints,\n }));\n const statusContainer = new Container();\n const bottomBar = new TuiBottomBar(() => state, () => opts.thinking);\n const chatLog = new ChatLog();\n chatLog.setToolsExpanded(state.toolsExpanded);\n const editor = new CustomEditor(tui, editorTheme, keybindings);\n const root = new Container();\n root.addChild(header);\n root.addChild(chatLog);\n root.addChild(statusContainer);\n root.addChild(editor);\n root.addChild(bottomBar);\n tui.addChild(root);\n tui.setFocus(editor);\n\n let isBashMode = false;\n let isBashExcludeContext = false;\n\n const updateEditorBorderColor = () => {\n if (isBashMode) {\n editor.borderColor = isBashExcludeContext\n ? getBashExcludeBorderColor()\n : getBashModeBorderColor();\n } else {\n const level = state.sessionInfo.thinkingLevel ?? opts.thinking ?? 'off';\n editor.borderColor = getThinkingBorderColor(level);\n }\n tui.requestRender();\n };\n\n editor.onChange = (text: string) => {\n const trimmed = text.trimStart();\n const nextExclude = trimmed.startsWith('!!');\n const nextBash = trimmed.startsWith('!');\n if (nextBash !== isBashMode || nextExclude !== isBashExcludeContext) {\n isBashMode = nextBash;\n isBashExcludeContext = nextExclude;\n updateEditorBorderColor();\n }\n };\n\n const { openOverlay, closeOverlay } = createOverlayHandlers(tui, editor);\n\n const slashCommands = getSlashCommands(isLocalMode);\n\n const extensionRuntime = createTuiExtensionRuntime({\n registry: extensionRegistry,\n tui,\n chatLog,\n header,\n bottomBar,\n getState: () => state,\n baseSlashCommands: slashCommands,\n cwd: process.cwd(),\n fdPath: resolveFdPath(),\n openOverlay,\n closeOverlay,\n onInvalidate: () => {\n updateHeader();\n updateFooter();\n tui.requestRender();\n },\n });\n\n editor.setAutocompleteProvider(extensionRuntime.autocompleteProvider);\n\n let statusLoader: Loader | null = null;\n let statusStartedAt: number | null = null;\n let lastActivityStatus = '';\n let elapsedTimerId: ReturnType<typeof setInterval> | null = null;\n const busyStates = new Set(['sending', 'waiting', 'streaming', 'running', 'compacting']);\n\n const syncTerminalProgress = () => {\n if (!tuiSettings.showTerminalProgress) {\n tui.terminal.setProgress(false);\n return;\n }\n tui.terminal.setProgress(busyStates.has(state.activityStatus));\n };\n\n let lastStreamActivityAt = Date.now();\n let streamWatchdogId: ReturnType<typeof setInterval> | null = null;\n\n const touchStreamingActivity = () => {\n lastStreamActivityAt = Date.now();\n };\n\n const formatElapsed = (startMs: number) => {\n const totalSeconds = Math.max(0, Math.floor((Date.now() - startMs) / 1000));\n if (totalSeconds < 60) return `${totalSeconds}s`;\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n return `${minutes}m ${seconds}s`;\n };\n\n const renderStatus = () => {\n const isBusy = busyStates.has(state.activityStatus);\n if (isBusy) {\n if (!statusStartedAt || lastActivityStatus !== state.activityStatus) {\n statusStartedAt = Date.now();\n }\n if (!statusLoader) {\n statusContainer.clear();\n statusLoader = new Loader(\n tui,\n (spinner) => theme.accent(spinner),\n (text) => theme.bold(theme.accentSoft(text)),\n '',\n );\n statusContainer.addChild(statusLoader);\n }\n const elapsed = formatElapsed(statusStartedAt);\n statusLoader.setMessage(\n `${state.progressMessage ?? state.activityStatus} • ${elapsed} | ${state.connectionStatus}`,\n );\n if (!elapsedTimerId) {\n elapsedTimerId = setInterval(() => {\n if (statusStartedAt && statusLoader) {\n const el = formatElapsed(statusStartedAt);\n statusLoader.setMessage(\n `${state.progressMessage ?? state.activityStatus} • ${el} | ${state.connectionStatus}`,\n );\n }\n }, 1000);\n }\n } else {\n state.progressMessage = null;\n statusStartedAt = null;\n if (elapsedTimerId) {\n clearInterval(elapsedTimerId);\n elapsedTimerId = null;\n }\n statusLoader?.stop();\n statusLoader = null;\n statusContainer.clear();\n }\n lastActivityStatus = state.activityStatus;\n bottomBar.invalidate();\n syncTerminalProgress();\n tui.requestRender();\n };\n\n const setActivityStatus = (status: string) => {\n state.activityStatus = status as TuiState['activityStatus'];\n renderStatus();\n };\n\n const setConnectionStatus = (text: string) => {\n state.connectionStatus = text;\n renderStatus();\n };\n\n const updateHeader = () => {\n header.invalidate();\n syncTerminalTitle();\n };\n\n const syncTerminalTitle = () => {\n const shortKey =\n state.currentSessionKey.length > 48\n ? `${state.currentSessionKey.slice(0, 45)}…`\n : state.currentSessionKey;\n tui.terminal.setTitle(`xopc · ${shortKey}`);\n };\n\n const updateFooter = () => {\n bottomBar.invalidate();\n };\n\n const refreshModelChoices = async () => {\n try {\n modelChoices = await client.listModels();\n } catch {\n modelChoices = [];\n }\n bottomBar.invalidate();\n tui.requestRender();\n };\n\n let finishTui: (() => void) | null = null;\n let exitResult: TuiResult = { exitReason: 'exit' };\n\n const requestExit = () => {\n if (state.exitRequested) return;\n state.exitRequested = true;\n if (elapsedTimerId) {\n clearInterval(elapsedTimerId);\n elapsedTimerId = null;\n }\n if (streamWatchdogId) {\n clearInterval(streamWatchdogId);\n streamWatchdogId = null;\n }\n client.stop();\n tui.terminal.setProgress(false);\n void drainAndStopTuiSafely(tui).then(() => {\n restoreStdio();\n finishTui?.();\n process.exit(0);\n });\n };\n\n const sessionActions = createSessionActions({\n client,\n chatLog,\n tui,\n state,\n assembler,\n resolveSessionKey,\n updateHeader,\n updateFooter,\n setActivityStatus,\n onAgentIdChange: (agentId) => {\n currentAgentId = agentId;\n },\n });\n\n const {\n refreshSessionInfo,\n loadHistory: loadSessionHistory,\n setSession,\n abortActive,\n resetCurrentSession,\n clearChatForSessionSwitch,\n } = sessionActions;\n\n const refreshSessionInfoWithBorder = async () => {\n await refreshSessionInfo();\n updateEditorBorderColor();\n };\n\n const resolveModelChoiceIndex = (): number => {\n const choices = cycleModelChoices();\n if (choices.length === 0) return -1;\n const p = state.sessionInfo.modelProvider;\n const m = state.sessionInfo.model;\n if (p && m) {\n const byParts = choices.findIndex((x) => x.provider === p && x.id === m);\n if (byParts >= 0) return byParts;\n }\n if (m?.includes('/')) {\n const [a, b] = m.split('/', 2);\n const bySlash = choices.findIndex((x) => x.provider === a && x.id === b);\n if (bySlash >= 0) return bySlash;\n }\n return 0;\n };\n\n const cycleModel = (dir: 'forward' | 'backward') => {\n const choices = cycleModelChoices();\n if (choices.length === 0) {\n void refreshModelChoices().then(() => {\n if (cycleModelChoices().length === 0) {\n chatLog.addSystem('No models available to cycle.');\n tui.requestRender();\n return;\n }\n cycleModel(dir);\n });\n return;\n }\n const idx = resolveModelChoiceIndex();\n const base = idx >= 0 ? idx : 0;\n const delta = dir === 'forward' ? 1 : -1;\n const next = choices[(base + delta + choices.length) % choices.length]!;\n sendMessage(`/switch ${next.provider}/${next.id}`);\n };\n\n const handleCtrlZ = () => {\n if (process.platform === 'win32') {\n chatLog.addSystem('Suspend (Ctrl+Z) is not supported on Windows.');\n tui.requestRender();\n return;\n }\n const suspendKeepAlive = setInterval(() => {}, 2 ** 30);\n const ignoreSigint = () => {};\n process.on('SIGINT', ignoreSigint);\n process.once('SIGCONT', () => {\n clearInterval(suspendKeepAlive);\n process.removeListener('SIGINT', ignoreSigint);\n tui.start();\n tui.setFocus(editor);\n tui.requestRender(true);\n });\n try {\n tui.stop();\n process.kill(0, 'SIGTSTP');\n } catch {\n clearInterval(suspendKeepAlive);\n process.removeListener('SIGINT', ignoreSigint);\n }\n };\n\n const openExternalEditor = () => {\n const dir = mkdtempSync(join(tmpdir(), 'xopc-tui-edit-'));\n const filePath = join(dir, 'message.md');\n writeFileSync(filePath, editor.getText(), 'utf8');\n const editorBin = process.env.EDITOR || process.env.VISUAL || 'vi';\n void (async () => {\n await withTuiSuspended(tui, async () => {\n spawnSync(editorBin, [filePath], { stdio: 'inherit' });\n });\n try {\n const next = readFileSync(filePath, 'utf8');\n editor.setText(next.replace(/\\r\\n/g, '\\n'));\n } catch {\n // ignore\n }\n try {\n unlinkSync(filePath);\n } catch {\n // ignore\n }\n tui.setFocus(editor);\n tui.requestRender(true);\n })();\n };\n\n const isAgentBusy = () =>\n state.activeRunId != null || state.isCompacting || busyStates.has(state.activityStatus);\n\n const steerMessage = (text: string) => {\n chatLog.addUser(text);\n touchStreamingActivity();\n tui.requestRender();\n void client\n .steerChat({ sessionKey: state.currentSessionKey, message: text })\n .then(({ ok }) => {\n if (!ok) {\n chatLog.addSystem(\n theme.dim(\n 'Could not steer — no active run or steer failed. Press Escape to abort, or Alt+Enter to queue a follow-up.',\n ),\n );\n } else {\n chatLog.addSystem(\n theme.dim('Steered — message injects at the next tool boundary (pi-style).'),\n );\n }\n tui.requestRender();\n })\n .catch((error: unknown) => {\n const errorMessage = error instanceof Error ? error.message : String(error);\n chatLog.addSystem(theme.dim(`Steer failed: ${errorMessage}`));\n tui.requestRender();\n });\n };\n\n const sendMessage = (text: string) => {\n if (state.isCompacting) {\n state.compactionQueue.push(text);\n chatLog.addSystem(\n theme.dim(`Queued during compaction (${state.compactionQueue.length}). Sends when compact finishes.`),\n );\n bottomBar.invalidate();\n tui.requestRender();\n return;\n }\n\n if (state.activeRunId) {\n chatLog.addSystem(\n 'A response is still in progress. Press Enter to steer, Alt+Enter to queue, or Escape to abort.',\n );\n tui.requestRender();\n return;\n }\n\n chatLog.addUser(text);\n setActivityStatus('sending');\n touchStreamingActivity();\n tui.requestRender();\n\n void client\n .sendChat({\n sessionKey: state.currentSessionKey,\n message: text,\n thinking: opts.thinking,\n })\n .catch((error: unknown) => {\n const errorMessage = error instanceof Error ? error.message : String(error);\n chatLog.addSystem(`❌ Failed to send: ${errorMessage}`);\n setActivityStatus('idle');\n tui.requestRender();\n });\n };\n\n const runCompaction = async () => {\n if (state.isCompacting) return;\n state.isCompacting = true;\n setActivityStatus('compacting');\n chatLog.addSystem(theme.dim('Compacting session…'));\n tui.requestRender();\n try {\n const result = await client.compactSession(state.currentSessionKey, { force: true });\n chatLog.addSystem(result.summary ?? (result.compacted ? 'Session compacted' : 'Nothing to compact'));\n if (result.compacted) {\n assembler.clear();\n clearPendingToolCallIds();\n state.historyLoaded = false;\n await loadSessionHistory();\n }\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n chatLog.addSystem(`❌ Compaction failed: ${errorMessage}`);\n } finally {\n state.isCompacting = false;\n setActivityStatus('idle');\n await refreshSessionInfoWithBorder();\n const queued = state.compactionQueue.shift();\n if (queued && !state.activeRunId) {\n sendMessage(queued);\n }\n updateFooter();\n tui.requestRender();\n }\n };\n\n const applyTuiSettings = (settings: TuiSettings) => {\n tuiSettings = { ...settings };\n saveTuiSettings(tuiSettings);\n state.showThinking = tuiSettings.showThinking;\n state.toolsExpanded = tuiSettings.toolsExpanded;\n chatLog.setToolsExpanded(tuiSettings.toolsExpanded);\n applyThemeById(tuiSettings.theme);\n header.invalidate();\n updateEditorBorderColor();\n syncTerminalProgress();\n bottomBar.invalidate();\n tui.requestRender();\n };\n\n const previewTheme = (themeId: string) => {\n applyThemeById(themeId);\n updateEditorBorderColor();\n tui.requestRender();\n };\n\n const reloadKeybindings = () => {\n keybindings.reload();\n setKeybindings(keybindings);\n tui.requestRender();\n };\n\n const uiOverlays = {\n openSessionPicker: () => {},\n openScopedModels: () => {},\n openSettings: () => {},\n reloadKeybindings: () => reloadKeybindings(),\n };\n\n const handleCommand = createTuiCommandHandler({\n state,\n chatLog,\n tui,\n assembler,\n isLocalMode,\n abortActive,\n sendMessage,\n requestExit,\n updateFooter,\n keybindings,\n uiOverlays,\n runCompaction,\n extensionSlashCommands: extensionRuntime.slashCommands,\n currentAgentId,\n setSession,\n resetSession: resetCurrentSession,\n });\n\n const { runLocalShellLine } = createLocalShellRunner({\n chatLog,\n tui,\n editor,\n openOverlay,\n closeOverlay,\n pauseStdioFilter: () => stdioFilter.pause(),\n resumeStdioFilter: () => stdioFilter.resume(),\n runWithInheritedStdio: async (work) => {\n await withTuiSuspended(tui, work);\n },\n });\n\n const submitCore = createEditorSubmitHandler({\n editor,\n handleCommand,\n sendMessage,\n handleBangLine: runLocalShellLine,\n isAgentBusy,\n steerWhileBusy: steerMessage,\n });\n\n const submitBurst = createSubmitBurstCoalescer({\n submit: submitCore,\n enabled: shouldEnableWindowsGitBashPasteFallback(),\n });\n editor.onSubmit = submitBurst;\n\n const flushFollowUpQueue = () => {\n if (state.exitRequested) return;\n if (state.activeRunId) return;\n const next = state.messageFollowUpQueue.shift();\n if (next === undefined) return;\n sendMessage(next);\n };\n\n const handleFollowUp = () => {\n const text = editor.getText().trim();\n if (!text) return;\n if (isAgentBusy()) {\n editor.addToHistory(text);\n state.messageFollowUpQueue.push(text);\n editor.setText('');\n chatLog.addSystem(\n theme.dim(\n `Queued follow-up (${state.messageFollowUpQueue.length} in queue). Next sends when this reply finishes.`,\n ),\n );\n bottomBar.invalidate();\n tui.requestRender();\n return;\n }\n submitBurst(text);\n };\n\n const handleDequeue = () => {\n if (state.messageFollowUpQueue.length === 0) {\n chatLog.addSystem(theme.dim('No queued messages to restore.'));\n tui.requestRender();\n return;\n }\n const queued = [...state.messageFollowUpQueue];\n state.messageFollowUpQueue.length = 0;\n const current = editor.getText().trim();\n const combined = [queued.join('\\n\\n'), current].filter(Boolean).join('\\n\\n');\n editor.setText(combined);\n chatLog.addSystem(\n theme.dim(\n `Restored ${queued.length} queued message${queued.length > 1 ? 's' : ''} to editor.`,\n ),\n );\n bottomBar.invalidate();\n tui.requestRender();\n };\n\n const setSessionKey = (key: string) => {\n state.currentSessionKey = resolveSessionKey(key);\n updateAgentFromPicker(key);\n };\n\n const updateAgentFromPicker = (key: string) => {\n const parsed = parseAgentSessionKey(resolveSessionKey(key));\n if (parsed?.agentId) {\n currentAgentId = parsed.agentId;\n }\n };\n\n let ctrlCHandling = false;\n const handleCtrlC = () => {\n if (ctrlCHandling) return;\n ctrlCHandling = true;\n try {\n const now = Date.now();\n const decision = resolveCtrlCAction({\n hasInput: editor.getText().trim().length > 0,\n now,\n lastCtrlCAt: state.lastCtrlCAt,\n });\n state.lastCtrlCAt = decision.nextLastCtrlCAt;\n if (decision.action === 'clear') {\n editor.setText('');\n setActivityStatus('cleared input; press ctrl+c again to exit');\n tui.requestRender();\n return;\n }\n if (decision.action === 'exit') {\n requestExit();\n return;\n }\n setActivityStatus('press ctrl+c again to exit');\n tui.requestRender();\n } finally {\n ctrlCHandling = false;\n }\n };\n\n const setModelChoices = (models: TuiModelChoice[]) => {\n modelChoices = models;\n };\n\n const pickerSvc = {\n tui,\n editor,\n openOverlay,\n closeOverlay,\n chatLog,\n client,\n sendMessage,\n refreshSessionInfo,\n updateHeader,\n state,\n setSessionKey,\n clearChatForSessionSwitch,\n loadSessionHistory,\n setModelChoices,\n getScopedModelRefs: () => state.scopedModelRefs,\n setScopedModelRefs: (refs: string[] | null) => {\n state.scopedModelRefs = refs;\n saveScopedModelRefs(refs);\n },\n refreshCycleModels,\n getTuiSettings: () => ({ ...tuiSettings }),\n applyTuiSettings,\n previewTheme,\n reloadKeybindings,\n };\n\n uiOverlays.openSessionPicker = () => void openSessionPickerOverlay(pickerSvc);\n uiOverlays.openScopedModels = () => void openScopedModelsOverlay(pickerSvc);\n uiOverlays.openSettings = () => openSettingsOverlay(pickerSvc);\n\n const handleDoubleEscape = () => {\n switch (tuiSettings.doubleEscapeAction) {\n case 'tree':\n chatLog.addSystem(theme.dim('Session tree is not available in xopc TUI yet.'));\n break;\n case 'fork':\n chatLog.addSystem(theme.dim('Session fork is not available in xopc TUI yet.'));\n break;\n default:\n break;\n }\n tui.requestRender();\n };\n\n editor.onEscape = () => {\n if (state.activeRunId) {\n void abortActive();\n return;\n }\n if (editor.getText().trim().length > 0) return;\n const now = Date.now();\n if (now - state.lastEscapeAt <= DOUBLE_ESCAPE_WINDOW_MS) {\n state.lastEscapeAt = 0;\n handleDoubleEscape();\n return;\n }\n state.lastEscapeAt = now;\n };\n editor.onCtrlD = () => requestExit();\n\n editor.onAction('app.clear', handleCtrlC);\n editor.onAction('app.exit', () => requestExit());\n editor.onAction('app.suspend', handleCtrlZ);\n editor.onAction('app.thinking.cycle', () => {\n const cur = state.sessionInfo.thinkingLevel ?? opts.thinking ?? 'medium';\n sendMessage(`/think ${nextThinkLevel(cur)}`);\n updateEditorBorderColor();\n });\n editor.onAction('app.model.cycleForward', () => cycleModel('forward'));\n editor.onAction('app.model.cycleBackward', () => cycleModel('backward'));\n editor.onAction('app.model.select', () => void openModelPickerOverlay(pickerSvc));\n editor.onAction('app.session.resume', () => void openSessionPickerOverlay(pickerSvc));\n editor.onAction('app.tools.expand', () => {\n state.toolsExpanded = !state.toolsExpanded;\n tuiSettings = { ...tuiSettings, toolsExpanded: state.toolsExpanded };\n saveTuiSettings(tuiSettings);\n chatLog.setToolsExpanded(state.toolsExpanded);\n setActivityStatus(state.toolsExpanded ? 'tools expanded' : 'tools collapsed');\n tui.requestRender();\n });\n editor.onAction('app.thinking.toggle', () => {\n state.showThinking = !state.showThinking;\n tuiSettings = { ...tuiSettings, showThinking: state.showThinking };\n saveTuiSettings(tuiSettings);\n updateFooter();\n tui.requestRender();\n });\n editor.onAction('app.editor.external', openExternalEditor);\n editor.onPasteImage = () => {\n void (async () => {\n const filePath = await saveClipboardImageToTempFile();\n if (!filePath) return;\n editor.insertTextAtCursor(filePath);\n chatLog.addSystem(theme.dim(`Pasted image path: ${filePath}`));\n tui.requestRender();\n })();\n };\n editor.onAction('app.message.followUp', handleFollowUp);\n editor.onAction('app.message.dequeue', handleDequeue);\n\n streamWatchdogId = setInterval(() => {\n if (!state.activeRunId) return;\n if (!busyStates.has(state.activityStatus)) return;\n if (Date.now() - lastStreamActivityAt < DEFAULT_STREAMING_WATCHDOG_MS) return;\n\n const rid = state.activeRunId;\n const finalText = assembler.finalize(rid, state.showThinking);\n if (finalText) {\n chatLog.finalizeAssistant(finalText, rid);\n }\n chatLog.addSystem(\n '⚠️ No stream activity for 30s; UI reset (connection may have stalled). Retry or check gateway.',\n );\n state.activeRunId = null;\n setActivityStatus('idle');\n void refreshSessionInfoWithBorder().finally(() => {\n updateFooter();\n tui.requestRender();\n });\n flushFollowUpQueue();\n tui.requestRender();\n }, 5000);\n\n const onAgentRunEnded = () => {\n state.progressMessage = null;\n void refreshSessionInfoWithBorder().finally(() => {\n updateFooter();\n tui.requestRender();\n });\n flushFollowUpQueue();\n };\n\n client.onEvent = (evt: TuiEvent) => {\n const data = (evt.data ?? {}) as Record<string, unknown>;\n dispatchAgentSSE(\n evt.event,\n data,\n state,\n chatLog,\n assembler,\n tui,\n setActivityStatus,\n touchStreamingActivity,\n onAgentRunEnded,\n );\n };\n\n client.onConnected = () => {\n state.isConnected = true;\n setConnectionStatus(isLocalMode ? 'local ready' : 'gateway connected');\n touchStreamingActivity();\n void (async () => {\n await refreshSessionInfoWithBorder();\n await refreshModelChoices();\n await loadSessionHistory();\n updateHeader();\n updateFooter();\n tui.requestRender();\n if (!state.autoMessageSent && opts.message) {\n state.autoMessageSent = true;\n sendMessage(opts.message);\n }\n })();\n };\n\n client.onDisconnected = (reason: string) => {\n const wasConnected = state.isConnected;\n state.isConnected = false;\n touchStreamingActivity();\n if (isLocalMode) {\n setConnectionStatus(`local stopped: ${reason}`);\n } else {\n const hint =\n wasConnected || state.historyLoaded\n ? ` (${reason}). Reconnecting broadcast stream…`\n : `. Ensure gateway is running (xopc gateway) or use --local.`;\n setConnectionStatus(`disconnected${hint}`);\n if (!wasConnected && !state.historyLoaded) {\n const gatewayUrl = opts.url ?? 'http://localhost:3120';\n chatLog.addSystem(\n `Cannot reach gateway at ${gatewayUrl}.\\n` +\n 'Start the gateway (`xopc gateway`) or run `xopc tui --local` for embedded mode.',\n );\n }\n }\n tui.requestRender();\n };\n\n client.onGap = (info) => {\n chatLog.addSystem(\n `⚠️ Event gap: expected ${info.expected}, received ${info.received}. Some updates may be missing.`,\n );\n setConnectionStatus(`event gap: expected ${info.expected}, got ${info.received}`);\n tui.requestRender();\n };\n\n const sigintHandler = () => handleCtrlC();\n const sigtermHandler = () => requestExit();\n process.on('SIGINT', sigintHandler);\n process.on('SIGTERM', sigtermHandler);\n\n updateHeader();\n updateEditorBorderColor();\n setConnectionStatus(isLocalMode ? 'starting local runtime' : 'connecting');\n updateFooter();\n await extensionRuntime.activate();\n tui.start();\n client.start();\n\n await new Promise<void>((resolve) => {\n finishTui = () => {\n process.removeListener('SIGINT', sigintHandler);\n process.removeListener('SIGTERM', sigtermHandler);\n if (streamWatchdogId) {\n clearInterval(streamWatchdogId);\n streamWatchdogId = null;\n }\n finishTui = null;\n resolve();\n };\n });\n\n return exitResult;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAeuE;AAwEvE,MAAM,oBAAkC;CACtC;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,SAAS,eAAe,SAAyC;CAC/D,MAAM,KAAK,WAAW,UAAU,aAAa;CAC7C,MAAM,MAAM,kBAAkB,QAAQ,EAAgB;CACtD,MAAM,YAAY,kBAAkB,QAAQ,SAAS;AAErD,QAAO,oBADM,OAAO,IAAI,MAAM,aAAa,IAAI,YAAY,KAC1B,KAAK,kBAAkB;;AAG1D,MAAM,0BAA0B;AAEhC,eAAsB,OAAO,MAAsC;CACjE,MAAM,cAAc,uBAAuB;CAC3C,MAAM,qBAAqB,YAAY,SAAS;CAEhD,MAAM,cAAc,KAAK,UAAU;CAEnC,MAAM,UAAU,4BAA4B;EAC1C,KAFa,YAEF;EACX,eAAe,KAAK;EACpB,KAAK,QAAQ,KAAK;EACnB,CAAC;CACF,IAAI,iBAAiB,QAAQ;CAC7B,MAAM,eAAe,QAAQ;CAC7B,MAAM,iBAAiB,QAAQ;CAC/B,MAAM,qBAAqB,QACzB,qBAAqB;EACnB;EACA;EACA;EACA;EACD,CAAC;CACJ,IAAI,cAAc,iBAAiB;AACnC,cAAa,EAAE,SAAS,KAAK,SAAS,YAAY,OAAO,CAAC;CAC1D,MAAM,QAAQ,mBAAmB,QAAQ,WAAW;AACpD,OAAM,kBAAkB,qBAAqB;AAC7C,OAAM,eAAe,YAAY;AACjC,OAAM,gBAAgB,YAAY;CAClC,MAAM,YAAY,IAAI,iBAAiB;CAEvC,IAAI;AACJ,KAAI,YACF,qBAAoB,MAAM,+BAA+B;CAG3D,MAAM,SAAqB,cACvB,IAAI,gBAAgB,EAAE,mBAAmB,CAAC,GAC1C,IAAI,kBAAkB;EAAE,KAAK,KAAK,OAAO;EAAyB,OAAO,KAAK;EAAO,CAAC;CAE1F,MAAM,cAAc,iCAAiC;AACrD,gBAAe,YAAY;CAE3B,IAAI,eAAiC,EAAE;CACvC,MAAM,0BACJ,qBAAqB,cAAc,MAAM,gBAAgB;CAE3D,MAAM,2BAA2B;AAC/B,YAAU,YAAY;AACtB,MAAI,eAAe;;CAGrB,MAAM,MAAM,IAAI,IAAI,IAAI,iBAAiB,CAAC;CAC1C,MAAM,kBAAkB,wBAAwB;AAChD,KAAI,kBAAkB,SAAS;EAC7B,MAAM,OAAO,gBAAgB,KAAK;AAClC,MAAI,KAAK,WAAW,EAClB,QAAO,EAAE,SAAS,MAAM;AAE1B,SAAO,EAAE,MAAM,MAAM;GACrB;CAEF,MAAM,SAAS,IAAI,iBAAiB;EAClC,SAASA,WAAuB;EAChC,iBAAiB,OAAO;EACxB,YAAY,MAAM;EAClB,WAAW,YAAY;EACxB,EAAE;CACH,MAAM,kBAAkB,IAAI,WAAW;CACvC,MAAM,YAAY,IAAI,mBAAmB,aAAa,KAAK,SAAS;CACpE,MAAM,UAAU,IAAI,SAAS;AAC7B,SAAQ,iBAAiB,MAAM,cAAc;CAC7C,MAAM,SAAS,IAAI,aAAa,KAAK,aAAa,YAAY;CAC9D,MAAM,OAAO,IAAI,WAAW;AAC5B,MAAK,SAAS,OAAO;AACrB,MAAK,SAAS,QAAQ;AACtB,MAAK,SAAS,gBAAgB;AAC9B,MAAK,SAAS,OAAO;AACrB,MAAK,SAAS,UAAU;AACxB,KAAI,SAAS,KAAK;AAClB,KAAI,SAAS,OAAO;CAEpB,IAAI,aAAa;CACjB,IAAI,uBAAuB;CAE3B,MAAM,gCAAgC;AACpC,MAAI,WACF,QAAO,cAAc,uBACjB,2BAA2B,GAC3B,wBAAwB;MAG5B,QAAO,cAAc,uBADP,MAAM,YAAY,iBAAiB,KAAK,YAAY,MAChB;AAEpD,MAAI,eAAe;;AAGrB,QAAO,YAAY,SAAiB;EAClC,MAAM,UAAU,KAAK,WAAW;EAChC,MAAM,cAAc,QAAQ,WAAW,KAAK;EAC5C,MAAM,WAAW,QAAQ,WAAW,IAAI;AACxC,MAAI,aAAa,cAAc,gBAAgB,sBAAsB;AACnE,gBAAa;AACb,0BAAuB;AACvB,4BAAyB;;;CAI7B,MAAM,EAAE,aAAa,iBAAiB,sBAAsB,KAAK,OAAO;CAExE,MAAM,gBAAgB,iBAAiB,YAAY;CAEnD,MAAM,mBAAmB,0BAA0B;EACjD,UAAU;EACV;EACA;EACA;EACA;EACA,gBAAgB;EAChB,mBAAmB;EACnB,KAAK,QAAQ,KAAK;EAClB,QAAQ,eAAe;EACvB;EACA;EACA,oBAAoB;AAClB,iBAAc;AACd,iBAAc;AACd,OAAI,eAAe;;EAEtB,CAAC;AAEF,QAAO,wBAAwB,iBAAiB,qBAAqB;CAErE,IAAI,eAA8B;CAClC,IAAI,kBAAiC;CACrC,IAAI,qBAAqB;CACzB,IAAI,iBAAwD;CAC5D,MAAM,aAAa,IAAI,IAAI;EAAC;EAAW;EAAW;EAAa;EAAW;EAAa,CAAC;CAExF,MAAM,6BAA6B;AACjC,MAAI,CAAC,YAAY,sBAAsB;AACrC,OAAI,SAAS,YAAY,MAAM;AAC/B;;AAEF,MAAI,SAAS,YAAY,WAAW,IAAI,MAAM,eAAe,CAAC;;CAGhE,IAAI,uBAAuB,KAAK,KAAK;CACrC,IAAI,mBAA0D;CAE9D,MAAM,+BAA+B;AACnC,yBAAuB,KAAK,KAAK;;CAGnC,MAAM,iBAAiB,YAAoB;EACzC,MAAM,eAAe,KAAK,IAAI,GAAG,KAAK,OAAO,KAAK,KAAK,GAAG,WAAW,IAAK,CAAC;AAC3E,MAAI,eAAe,GAAI,QAAO,GAAG,aAAa;AAG9C,SAAO,GAFS,KAAK,MAAM,eAAe,GAEzB,CAAC,IADF,eAAe,GACD;;CAGhC,MAAM,qBAAqB;AAEzB,MADe,WAAW,IAAI,MAAM,eAC1B,EAAE;AACV,OAAI,CAAC,mBAAmB,uBAAuB,MAAM,eACnD,mBAAkB,KAAK,KAAK;AAE9B,OAAI,CAAC,cAAc;AACjB,oBAAgB,OAAO;AACvB,mBAAe,IAAI,OACjB,MACC,YAAY,MAAM,OAAO,QAAQ,GACjC,SAAS,MAAM,KAAK,MAAM,WAAW,KAAK,CAAC,EAC5C,GACD;AACD,oBAAgB,SAAS,aAAa;;GAExC,MAAM,UAAU,cAAc,gBAAgB;AAC9C,gBAAa,WACX,GAAG,MAAM,mBAAmB,MAAM,eAAe,KAAK,QAAQ,KAAK,MAAM,mBAC1E;AACD,OAAI,CAAC,eACH,kBAAiB,kBAAkB;AACjC,QAAI,mBAAmB,cAAc;KACnC,MAAM,KAAK,cAAc,gBAAgB;AACzC,kBAAa,WACX,GAAG,MAAM,mBAAmB,MAAM,eAAe,KAAK,GAAG,KAAK,MAAM,mBACrE;;MAEF,IAAK;SAEL;AACL,SAAM,kBAAkB;AACxB,qBAAkB;AAClB,OAAI,gBAAgB;AAClB,kBAAc,eAAe;AAC7B,qBAAiB;;AAEnB,iBAAc,MAAM;AACpB,kBAAe;AACf,mBAAgB,OAAO;;AAEzB,uBAAqB,MAAM;AAC3B,YAAU,YAAY;AACtB,wBAAsB;AACtB,MAAI,eAAe;;CAGrB,MAAM,qBAAqB,WAAmB;AAC5C,QAAM,iBAAiB;AACvB,gBAAc;;CAGhB,MAAM,uBAAuB,SAAiB;AAC5C,QAAM,mBAAmB;AACzB,gBAAc;;CAGhB,MAAM,qBAAqB;AACzB,SAAO,YAAY;AACnB,qBAAmB;;CAGrB,MAAM,0BAA0B;EAC9B,MAAM,WACJ,MAAM,kBAAkB,SAAS,KAC7B,GAAG,MAAM,kBAAkB,MAAM,GAAG,GAAG,CAAC,KACxC,MAAM;AACZ,MAAI,SAAS,SAAS,UAAU,WAAW;;CAG7C,MAAM,qBAAqB;AACzB,YAAU,YAAY;;CAGxB,MAAM,sBAAsB,YAAY;AACtC,MAAI;AACF,kBAAe,MAAM,OAAO,YAAY;UAClC;AACN,kBAAe,EAAE;;AAEnB,YAAU,YAAY;AACtB,MAAI,eAAe;;CAGrB,IAAI,YAAiC;CACrC,IAAI,aAAwB,EAAE,YAAY,QAAQ;CAElD,MAAM,oBAAoB;AACxB,MAAI,MAAM,cAAe;AACzB,QAAM,gBAAgB;AACtB,MAAI,gBAAgB;AAClB,iBAAc,eAAe;AAC7B,oBAAiB;;AAEnB,MAAI,kBAAkB;AACpB,iBAAc,iBAAiB;AAC/B,sBAAmB;;AAErB,SAAO,MAAM;AACb,MAAI,SAAS,YAAY,MAAM;AAC1B,wBAAsB,IAAI,CAAC,WAAW;AACzC,iBAAc;AACd,gBAAa;AACb,WAAQ,KAAK,EAAE;IACf;;CAkBJ,MAAM,EACJ,oBACA,aAAa,oBACb,YACA,aACA,qBACA,8BArBqB,qBAAqB;EAC1C;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,kBAAkB,YAAY;AAC5B,oBAAiB;;EAEpB,CASiB;CAElB,MAAM,+BAA+B,YAAY;AAC/C,QAAM,oBAAoB;AAC1B,2BAAyB;;CAG3B,MAAM,gCAAwC;EAC5C,MAAM,UAAU,mBAAmB;AACnC,MAAI,QAAQ,WAAW,EAAG,QAAO;EACjC,MAAM,IAAI,MAAM,YAAY;EAC5B,MAAM,IAAI,MAAM,YAAY;AAC5B,MAAI,KAAK,GAAG;GACV,MAAM,UAAU,QAAQ,WAAW,MAAM,EAAE,aAAa,KAAK,EAAE,OAAO,EAAE;AACxE,OAAI,WAAW,EAAG,QAAO;;AAE3B,MAAI,GAAG,SAAS,IAAI,EAAE;GACpB,MAAM,CAAC,GAAG,KAAK,EAAE,MAAM,KAAK,EAAE;GAC9B,MAAM,UAAU,QAAQ,WAAW,MAAM,EAAE,aAAa,KAAK,EAAE,OAAO,EAAE;AACxE,OAAI,WAAW,EAAG,QAAO;;AAE3B,SAAO;;CAGT,MAAM,cAAc,QAAgC;EAClD,MAAM,UAAU,mBAAmB;AACnC,MAAI,QAAQ,WAAW,GAAG;AACnB,wBAAqB,CAAC,WAAW;AACpC,QAAI,mBAAmB,CAAC,WAAW,GAAG;AACpC,aAAQ,UAAU,gCAAgC;AAClD,SAAI,eAAe;AACnB;;AAEF,eAAW,IAAI;KACf;AACF;;EAEF,MAAM,MAAM,yBAAyB;EAGrC,MAAM,OAAO,UAFA,OAAO,IAAI,MAAM,MAChB,QAAQ,YAAY,IAAI,MACD,QAAQ,UAAU,QAAQ;AAC/D,cAAY,WAAW,KAAK,SAAS,GAAG,KAAK,KAAK;;CAGpD,MAAM,oBAAoB;AACxB,MAAI,QAAQ,aAAa,SAAS;AAChC,WAAQ,UAAU,gDAAgD;AAClE,OAAI,eAAe;AACnB;;EAEF,MAAM,mBAAmB,kBAAkB,IAAI,KAAK,GAAG;EACvD,MAAM,qBAAqB;AAC3B,UAAQ,GAAG,UAAU,aAAa;AAClC,UAAQ,KAAK,iBAAiB;AAC5B,iBAAc,iBAAiB;AAC/B,WAAQ,eAAe,UAAU,aAAa;AAC9C,OAAI,OAAO;AACX,OAAI,SAAS,OAAO;AACpB,OAAI,cAAc,KAAK;IACvB;AACF,MAAI;AACF,OAAI,MAAM;AACV,WAAQ,KAAK,GAAG,UAAU;UACpB;AACN,iBAAc,iBAAiB;AAC/B,WAAQ,eAAe,UAAU,aAAa;;;CAIlD,MAAM,2BAA2B;EAE/B,MAAM,WAAW,KADL,YAAY,KAAK,QAAQ,EAAE,iBAAiB,CAC/B,EAAE,aAAa;AACxC,gBAAc,UAAU,OAAO,SAAS,EAAE,OAAO;EACjD,MAAM,YAAY,QAAQ,IAAI,UAAU,QAAQ,IAAI,UAAU;AAC9D,GAAM,YAAY;AAChB,SAAM,iBAAiB,KAAK,YAAY;AACtC,cAAU,WAAW,CAAC,SAAS,EAAE,EAAE,OAAO,WAAW,CAAC;KACtD;AACF,OAAI;IACF,MAAM,OAAO,aAAa,UAAU,OAAO;AAC3C,WAAO,QAAQ,KAAK,QAAQ,SAAS,KAAK,CAAC;WACrC;AAGR,OAAI;AACF,eAAW,SAAS;WACd;AAGR,OAAI,SAAS,OAAO;AACpB,OAAI,cAAc,KAAK;MACrB;;CAGN,MAAM,oBACJ,MAAM,eAAe,QAAQ,MAAM,gBAAgB,WAAW,IAAI,MAAM,eAAe;CAEzF,MAAM,gBAAgB,SAAiB;AACrC,UAAQ,QAAQ,KAAK;AACrB,0BAAwB;AACxB,MAAI,eAAe;AACd,SACF,UAAU;GAAE,YAAY,MAAM;GAAmB,SAAS;GAAM,CAAC,CACjE,MAAM,EAAE,SAAS;AAChB,OAAI,CAAC,GACH,SAAQ,UACN,MAAM,IACJ,6GACD,CACF;OAED,SAAQ,UACN,MAAM,IAAI,kEAAkE,CAC7E;AAEH,OAAI,eAAe;IACnB,CACD,OAAO,UAAmB;GACzB,MAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AAC3E,WAAQ,UAAU,MAAM,IAAI,iBAAiB,eAAe,CAAC;AAC7D,OAAI,eAAe;IACnB;;CAGN,MAAM,eAAe,SAAiB;AACpC,MAAI,MAAM,cAAc;AACtB,SAAM,gBAAgB,KAAK,KAAK;AAChC,WAAQ,UACN,MAAM,IAAI,6BAA6B,MAAM,gBAAgB,OAAO,iCAAiC,CACtG;AACD,aAAU,YAAY;AACtB,OAAI,eAAe;AACnB;;AAGF,MAAI,MAAM,aAAa;AACrB,WAAQ,UACN,iGACD;AACD,OAAI,eAAe;AACnB;;AAGF,UAAQ,QAAQ,KAAK;AACrB,oBAAkB,UAAU;AAC5B,0BAAwB;AACxB,MAAI,eAAe;AAEd,SACF,SAAS;GACR,YAAY,MAAM;GAClB,SAAS;GACT,UAAU,KAAK;GAChB,CAAC,CACD,OAAO,UAAmB;GACzB,MAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AAC3E,WAAQ,UAAU,qBAAqB,eAAe;AACtD,qBAAkB,OAAO;AACzB,OAAI,eAAe;IACnB;;CAGN,MAAM,gBAAgB,YAAY;AAChC,MAAI,MAAM,aAAc;AACxB,QAAM,eAAe;AACrB,oBAAkB,aAAa;AAC/B,UAAQ,UAAU,MAAM,IAAI,sBAAsB,CAAC;AACnD,MAAI,eAAe;AACnB,MAAI;GACF,MAAM,SAAS,MAAM,OAAO,eAAe,MAAM,mBAAmB,EAAE,OAAO,MAAM,CAAC;AACpF,WAAQ,UAAU,OAAO,YAAY,OAAO,YAAY,sBAAsB,sBAAsB;AACpG,OAAI,OAAO,WAAW;AACpB,cAAU,OAAO;AACjB,6BAAyB;AACzB,UAAM,gBAAgB;AACtB,UAAM,oBAAoB;;WAErB,OAAgB;GACvB,MAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AAC3E,WAAQ,UAAU,wBAAwB,eAAe;YACjD;AACR,SAAM,eAAe;AACrB,qBAAkB,OAAO;AACzB,SAAM,8BAA8B;GACpC,MAAM,SAAS,MAAM,gBAAgB,OAAO;AAC5C,OAAI,UAAU,CAAC,MAAM,YACnB,aAAY,OAAO;AAErB,iBAAc;AACd,OAAI,eAAe;;;CAIvB,MAAM,oBAAoB,aAA0B;AAClD,gBAAc,EAAE,GAAG,UAAU;AAC7B,kBAAgB,YAAY;AAC5B,QAAM,eAAe,YAAY;AACjC,QAAM,gBAAgB,YAAY;AAClC,UAAQ,iBAAiB,YAAY,cAAc;AACnD,iBAAe,YAAY,MAAM;AACjC,SAAO,YAAY;AACnB,2BAAyB;AACzB,wBAAsB;AACtB,YAAU,YAAY;AACtB,MAAI,eAAe;;CAGrB,MAAM,gBAAgB,YAAoB;AACxC,iBAAe,QAAQ;AACvB,2BAAyB;AACzB,MAAI,eAAe;;CAGrB,MAAM,0BAA0B;AAC9B,cAAY,QAAQ;AACpB,iBAAe,YAAY;AAC3B,MAAI,eAAe;;CAGrB,MAAM,aAAa;EACjB,yBAAyB;EACzB,wBAAwB;EACxB,oBAAoB;EACpB,yBAAyB,mBAAmB;EAC7C;CAED,MAAM,gBAAgB,wBAAwB;EAC5C;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,wBAAwB,iBAAiB;EACzC;EACA;EACA,cAAc;EACf,CAAC;CAEF,MAAM,EAAE,sBAAsB,uBAAuB;EACnD;EACA;EACA;EACA;EACA;EACA,wBAAwB,YAAY,OAAO;EAC3C,yBAAyB,YAAY,QAAQ;EAC7C,uBAAuB,OAAO,SAAS;AACrC,SAAM,iBAAiB,KAAK,KAAK;;EAEpC,CAAC;CAWF,MAAM,cAAc,2BAA2B;EAC7C,QAViB,0BAA0B;GAC3C;GACA;GACA;GACA,gBAAgB;GAChB;GACA,gBAAgB;GACjB,CAGmB;EAClB,SAAS,yCAAyC;EACnD,CAAC;AACF,QAAO,WAAW;CAElB,MAAM,2BAA2B;AAC/B,MAAI,MAAM,cAAe;AACzB,MAAI,MAAM,YAAa;EACvB,MAAM,OAAO,MAAM,qBAAqB,OAAO;AAC/C,MAAI,SAAS,KAAA,EAAW;AACxB,cAAY,KAAK;;CAGnB,MAAM,uBAAuB;EAC3B,MAAM,OAAO,OAAO,SAAS,CAAC,MAAM;AACpC,MAAI,CAAC,KAAM;AACX,MAAI,aAAa,EAAE;AACjB,UAAO,aAAa,KAAK;AACzB,SAAM,qBAAqB,KAAK,KAAK;AACrC,UAAO,QAAQ,GAAG;AAClB,WAAQ,UACN,MAAM,IACJ,qBAAqB,MAAM,qBAAqB,OAAO,kDACxD,CACF;AACD,aAAU,YAAY;AACtB,OAAI,eAAe;AACnB;;AAEF,cAAY,KAAK;;CAGnB,MAAM,sBAAsB;AAC1B,MAAI,MAAM,qBAAqB,WAAW,GAAG;AAC3C,WAAQ,UAAU,MAAM,IAAI,iCAAiC,CAAC;AAC9D,OAAI,eAAe;AACnB;;EAEF,MAAM,SAAS,CAAC,GAAG,MAAM,qBAAqB;AAC9C,QAAM,qBAAqB,SAAS;EACpC,MAAM,UAAU,OAAO,SAAS,CAAC,MAAM;EACvC,MAAM,WAAW,CAAC,OAAO,KAAK,OAAO,EAAE,QAAQ,CAAC,OAAO,QAAQ,CAAC,KAAK,OAAO;AAC5E,SAAO,QAAQ,SAAS;AACxB,UAAQ,UACN,MAAM,IACJ,YAAY,OAAO,OAAO,iBAAiB,OAAO,SAAS,IAAI,MAAM,GAAG,aACzE,CACF;AACD,YAAU,YAAY;AACtB,MAAI,eAAe;;CAGrB,MAAM,iBAAiB,QAAgB;AACrC,QAAM,oBAAoB,kBAAkB,IAAI;AAChD,wBAAsB,IAAI;;CAG5B,MAAM,yBAAyB,QAAgB;EAC7C,MAAM,SAAS,qBAAqB,kBAAkB,IAAI,CAAC;AAC3D,MAAI,QAAQ,QACV,kBAAiB,OAAO;;CAI5B,IAAI,gBAAgB;CACpB,MAAM,oBAAoB;AACxB,MAAI,cAAe;AACnB,kBAAgB;AAChB,MAAI;GACF,MAAM,MAAM,KAAK,KAAK;GACtB,MAAM,WAAW,mBAAmB;IAClC,UAAU,OAAO,SAAS,CAAC,MAAM,CAAC,SAAS;IAC3C;IACA,aAAa,MAAM;IACpB,CAAC;AACF,SAAM,cAAc,SAAS;AAC7B,OAAI,SAAS,WAAW,SAAS;AAC/B,WAAO,QAAQ,GAAG;AAClB,sBAAkB,4CAA4C;AAC9D,QAAI,eAAe;AACnB;;AAEF,OAAI,SAAS,WAAW,QAAQ;AAC9B,iBAAa;AACb;;AAEF,qBAAkB,6BAA6B;AAC/C,OAAI,eAAe;YACX;AACR,mBAAgB;;;CAIpB,MAAM,mBAAmB,WAA6B;AACpD,iBAAe;;CAGjB,MAAM,YAAY;EAChB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,0BAA0B,MAAM;EAChC,qBAAqB,SAA0B;AAC7C,SAAM,kBAAkB;AACxB,uBAAoB,KAAK;;EAE3B;EACA,uBAAuB,EAAE,GAAG,aAAa;EACzC;EACA;EACA;EACD;AAED,YAAW,0BAA0B,KAAK,yBAAyB,UAAU;AAC7E,YAAW,yBAAyB,KAAK,wBAAwB,UAAU;AAC3E,YAAW,qBAAqB,oBAAoB,UAAU;CAE9D,MAAM,2BAA2B;AAC/B,UAAQ,YAAY,oBAApB;GACE,KAAK;AACH,YAAQ,UAAU,MAAM,IAAI,iDAAiD,CAAC;AAC9E;GACF,KAAK;AACH,YAAQ,UAAU,MAAM,IAAI,iDAAiD,CAAC;AAC9E;GACF,QACE;;AAEJ,MAAI,eAAe;;AAGrB,QAAO,iBAAiB;AACtB,MAAI,MAAM,aAAa;AAChB,gBAAa;AAClB;;AAEF,MAAI,OAAO,SAAS,CAAC,MAAM,CAAC,SAAS,EAAG;EACxC,MAAM,MAAM,KAAK,KAAK;AACtB,MAAI,MAAM,MAAM,gBAAgB,yBAAyB;AACvD,SAAM,eAAe;AACrB,uBAAoB;AACpB;;AAEF,QAAM,eAAe;;AAEvB,QAAO,gBAAgB,aAAa;AAEpC,QAAO,SAAS,aAAa,YAAY;AACzC,QAAO,SAAS,kBAAkB,aAAa,CAAC;AAChD,QAAO,SAAS,eAAe,YAAY;AAC3C,QAAO,SAAS,4BAA4B;AAE1C,cAAY,UAAU,eADV,MAAM,YAAY,iBAAiB,KAAK,YAAY,SACvB,GAAG;AAC5C,2BAAyB;GACzB;AACF,QAAO,SAAS,gCAAgC,WAAW,UAAU,CAAC;AACtE,QAAO,SAAS,iCAAiC,WAAW,WAAW,CAAC;AACxE,QAAO,SAAS,0BAA0B,KAAK,uBAAuB,UAAU,CAAC;AACjF,QAAO,SAAS,4BAA4B,KAAK,yBAAyB,UAAU,CAAC;AACrF,QAAO,SAAS,0BAA0B;AACxC,QAAM,gBAAgB,CAAC,MAAM;AAC7B,gBAAc;GAAE,GAAG;GAAa,eAAe,MAAM;GAAe;AACpE,kBAAgB,YAAY;AAC5B,UAAQ,iBAAiB,MAAM,cAAc;AAC7C,oBAAkB,MAAM,gBAAgB,mBAAmB,kBAAkB;AAC7E,MAAI,eAAe;GACnB;AACF,QAAO,SAAS,6BAA6B;AAC3C,QAAM,eAAe,CAAC,MAAM;AAC5B,gBAAc;GAAE,GAAG;GAAa,cAAc,MAAM;GAAc;AAClE,kBAAgB,YAAY;AAC5B,gBAAc;AACd,MAAI,eAAe;GACnB;AACF,QAAO,SAAS,uBAAuB,mBAAmB;AAC1D,QAAO,qBAAqB;AAC1B,GAAM,YAAY;GAChB,MAAM,WAAW,MAAM,8BAA8B;AACrD,OAAI,CAAC,SAAU;AACf,UAAO,mBAAmB,SAAS;AACnC,WAAQ,UAAU,MAAM,IAAI,sBAAsB,WAAW,CAAC;AAC9D,OAAI,eAAe;MACjB;;AAEN,QAAO,SAAS,wBAAwB,eAAe;AACvD,QAAO,SAAS,uBAAuB,cAAc;AAErD,oBAAmB,kBAAkB;AACnC,MAAI,CAAC,MAAM,YAAa;AACxB,MAAI,CAAC,WAAW,IAAI,MAAM,eAAe,CAAE;AAC3C,MAAI,KAAK,KAAK,GAAG,uBAAA,IAAsD;EAEvE,MAAM,MAAM,MAAM;EAClB,MAAM,YAAY,UAAU,SAAS,KAAK,MAAM,aAAa;AAC7D,MAAI,UACF,SAAQ,kBAAkB,WAAW,IAAI;AAE3C,UAAQ,UACN,iGACD;AACD,QAAM,cAAc;AACpB,oBAAkB,OAAO;AACpB,gCAA8B,CAAC,cAAc;AAChD,iBAAc;AACd,OAAI,eAAe;IACnB;AACF,sBAAoB;AACpB,MAAI,eAAe;IAClB,IAAK;CAER,MAAM,wBAAwB;AAC5B,QAAM,kBAAkB;AACnB,gCAA8B,CAAC,cAAc;AAChD,iBAAc;AACd,OAAI,eAAe;IACnB;AACF,sBAAoB;;AAGtB,QAAO,WAAW,QAAkB;EAClC,MAAM,OAAQ,IAAI,QAAQ,EAAE;AAC5B,mBACE,IAAI,OACJ,MACA,OACA,SACA,WACA,KACA,mBACA,wBACA,gBACD;;AAGH,QAAO,oBAAoB;AACzB,QAAM,cAAc;AACpB,sBAAoB,cAAc,gBAAgB,oBAAoB;AACtE,0BAAwB;AACxB,GAAM,YAAY;AAChB,SAAM,8BAA8B;AACpC,SAAM,qBAAqB;AAC3B,SAAM,oBAAoB;AAC1B,iBAAc;AACd,iBAAc;AACd,OAAI,eAAe;AACnB,OAAI,CAAC,MAAM,mBAAmB,KAAK,SAAS;AAC1C,UAAM,kBAAkB;AACxB,gBAAY,KAAK,QAAQ;;MAEzB;;AAGN,QAAO,kBAAkB,WAAmB;EAC1C,MAAM,eAAe,MAAM;AAC3B,QAAM,cAAc;AACpB,0BAAwB;AACxB,MAAI,YACF,qBAAoB,kBAAkB,SAAS;OAC1C;AAKL,uBAAoB,eAHlB,gBAAgB,MAAM,gBAClB,KAAK,OAAO,qCACZ,+DACoC;AAC1C,OAAI,CAAC,gBAAgB,CAAC,MAAM,eAAe;IACzC,MAAM,aAAa,KAAK,OAAO;AAC/B,YAAQ,UACN,2BAA2B,WAAW,wFAEvC;;;AAGL,MAAI,eAAe;;AAGrB,QAAO,SAAS,SAAS;AACvB,UAAQ,UACN,0BAA0B,KAAK,SAAS,aAAa,KAAK,SAAS,gCACpE;AACD,sBAAoB,uBAAuB,KAAK,SAAS,QAAQ,KAAK,WAAW;AACjF,MAAI,eAAe;;CAGrB,MAAM,sBAAsB,aAAa;CACzC,MAAM,uBAAuB,aAAa;AAC1C,SAAQ,GAAG,UAAU,cAAc;AACnC,SAAQ,GAAG,WAAW,eAAe;AAErC,eAAc;AACd,0BAAyB;AACzB,qBAAoB,cAAc,2BAA2B,aAAa;AAC1E,eAAc;AACd,OAAM,iBAAiB,UAAU;AACjC,KAAI,OAAO;AACX,QAAO,OAAO;AAEd,OAAM,IAAI,SAAe,YAAY;AACnC,oBAAkB;AAChB,WAAQ,eAAe,UAAU,cAAc;AAC/C,WAAQ,eAAe,WAAW,eAAe;AACjD,OAAI,kBAAkB;AACpB,kBAAc,iBAAiB;AAC/B,uBAAmB;;AAErB,eAAY;AACZ,YAAS;;GAEX;AAEF,QAAO"}
|
|
1
|
+
{"version":3,"file":"tui.js","names":["packageJson.version"],"sources":["../../../src/tui/tui.ts"],"sourcesContent":["import {\n Container,\n Loader,\n type LoaderIndicatorOptions,\n ProcessTerminal,\n setKeybindings,\n TUI,\n type Component,\n type EditorComponent,\n type OverlayHandle,\n type OverlayOptions,\n} from '@earendil-works/pi-tui';\nimport type { AgentMessage } from '@earendil-works/pi-agent-core';\nimport { Buffer } from 'node:buffer';\nimport { randomUUID } from 'node:crypto';\nimport { mkdirSync, mkdtempSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { dirname, isAbsolute, join, resolve } from 'node:path';\nimport { spawnSync } from 'node:child_process';\n\nimport type {\n ReasoningLevel,\n ThinkLevel,\n VerboseLevel,\n} from '../agent/transcript/thinking-types.js';\nimport { resolveEffectiveAgentProfileForSession } from '../config/agent-profile.js';\nimport { loadConfig } from '../config/index.js';\nimport { resolveStateDir, resolveXopcDatabasePath } from '../config/paths.js';\nimport {\n MAX_CHAT_ATTACHMENTS,\n MAX_WEBCHAT_ATTACHMENT_FILE_BYTES,\n} from '../gateway/chat-limits.js';\nimport { resolveTuiSessionKey, resolveTuiStartupSessionKey } from '../routing/resolve-tui-session-key.js';\nimport { parseAgentSessionKey } from '../routing/agent-session-key.js';\nimport type {\n TuiBackend,\n TuiCompactionResult,\n TuiEvent,\n TuiExportFormat,\n TuiInboundAttachment,\n TuiModelChoice,\n TuiShareRequest,\n TuiStartupResources,\n} from './tui-backend.js';\nimport { EmbeddedBackend } from './backends/embedded-backend.js';\nimport { GatewaySseBackend } from './backends/gateway-sse-backend.js';\nimport {\n clearSeenStreamEvents,\n clearSeenStreamEventsForRun,\n DEFAULT_STREAMING_WATCHDOG_MS,\n dispatchAgentEvent,\n} from './tui-agent-events.js';\nimport { ChatLog } from './components/chat-log.js';\nimport { CustomEditor } from './components/custom-editor.js';\nimport { TuiBottomBar } from './components/tui-bottom-bar.js';\nimport { TuiHeader } from './components/tui-header.js';\nimport {\n createTuiCommandHandler,\n getSlashCommands,\n} from './tui-commands.js';\nimport {\n formatTuiCompactionResult,\n formatTuiShareResult,\n type TuiExportRequest,\n type TuiImportRequest,\n} from './tui-command-formatters.js';\nimport { createLocalShellRunner } from './tui-local-shell.js';\nimport { drainFollowUpQueue, restoreQueuedMessages } from './tui-follow-up-queue.js';\nimport {\n createBackspaceDeduper,\n drainAndStopTuiSafely,\n resolveCtrlCAction,\n} from './tui-lifecycle.js';\nimport {\n openAgentPickerOverlay,\n openProjectTrustOverlay,\n openScopedModelsOverlay,\n openSessionPickerOverlay,\n openSessionTreeOverlay,\n openSettingsOverlay,\n openTranscriptTreeOverlay,\n openThinkingSelectorOverlay,\n openUserMessageForkOverlay,\n} from './tui-picker-overlay.js';\nimport { openModelPickerOverlay } from './tui-model-picker.js';\nimport { runTuiOAuthLogin } from './tui-oauth-login.js';\nimport {\n createEditorSubmitHandler,\n createSubmitBurstCoalescer,\n shouldEnableWindowsGitBashPasteFallback,\n} from './tui-submit.js';\nimport { installTuiStdioFilter } from './tui-stdio-filter.js';\nimport { withTuiSuspended } from './tui-suspend.js';\nimport { extensionForImageMimeType, readClipboardImage } from './clipboard-image.js';\nimport { copyTextToClipboard } from './clipboard-text.js';\nimport {\n applyThemeById,\n getCustomThemesDir,\n getThemeExports,\n getBashExcludeBorderColor,\n getBashModeBorderColor,\n getThinkingBorderColor,\n initTuiTheme,\n listAvailableThemeIds,\n resolveThemePalette,\n} from './theme-manager.js';\nimport { editorTheme, theme } from './theme.js';\nimport { loadTuiSettings, saveTuiSettings, type TuiSettings } from './tui-settings.js';\nimport { resolveFdPath } from './tui-fd-path.js';\nimport packageJson from '../../package.json' with { type: 'json' };\nimport { createSessionActions } from './tui-session-actions.js';\nimport { createInitialState, type TuiOptions, type TuiResult, type TuiState } from './tui-types.js';\nimport { createXopcTuiKeybindingsManager } from './tui-keybindings-file.js';\nimport { formatKeyIds } from './format-tui-hotkeys.js';\nimport { formatTuiStartupText } from './tui-startup-text.js';\nimport {\n filterModelsForCycle,\n loadScopedModelRefs,\n saveScopedModelRefs,\n} from './tui-scoped-models.js';\nimport {\n formatBusyResponseHint,\n formatSteerUnavailableHint,\n formatSuspendUnsupportedHint,\n} from './tui-runtime-hints.js';\nimport { loadExtensionsForTuiLocalMode } from './extension-host/load-extensions.js';\nimport { createTuiExtensionRuntime } from './extension-host/runtime.js';\nimport { TuiSessionSnapshot } from './tui-session-snapshot.js';\nimport {\n extensionCustomMessageContentToText,\n extensionCustomMessageToTurnText,\n extensionUserMessageContentToText,\n} from './tui-extension-user-message.js';\nimport type { ExtensionRegistryImpl } from '../extensions/loader.js';\nimport type {\n ExtensionCustomMessage,\n ExtensionSendMessageOptions,\n ExtensionSendUserMessageOptions,\n ExtensionUserMessageContent,\n} from '../extensions/types/core.js';\nimport type {\n TuiEditorFactory,\n TuiForkOptions,\n TuiModelRegistryModel,\n TuiNavigateTreeOptions,\n TuiNewSessionOptions,\n TuiReasoningLevel,\n TuiReplacedSessionContext,\n TuiReplacementResult,\n TuiSwitchSessionOptions,\n TuiThinkingLevel,\n TuiVerboseLevel,\n} from '../extensions/types/tui.js';\nimport { getAllModels, getAllProviders, getApiKey, isProviderConfiguredSync } from '../providers/index.js';\nimport {\n hasTrustRequiringProjectResources,\n ProjectTrustStore,\n} from '../project-trust/trust-store.js';\nimport { transcriptTreeEntryIdToRowNumber } from './tui-transcript-tree.js';\nimport {\n isActiveRunStreamStale,\n markActiveRunStalled,\n markRunSending,\n markRunRecovering,\n markRunRecoveryComplete,\n} from './tui-run-state.js';\n\nexport type { TuiOptions, TuiResult };\n\nexport {\n createBackspaceDeduper,\n drainAndStopTuiSafely,\n type DrainableTui,\n isIgnorableTuiStopError,\n resolveCtrlCAction,\n stopTuiSafely,\n} from './tui-lifecycle.js';\n\nexport { withTuiSuspended } from './tui-suspend.js';\n\nconst THINK_LEVEL_CYCLE: ThinkLevel[] = [\n 'off',\n 'minimal',\n 'low',\n 'medium',\n 'high',\n 'xhigh',\n 'adaptive',\n];\n\nfunction nextThinkLevel(current: string | undefined): ThinkLevel {\n const c = (current ?? 'medium').toLowerCase();\n const idx = THINK_LEVEL_CYCLE.indexOf(c as ThinkLevel);\n const mediumIdx = THINK_LEVEL_CYCLE.indexOf('medium');\n const base = idx >= 0 ? idx : mediumIdx >= 0 ? mediumIdx : 0;\n return THINK_LEVEL_CYCLE[(base + 1) % THINK_LEVEL_CYCLE.length]!;\n}\n\nconst DOUBLE_ESCAPE_WINDOW_MS = 500;\n\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"');\n}\n\nfunction exportExtension(format: TuiExportFormat): string {\n if (format === 'json') return 'json';\n if (format === 'markdown') return 'md';\n return 'html';\n}\n\nfunction wrapMarkdownExportAsHtml(markdown: string): string {\n return [\n '<!doctype html>',\n '<html>',\n '<head>',\n '<meta charset=\"utf-8\">',\n '<title>xopc session export</title>',\n '<style>body{font:14px/1.5 system-ui,sans-serif;margin:32px;max-width:960px}pre{white-space:pre-wrap}</style>',\n '</head>',\n '<body>',\n '<pre>',\n escapeHtml(markdown),\n '</pre>',\n '</body>',\n '</html>',\n '',\n ].join('\\n');\n}\n\nfunction defaultExportPath(sessionKey: string, format: TuiExportFormat): string {\n const safeKey = sessionKey.replace(/[^a-z0-9_.-]+/gi, '_').replace(/^_+|_+$/g, '') || 'session';\n const stamp = new Date().toISOString().replace(/[:.]/g, '-');\n return resolve(process.cwd(), `xopc-session-${safeKey}-${stamp}.${exportExtension(format)}`);\n}\n\nfunction userDisplayContentForAttachments(\n text: string,\n attachments: readonly TuiInboundAttachment[] | undefined,\n): string | unknown[] {\n if (!attachments?.length) return text;\n const blocks: unknown[] = [];\n if (text.trim()) {\n blocks.push({ type: 'text', text });\n }\n for (const att of attachments) {\n if (att.mimeType?.startsWith('image/') || att.type === 'image' || att.type === 'photo') {\n blocks.push({ type: 'image', name: att.name });\n continue;\n }\n blocks.push({ type: 'file', name: att.name });\n }\n return blocks;\n}\n\nfunction shellQuote(value: string): string {\n if (/^[A-Za-z0-9_/:@%+=,.-]+$/.test(value)) {\n return value;\n }\n return `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n\nfunction formatTuiResumeCommand(opts: TuiOptions, sessionKey: string): string {\n const parts = ['xopc', 'tui'];\n if (opts.local === true) {\n parts.push('--local');\n }\n if (opts.url) {\n parts.push('--url', shellQuote(opts.url));\n }\n parts.push('--session', shellQuote(sessionKey));\n return parts.join(' ');\n}\n\nfunction isLoopbackGatewayUrl(rawUrl: string): boolean {\n try {\n const hostname = new URL(rawUrl).hostname.toLowerCase();\n return hostname === 'localhost' || hostname === '127.0.0.1' || hostname === '::1' || hostname === '[::1]';\n } catch {\n return false;\n }\n}\n\nfunction resolveStartupWorkingDirectory(opts: TuiOptions, isLocalMode: boolean): string | undefined {\n const explicit = opts.workdir?.trim();\n if (explicit) {\n return resolve(explicit);\n }\n if (opts.useStartupCwd === false || opts.session?.trim()) {\n return undefined;\n }\n const gatewayUrl = opts.url ?? 'http://localhost:3120';\n if (isLocalMode || isLoopbackGatewayUrl(gatewayUrl)) {\n return process.cwd();\n }\n return undefined;\n}\n\nfunction assistantMessagePlainText(message: AgentMessage): string {\n const content = (message as { content?: unknown }).content;\n if (typeof content === 'string') return content;\n if (!Array.isArray(content)) return '';\n return content\n .map((block) => {\n if (!block || typeof block !== 'object') return '';\n const rec = block as { type?: unknown; text?: unknown };\n return rec.type === 'text' && typeof rec.text === 'string' ? rec.text : '';\n })\n .join('');\n}\n\nexport async function runTui(opts: TuiOptions): Promise<TuiResult> {\n const stdioFilter = installTuiStdioFilter();\n const restoreStdio = () => stdioFilter.restore();\n\n const isLocalMode = opts.local === true;\n const config = loadConfig();\n const startup = resolveTuiStartupSessionKey({\n cfg: config,\n sessionOption: opts.session,\n cwd: process.cwd(),\n });\n let currentAgentId = startup.agentId;\n const sessionScope = startup.sessionScope;\n const sessionMainKey = startup.sessionMainKey;\n const resolveSessionKey = (raw?: string) =>\n resolveTuiSessionKey({\n raw,\n sessionScope,\n currentAgentId,\n sessionMainKey,\n });\n let tuiSettings = loadTuiSettings();\n initTuiTheme({ themeId: opts.theme ?? tuiSettings.theme });\n const state = createInitialState(startup.sessionKey);\n const projectTrustStore = new ProjectTrustStore();\n let projectTrustSessionDecision: boolean | null = null;\n const isCurrentProjectTrusted = () => {\n if (projectTrustSessionDecision !== null) return projectTrustSessionDecision;\n if (!hasTrustRequiringProjectResources(process.cwd())) return true;\n return projectTrustStore.get(process.cwd()) === true;\n };\n let projectTrustPromptShown = false;\n const sessionStateDir = resolveStateDir();\n const sessionDatabasePath = resolveXopcDatabasePath();\n const sessionSnapshot = new TuiSessionSnapshot(\n () => state.currentSessionKey,\n () => process.cwd(),\n () => state.sessionInfo.displayName,\n () => `${sessionDatabasePath}#session=${encodeURIComponent(state.currentSessionKey)}`,\n () => sessionStateDir,\n );\n state.scopedModelRefs = loadScopedModelRefs();\n state.showThinking = tuiSettings.showThinking;\n state.toolsExpanded = tuiSettings.toolsExpanded;\n let pendingImageAttachments: TuiInboundAttachment[] = [];\n const pendingNextTurnCustomMessages: string[] = [];\n let lastRetryMessageText: string | null = null;\n let setExtensionLabel = (_entryId: string, _label: string | undefined): void => {};\n let sendExtensionUserMessage = (\n _content: ExtensionUserMessageContent,\n _options?: ExtensionSendUserMessageOptions,\n ): void => {};\n let appendExtensionEntry = <T = unknown>(_customType: string, _data?: T): void => {};\n let sendExtensionMessage = <T = unknown>(\n _message: ExtensionCustomMessage<T>,\n _options?: ExtensionSendMessageOptions,\n ): void => {};\n\n let extensionRegistry: ExtensionRegistryImpl | undefined;\n if (isLocalMode) {\n extensionRegistry = await loadExtensionsForTuiLocalMode({\n setLabel: (entryId, label) => setExtensionLabel(entryId, label),\n sendUserMessage: (content, options) => sendExtensionUserMessage(content, options),\n appendEntry: (customType, data) => appendExtensionEntry(customType, data),\n sendMessage: (message, options) => sendExtensionMessage(message, options),\n });\n }\n\n const client: TuiBackend = isLocalMode\n ? new EmbeddedBackend({ extensionRegistry })\n : new GatewaySseBackend({ url: opts.url ?? 'http://localhost:3120', token: opts.token });\n const startupWorkingDirectory = resolveStartupWorkingDirectory(opts, isLocalMode);\n if (startupWorkingDirectory) {\n state.sessionInfo.effectiveWorkspacePath = startupWorkingDirectory;\n }\n let startupWorkingDirectoryApplied = false;\n\n const keybindings = createXopcTuiKeybindingsManager();\n setKeybindings(keybindings);\n\n let modelChoices: TuiModelChoice[] = [];\n const cycleModelChoices = (): TuiModelChoice[] =>\n filterModelsForCycle(modelChoices, state.scopedModelRefs);\n\n const refreshCycleModels = () => {\n bottomBar.invalidate();\n tui.requestRender();\n };\n\n const tui = new TUI(new ProcessTerminal());\n tui.setShowHardwareCursor(tuiSettings.showHardwareCursor);\n tui.setClearOnShrink(tuiSettings.clearOnShrink);\n const dedupeBackspace = createBackspaceDeduper();\n tui.addInputListener((data) => {\n const next = dedupeBackspace(data);\n if (next.length === 0) {\n return { consume: true };\n }\n return { data: next };\n });\n\n const header = new TuiHeader(() => ({\n version: packageJson.version ?? 'dev',\n connectionLabel: client.connectionLabel,\n sessionKey: state.currentSessionKey,\n showHints: tuiSettings.showStartupHints,\n }), keybindings);\n const statusContainer = new Container();\n const bottomBar = new TuiBottomBar(\n () => state,\n () => opts.thinking,\n () => formatKeyIds(keybindings, 'app.message.dequeue', { capitalize: true }),\n );\n const chatLog = new ChatLog(keybindings);\n let startupResources: TuiStartupResources | undefined;\n let startupCardShown = false;\n chatLog.setShowThinking(state.showThinking);\n chatLog.setToolsExpanded(state.toolsExpanded);\n chatLog.setToolImageOptions({\n showImages: tuiSettings.showImages,\n imageWidthCells: tuiSettings.imageWidthCells,\n cwd: process.cwd(),\n });\n setExtensionLabel = (entryId, label) => {\n sessionSnapshot.setLabel(entryId, label);\n void client\n .setTranscriptLabel(state.currentSessionKey, entryId, label)\n .catch((err: unknown) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Label update failed: ${errorMessage}`);\n })\n .finally(() => {\n updateFooter();\n tui.requestRender();\n });\n };\n appendExtensionEntry = (customType, data) => {\n const normalized = customType.trim();\n if (!normalized) {\n throw new Error('appendEntry requires customType.');\n }\n sessionSnapshot.appendCustomEntry(normalized, data);\n void client\n .appendCustomEntry(state.currentSessionKey, normalized, data)\n .catch((err: unknown) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Custom entry append failed: ${errorMessage}`);\n })\n .finally(() => {\n updateFooter();\n tui.requestRender();\n });\n };\n sendExtensionMessage = (message, options) => {\n const customType = message.customType.trim();\n if (!customType) {\n throw new Error('sendMessage requires customType.');\n }\n const display = message.display ?? true;\n const nextMessage = {\n customType,\n content: message.content,\n display,\n details: message.details,\n };\n sessionSnapshot.appendCustomMessage(nextMessage);\n if (display) {\n chatLog.addCustomMessage({\n customType,\n content: extensionCustomMessageContentToText(message.content),\n rawContent: message.content,\n details: message.details,\n display,\n });\n tui.requestRender();\n }\n const persist = client\n .appendCustomMessage(state.currentSessionKey, nextMessage)\n .catch((err: unknown) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Custom message append failed: ${errorMessage}`);\n throw err;\n })\n .finally(() => {\n updateFooter();\n tui.requestRender();\n });\n\n const turnText = extensionCustomMessageToTurnText(nextMessage).trim();\n if (!turnText) {\n return;\n }\n void persist.then(() => {\n const controlText = `Continue with the extension message \"${customType}\" above.`;\n if (options?.deliverAs === 'nextTurn') {\n pendingNextTurnCustomMessages.push(controlText);\n chatLog.addSystem(\n theme.dim(`Queued extension message for next turn (${pendingNextTurnCustomMessages.length}).`),\n );\n bottomBar.invalidate();\n tui.requestRender();\n return;\n }\n if (state.activeRunId) {\n if (options?.deliverAs === 'followUp') {\n state.messageFollowUpQueue.push(controlText);\n chatLog.addSystem(\n theme.dim(\n `Queued extension follow-up (${state.messageFollowUpQueue.length} in queue). ${tuiSettings.followUpMode === 'all' ? 'All queued messages send together when this reply finishes.' : 'Next sends when this reply finishes.'}`,\n ),\n );\n bottomBar.invalidate();\n tui.requestRender();\n return;\n }\n steerMessage(turnText);\n return;\n }\n if (options?.triggerTurn) {\n sendMessage(controlText);\n }\n }).catch(() => {});\n };\n const defaultEditor = new CustomEditor(tui, editorTheme, keybindings, {\n paddingX: tuiSettings.editorPaddingX,\n autocompleteMaxVisible: tuiSettings.autocompleteMaxVisible,\n });\n let editor: EditorComponent = defaultEditor;\n let editorComponentFactory: TuiEditorFactory | undefined;\n const editorContainer = new Container();\n editorContainer.addChild(editor as Component);\n const root = new Container();\n root.addChild(header);\n root.addChild(chatLog);\n root.addChild(statusContainer);\n root.addChild(editorContainer);\n root.addChild(bottomBar);\n tui.addChild(root);\n tui.setFocus(editor as Component);\n\n let isBashMode = false;\n let isBashExcludeContext = false;\n\n const updateEditorBorderColor = () => {\n if (isBashMode) {\n editor.borderColor = isBashExcludeContext\n ? getBashExcludeBorderColor()\n : getBashModeBorderColor();\n } else {\n const level = state.sessionInfo.thinkingLevel ?? opts.thinking ?? 'off';\n editor.borderColor = getThinkingBorderColor(level);\n }\n tui.requestRender();\n };\n\n editor.onChange = (text: string) => {\n const trimmed = text.trimStart();\n const nextExclude = trimmed.startsWith('!!');\n const nextBash = trimmed.startsWith('!');\n if (nextBash !== isBashMode || nextExclude !== isBashExcludeContext) {\n isBashMode = nextBash;\n isBashExcludeContext = nextExclude;\n updateEditorBorderColor();\n }\n };\n\n const copyDefaultEditorAppHandlers = (target: EditorComponent) => {\n const customEditor = target as unknown as {\n actionHandlers?: unknown;\n onEscape?: () => void;\n onCtrlD?: () => void;\n onPasteImage?: () => void;\n onExtensionShortcut?: (data: string) => boolean;\n };\n if (!(customEditor.actionHandlers instanceof Map)) return;\n customEditor.onEscape ??= () => defaultEditor.onEscape?.();\n customEditor.onCtrlD ??= () => defaultEditor.onCtrlD?.();\n customEditor.onPasteImage ??= () => defaultEditor.onPasteImage?.();\n customEditor.onExtensionShortcut ??= (data: string) =>\n defaultEditor.onExtensionShortcut?.(data) ?? false;\n for (const [action, handler] of defaultEditor.actionHandlers) {\n customEditor.actionHandlers.set(action, handler);\n }\n };\n\n const setEditorExtensionShortcut = () => {\n const customEditor = editor as unknown as {\n onExtensionShortcut?: (data: string) => boolean;\n };\n customEditor.onExtensionShortcut = (data: string) => extensionRuntime.handleShortcut(data);\n };\n\n const setEditorComponent = (factory: TuiEditorFactory | undefined) => {\n editorComponentFactory = factory;\n const currentText = editor.getText();\n editorContainer.clear();\n if (factory) {\n const nextEditor = factory(tui, editorTheme, keybindings) as EditorComponent;\n nextEditor.onSubmit = defaultEditor.onSubmit;\n nextEditor.onChange = defaultEditor.onChange;\n nextEditor.setText(currentText);\n if (nextEditor.borderColor !== undefined) {\n nextEditor.borderColor = defaultEditor.borderColor;\n }\n nextEditor.setPaddingX?.(tuiSettings.editorPaddingX);\n nextEditor.setAutocompleteMaxVisible?.(tuiSettings.autocompleteMaxVisible);\n nextEditor.setAutocompleteProvider?.(extensionRuntime.autocompleteProvider);\n copyDefaultEditorAppHandlers(nextEditor);\n editor = nextEditor;\n } else {\n defaultEditor.setText(currentText);\n editor = defaultEditor;\n }\n editorContainer.addChild(editor as Component);\n setEditorExtensionShortcut();\n tui.setFocus(editor as Component);\n updateEditorBorderColor();\n tui.requestRender();\n };\n\n let activeEditorSelectorClose: (() => void) | null = null;\n\n const closeEditorSelector = () => {\n const close = activeEditorSelectorClose;\n close?.();\n };\n\n const openEditorSelector = (component: Component, focus: Component = component) => {\n closeEditorSelector();\n editorContainer.clear();\n editorContainer.addChild(component);\n tui.setFocus(focus);\n tui.requestRender();\n const close = () => {\n if (activeEditorSelectorClose !== close) return;\n activeEditorSelectorClose = null;\n editorContainer.clear();\n editorContainer.addChild(editor as Component);\n tui.setFocus(editor as Component);\n tui.requestRender();\n };\n activeEditorSelectorClose = close;\n return close;\n };\n\n const openCommandOverlay = (\n component: Component,\n _options?: OverlayOptions,\n ): OverlayHandle => {\n let hidden = false;\n let closeCurrent = openEditorSelector(component, component);\n return {\n hide: () => closeCurrent(),\n setHidden: (nextHidden: boolean) => {\n hidden = nextHidden;\n if (nextHidden) {\n closeCurrent();\n } else {\n closeCurrent = openEditorSelector(component, component);\n }\n },\n isHidden: () => hidden,\n focus: () => tui.setFocus(component),\n unfocus: () => tui.setFocus(editor as Component),\n isFocused: () => false,\n };\n };\n\n const closeCommandOverlay = () => {\n closeEditorSelector();\n };\n\n const slashCommands = getSlashCommands(isLocalMode, keybindings);\n let extensionWorkingMessage: string | undefined;\n let extensionWorkingVisible = true;\n let extensionWorkingIndicator: LoaderIndicatorOptions | undefined;\n\n const getAllExtensionThemes = () => {\n const customDir = getCustomThemesDir();\n return listAvailableThemeIds().map((name) => ({\n name,\n path: name === 'auto' || name === 'dark' || name === 'light'\n ? undefined\n : join(customDir, `${name}.json`),\n }));\n };\n\n const getExtensionTheme = (name: string) => {\n const normalized = name.trim().toLowerCase() || 'auto';\n if (!listAvailableThemeIds().includes(normalized)) return undefined;\n const currentTheme = tuiSettings.theme;\n applyThemeById(normalized);\n const resolved = getThemeExports().theme;\n applyThemeById(currentTheme);\n return resolved;\n };\n\n const setExtensionTheme = (nextTheme: string) => {\n const normalized = nextTheme.trim().toLowerCase() || 'auto';\n if (!listAvailableThemeIds().includes(normalized)) {\n return { success: false, error: `Unknown theme: ${nextTheme}` };\n }\n try {\n resolveThemePalette(normalized);\n tuiSettings = { ...tuiSettings, theme: normalized };\n saveTuiSettings(tuiSettings);\n applyThemeById(normalized);\n updateEditorBorderColor();\n chatLog.invalidate();\n header.invalidate();\n bottomBar.invalidate();\n tui.requestRender();\n return { success: true };\n } catch (err) {\n return {\n success: false,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n };\n\n const getAvailableProviderCount = () =>\n getAllProviders().filter((provider) => isProviderConfiguredSync(provider)).length;\n\n const getExtensionSystemPrompt = () =>\n resolveEffectiveAgentProfileForSession(config, state.currentSessionKey).systemPromptOverride ?? '';\n\n const waitForTuiIdle = async () => {\n while (\n state.activeRunId != null ||\n state.isCompacting ||\n state.activityStatus === 'sending' ||\n state.activityStatus === 'waiting' ||\n state.activityStatus === 'streaming' ||\n state.activityStatus === 'running' ||\n state.activityStatus === 'compacting'\n ) {\n await new Promise((resolveDelay) => setTimeout(resolveDelay, 50));\n }\n };\n\n const createReplacementContext = (): TuiReplacedSessionContext => {\n const model = state.sessionInfo.model\n ? {\n ...(state.sessionInfo.modelProvider ? { provider: state.sessionInfo.modelProvider } : {}),\n id: state.sessionInfo.model,\n ref: state.sessionInfo.modelProvider\n ? `${state.sessionInfo.modelProvider}/${state.sessionInfo.model}`\n : state.sessionInfo.model,\n contextWindow: state.sessionInfo.contextWindow ?? null,\n }\n : undefined;\n return {\n mode: 'tui',\n hasUI: true,\n signal: client.getActiveSignal?.(),\n ui: {\n select: async () => undefined,\n confirm: async () => false,\n input: async () => undefined,\n notify: (message, level) => {\n const prefix = level === 'error' ? 'Error: ' : level === 'warn' || level === 'warning' ? 'Warning: ' : '';\n chatLog.addSystem(`${prefix}${message}`);\n tui.requestRender();\n },\n onTerminalInput: (handler) => tui.addInputListener(handler),\n setStatus: () => {},\n setWorkingMessage: (message) => {\n extensionWorkingMessage = message?.trim() || undefined;\n renderStatus();\n },\n setWorkingVisible: (visible) => {\n extensionWorkingVisible = visible;\n renderStatus();\n },\n setWorkingIndicator: (indicator) => {\n extensionWorkingIndicator = indicator ?? undefined;\n statusLoader?.setIndicator(indicator ?? undefined);\n renderStatus();\n },\n setHiddenThinkingLabel: (label) => {\n chatLog.setHiddenThinkingLabel(label ?? undefined);\n tui.requestRender();\n },\n setWidget: () => {},\n setFooter: () => {},\n setHeader: () => {},\n custom: async () => undefined as never,\n setTitle: (title) => tui.terminal.setTitle(title),\n pasteToEditor: (text) => editor.handleInput(`\\x1b[200~${text}\\x1b[201~`),\n setEditorText: (text) => editor.setText(text),\n getEditorText: () => editor.getExpandedText?.() ?? editor.getText(),\n editor: async () => undefined,\n addAutocompleteProvider: () => () => {},\n setEditorComponent,\n getEditorComponent: () => editorComponentFactory,\n theme,\n getAllThemes: getAllExtensionThemes,\n getTheme: getExtensionTheme,\n setTheme: setExtensionTheme,\n getToolsExpanded: () => state.toolsExpanded,\n setToolsExpanded: (expanded) => {\n state.toolsExpanded = expanded;\n tuiSettings = { ...tuiSettings, toolsExpanded: expanded };\n saveTuiSettings(tuiSettings);\n chatLog.setToolsExpanded(expanded);\n updateFooter();\n tui.requestRender();\n },\n },\n sessionManager: sessionSnapshot.manager(),\n modelRegistry: {\n find(provider, modelId) {\n return getAllModels().find(\n (candidate) => candidate.provider === provider && candidate.id === modelId,\n ) as unknown as TuiModelRegistryModel | undefined;\n },\n async getApiKeyAndHeaders(nextModel) {\n const provider = typeof nextModel.provider === 'string' ? nextModel.provider : undefined;\n if (!provider) return { ok: false, error: 'Model provider is missing.' };\n try {\n return { ok: true, apiKey: await getApiKey(provider), headers: {} };\n } catch (error) {\n return { ok: false, error: error instanceof Error ? error.message : String(error) };\n }\n },\n },\n model,\n cwd: process.cwd(),\n sessionKey: state.currentSessionKey,\n isProjectTrusted: isCurrentProjectTrusted,\n isIdle: () => !state.activeRunId && !state.isCompacting,\n hasPendingMessages: () =>\n state.messageFollowUpQueue.length > 0 ||\n state.steeringQueue.length > 0 ||\n state.compactionQueue.length > 0,\n abort: () => abortActive(),\n shutdown: () => requestExit(),\n compact: (options) => runCompaction(options?.customInstructions, {\n onComplete: options?.onComplete,\n onError: options?.onError,\n }),\n getSystemPrompt: getExtensionSystemPrompt,\n getSystemPromptOptions: () => ({\n cwd: process.cwd(),\n sessionKey: state.currentSessionKey,\n ...(model ? { model } : {}),\n }),\n waitForIdle: waitForTuiIdle,\n newSession: (options) => runExtensionNewSession(options),\n fork: (entryId, options) => runExtensionFork(entryId, options),\n navigateTree: (targetId, options) => runExtensionNavigateTree(targetId, options),\n switchSession: (sessionPath, options) => runExtensionSwitchSession(sessionPath, options),\n reload: async () => {\n await loadSessionHistory({ merge: true });\n await refreshSessionInfoWithBorder();\n },\n getModel: () => model,\n setModel: (modelRef) => switchCurrentModel(modelRef),\n getThinkingLevel: () => state.sessionInfo.thinkingLevel as TuiThinkingLevel | undefined,\n setThinkingLevel,\n getReasoningLevel: () => state.sessionInfo.reasoningLevel as TuiReasoningLevel | undefined,\n setReasoningLevel,\n getVerboseLevel: () => state.sessionInfo.verboseLevel as TuiVerboseLevel | undefined,\n setVerboseLevel,\n getCommands: () => slashCommands.map((command) => ({\n name: command.name,\n description: command.description,\n source: 'builtin' as const,\n })),\n getContextUsage: () => {\n const tokens = state.sessionInfo.totalTokens ?? state.sessionInfo.contextTokens ?? null;\n const contextWindow = state.sessionInfo.contextWindow ?? null;\n const percent = state.sessionInfo.contextUsagePercent ?? null;\n if (tokens == null && contextWindow == null) return undefined;\n return {\n estimatedTokens: tokens,\n tokens,\n contextWindow,\n usagePercent: percent,\n percent,\n };\n },\n notify: (message, level) => {\n const prefix = level === 'error' ? 'Error: ' : level === 'warn' || level === 'warning' ? 'Warning: ' : '';\n chatLog.addSystem(`${prefix}${message}`);\n tui.requestRender();\n },\n sendMessage: async (message, options) => sendExtensionMessage(message, options),\n sendUserMessage: async (content, options) =>\n sendExtensionUserMessage(content as ExtensionUserMessageContent, options),\n };\n };\n\n const runWithReplacementContext = async (\n callback: ((ctx: TuiReplacedSessionContext) => Promise<void>) | undefined,\n ) => {\n if (callback) {\n await callback(createReplacementContext());\n }\n };\n\n const runExtensionNewSession = async (\n options?: TuiNewSessionOptions,\n ): Promise<TuiReplacementResult> => {\n await abortActive({ clearUi: false });\n const targetKey = resolveSessionKey(`session-${randomUUID()}`);\n await setSession(targetKey);\n await options?.setup?.(sessionSnapshot.manager());\n await runWithReplacementContext(options?.withSession);\n return { cancelled: false };\n };\n\n const runExtensionFork = async (\n entryId: string,\n options?: TuiForkOptions,\n ): Promise<TuiReplacementResult> => {\n const rowNumber = transcriptTreeEntryIdToRowNumber(entryId);\n if (rowNumber == null) {\n throw new Error(`Invalid entry ID for forking: ${entryId}`);\n }\n const throughRow = options?.position === 'before' ? rowNumber - 1 : rowNumber;\n if (throughRow <= 0) {\n throw new Error(`Invalid entry ID for forking: ${entryId}`);\n }\n const sourceSessionKey = state.currentSessionKey;\n const targetKey = resolveSessionKey(`fork-${randomUUID()}`);\n await abortActive({ clearUi: false });\n const result = await client.forkSessionAt(sourceSessionKey, targetKey, `row-${throughRow}`);\n await setSession(result.sessionKey);\n chatLog.addBranchSummary({\n sourceSessionKey,\n targetSessionKey: result.sessionKey,\n rowCount: result.rowCount,\n entryId,\n });\n await runWithReplacementContext(options?.withSession);\n return { cancelled: false };\n };\n\n const runExtensionNavigateTree = async (\n targetId: string,\n options?: TuiNavigateTreeOptions,\n ): Promise<TuiReplacementResult> => {\n if (options?.label) {\n setExtensionLabel(targetId, options.label);\n }\n return runExtensionFork(targetId, { position: 'at' });\n };\n\n const runExtensionSwitchSession = async (\n sessionPath: string,\n options?: TuiSwitchSessionOptions,\n ): Promise<TuiReplacementResult> => {\n await abortActive({ clearUi: false });\n await setSession(sessionPath);\n await runWithReplacementContext(options?.withSession);\n return { cancelled: false };\n };\n\n const extensionRuntime = createTuiExtensionRuntime({\n registry: extensionRegistry,\n tui,\n chatLog,\n header,\n bottomBar,\n getState: () => state,\n baseSlashCommands: slashCommands,\n keybindings,\n addInputListener: (handler) => tui.addInputListener(handler),\n setTitle: (title) => tui.terminal.setTitle(title),\n pasteToEditor: (text) => editor.handleInput(`\\x1b[200~${text}\\x1b[201~`),\n setEditorText: (text) => editor.setText(text),\n getEditorText: () => editor.getExpandedText?.() ?? editor.getText(),\n setEditorComponent,\n getEditorComponent: () => editorComponentFactory,\n getThemeObject: () => theme,\n getAllThemes: getAllExtensionThemes,\n getTheme: getExtensionTheme,\n setTheme: setExtensionTheme,\n getToolsExpanded: () => state.toolsExpanded,\n setToolsExpanded: (expanded) => {\n state.toolsExpanded = expanded;\n tuiSettings = { ...tuiSettings, toolsExpanded: expanded };\n saveTuiSettings(tuiSettings);\n chatLog.setToolsExpanded(expanded);\n updateFooter();\n tui.requestRender();\n },\n getAvailableProviderCount,\n getActiveSignal: () => client.getActiveSignal?.(),\n isProjectTrusted: isCurrentProjectTrusted,\n getSessionManager: () => sessionSnapshot.manager(),\n getSystemPrompt: getExtensionSystemPrompt,\n getSystemPromptOptions: () => ({\n cwd: process.cwd(),\n sessionKey: state.currentSessionKey,\n ...(state.sessionInfo.model\n ? {\n model: {\n ...(state.sessionInfo.modelProvider ? { provider: state.sessionInfo.modelProvider } : {}),\n id: state.sessionInfo.model,\n ref: state.sessionInfo.modelProvider\n ? `${state.sessionInfo.modelProvider}/${state.sessionInfo.model}`\n : state.sessionInfo.model,\n contextWindow: state.sessionInfo.contextWindow ?? null,\n },\n }\n : {}),\n }),\n waitForIdle: waitForTuiIdle,\n newSession: runExtensionNewSession,\n forkSession: runExtensionFork,\n navigateTree: runExtensionNavigateTree,\n switchSession: runExtensionSwitchSession,\n reload: async () => {\n await loadSessionHistory();\n await refreshSessionInfoWithBorder();\n },\n sendUserMessage: async (content, options) =>\n sendExtensionUserMessage(content as ExtensionUserMessageContent, options),\n sendMessage: async (message, options) => sendExtensionMessage(message, options),\n cwd: process.cwd(),\n fdPath: resolveFdPath(),\n openOverlay: openCommandOverlay,\n closeOverlay: closeCommandOverlay,\n onInvalidate: () => {\n updateHeader();\n updateFooter();\n tui.requestRender();\n },\n abortActive: () => abortActive(),\n requestExit: () => requestExit(),\n compactSession: (options) => runCompaction(options?.customInstructions, {\n onComplete: options?.onComplete,\n onError: options?.onError,\n }),\n setModel: (modelRef) => switchCurrentModel(modelRef),\n setThinkingLevel: (level) => setThinkingLevel(level),\n setReasoningLevel: (level) => setReasoningLevel(level),\n setVerboseLevel: (level) => setVerboseLevel(level),\n setWorkingMessage: (message?: string) => {\n extensionWorkingMessage = message?.trim() || undefined;\n renderStatus();\n },\n setWorkingVisible: (visible: boolean) => {\n extensionWorkingVisible = visible;\n renderStatus();\n },\n setWorkingIndicator: (indicator?: LoaderIndicatorOptions) => {\n extensionWorkingIndicator = indicator;\n statusLoader?.setIndicator(indicator);\n renderStatus();\n },\n });\n\n editor.setAutocompleteProvider?.(extensionRuntime.autocompleteProvider);\n setEditorExtensionShortcut();\n\n let statusLoader: Loader | null = null;\n let statusStartedAt: number | null = null;\n let lastActivityStatus = '';\n let elapsedTimerId: ReturnType<typeof setInterval> | null = null;\n const busyStates = new Set(['sending', 'waiting', 'streaming', 'running', 'compacting', 'recovering']);\n\n const syncTerminalProgress = () => {\n if (!tuiSettings.showTerminalProgress) {\n tui.terminal.setProgress(false);\n return;\n }\n tui.terminal.setProgress(busyStates.has(state.activityStatus));\n };\n\n let lastStreamActivityAt = Date.now();\n let streamWatchdogId: ReturnType<typeof setInterval> | null = null;\n\n const touchStreamingActivity = () => {\n lastStreamActivityAt = Date.now();\n if (state.activeRunId && state.runStatus.lastActivityAt == null) {\n state.runStatus = {\n ...state.runStatus,\n runId: state.activeRunId,\n lastActivityAt: lastStreamActivityAt,\n };\n }\n };\n\n const formatElapsed = (startMs: number) => {\n const totalSeconds = Math.max(0, Math.floor((Date.now() - startMs) / 1000));\n if (totalSeconds < 60) return `${totalSeconds}s`;\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n return `${minutes}m ${seconds}s`;\n };\n\n const renderStatus = () => {\n const isBusy = busyStates.has(state.activityStatus);\n if (isBusy && extensionWorkingVisible) {\n if (!statusStartedAt || lastActivityStatus !== state.activityStatus) {\n statusStartedAt = Date.now();\n }\n if (!statusLoader) {\n statusContainer.clear();\n statusLoader = new Loader(\n tui,\n (spinner) => theme.accent(spinner),\n (text) => theme.bold(theme.accentSoft(text)),\n '',\n extensionWorkingIndicator,\n );\n statusContainer.addChild(statusLoader);\n }\n const elapsed = formatElapsed(statusStartedAt);\n const loaderMessage = state.progressMessage ?? extensionWorkingMessage ?? state.activityStatus;\n statusLoader.setMessage(\n `${loaderMessage} • ${elapsed} | ${state.connectionStatus}`,\n );\n if (!elapsedTimerId) {\n elapsedTimerId = setInterval(() => {\n if (statusStartedAt && statusLoader) {\n const el = formatElapsed(statusStartedAt);\n const message = state.progressMessage ?? extensionWorkingMessage ?? state.activityStatus;\n statusLoader.setMessage(\n `${message} • ${el} | ${state.connectionStatus}`,\n );\n }\n }, 1000);\n }\n } else {\n if (!isBusy) {\n state.progressMessage = null;\n statusStartedAt = null;\n }\n if (elapsedTimerId) {\n clearInterval(elapsedTimerId);\n elapsedTimerId = null;\n }\n statusLoader?.stop();\n statusLoader = null;\n statusContainer.clear();\n }\n lastActivityStatus = state.activityStatus;\n bottomBar.invalidate();\n syncTerminalProgress();\n tui.requestRender();\n };\n\n const setActivityStatus = (status: string) => {\n state.activityStatus = status as TuiState['activityStatus'];\n renderStatus();\n };\n\n const setConnectionStatus = (text: string) => {\n state.connectionStatus = text;\n renderStatus();\n };\n\n const updateHeader = () => {\n header.invalidate();\n syncTerminalTitle();\n };\n\n const syncTerminalTitle = () => {\n const shortKey =\n state.currentSessionKey.length > 48\n ? `${state.currentSessionKey.slice(0, 45)}…`\n : state.currentSessionKey;\n tui.terminal.setTitle(`xopc · ${shortKey}`);\n };\n\n const updateFooter = () => {\n bottomBar.invalidate();\n };\n\n const refreshModelChoices = async () => {\n try {\n modelChoices = await client.listModels();\n } catch {\n modelChoices = [];\n }\n bottomBar.invalidate();\n tui.requestRender();\n };\n\n let finishTui: (() => void) | null = null;\n let exitResult: TuiResult = { exitReason: 'exit' };\n\n const requestExit = () => {\n if (state.exitRequested) return;\n state.exitRequested = true;\n if (elapsedTimerId) {\n clearInterval(elapsedTimerId);\n elapsedTimerId = null;\n }\n if (streamWatchdogId) {\n clearInterval(streamWatchdogId);\n streamWatchdogId = null;\n }\n client.stop();\n tui.terminal.setProgress(false);\n void drainAndStopTuiSafely(tui).then(() => {\n restoreStdio();\n process.stdout.write(\n `\\nTo resume this session: ${formatTuiResumeCommand(opts, state.currentSessionKey)}\\n`,\n );\n finishTui?.();\n process.exit(0);\n });\n };\n\n const sessionActions = createSessionActions({\n client,\n chatLog,\n tui,\n state,\n resolveSessionKey,\n updateHeader,\n updateFooter,\n setActivityStatus,\n sessionSnapshot,\n onAgentIdChange: (agentId) => {\n currentAgentId = agentId;\n },\n });\n\n const {\n refreshSessionInfo,\n loadHistory: loadSessionHistory,\n setSession,\n abortActive,\n resetCurrentSession,\n clearChatForSessionSwitch,\n } = sessionActions;\n\n const refreshSessionInfoWithBorder = async () => {\n await refreshSessionInfo();\n updateEditorBorderColor();\n };\n\n const refreshStartupResources = async () => {\n if (!client.getStartupResources) return;\n try {\n startupResources = await client.getStartupResources(state.currentSessionKey);\n } catch {\n startupResources = undefined;\n }\n };\n\n const showStartupCardOnce = () => {\n if (startupCardShown) return;\n startupCardShown = true;\n chatLog.addSystem(formatTuiStartupText({\n state,\n isLocal: isLocalMode,\n keybindings,\n resources: startupResources,\n expanded: false,\n }));\n };\n\n const applyStartupWorkingDirectory = async () => {\n if (startupWorkingDirectoryApplied || !startupWorkingDirectory) return;\n startupWorkingDirectoryApplied = true;\n await client.patchSession(state.currentSessionKey, {\n workingDirectory: startupWorkingDirectory,\n });\n state.sessionInfo.effectiveWorkspacePath = startupWorkingDirectory;\n state.sessionInfo.workingDirectoryLocked = true;\n };\n\n let streamRecoveryPromise: Promise<void> | null = null;\n const recoverActiveRunFromHistory = (reason: string) => {\n if (!state.activeRunId) return Promise.resolve();\n if (streamRecoveryPromise) return streamRecoveryPromise;\n const runId = state.activeRunId;\n markRunRecovering(state, Date.now());\n state.progressMessage = 'recovering stream history';\n setActivityStatus('recovering');\n streamRecoveryPromise = (async () => {\n try {\n await loadSessionHistory();\n await refreshSessionInfoWithBorder();\n if (state.activeRunId === runId) {\n clearSeenStreamEventsForRun(runId);\n if (client.resumeChat) {\n const resumed = await client.resumeChat({ sessionKey: state.currentSessionKey, runId });\n if (resumed.ok) {\n state.progressMessage = 'resuming stream';\n setActivityStatus('recovering');\n chatLog.addSystem(theme.dim(`Reattached to active run after ${reason}.`));\n } else {\n markRunRecoveryComplete(state, Date.now());\n state.progressMessage = 'stream stalled; resume unavailable';\n setActivityStatus('stalled');\n chatLog.addSystem(\n theme.dim(\n `Recovered persisted history after ${reason}, but could not resume stream: ${resumed.reason ?? 'run relay unavailable'}. Press Escape or /abort to stop it.`,\n ),\n );\n }\n } else {\n markRunRecoveryComplete(state, Date.now());\n state.progressMessage = 'stream stalled; waiting for new events or abort';\n setActivityStatus('stalled');\n chatLog.addSystem(\n theme.dim(\n `Recovered persisted history after ${reason}. Active run is still marked stalled; press Escape or /abort to stop it.`,\n ),\n );\n }\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n chatLog.addSystem(theme.dim(`Stream recovery failed after ${reason}: ${errorMessage}`));\n if (state.activeRunId === runId) {\n markRunRecoveryComplete(state, Date.now());\n setActivityStatus('stalled');\n }\n } finally {\n streamRecoveryPromise = null;\n updateFooter();\n tui.requestRender();\n }\n })();\n return streamRecoveryPromise;\n };\n\n const setThinkingLevel = async (level: ThinkLevel) => {\n try {\n await client.patchSession(state.currentSessionKey, { thinkingLevel: level });\n state.sessionInfo.thinkingLevel = level;\n await refreshSessionInfoWithBorder();\n updateFooter();\n chatLog.addStatus(theme.dim(`Thinking level: ${level}`));\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Thinking level change failed: ${errorMessage}`);\n } finally {\n tui.requestRender();\n }\n };\n\n const setReasoningLevel = async (level: ReasoningLevel) => {\n try {\n await client.patchSession(state.currentSessionKey, { reasoningLevel: level });\n state.sessionInfo.reasoningLevel = level;\n await refreshSessionInfoWithBorder();\n updateFooter();\n chatLog.addStatus(theme.dim(`Reasoning visibility: ${level}`));\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Reasoning visibility change failed: ${errorMessage}`);\n } finally {\n tui.requestRender();\n }\n };\n\n const setVerboseLevel = async (level: VerboseLevel) => {\n try {\n await client.patchSession(state.currentSessionKey, { verboseLevel: level });\n state.sessionInfo.verboseLevel = level;\n await refreshSessionInfoWithBorder();\n updateFooter();\n chatLog.addStatus(theme.dim(`Verbose mode: ${level}`));\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Verbose mode change failed: ${errorMessage}`);\n } finally {\n tui.requestRender();\n }\n };\n\n const copyLastAssistant = async () => {\n const text = chatLog.getLastAssistantText().trim();\n if (!text) {\n chatLog.addSystem('No assistant messages to copy yet.');\n tui.requestRender();\n return;\n }\n try {\n await copyTextToClipboard(text);\n chatLog.addStatus(theme.dim('Copied last assistant message to clipboard'));\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Copy failed: ${errorMessage}`);\n } finally {\n tui.requestRender();\n }\n };\n\n const renameCurrentSession = async (name: string) => {\n const nextName = name.trim();\n if (!nextName) {\n chatLog.addSystem('Usage: /name <name>');\n tui.requestRender();\n return;\n }\n try {\n const result = await client.renameSession(state.currentSessionKey, nextName);\n if (!result.ok) {\n chatLog.addSystem('Session rename failed.');\n tui.requestRender();\n return;\n }\n state.sessionInfo.displayName = nextName;\n updateFooter();\n updateHeader();\n chatLog.addStatus(theme.dim(`Session name set: ${nextName}`));\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Session rename failed: ${errorMessage}`);\n } finally {\n tui.requestRender();\n }\n };\n\n const resolveModelChoiceIndex = (): number => {\n const choices = cycleModelChoices();\n if (choices.length === 0) return -1;\n const p = state.sessionInfo.modelProvider;\n const m = state.sessionInfo.model;\n if (p && m) {\n const byParts = choices.findIndex((x) => x.provider === p && x.id === m);\n if (byParts >= 0) return byParts;\n }\n if (m?.includes('/')) {\n const [a, b] = m.split('/', 2);\n const bySlash = choices.findIndex((x) => x.provider === a && x.id === b);\n if (bySlash >= 0) return bySlash;\n }\n return 0;\n };\n\n const cycleModel = (dir: 'forward' | 'backward') => {\n const choices = cycleModelChoices();\n if (choices.length === 0) {\n void refreshModelChoices().then(() => {\n if (cycleModelChoices().length === 0) {\n chatLog.addSystem('No models available to cycle.');\n tui.requestRender();\n return;\n }\n cycleModel(dir);\n });\n return;\n }\n const idx = resolveModelChoiceIndex();\n const base = idx >= 0 ? idx : 0;\n const delta = dir === 'forward' ? 1 : -1;\n const next = choices[(base + delta + choices.length) % choices.length]!;\n void switchCurrentModel(`${next.provider}/${next.id}`);\n };\n\n const listCurrentModels = async (): Promise<TuiModelChoice[]> => {\n if (modelChoices.length === 0) {\n await refreshModelChoices();\n }\n return modelChoices;\n };\n\n const switchCurrentModel = async (modelRef: string) => {\n const trimmed = modelRef.trim();\n if (!trimmed.includes('/')) {\n chatLog.addSystem('Usage: /switch <provider/model>');\n tui.requestRender();\n return;\n }\n if (modelChoices.length === 0) {\n await refreshModelChoices();\n }\n const [provider, id] = trimmed.split('/', 2);\n const selected = modelChoices.find((choice) => choice.provider === provider && choice.id === id);\n if (!selected) {\n chatLog.addSystem(`Model not found: ${trimmed}`);\n tui.requestRender();\n return;\n }\n try {\n await client.patchSession(state.currentSessionKey, { model: trimmed });\n state.sessionInfo.modelProvider = selected.provider;\n state.sessionInfo.model = selected.id;\n if (selected.contextWindow != null) {\n state.sessionInfo.contextWindow = selected.contextWindow;\n }\n await refreshSessionInfoWithBorder();\n updateFooter();\n updateHeader();\n chatLog.addStatus(theme.dim(`Model: ${trimmed}`));\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Model switch failed: ${errorMessage}`);\n } finally {\n tui.requestRender();\n }\n };\n\n const exportCurrentSession = async (request: TuiExportRequest) => {\n const outputPath = request.outputPath\n ? isAbsolute(request.outputPath)\n ? request.outputPath\n : resolve(process.cwd(), request.outputPath)\n : defaultExportPath(state.currentSessionKey, request.format);\n try {\n const backendFormat = request.format === 'json' ? 'json' : 'markdown';\n const raw = await client.exportSession(state.currentSessionKey, backendFormat);\n const content = request.format === 'html' ? wrapMarkdownExportAsHtml(raw) : raw;\n mkdirSync(dirname(outputPath), { recursive: true });\n writeFileSync(outputPath, content, 'utf8');\n chatLog.addStatus(theme.dim(`Exported ${request.format} session to: ${outputPath}`));\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Export failed: ${errorMessage}`);\n } finally {\n tui.requestRender();\n }\n };\n\n const importSessionExport = async (request: TuiImportRequest) => {\n const rawPath = request.inputPath?.trim();\n if (!rawPath) {\n chatLog.addSystem('Usage: /import <path.json> [target-session]');\n tui.requestRender();\n return;\n }\n const inputPath = isAbsolute(rawPath) ? rawPath : resolve(process.cwd(), rawPath);\n const targetRaw = request.targetKey?.trim() || `import-${randomUUID()}`;\n const targetKey = resolveSessionKey(targetRaw);\n try {\n const content = readFileSync(inputPath, 'utf8');\n const result = await client.importSession(targetKey, content);\n await setSession(result.sessionKey);\n chatLog.addStatus(theme.dim(`Imported ${result.rowCount} transcript rows from: ${inputPath}`));\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Import failed: ${errorMessage}`);\n } finally {\n tui.requestRender();\n }\n };\n\n const createShareLink = async (request: TuiShareRequest) => {\n try {\n chatLog.addStatus(theme.dim(`Creating share for: ${request.path}`));\n tui.requestRender();\n const result = await client.createShare(state.currentSessionKey, request, { agentId: currentAgentId });\n chatLog.addSystem(formatTuiShareResult(result));\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Share failed: ${errorMessage}`);\n } finally {\n tui.requestRender();\n }\n };\n\n const runBtwQuery = async (question: string) => {\n const previousStatus = state.activityStatus;\n try {\n setActivityStatus('waiting');\n state.progressMessage = 'btw';\n const result = await client.btwQuery(state.currentSessionKey, question);\n if (result.error) {\n chatLog.addSystem(`BTW failed: ${result.error}`);\n return;\n }\n chatLog.addSystem(`BTW\\n\\n${result.text}`);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`BTW failed: ${errorMessage}`);\n } finally {\n state.activityStatus = previousStatus;\n renderStatus();\n tui.requestRender();\n }\n };\n\n const forkCurrentSession = async (rawKey?: string) => {\n const targetRaw = rawKey?.trim() || `fork-${randomUUID()}`;\n const targetKey = resolveSessionKey(targetRaw);\n if (targetKey === state.currentSessionKey) {\n chatLog.addSystem('Fork target must be different from the current session.');\n tui.requestRender();\n return;\n }\n const sourceSessionKey = state.currentSessionKey;\n try {\n await abortActive({ clearUi: false });\n const result = await client.forkSession(sourceSessionKey, targetKey);\n await setSession(result.sessionKey);\n chatLog.addBranchSummary({\n sourceSessionKey,\n targetSessionKey: result.sessionKey,\n rowCount: result.rowCount,\n });\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Fork failed: ${errorMessage}`);\n } finally {\n tui.requestRender();\n }\n };\n\n const handleCtrlZ = () => {\n if (process.platform === 'win32') {\n chatLog.addSystem(formatSuspendUnsupportedHint(keybindings));\n tui.requestRender();\n return;\n }\n const suspendKeepAlive = setInterval(() => {}, 2 ** 30);\n const ignoreSigint = () => {};\n process.on('SIGINT', ignoreSigint);\n process.once('SIGCONT', () => {\n clearInterval(suspendKeepAlive);\n process.removeListener('SIGINT', ignoreSigint);\n tui.start();\n tui.setFocus(editor);\n tui.requestRender(true);\n });\n try {\n tui.stop();\n process.kill(0, 'SIGTSTP');\n } catch {\n clearInterval(suspendKeepAlive);\n process.removeListener('SIGINT', ignoreSigint);\n }\n };\n\n const openExternalEditor = () => {\n const dir = mkdtempSync(join(tmpdir(), 'xopc-tui-edit-'));\n const filePath = join(dir, 'message.md');\n writeFileSync(filePath, editor.getText(), 'utf8');\n const editorBin = process.env.EDITOR || process.env.VISUAL || 'vi';\n void (async () => {\n await withTuiSuspended(tui, async () => {\n spawnSync(editorBin, [filePath], { stdio: 'inherit' });\n });\n try {\n const next = readFileSync(filePath, 'utf8');\n editor.setText(next.replace(/\\r\\n/g, '\\n'));\n } catch {\n // ignore\n }\n try {\n unlinkSync(filePath);\n } catch {\n // ignore\n }\n tui.setFocus(editor);\n tui.requestRender(true);\n })();\n };\n\n const isAgentBusy = () =>\n state.activeRunId != null || state.isCompacting || busyStates.has(state.activityStatus);\n\n let steeringInFlightForRunId: string | null = null;\n\n const sendSteeringToActiveRun = (text: string) => {\n chatLog.addUser(text);\n touchStreamingActivity();\n tui.requestRender();\n void client\n .steerChat({ sessionKey: state.currentSessionKey, message: text })\n .then(({ ok }) => {\n if (!ok) {\n chatLog.addSystem(\n theme.dim(\n formatSteerUnavailableHint(keybindings),\n ),\n );\n } else {\n chatLog.addSystem(\n theme.dim('Steered — message injects at the next tool boundary (pi-style).'),\n );\n }\n tui.requestRender();\n })\n .catch((error: unknown) => {\n const errorMessage = error instanceof Error ? error.message : String(error);\n chatLog.addSystem(theme.dim(`Steer failed: ${errorMessage}`));\n tui.requestRender();\n });\n };\n\n const flushSteeringQueue = () => {\n if (state.exitRequested) return;\n if (state.activeRunId) return;\n const next = drainFollowUpQueue(state.steeringQueue, tuiSettings.steeringMode);\n if (next === undefined) return;\n sendMessage(next);\n };\n\n const steerMessage = (text: string) => {\n if (!state.activeRunId) {\n sendMessage(text);\n return;\n }\n if (steeringInFlightForRunId === state.activeRunId) {\n state.steeringQueue.push(text);\n chatLog.addSystem(\n theme.dim(\n `Queued steering (${state.steeringQueue.length} in queue). ${tuiSettings.steeringMode === 'all' ? 'All queued steering sends together after this reply.' : 'Next sends after this reply.'}`,\n ),\n );\n bottomBar.invalidate();\n tui.requestRender();\n return;\n }\n steeringInFlightForRunId = state.activeRunId;\n sendSteeringToActiveRun(text);\n };\n\n const sendMessage = (text: string) => {\n if (state.activeRunId && pendingImageAttachments.length > 0) {\n chatLog.addSystem(\n theme.dim('Image attachments cannot be steered into an active run. Wait for this reply to finish, then send.'),\n );\n tui.requestRender();\n return;\n }\n const pendingCustomText = pendingNextTurnCustomMessages.splice(0).join('\\n\\n').trim();\n const messageText = [text, pendingCustomText].filter(Boolean).join('\\n\\n');\n const attachments = pendingImageAttachments;\n pendingImageAttachments = [];\n if (state.isCompacting) {\n state.compactionQueue.push(messageText);\n if (attachments.length > 0) {\n pendingImageAttachments.unshift(...attachments);\n }\n chatLog.addSystem(\n theme.dim(`Queued during compaction (${state.compactionQueue.length}). Sends when compact finishes.`),\n );\n bottomBar.invalidate();\n tui.requestRender();\n return;\n }\n\n if (state.activeRunId) {\n chatLog.addSystem(\n formatBusyResponseHint(keybindings),\n );\n if (pendingCustomText) {\n pendingNextTurnCustomMessages.unshift(pendingCustomText);\n }\n if (attachments.length > 0) {\n pendingImageAttachments.unshift(...attachments);\n }\n tui.requestRender();\n return;\n }\n\n chatLog.addUser(userDisplayContentForAttachments(text, attachments));\n sessionSnapshot.appendMessage('user', messageText);\n lastRetryMessageText = messageText;\n markRunSending(state);\n setActivityStatus('sending');\n touchStreamingActivity();\n tui.requestRender();\n\n void client\n .sendChat({\n sessionKey: state.currentSessionKey,\n message: messageText,\n attachments: attachments.length > 0 ? attachments : undefined,\n thinking: opts.thinking,\n })\n .catch((error: unknown) => {\n const errorMessage = error instanceof Error ? error.message : String(error);\n if (attachments.length > 0) {\n pendingImageAttachments.unshift(...attachments);\n }\n chatLog.addSystem(`❌ Failed to send: ${errorMessage}`);\n setActivityStatus('idle');\n tui.requestRender();\n });\n };\n\n sendExtensionUserMessage = (content, options) => {\n const text = extensionUserMessageContentToText(content).trim();\n if (!text) {\n throw new Error('sendUserMessage requires text content.');\n }\n if (!state.activeRunId) {\n sendMessage(text);\n return;\n }\n if (options?.deliverAs === 'steer') {\n steerMessage(text);\n return;\n }\n if (options?.deliverAs === 'followUp') {\n state.messageFollowUpQueue.push(text);\n chatLog.addSystem(\n theme.dim(\n `Queued follow-up (${state.messageFollowUpQueue.length} in queue). ${tuiSettings.followUpMode === 'all' ? 'All queued messages send together when this reply finishes.' : 'Next sends when this reply finishes.'}`,\n ),\n );\n bottomBar.invalidate();\n tui.requestRender();\n return;\n }\n throw new Error('Agent is busy. Use deliverAs: \"steer\" or \"followUp\".');\n };\n\n const runCompaction = async (\n instructions?: string,\n callbacks?: {\n onComplete?: (result: TuiCompactionResult) => void;\n onError?: (error: Error) => void;\n },\n ): Promise<TuiCompactionResult | undefined> => {\n if (state.isCompacting) return undefined;\n state.isCompacting = true;\n setActivityStatus('compacting');\n chatLog.addSystem(\n theme.dim(\n instructions ? `Compacting session with instructions: ${instructions}` : 'Compacting session…',\n ),\n );\n tui.requestRender();\n try {\n const result = await client.compactSession(state.currentSessionKey, { force: true, instructions });\n if (result.compacted) {\n clearSeenStreamEvents();\n state.historyLoaded = false;\n await loadSessionHistory();\n chatLog.addCompactionSummary(result);\n } else {\n chatLog.addSystem(formatTuiCompactionResult(result));\n }\n callbacks?.onComplete?.(result);\n return result;\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n chatLog.addSystem(`❌ Compaction failed: ${errorMessage}`);\n callbacks?.onError?.(error instanceof Error ? error : new Error(errorMessage));\n return undefined;\n } finally {\n state.isCompacting = false;\n setActivityStatus('idle');\n await refreshSessionInfoWithBorder();\n const queued = state.compactionQueue.shift();\n if (queued && !state.activeRunId) {\n sendMessage(queued);\n }\n updateFooter();\n tui.requestRender();\n }\n };\n\n const applyTuiSettings = (settings: TuiSettings) => {\n tuiSettings = { ...settings };\n saveTuiSettings(tuiSettings);\n state.showThinking = tuiSettings.showThinking;\n state.toolsExpanded = tuiSettings.toolsExpanded;\n chatLog.setShowThinking(tuiSettings.showThinking);\n chatLog.setToolsExpanded(tuiSettings.toolsExpanded);\n chatLog.setToolImageOptions({\n showImages: tuiSettings.showImages,\n imageWidthCells: tuiSettings.imageWidthCells,\n cwd: process.cwd(),\n });\n tui.setShowHardwareCursor(tuiSettings.showHardwareCursor);\n tui.setClearOnShrink(tuiSettings.clearOnShrink);\n defaultEditor.setPaddingX(tuiSettings.editorPaddingX);\n defaultEditor.setAutocompleteMaxVisible(tuiSettings.autocompleteMaxVisible);\n if (editor !== defaultEditor) {\n editor.setPaddingX?.(tuiSettings.editorPaddingX);\n editor.setAutocompleteMaxVisible?.(tuiSettings.autocompleteMaxVisible);\n }\n applyThemeById(tuiSettings.theme);\n header.invalidate();\n updateEditorBorderColor();\n syncTerminalProgress();\n bottomBar.invalidate();\n tui.requestRender();\n };\n\n const previewTheme = (themeId: string) => {\n applyThemeById(themeId);\n updateEditorBorderColor();\n tui.requestRender();\n };\n\n const reloadTuiRuntime = async () => {\n if (state.activeRunId) {\n throw new Error('Wait for the current response to finish before reloading.');\n }\n if (state.isCompacting) {\n throw new Error('Wait for compaction to finish before reloading.');\n }\n keybindings.reload();\n setKeybindings(keybindings);\n applyTuiSettings(loadTuiSettings());\n extensionRuntime.dispose();\n await extensionRuntime.activate();\n editor.setAutocompleteProvider?.(extensionRuntime.autocompleteProvider);\n setEditorExtensionShortcut();\n updateHeader();\n updateFooter();\n tui.requestRender();\n };\n\n const uiOverlays = {\n openModelPicker: (_initialSearch?: string) => {},\n openAgentPicker: () => {},\n openSessionPicker: () => {},\n openSessionTree: () => {},\n openTranscriptTree: () => {},\n openUserMessageFork: () => {},\n openScopedModels: () => {},\n openThinkingSelector: () => {},\n openSettings: () => {},\n openProjectTrust: () => {},\n reloadKeybindings: () => reloadTuiRuntime(),\n };\n\n const recoverCurrentStream = async () => {\n if (state.activeRunId) {\n await recoverActiveRunFromHistory('manual recover');\n return;\n }\n await loadSessionHistory({ merge: true });\n await refreshSessionInfoWithBorder();\n chatLog.addSystem(theme.dim('Reloaded persisted history; no active run to recover.'));\n tui.requestRender();\n };\n\n const retryLastMessage = async () => {\n const message = lastRetryMessageText?.trim();\n if (!message) {\n chatLog.addSystem('No previous user message to retry.');\n return;\n }\n if (state.activeRunId) {\n await abortActive({ clearUi: false });\n }\n sendMessage(message);\n };\n\n const switchAgentSession = async (sessionKey: string, agentId: string) => {\n const previousWorkspace = state.sessionInfo.effectiveWorkspacePath?.trim();\n await setSession(sessionKey);\n await refreshStartupResources();\n if (previousWorkspace && state.sessionInfo.workingDirectoryLocked !== true) {\n try {\n await client.patchSession(state.currentSessionKey, { workingDirectory: previousWorkspace });\n state.sessionInfo.effectiveWorkspacePath = previousWorkspace;\n state.sessionInfo.workingDirectoryLocked = true;\n await refreshSessionInfoWithBorder();\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Switched agent, but workspace was not copied: ${errorMessage}`);\n }\n }\n currentAgentId = agentId;\n updateHeader();\n updateFooter();\n };\n\n const handleCommand = createTuiCommandHandler({\n state,\n chatLog,\n tui,\n isLocalMode,\n abortActive,\n sendMessage,\n requestExit,\n updateFooter,\n keybindings,\n recoverStream: recoverCurrentStream,\n retryLastMessage,\n uiOverlays,\n setThinkingLevel,\n setReasoningLevel,\n setVerboseLevel,\n copyLastAssistant,\n renameCurrentSession,\n runCompaction,\n listModels: listCurrentModels,\n switchModel: switchCurrentModel,\n listSessions: () => client.listSessions(),\n listAgents: () => client.listAgents(),\n switchAgentSession,\n getSessionStats: () => client.getSessionStats(state.currentSessionKey),\n getStartupResources: () => startupResources,\n loadTranscriptTree: () => client.loadTranscriptTree(state.currentSessionKey),\n exportSession: exportCurrentSession,\n importSession: importSessionExport,\n createShare: createShareLink,\n runBtwQuery,\n forkSession: forkCurrentSession,\n extensionSlashCommands: extensionRuntime.slashCommands,\n extensionShortcuts: extensionRuntime.shortcuts,\n currentAgentId,\n setSession: async (rawKey) => {\n await setSession(rawKey);\n await refreshStartupResources();\n },\n resetSession: resetCurrentSession,\n projectTrust: {\n cwd: process.cwd(),\n hasProjectResources: () => hasTrustRequiringProjectResources(process.cwd()),\n getStorePath: () => projectTrustStore.getPath(),\n getEntry: () => projectTrustStore.getEntry(process.cwd()),\n getSessionDecision: () => projectTrustSessionDecision,\n },\n runLogin: (provider) =>\n runTuiOAuthLogin(provider, {\n chatLog,\n tui,\n editor,\n openOverlay: openCommandOverlay,\n closeOverlay: closeCommandOverlay,\n keybindings,\n }),\n });\n\n const { runLocalShellLine } = createLocalShellRunner({\n chatLog,\n tui,\n editor,\n openOverlay: openCommandOverlay,\n closeOverlay: closeCommandOverlay,\n pauseStdioFilter: () => stdioFilter.pause(),\n resumeStdioFilter: () => stdioFilter.resume(),\n runWithInheritedStdio: async (work) => {\n await withTuiSuspended(tui, work);\n },\n keybindings,\n getCwd: () => {\n const workspace = state.sessionInfo.effectiveWorkspacePath?.trim();\n if (!workspace) {\n throw new Error('Workspace is not loaded yet.');\n }\n return workspace;\n },\n onComplete: async (entry) => {\n await client\n .appendBashExecution(state.currentSessionKey, entry)\n .catch((err: unknown) => {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Bash transcript append failed: ${errorMessage}`);\n })\n .finally(() => {\n updateFooter();\n tui.requestRender();\n });\n },\n });\n\n const submitCore = createEditorSubmitHandler({\n editor: {\n setText: (value) => editor.setText(value),\n addToHistory: (value) => editor.addToHistory?.(value),\n },\n handleCommand,\n sendMessage,\n handleBangLine: runLocalShellLine,\n isAgentBusy,\n steerWhileBusy: steerMessage,\n hasPendingAttachments: () => pendingImageAttachments.length > 0,\n defaultAttachmentMessage: 'Please analyze the attached image.',\n });\n\n const submitBurst = createSubmitBurstCoalescer({\n submit: submitCore,\n enabled: shouldEnableWindowsGitBashPasteFallback(),\n });\n defaultEditor.onSubmit = submitBurst;\n\n const flushFollowUpQueue = () => {\n if (state.exitRequested) return;\n if (state.activeRunId) return;\n const next = drainFollowUpQueue(state.messageFollowUpQueue, tuiSettings.followUpMode);\n if (next === undefined) return;\n sendMessage(next);\n };\n\n const handleFollowUp = () => {\n const text = editor.getText().trim();\n if (!text && pendingImageAttachments.length === 0) return;\n if (isAgentBusy()) {\n if (pendingImageAttachments.length > 0) {\n chatLog.addSystem(\n theme.dim('Image attachments cannot be queued while the agent is busy. Wait for this reply to finish, then send.'),\n );\n tui.requestRender();\n return;\n }\n editor.addToHistory(text);\n state.messageFollowUpQueue.push(text);\n editor.setText('');\n chatLog.addSystem(\n theme.dim(\n `Queued follow-up (${state.messageFollowUpQueue.length} in queue). ${tuiSettings.followUpMode === 'all' ? 'All queued messages send together when this reply finishes.' : 'Next sends when this reply finishes.'}`,\n ),\n );\n bottomBar.invalidate();\n tui.requestRender();\n return;\n }\n submitBurst(text);\n };\n\n const handleDequeue = () => {\n const restored = restoreQueuedMessages(\n {\n steeringQueue: state.steeringQueue,\n followUpQueue: state.messageFollowUpQueue,\n },\n editor.getText(),\n );\n if (restored.restoredCount === 0) {\n chatLog.addStatus(theme.dim('No queued messages to restore.'));\n tui.requestRender();\n return;\n }\n editor.setText(restored.text);\n chatLog.addStatus(\n theme.dim(\n `Restored ${restored.restoredCount} queued message${restored.restoredCount > 1 ? 's' : ''} to editor.`,\n ),\n );\n bottomBar.invalidate();\n tui.requestRender();\n };\n\n const setSessionKey = (key: string) => {\n state.currentSessionKey = resolveSessionKey(key);\n updateAgentFromPicker(key);\n };\n\n const updateAgentFromPicker = (key: string) => {\n const parsed = parseAgentSessionKey(resolveSessionKey(key));\n if (parsed?.agentId) {\n currentAgentId = parsed.agentId;\n }\n };\n\n let ctrlCHandling = false;\n const handleCtrlC = () => {\n if (ctrlCHandling) return;\n ctrlCHandling = true;\n try {\n const now = Date.now();\n const decision = resolveCtrlCAction({\n hasInput: editor.getText().trim().length > 0,\n now,\n lastCtrlCAt: state.lastCtrlCAt,\n });\n state.lastCtrlCAt = decision.nextLastCtrlCAt;\n if (decision.action === 'clear') {\n editor.setText('');\n setActivityStatus('cleared input; press ctrl+c again to exit');\n tui.requestRender();\n return;\n }\n if (decision.action === 'exit') {\n requestExit();\n return;\n }\n setActivityStatus('press ctrl+c again to exit');\n tui.requestRender();\n } finally {\n ctrlCHandling = false;\n }\n };\n\n const setModelChoices = (models: TuiModelChoice[]) => {\n modelChoices = models;\n };\n\n const pickerSvc = {\n tui,\n editor,\n openOverlay: openCommandOverlay,\n closeOverlay: closeCommandOverlay,\n chatLog,\n client,\n sendMessage,\n switchModel: switchCurrentModel,\n openEditorSelector,\n refreshSessionInfo,\n updateHeader,\n state,\n setSessionKey,\n switchAgentSession,\n clearChatForSessionSwitch,\n loadSessionHistory,\n setEditorText: (text: string) => editor.setText(text),\n setModelChoices,\n getScopedModelRefs: () => state.scopedModelRefs,\n setScopedModelRefs: (refs: string[] | null) => {\n state.scopedModelRefs = refs;\n saveScopedModelRefs(refs);\n },\n refreshCycleModels,\n getTuiSettings: () => ({ ...tuiSettings }),\n applyTuiSettings,\n previewTheme,\n reloadKeybindings: reloadTuiRuntime,\n setThinkingLevel,\n getProjectTrustStore: () => projectTrustStore,\n getProjectTrustSessionDecision: () => projectTrustSessionDecision,\n setProjectTrustSessionDecision: (decision: boolean | null) => {\n projectTrustSessionDecision = decision;\n },\n keybindings,\n };\n\n uiOverlays.openModelPicker = (initialSearch?: string) =>\n void openModelPickerOverlay(pickerSvc, initialSearch);\n uiOverlays.openAgentPicker = () => void openAgentPickerOverlay(pickerSvc);\n uiOverlays.openSessionPicker = () => void openSessionPickerOverlay(pickerSvc);\n uiOverlays.openSessionTree = () => void openSessionTreeOverlay(pickerSvc);\n uiOverlays.openTranscriptTree = () => void openTranscriptTreeOverlay(pickerSvc);\n uiOverlays.openUserMessageFork = () => void openUserMessageForkOverlay(pickerSvc);\n uiOverlays.openScopedModels = () => void openScopedModelsOverlay(pickerSvc);\n uiOverlays.openThinkingSelector = () => openThinkingSelectorOverlay(pickerSvc);\n uiOverlays.openSettings = () => openSettingsOverlay(pickerSvc);\n uiOverlays.openProjectTrust = () => openProjectTrustOverlay(pickerSvc);\n\n const showSessionTree = () => {\n uiOverlays.openTranscriptTree();\n };\n\n const handleDoubleEscape = () => {\n switch (tuiSettings.doubleEscapeAction) {\n case 'tree':\n showSessionTree();\n break;\n case 'fork':\n uiOverlays.openUserMessageFork();\n break;\n default:\n break;\n }\n };\n\n defaultEditor.onEscape = () => {\n if (state.activeRunId) {\n void abortActive();\n return;\n }\n if (editor.getText().trim().length > 0) return;\n const now = Date.now();\n if (now - state.lastEscapeAt <= DOUBLE_ESCAPE_WINDOW_MS) {\n state.lastEscapeAt = 0;\n handleDoubleEscape();\n return;\n }\n state.lastEscapeAt = now;\n };\n defaultEditor.onCtrlD = () => requestExit();\n\n defaultEditor.onAction('app.clear', handleCtrlC);\n defaultEditor.onAction('app.exit', () => requestExit());\n defaultEditor.onAction('app.suspend', handleCtrlZ);\n defaultEditor.onAction('app.thinking.cycle', () => {\n const cur = state.sessionInfo.thinkingLevel ?? opts.thinking ?? 'medium';\n void setThinkingLevel(nextThinkLevel(cur));\n });\n defaultEditor.onAction('app.model.cycleForward', () => cycleModel('forward'));\n defaultEditor.onAction('app.model.cycleBackward', () => cycleModel('backward'));\n defaultEditor.onAction('app.model.select', () => uiOverlays.openModelPicker());\n defaultEditor.onAction('app.session.resume', () => void openSessionPickerOverlay(pickerSvc));\n defaultEditor.onAction('app.session.tree', showSessionTree);\n defaultEditor.onAction('app.session.fork', () => uiOverlays.openUserMessageFork());\n defaultEditor.onAction('app.tools.expand', () => {\n state.toolsExpanded = !state.toolsExpanded;\n tuiSettings = { ...tuiSettings, toolsExpanded: state.toolsExpanded };\n saveTuiSettings(tuiSettings);\n chatLog.setToolsExpanded(state.toolsExpanded);\n setActivityStatus(state.toolsExpanded ? 'tools expanded' : 'tools collapsed');\n tui.requestRender();\n });\n defaultEditor.onAction('app.thinking.toggle', () => {\n state.showThinking = !state.showThinking;\n tuiSettings = { ...tuiSettings, showThinking: state.showThinking };\n saveTuiSettings(tuiSettings);\n chatLog.setShowThinking(state.showThinking);\n updateFooter();\n tui.requestRender();\n });\n defaultEditor.onAction('app.editor.external', openExternalEditor);\n defaultEditor.onPasteImage = () => {\n void (async () => {\n const image = await readClipboardImage();\n if (!image) {\n chatLog.addStatus(theme.dim('No image found on clipboard.'));\n tui.requestRender();\n return;\n }\n if (pendingImageAttachments.length >= MAX_CHAT_ATTACHMENTS) {\n chatLog.addSystem(`Attachment limit reached (${MAX_CHAT_ATTACHMENTS}). Send or clear the current draft first.`);\n tui.requestRender();\n return;\n }\n if (image.bytes.byteLength > MAX_WEBCHAT_ATTACHMENT_FILE_BYTES) {\n chatLog.addSystem(\n `Clipboard image is too large (${image.bytes.byteLength} bytes; max ${MAX_WEBCHAT_ATTACHMENT_FILE_BYTES}).`,\n );\n tui.requestRender();\n return;\n }\n const ext = extensionForImageMimeType(image.mimeType) ?? 'png';\n const name = `clipboard-${pendingImageAttachments.length + 1}.${ext}`;\n pendingImageAttachments.push({\n type: 'image',\n mimeType: image.mimeType,\n data: Buffer.from(image.bytes).toString('base64'),\n name,\n size: image.bytes.byteLength,\n });\n chatLog.addStatus(\n theme.dim(\n `Attached image: ${name} (${pendingImageAttachments.length} pending). Send a message to include it.`,\n ),\n );\n tui.requestRender();\n })();\n };\n defaultEditor.onAction('app.message.followUp', handleFollowUp);\n defaultEditor.onAction('app.message.dequeue', handleDequeue);\n\n streamWatchdogId = setInterval(() => {\n const now = Date.now();\n if (!isActiveRunStreamStale(state, now, DEFAULT_STREAMING_WATCHDOG_MS)) return;\n if (!markActiveRunStalled(state, now)) return;\n chatLog.addSystem(\n theme.dim(\n 'No stream activity for 30s; preserving active run and reloading persisted history.',\n ),\n );\n setActivityStatus('stalled');\n void recoverActiveRunFromHistory('stream watchdog');\n tui.requestRender();\n }, 5000);\n\n const onAgentRunEnded = () => {\n state.progressMessage = null;\n steeringInFlightForRunId = null;\n void refreshSessionInfoWithBorder().finally(() => {\n updateFooter();\n tui.requestRender();\n });\n flushSteeringQueue();\n flushFollowUpQueue();\n };\n\n client.onEvent = (evt: TuiEvent) => {\n const data = (evt.data ?? {}) as Record<string, unknown>;\n dispatchAgentEvent(\n evt.event,\n data,\n state,\n chatLog,\n tui,\n setActivityStatus,\n touchStreamingActivity,\n onAgentRunEnded,\n (message) => sessionSnapshot.appendMessage('assistant', assistantMessagePlainText(message)),\n evt.source,\n );\n };\n\n client.onConnected = () => {\n state.isConnected = true;\n setConnectionStatus(isLocalMode ? 'local ready' : 'gateway connected');\n touchStreamingActivity();\n void (async () => {\n try {\n await applyStartupWorkingDirectory();\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n chatLog.addSystem(`Working directory not changed: ${errorMessage}`);\n }\n await refreshSessionInfoWithBorder();\n await refreshModelChoices();\n await refreshStartupResources();\n await loadSessionHistory({ merge: true });\n showStartupCardOnce();\n if (state.activeRunId) {\n void recoverActiveRunFromHistory('broadcast reconnect');\n }\n if (\n !projectTrustPromptShown &&\n isLocalMode &&\n projectTrustSessionDecision === null &&\n hasTrustRequiringProjectResources(process.cwd()) &&\n projectTrustStore.get(process.cwd()) === null\n ) {\n projectTrustPromptShown = true;\n chatLog.addSystem(\n 'Project-local xopc resources detected. Use /trust to trust this folder, trust a parent folder, or keep it untrusted.',\n );\n }\n updateHeader();\n updateFooter();\n tui.requestRender();\n if (!state.autoMessageSent && opts.message) {\n state.autoMessageSent = true;\n sendMessage(opts.message);\n }\n })();\n };\n\n client.onDisconnected = (reason: string) => {\n const wasConnected = state.isConnected;\n state.isConnected = false;\n touchStreamingActivity();\n if (isLocalMode) {\n setConnectionStatus(`local stopped: ${reason}`);\n } else {\n const hint =\n wasConnected || state.historyLoaded\n ? ` (${reason}). Reconnecting broadcast stream…`\n : `. Ensure gateway is running (xopc gateway) or use --local.`;\n setConnectionStatus(`disconnected${hint}`);\n if (!wasConnected && !state.historyLoaded) {\n const gatewayUrl = opts.url ?? 'http://localhost:3120';\n chatLog.addSystem(\n `Cannot reach gateway at ${gatewayUrl}.\\n` +\n 'Start the gateway (`xopc gateway`) or run `xopc tui --local` for embedded mode.',\n );\n }\n }\n tui.requestRender();\n };\n\n client.onGap = (info) => {\n chatLog.addSystem(\n `⚠️ Event gap: expected ${info.expected}, received ${info.received}. Some updates may be missing.`,\n );\n setConnectionStatus(`event gap: expected ${info.expected}, got ${info.received}`);\n if (state.activeRunId) {\n void recoverActiveRunFromHistory('broadcast event gap');\n } else {\n void loadSessionHistory({ merge: true });\n }\n tui.requestRender();\n };\n\n const sigintHandler = () => handleCtrlC();\n const sigtermHandler = () => requestExit();\n process.on('SIGINT', sigintHandler);\n process.on('SIGTERM', sigtermHandler);\n\n updateHeader();\n updateEditorBorderColor();\n setConnectionStatus(isLocalMode ? 'starting local runtime' : 'connecting');\n updateFooter();\n await extensionRuntime.activate();\n tui.start();\n client.start();\n\n await new Promise<void>((resolve) => {\n finishTui = () => {\n process.removeListener('SIGINT', sigintHandler);\n process.removeListener('SIGTERM', sigtermHandler);\n if (streamWatchdogId) {\n clearInterval(streamWatchdogId);\n streamWatchdogId = null;\n }\n finishTui = null;\n resolve();\n };\n });\n\n return exitResult;\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** App-level bindings wired by xopc TUI (subset of pi coding-agent). */
|
|
2
|
-
export type XopcTuiAppKeybinding = 'app.interrupt' | 'app.clear' | 'app.exit' | 'app.suspend' | 'app.thinking.cycle' | 'app.model.cycleForward' | 'app.model.cycleBackward' | 'app.model.select' | 'app.tools.expand' | 'app.thinking.toggle' | 'app.session.resume' | 'app.editor.external' | 'app.clipboard.pasteImage' | 'app.message.followUp' | 'app.message.dequeue';
|
|
2
|
+
export type XopcTuiAppKeybinding = 'app.interrupt' | 'app.clear' | 'app.exit' | 'app.suspend' | 'app.thinking.cycle' | 'app.model.cycleForward' | 'app.model.cycleBackward' | 'app.model.select' | 'app.tools.expand' | 'app.thinking.toggle' | 'app.session.resume' | 'app.session.tree' | 'app.session.fork' | 'app.session.togglePath' | 'app.session.toggleSort' | 'app.session.toggleNamedFilter' | 'app.session.rename' | 'app.session.delete' | 'app.session.deleteNoninvasive' | 'app.tree.foldOrUp' | 'app.tree.unfoldOrDown' | 'app.tree.filter.default' | 'app.tree.filter.noTools' | 'app.tree.filter.userOnly' | 'app.tree.filter.labeledOnly' | 'app.tree.filter.all' | 'app.tree.filter.cycleForward' | 'app.tree.filter.cycleBackward' | 'app.tree.editLabel' | 'app.tree.toggleLabelTimestamp' | 'app.editor.external' | 'app.clipboard.pasteImage' | 'app.message.followUp' | 'app.message.dequeue' | 'app.models.save' | 'app.models.enableAll' | 'app.models.clearAll' | 'app.models.toggleProvider' | 'app.models.reorderUp' | 'app.models.reorderDown';
|
|
3
3
|
declare module '@earendil-works/pi-tui' {
|
|
4
4
|
interface Keybindings {
|
|
5
5
|
'app.interrupt': true;
|
|
@@ -13,10 +13,35 @@ declare module '@earendil-works/pi-tui' {
|
|
|
13
13
|
'app.tools.expand': true;
|
|
14
14
|
'app.thinking.toggle': true;
|
|
15
15
|
'app.session.resume': true;
|
|
16
|
+
'app.session.tree': true;
|
|
17
|
+
'app.session.fork': true;
|
|
18
|
+
'app.session.togglePath': true;
|
|
19
|
+
'app.session.toggleSort': true;
|
|
20
|
+
'app.session.toggleNamedFilter': true;
|
|
21
|
+
'app.session.rename': true;
|
|
22
|
+
'app.session.delete': true;
|
|
23
|
+
'app.session.deleteNoninvasive': true;
|
|
24
|
+
'app.tree.foldOrUp': true;
|
|
25
|
+
'app.tree.unfoldOrDown': true;
|
|
26
|
+
'app.tree.filter.default': true;
|
|
27
|
+
'app.tree.filter.noTools': true;
|
|
28
|
+
'app.tree.filter.userOnly': true;
|
|
29
|
+
'app.tree.filter.labeledOnly': true;
|
|
30
|
+
'app.tree.filter.all': true;
|
|
31
|
+
'app.tree.filter.cycleForward': true;
|
|
32
|
+
'app.tree.filter.cycleBackward': true;
|
|
33
|
+
'app.tree.editLabel': true;
|
|
34
|
+
'app.tree.toggleLabelTimestamp': true;
|
|
16
35
|
'app.editor.external': true;
|
|
17
36
|
'app.clipboard.pasteImage': true;
|
|
18
37
|
'app.message.followUp': true;
|
|
19
38
|
'app.message.dequeue': true;
|
|
39
|
+
'app.models.save': true;
|
|
40
|
+
'app.models.enableAll': true;
|
|
41
|
+
'app.models.clearAll': true;
|
|
42
|
+
'app.models.toggleProvider': true;
|
|
43
|
+
'app.models.reorderUp': true;
|
|
44
|
+
'app.models.reorderDown': true;
|
|
20
45
|
}
|
|
21
46
|
}
|
|
22
47
|
export declare const XOPC_TUI_KEYBINDINGS: {
|
|
@@ -64,13 +89,89 @@ export declare const XOPC_TUI_KEYBINDINGS: {
|
|
|
64
89
|
readonly defaultKeys: "ctrl+shift+p";
|
|
65
90
|
readonly description: "Session picker";
|
|
66
91
|
};
|
|
92
|
+
readonly 'app.session.tree': {
|
|
93
|
+
readonly defaultKeys: [];
|
|
94
|
+
readonly description: "Show session tree";
|
|
95
|
+
};
|
|
96
|
+
readonly 'app.session.fork': {
|
|
97
|
+
readonly defaultKeys: [];
|
|
98
|
+
readonly description: "Fork current session";
|
|
99
|
+
};
|
|
100
|
+
readonly 'app.session.togglePath': {
|
|
101
|
+
readonly defaultKeys: "ctrl+p";
|
|
102
|
+
readonly description: "Toggle session key display";
|
|
103
|
+
};
|
|
104
|
+
readonly 'app.session.toggleSort': {
|
|
105
|
+
readonly defaultKeys: "ctrl+s";
|
|
106
|
+
readonly description: "Toggle session sort mode";
|
|
107
|
+
};
|
|
108
|
+
readonly 'app.session.toggleNamedFilter': {
|
|
109
|
+
readonly defaultKeys: "ctrl+n";
|
|
110
|
+
readonly description: "Toggle named session filter";
|
|
111
|
+
};
|
|
112
|
+
readonly 'app.session.rename': {
|
|
113
|
+
readonly defaultKeys: "ctrl+r";
|
|
114
|
+
readonly description: "Rename selected session";
|
|
115
|
+
};
|
|
116
|
+
readonly 'app.session.delete': {
|
|
117
|
+
readonly defaultKeys: "ctrl+d";
|
|
118
|
+
readonly description: "Delete selected session";
|
|
119
|
+
};
|
|
120
|
+
readonly 'app.session.deleteNoninvasive': {
|
|
121
|
+
readonly defaultKeys: "ctrl+backspace";
|
|
122
|
+
readonly description: "Delete session when query is empty";
|
|
123
|
+
};
|
|
124
|
+
readonly 'app.tree.foldOrUp': {
|
|
125
|
+
readonly defaultKeys: ["ctrl+left", "alt+left"];
|
|
126
|
+
readonly description: "Fold tree branch or move up";
|
|
127
|
+
};
|
|
128
|
+
readonly 'app.tree.unfoldOrDown': {
|
|
129
|
+
readonly defaultKeys: ["ctrl+right", "alt+right"];
|
|
130
|
+
readonly description: "Unfold tree branch or move down";
|
|
131
|
+
};
|
|
132
|
+
readonly 'app.tree.filter.default': {
|
|
133
|
+
readonly defaultKeys: "ctrl+d";
|
|
134
|
+
readonly description: "Tree filter: default view";
|
|
135
|
+
};
|
|
136
|
+
readonly 'app.tree.filter.noTools': {
|
|
137
|
+
readonly defaultKeys: "ctrl+t";
|
|
138
|
+
readonly description: "Tree filter: hide tool results";
|
|
139
|
+
};
|
|
140
|
+
readonly 'app.tree.filter.userOnly': {
|
|
141
|
+
readonly defaultKeys: "ctrl+u";
|
|
142
|
+
readonly description: "Tree filter: user messages only";
|
|
143
|
+
};
|
|
144
|
+
readonly 'app.tree.filter.labeledOnly': {
|
|
145
|
+
readonly defaultKeys: "ctrl+l";
|
|
146
|
+
readonly description: "Tree filter: labeled entries only";
|
|
147
|
+
};
|
|
148
|
+
readonly 'app.tree.filter.all': {
|
|
149
|
+
readonly defaultKeys: "ctrl+a";
|
|
150
|
+
readonly description: "Tree filter: show all entries";
|
|
151
|
+
};
|
|
152
|
+
readonly 'app.tree.filter.cycleForward': {
|
|
153
|
+
readonly defaultKeys: "ctrl+o";
|
|
154
|
+
readonly description: "Tree filter: cycle forward";
|
|
155
|
+
};
|
|
156
|
+
readonly 'app.tree.filter.cycleBackward': {
|
|
157
|
+
readonly defaultKeys: "shift+ctrl+o";
|
|
158
|
+
readonly description: "Tree filter: cycle backward";
|
|
159
|
+
};
|
|
160
|
+
readonly 'app.tree.editLabel': {
|
|
161
|
+
readonly defaultKeys: "shift+l";
|
|
162
|
+
readonly description: "Edit tree label";
|
|
163
|
+
};
|
|
164
|
+
readonly 'app.tree.toggleLabelTimestamp': {
|
|
165
|
+
readonly defaultKeys: "shift+t";
|
|
166
|
+
readonly description: "Toggle tree label timestamps";
|
|
167
|
+
};
|
|
67
168
|
readonly 'app.editor.external': {
|
|
68
169
|
readonly defaultKeys: "ctrl+g";
|
|
69
170
|
readonly description: "Edit input in $EDITOR";
|
|
70
171
|
};
|
|
71
172
|
readonly 'app.clipboard.pasteImage': {
|
|
72
173
|
readonly defaultKeys: "alt+v" | "ctrl+v";
|
|
73
|
-
readonly description: "Paste image from clipboard
|
|
174
|
+
readonly description: "Paste image from clipboard";
|
|
74
175
|
};
|
|
75
176
|
readonly 'app.message.followUp': {
|
|
76
177
|
readonly defaultKeys: "alt+enter";
|
|
@@ -80,6 +181,30 @@ export declare const XOPC_TUI_KEYBINDINGS: {
|
|
|
80
181
|
readonly defaultKeys: "alt+up";
|
|
81
182
|
readonly description: "Restore queued messages to editor";
|
|
82
183
|
};
|
|
184
|
+
readonly 'app.models.save': {
|
|
185
|
+
readonly defaultKeys: "ctrl+s";
|
|
186
|
+
readonly description: "Save scoped model selection";
|
|
187
|
+
};
|
|
188
|
+
readonly 'app.models.enableAll': {
|
|
189
|
+
readonly defaultKeys: "ctrl+a";
|
|
190
|
+
readonly description: "Enable all scoped models";
|
|
191
|
+
};
|
|
192
|
+
readonly 'app.models.clearAll': {
|
|
193
|
+
readonly defaultKeys: "ctrl+x";
|
|
194
|
+
readonly description: "Clear scoped models";
|
|
195
|
+
};
|
|
196
|
+
readonly 'app.models.toggleProvider': {
|
|
197
|
+
readonly defaultKeys: "ctrl+p";
|
|
198
|
+
readonly description: "Toggle selected provider models";
|
|
199
|
+
};
|
|
200
|
+
readonly 'app.models.reorderUp': {
|
|
201
|
+
readonly defaultKeys: "alt+up";
|
|
202
|
+
readonly description: "Move scoped model up";
|
|
203
|
+
};
|
|
204
|
+
readonly 'app.models.reorderDown': {
|
|
205
|
+
readonly defaultKeys: "alt+down";
|
|
206
|
+
readonly description: "Move scoped model down";
|
|
207
|
+
};
|
|
83
208
|
readonly "tui.editor.cursorUp": {
|
|
84
209
|
readonly defaultKeys: "up";
|
|
85
210
|
readonly description: "Move cursor up";
|