@gajae-code/coding-agent 0.13.2 → 0.14.0
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/CHANGELOG.md +215 -8
- package/README.md +2 -0
- package/bin/gajaessi.js +4 -0
- package/dist/types/async/job-manager.d.ts +55 -2
- package/dist/types/async/support.d.ts +14 -0
- package/dist/types/capability/mcp.d.ts +6 -0
- package/dist/types/capability/types.d.ts +6 -0
- package/dist/types/cli/accounts-cli.d.ts +19 -0
- package/dist/types/cli/args.d.ts +3 -0
- package/dist/types/cli/config-cli.d.ts +6 -0
- package/dist/types/cli/crash-cli.d.ts +10 -0
- package/dist/types/cli/customize-doctor.d.ts +145 -0
- package/dist/types/cli/daemon-cli.d.ts +3 -1
- package/dist/types/cli/mcp-cli.d.ts +11 -0
- package/dist/types/cli/notify-cli.d.ts +1 -1
- package/dist/types/cli/root-flags.d.ts +12 -0
- package/dist/types/cli/setup-cli.d.ts +3 -1
- package/dist/types/cli/skills-cli.d.ts +2 -1
- package/dist/types/cli/update-cli.d.ts +19 -1
- package/dist/types/cli.d.ts +6 -0
- package/dist/types/commands/accounts.d.ts +40 -0
- package/dist/types/commands/crash.d.ts +24 -0
- package/dist/types/commands/customize.d.ts +22 -0
- package/dist/types/commands/daemon.d.ts +1 -1
- package/dist/types/commands/launch.d.ts +6 -0
- package/dist/types/commands/setup.d.ts +6 -0
- package/dist/types/commands/skills.d.ts +6 -1
- package/dist/types/commands/update.d.ts +7 -0
- package/dist/types/config/atomic-yaml-patch-worker.d.ts +25 -0
- package/dist/types/config/atomic-yaml-patch.d.ts +62 -2
- package/dist/types/config/config-schema-version.d.ts +10 -0
- package/dist/types/config/file-lock.d.ts +18 -0
- package/dist/types/config/model-profile-activation.d.ts +3 -1
- package/dist/types/config/model-registry.d.ts +10 -1
- package/dist/types/config/models-config-schema.d.ts +2 -0
- package/dist/types/config/settings-schema.d.ts +73 -9
- package/dist/types/config/settings.d.ts +63 -0
- package/dist/types/config/skill-settings-defaults.d.ts +26 -0
- package/dist/types/config/task-delegation.d.ts +39 -0
- package/dist/types/config/update-channel.d.ts +10 -0
- package/dist/types/coordinator-mcp/server.d.ts +5 -1
- package/dist/types/crash/index-store.d.ts +87 -0
- package/dist/types/crash/nudge.d.ts +50 -0
- package/dist/types/crash/record-loader.d.ts +17 -0
- package/dist/types/crash/report.d.ts +134 -0
- package/dist/types/crash/sanitize.d.ts +25 -0
- package/dist/types/cursor.d.ts +13 -2
- package/dist/types/customization/import.d.ts +37 -0
- package/dist/types/customization/index.d.ts +4 -0
- package/dist/types/customization/inventory.d.ts +25 -0
- package/dist/types/customization/mutations.d.ts +32 -0
- package/dist/types/customization/types.d.ts +115 -0
- package/dist/types/daemon/control-types.d.ts +8 -1
- package/dist/types/daemon/operator-contract.d.ts +4 -4
- package/dist/types/discovery/claude.d.ts +39 -1
- package/dist/types/discovery/codex.d.ts +39 -1
- package/dist/types/discovery/index.d.ts +2 -0
- package/dist/types/discovery/mcp-compat.d.ts +30 -0
- package/dist/types/edit/renderer.d.ts +23 -0
- package/dist/types/extensibility/extensions/runner.d.ts +3 -0
- package/dist/types/extensibility/extensions/types.d.ts +21 -4
- package/dist/types/extensibility/gjc-plugins/observability.d.ts +6 -1
- package/dist/types/extensibility/gjc-plugins/registry.d.ts +8 -1
- package/dist/types/extensibility/hooks/loader.d.ts +19 -5
- package/dist/types/extensibility/runtime-skill-discovery.d.ts +22 -1
- package/dist/types/extensibility/skill-management.d.ts +107 -0
- package/dist/types/gjc-runtime/deep-interview-runtime.d.ts +3 -1
- package/dist/types/gjc-runtime/launch-worktree.d.ts +8 -0
- package/dist/types/gjc-runtime/linux-proc.d.ts +3 -0
- package/dist/types/gjc-runtime/ralplan-runtime.d.ts +10 -6
- package/dist/types/gjc-runtime/session-state-lock.d.ts +104 -0
- package/dist/types/gjc-runtime/session-state-sidecar.d.ts +120 -2
- package/dist/types/gjc-runtime/state-writer.d.ts +10 -1
- package/dist/types/gjc-runtime/ultragoal-guard.d.ts +4 -2
- package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +8 -6
- package/dist/types/gjc-runtime/workflow-settings.d.ts +109 -0
- package/dist/types/hooks/events.d.ts +60 -0
- package/dist/types/hooks/normalize.d.ts +83 -0
- package/dist/types/hooks/skill-state.d.ts +9 -2
- package/dist/types/main.d.ts +2 -1
- package/dist/types/modes/acp/abort-scope.d.ts +13 -0
- package/dist/types/modes/acp/acp-agent.d.ts +7 -4
- package/dist/types/modes/components/customization/customization-dashboard.d.ts +44 -0
- package/dist/types/modes/components/customization/import-wizard.d.ts +21 -0
- package/dist/types/modes/components/customization/index.d.ts +1 -0
- package/dist/types/modes/components/dynamic-theme-text.d.ts +9 -0
- package/dist/types/modes/components/gajae-pet-widget.d.ts +6 -28
- package/dist/types/modes/components/irc-sidebar.d.ts +1 -0
- package/dist/types/modes/components/iterm-pet-transport.d.ts +122 -0
- package/dist/types/modes/components/oauth-selector.d.ts +10 -4
- package/dist/types/modes/components/pet-capability.d.ts +7 -21
- package/dist/types/modes/components/settings-selector.d.ts +5 -0
- package/dist/types/modes/components/status-line/gh.d.ts +6 -2
- package/dist/types/modes/controllers/extension-ui-controller.d.ts +1 -1
- package/dist/types/modes/controllers/selector-controller.d.ts +7 -8
- package/dist/types/modes/controllers/stt-controller.d.ts +1 -1
- package/dist/types/modes/interactive-mode.d.ts +1 -0
- package/dist/types/modes/theme/defaults/index.d.ts +118 -0
- package/dist/types/modes/types.d.ts +1 -0
- package/dist/types/modes/utils/injected-user-submission.d.ts +10 -0
- package/dist/types/runtime-mcp/config.d.ts +9 -0
- package/dist/types/runtime-mcp/manager.d.ts +26 -1
- package/dist/types/runtime-mcp/oauth-discovery.d.ts +4 -0
- package/dist/types/runtime-mcp/oauth-flow.d.ts +24 -1
- package/dist/types/runtime-mcp/pool-key.d.ts +2 -0
- package/dist/types/runtime-mcp/protocol.d.ts +278 -0
- package/dist/types/runtime-mcp/scope-config.d.ts +29 -0
- package/dist/types/runtime-mcp/tool-bridge.d.ts +15 -13
- package/dist/types/runtime-mcp/transports/http.d.ts +9 -0
- package/dist/types/runtime-mcp/types.d.ts +102 -10
- package/dist/types/sdk/acp/adapter.d.ts +26 -5
- package/dist/types/sdk/broker/broker.d.ts +3 -55
- package/dist/types/sdk/broker/lifecycle.d.ts +18 -12
- package/dist/types/sdk/broker/session-index.d.ts +14 -5
- package/dist/types/sdk/broker/startup-failure.d.ts +16 -1
- package/dist/types/sdk/bus/chat-daemon-control.d.ts +51 -1
- package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +4 -41
- package/dist/types/sdk/bus/config.d.ts +11 -0
- package/dist/types/sdk/bus/conversation-store.d.ts +0 -1
- package/dist/types/sdk/bus/daemon-paths.d.ts +6 -0
- package/dist/types/sdk/bus/discord-conversation.d.ts +2 -0
- package/dist/types/sdk/bus/discord-daemon.d.ts +17 -12
- package/dist/types/sdk/bus/existing-thread-readiness.d.ts +4 -34
- package/dist/types/sdk/bus/inbound-reaction-ordering.d.ts +61 -0
- package/dist/types/sdk/bus/index.d.ts +85 -99
- package/dist/types/sdk/bus/kind-aware-reconciliation.d.ts +29 -7
- package/dist/types/sdk/bus/managed-daemon.d.ts +2 -32
- package/dist/types/sdk/bus/notification-service.d.ts +52 -0
- package/dist/types/sdk/bus/operator-runtime.d.ts +1 -1
- package/dist/types/sdk/bus/prompt-reconciliation.d.ts +16 -5
- package/dist/types/sdk/bus/reconciliation-store.d.ts +113 -5
- package/dist/types/sdk/bus/session-control.d.ts +25 -1
- package/dist/types/sdk/bus/slack-conversation.d.ts +4 -0
- package/dist/types/sdk/bus/slack-daemon.d.ts +9 -17
- package/dist/types/sdk/bus/slack-live-provider.d.ts +3 -1
- package/dist/types/sdk/bus/slack-provider.d.ts +4 -0
- package/dist/types/sdk/bus/slack-thread-binding.d.ts +6 -40
- package/dist/types/sdk/bus/telegram-adoption-intent.d.ts +30 -104
- package/dist/types/sdk/bus/telegram-daemon-cli.d.ts +10 -0
- package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +262 -19
- package/dist/types/sdk/bus/telegram-daemon-orphan-reap.d.ts +125 -0
- package/dist/types/sdk/bus/telegram-daemon-owner-registry.d.ts +22 -0
- package/dist/types/sdk/bus/telegram-daemon.d.ts +119 -310
- package/dist/types/sdk/bus/telegram-reference.d.ts +1 -47
- package/dist/types/sdk/bus/threaded-render.d.ts +1 -0
- package/dist/types/sdk/bus/topic-registry.d.ts +33 -17
- package/dist/types/sdk/cli/rows.d.ts +2 -11
- package/dist/types/sdk/cli/session-cli.d.ts +15 -25
- package/dist/types/sdk/client/client.d.ts +97 -1
- package/dist/types/sdk/host/control/dispatch.d.ts +0 -7
- package/dist/types/sdk/host/control/index.d.ts +1 -1
- package/dist/types/sdk/host/control/operations.d.ts +18 -5
- package/dist/types/sdk/host/control/runtime-gate.d.ts +19 -0
- package/dist/types/sdk/host/host.d.ts +15 -1
- package/dist/types/sdk/host/query/handlers.d.ts +5 -0
- package/dist/types/sdk/host/reverse-leases.d.ts +1 -1
- package/dist/types/sdk/host/session-runtime.d.ts +127 -7
- package/dist/types/sdk/host/types.d.ts +1 -1
- package/dist/types/sdk/host/websocket-transport.d.ts +1 -1
- package/dist/types/sdk/index.d.ts +2 -1
- package/dist/types/sdk/lifecycle/broker-client.d.ts +8 -0
- package/dist/types/sdk/lifecycle/client.d.ts +59 -0
- package/dist/types/sdk/lifecycle/index.d.ts +3 -0
- package/dist/types/sdk/lifecycle/service.d.ts +232 -0
- package/dist/types/sdk/mcp/server.d.ts +9 -6
- package/dist/types/sdk/prompt-deadline-lease.d.ts +43 -0
- package/dist/types/sdk/prompt-deadline-manager.d.ts +28 -0
- package/dist/types/sdk/prompt-status.d.ts +10 -3
- package/dist/types/sdk/protocol/operation-registry.d.ts +5 -0
- package/dist/types/sdk/receipt-state.d.ts +17 -0
- package/dist/types/sdk/reconciliation-extensions.d.ts +2 -0
- package/dist/types/sdk/router/index.d.ts +1 -0
- package/dist/types/sdk/router/session-router.d.ts +152 -0
- package/dist/types/sdk/session-list.d.ts +22 -0
- package/dist/types/sdk/session-reconnect.d.ts +43 -1
- package/dist/types/sdk/session.d.ts +34 -1
- package/dist/types/sdk/transport/serve-cli.d.ts +1 -4
- package/dist/types/session/account-inventory.d.ts +86 -0
- package/dist/types/session/agent-session.d.ts +145 -6
- package/dist/types/session/agent-storage.d.ts +10 -0
- package/dist/types/session/coordinator-tool-label.d.ts +28 -0
- package/dist/types/session/internal/managed-session-storage.d.ts +23 -4
- package/dist/types/session/messages.d.ts +1 -1
- package/dist/types/session/secure-token-file.d.ts +3 -0
- package/dist/types/session/session-manager.d.ts +47 -1
- package/dist/types/session/startup-auth-config.d.ts +44 -0
- package/dist/types/session/terminal-abort.d.ts +378 -0
- package/dist/types/session/yield-queue.d.ts +7 -0
- package/dist/types/session-import/claude.d.ts +26 -0
- package/dist/types/session-import/codex.d.ts +88 -0
- package/dist/types/session-import/command.d.ts +35 -0
- package/dist/types/session-import/detect.d.ts +22 -0
- package/dist/types/session-import/index.d.ts +7 -0
- package/dist/types/session-import/provider-codex.d.ts +22 -0
- package/dist/types/session-import/provider-service.d.ts +38 -0
- package/dist/types/session-import/redact.d.ts +23 -0
- package/dist/types/session-import/service.d.ts +47 -0
- package/dist/types/session-import/types.d.ts +120 -0
- package/dist/types/setup/paseo/check.d.ts +16 -0
- package/dist/types/setup/paseo/install-saga.d.ts +115 -0
- package/dist/types/setup/paseo/json-publisher.d.ts +76 -0
- package/dist/types/setup/paseo/orchestration-preferences.d.ts +24 -0
- package/dist/types/setup/paseo/paseo-ownership.d.ts +87 -0
- package/dist/types/setup/paseo/paseo-setup.d.ts +29 -0
- package/dist/types/setup/paseo/provider-config.d.ts +35 -0
- package/dist/types/setup/paseo/remove.d.ts +14 -0
- package/dist/types/setup/paseo/result-types.d.ts +59 -0
- package/dist/types/setup/paseo/setup-deps.d.ts +73 -0
- package/dist/types/setup/paseo/skills-bridge.d.ts +44 -0
- package/dist/types/skill-state/active-state.d.ts +5 -1
- package/dist/types/slash-commands/acp-builtins.d.ts +5 -1
- package/dist/types/slash-commands/builtin-registry.d.ts +2 -0
- package/dist/types/slash-commands/helpers/credential-switch.d.ts +12 -0
- package/dist/types/slash-commands/helpers/usage-report.d.ts +5 -6
- package/dist/types/slash-commands/types.d.ts +7 -1
- package/dist/types/task/executor.d.ts +10 -0
- package/dist/types/task/index.d.ts +3 -1
- package/dist/types/tools/ask-answer-registry.d.ts +6 -3
- package/dist/types/tools/bash-sleep-advisory.d.ts +14 -0
- package/dist/types/tools/bash.d.ts +2 -6
- package/dist/types/tools/browser/attach.d.ts +11 -0
- package/dist/types/tools/browser/launch.d.ts +20 -0
- package/dist/types/tools/browser/profile-discovery.d.ts +6 -0
- package/dist/types/tools/browser/render.d.ts +1 -0
- package/dist/types/tools/browser.d.ts +3 -1
- package/dist/types/tools/image-gen.d.ts +10 -2
- package/dist/types/tools/index.d.ts +8 -0
- package/dist/types/tools/monitor.d.ts +1 -1
- package/dist/types/tools/skill-discovery.d.ts +8 -1
- package/dist/types/tools/subagent.d.ts +2 -0
- package/dist/types/tools/ultragoal-ask-guard.d.ts +2 -2
- package/dist/types/utils/herdr-pane.d.ts +76 -0
- package/package.json +19 -9
- package/scripts/build-binary.ts +2 -1
- package/scripts/build-sdk-package-smoke.ts +2 -13
- package/scripts/capture-sticky-viewport-showcase.ts +0 -1
- package/scripts/compile-args.ts +2 -0
- package/scripts/generate-sdk-adapter-parity-manifest.ts +31 -16
- package/scripts/generate-sdk-operation-inventory.ts +28 -0
- package/scripts/generate-telegram-baseline-manifest.ts +1 -0
- package/scripts/generate-tool-catalog.ts +6 -4
- package/scripts/verify-gjc-sdk-canonicalization.ts +5 -39
- package/src/async/job-manager.ts +352 -17
- package/src/async/support.ts +25 -0
- package/src/autoresearch/dashboard.ts +28 -13
- package/src/capability/index.ts +3 -1
- package/src/capability/mcp.ts +6 -0
- package/src/capability/types.ts +6 -0
- package/src/cli/accounts-cli.ts +395 -0
- package/src/cli/args.ts +23 -0
- package/src/cli/auth-broker-cli.ts +136 -66
- package/src/cli/auth-gateway-cli.ts +94 -70
- package/src/cli/config-cli.ts +27 -2
- package/src/cli/crash-cli.ts +78 -0
- package/src/cli/customize-doctor.ts +1605 -0
- package/src/cli/daemon-cli.ts +12 -3
- package/src/cli/fast-help.ts +1 -0
- package/src/cli/mcp-cli.ts +128 -60
- package/src/cli/notify-cli.ts +8 -14
- package/src/cli/root-flags.ts +8 -0
- package/src/cli/setup-cli.ts +145 -0
- package/src/cli/skills-cli.ts +38 -2
- package/src/cli/update-cli.ts +167 -12
- package/src/cli.ts +4 -0
- package/src/commands/accounts.ts +71 -0
- package/src/commands/crash.ts +35 -0
- package/src/commands/customize.ts +84 -0
- package/src/commands/daemon.ts +2 -2
- package/src/commands/deep-interview.ts +2 -0
- package/src/commands/launch.ts +1 -0
- package/src/commands/mcp.ts +12 -7
- package/src/commands/ralplan.ts +2 -0
- package/src/commands/sdk.ts +65 -32
- package/src/commands/setup.ts +5 -0
- package/src/commands/skills.ts +14 -4
- package/src/commands/ultragoal.ts +10 -1
- package/src/commands/update.ts +26 -15
- package/src/config/atomic-yaml-patch-worker.ts +57 -0
- package/src/config/atomic-yaml-patch.ts +769 -29
- package/src/config/config-schema-version.ts +10 -0
- package/src/config/file-lock.ts +70 -1
- package/src/config/mcp-schema.json +52 -14
- package/src/config/model-profile-activation.ts +23 -2
- package/src/config/model-profiles.ts +88 -21
- package/src/config/model-registry.ts +147 -21
- package/src/config/models-config-schema.ts +1 -1
- package/src/config/settings-schema.ts +77 -7
- package/src/config/settings.ts +4038 -199
- package/src/config/skill-settings-defaults.ts +41 -3
- package/src/config/task-delegation.ts +87 -0
- package/src/config/update-channel.ts +23 -0
- package/src/coordinator-mcp/server.ts +377 -308
- package/src/crash/index-store.ts +723 -0
- package/src/crash/nudge.ts +89 -0
- package/src/crash/record-loader.ts +149 -0
- package/src/crash/report.ts +551 -0
- package/src/crash/sanitize.ts +129 -0
- package/src/cursor.ts +36 -10
- package/src/customization/import.ts +946 -0
- package/src/customization/index.ts +4 -0
- package/src/customization/inventory.ts +335 -0
- package/src/customization/mutations.ts +141 -0
- package/src/customization/types.ts +223 -0
- package/src/daemon/control-types.ts +8 -1
- package/src/daemon/operator-contract.ts +6 -6
- package/src/defaults/gjc/extensions/grok-cli-vendor/src/models/catalog.ts +31 -6
- package/src/defaults/gjc/skills/deep-interview/SKILL.md +11 -22
- package/src/defaults/gjc/skills/ralplan/SKILL.md +36 -23
- package/src/defaults/gjc/skills/ultragoal/SKILL.md +16 -0
- package/src/discovery/claude-hooks.ts +38 -0
- package/src/discovery/claude.ts +142 -209
- package/src/discovery/codex-hooks.ts +38 -0
- package/src/discovery/codex.ts +132 -198
- package/src/discovery/helpers.ts +8 -1
- package/src/discovery/index.ts +2 -0
- package/src/discovery/mcp-compat.ts +234 -0
- package/src/discovery/mcp-json.ts +6 -0
- package/src/edit/renderer.ts +40 -0
- package/src/edit/streaming.ts +4 -2
- package/src/exec/bash-executor.ts +24 -20
- package/src/export/html/index.ts +51 -2
- package/src/extensibility/extensions/loader.ts +9 -1
- package/src/extensibility/extensions/runner.ts +17 -4
- package/src/extensibility/extensions/types.ts +31 -6
- package/src/extensibility/gjc-plugins/constrained-hooks.ts +33 -0
- package/src/extensibility/gjc-plugins/installer.ts +9 -5
- package/src/extensibility/gjc-plugins/observability.ts +8 -2
- package/src/extensibility/gjc-plugins/registry.ts +13 -2
- package/src/extensibility/gjc-plugins/runtime-adapters.ts +3 -1
- package/src/extensibility/gjc-plugins/schema.ts +222 -39
- package/src/extensibility/hooks/loader.ts +154 -10
- package/src/extensibility/runtime-skill-discovery.ts +257 -60
- package/src/extensibility/skill-management.ts +368 -0
- package/src/extensibility/skills.ts +52 -16
- package/src/gjc-runtime/deep-interview-runtime.ts +45 -61
- package/src/gjc-runtime/launch-worktree.ts +56 -2
- package/src/gjc-runtime/linux-proc.ts +7 -1
- package/src/gjc-runtime/ralplan-runtime.ts +100 -164
- package/src/gjc-runtime/session-state-lock.ts +992 -0
- package/src/gjc-runtime/session-state-sidecar.ts +644 -142
- package/src/gjc-runtime/state-writer.ts +39 -14
- package/src/gjc-runtime/tmux-owner-isolation.ts +5 -4
- package/src/gjc-runtime/ultragoal-guard.ts +11 -4
- package/src/gjc-runtime/ultragoal-runtime.ts +44 -41
- package/src/gjc-runtime/workflow-settings.ts +596 -0
- package/src/goals/tools/goal-tool.ts +6 -1
- package/src/hooks/events.ts +291 -0
- package/src/hooks/native-skill-hook.ts +4 -0
- package/src/hooks/normalize.ts +369 -0
- package/src/hooks/skill-state.ts +165 -46
- package/src/internal-urls/docs-index.generated.ts +41 -32
- package/src/main.ts +36 -5
- package/src/migrate/mcp-mapper.ts +25 -2
- package/src/modes/acp/abort-scope.ts +29 -0
- package/src/modes/acp/acp-agent.ts +423 -98
- package/src/modes/components/assistant-message.ts +6 -1
- package/src/modes/components/chrome.ts +4 -3
- package/src/modes/components/customization/customization-dashboard.ts +443 -0
- package/src/modes/components/customization/import-wizard.ts +372 -0
- package/src/modes/components/customization/index.ts +1 -0
- package/src/modes/components/dynamic-theme-text.ts +22 -0
- package/src/modes/components/gajae-pet-widget.ts +607 -193
- package/src/modes/components/irc-sidebar.ts +11 -0
- package/src/modes/components/iterm-pet-transport.ts +585 -0
- package/src/modes/components/model-selector.ts +1 -6
- package/src/modes/components/oauth-selector.ts +277 -86
- package/src/modes/components/pet-capability.ts +35 -31
- package/src/modes/components/settings-selector.ts +29 -5
- package/src/modes/components/status-line/gh.ts +45 -1
- package/src/modes/components/status-line/segments.ts +19 -4
- package/src/modes/components/tool-status-header.ts +13 -3
- package/src/modes/controllers/command-controller.ts +20 -8
- package/src/modes/controllers/extension-ui-controller.ts +56 -257
- package/src/modes/controllers/input-controller.ts +10 -0
- package/src/modes/controllers/runtime-mcp-command-controller.ts +16 -3
- package/src/modes/controllers/selector-controller.ts +238 -77
- package/src/modes/controllers/stt-controller.ts +3 -3
- package/src/modes/interactive-mode.ts +88 -16
- package/src/modes/print-mode.ts +35 -6
- package/src/modes/runtime-init.ts +21 -68
- package/src/modes/theme/defaults/index.ts +2 -0
- package/src/modes/theme/defaults/ouroboros.json +118 -0
- package/src/modes/types.ts +1 -0
- package/src/modes/utils/injected-user-submission.ts +25 -0
- package/src/modes/utils/terminal-bell.ts +15 -1
- package/src/prompts/agent-fragments/ralplan-persistence.md +1 -1
- package/src/prompts/agent-fragments/restricted-bash.md +1 -1
- package/src/prompts/agents/critic.md +1 -1
- package/src/prompts/system/rlm-research.md +1 -1
- package/src/prompts/system/system-prompt.md +0 -2
- package/src/prompts/tools/bash.md +7 -1
- package/src/prompts/tools/browser.md +1 -1
- package/src/prompts/tools/cron.md +6 -6
- package/src/prompts/tools/read.md +0 -2
- package/src/prompts/tools/skill-discovery.md +4 -2
- package/src/runtime-mcp/client.ts +427 -23
- package/src/runtime-mcp/config.ts +37 -5
- package/src/runtime-mcp/manager-pool.test.ts +56 -0
- package/src/runtime-mcp/manager.ts +52 -2
- package/src/runtime-mcp/oauth-discovery.ts +13 -0
- package/src/runtime-mcp/oauth-flow.ts +46 -1
- package/src/runtime-mcp/pool-key.ts +5 -1
- package/src/runtime-mcp/pool.test.ts +9 -0
- package/src/runtime-mcp/protocol.test.ts +353 -0
- package/src/runtime-mcp/protocol.ts +624 -0
- package/src/runtime-mcp/scope-config.ts +78 -0
- package/src/runtime-mcp/tool-bridge.ts +44 -10
- package/src/runtime-mcp/transports/http.ts +84 -13
- package/src/runtime-mcp/types.ts +123 -12
- package/src/sdk/acp/adapter.ts +328 -97
- package/src/sdk/broker/broker.ts +160 -741
- package/src/sdk/broker/ensure.ts +9 -1
- package/src/sdk/broker/lifecycle.ts +510 -116
- package/src/sdk/broker/operation-receipt-ledger.ts +11 -2
- package/src/sdk/broker/process-incarnation.ts +19 -0
- package/src/sdk/broker/session-index.ts +516 -117
- package/src/sdk/broker/startup-failure.ts +28 -5
- package/src/sdk/broker/transport.ts +1 -13
- package/src/sdk/bus/chat-daemon-cli.ts +4 -2
- package/src/sdk/bus/chat-daemon-control.ts +67 -6
- package/src/sdk/bus/chat-daemon-runtime.ts +183 -859
- package/src/sdk/bus/config.ts +13 -0
- package/src/sdk/bus/conversation-store.ts +59 -171
- package/src/sdk/bus/daemon-paths.ts +20 -0
- package/src/sdk/bus/discord-conversation.ts +2 -0
- package/src/sdk/bus/discord-daemon.ts +524 -126
- package/src/sdk/bus/discord-live-provider.ts +206 -79
- package/src/sdk/bus/existing-thread-readiness.ts +4 -97
- package/src/sdk/bus/inbound-reaction-ordering.ts +122 -0
- package/src/sdk/bus/index.ts +2480 -456
- package/src/sdk/bus/kind-aware-reconciliation.ts +204 -34
- package/src/sdk/bus/lifecycle-commands.ts +2 -2
- package/src/sdk/bus/managed-daemon.ts +2 -145
- package/src/sdk/bus/notification-service.ts +196 -0
- package/src/sdk/bus/operator-runtime.ts +1 -1
- package/src/sdk/bus/prompt-reconciliation.ts +24 -15
- package/src/sdk/bus/reconciliation-store.ts +553 -24
- package/src/sdk/bus/session-control.ts +49 -3
- package/src/sdk/bus/slack-conversation.ts +4 -0
- package/src/sdk/bus/slack-daemon.ts +733 -134
- package/src/sdk/bus/slack-live-provider.ts +65 -15
- package/src/sdk/bus/slack-provider.ts +4 -0
- package/src/sdk/bus/slack-thread-binding.ts +9 -104
- package/src/sdk/bus/telegram-adoption-intent.ts +299 -209
- package/src/sdk/bus/telegram-daemon-cli.ts +194 -7
- package/src/sdk/bus/telegram-daemon-contract.ts +265 -19
- package/src/sdk/bus/telegram-daemon-control.ts +3 -13
- package/src/sdk/bus/telegram-daemon-orphan-reap.ts +498 -0
- package/src/sdk/bus/telegram-daemon-owner-registry.ts +176 -0
- package/src/sdk/bus/telegram-daemon.ts +2552 -2280
- package/src/sdk/bus/telegram-reference.ts +1 -226
- package/src/sdk/bus/telegram-setup.ts +2 -2
- package/src/sdk/bus/threaded-render.ts +1 -0
- package/src/sdk/bus/topic-registry.ts +279 -146
- package/src/sdk/cli/rows.ts +2 -35
- package/src/sdk/cli/session-cli.ts +776 -700
- package/src/sdk/client/client.ts +892 -1
- package/src/sdk/host/control/dispatch.ts +93 -58
- package/src/sdk/host/control/index.ts +1 -1
- package/src/sdk/host/control/operations.ts +18 -10
- package/src/sdk/host/control/runtime-gate.ts +40 -0
- package/src/sdk/host/host.ts +63 -12
- package/src/sdk/host/query/handlers.ts +66 -7
- package/src/sdk/host/reverse-leases.ts +2 -2
- package/src/sdk/host/sdk-surface-parity.test.ts +1 -1
- package/src/sdk/host/session-runtime.test.ts +2787 -34
- package/src/sdk/host/session-runtime.ts +1489 -101
- package/src/sdk/host/surface-policy.ts +12 -8
- package/src/sdk/host/types.ts +1 -1
- package/src/sdk/host/websocket-transport.lifecycle.test.ts +31 -59
- package/src/sdk/host/websocket-transport.ts +85 -50
- package/src/sdk/index.ts +2 -1
- package/src/sdk/lifecycle/broker-client.ts +53 -0
- package/src/sdk/lifecycle/client.ts +234 -0
- package/src/sdk/lifecycle/index.ts +3 -0
- package/src/sdk/{bus/recent-activity.ts → lifecycle/recent-sessions.ts} +5 -2
- package/src/sdk/lifecycle/service.ts +720 -0
- package/src/sdk/mcp/server.ts +226 -188
- package/src/sdk/prompt-deadline-lease.ts +55 -0
- package/src/sdk/prompt-deadline-manager.ts +148 -0
- package/src/sdk/prompt-status.ts +11 -3
- package/src/sdk/protocol/operation-inventory.generated.json +272 -129
- package/src/sdk/protocol/operation-registry.ts +71 -8
- package/src/sdk/receipt-state.ts +43 -0
- package/src/sdk/reconciliation-extensions.ts +14 -0
- package/src/sdk/router/index.ts +1 -0
- package/src/sdk/router/session-router.ts +1658 -0
- package/src/sdk/session-list.ts +93 -0
- package/src/sdk/session-reconnect.ts +45 -1
- package/src/sdk/session.ts +716 -120
- package/src/sdk/transport/serve-cli.ts +18 -34
- package/src/session/account-inventory.ts +603 -0
- package/src/session/agent-session.ts +2873 -559
- package/src/session/agent-storage.ts +35 -0
- package/src/session/blob-store.ts +32 -1
- package/src/session/coordinator-tool-label.ts +40 -0
- package/src/session/internal/managed-session-scope.ts +4 -0
- package/src/session/internal/managed-session-storage.ts +199 -31
- package/src/session/messages.ts +1 -1
- package/src/session/secure-token-file.ts +80 -0
- package/src/session/session-manager.ts +757 -57
- package/src/session/session-storage.ts +25 -16
- package/src/session/startup-auth-config.ts +297 -0
- package/src/session/terminal-abort.ts +1253 -0
- package/src/session/yield-queue.ts +57 -15
- package/src/session-import/claude.ts +334 -0
- package/src/session-import/codex.ts +1033 -0
- package/src/session-import/command.ts +77 -0
- package/src/session-import/detect.ts +133 -0
- package/src/session-import/index.ts +7 -0
- package/src/session-import/provider-codex.ts +327 -0
- package/src/session-import/provider-service.ts +457 -0
- package/src/session-import/redact.ts +128 -0
- package/src/session-import/service.ts +1264 -0
- package/src/session-import/types.ts +148 -0
- package/src/setup/paseo/check.ts +213 -0
- package/src/setup/paseo/install-saga.ts +293 -0
- package/src/setup/paseo/json-publisher.ts +263 -0
- package/src/setup/paseo/orchestration-preferences.ts +86 -0
- package/src/setup/paseo/paseo-ownership.ts +224 -0
- package/src/setup/paseo/paseo-setup.ts +253 -0
- package/src/setup/paseo/provider-config.ts +139 -0
- package/src/setup/paseo/remove.ts +183 -0
- package/src/setup/paseo/result-types.ts +79 -0
- package/src/setup/paseo/setup-deps.ts +175 -0
- package/src/setup/paseo/skills-bridge.ts +260 -0
- package/src/skill-state/active-state.ts +21 -11
- package/src/slash-commands/acp-builtins.ts +9 -1
- package/src/slash-commands/builtin-registry.ts +117 -19
- package/src/slash-commands/helpers/credential-switch.ts +143 -0
- package/src/slash-commands/helpers/mcp.ts +9 -3
- package/src/slash-commands/helpers/usage-report.ts +61 -56
- package/src/slash-commands/types.ts +7 -2
- package/src/task/executor.ts +30 -11
- package/src/task/index.ts +66 -7
- package/src/task/render.ts +23 -9
- package/src/tools/ask-answer-registry.ts +23 -7
- package/src/tools/ask.ts +8 -4
- package/src/tools/bash-sleep-advisory.ts +115 -0
- package/src/tools/bash.ts +98 -18
- package/src/tools/browser/attach.ts +71 -3
- package/src/tools/browser/launch.ts +86 -13
- package/src/tools/browser/profile-discovery.ts +57 -7
- package/src/tools/browser/render.ts +8 -1
- package/src/tools/browser.ts +130 -21
- package/src/tools/computer.enforcement.test.ts +1 -1
- package/src/tools/computer.ts +3 -2
- package/src/tools/cron.ts +12 -1
- package/src/tools/image-gen.ts +349 -142
- package/src/tools/index.ts +8 -0
- package/src/tools/job.ts +33 -6
- package/src/tools/monitor.ts +41 -2
- package/src/tools/skill-discovery.ts +21 -29
- package/src/tools/subagent.ts +142 -24
- package/src/tools/todo-contract.ts +55 -3
- package/src/tools/todo-write.ts +4 -3
- package/src/tools/tool-catalog.generated.ts +6 -6
- package/src/tools/ultragoal-ask-guard.ts +10 -3
- package/src/utils/herdr-pane.ts +345 -0
- package/src/utils/title-generator.ts +2 -0
- package/src/web/scrapers/index.ts +6 -4
- package/dist/types/cli/malloc-env-guard.test.d.ts +0 -1
- package/dist/types/defaults/gjc-defaults.test.d.ts +0 -1
- package/dist/types/memory-backend/lazy-loading.test.d.ts +0 -1
- package/dist/types/runtime/boot-ordering.test.d.ts +0 -1
- package/dist/types/runtime/lazy-service.test.d.ts +0 -1
- package/dist/types/runtime/network-prewarm-service.test.d.ts +0 -1
- package/dist/types/runtime/workspace-tree-service.test.d.ts +0 -1
- package/dist/types/runtime-mcp/config.test.d.ts +0 -1
- package/dist/types/runtime-mcp/http.test.d.ts +0 -1
- package/dist/types/runtime-mcp/manager-pool.test.d.ts +0 -1
- package/dist/types/runtime-mcp/pool-key.test.d.ts +0 -1
- package/dist/types/runtime-mcp/pool.test.d.ts +0 -1
- package/dist/types/sdk/bus/lifecycle-control-runtime.d.ts +0 -117
- package/dist/types/sdk/bus/lifecycle-orchestrator.d.ts +0 -141
- package/dist/types/sdk/bus/telegram-cli.d.ts +0 -31
- package/dist/types/sdk/elevation/allowlist.d.ts +0 -20
- package/dist/types/sdk/elevation/audit.d.ts +0 -93
- package/dist/types/sdk/elevation/capability.d.ts +0 -3
- package/dist/types/sdk/elevation/digest.d.ts +0 -72
- package/dist/types/sdk/elevation/dispatch-receipt.d.ts +0 -85
- package/dist/types/sdk/elevation/grant-ledger.d.ts +0 -163
- package/dist/types/sdk/elevation/owner.d.ts +0 -48
- package/dist/types/sdk/host/import-graph.test.d.ts +0 -1
- package/dist/types/sdk/host/sdk-surface-parity.test.d.ts +0 -1
- package/dist/types/sdk/host/session-runtime.test.d.ts +0 -1
- package/dist/types/sdk/host/websocket-transport.lifecycle.test.d.ts +0 -1
- package/dist/types/session/auth-broker-config.d.ts +0 -13
- package/dist/types/session/heap-eviction-artifacts.test.d.ts +0 -1
- package/dist/types/skills/skills.test.d.ts +0 -1
- package/dist/types/slash-commands/notify-command.test.d.ts +0 -1
- package/dist/types/task/token-log.test.d.ts +0 -1
- package/dist/types/tools/computer.enforcement.test.d.ts +0 -1
- package/dist/types/tools/descriptors.test.d.ts +0 -1
- package/scripts/g005-daemon-smoke.ts +0 -180
- package/scripts/g011-daemon-path-smoke.ts +0 -153
- package/src/sdk/bus/lifecycle-control-runtime.ts +0 -1733
- package/src/sdk/bus/lifecycle-orchestrator.ts +0 -489
- package/src/sdk/bus/telegram-cli.ts +0 -212
- package/src/sdk/elevation/allowlist.ts +0 -54
- package/src/sdk/elevation/audit.ts +0 -208
- package/src/sdk/elevation/capability.ts +0 -41
- package/src/sdk/elevation/digest.ts +0 -129
- package/src/sdk/elevation/dispatch-receipt.ts +0 -184
- package/src/sdk/elevation/grant-ledger.ts +0 -1142
- package/src/sdk/elevation/owner.ts +0 -109
- package/src/session/auth-broker-config.ts +0 -109
- /package/dist/types/{ai-core-import-gate.test.d.ts → discovery/claude-hooks.d.ts} +0 -0
- /package/dist/types/{cli/fixture-report.test.d.ts → discovery/codex-hooks.d.ts} +0 -0
- /package/dist/types/sdk/{bus/recent-activity.d.ts → lifecycle/recent-sessions.d.ts} +0 -0
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
import * as path from "node:path";
|
|
2
2
|
import { ThinkingLevel } from "@gajae-code/agent-core";
|
|
3
|
-
import
|
|
3
|
+
import {
|
|
4
|
+
type Api,
|
|
5
|
+
type AuthCredentialSelector,
|
|
6
|
+
type CredentialRemovalTarget,
|
|
7
|
+
type Model,
|
|
8
|
+
resolveOAuthStorageProvider,
|
|
9
|
+
} from "@gajae-code/ai/core";
|
|
4
10
|
import { getOAuthProviders } from "@gajae-code/ai/utils/oauth";
|
|
5
11
|
import type { OAuthProvider } from "@gajae-code/ai/utils/oauth/types";
|
|
6
12
|
import type { Component, OverlayHandle, SlashCommand } from "@gajae-code/tui";
|
|
7
|
-
import { Input,
|
|
13
|
+
import { Input, Loader, resolvePetMode, Spacer, Text } from "@gajae-code/tui";
|
|
8
14
|
import { getAgentDbPath, getProjectDir, logger, VERSION } from "@gajae-code/utils";
|
|
9
15
|
import type { AppKeybinding } from "../../config/keybindings";
|
|
10
16
|
import {
|
|
@@ -85,19 +91,13 @@ import {
|
|
|
85
91
|
sendNotificationTest,
|
|
86
92
|
} from "../../sdk/bus/notification-service";
|
|
87
93
|
import type { NotificationSessionStatus } from "../../sdk/bus/session-control";
|
|
88
|
-
import {
|
|
89
|
-
ensureTelegramDaemonRunningDetailed,
|
|
90
|
-
readNotificationRootRegistration,
|
|
91
|
-
resolveTelegramSetupPreflight,
|
|
92
|
-
unregisterNotificationRoot,
|
|
93
|
-
withNotificationRootRegistryFence,
|
|
94
|
-
} from "../../sdk/bus/telegram-daemon";
|
|
94
|
+
import { ensureTelegramDaemonRunningDetailed, resolveTelegramSetupPreflight } from "../../sdk/bus/telegram-daemon";
|
|
95
95
|
import { TelegramDaemonController } from "../../sdk/bus/telegram-daemon-control";
|
|
96
96
|
import { runTelegramSetup, type TelegramSetupPreflight } from "../../sdk/bus/telegram-setup";
|
|
97
|
+
import { clearPersistentPinForRemovedRows } from "../../session/account-inventory";
|
|
97
98
|
import type { DefaultFallbackRuntimeState } from "../../session/agent-session";
|
|
98
99
|
import { type SessionInfo, SessionManager } from "../../session/session-manager";
|
|
99
100
|
import { getTreeForInternalRead } from "../../session/session-manager-internal";
|
|
100
|
-
|
|
101
101
|
import { FileSessionStorage } from "../../session/session-storage";
|
|
102
102
|
import {
|
|
103
103
|
CREDENTIAL_AUTO_IMPORT_DISCOVERY_WARNING,
|
|
@@ -147,6 +147,7 @@ import {
|
|
|
147
147
|
type CustomModelPresetWizardSubmit,
|
|
148
148
|
} from "../components/custom-model-preset-wizard";
|
|
149
149
|
import { CustomProviderWizardComponent, type CustomProviderWizardSubmit } from "../components/custom-provider-wizard";
|
|
150
|
+
import { CustomizationDashboard } from "../components/customization";
|
|
150
151
|
import { ExtensionDashboard } from "../components/extensions";
|
|
151
152
|
import type { PetMode } from "../components/gajae-pet-widget";
|
|
152
153
|
import { HistorySearchComponent } from "../components/history-search";
|
|
@@ -270,13 +271,6 @@ export interface NotificationsEditorOperationDependencies {
|
|
|
270
271
|
reconcileCommittedTelegramConfiguration: typeof reconcileCommittedTelegramConfiguration;
|
|
271
272
|
saveTelegramInactive: typeof saveTelegramInactive;
|
|
272
273
|
removeTelegramConfiguration: typeof removeTelegramConfiguration;
|
|
273
|
-
readNotificationRootRegistration: typeof readNotificationRootRegistration;
|
|
274
|
-
unregisterNotificationRoot: typeof unregisterNotificationRoot;
|
|
275
|
-
stopTelegramDaemonIfRootRegistryFenceMatches(input: {
|
|
276
|
-
settings: Settings;
|
|
277
|
-
registryFingerprint: string;
|
|
278
|
-
stop: () => Promise<TelegramDaemonStopResult>;
|
|
279
|
-
}): Promise<boolean>;
|
|
280
274
|
|
|
281
275
|
reloadTelegramDaemon(settings: Settings): Promise<{ ok: boolean; message: string }>;
|
|
282
276
|
restartTelegramDaemon(settings: Settings): Promise<{ ok: boolean; message: string }>;
|
|
@@ -300,17 +294,6 @@ const notificationEditorOperationDependencies: NotificationsEditorOperationDepen
|
|
|
300
294
|
reconcileCommittedTelegramConfiguration,
|
|
301
295
|
saveTelegramInactive,
|
|
302
296
|
removeTelegramConfiguration,
|
|
303
|
-
readNotificationRootRegistration,
|
|
304
|
-
unregisterNotificationRoot,
|
|
305
|
-
stopTelegramDaemonIfRootRegistryFenceMatches: async input =>
|
|
306
|
-
await withNotificationRootRegistryFence({
|
|
307
|
-
settings: input.settings,
|
|
308
|
-
registryFingerprint: input.registryFingerprint,
|
|
309
|
-
action: async () => {
|
|
310
|
-
const stopped = await input.stop();
|
|
311
|
-
if (!stopped.ok) throw new Error(stopped.message);
|
|
312
|
-
},
|
|
313
|
-
}),
|
|
314
297
|
|
|
315
298
|
reloadTelegramDaemon: async settings =>
|
|
316
299
|
await new TelegramDaemonController(settings).reload({ spawnIfStopped: false }),
|
|
@@ -361,12 +344,7 @@ export function createNotificationsEditorOperations(
|
|
|
361
344
|
const notifyAfterDurableCommit = async (): Promise<void> => {
|
|
362
345
|
await ctx.notifyConfigChanged?.();
|
|
363
346
|
};
|
|
364
|
-
const reconnect = async () =>
|
|
365
|
-
await services.ensureTelegramDaemonRunningDetailed({
|
|
366
|
-
settings: ctx.settings,
|
|
367
|
-
cwd: ctx.sessionManager.getCwd(),
|
|
368
|
-
sessionId: ctx.sessionManager.getSessionId(),
|
|
369
|
-
});
|
|
347
|
+
const reconnect = async () => await services.ensureTelegramDaemonRunningDetailed({ settings: ctx.settings });
|
|
370
348
|
const telegramSetupPreflight = async (): Promise<TelegramSetupPreflight> =>
|
|
371
349
|
await services.resolveTelegramSetupPreflight(ctx.settings);
|
|
372
350
|
const providerRuntime: NotificationProviderRuntimeAuthority = services.providerRuntime ?? {
|
|
@@ -1041,23 +1019,8 @@ export function createNotificationsEditorOperations(
|
|
|
1041
1019
|
stopAndUnregister: async () => {
|
|
1042
1020
|
if (controller) await controller.enterBlockedRuntime(sessionContext());
|
|
1043
1021
|
runtimePrepared = true;
|
|
1044
|
-
const
|
|
1045
|
-
|
|
1046
|
-
sessionId: ctx.sessionManager.getSessionId(),
|
|
1047
|
-
});
|
|
1048
|
-
const unregistered = await services.unregisterNotificationRoot({
|
|
1049
|
-
settings: ctx.settings,
|
|
1050
|
-
cwd: ctx.sessionManager.getCwd(),
|
|
1051
|
-
sessionId: ctx.sessionManager.getSessionId(),
|
|
1052
|
-
registrationToken: registration.token,
|
|
1053
|
-
});
|
|
1054
|
-
if (unregistered.registryFingerprint !== undefined) {
|
|
1055
|
-
await services.stopTelegramDaemonIfRootRegistryFenceMatches({
|
|
1056
|
-
settings: ctx.settings,
|
|
1057
|
-
registryFingerprint: unregistered.registryFingerprint,
|
|
1058
|
-
stop: () => services.stopTelegramDaemon(ctx.settings),
|
|
1059
|
-
});
|
|
1060
|
-
}
|
|
1022
|
+
const stopped = await services.stopTelegramDaemon(ctx.settings);
|
|
1023
|
+
if (!stopped.ok) throw new Error(stopped.message);
|
|
1061
1024
|
},
|
|
1062
1025
|
},
|
|
1063
1026
|
});
|
|
@@ -1772,6 +1735,36 @@ export class SelectorController {
|
|
|
1772
1735
|
this.#refreshThemeUi();
|
|
1773
1736
|
});
|
|
1774
1737
|
},
|
|
1738
|
+
onThemeCommit: async (path, themeName, previousTheme) => {
|
|
1739
|
+
if (!settings.canWriteDurableConfig()) {
|
|
1740
|
+
this.ctx.showError(
|
|
1741
|
+
"Cannot change settings while config.yml has invalid YAML syntax. Repair config.yml and reload settings.",
|
|
1742
|
+
);
|
|
1743
|
+
return false;
|
|
1744
|
+
}
|
|
1745
|
+
const applied = await restoreThemePreview(themeName);
|
|
1746
|
+
if (!applied.success) {
|
|
1747
|
+
if (applied.error && !isThemePreviewSuperseded(applied)) {
|
|
1748
|
+
this.ctx.showError(`Failed to apply theme "${themeName}": ${applied.error}`);
|
|
1749
|
+
}
|
|
1750
|
+
const restored = await restoreThemePreview(previousTheme);
|
|
1751
|
+
if (!restored.success && restored.error && !isThemePreviewSuperseded(restored)) {
|
|
1752
|
+
this.ctx.showError(`Failed to restore theme preview: ${restored.error}`);
|
|
1753
|
+
}
|
|
1754
|
+
this.#refreshThemeUi();
|
|
1755
|
+
return false;
|
|
1756
|
+
}
|
|
1757
|
+
try {
|
|
1758
|
+
settings.set(path, themeName);
|
|
1759
|
+
} catch (error) {
|
|
1760
|
+
await restoreThemePreview(previousTheme);
|
|
1761
|
+
this.ctx.showError(error instanceof Error ? error.message : String(error));
|
|
1762
|
+
this.#refreshThemeUi();
|
|
1763
|
+
return false;
|
|
1764
|
+
}
|
|
1765
|
+
this.#refreshThemeUi();
|
|
1766
|
+
return true;
|
|
1767
|
+
},
|
|
1775
1768
|
onPetPreview: mode => {
|
|
1776
1769
|
this.ctx.previewPetMode(mode as PetMode);
|
|
1777
1770
|
},
|
|
@@ -1853,6 +1846,8 @@ export class SelectorController {
|
|
|
1853
1846
|
showThemeSelector(): void {
|
|
1854
1847
|
getAvailableThemes().then(availableThemes => {
|
|
1855
1848
|
const initialTheme = getCurrentThemeName() ?? "red-claw";
|
|
1849
|
+
const settingsPath = getDetectedThemeSettingsPath();
|
|
1850
|
+
const savedTheme = settings.get(settingsPath);
|
|
1856
1851
|
this.showSelector(done => {
|
|
1857
1852
|
const restoreAndClose = () => {
|
|
1858
1853
|
void restoreThemePreview(initialTheme).then(result => {
|
|
@@ -1875,7 +1870,7 @@ export class SelectorController {
|
|
|
1875
1870
|
return;
|
|
1876
1871
|
}
|
|
1877
1872
|
try {
|
|
1878
|
-
settings.set(
|
|
1873
|
+
settings.set(settingsPath, themeName);
|
|
1879
1874
|
} catch (error) {
|
|
1880
1875
|
if (!settings.canWriteDurableConfig()) {
|
|
1881
1876
|
this.ctx.showError(error instanceof Error ? error.message : String(error));
|
|
@@ -1884,8 +1879,21 @@ export class SelectorController {
|
|
|
1884
1879
|
}
|
|
1885
1880
|
throw error;
|
|
1886
1881
|
}
|
|
1887
|
-
|
|
1888
|
-
|
|
1882
|
+
void restoreThemePreview(themeName).then(result => {
|
|
1883
|
+
if (!result.success && result.error && !isThemePreviewSuperseded(result)) {
|
|
1884
|
+
this.ctx.showError(`Failed to apply theme: ${result.error}`);
|
|
1885
|
+
settings.set(settingsPath, savedTheme);
|
|
1886
|
+
void restoreThemePreview(initialTheme).then(recovery => {
|
|
1887
|
+
if (!recovery.success && recovery.error && !isThemePreviewSuperseded(recovery)) {
|
|
1888
|
+
this.ctx.showError(`Failed to restore theme preview: ${recovery.error}`);
|
|
1889
|
+
}
|
|
1890
|
+
this.#refreshThemeUi();
|
|
1891
|
+
});
|
|
1892
|
+
return;
|
|
1893
|
+
}
|
|
1894
|
+
this.#refreshThemeUi();
|
|
1895
|
+
done();
|
|
1896
|
+
});
|
|
1889
1897
|
},
|
|
1890
1898
|
restoreAndClose,
|
|
1891
1899
|
themeName => {
|
|
@@ -1904,7 +1912,7 @@ export class SelectorController {
|
|
|
1904
1912
|
|
|
1905
1913
|
showPetSelector(): void {
|
|
1906
1914
|
const stored = settings.get("pet.mode");
|
|
1907
|
-
const initial: PetMode =
|
|
1915
|
+
const initial: PetMode = resolvePetMode(stored);
|
|
1908
1916
|
this.showSelector(done => {
|
|
1909
1917
|
// Live-preview via previewMode (no editor re-mount, so the overlay stays);
|
|
1910
1918
|
// Enter commits + persists, Esc restores the initial skin.
|
|
@@ -1966,6 +1974,31 @@ export class SelectorController {
|
|
|
1966
1974
|
});
|
|
1967
1975
|
}
|
|
1968
1976
|
|
|
1977
|
+
/**
|
|
1978
|
+
* Show the `/extensions` umbrella local-customization dashboard (skills,
|
|
1979
|
+
* hooks, MCPs, import) — a separate surface from the provider-focused
|
|
1980
|
+
* Extension Control Center above (issue #4291).
|
|
1981
|
+
*/
|
|
1982
|
+
async showCustomizationDashboard(): Promise<void> {
|
|
1983
|
+
let dashboard: CustomizationDashboard;
|
|
1984
|
+
try {
|
|
1985
|
+
dashboard = await CustomizationDashboard.create(getProjectDir(), this.ctx.settings);
|
|
1986
|
+
} catch (error) {
|
|
1987
|
+
this.ctx.showError(`Failed to open /extensions: ${error instanceof Error ? error.message : String(error)}`);
|
|
1988
|
+
return;
|
|
1989
|
+
}
|
|
1990
|
+
this.showSelector(done => {
|
|
1991
|
+
dashboard.onClose = () => {
|
|
1992
|
+
done();
|
|
1993
|
+
this.ctx.ui.requestRender();
|
|
1994
|
+
};
|
|
1995
|
+
dashboard.onRequestRender = () => {
|
|
1996
|
+
this.ctx.ui.requestRender();
|
|
1997
|
+
};
|
|
1998
|
+
return { component: dashboard, focus: dashboard };
|
|
1999
|
+
});
|
|
2000
|
+
}
|
|
2001
|
+
|
|
1969
2002
|
/**
|
|
1970
2003
|
* Show the Agent Control Center dashboard.
|
|
1971
2004
|
*/
|
|
@@ -2091,6 +2124,17 @@ export class SelectorController {
|
|
|
2091
2124
|
});
|
|
2092
2125
|
break;
|
|
2093
2126
|
}
|
|
2127
|
+
case "theme.dark":
|
|
2128
|
+
case "theme.light": {
|
|
2129
|
+
restoreThemePreview(value as string).then(result => {
|
|
2130
|
+
if (this.ctx.isStopped?.()) return;
|
|
2131
|
+
this.#refreshThemeUi();
|
|
2132
|
+
if (!result.success && result.error && !isThemePreviewSuperseded(result)) {
|
|
2133
|
+
this.ctx.showError(`Failed to apply theme "${value}": ${result.error}`);
|
|
2134
|
+
}
|
|
2135
|
+
});
|
|
2136
|
+
break;
|
|
2137
|
+
}
|
|
2094
2138
|
case "pet.mode":
|
|
2095
2139
|
// The settings submenu already persisted the value; apply it to the live
|
|
2096
2140
|
// widget via previewMode (the settings overlay is still open, so a full
|
|
@@ -3154,18 +3198,60 @@ export class SelectorController {
|
|
|
3154
3198
|
}
|
|
3155
3199
|
}
|
|
3156
3200
|
|
|
3157
|
-
async #handleOAuthLogout(providerId: string): Promise<void> {
|
|
3201
|
+
async #handleOAuthLogout(providerId: string, targets?: readonly CredentialRemovalTarget[]): Promise<void> {
|
|
3158
3202
|
try {
|
|
3159
|
-
|
|
3160
|
-
|
|
3161
|
-
|
|
3162
|
-
|
|
3163
|
-
|
|
3203
|
+
const authStorage = this.ctx.session.modelRegistry.authStorage;
|
|
3204
|
+
const inventory = authStorage.listCredentialInventory(providerId);
|
|
3205
|
+
const oauthRows = inventory.filter(row => row.provider === providerId && row.credentialKind === "oauth");
|
|
3206
|
+
const removalTargetsById = new Map(
|
|
3207
|
+
authStorage.listCredentialRemovalTargets(providerId).map(target => [target.id, target]),
|
|
3164
3208
|
);
|
|
3165
|
-
|
|
3166
|
-
|
|
3209
|
+
const oauthRemovalTargets = oauthRows
|
|
3210
|
+
.map(row => removalTargetsById.get(row.id))
|
|
3211
|
+
.filter((target): target is CredentialRemovalTarget => target !== undefined);
|
|
3212
|
+
if (oauthRows.length > 0 && oauthRemovalTargets.length === 0) {
|
|
3213
|
+
this.ctx.showError(
|
|
3214
|
+
`Logout is broker-managed for ${providerId}; run \`gjc auth-broker logout ${providerId}\` on the broker host.`,
|
|
3215
|
+
);
|
|
3216
|
+
return;
|
|
3217
|
+
}
|
|
3218
|
+
if (targets) {
|
|
3219
|
+
if (targets.length === 0) {
|
|
3220
|
+
this.ctx.showError(
|
|
3221
|
+
`No OAuth accounts to remove for ${providerId}; API-key credentials are not managed here.`,
|
|
3222
|
+
);
|
|
3223
|
+
return;
|
|
3224
|
+
}
|
|
3225
|
+
const result = authStorage.removeAuthCredentialsHard(providerId, targets);
|
|
3226
|
+
if (result.kind !== "removed") {
|
|
3227
|
+
this.ctx.showError(
|
|
3228
|
+
"Logout failed: account inventory changed; no credentials were removed. Retry /logout.",
|
|
3229
|
+
);
|
|
3230
|
+
return;
|
|
3231
|
+
}
|
|
3232
|
+
await clearPersistentPinForRemovedRows(this.ctx.settings, providerId, inventory, result.ids);
|
|
3233
|
+
await this.ctx.session.modelRegistry.refresh();
|
|
3234
|
+
this.ctx.showStatus(
|
|
3235
|
+
`Successfully removed ${result.ids.length} OAuth account${result.ids.length === 1 ? "" : "s"} from ${providerId}.`,
|
|
3236
|
+
);
|
|
3237
|
+
return;
|
|
3238
|
+
}
|
|
3239
|
+
if (oauthRemovalTargets.length === 0) {
|
|
3240
|
+
this.ctx.showError(
|
|
3241
|
+
`No OAuth accounts to remove for ${providerId}; API-key credentials are not managed here.`,
|
|
3242
|
+
);
|
|
3243
|
+
return;
|
|
3244
|
+
}
|
|
3245
|
+
const result = authStorage.removeAuthCredentialsHard(providerId, oauthRemovalTargets);
|
|
3246
|
+
if (result.kind !== "removed") {
|
|
3247
|
+
this.ctx.showError("Logout failed: account inventory changed; no credentials were removed. Retry /logout.");
|
|
3248
|
+
return;
|
|
3249
|
+
}
|
|
3250
|
+
await clearPersistentPinForRemovedRows(this.ctx.settings, providerId, inventory, result.ids);
|
|
3251
|
+
await this.ctx.session.modelRegistry.refresh();
|
|
3252
|
+
this.ctx.showStatus(
|
|
3253
|
+
`Successfully removed ${result.ids.length} OAuth account${result.ids.length === 1 ? "" : "s"} from ${providerId}.`,
|
|
3167
3254
|
);
|
|
3168
|
-
this.ctx.ui.requestRender();
|
|
3169
3255
|
} catch (error: unknown) {
|
|
3170
3256
|
this.ctx.showError(`Logout failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
3171
3257
|
}
|
|
@@ -3177,16 +3263,95 @@ export class SelectorController {
|
|
|
3177
3263
|
options?: OAuthSelectorOptions,
|
|
3178
3264
|
): Promise<void> {
|
|
3179
3265
|
if (providerId) {
|
|
3180
|
-
const
|
|
3181
|
-
|
|
3182
|
-
|
|
3266
|
+
const selectedProviderId = mode === "logout" ? resolveOAuthStorageProvider(providerId) : providerId;
|
|
3267
|
+
const oauthProvider = getOAuthProviders().find(provider => provider.id === selectedProviderId);
|
|
3268
|
+
if (!oauthProvider && !this.ctx.session.modelRegistry.getModelProfiles().has(selectedProviderId)) {
|
|
3269
|
+
this.ctx.showError(`Unknown OAuth provider: ${selectedProviderId}`);
|
|
3270
|
+
return;
|
|
3271
|
+
}
|
|
3272
|
+
const authStorage = this.ctx.session.modelRegistry.authStorage;
|
|
3273
|
+
const hasOAuthInventory = authStorage
|
|
3274
|
+
.listCredentialInventory(selectedProviderId)
|
|
3275
|
+
.some(row => row.provider === selectedProviderId && row.credentialKind === "oauth");
|
|
3276
|
+
const hasRemovableOAuth = authStorage
|
|
3277
|
+
.listCredentialRemovalTargets(selectedProviderId)
|
|
3278
|
+
.some(target => target.provider === selectedProviderId);
|
|
3279
|
+
if (mode === "logout" && hasOAuthInventory && !hasRemovableOAuth) {
|
|
3280
|
+
await this.#handleOAuthLogout(selectedProviderId);
|
|
3281
|
+
return;
|
|
3282
|
+
}
|
|
3283
|
+
if (hasOAuthInventory && !options?.manualCode) {
|
|
3284
|
+
this.showSelector(done => {
|
|
3285
|
+
let selector: OAuthSelectorComponent;
|
|
3286
|
+
selector = new OAuthSelectorComponent(
|
|
3287
|
+
mode,
|
|
3288
|
+
authStorage,
|
|
3289
|
+
() => undefined,
|
|
3290
|
+
() => {
|
|
3291
|
+
selector.stopValidation();
|
|
3292
|
+
done();
|
|
3293
|
+
this.ctx.ui.requestRender();
|
|
3294
|
+
},
|
|
3295
|
+
{
|
|
3296
|
+
accountProviderId: selectedProviderId,
|
|
3297
|
+
onAccountSelect: async (selectorValue: AuthCredentialSelector) => {
|
|
3298
|
+
await this.ctx.session.setCredentialPin(selectedProviderId, selectorValue);
|
|
3299
|
+
selector.stopValidation();
|
|
3300
|
+
done();
|
|
3301
|
+
this.ctx.showStatus(`Pinned OAuth account for ${selectedProviderId} to this session.`);
|
|
3302
|
+
},
|
|
3303
|
+
onAutoSelect: async () => {
|
|
3304
|
+
await this.ctx.session.setCredentialAuto(selectedProviderId);
|
|
3305
|
+
selector.stopValidation();
|
|
3306
|
+
done();
|
|
3307
|
+
this.ctx.showStatus(`Using AUTO (ranked) OAuth accounts for ${selectedProviderId}.`);
|
|
3308
|
+
},
|
|
3309
|
+
onAddAccount: async () => {
|
|
3310
|
+
selector.stopValidation();
|
|
3311
|
+
done();
|
|
3312
|
+
await this.#handleOAuthLogin(selectedProviderId, options);
|
|
3313
|
+
},
|
|
3314
|
+
onAccountRemove: async targets => {
|
|
3315
|
+
await this.#handleOAuthLogout(selectedProviderId, targets);
|
|
3316
|
+
selector.stopValidation();
|
|
3317
|
+
done();
|
|
3318
|
+
},
|
|
3319
|
+
},
|
|
3320
|
+
);
|
|
3321
|
+
return { component: selector, focus: selector };
|
|
3322
|
+
});
|
|
3183
3323
|
return;
|
|
3184
3324
|
}
|
|
3185
3325
|
if (mode === "login") {
|
|
3186
|
-
await this.#handleOAuthLogin(
|
|
3187
|
-
|
|
3188
|
-
await this.#handleOAuthLogout(providerId);
|
|
3326
|
+
await this.#handleOAuthLogin(selectedProviderId, options);
|
|
3327
|
+
return;
|
|
3189
3328
|
}
|
|
3329
|
+
if (!hasRemovableOAuth) {
|
|
3330
|
+
await this.#handleOAuthLogout(selectedProviderId);
|
|
3331
|
+
return;
|
|
3332
|
+
}
|
|
3333
|
+
this.showSelector(done => {
|
|
3334
|
+
let selector: OAuthSelectorComponent;
|
|
3335
|
+
selector = new OAuthSelectorComponent(
|
|
3336
|
+
"logout",
|
|
3337
|
+
authStorage,
|
|
3338
|
+
() => undefined,
|
|
3339
|
+
() => {
|
|
3340
|
+
selector.stopValidation();
|
|
3341
|
+
done();
|
|
3342
|
+
this.ctx.ui.requestRender();
|
|
3343
|
+
},
|
|
3344
|
+
{
|
|
3345
|
+
accountProviderId: selectedProviderId,
|
|
3346
|
+
onAccountRemove: async targets => {
|
|
3347
|
+
await this.#handleOAuthLogout(selectedProviderId, targets);
|
|
3348
|
+
selector.stopValidation();
|
|
3349
|
+
done();
|
|
3350
|
+
},
|
|
3351
|
+
},
|
|
3352
|
+
);
|
|
3353
|
+
return { component: selector, focus: selector };
|
|
3354
|
+
});
|
|
3190
3355
|
return;
|
|
3191
3356
|
}
|
|
3192
3357
|
|
|
@@ -3328,16 +3493,12 @@ export class SelectorController {
|
|
|
3328
3493
|
async (selectedProviderId: string) => {
|
|
3329
3494
|
selector.stopValidation();
|
|
3330
3495
|
done();
|
|
3331
|
-
|
|
3332
|
-
await this.#handleOAuthLogin(selectedProviderId);
|
|
3333
|
-
} else {
|
|
3334
|
-
await this.#handleOAuthLogout(selectedProviderId);
|
|
3335
|
-
}
|
|
3496
|
+
await this.showOAuthSelector(mode, selectedProviderId);
|
|
3336
3497
|
},
|
|
3337
3498
|
() => {
|
|
3338
3499
|
selector.stopValidation();
|
|
3339
3500
|
done();
|
|
3340
|
-
this.ctx.ui.
|
|
3501
|
+
this.ctx.ui.requestLayoutRender("oauth-selector-close");
|
|
3341
3502
|
},
|
|
3342
3503
|
{
|
|
3343
3504
|
validateAuth: async (selectedProviderId: string) => {
|
|
@@ -3348,7 +3509,7 @@ export class SelectorController {
|
|
|
3348
3509
|
return !!apiKey;
|
|
3349
3510
|
},
|
|
3350
3511
|
requestRender: () => {
|
|
3351
|
-
this.ctx.ui.
|
|
3512
|
+
this.ctx.ui.requestLayoutRender("oauth-selector-spinner");
|
|
3352
3513
|
},
|
|
3353
3514
|
externalCredentialCandidates,
|
|
3354
3515
|
},
|
|
@@ -12,7 +12,7 @@ interface SttEditor {
|
|
|
12
12
|
|
|
13
13
|
interface SttUi {
|
|
14
14
|
getShowHardwareCursor(): boolean;
|
|
15
|
-
|
|
15
|
+
requestLayoutRender(source?: string): void;
|
|
16
16
|
setShowHardwareCursor(enabled: boolean): void;
|
|
17
17
|
}
|
|
18
18
|
|
|
@@ -59,7 +59,7 @@ export class SttModeController {
|
|
|
59
59
|
this.#cleanupAnimation(ctx);
|
|
60
60
|
}
|
|
61
61
|
ctx.updateEditorChrome();
|
|
62
|
-
ctx.ui.
|
|
62
|
+
ctx.ui.requestLayoutRender("stt-state");
|
|
63
63
|
}
|
|
64
64
|
|
|
65
65
|
#setMicCursor(editor: SttEditor, color: { r: number; g: number; b: number }): void {
|
|
@@ -74,7 +74,7 @@ export class SttModeController {
|
|
|
74
74
|
this.#animationInterval = setInterval(() => {
|
|
75
75
|
this.#hue = (this.#hue + 8) % 360;
|
|
76
76
|
this.#updateMicIcon(ctx.editor);
|
|
77
|
-
ctx.ui.
|
|
77
|
+
ctx.ui.requestLayoutRender("stt-animation");
|
|
78
78
|
}, 60);
|
|
79
79
|
}
|
|
80
80
|
|
|
@@ -25,6 +25,8 @@ import {
|
|
|
25
25
|
type KeyDisplayContext,
|
|
26
26
|
} from "../config/keybindings";
|
|
27
27
|
import { isSettingsInitialized, type Settings, settings } from "../config/settings";
|
|
28
|
+
import { compactCrashIndex, resolveCrashStatePaths } from "../crash/index-store";
|
|
29
|
+
import { crashNudgeGate, maybeShowCrashNudge } from "../crash/nudge";
|
|
28
30
|
import { DEFAULT_GJC_DEFINITION_NAMES } from "../defaults/gjc-defaults";
|
|
29
31
|
import type {
|
|
30
32
|
ExtensionUIContext,
|
|
@@ -67,10 +69,14 @@ import {
|
|
|
67
69
|
IrcLeftLaneComponent,
|
|
68
70
|
IrcSplitViewComponent,
|
|
69
71
|
} from "./components/irc-sidebar";
|
|
72
|
+
import { createNativePetTransport, type ItermPetTransport } from "./components/iterm-pet-transport";
|
|
70
73
|
import {
|
|
74
|
+
getItermPetAvailability,
|
|
75
|
+
getItermPetUnavailableReason,
|
|
71
76
|
getPetUnavailableWarning,
|
|
72
77
|
isPetAvailable,
|
|
73
78
|
isPetCapabilityProbePending,
|
|
79
|
+
setVerifiedItermPetAvailability,
|
|
74
80
|
warnWhenPetCapabilitySettled,
|
|
75
81
|
} from "./components/pet-capability";
|
|
76
82
|
import type { ToolExecutionHandle } from "./components/tool-execution";
|
|
@@ -432,6 +438,20 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
432
438
|
#resolvedSlashCommands: SlashCommand[] = [];
|
|
433
439
|
#baseReservedSlashCommandNames: Set<string> = new Set();
|
|
434
440
|
#cleanupUnsubscribe?: () => void;
|
|
441
|
+
#itermPetTransport?: ItermPetTransport;
|
|
442
|
+
|
|
443
|
+
/**
|
|
444
|
+
* Pet-unavailable warning text. The iTerm transport reason is parenthesized
|
|
445
|
+
* only when a transport actually reported one; non-iTerm terminals and a
|
|
446
|
+
* probe still in flight keep the plain warning instead of "(unknown)".
|
|
447
|
+
*/
|
|
448
|
+
#petUnavailableStatusText(): string {
|
|
449
|
+
if (!this.#itermPetTransport || getItermPetAvailability() === undefined) return getPetUnavailableWarning();
|
|
450
|
+
const reason = getItermPetUnavailableReason();
|
|
451
|
+
return reason === undefined ? getPetUnavailableWarning() : `${getPetUnavailableWarning()} (${reason})`;
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
#petTransportAvailabilityUnsubscribe?: () => void;
|
|
435
455
|
#subprocessTeardownUnsubscribe?: () => void;
|
|
436
456
|
#petProtocolUnsubscribe?: () => void;
|
|
437
457
|
/** Cancels a startup pet-unavailable warning still awaiting probe settlement. */
|
|
@@ -618,6 +638,18 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
618
638
|
}
|
|
619
639
|
},
|
|
620
640
|
});
|
|
641
|
+
this.#itermPetTransport = createNativePetTransport({ ui: this.ui });
|
|
642
|
+
if (this.#itermPetTransport) {
|
|
643
|
+
this.#petTransportAvailabilityUnsubscribe = this.#itermPetTransport.subscribe(availability => {
|
|
644
|
+
if (!availability.available) void this.petWidget?.suspendItermCapability();
|
|
645
|
+
setVerifiedItermPetAvailability(availability);
|
|
646
|
+
if (availability.available) {
|
|
647
|
+
if (availability.mode === "managed") this.ui.refreshImageCellSize();
|
|
648
|
+
const saved = settings.get("pet.mode");
|
|
649
|
+
if (saved !== "off" && this.petWidget && this.petWidget.mode === "off") this.petWidget.setMode(saved);
|
|
650
|
+
}
|
|
651
|
+
});
|
|
652
|
+
}
|
|
621
653
|
this.ui.setClearOnShrink(settings.get("clearOnShrink"));
|
|
622
654
|
this.chatContainer = new Container();
|
|
623
655
|
this.#ircSplitView = new IrcSplitViewComponent(this.chatContainer, this.ircLedger, () => theme);
|
|
@@ -810,26 +842,15 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
810
842
|
// appears without the user re-running /pet.
|
|
811
843
|
this.#petProtocolUnsubscribe?.();
|
|
812
844
|
this.#petProtocolUnsubscribe = onImageProtocolChanged(protocol => {
|
|
813
|
-
if (!protocol)
|
|
845
|
+
if (!protocol) {
|
|
846
|
+
void this.petWidget?.suspendItermCapability();
|
|
847
|
+
return;
|
|
848
|
+
}
|
|
814
849
|
const saved = settings.get("pet.mode");
|
|
815
850
|
if (saved !== "off" && this.petWidget && this.petWidget.mode === "off") {
|
|
816
851
|
this.petWidget.setMode(saved);
|
|
817
852
|
}
|
|
818
853
|
});
|
|
819
|
-
if (configuredPetMode !== "off" && !isPetAvailable()) {
|
|
820
|
-
// The async Sixel capability probe (started by TUI.start()) may still
|
|
821
|
-
// enable graphics; warn only once the capability question is settled
|
|
822
|
-
// so a supported terminal is never told it is incompatible.
|
|
823
|
-
this.#petUnavailableWarningDisposer?.();
|
|
824
|
-
this.#petUnavailableWarningDisposer = warnWhenPetCapabilitySettled({
|
|
825
|
-
probePending: isPetCapabilityProbePending(),
|
|
826
|
-
onUnavailable: () => {
|
|
827
|
-
this.showStatus(theme.fg("warning", getPetUnavailableWarning()), { dim: false });
|
|
828
|
-
this.ui.requestRender();
|
|
829
|
-
},
|
|
830
|
-
});
|
|
831
|
-
}
|
|
832
|
-
|
|
833
854
|
this.#inputController.setupKeyHandlers();
|
|
834
855
|
this.#inputController.setupEditorSubmitHandler();
|
|
835
856
|
this.editor.onViewportPageScroll = direction => {
|
|
@@ -878,6 +899,23 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
878
899
|
|
|
879
900
|
// Start the UI
|
|
880
901
|
this.ui.start();
|
|
902
|
+
if (this.#itermPetTransport) {
|
|
903
|
+
if (this.#itermPetTransport.availability.mode === "direct") void this.#itermPetTransport.probe();
|
|
904
|
+
else this.#itermPetTransport.startManagedPolling();
|
|
905
|
+
}
|
|
906
|
+
if (configuredPetMode !== "off" && !isPetAvailable()) {
|
|
907
|
+
// An async terminal capability probe may still enable graphics; warn only once
|
|
908
|
+
// the capability question is settled so a supported terminal is never told it
|
|
909
|
+
// is incompatible.
|
|
910
|
+
this.#petUnavailableWarningDisposer?.();
|
|
911
|
+
this.#petUnavailableWarningDisposer = warnWhenPetCapabilitySettled({
|
|
912
|
+
probePending: this.#itermPetTransport !== undefined || isPetCapabilityProbePending(),
|
|
913
|
+
onUnavailable: () => {
|
|
914
|
+
this.showStatus(theme.fg("warning", this.#petUnavailableStatusText()), { dim: false });
|
|
915
|
+
this.ui.requestRender();
|
|
916
|
+
},
|
|
917
|
+
});
|
|
918
|
+
}
|
|
881
919
|
pushTerminalTitle();
|
|
882
920
|
setSessionTerminalTitle(this.sessionManager.getSessionName(), this.sessionManager.getCwd());
|
|
883
921
|
this.updateEditorChrome();
|
|
@@ -928,6 +966,26 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
928
966
|
}),
|
|
929
967
|
);
|
|
930
968
|
}
|
|
969
|
+
// Crash nudge (interactive-only, local-only). Runs after the first render
|
|
970
|
+
// and routes through the centralized status surface — never `console.*`.
|
|
971
|
+
if (crashNudgeGate({ enabled: settings.get("crashReport.nudge"), interactive: true, quiet: startupQuiet })) {
|
|
972
|
+
const crashNudgeTimer = setTimeout(() => {
|
|
973
|
+
void (async () => {
|
|
974
|
+
try {
|
|
975
|
+
const paths = resolveCrashStatePaths();
|
|
976
|
+
const index = await compactCrashIndex({ paths });
|
|
977
|
+
if (this.#stopped) return;
|
|
978
|
+
await maybeShowCrashNudge(message => this.showStatus(message, { dim: true }), { paths, index });
|
|
979
|
+
} catch (error) {
|
|
980
|
+
logger.debug("Crash nudge skipped", {
|
|
981
|
+
error: error instanceof Error ? error.message : String(error),
|
|
982
|
+
});
|
|
983
|
+
}
|
|
984
|
+
})();
|
|
985
|
+
}, 0);
|
|
986
|
+
crashNudgeTimer.unref?.();
|
|
987
|
+
}
|
|
988
|
+
|
|
931
989
|
if (starReminderGate.schedule) {
|
|
932
990
|
scheduleLaunchStarReminderAfterFirstRender({
|
|
933
991
|
confirm: (title, message) =>
|
|
@@ -1301,7 +1359,8 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
1301
1359
|
*/
|
|
1302
1360
|
#commitPetMode(mode: PetMode, apply: (mode: PetMode) => void): boolean {
|
|
1303
1361
|
if (mode !== "off" && !isPetAvailable()) {
|
|
1304
|
-
this
|
|
1362
|
+
void this.#itermPetTransport?.retry();
|
|
1363
|
+
this.showStatus(theme.fg("warning", this.#petUnavailableStatusText()), { dim: false });
|
|
1305
1364
|
this.ui.requestRender();
|
|
1306
1365
|
return false;
|
|
1307
1366
|
}
|
|
@@ -1362,6 +1421,8 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
1362
1421
|
getComposerBottomOffset: () =>
|
|
1363
1422
|
this.petFloorContainer.render(this.ui.terminal.columns).length +
|
|
1364
1423
|
this.hookWidgetContainerBelow.render(this.ui.terminal.columns).length,
|
|
1424
|
+
syncManagedItermCursor: (row, column) =>
|
|
1425
|
+
this.#itermPetTransport?.refreshManagedClient(row, column) ?? Promise.resolve(false),
|
|
1365
1426
|
});
|
|
1366
1427
|
}
|
|
1367
1428
|
|
|
@@ -1515,6 +1576,11 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
1515
1576
|
this.#petUnavailableWarningDisposer = undefined;
|
|
1516
1577
|
this.petWidget?.dispose();
|
|
1517
1578
|
this.petWidget = undefined;
|
|
1579
|
+
this.#petTransportAvailabilityUnsubscribe?.();
|
|
1580
|
+
this.#petTransportAvailabilityUnsubscribe = undefined;
|
|
1581
|
+
void this.#itermPetTransport?.dispose();
|
|
1582
|
+
this.#itermPetTransport = undefined;
|
|
1583
|
+
setVerifiedItermPetAvailability(undefined);
|
|
1518
1584
|
this.#welcomeComponent?.dispose();
|
|
1519
1585
|
this.#welcomeComponent = undefined;
|
|
1520
1586
|
if (this.#sttController) {
|
|
@@ -1585,6 +1651,8 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
1585
1651
|
// This prevents escape sequences from leaking to the parent shell over slow SSH.
|
|
1586
1652
|
await this.ui.terminal.drainInput(1000);
|
|
1587
1653
|
popTerminalTitle();
|
|
1654
|
+
await this.petWidget?.disposeAsync();
|
|
1655
|
+
await this.#itermPetTransport?.dispose();
|
|
1588
1656
|
this.stop();
|
|
1589
1657
|
|
|
1590
1658
|
// Print resumption hint if this is a persisted session
|
|
@@ -2249,6 +2317,10 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
2249
2317
|
void this.#selectorController.showExtensionsDashboard();
|
|
2250
2318
|
}
|
|
2251
2319
|
|
|
2320
|
+
showCustomizationDashboard(): void {
|
|
2321
|
+
void this.#selectorController.showCustomizationDashboard();
|
|
2322
|
+
}
|
|
2323
|
+
|
|
2252
2324
|
showAgentsDashboard(): void {
|
|
2253
2325
|
void this.#selectorController.showAgentsDashboard();
|
|
2254
2326
|
}
|