@opengsd/gsd-pi 1.2.0-dev.0b870afa → 1.2.0-dev.23d85b63
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli-model-override.d.ts +15 -0
- package/dist/cli-model-override.js +21 -0
- package/dist/cli.js +14 -19
- package/dist/headless-events.d.ts +16 -1
- package/dist/headless-events.js +19 -2
- package/dist/headless.js +8 -1
- package/dist/loader.js +6 -4
- package/dist/onboarding.js +9 -4
- package/dist/provider-migrations.d.ts +23 -0
- package/dist/provider-migrations.js +41 -0
- package/dist/register-agent-bundles.d.ts +11 -2
- package/dist/register-agent-bundles.js +18 -4
- package/dist/resource-loader.d.ts +10 -5
- package/dist/resource-loader.js +121 -6
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/ask-user-questions.js +3 -2
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +447 -215
- package/dist/resources/extensions/claude-code-cli/turn-assembler.js +33 -1
- package/dist/resources/extensions/google-cli/stream-adapter.js +16 -1
- package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
- package/dist/resources/extensions/gsd/auto/dispatch-history.js +21 -6
- package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
- package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
- package/dist/resources/extensions/gsd/auto/loop.js +4 -1
- package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
- package/dist/resources/extensions/gsd/auto/orchestrator.js +119 -18
- package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
- package/dist/resources/extensions/gsd/auto/phases.js +17 -2372
- package/dist/resources/extensions/gsd/auto/pre-dispatch.js +542 -0
- package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
- package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
- package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
- package/dist/resources/extensions/gsd/auto-closeout-messaging.js +90 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +255 -431
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +15 -3
- package/dist/resources/extensions/gsd/auto-dispatch.js +19 -1
- package/dist/resources/extensions/gsd/auto-model-selection.js +9 -6
- package/dist/resources/extensions/gsd/auto-post-unit.js +12 -8
- package/dist/resources/extensions/gsd/auto-prompts.js +5 -1
- package/dist/resources/extensions/gsd/auto-recovery.js +52 -6
- package/dist/resources/extensions/gsd/auto-start.js +28 -7
- package/dist/resources/extensions/gsd/auto-worktree.js +48 -3
- package/dist/resources/extensions/gsd/auto.js +83 -19
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +4 -2
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -7
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +3 -1
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +32 -3
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +56 -16
- package/dist/resources/extensions/gsd/closeout-wizard.js +8 -3
- package/dist/resources/extensions/gsd/commands/handlers/core.js +22 -8
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +2 -2
- package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +8 -0
- package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
- package/dist/resources/extensions/gsd/config-overlay.js +11 -8
- package/dist/resources/extensions/gsd/db/engine.js +24 -6
- package/dist/resources/extensions/gsd/db/queries.js +30 -0
- package/dist/resources/extensions/gsd/db/writers/reconcile.js +19 -1
- package/dist/resources/extensions/gsd/db-migration-backup.js +51 -8
- package/dist/resources/extensions/gsd/db-transaction.js +27 -23
- package/dist/resources/extensions/gsd/db-writer.js +8 -17
- package/dist/resources/extensions/gsd/doctor-environment.js +256 -125
- package/dist/resources/extensions/gsd/doctor-git-checks.js +5 -1
- package/dist/resources/extensions/gsd/doctor-providers.js +1 -1
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +11 -9
- package/dist/resources/extensions/gsd/gsd-db.js +15 -20
- package/dist/resources/extensions/gsd/guided-flow.js +88 -2
- package/dist/resources/extensions/gsd/health-widget.js +87 -28
- package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
- package/dist/resources/extensions/gsd/memory-relations.js +1 -1
- package/dist/resources/extensions/gsd/milestone-settlement.js +2 -2
- package/dist/resources/extensions/gsd/notifications.js +12 -7
- package/dist/resources/extensions/gsd/preferences-models.js +17 -9
- package/dist/resources/extensions/gsd/preferences.js +91 -5
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +8 -2
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +6 -2
- package/dist/resources/extensions/gsd/prompts/execute-task.md +7 -2
- package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/reactive-execute.md +2 -2
- package/dist/resources/extensions/gsd/prompts/run-uat.md +7 -1
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
- package/dist/resources/extensions/gsd/provider-error-guidance.js +24 -0
- package/dist/resources/extensions/gsd/session-lock.js +4 -3
- package/dist/resources/extensions/gsd/skill-activation.js +3 -6
- package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +13 -6
- package/dist/resources/extensions/gsd/state.js +6 -2
- package/dist/resources/extensions/gsd/tool-surface-readiness.js +83 -31
- package/dist/resources/extensions/gsd/tools/complete-task.js +62 -0
- package/dist/resources/extensions/gsd/tools/exec-tool.js +2 -109
- package/dist/resources/extensions/gsd/tui/render-kit.js +38 -13
- package/dist/resources/extensions/gsd/unit-context-composer.js +1 -1
- package/dist/resources/extensions/gsd/unit-registry.js +34 -4
- package/dist/resources/extensions/gsd/workflow-logger.js +4 -0
- package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
- package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
- package/dist/resources/extensions/gsd/worktree-manager.js +101 -2
- package/dist/resources/extensions/gsd/worktree-safety.js +28 -26
- package/dist/resources/extensions/gsd/worktree-shell-guard.js +113 -0
- package/dist/resources/extensions/gsd/worktree.js +8 -1
- package/dist/resources/extensions/mcp-client/manager.js +6 -1
- package/dist/resources/extensions/search-the-web/index.js +41 -9
- package/dist/resources/extensions/search-the-web/native-search.js +18 -4
- package/dist/resources/extensions/shared/gsd-browser-cli.js +40 -2
- package/dist/resources/extensions/subagent/index.js +20 -15
- package/dist/resources/extensions/subagent/worktree-cwd.js +31 -0
- package/dist/resources/skills/create-skill/SKILL.md +3 -0
- package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
- package/dist/runtime-checks.d.ts +10 -0
- package/dist/runtime-checks.js +27 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
- package/dist/web/standalone/.next/build-manifest.json +2 -2
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
- package/dist/web/standalone/.next/server/chunks/{5942.js → 1128.js} +1 -1
- package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
- package/package.json +4 -4
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/sdk.js +12 -6
- package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.d.ts +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js +12 -24
- package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/bash-execution.js +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.d.ts +3 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.js +20 -11
- package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.d.ts +4 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.js +5 -54
- package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.d.ts +2 -4
- package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.js +2 -4
- package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.js +4 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.d.ts +9 -12
- package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.js +100 -166
- package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.js +4 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.d.ts +23 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.js +178 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts +8 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js +21 -9
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.d.ts +2 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.js +2 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +11 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +85 -19
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +71 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +257 -37
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.d.ts +3 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.js +19 -19
- package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts +3 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +26 -10
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.js +12 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +5 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.js +3 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +3 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js +2 -2
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js +25 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-key-handlers.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-key-handlers.js +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-key-handlers.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.d.ts +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.js +20 -49
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts +4 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +10 -2
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +48 -6
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-ui-messaging.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-ui-messaging.js +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-ui-messaging.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -0
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/README.md +12 -3
- package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
- package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
- package/packages/mcp-server/dist/cli-runner.js +137 -0
- package/packages/mcp-server/dist/cli-runner.js.map +1 -0
- package/packages/mcp-server/dist/cli.js +2 -58
- package/packages/mcp-server/dist/cli.js.map +1 -1
- package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
- package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
- package/packages/mcp-server/dist/pid-registry.js +459 -0
- package/packages/mcp-server/dist/pid-registry.js.map +1 -0
- package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
- package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
- package/packages/mcp-server/dist/probe-mode.js +10 -0
- package/packages/mcp-server/dist/probe-mode.js.map +1 -0
- package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
- package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
- package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
- package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +62 -43
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +5 -5
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +52 -2
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts +28 -2
- package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +5 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js +3 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
- package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
- package/packages/pi-coding-agent/package.json +8 -8
- package/packages/pi-tui/README.md +15 -0
- package/packages/pi-tui/dist/autocomplete.d.ts.map +1 -1
- package/packages/pi-tui/dist/autocomplete.js +6 -1
- package/packages/pi-tui/dist/autocomplete.js.map +1 -1
- package/packages/pi-tui/dist/components/input.js +1 -1
- package/packages/pi-tui/dist/components/input.js.map +1 -1
- package/packages/pi-tui/dist/components/loader.d.ts.map +1 -1
- package/packages/pi-tui/dist/components/loader.js +1 -0
- package/packages/pi-tui/dist/components/loader.js.map +1 -1
- package/packages/pi-tui/dist/components/select-list.d.ts.map +1 -1
- package/packages/pi-tui/dist/components/select-list.js +8 -2
- package/packages/pi-tui/dist/components/select-list.js.map +1 -1
- package/packages/pi-tui/dist/index.d.ts +2 -2
- package/packages/pi-tui/dist/index.d.ts.map +1 -1
- package/packages/pi-tui/dist/index.js +2 -2
- package/packages/pi-tui/dist/index.js.map +1 -1
- package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
- package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal-image.js +54 -2
- package/packages/pi-tui/dist/terminal-image.js.map +1 -1
- package/packages/pi-tui/dist/terminal.d.ts +12 -0
- package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal.js +70 -25
- package/packages/pi-tui/dist/terminal.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts +15 -0
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +106 -21
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/dist/utils.d.ts.map +1 -1
- package/packages/pi-tui/dist/utils.js +110 -36
- package/packages/pi-tui/dist/utils.js.map +1 -1
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/dist/theme/theme.d.ts.map +1 -1
- package/pkg/dist/theme/theme.js +45 -17
- package/pkg/dist/theme/theme.js.map +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/extensions/ask-user-questions.ts +7 -2
- package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +80 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +531 -226
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +672 -7
- package/src/resources/extensions/claude-code-cli/turn-assembler.ts +38 -1
- package/src/resources/extensions/google-cli/stream-adapter.ts +22 -1
- package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
- package/src/resources/extensions/gsd/auto/dispatch-history.ts +22 -6
- package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
- package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
- package/src/resources/extensions/gsd/auto/loop.ts +4 -1
- package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
- package/src/resources/extensions/gsd/auto/orchestrator.ts +140 -18
- package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
- package/src/resources/extensions/gsd/auto/phases.ts +58 -3061
- package/src/resources/extensions/gsd/auto/pre-dispatch.ts +716 -0
- package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
- package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
- package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
- package/src/resources/extensions/gsd/auto-closeout-messaging.ts +90 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +310 -454
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +15 -2
- package/src/resources/extensions/gsd/auto-dispatch.ts +24 -2
- package/src/resources/extensions/gsd/auto-model-selection.ts +20 -5
- package/src/resources/extensions/gsd/auto-post-unit.ts +16 -9
- package/src/resources/extensions/gsd/auto-prompts.ts +5 -1
- package/src/resources/extensions/gsd/auto-recovery.ts +62 -8
- package/src/resources/extensions/gsd/auto-start.ts +44 -7
- package/src/resources/extensions/gsd/auto-worktree.ts +51 -3
- package/src/resources/extensions/gsd/auto.ts +118 -18
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +6 -2
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +56 -6
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +2 -1
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +36 -3
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +69 -16
- package/src/resources/extensions/gsd/closeout-wizard.ts +11 -2
- package/src/resources/extensions/gsd/commands/handlers/core.ts +27 -8
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -2
- package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +7 -0
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
- package/src/resources/extensions/gsd/config-overlay.ts +22 -9
- package/src/resources/extensions/gsd/db/engine.ts +26 -6
- package/src/resources/extensions/gsd/db/queries.ts +29 -0
- package/src/resources/extensions/gsd/db/writers/reconcile.ts +24 -1
- package/src/resources/extensions/gsd/db-migration-backup.ts +56 -7
- package/src/resources/extensions/gsd/db-transaction.ts +37 -20
- package/src/resources/extensions/gsd/db-writer.ts +11 -19
- package/src/resources/extensions/gsd/doctor-environment.ts +267 -142
- package/src/resources/extensions/gsd/doctor-git-checks.ts +4 -1
- package/src/resources/extensions/gsd/doctor-providers.ts +1 -1
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +10 -10
- package/src/resources/extensions/gsd/gsd-db.ts +15 -19
- package/src/resources/extensions/gsd/guided-flow.ts +128 -2
- package/src/resources/extensions/gsd/health-widget.ts +91 -27
- package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
- package/src/resources/extensions/gsd/memory-relations.ts +1 -1
- package/src/resources/extensions/gsd/milestone-settlement.ts +2 -2
- package/src/resources/extensions/gsd/notifications.ts +13 -6
- package/src/resources/extensions/gsd/preferences-models.ts +26 -8
- package/src/resources/extensions/gsd/preferences.ts +111 -5
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +8 -2
- package/src/resources/extensions/gsd/prompts/complete-slice.md +6 -2
- package/src/resources/extensions/gsd/prompts/execute-task.md +7 -2
- package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/reactive-execute.md +2 -2
- package/src/resources/extensions/gsd/prompts/run-uat.md +7 -1
- package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
- package/src/resources/extensions/gsd/provider-error-guidance.ts +32 -0
- package/src/resources/extensions/gsd/session-lock.ts +8 -7
- package/src/resources/extensions/gsd/skill-activation.ts +3 -6
- package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +23 -10
- package/src/resources/extensions/gsd/state.ts +7 -1
- package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-closeout-messaging.test.ts +71 -0
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +68 -116
- package/src/resources/extensions/gsd/tests/auto-direct-dispatch-parse.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +206 -22
- package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +7 -2
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +16 -1
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +89 -22
- package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +97 -4
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
- package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
- package/src/resources/extensions/gsd/tests/auto-verification.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/blocker-placeholder-logs.test.ts +218 -0
- package/src/resources/extensions/gsd/tests/complete-milestone-prompt-rendering.test.ts +6 -2
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
- package/src/resources/extensions/gsd/tests/core-overlay-fallback.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/db-engine-logs.test.ts +207 -0
- package/src/resources/extensions/gsd/tests/db-migration-backup.test.ts +68 -19
- package/src/resources/extensions/gsd/tests/db-transaction.test.ts +59 -0
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
- package/src/resources/extensions/gsd/tests/dispatch-db-degradation-logs.test.ts +98 -0
- package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/dispatch-logs.test.ts +103 -0
- package/src/resources/extensions/gsd/tests/dispatch-reactive-logs.test.ts +98 -0
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +6 -4
- package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +117 -91
- package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +40 -7
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
- package/src/resources/extensions/gsd/tests/loop.test.ts +60 -0
- package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/model-router.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
- package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +13 -1
- package/src/resources/extensions/gsd/tests/orchestrator-legacy-parity.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/orchestrator-logs.test.ts +335 -0
- package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +5 -0
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/prefs-missing-models-crash.test.ts +35 -4
- package/src/resources/extensions/gsd/tests/progress-strip-test-helpers.ts +79 -0
- package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +11 -2
- package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
- package/src/resources/extensions/gsd/tests/reconcile-logs.test.ts +244 -0
- package/src/resources/extensions/gsd/tests/recovery-finalize-logs.test.ts +119 -0
- package/src/resources/extensions/gsd/tests/recovery-verify-logs.test.ts +428 -0
- package/src/resources/extensions/gsd/tests/register-extension-guard.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
- package/src/resources/extensions/gsd/tests/resume-missing-worktree-warning.test.ts +5 -5
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +7 -1
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/show-config-command.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +170 -48
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +7 -3
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +17 -1
- package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
- package/src/resources/extensions/gsd/tests/thinking-level-resolution.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +184 -10
- package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +40 -86
- package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +44 -6
- package/src/resources/extensions/gsd/tests/uok-audit.test.ts +194 -0
- package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +65 -2
- package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +72 -0
- package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +75 -3
- package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
- package/src/resources/extensions/gsd/tool-surface-readiness.ts +126 -19
- package/src/resources/extensions/gsd/tools/complete-task.ts +87 -0
- package/src/resources/extensions/gsd/tools/exec-tool.ts +2 -118
- package/src/resources/extensions/gsd/tui/render-kit.ts +56 -13
- package/src/resources/extensions/gsd/unit-context-composer.ts +1 -1
- package/src/resources/extensions/gsd/unit-registry.ts +34 -4
- package/src/resources/extensions/gsd/workflow-logger.ts +5 -0
- package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -0
- package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
- package/src/resources/extensions/gsd/worktree-manager.ts +97 -2
- package/src/resources/extensions/gsd/worktree-safety.ts +41 -39
- package/src/resources/extensions/gsd/worktree-shell-guard.ts +123 -0
- package/src/resources/extensions/gsd/worktree.ts +7 -1
- package/src/resources/extensions/mcp-client/manager.ts +7 -1
- package/src/resources/extensions/search-the-web/index.ts +45 -9
- package/src/resources/extensions/search-the-web/native-search.ts +16 -4
- package/src/resources/extensions/shared/gsd-browser-cli.ts +41 -2
- package/src/resources/extensions/subagent/index.ts +20 -15
- package/src/resources/extensions/subagent/tests/worktree-cwd.test.ts +57 -0
- package/src/resources/extensions/subagent/worktree-cwd.ts +35 -0
- package/src/resources/skills/create-skill/SKILL.md +3 -0
- package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
- package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
- package/src/resources/skills/gsd-browser/SKILL.md +0 -41
- /package/dist/web/standalone/.next/static/{T-LTxEw5wir5Lm5T3qEVd → Wn9u2NYq0cyUigB_3Z0_N}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{T-LTxEw5wir5Lm5T3qEVd → Wn9u2NYq0cyUigB_3Z0_N}/_ssgManifest.js +0 -0
|
@@ -98,6 +98,24 @@ export async function initExtensions(host) {
|
|
|
98
98
|
}
|
|
99
99
|
export function setExtensionStatus(host, key, text) {
|
|
100
100
|
host.footerDataProvider.setExtensionStatus(key, text);
|
|
101
|
+
host.footer.invalidate();
|
|
102
|
+
host.ui.requestRender();
|
|
103
|
+
}
|
|
104
|
+
export function setGsdProgress(host, state, dispose) {
|
|
105
|
+
if (dispose !== undefined) {
|
|
106
|
+
const prev = host.gsdProgressDispose;
|
|
107
|
+
host.gsdProgressDispose = dispose;
|
|
108
|
+
// Reset user's manual expansion for the new unit so widgetMode drives
|
|
109
|
+
// the initial state again (the user can re-collapse via ctrl+shift+d).
|
|
110
|
+
host.gsdStatusExpanded = undefined;
|
|
111
|
+
prev?.();
|
|
112
|
+
}
|
|
113
|
+
else if (state === undefined) {
|
|
114
|
+
const prev = host.gsdProgressDispose;
|
|
115
|
+
host.gsdProgressDispose = undefined;
|
|
116
|
+
prev?.();
|
|
117
|
+
}
|
|
118
|
+
host.gsdProgressState = state;
|
|
101
119
|
host.ui.requestRender();
|
|
102
120
|
}
|
|
103
121
|
/**
|
|
@@ -169,6 +187,10 @@ export function resetExtensionUI(host) {
|
|
|
169
187
|
host.setExtensionFooter(undefined);
|
|
170
188
|
host.setExtensionHeader(undefined);
|
|
171
189
|
clearExtensionWidgets(host);
|
|
190
|
+
const prevGsdDispose = host.gsdProgressDispose;
|
|
191
|
+
host.gsdProgressDispose = undefined;
|
|
192
|
+
host.gsdProgressState = undefined;
|
|
193
|
+
prevGsdDispose?.();
|
|
172
194
|
host.footerDataProvider.clearExtensionStatuses();
|
|
173
195
|
host.footer.invalidate();
|
|
174
196
|
host.setCustomEditorComponent(undefined);
|
|
@@ -194,6 +216,9 @@ export function renderWidgets(host) {
|
|
|
194
216
|
render: () => pinned.children.length > 0 ? [] : [""],
|
|
195
217
|
invalidate: () => { },
|
|
196
218
|
});
|
|
219
|
+
if (host.gsdStatusWidget) {
|
|
220
|
+
host.widgetContainerAbove.addChild(host.gsdStatusWidget);
|
|
221
|
+
}
|
|
197
222
|
for (const component of host.extensionWidgetsAbove.values()) {
|
|
198
223
|
host.widgetContainerAbove.addChild(component);
|
|
199
224
|
}
|
package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactive-extension-widgets.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-extension-widgets.ts"],"names":[],"mappings":"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","sourcesContent":["// Project/App: gsd-pi\n// File Purpose: Extracted from interactive-mode.ts (Phase E2 seam remediation).\n// @ts-nocheck\n\nimport { Container, Spacer, Text, type Component, type TUI } from \"@gsd/pi-tui\";\nimport type { ExtensionUIContext, ExtensionUIDialogOptions, ExtensionWidgetOptions } from \"@gsd/pi-coding-agent/core/extensions/index.js\";\nimport { setupExtensionShortcuts } from \"./interactive-extension-tools.js\";\nexport { getRegisteredToolDefinition, formatWebSearchResult } from \"./interactive-extension-tools.js\";\nimport { FooterDataProvider, type ReadonlyFooterDataProvider } from \"@gsd/pi-coding-agent/core/footer-data-provider.js\";\nimport { setRegisteredThemes, setTheme, Theme, theme } from \"@gsd/pi-coding-agent/theme/theme.js\";\nimport { appKey } from \"./components/keybinding-hints.js\";\nimport { ExtensionEditorComponent } from \"./components/extension-editor.js\";\nimport { ExtensionInputComponent } from \"./components/extension-input.js\";\nimport { ExtensionSelectorComponent } from \"./components/extension-selector.js\";\nimport type { ExtensionNotifyType } from \"./interactive-notify-render.js\";\nimport { renderBlockingErrorBanner, renderExtensionNotifyInChat } from \"./interactive-notify-render.js\";\nimport { createExtensionUIContext as buildExtensionUIContext } from \"./controllers/extension-ui-controller.js\";\nimport { MAX_WIDGET_LINES } from \"./interactive-mode-class-constants.js\";\nimport type { InteractiveModeDelegateHost } from \"./interactive-mode-delegate-host.js\";\nimport { getEditorTheme } from \"@gsd/pi-coding-agent/theme/theme.js\";\nimport type { EditorComponent, EditorTheme, KeybindingsManager, OverlayHandle, OverlayOptions } from \"@gsd/pi-tui\";\n\nexport async function initExtensions(host: InteractiveModeDelegateHost): Promise<void> {\n\t\tif (host.options.bindExtensions !== false) {\n\t\t\tconst uiContext = host.createExtensionUIContext();\n\t\t\tawait host.session.bindExtensions({\n\t\t\t\tuiContext,\n\t\t\t\tcommandContextActions: {\n\t\t\t\t\twaitForIdle: () => host.session.agent.waitForIdle(),\n\t\t\t\t\tnewSession: async (options) => {\n\t\t\t\t\t\tif (host.loadingAnimation) {\n\t\t\t\t\t\t\thost.loadingAnimation.stop();\n\t\t\t\t\t\t\thost.loadingAnimation = undefined;\n\t\t\t\t\t\t}\n\t\t\t\t\t\thost.statusContainer.clear();\n\n\t\t\t\t\t\t// Delegate to AgentSession (handles setup + agent state sync)\n\t\t\t\t\t\tconst success = await host.session.newSession(options);\n\t\t\t\t\t\tif (!success) {\n\t\t\t\t\t\t\treturn { cancelled: true };\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Clear UI state\n\t\t\t\t\t\thost.chatContainer.clear();\n\t\t\t\t\t\thost.pendingMessagesContainer.clear();\n\t\t\t\t\t\thost.compactionQueuedMessages = [];\n\t\t\t\t\t\thost.streamingComponent = undefined;\n\t\t\t\t\t\thost.streamingMessage = undefined;\n\t\t\t\t\t\thost.pendingTools.clear();\n\t\t\t\t\t\thost.clearBlockingError();\n\n\t\t\t\t\t\t// Render any messages added via setup, or show empty session\n\t\t\t\t\t\thost.renderInitialMessages();\n\t\t\t\t\t\thost.ui.requestRender();\n\n\t\t\t\t\t\treturn { cancelled: false };\n\t\t\t\t\t},\n\t\t\t\t\tfork: async (entryId) => {\n\t\t\t\t\t\tconst result = await host.session.fork(entryId);\n\t\t\t\t\t\tif (result.cancelled) {\n\t\t\t\t\t\t\treturn { cancelled: true };\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\thost.chatContainer.clear();\n\t\t\t\t\t\thost.renderInitialMessages();\n\t\t\t\t\t\thost.editor.setText(result.selectedText);\n\t\t\t\t\t\thost.showStatus(\"Forked to new session\");\n\n\t\t\t\t\t\treturn { cancelled: false };\n\t\t\t\t\t},\n\t\t\t\t\tnavigateTree: async (targetId, options) => {\n\t\t\t\t\t\tconst result = await host.session.navigateTree(targetId, {\n\t\t\t\t\t\t\tsummarize: options?.summarize,\n\t\t\t\t\t\t\tcustomInstructions: options?.customInstructions,\n\t\t\t\t\t\t\treplaceInstructions: options?.replaceInstructions,\n\t\t\t\t\t\t\tlabel: options?.label,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (result.cancelled) {\n\t\t\t\t\t\t\treturn { cancelled: true };\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\thost.chatContainer.clear();\n\t\t\t\t\t\thost.renderInitialMessages();\n\t\t\t\t\t\tif (result.editorText && !host.editor.getText().trim()) {\n\t\t\t\t\t\t\thost.editor.setText(result.editorText);\n\t\t\t\t\t\t}\n\t\t\t\t\t\thost.showStatus(\"Navigated to selected point\");\n\n\t\t\t\t\t\treturn { cancelled: false };\n\t\t\t\t\t},\n\t\t\t\t\tswitchSession: async (sessionPath) => {\n\t\t\t\t\t\tawait host.handleResumeSession(sessionPath);\n\t\t\t\t\t\treturn { cancelled: false };\n\t\t\t\t\t},\n\t\t\t\t\treload: async () => {\n\t\t\t\t\t\tawait host.handleReloadCommand();\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tshutdownHandler: () => {\n\t\t\t\t\thost.shutdownRequested = true;\n\t\t\t\t\tif (!host.session.isStreaming) {\n\t\t\t\t\t\tvoid host.shutdown();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tonError: (error) => {\n\t\t\t\t\thost.showExtensionError(error.extensionPath, error.error, error.stack);\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\tsetRegisteredThemes(host.session.resourceLoader.getThemes().themes);\n\t\thost.setupAutocomplete();\n\n\t\tconst extensionRunner = host.session.extensionRunner;\n\t\tif (!extensionRunner) {\n\t\t\thost.showLoadedResources({ extensionPaths: [], force: false });\n\t\t\treturn;\n\t\t}\n\n\t\tsetupExtensionShortcuts(host, extensionRunner);\n\t\thost.showLoadedResources({ extensionPaths: extensionRunner.getExtensionPaths(), force: false });\n\t}\n\nexport function setExtensionStatus(host: InteractiveModeDelegateHost, key: string, text: string | undefined): void {\n\t\thost.footerDataProvider.setExtensionStatus(key, text);\n\t\thost.ui.requestRender();\n\t}\n\n\t/**\n\t * Set an extension widget (string array or custom component).\n\t */\nexport function setExtensionWidget(host: InteractiveModeDelegateHost, key: string,\n\t\tcontent: string[] | ((tui: TUI, thm: Theme) => Component & { dispose?(): void }) | undefined,\n\t\toptions?: ExtensionWidgetOptions,\n\t): void {\n\t\tconst placement = options?.placement ?? \"aboveEditor\";\n\t\tconst removeExisting = (map: Map<string, Component & { dispose?(): void }>) => {\n\t\t\tconst existing = map.get(key);\n\t\t\tif (existing?.dispose) existing.dispose();\n\t\t\tmap.delete(key);\n\t\t};\n\n\t\tremoveExisting(host.extensionWidgetsAbove);\n\t\tremoveExisting(host.extensionWidgetsBelow);\n\n\t\tif (content === undefined) {\n\t\t\trenderWidgets(host, );\n\t\t\treturn;\n\t\t}\n\n\t\tlet component: Component & { dispose?(): void };\n\n\t\tif (Array.isArray(content)) {\n\t\t\t// Wrap string array in a Container with Text components\n\t\t\tconst container = new Container();\n\t\t\tfor (const line of content.slice(0, MAX_WIDGET_LINES)) {\n\t\t\t\tcontainer.addChild(new Text(line, 1, 0));\n\t\t\t}\n\t\t\tif (content.length > MAX_WIDGET_LINES) {\n\t\t\t\tcontainer.addChild(new Text(theme.fg(\"muted\", \"... (widget truncated)\"), 1, 0));\n\t\t\t}\n\t\t\tcomponent = container;\n\t\t} else {\n\t\t\t// Factory function - create component\n\t\t\tcomponent = content(host.ui, theme);\n\t\t}\n\n\t\tconst targetMap = placement === \"belowEditor\" ? host.extensionWidgetsBelow : host.extensionWidgetsAbove;\n\t\ttargetMap.set(key, component);\n\t\trenderWidgets(host, );\n\t\t// Step-complete / handoff widgets replace the live progress panel and can\n\t\t// shrink the layout after pinned streaming output is torn down. Force a\n\t\t// full viewport realign so the transcript stays visible.\n\t\tif (key === \"gsd-outcome\" && content !== undefined) {\n\t\t\thost.ui.requestRender(true);\n\t\t}\n\t}\n\nexport function clearExtensionWidgets(host: InteractiveModeDelegateHost): void {\n\t\tfor (const widget of host.extensionWidgetsAbove.values()) {\n\t\t\twidget.dispose?.();\n\t\t}\n\t\tfor (const widget of host.extensionWidgetsBelow.values()) {\n\t\t\twidget.dispose?.();\n\t\t}\n\t\thost.extensionWidgetsAbove.clear();\n\t\thost.extensionWidgetsBelow.clear();\n\t\trenderWidgets(host, );\n\t}\n\nexport function resetExtensionUI(host: InteractiveModeDelegateHost): void {\n\t\tif (host.extensionSelector) {\n\t\t\thideExtensionSelector(host, );\n\t\t}\n\t\tif (host.extensionInput) {\n\t\t\thideExtensionInput(host, );\n\t\t}\n\t\tif (host.extensionEditor) {\n\t\t\thideExtensionEditor(host, );\n\t\t}\n\t\thost.ui.hideOverlay();\n\t\thost.clearExtensionTerminalInputListeners();\n\t\thost.setExtensionFooter(undefined);\n\t\thost.setExtensionHeader(undefined);\n\t\tclearExtensionWidgets(host, );\n\t\thost.footerDataProvider.clearExtensionStatuses();\n\t\thost.footer.invalidate();\n\t\thost.setCustomEditorComponent(undefined);\n\t\thost.defaultEditor.onExtensionShortcut = undefined;\n\t\thost.updateTerminalTitle();\n\t\tif (host.loadingAnimation) {\n\t\t\thost.loadingAnimation.setMessage(\n\t\t\t\t`${host.defaultWorkingMessage} (${appKey(host.keybindings, \"interrupt\")} to interrupt)`,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Render all extension widgets to the widget container.\n\t */\nexport function renderWidgets(host: InteractiveModeDelegateHost): void {\n\t\tif (!host.widgetContainerAbove || !host.widgetContainerBelow) return;\n\n\t\t// widgetContainerAbove: spacer collapses when pinned content is visible\n\t\t// so there's no extra blank line between pinned output and the editor border.\n\t\t// Use detachChildren() (not clear()) — the extensionWidgetsAbove map owns\n\t\t// disposal; clear() would dispose every mounted widget on every re-render.\n\t\thost.widgetContainerAbove.detachChildren();\n\t\tconst pinned = host.pinnedMessageContainer;\n\t\thost.widgetContainerAbove.addChild({\n\t\t\trender: () => pinned.children.length > 0 ? [] : [\"\"],\n\t\t\tinvalidate: () => {},\n\t\t});\n\t\tfor (const component of host.extensionWidgetsAbove.values()) {\n\t\t\thost.widgetContainerAbove.addChild(component);\n\t\t}\n\n\t\trenderWidgetContainer(host, host.widgetContainerBelow, host.extensionWidgetsBelow, false, false);\n\t\thost.ui.requestRender();\n\t}\n\nexport function renderWidgetContainer(host: InteractiveModeDelegateHost, \n\t\tcontainer: Container,\n\t\twidgets: Map<string, Component & { dispose?(): void }>,\n\t\tspacerWhenEmpty: boolean,\n\t\tleadingSpacer: boolean,\n\t): void {\n\t\t// Detach without disposing — the widgets map owns lifecycle; disposing\n\t\t// here would kill refresh timers and subscriptions on every re-render.\n\t\tcontainer.detachChildren();\n\n\t\tif (widgets.size === 0) {\n\t\t\tif (spacerWhenEmpty) {\n\t\t\t\tcontainer.addChild(new Spacer(1));\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (leadingSpacer) {\n\t\t\tcontainer.addChild(new Spacer(1));\n\t\t}\n\t\tfor (const component of widgets.values()) {\n\t\t\tcontainer.addChild(component);\n\t\t}\n\t}\n\n\t/**\n\t * Set a custom footer component, or restore the built-in footer.\n\t */\nexport function setExtensionFooter(host: InteractiveModeDelegateHost, factory:\n\t\t\t| ((tui: TUI, thm: Theme, footerData: ReadonlyFooterDataProvider) => Component & { dispose?(): void })\n\t\t\t| undefined,\n\t): void {\n\t\t// Dispose existing custom footer\n\t\tif (host.customFooter?.dispose) {\n\t\t\thost.customFooter.dispose();\n\t\t}\n\n\t\t// Remove current footer from UI\n\t\tif (host.customFooter) {\n\t\t\thost.ui.removeChild(host.customFooter);\n\t\t} else {\n\t\t\thost.ui.removeChild(host.footer);\n\t\t}\n\n\t\tif (factory) {\n\t\t\t// Create and add custom footer, passing the data provider\n\t\t\thost.customFooter = factory(host.ui, theme, host.footerDataProvider);\n\t\t\thost.ui.addChild(host.customFooter);\n\t\t} else {\n\t\t\t// Restore built-in footer\n\t\t\thost.customFooter = undefined;\n\t\t\thost.ui.addChild(host.footer);\n\t\t}\n\n\t\thost.ui.requestRender();\n\t}\n\n\t/**\n\t * Set a custom header component, or restore the built-in header.\n\t */\nexport function setExtensionHeader(host: InteractiveModeDelegateHost, factory: ((tui: TUI, thm: Theme) => Component & { dispose?(): void }) | undefined): void {\n\t\t// Header may not be initialized yet if called during early initialization\n\t\tif (!host.builtInHeader) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Dispose existing custom header\n\t\tif (host.customHeader?.dispose) {\n\t\t\thost.customHeader.dispose();\n\t\t}\n\n\t\t// Find the index of the current header in the header container\n\t\tconst currentHeader = host.customHeader || host.builtInHeader;\n\t\tconst index = host.headerContainer.children.indexOf(currentHeader);\n\n\t\tif (factory) {\n\t\t\t// Create and add custom header\n\t\t\thost.customHeader = factory(host.ui, theme);\n\t\t\tif (index !== -1) {\n\t\t\t\thost.headerContainer.children[index] = host.customHeader;\n\t\t\t} else {\n\t\t\t\t// If not found (e.g. builtInHeader was never added), add at the top\n\t\t\t\thost.headerContainer.children.unshift(host.customHeader);\n\t\t\t}\n\t\t} else {\n\t\t\t// Restore built-in header\n\t\t\thost.customHeader = undefined;\n\t\t\tif (index !== -1) {\n\t\t\t\thost.headerContainer.children[index] = host.builtInHeader;\n\t\t\t}\n\t\t}\n\n\t\thost.ui.requestRender();\n\t}\n\nexport function addExtensionTerminalInputListener(\n\thost: InteractiveModeDelegateHost,\n\thandler: (data: string) => { consume?: boolean; data?: string } | undefined,\n): () => void {\n\t\tconst unsubscribe = host.ui.addInputListener(handler);\n\t\thost.extensionTerminalInputUnsubscribers.add(unsubscribe);\n\t\treturn () => {\n\t\t\tunsubscribe();\n\t\t\thost.extensionTerminalInputUnsubscribers.delete(unsubscribe);\n\t\t};\n\t}\n\nexport function clearExtensionTerminalInputListeners(host: InteractiveModeDelegateHost): void {\n\t\tfor (const unsubscribe of host.extensionTerminalInputUnsubscribers) {\n\t\t\tunsubscribe();\n\t\t}\n\t\thost.extensionTerminalInputUnsubscribers.clear();\n\t}\n"]}
|
|
1
|
+
{"version":3,"file":"interactive-extension-widgets.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-extension-widgets.ts"],"names":[],"mappings":"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","sourcesContent":["// Project/App: gsd-pi\n// File Purpose: Extracted from interactive-mode.ts (Phase E2 seam remediation).\n// @ts-nocheck\n\nimport { Container, Spacer, Text, type Component, type TUI } from \"@gsd/pi-tui\";\nimport type { ExtensionUIContext, ExtensionUIDialogOptions, ExtensionWidgetOptions } from \"@gsd/pi-coding-agent/core/extensions/index.js\";\nimport { setupExtensionShortcuts } from \"./interactive-extension-tools.js\";\nexport { getRegisteredToolDefinition, formatWebSearchResult } from \"./interactive-extension-tools.js\";\nimport { FooterDataProvider, type ReadonlyFooterDataProvider } from \"@gsd/pi-coding-agent/core/footer-data-provider.js\";\nimport { setRegisteredThemes, setTheme, Theme, theme } from \"@gsd/pi-coding-agent/theme/theme.js\";\nimport { appKey } from \"./components/keybinding-hints.js\";\nimport { ExtensionEditorComponent } from \"./components/extension-editor.js\";\nimport { ExtensionInputComponent } from \"./components/extension-input.js\";\nimport { ExtensionSelectorComponent } from \"./components/extension-selector.js\";\nimport type { ExtensionNotifyType } from \"./interactive-notify-render.js\";\nimport { renderBlockingErrorBanner, renderExtensionNotifyInChat } from \"./interactive-notify-render.js\";\nimport { createExtensionUIContext as buildExtensionUIContext } from \"./controllers/extension-ui-controller.js\";\nimport { MAX_WIDGET_LINES } from \"./interactive-mode-class-constants.js\";\nimport type { InteractiveModeDelegateHost } from \"./interactive-mode-delegate-host.js\";\nimport { getEditorTheme } from \"@gsd/pi-coding-agent/theme/theme.js\";\nimport type { EditorComponent, EditorTheme, KeybindingsManager, OverlayHandle, OverlayOptions } from \"@gsd/pi-tui\";\n\nexport async function initExtensions(host: InteractiveModeDelegateHost): Promise<void> {\n\t\tif (host.options.bindExtensions !== false) {\n\t\t\tconst uiContext = host.createExtensionUIContext();\n\t\t\tawait host.session.bindExtensions({\n\t\t\t\tuiContext,\n\t\t\t\tcommandContextActions: {\n\t\t\t\t\twaitForIdle: () => host.session.agent.waitForIdle(),\n\t\t\t\t\tnewSession: async (options) => {\n\t\t\t\t\t\tif (host.loadingAnimation) {\n\t\t\t\t\t\t\thost.loadingAnimation.stop();\n\t\t\t\t\t\t\thost.loadingAnimation = undefined;\n\t\t\t\t\t\t}\n\t\t\t\t\t\thost.statusContainer.clear();\n\n\t\t\t\t\t\t// Delegate to AgentSession (handles setup + agent state sync)\n\t\t\t\t\t\tconst success = await host.session.newSession(options);\n\t\t\t\t\t\tif (!success) {\n\t\t\t\t\t\t\treturn { cancelled: true };\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Clear UI state\n\t\t\t\t\t\thost.chatContainer.clear();\n\t\t\t\t\t\thost.pendingMessagesContainer.clear();\n\t\t\t\t\t\thost.compactionQueuedMessages = [];\n\t\t\t\t\t\thost.streamingComponent = undefined;\n\t\t\t\t\t\thost.streamingMessage = undefined;\n\t\t\t\t\t\thost.pendingTools.clear();\n\t\t\t\t\t\thost.clearBlockingError();\n\n\t\t\t\t\t\t// Render any messages added via setup, or show empty session\n\t\t\t\t\t\thost.renderInitialMessages();\n\t\t\t\t\t\thost.ui.requestRender();\n\n\t\t\t\t\t\treturn { cancelled: false };\n\t\t\t\t\t},\n\t\t\t\t\tfork: async (entryId) => {\n\t\t\t\t\t\tconst result = await host.session.fork(entryId);\n\t\t\t\t\t\tif (result.cancelled) {\n\t\t\t\t\t\t\treturn { cancelled: true };\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\thost.chatContainer.clear();\n\t\t\t\t\t\thost.renderInitialMessages();\n\t\t\t\t\t\thost.editor.setText(result.selectedText);\n\t\t\t\t\t\thost.showStatus(\"Forked to new session\");\n\n\t\t\t\t\t\treturn { cancelled: false };\n\t\t\t\t\t},\n\t\t\t\t\tnavigateTree: async (targetId, options) => {\n\t\t\t\t\t\tconst result = await host.session.navigateTree(targetId, {\n\t\t\t\t\t\t\tsummarize: options?.summarize,\n\t\t\t\t\t\t\tcustomInstructions: options?.customInstructions,\n\t\t\t\t\t\t\treplaceInstructions: options?.replaceInstructions,\n\t\t\t\t\t\t\tlabel: options?.label,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (result.cancelled) {\n\t\t\t\t\t\t\treturn { cancelled: true };\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\thost.chatContainer.clear();\n\t\t\t\t\t\thost.renderInitialMessages();\n\t\t\t\t\t\tif (result.editorText && !host.editor.getText().trim()) {\n\t\t\t\t\t\t\thost.editor.setText(result.editorText);\n\t\t\t\t\t\t}\n\t\t\t\t\t\thost.showStatus(\"Navigated to selected point\");\n\n\t\t\t\t\t\treturn { cancelled: false };\n\t\t\t\t\t},\n\t\t\t\t\tswitchSession: async (sessionPath) => {\n\t\t\t\t\t\tawait host.handleResumeSession(sessionPath);\n\t\t\t\t\t\treturn { cancelled: false };\n\t\t\t\t\t},\n\t\t\t\t\treload: async () => {\n\t\t\t\t\t\tawait host.handleReloadCommand();\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tshutdownHandler: () => {\n\t\t\t\t\thost.shutdownRequested = true;\n\t\t\t\t\tif (!host.session.isStreaming) {\n\t\t\t\t\t\tvoid host.shutdown();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tonError: (error) => {\n\t\t\t\t\thost.showExtensionError(error.extensionPath, error.error, error.stack);\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\tsetRegisteredThemes(host.session.resourceLoader.getThemes().themes);\n\t\thost.setupAutocomplete();\n\n\t\tconst extensionRunner = host.session.extensionRunner;\n\t\tif (!extensionRunner) {\n\t\t\thost.showLoadedResources({ extensionPaths: [], force: false });\n\t\t\treturn;\n\t\t}\n\n\t\tsetupExtensionShortcuts(host, extensionRunner);\n\t\thost.showLoadedResources({ extensionPaths: extensionRunner.getExtensionPaths(), force: false });\n\t}\n\nexport function setExtensionStatus(host: InteractiveModeDelegateHost, key: string, text: string | undefined): void {\n\t\thost.footerDataProvider.setExtensionStatus(key, text);\n\t\thost.footer.invalidate();\n\t\thost.ui.requestRender();\n\t}\n\nexport function setGsdProgress(\n\thost: InteractiveModeDelegateHost,\n\tstate: import(\"@gsd/pi-coding-agent/core/extensions/extension-upstream-types.js\").GsdProgressState | undefined,\n\tdispose?: () => void,\n): void {\n\tif (dispose !== undefined) {\n\t\tconst prev = host.gsdProgressDispose;\n\t\thost.gsdProgressDispose = dispose;\n\t\t// Reset user's manual expansion for the new unit so widgetMode drives\n\t\t// the initial state again (the user can re-collapse via ctrl+shift+d).\n\t\thost.gsdStatusExpanded = undefined;\n\t\tprev?.();\n\t} else if (state === undefined) {\n\t\tconst prev = host.gsdProgressDispose;\n\t\thost.gsdProgressDispose = undefined;\n\t\tprev?.();\n\t}\n\thost.gsdProgressState = state;\n\thost.ui.requestRender();\n}\n\n\t/**\n\t * Set an extension widget (string array or custom component).\n\t */\nexport function setExtensionWidget(host: InteractiveModeDelegateHost, key: string,\n\t\tcontent: string[] | ((tui: TUI, thm: Theme) => Component & { dispose?(): void }) | undefined,\n\t\toptions?: ExtensionWidgetOptions,\n\t): void {\n\t\tconst placement = options?.placement ?? \"aboveEditor\";\n\t\tconst removeExisting = (map: Map<string, Component & { dispose?(): void }>) => {\n\t\t\tconst existing = map.get(key);\n\t\t\tif (existing?.dispose) existing.dispose();\n\t\t\tmap.delete(key);\n\t\t};\n\n\t\tremoveExisting(host.extensionWidgetsAbove);\n\t\tremoveExisting(host.extensionWidgetsBelow);\n\n\t\tif (content === undefined) {\n\t\t\trenderWidgets(host, );\n\t\t\treturn;\n\t\t}\n\n\t\tlet component: Component & { dispose?(): void };\n\n\t\tif (Array.isArray(content)) {\n\t\t\t// Wrap string array in a Container with Text components\n\t\t\tconst container = new Container();\n\t\t\tfor (const line of content.slice(0, MAX_WIDGET_LINES)) {\n\t\t\t\tcontainer.addChild(new Text(line, 1, 0));\n\t\t\t}\n\t\t\tif (content.length > MAX_WIDGET_LINES) {\n\t\t\t\tcontainer.addChild(new Text(theme.fg(\"muted\", \"... (widget truncated)\"), 1, 0));\n\t\t\t}\n\t\t\tcomponent = container;\n\t\t} else {\n\t\t\t// Factory function - create component\n\t\t\tcomponent = content(host.ui, theme);\n\t\t}\n\n\t\tconst targetMap = placement === \"belowEditor\" ? host.extensionWidgetsBelow : host.extensionWidgetsAbove;\n\t\ttargetMap.set(key, component);\n\t\trenderWidgets(host, );\n\t\t// Step-complete / handoff widgets replace the live progress panel and can\n\t\t// shrink the layout after pinned streaming output is torn down. Force a\n\t\t// full viewport realign so the transcript stays visible.\n\t\tif (key === \"gsd-outcome\" && content !== undefined) {\n\t\t\thost.ui.requestRender(true);\n\t\t}\n\t}\n\nexport function clearExtensionWidgets(host: InteractiveModeDelegateHost): void {\n\t\tfor (const widget of host.extensionWidgetsAbove.values()) {\n\t\t\twidget.dispose?.();\n\t\t}\n\t\tfor (const widget of host.extensionWidgetsBelow.values()) {\n\t\t\twidget.dispose?.();\n\t\t}\n\t\thost.extensionWidgetsAbove.clear();\n\t\thost.extensionWidgetsBelow.clear();\n\t\trenderWidgets(host, );\n\t}\n\nexport function resetExtensionUI(host: InteractiveModeDelegateHost): void {\n\t\tif (host.extensionSelector) {\n\t\t\thideExtensionSelector(host, );\n\t\t}\n\t\tif (host.extensionInput) {\n\t\t\thideExtensionInput(host, );\n\t\t}\n\t\tif (host.extensionEditor) {\n\t\t\thideExtensionEditor(host, );\n\t\t}\n\t\thost.ui.hideOverlay();\n\t\thost.clearExtensionTerminalInputListeners();\n\t\thost.setExtensionFooter(undefined);\n\t\thost.setExtensionHeader(undefined);\n\t\tclearExtensionWidgets(host, );\n\t\tconst prevGsdDispose = host.gsdProgressDispose;\n\t\thost.gsdProgressDispose = undefined;\n\t\thost.gsdProgressState = undefined;\n\t\tprevGsdDispose?.();\n\t\thost.footerDataProvider.clearExtensionStatuses();\n\t\thost.footer.invalidate();\n\t\thost.setCustomEditorComponent(undefined);\n\t\thost.defaultEditor.onExtensionShortcut = undefined;\n\t\thost.updateTerminalTitle();\n\t\tif (host.loadingAnimation) {\n\t\t\thost.loadingAnimation.setMessage(\n\t\t\t\t`${host.defaultWorkingMessage} (${appKey(host.keybindings, \"interrupt\")} to interrupt)`,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Render all extension widgets to the widget container.\n\t */\nexport function renderWidgets(host: InteractiveModeDelegateHost): void {\n\t\tif (!host.widgetContainerAbove || !host.widgetContainerBelow) return;\n\n\t\t// widgetContainerAbove: spacer collapses when pinned content is visible\n\t\t// so there's no extra blank line between pinned output and the editor border.\n\t\t// Use detachChildren() (not clear()) — the extensionWidgetsAbove map owns\n\t\t// disposal; clear() would dispose every mounted widget on every re-render.\n\t\thost.widgetContainerAbove.detachChildren();\n\t\tconst pinned = host.pinnedMessageContainer;\n\t\thost.widgetContainerAbove.addChild({\n\t\t\trender: () => pinned.children.length > 0 ? [] : [\"\"],\n\t\t\tinvalidate: () => {},\n\t\t});\n\t\tif (host.gsdStatusWidget) {\n\t\t\thost.widgetContainerAbove.addChild(host.gsdStatusWidget);\n\t\t}\n\t\tfor (const component of host.extensionWidgetsAbove.values()) {\n\t\t\thost.widgetContainerAbove.addChild(component);\n\t\t}\n\n\t\trenderWidgetContainer(host, host.widgetContainerBelow, host.extensionWidgetsBelow, false, false);\n\t\thost.ui.requestRender();\n\t}\n\nexport function renderWidgetContainer(host: InteractiveModeDelegateHost, \n\t\tcontainer: Container,\n\t\twidgets: Map<string, Component & { dispose?(): void }>,\n\t\tspacerWhenEmpty: boolean,\n\t\tleadingSpacer: boolean,\n\t): void {\n\t\t// Detach without disposing — the widgets map owns lifecycle; disposing\n\t\t// here would kill refresh timers and subscriptions on every re-render.\n\t\tcontainer.detachChildren();\n\n\t\tif (widgets.size === 0) {\n\t\t\tif (spacerWhenEmpty) {\n\t\t\t\tcontainer.addChild(new Spacer(1));\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (leadingSpacer) {\n\t\t\tcontainer.addChild(new Spacer(1));\n\t\t}\n\t\tfor (const component of widgets.values()) {\n\t\t\tcontainer.addChild(component);\n\t\t}\n\t}\n\n\t/**\n\t * Set a custom footer component, or restore the built-in footer.\n\t */\nexport function setExtensionFooter(host: InteractiveModeDelegateHost, factory:\n\t\t\t| ((tui: TUI, thm: Theme, footerData: ReadonlyFooterDataProvider) => Component & { dispose?(): void })\n\t\t\t| undefined,\n\t): void {\n\t\t// Dispose existing custom footer\n\t\tif (host.customFooter?.dispose) {\n\t\t\thost.customFooter.dispose();\n\t\t}\n\n\t\t// Remove current footer from UI\n\t\tif (host.customFooter) {\n\t\t\thost.ui.removeChild(host.customFooter);\n\t\t} else {\n\t\t\thost.ui.removeChild(host.footer);\n\t\t}\n\n\t\tif (factory) {\n\t\t\t// Create and add custom footer, passing the data provider\n\t\t\thost.customFooter = factory(host.ui, theme, host.footerDataProvider);\n\t\t\thost.ui.addChild(host.customFooter);\n\t\t} else {\n\t\t\t// Restore built-in footer\n\t\t\thost.customFooter = undefined;\n\t\t\thost.ui.addChild(host.footer);\n\t\t}\n\n\t\thost.ui.requestRender();\n\t}\n\n\t/**\n\t * Set a custom header component, or restore the built-in header.\n\t */\nexport function setExtensionHeader(host: InteractiveModeDelegateHost, factory: ((tui: TUI, thm: Theme) => Component & { dispose?(): void }) | undefined): void {\n\t\t// Header may not be initialized yet if called during early initialization\n\t\tif (!host.builtInHeader) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Dispose existing custom header\n\t\tif (host.customHeader?.dispose) {\n\t\t\thost.customHeader.dispose();\n\t\t}\n\n\t\t// Find the index of the current header in the header container\n\t\tconst currentHeader = host.customHeader || host.builtInHeader;\n\t\tconst index = host.headerContainer.children.indexOf(currentHeader);\n\n\t\tif (factory) {\n\t\t\t// Create and add custom header\n\t\t\thost.customHeader = factory(host.ui, theme);\n\t\t\tif (index !== -1) {\n\t\t\t\thost.headerContainer.children[index] = host.customHeader;\n\t\t\t} else {\n\t\t\t\t// If not found (e.g. builtInHeader was never added), add at the top\n\t\t\t\thost.headerContainer.children.unshift(host.customHeader);\n\t\t\t}\n\t\t} else {\n\t\t\t// Restore built-in header\n\t\t\thost.customHeader = undefined;\n\t\t\tif (index !== -1) {\n\t\t\t\thost.headerContainer.children[index] = host.builtInHeader;\n\t\t\t}\n\t\t}\n\n\t\thost.ui.requestRender();\n\t}\n\nexport function addExtensionTerminalInputListener(\n\thost: InteractiveModeDelegateHost,\n\thandler: (data: string) => { consume?: boolean; data?: string } | undefined,\n): () => void {\n\t\tconst unsubscribe = host.ui.addInputListener(handler);\n\t\thost.extensionTerminalInputUnsubscribers.add(unsubscribe);\n\t\treturn () => {\n\t\t\tunsubscribe();\n\t\t\thost.extensionTerminalInputUnsubscribers.delete(unsubscribe);\n\t\t};\n\t}\n\nexport function clearExtensionTerminalInputListeners(host: InteractiveModeDelegateHost): void {\n\t\tfor (const unsubscribe of host.extensionTerminalInputUnsubscribers) {\n\t\t\tunsubscribe();\n\t\t}\n\t\thost.extensionTerminalInputUnsubscribers.clear();\n\t}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactive-key-handlers.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-key-handlers.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAWvF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"interactive-key-handlers.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-key-handlers.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAWvF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CAwEvE;AAEF,wBAAsB,yBAAyB,CAAC,IAAI,EAAE,2BAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CAsB/F;AAEF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,2BAA2B,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CA4C9F;AAEF,wBAAgB,WAAW,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CAQlE;AAEF,wBAAgB,WAAW,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CAGlE;AAED;;;GAGG;AAEJ,wBAAsB,QAAQ,CAAC,IAAI,EAAE,2BAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CAkD9E;AAED;;GAEG;AACJ,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,2BAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CAG5F;AAEF,wBAAgB,WAAW,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CA6BlE;AAEF,wBAAsB,cAAc,CAAC,IAAI,EAAE,2BAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CAuCpF;AAEF,wBAAgB,aAAa,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CAOpE;AAEF,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CAQ9E;AAEF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CASzE;AAEF,wBAAsB,UAAU,CAAC,IAAI,EAAE,2BAA2B,EAAE,SAAS,EAAE,SAAS,GAAG,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBnH;AAEF,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CAEhF;AAEF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,2BAA2B,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,CAQ1F;AAEF,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CAgBpF;AAEF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CAqDzE"}
|
|
@@ -58,6 +58,7 @@ export function setupKeyHandlers(host) {
|
|
|
58
58
|
host.ui.onDebug = () => host.handleDebugCommand();
|
|
59
59
|
host.defaultEditor.onAction("selectModel", () => host.showModelSelector());
|
|
60
60
|
host.defaultEditor.onAction("expandTools", () => host.toggleToolOutputExpansion());
|
|
61
|
+
host.defaultEditor.onToggleGsdStatus = () => host.toggleGsdStatusWidget?.();
|
|
61
62
|
host.defaultEditor.onAction("toggleThinking", () => host.toggleThinkingBlockVisibility());
|
|
62
63
|
host.defaultEditor.onAction("externalEditor", () => host.openExternalEditor());
|
|
63
64
|
host.defaultEditor.onAction("followUp", () => host.handleFollowUp());
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactive-key-handlers.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-key-handlers.ts"],"names":[],"mappings":"AAAA,sBAAsB;AACtB,gFAAgF;AAEhF,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,+CAA+C,CAAC;AACnF,OAAO,EAAE,KAAK,EAAE,MAAM,qCAAqC,CAAC;AAE5D,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAM3F,SAAS,YAAY,CAAC,GAAY;IACjC,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,aAAa,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,WAAW,KAAK,UAAU,CAAC;AACjH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAiC;IAChE,0EAA0E;IAC1E,8DAA8D;IAC9D,IAAI,CAAC,aAAa,CAAC,QAAQ,GAAG,GAAG,EAAE;QAClC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3B,IAAI,CAAC,6BAA6B,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,CAAC;aAAM,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;YACvC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QAC1B,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAC5B,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACxB,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;YAC9B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;YACxB,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAChC,CAAC;aAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;YAC1C,qFAAqF;YACrF,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,qBAAqB,EAAE,CAAC;YAC5D,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBACvB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACvB,IAAI,GAAG,GAAG,IAAI,CAAC,cAAc,GAAG,GAAG,EAAE,CAAC;oBACrC,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;wBACvB,IAAI,CAAC,gBAAgB,EAAE,CAAC;oBACzB,CAAC;yBAAM,CAAC;wBACP,IAAI,CAAC,uBAAuB,EAAE,CAAC;oBAChC,CAAC;oBACD,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;gBACzB,CAAC;qBAAM,CAAC;oBACP,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC;gBAC3B,CAAC;YACF,CAAC;QACF,CAAC;IACF,CAAC,CAAC;IAEF,+BAA+B;IAC/B,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAG,CAAC,CAAC;IAChE,IAAI,CAAC,aAAa,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAG,CAAC;IACvD,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IACjE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACnF,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;IACnF,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;IAErF,0DAA0D;IAC1D,IAAI,CAAC,EAAE,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAClD,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAC3E,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,yBAAyB,EAAE,CAAC,CAAC;IACnF,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,6BAA6B,EAAE,CAAC,CAAC;IAC1F,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAC/E,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;IACrE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;IACnE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAC3E,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACnE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,uBAAuB,EAAE,CAAC,CAAC;IAC1E,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAExE,IAAI,CAAC,aAAa,CAAC,QAAQ,GAAG,CAAC,IAAY,EAAE,EAAE;QAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC;QACpC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACnD,IAAI,WAAW,KAAK,IAAI,CAAC,UAAU,EAAE,CAAC;YACrC,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAChC,CAAC;IACF,CAAC,CAAC;IAEF,qDAAqD;IACrD,IAAI,CAAC,aAAa,CAAC,YAAY,GAAG,GAAG,EAAE;QACtC,IAAI,CAAC,yBAAyB,EAAE,CAAC;IAClC,CAAC,CAAC;IAEF,sEAAsE;IACtE,+FAA+F;IAC/F,IAAI,CAAC,aAAa,CAAC,gBAAgB,GAAG,CAAC,QAAgB,EAAE,EAAE;QAC1D,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC,CAAC;AACH,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,IAAiC;IAC/E,IAAI,CAAC;QACJ,MAAM,KAAK,GAAG,MAAM,kBAAkB,EAAE,CAAC;QACzC,IAAI,CAAC,KAAK,EAAE,CAAC;YACZ,OAAO;QACR,CAAC;QAED,iEAAiE;QACjE,MAAM,YAAY,GAAiB;YAClC,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACjD,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACxB,CAAC;QACF,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAEtC,mDAAmD;QACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;QAC3C,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC,WAAW,QAAQ,GAAG,CAAC,CAAC;QACzD,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACR,mEAAmE;IACpE,CAAC;AACF,CAAC;AAEF,MAAM,UAAU,qBAAqB,CAAC,IAAiC,EAAE,QAAgB;IACvF,IAAI,CAAC;QACJ,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAC1D,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACf,oEAAoE;YACpE,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC,QAAQ,CAAC,CAAC;YAC3C,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;YACxB,OAAO;QACR,CAAC;QAED,qEAAqE;QACrE,4CAA4C;QAC5C,MAAM,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACnC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;YACnB,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC,QAAQ,CAAC,CAAC;YAC3C,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;YACxB,OAAO;QACR,CAAC;QAED,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAEvC,gEAAgE;QAChE,gDAAgD;QAChD,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;YAC5C,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC,QAAQ,CAAC,CAAC;YAC3C,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;YACxB,OAAO;QACR,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;YACvB,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC7B,QAAQ;SACR,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;QAC3C,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC,WAAW,QAAQ,GAAG,CAAC,CAAC;QACzD,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACR,4DAA4D;QAC5D,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC,QAAQ,CAAC,CAAC;QAC3C,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;IACzB,CAAC;AACF,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,IAAiC;IAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,IAAI,GAAG,GAAG,IAAI,CAAC,cAAc,GAAG,GAAG,EAAE,CAAC;QACrC,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;IACtB,CAAC;SAAM,CAAC;QACP,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC;IAC3B,CAAC;AACF,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,IAAiC;IAC3D,8DAA8D;IAC9D,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;AACtB,CAAC;AAED;;;GAGG;AAEJ,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAiC;IAC9D,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,IAAI,cAAc,CAAC;IACzE,IAAI,gBAAgB,KAAK,QAAQ,EAAE,CAAC;QACnC,IAAI,CAAC,UAAU,CAAC,sDAAsD,CAAC,CAAC;QACxE,OAAO;IACR,CAAC;IAED,IAAI,IAAI,CAAC,cAAc;QAAE,OAAO;IAChC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;IAE3B,mDAAmD;IACnD,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;IAEnC,oCAAoC;IACpC,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;IACrD,IAAI,eAAe,EAAE,WAAW,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACtD,MAAM,eAAe,CAAC,IAAI,CAAC;YAC1B,IAAI,EAAE,kBAAkB;YACxB,MAAM,EAAE,MAAM;SACd,CAAC,CAAC;IACJ,CAAC;IAED,2CAA2C;IAC3C,+DAA+D;IAC/D,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAE1D,gEAAgE;IAChE,iFAAiF;IACjF,MAAM,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAExC,IAAI,CAAC,IAAI,EAAE,CAAC;IACZ,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;QACpC,OAAO;IACR,CAAC;IAED,iFAAiF;IACjF,IAAI,CAAC;QACJ,MAAM,WAAW,GAAG,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjD,KAAK,MAAM,QAAQ,IAAI,WAAW,EAAE,CAAC;YACpC,IAAI,CAAC;gBAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACpD,CAAC;QACD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;YACvD,KAAK,MAAM,QAAQ,IAAI,WAAW,EAAE,CAAC;gBACpC,IAAI,CAAC;oBAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAA,CAAC;YACpD,CAAC;QACF,CAAC;IACF,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAEV,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC;AAED;;GAEG;AACJ,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,IAAiC;IAC5E,IAAI,CAAC,IAAI,CAAC,iBAAiB;QAAE,OAAO;IACpC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;AACvB,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,IAAiC;IAC3D,8DAA8D;IAC9D,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QAClC,OAAO;IACR,CAAC;IAED,mEAAmE;IACnE,mEAAmE;IACnE,MAAM,YAAY,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;IAC9B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAEnC,IAAI,CAAC;QACJ,6CAA6C;QAC7C,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE;YAC5B,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YAC/C,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,iDAAiD;QACjD,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QAEf,qEAAqE;QACrE,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACR,4DAA4D;QAC5D,gCAAgC;QAChC,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAChD,CAAC;AACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAiC;IACpE,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/E,IAAI,CAAC,IAAI;QAAE,OAAO;IAElB,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,SAAS,CAAC,oBAAoB,OAAO,qDAAqD,CAAC,CAAC;QACjG,OAAO;IACR,CAAC;IAED,yBAAyB;IACzB,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACnF,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;IAE9B,yEAAyE;IACzE,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;QAC/B,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC;YACjC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACxB,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO;IACR,CAAC;IAED,oEAAoE;IACpE,iGAAiG;IACjG,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACxB,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;QAC3E,IAAI,CAAC,4BAA4B,EAAE,CAAC;QACpC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;IACzB,CAAC;IACD,yEAAyE;SACpE,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;AACF,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,IAAiC;IAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,6BAA6B,EAAE,CAAC;IACtD,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;QACpB,IAAI,CAAC,UAAU,CAAC,+BAA+B,CAAC,CAAC;IAClD,CAAC;SAAM,CAAC;QACP,IAAI,CAAC,UAAU,CAAC,YAAY,QAAQ,kBAAkB,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;IAC5F,CAAC;AACF,CAAC;AAEF,MAAM,UAAU,uBAAuB,CAAC,IAAiC;IACvE,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACrB,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC,sBAAsB,EAAE,CAAC;IAC1D,CAAC;SAAM,CAAC;QACP,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,KAAK,CAAC;QAClD,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAC/D,CAAC;IACD,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;AACzB,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,IAAiC;IAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC;IACnD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC5B,IAAI,CAAC,UAAU,CAAC,yCAAyC,CAAC,CAAC;IAC5D,CAAC;SAAM,CAAC;QACP,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QACzB,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC/B,IAAI,CAAC,UAAU,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;IAChD,CAAC;AACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAiC,EAAE,SAAiC;IACnG,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACxD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,0BAA0B,CAAC;YAC1G,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YACzB,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAC/B,MAAM,WAAW,GAChB,MAAM,CAAC,KAAK,CAAC,SAAS,IAAI,MAAM,CAAC,aAAa,KAAK,KAAK,CAAC,CAAC,CAAC,eAAe,MAAM,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACxG,IAAI,CAAC,UAAU,CAAC,eAAe,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,WAAW,EAAE,CAAC,CAAC;QACtF,CAAC;IACF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAI,CAAC,SAAS,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACxE,CAAC;AACF,CAAC;AAEF,MAAM,UAAU,yBAAyB,CAAC,IAAiC;IACzE,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;AACjD,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAAC,IAAiC,EAAE,QAAiB;IACnF,IAAI,CAAC,kBAAkB,GAAG,QAAQ,CAAC;IACnC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;QACjD,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC7B,CAAC;IACF,CAAC;IACD,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;AACzB,CAAC;AAEF,MAAM,UAAU,6BAA6B,CAAC,IAAiC;IAC7E,IAAI,CAAC,iBAAiB,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC;IACjD,IAAI,CAAC,eAAe,CAAC,oBAAoB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAElE,qCAAqC;IACrC,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;IAC3B,IAAI,CAAC,uBAAuB,EAAE,CAAC;IAE/B,qFAAqF;IACrF,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtD,IAAI,CAAC,kBAAkB,CAAC,oBAAoB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACrE,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC7D,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACtD,CAAC;IAED,IAAI,CAAC,UAAU,CAAC,oBAAoB,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;AACtF,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,IAAiC;IAClE,mDAAmD;IACnD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;IAC3D,IAAI,CAAC,SAAS,EAAE,CAAC;QAChB,IAAI,GAAG,GAAG,oEAAoE,CAAC;QAC/E,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,WAAW,EAAE,CAAC;YAC9C,GAAG;gBACF,sFAAsF;oBACtF,6EAA6E;oBAC7E,mCAAmC,CAAC;QACtC,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACtB,OAAO;IACR,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IAC7E,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,aAAa,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAExE,IAAI,CAAC;QACJ,qCAAqC;QACrC,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;QAEhD,+BAA+B;QAC/B,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QAEf,mEAAmE;QACnE,MAAM,CAAC,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAErD,0EAA0E;QAC1E,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,UAAU,EAAE,OAAO,CAAC,EAAE;YAC1D,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;SACnC,CAAC,CAAC;QAEH,wDAAwD;QACxD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACxE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACjC,CAAC;QACD,0DAA0D;IAC3D,CAAC;YAAS,CAAC;QACV,qBAAqB;QACrB,IAAI,CAAC;YACJ,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACR,wBAAwB;QACzB,CAAC;QAED,cAAc;QACd,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;QAChB,mEAAmE;QACnE,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;AACF,CAAC","sourcesContent":["// Project/App: gsd-pi\n// File Purpose: Extracted from interactive-mode.ts (Phase E2 seam remediation).\n\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { ImageContent } from \"@gsd/pi-ai\";\nimport { listDescendants } from \"@gsd/native\";\nimport { spawnSync } from \"child_process\";\nimport { readClipboardImage } from \"@gsd/pi-coding-agent/utils/clipboard-image.js\";\nimport { theme } from \"@gsd/pi-coding-agent/theme/theme.js\";\nimport type { InteractiveModeDelegateHost } from \"./interactive-mode-delegate-host.js\";\nimport { MIME_BY_EXT, matchesImageSignature } from \"./interactive-mode-class-constants.js\";\n\ninterface Expandable {\n\tsetExpanded(expanded: boolean): void;\n}\n\nfunction isExpandable(obj: unknown): obj is Expandable {\n\treturn typeof obj === \"object\" && obj !== null && \"setExpanded\" in obj && typeof obj.setExpanded === \"function\";\n}\n\nexport function setupKeyHandlers(host: InteractiveModeDelegateHost): void {\n\t\t// Set up handlers on defaultEditor - they use host.editor for text access\n\t\t// so they work correctly regardless of which editor is active\n\t\thost.defaultEditor.onEscape = () => {\n\t\t\tif (host.loadingAnimation) {\n\t\t\t\thost.restoreQueuedMessagesToEditor({ abort: true });\n\t\t\t} else if (host.session.isBashRunning) {\n\t\t\t\thost.session.abortBash();\n\t\t\t} else if (host.isBashMode) {\n\t\t\t\thost.editor.setText(\"\");\n\t\t\t\thost.pendingImages.length = 0;\n\t\t\t\thost.isBashMode = false;\n\t\t\t\thost.updateEditorBorderColor();\n\t\t\t} else if (!host.editor.getText().trim()) {\n\t\t\t\t// Double-escape with empty editor triggers /tree, /fork, or nothing based on setting\n\t\t\t\tconst action = host.settingsManager.getDoubleEscapeAction();\n\t\t\t\tif (action !== \"none\") {\n\t\t\t\t\tconst now = Date.now();\n\t\t\t\t\tif (now - host.lastEscapeTime < 500) {\n\t\t\t\t\t\tif (action === \"tree\") {\n\t\t\t\t\t\t\thost.showTreeSelector();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\thost.showUserMessageSelector();\n\t\t\t\t\t\t}\n\t\t\t\t\t\thost.lastEscapeTime = 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\thost.lastEscapeTime = now;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t// Register app action handlers\n\t\thost.defaultEditor.onAction(\"clear\", () => handleCtrlC(host, ));\n\t\thost.defaultEditor.onCtrlD = () => handleCtrlD(host, );\n\t\thost.defaultEditor.onAction(\"suspend\", () => host.handleCtrlZ());\n\t\thost.defaultEditor.onAction(\"cycleThinkingLevel\", () => host.cycleThinkingLevel());\n\t\thost.defaultEditor.onAction(\"cycleModelForward\", () => host.cycleModel(\"forward\"));\n\t\thost.defaultEditor.onAction(\"cycleModelBackward\", () => host.cycleModel(\"backward\"));\n\n\t\t// Global debug handler on TUI (works regardless of focus)\n\t\thost.ui.onDebug = () => host.handleDebugCommand();\n\t\thost.defaultEditor.onAction(\"selectModel\", () => host.showModelSelector());\n\t\thost.defaultEditor.onAction(\"expandTools\", () => host.toggleToolOutputExpansion());\n\t\thost.defaultEditor.onAction(\"toggleThinking\", () => host.toggleThinkingBlockVisibility());\n\t\thost.defaultEditor.onAction(\"externalEditor\", () => host.openExternalEditor());\n\t\thost.defaultEditor.onAction(\"followUp\", () => host.handleFollowUp());\n\t\thost.defaultEditor.onAction(\"dequeue\", () => host.handleDequeue());\n\t\thost.defaultEditor.onAction(\"newSession\", () => host.handleClearCommand());\n\t\thost.defaultEditor.onAction(\"tree\", () => host.showTreeSelector());\n\t\thost.defaultEditor.onAction(\"fork\", () => host.showUserMessageSelector());\n\t\thost.defaultEditor.onAction(\"resume\", () => host.showSessionSelector());\n\n\t\thost.defaultEditor.onChange = (text: string) => {\n\t\t\tconst wasBashMode = host.isBashMode;\n\t\t\thost.isBashMode = text.trimStart().startsWith(\"!\");\n\t\t\tif (wasBashMode !== host.isBashMode) {\n\t\t\t\thost.updateEditorBorderColor();\n\t\t\t}\n\t\t};\n\n\t\t// Handle clipboard image paste (triggered on Ctrl+V)\n\t\thost.defaultEditor.onPasteImage = () => {\n\t\t\thost.handleClipboardImagePaste();\n\t\t};\n\n\t\t// Handle image file paths pasted via terminal emulator (e.g. iTerm2).\n\t\t// Set on defaultEditor here; setCustomEditorComponent guards re-assignment for custom editors.\n\t\thost.defaultEditor.onPasteImagePath = (filePath: string) => {\n\t\t\thost.handlePastedImagePath(filePath);\n\t\t};\n\t}\n\nexport async function handleClipboardImagePaste(host: InteractiveModeDelegateHost): Promise<void> {\n\t\ttry {\n\t\t\tconst image = await readClipboardImage();\n\t\t\tif (!image) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Store image as base64 ImageContent for sending with the prompt\n\t\t\tconst imageContent: ImageContent = {\n\t\t\t\ttype: \"image\",\n\t\t\t\tdata: Buffer.from(image.bytes).toString(\"base64\"),\n\t\t\t\tmimeType: image.mimeType,\n\t\t\t};\n\t\t\thost.pendingImages.push(imageContent);\n\n\t\t\t// Insert friendly placeholder instead of file path\n\t\t\tconst imageNum = host.pendingImages.length;\n\t\t\thost.editor.insertTextAtCursor?.(`[Image #${imageNum}]`);\n\t\t\thost.ui.requestRender();\n\t\t} catch {\n\t\t\t// Silently ignore clipboard errors (may not have permission, etc.)\n\t\t}\n\t}\n\nexport function handlePastedImagePath(host: InteractiveModeDelegateHost, filePath: string): void {\n\t\ttry {\n\t\t\tconst ext = path.extname(filePath).slice(1).toLowerCase();\n\t\t\tconst mimeType = MIME_BY_EXT[ext];\n\t\t\tif (!mimeType) {\n\t\t\t\t// Unsupported / unsafe extension — fall back to inserting raw path.\n\t\t\t\thost.editor.insertTextAtCursor?.(filePath);\n\t\t\t\thost.ui.requestRender();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Reject symlinks to prevent reading sensitive files via a symlinked\n\t\t\t// `.png` that points at e.g. ~/.ssh/id_rsa.\n\t\t\tconst lst = fs.lstatSync(filePath);\n\t\t\tif (!lst.isFile()) {\n\t\t\t\thost.editor.insertTextAtCursor?.(filePath);\n\t\t\t\thost.ui.requestRender();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst data = fs.readFileSync(filePath);\n\n\t\t\t// Magic-byte check — confirms file content actually matches the\n\t\t\t// extension before we forward bytes to a model.\n\t\t\tif (!matchesImageSignature(data, mimeType)) {\n\t\t\t\thost.editor.insertTextAtCursor?.(filePath);\n\t\t\t\thost.ui.requestRender();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\thost.pendingImages.push({\n\t\t\t\ttype: \"image\",\n\t\t\t\tdata: data.toString(\"base64\"),\n\t\t\t\tmimeType,\n\t\t\t});\n\n\t\t\tconst imageNum = host.pendingImages.length;\n\t\t\thost.editor.insertTextAtCursor?.(`[Image #${imageNum}]`);\n\t\t\thost.ui.requestRender();\n\t\t} catch {\n\t\t\t// Fall back to inserting the raw path if file can't be read\n\t\t\thost.editor.insertTextAtCursor?.(filePath);\n\t\t\thost.ui.requestRender();\n\t\t}\n\t}\n\nexport function handleCtrlC(host: InteractiveModeDelegateHost): void {\n\t\tconst now = Date.now();\n\t\tif (now - host.lastSigintTime < 500) {\n\t\t\tvoid host.shutdown();\n\t\t} else {\n\t\t\thost.clearEditor();\n\t\t\thost.lastSigintTime = now;\n\t\t}\n\t}\n\nexport function handleCtrlD(host: InteractiveModeDelegateHost): void {\n\t\t// Only called when editor is empty (enforced by CustomEditor)\n\t\tvoid host.shutdown();\n\t}\n\n\t/**\n\t * Gracefully shutdown the agent.\n\t * Emits shutdown event to extensions, then exits.\n\t */\n\nexport async function shutdown(host: InteractiveModeDelegateHost): Promise<void> {\n\t\tconst shutdownBehavior = host.options.shutdownBehavior ?? \"exit_process\";\n\t\tif (shutdownBehavior === \"ignore\") {\n\t\t\thost.showStatus(\"Quit is unavailable in the browser-attached terminal\");\n\t\t\treturn;\n\t\t}\n\n\t\tif (host.isShuttingDown) return;\n\t\thost.isShuttingDown = true;\n\n\t\t// Flush any queued settings writes before shutdown\n\t\tawait host.settingsManager.flush();\n\n\t\t// Emit shutdown event to extensions\n\t\tconst extensionRunner = host.session.extensionRunner;\n\t\tif (extensionRunner?.hasHandlers(\"session_shutdown\")) {\n\t\t\tawait extensionRunner.emit({\n\t\t\t\ttype: \"session_shutdown\",\n\t\t\t\treason: \"quit\",\n\t\t\t});\n\t\t}\n\n\t\t// Wait for any pending renders to complete\n\t\t// requestRender() uses process.nextTick(), so we wait one tick\n\t\tawait new Promise((resolve) => process.nextTick(resolve));\n\n\t\t// Drain any in-flight Kitty key release events before stopping.\n\t\t// This prevents escape sequences from leaking to the parent shell over slow SSH.\n\t\tawait host.ui.terminal.drainInput(1000);\n\n\t\thost.stop();\n\t\tif (shutdownBehavior === \"stop_ui\") {\n\t\t\treturn;\n\t\t}\n\n\t\t// Kill ALL descendant processes to prevent orphans (next-server, pnpm dev, etc.)\n\t\ttry {\n\t\t\tconst descendants = listDescendants(process.pid);\n\t\t\tfor (const childPid of descendants) {\n\t\t\t\ttry { process.kill(childPid, \"SIGTERM\"); } catch {}\n\t\t\t}\n\t\t\tif (descendants.length > 0) {\n\t\t\t\tawait new Promise(resolve => setTimeout(resolve, 500));\n\t\t\t\tfor (const childPid of descendants) {\n\t\t\t\t\ttry { process.kill(childPid, \"SIGKILL\"); } catch {}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {}\n\n\t\tprocess.exit(0);\n\t}\n\n\t/**\n\t * Check if shutdown was requested and perform shutdown if so.\n\t */\nexport async function checkShutdownRequested(host: InteractiveModeDelegateHost): Promise<void> {\n\t\tif (!host.shutdownRequested) return;\n\t\tawait host.shutdown();\n\t}\n\nexport function handleCtrlZ(host: InteractiveModeDelegateHost): void {\n\t\t// On Windows, SIGTSTP doesn't exist - Ctrl+Z is not supported\n\t\tif (process.platform === \"win32\") {\n\t\t\treturn;\n\t\t}\n\n\t\t// Ignore SIGINT while suspended so Ctrl+C in the terminal does not\n\t\t// kill the backgrounded process. The handler is removed on resume.\n\t\tconst ignoreSigint = () => {};\n\t\tprocess.on(\"SIGINT\", ignoreSigint);\n\n\t\ttry {\n\t\t\t// Set up handler to restore TUI when resumed\n\t\t\tprocess.once(\"SIGCONT\", () => {\n\t\t\t\tprocess.removeListener(\"SIGINT\", ignoreSigint);\n\t\t\t\thost.ui.start();\n\t\t\t\thost.ui.requestRender(true);\n\t\t\t});\n\n\t\t\t// Stop the TUI (restore terminal to normal mode)\n\t\t\thost.ui.stop();\n\n\t\t\t// Send SIGTSTP to process group (pid=0 means all processes in group)\n\t\t\tprocess.kill(0, \"SIGTSTP\");\n\t\t} catch {\n\t\t\t// If suspend fails (e.g. SIGTSTP not supported), ensure the\n\t\t\t// SIGINT listener doesn't leak.\n\t\t\tprocess.removeListener(\"SIGINT\", ignoreSigint);\n\t\t}\n\t}\n\nexport async function handleFollowUp(host: InteractiveModeDelegateHost): Promise<void> {\n\t\tconst text = (host.editor.getExpandedText?.() ?? host.editor.getText()).trim();\n\t\tif (!text) return;\n\n\t\tif (text.startsWith(\"/\") && !host.isKnownSlashCommand(text)) {\n\t\t\tconst command = text.split(/\\s/)[0];\n\t\t\thost.showError(`Unknown command: ${command}. Use slash autocomplete to see available commands.`);\n\t\t\treturn;\n\t\t}\n\n\t\t// Consume pending images\n\t\tconst images = host.pendingImages.length > 0 ? [...host.pendingImages] : undefined;\n\t\thost.pendingImages.length = 0;\n\n\t\t// Queue input during compaction (extension commands execute immediately)\n\t\tif (host.session.isCompacting) {\n\t\t\tif (host.isExtensionCommand(text)) {\n\t\t\t\thost.editor.addToHistory?.(text);\n\t\t\t\thost.editor.setText(\"\");\n\t\t\t\tawait host.session.prompt(text, { images });\n\t\t\t} else {\n\t\t\t\thost.queueCompactionMessage(text, \"followUp\");\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Alt+Enter queues a follow-up message (waits until agent finishes)\n\t\t// This handles extension commands (execute immediately), prompt template expansion, and queueing\n\t\tif (host.session.isStreaming) {\n\t\t\thost.editor.addToHistory?.(text);\n\t\t\thost.editor.setText(\"\");\n\t\t\tawait host.session.prompt(text, { streamingBehavior: \"followUp\", images });\n\t\t\thost.updatePendingMessagesDisplay();\n\t\t\thost.ui.requestRender();\n\t\t}\n\t\t// If not streaming, Alt+Enter acts like regular Enter (trigger onSubmit)\n\t\telse if (host.editor.onSubmit) {\n\t\t\thost.editor.onSubmit(text);\n\t\t}\n\t}\n\nexport function handleDequeue(host: InteractiveModeDelegateHost): void {\n\t\tconst restored = host.restoreQueuedMessagesToEditor();\n\t\tif (restored === 0) {\n\t\t\thost.showStatus(\"No queued messages to restore\");\n\t\t} else {\n\t\t\thost.showStatus(`Restored ${restored} queued message${restored > 1 ? \"s\" : \"\"} to editor`);\n\t\t}\n\t}\n\nexport function updateEditorBorderColor(host: InteractiveModeDelegateHost): void {\n\t\tif (host.isBashMode) {\n\t\t\thost.editor.borderColor = theme.getBashModeBorderColor();\n\t\t} else {\n\t\t\tconst level = host.session.thinkingLevel || \"off\";\n\t\t\thost.editor.borderColor = theme.getThinkingBorderColor(level);\n\t\t}\n\t\thost.ui.requestRender();\n\t}\n\nexport function cycleThinkingLevel(host: InteractiveModeDelegateHost): void {\n\t\tconst newLevel = host.session.cycleThinkingLevel();\n\t\tif (newLevel === undefined) {\n\t\t\thost.showStatus(\"Current model does not support thinking\");\n\t\t} else {\n\t\t\thost.footer.invalidate();\n\t\t\thost.updateEditorBorderColor();\n\t\t\thost.showStatus(`Thinking level: ${newLevel}`);\n\t\t}\n\t}\n\nexport async function cycleModel(host: InteractiveModeDelegateHost, direction: \"forward\" | \"backward\"): Promise<void> {\n\t\ttry {\n\t\t\tconst result = await host.session.cycleModel(direction);\n\t\t\tif (result === undefined) {\n\t\t\t\tconst msg = host.session.scopedModels.length > 0 ? \"Only one model in scope\" : \"Only one model available\";\n\t\t\t\thost.showStatus(msg);\n\t\t\t} else {\n\t\t\t\thost.footer.invalidate();\n\t\t\t\thost.updateEditorBorderColor();\n\t\t\t\tconst thinkingStr =\n\t\t\t\t\tresult.model.reasoning && result.thinkingLevel !== \"off\" ? ` (thinking: ${result.thinkingLevel})` : \"\";\n\t\t\t\thost.showStatus(`Switched to ${result.model.name || result.model.id}${thinkingStr}`);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\thost.showError(error instanceof Error ? error.message : String(error));\n\t\t}\n\t}\n\nexport function toggleToolOutputExpansion(host: InteractiveModeDelegateHost): void {\n\t\thost.setToolsExpanded(!host.toolOutputExpanded);\n\t}\n\nexport function setToolsExpanded(host: InteractiveModeDelegateHost, expanded: boolean): void {\n\t\thost.toolOutputExpanded = expanded;\n\t\tfor (const child of host.chatContainer.children) {\n\t\t\tif (isExpandable(child)) {\n\t\t\t\tchild.setExpanded(expanded);\n\t\t\t}\n\t\t}\n\t\thost.ui.requestRender();\n\t}\n\nexport function toggleThinkingBlockVisibility(host: InteractiveModeDelegateHost): void {\n\t\thost.hideThinkingBlock = !host.hideThinkingBlock;\n\t\thost.settingsManager.setHideThinkingBlock(host.hideThinkingBlock);\n\n\t\t// Rebuild chat from session messages\n\t\thost.chatContainer.clear();\n\t\thost.rebuildChatFromMessages();\n\n\t\t// If streaming, re-add the streaming component with updated visibility and re-render\n\t\tif (host.streamingComponent && host.streamingMessage) {\n\t\t\thost.streamingComponent.setHideThinkingBlock(host.hideThinkingBlock);\n\t\t\thost.streamingComponent.updateContent(host.streamingMessage);\n\t\t\thost.chatContainer.addChild(host.streamingComponent);\n\t\t}\n\n\t\thost.showStatus(`Thinking blocks: ${host.hideThinkingBlock ? \"hidden\" : \"visible\"}`);\n\t}\n\nexport function openExternalEditor(host: InteractiveModeDelegateHost): void {\n\t\t// Determine editor (respect $VISUAL, then $EDITOR)\n\t\tconst editorCmd = process.env.VISUAL || process.env.EDITOR;\n\t\tif (!editorCmd) {\n\t\t\tlet msg = \"No editor configured. Set $VISUAL or $EDITOR environment variable.\";\n\t\t\tif (process.env.TERM_PROGRAM === \"iTerm.app\") {\n\t\t\t\tmsg +=\n\t\t\t\t\t\"\\n\\nTip: If you meant to open the GSD dashboard (Ctrl+Alt+G), set Left Option Key to\" +\n\t\t\t\t\t\" \\\"Esc+\\\" in iTerm2 → Profiles → Keys. With the default \\\"Normal\\\" setting,\" +\n\t\t\t\t\t\" Ctrl+Alt+G sends Ctrl+G instead.\";\n\t\t\t}\n\t\t\thost.showWarning(msg);\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentText = host.editor.getExpandedText?.() ?? host.editor.getText();\n\t\tconst tmpFile = path.join(os.tmpdir(), `pi-editor-${Date.now()}.pi.md`);\n\n\t\ttry {\n\t\t\t// Write current content to temp file\n\t\t\tfs.writeFileSync(tmpFile, currentText, \"utf-8\");\n\n\t\t\t// Stop TUI to release terminal\n\t\t\thost.ui.stop();\n\n\t\t\t// Split by space to support editor arguments (e.g., \"code --wait\")\n\t\t\tconst [editor, ...editorArgs] = editorCmd.split(\" \");\n\n\t\t\t// Spawn editor synchronously with inherited stdio for interactive editing\n\t\t\tconst result = spawnSync(editor, [...editorArgs, tmpFile], {\n\t\t\t\tstdio: \"inherit\",\n\t\t\t\tshell: process.platform === \"win32\",\n\t\t\t});\n\n\t\t\t// On successful exit (status 0), replace editor content\n\t\t\tif (result.status === 0) {\n\t\t\t\tconst newContent = fs.readFileSync(tmpFile, \"utf-8\").replace(/\\n$/, \"\");\n\t\t\t\thost.editor.setText(newContent);\n\t\t\t}\n\t\t\t// On non-zero exit, keep original text (no action needed)\n\t\t} finally {\n\t\t\t// Clean up temp file\n\t\t\ttry {\n\t\t\t\tfs.unlinkSync(tmpFile);\n\t\t\t} catch {\n\t\t\t\t// Ignore cleanup errors\n\t\t\t}\n\n\t\t\t// Restart TUI\n\t\t\thost.ui.start();\n\t\t\t// Force full re-render since external editor uses alternate screen\n\t\t\thost.ui.requestRender(true);\n\t\t}\n\t}\n"]}
|
|
1
|
+
{"version":3,"file":"interactive-key-handlers.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-key-handlers.ts"],"names":[],"mappings":"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","sourcesContent":["// Project/App: gsd-pi\n// File Purpose: Extracted from interactive-mode.ts (Phase E2 seam remediation).\n\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { ImageContent } from \"@gsd/pi-ai\";\nimport { listDescendants } from \"@gsd/native\";\nimport { spawnSync } from \"child_process\";\nimport { readClipboardImage } from \"@gsd/pi-coding-agent/utils/clipboard-image.js\";\nimport { theme } from \"@gsd/pi-coding-agent/theme/theme.js\";\nimport type { InteractiveModeDelegateHost } from \"./interactive-mode-delegate-host.js\";\nimport { MIME_BY_EXT, matchesImageSignature } from \"./interactive-mode-class-constants.js\";\n\ninterface Expandable {\n\tsetExpanded(expanded: boolean): void;\n}\n\nfunction isExpandable(obj: unknown): obj is Expandable {\n\treturn typeof obj === \"object\" && obj !== null && \"setExpanded\" in obj && typeof obj.setExpanded === \"function\";\n}\n\nexport function setupKeyHandlers(host: InteractiveModeDelegateHost): void {\n\t\t// Set up handlers on defaultEditor - they use host.editor for text access\n\t\t// so they work correctly regardless of which editor is active\n\t\thost.defaultEditor.onEscape = () => {\n\t\t\tif (host.loadingAnimation) {\n\t\t\t\thost.restoreQueuedMessagesToEditor({ abort: true });\n\t\t\t} else if (host.session.isBashRunning) {\n\t\t\t\thost.session.abortBash();\n\t\t\t} else if (host.isBashMode) {\n\t\t\t\thost.editor.setText(\"\");\n\t\t\t\thost.pendingImages.length = 0;\n\t\t\t\thost.isBashMode = false;\n\t\t\t\thost.updateEditorBorderColor();\n\t\t\t} else if (!host.editor.getText().trim()) {\n\t\t\t\t// Double-escape with empty editor triggers /tree, /fork, or nothing based on setting\n\t\t\t\tconst action = host.settingsManager.getDoubleEscapeAction();\n\t\t\t\tif (action !== \"none\") {\n\t\t\t\t\tconst now = Date.now();\n\t\t\t\t\tif (now - host.lastEscapeTime < 500) {\n\t\t\t\t\t\tif (action === \"tree\") {\n\t\t\t\t\t\t\thost.showTreeSelector();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\thost.showUserMessageSelector();\n\t\t\t\t\t\t}\n\t\t\t\t\t\thost.lastEscapeTime = 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\thost.lastEscapeTime = now;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t// Register app action handlers\n\t\thost.defaultEditor.onAction(\"clear\", () => handleCtrlC(host, ));\n\t\thost.defaultEditor.onCtrlD = () => handleCtrlD(host, );\n\t\thost.defaultEditor.onAction(\"suspend\", () => host.handleCtrlZ());\n\t\thost.defaultEditor.onAction(\"cycleThinkingLevel\", () => host.cycleThinkingLevel());\n\t\thost.defaultEditor.onAction(\"cycleModelForward\", () => host.cycleModel(\"forward\"));\n\t\thost.defaultEditor.onAction(\"cycleModelBackward\", () => host.cycleModel(\"backward\"));\n\n\t\t// Global debug handler on TUI (works regardless of focus)\n\t\thost.ui.onDebug = () => host.handleDebugCommand();\n\t\thost.defaultEditor.onAction(\"selectModel\", () => host.showModelSelector());\n\t\thost.defaultEditor.onAction(\"expandTools\", () => host.toggleToolOutputExpansion());\n\t\thost.defaultEditor.onToggleGsdStatus = () => host.toggleGsdStatusWidget?.();\n\t\thost.defaultEditor.onAction(\"toggleThinking\", () => host.toggleThinkingBlockVisibility());\n\t\thost.defaultEditor.onAction(\"externalEditor\", () => host.openExternalEditor());\n\t\thost.defaultEditor.onAction(\"followUp\", () => host.handleFollowUp());\n\t\thost.defaultEditor.onAction(\"dequeue\", () => host.handleDequeue());\n\t\thost.defaultEditor.onAction(\"newSession\", () => host.handleClearCommand());\n\t\thost.defaultEditor.onAction(\"tree\", () => host.showTreeSelector());\n\t\thost.defaultEditor.onAction(\"fork\", () => host.showUserMessageSelector());\n\t\thost.defaultEditor.onAction(\"resume\", () => host.showSessionSelector());\n\n\t\thost.defaultEditor.onChange = (text: string) => {\n\t\t\tconst wasBashMode = host.isBashMode;\n\t\t\thost.isBashMode = text.trimStart().startsWith(\"!\");\n\t\t\tif (wasBashMode !== host.isBashMode) {\n\t\t\t\thost.updateEditorBorderColor();\n\t\t\t}\n\t\t};\n\n\t\t// Handle clipboard image paste (triggered on Ctrl+V)\n\t\thost.defaultEditor.onPasteImage = () => {\n\t\t\thost.handleClipboardImagePaste();\n\t\t};\n\n\t\t// Handle image file paths pasted via terminal emulator (e.g. iTerm2).\n\t\t// Set on defaultEditor here; setCustomEditorComponent guards re-assignment for custom editors.\n\t\thost.defaultEditor.onPasteImagePath = (filePath: string) => {\n\t\t\thost.handlePastedImagePath(filePath);\n\t\t};\n\t}\n\nexport async function handleClipboardImagePaste(host: InteractiveModeDelegateHost): Promise<void> {\n\t\ttry {\n\t\t\tconst image = await readClipboardImage();\n\t\t\tif (!image) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Store image as base64 ImageContent for sending with the prompt\n\t\t\tconst imageContent: ImageContent = {\n\t\t\t\ttype: \"image\",\n\t\t\t\tdata: Buffer.from(image.bytes).toString(\"base64\"),\n\t\t\t\tmimeType: image.mimeType,\n\t\t\t};\n\t\t\thost.pendingImages.push(imageContent);\n\n\t\t\t// Insert friendly placeholder instead of file path\n\t\t\tconst imageNum = host.pendingImages.length;\n\t\t\thost.editor.insertTextAtCursor?.(`[Image #${imageNum}]`);\n\t\t\thost.ui.requestRender();\n\t\t} catch {\n\t\t\t// Silently ignore clipboard errors (may not have permission, etc.)\n\t\t}\n\t}\n\nexport function handlePastedImagePath(host: InteractiveModeDelegateHost, filePath: string): void {\n\t\ttry {\n\t\t\tconst ext = path.extname(filePath).slice(1).toLowerCase();\n\t\t\tconst mimeType = MIME_BY_EXT[ext];\n\t\t\tif (!mimeType) {\n\t\t\t\t// Unsupported / unsafe extension — fall back to inserting raw path.\n\t\t\t\thost.editor.insertTextAtCursor?.(filePath);\n\t\t\t\thost.ui.requestRender();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Reject symlinks to prevent reading sensitive files via a symlinked\n\t\t\t// `.png` that points at e.g. ~/.ssh/id_rsa.\n\t\t\tconst lst = fs.lstatSync(filePath);\n\t\t\tif (!lst.isFile()) {\n\t\t\t\thost.editor.insertTextAtCursor?.(filePath);\n\t\t\t\thost.ui.requestRender();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst data = fs.readFileSync(filePath);\n\n\t\t\t// Magic-byte check — confirms file content actually matches the\n\t\t\t// extension before we forward bytes to a model.\n\t\t\tif (!matchesImageSignature(data, mimeType)) {\n\t\t\t\thost.editor.insertTextAtCursor?.(filePath);\n\t\t\t\thost.ui.requestRender();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\thost.pendingImages.push({\n\t\t\t\ttype: \"image\",\n\t\t\t\tdata: data.toString(\"base64\"),\n\t\t\t\tmimeType,\n\t\t\t});\n\n\t\t\tconst imageNum = host.pendingImages.length;\n\t\t\thost.editor.insertTextAtCursor?.(`[Image #${imageNum}]`);\n\t\t\thost.ui.requestRender();\n\t\t} catch {\n\t\t\t// Fall back to inserting the raw path if file can't be read\n\t\t\thost.editor.insertTextAtCursor?.(filePath);\n\t\t\thost.ui.requestRender();\n\t\t}\n\t}\n\nexport function handleCtrlC(host: InteractiveModeDelegateHost): void {\n\t\tconst now = Date.now();\n\t\tif (now - host.lastSigintTime < 500) {\n\t\t\tvoid host.shutdown();\n\t\t} else {\n\t\t\thost.clearEditor();\n\t\t\thost.lastSigintTime = now;\n\t\t}\n\t}\n\nexport function handleCtrlD(host: InteractiveModeDelegateHost): void {\n\t\t// Only called when editor is empty (enforced by CustomEditor)\n\t\tvoid host.shutdown();\n\t}\n\n\t/**\n\t * Gracefully shutdown the agent.\n\t * Emits shutdown event to extensions, then exits.\n\t */\n\nexport async function shutdown(host: InteractiveModeDelegateHost): Promise<void> {\n\t\tconst shutdownBehavior = host.options.shutdownBehavior ?? \"exit_process\";\n\t\tif (shutdownBehavior === \"ignore\") {\n\t\t\thost.showStatus(\"Quit is unavailable in the browser-attached terminal\");\n\t\t\treturn;\n\t\t}\n\n\t\tif (host.isShuttingDown) return;\n\t\thost.isShuttingDown = true;\n\n\t\t// Flush any queued settings writes before shutdown\n\t\tawait host.settingsManager.flush();\n\n\t\t// Emit shutdown event to extensions\n\t\tconst extensionRunner = host.session.extensionRunner;\n\t\tif (extensionRunner?.hasHandlers(\"session_shutdown\")) {\n\t\t\tawait extensionRunner.emit({\n\t\t\t\ttype: \"session_shutdown\",\n\t\t\t\treason: \"quit\",\n\t\t\t});\n\t\t}\n\n\t\t// Wait for any pending renders to complete\n\t\t// requestRender() uses process.nextTick(), so we wait one tick\n\t\tawait new Promise((resolve) => process.nextTick(resolve));\n\n\t\t// Drain any in-flight Kitty key release events before stopping.\n\t\t// This prevents escape sequences from leaking to the parent shell over slow SSH.\n\t\tawait host.ui.terminal.drainInput(1000);\n\n\t\thost.stop();\n\t\tif (shutdownBehavior === \"stop_ui\") {\n\t\t\treturn;\n\t\t}\n\n\t\t// Kill ALL descendant processes to prevent orphans (next-server, pnpm dev, etc.)\n\t\ttry {\n\t\t\tconst descendants = listDescendants(process.pid);\n\t\t\tfor (const childPid of descendants) {\n\t\t\t\ttry { process.kill(childPid, \"SIGTERM\"); } catch {}\n\t\t\t}\n\t\t\tif (descendants.length > 0) {\n\t\t\t\tawait new Promise(resolve => setTimeout(resolve, 500));\n\t\t\t\tfor (const childPid of descendants) {\n\t\t\t\t\ttry { process.kill(childPid, \"SIGKILL\"); } catch {}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {}\n\n\t\tprocess.exit(0);\n\t}\n\n\t/**\n\t * Check if shutdown was requested and perform shutdown if so.\n\t */\nexport async function checkShutdownRequested(host: InteractiveModeDelegateHost): Promise<void> {\n\t\tif (!host.shutdownRequested) return;\n\t\tawait host.shutdown();\n\t}\n\nexport function handleCtrlZ(host: InteractiveModeDelegateHost): void {\n\t\t// On Windows, SIGTSTP doesn't exist - Ctrl+Z is not supported\n\t\tif (process.platform === \"win32\") {\n\t\t\treturn;\n\t\t}\n\n\t\t// Ignore SIGINT while suspended so Ctrl+C in the terminal does not\n\t\t// kill the backgrounded process. The handler is removed on resume.\n\t\tconst ignoreSigint = () => {};\n\t\tprocess.on(\"SIGINT\", ignoreSigint);\n\n\t\ttry {\n\t\t\t// Set up handler to restore TUI when resumed\n\t\t\tprocess.once(\"SIGCONT\", () => {\n\t\t\t\tprocess.removeListener(\"SIGINT\", ignoreSigint);\n\t\t\t\thost.ui.start();\n\t\t\t\thost.ui.requestRender(true);\n\t\t\t});\n\n\t\t\t// Stop the TUI (restore terminal to normal mode)\n\t\t\thost.ui.stop();\n\n\t\t\t// Send SIGTSTP to process group (pid=0 means all processes in group)\n\t\t\tprocess.kill(0, \"SIGTSTP\");\n\t\t} catch {\n\t\t\t// If suspend fails (e.g. SIGTSTP not supported), ensure the\n\t\t\t// SIGINT listener doesn't leak.\n\t\t\tprocess.removeListener(\"SIGINT\", ignoreSigint);\n\t\t}\n\t}\n\nexport async function handleFollowUp(host: InteractiveModeDelegateHost): Promise<void> {\n\t\tconst text = (host.editor.getExpandedText?.() ?? host.editor.getText()).trim();\n\t\tif (!text) return;\n\n\t\tif (text.startsWith(\"/\") && !host.isKnownSlashCommand(text)) {\n\t\t\tconst command = text.split(/\\s/)[0];\n\t\t\thost.showError(`Unknown command: ${command}. Use slash autocomplete to see available commands.`);\n\t\t\treturn;\n\t\t}\n\n\t\t// Consume pending images\n\t\tconst images = host.pendingImages.length > 0 ? [...host.pendingImages] : undefined;\n\t\thost.pendingImages.length = 0;\n\n\t\t// Queue input during compaction (extension commands execute immediately)\n\t\tif (host.session.isCompacting) {\n\t\t\tif (host.isExtensionCommand(text)) {\n\t\t\t\thost.editor.addToHistory?.(text);\n\t\t\t\thost.editor.setText(\"\");\n\t\t\t\tawait host.session.prompt(text, { images });\n\t\t\t} else {\n\t\t\t\thost.queueCompactionMessage(text, \"followUp\");\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Alt+Enter queues a follow-up message (waits until agent finishes)\n\t\t// This handles extension commands (execute immediately), prompt template expansion, and queueing\n\t\tif (host.session.isStreaming) {\n\t\t\thost.editor.addToHistory?.(text);\n\t\t\thost.editor.setText(\"\");\n\t\t\tawait host.session.prompt(text, { streamingBehavior: \"followUp\", images });\n\t\t\thost.updatePendingMessagesDisplay();\n\t\t\thost.ui.requestRender();\n\t\t}\n\t\t// If not streaming, Alt+Enter acts like regular Enter (trigger onSubmit)\n\t\telse if (host.editor.onSubmit) {\n\t\t\thost.editor.onSubmit(text);\n\t\t}\n\t}\n\nexport function handleDequeue(host: InteractiveModeDelegateHost): void {\n\t\tconst restored = host.restoreQueuedMessagesToEditor();\n\t\tif (restored === 0) {\n\t\t\thost.showStatus(\"No queued messages to restore\");\n\t\t} else {\n\t\t\thost.showStatus(`Restored ${restored} queued message${restored > 1 ? \"s\" : \"\"} to editor`);\n\t\t}\n\t}\n\nexport function updateEditorBorderColor(host: InteractiveModeDelegateHost): void {\n\t\tif (host.isBashMode) {\n\t\t\thost.editor.borderColor = theme.getBashModeBorderColor();\n\t\t} else {\n\t\t\tconst level = host.session.thinkingLevel || \"off\";\n\t\t\thost.editor.borderColor = theme.getThinkingBorderColor(level);\n\t\t}\n\t\thost.ui.requestRender();\n\t}\n\nexport function cycleThinkingLevel(host: InteractiveModeDelegateHost): void {\n\t\tconst newLevel = host.session.cycleThinkingLevel();\n\t\tif (newLevel === undefined) {\n\t\t\thost.showStatus(\"Current model does not support thinking\");\n\t\t} else {\n\t\t\thost.footer.invalidate();\n\t\t\thost.updateEditorBorderColor();\n\t\t\thost.showStatus(`Thinking level: ${newLevel}`);\n\t\t}\n\t}\n\nexport async function cycleModel(host: InteractiveModeDelegateHost, direction: \"forward\" | \"backward\"): Promise<void> {\n\t\ttry {\n\t\t\tconst result = await host.session.cycleModel(direction);\n\t\t\tif (result === undefined) {\n\t\t\t\tconst msg = host.session.scopedModels.length > 0 ? \"Only one model in scope\" : \"Only one model available\";\n\t\t\t\thost.showStatus(msg);\n\t\t\t} else {\n\t\t\t\thost.footer.invalidate();\n\t\t\t\thost.updateEditorBorderColor();\n\t\t\t\tconst thinkingStr =\n\t\t\t\t\tresult.model.reasoning && result.thinkingLevel !== \"off\" ? ` (thinking: ${result.thinkingLevel})` : \"\";\n\t\t\t\thost.showStatus(`Switched to ${result.model.name || result.model.id}${thinkingStr}`);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\thost.showError(error instanceof Error ? error.message : String(error));\n\t\t}\n\t}\n\nexport function toggleToolOutputExpansion(host: InteractiveModeDelegateHost): void {\n\t\thost.setToolsExpanded(!host.toolOutputExpanded);\n\t}\n\nexport function setToolsExpanded(host: InteractiveModeDelegateHost, expanded: boolean): void {\n\t\thost.toolOutputExpanded = expanded;\n\t\tfor (const child of host.chatContainer.children) {\n\t\t\tif (isExpandable(child)) {\n\t\t\t\tchild.setExpanded(expanded);\n\t\t\t}\n\t\t}\n\t\thost.ui.requestRender();\n\t}\n\nexport function toggleThinkingBlockVisibility(host: InteractiveModeDelegateHost): void {\n\t\thost.hideThinkingBlock = !host.hideThinkingBlock;\n\t\thost.settingsManager.setHideThinkingBlock(host.hideThinkingBlock);\n\n\t\t// Rebuild chat from session messages\n\t\thost.chatContainer.clear();\n\t\thost.rebuildChatFromMessages();\n\n\t\t// If streaming, re-add the streaming component with updated visibility and re-render\n\t\tif (host.streamingComponent && host.streamingMessage) {\n\t\t\thost.streamingComponent.setHideThinkingBlock(host.hideThinkingBlock);\n\t\t\thost.streamingComponent.updateContent(host.streamingMessage);\n\t\t\thost.chatContainer.addChild(host.streamingComponent);\n\t\t}\n\n\t\thost.showStatus(`Thinking blocks: ${host.hideThinkingBlock ? \"hidden\" : \"visible\"}`);\n\t}\n\nexport function openExternalEditor(host: InteractiveModeDelegateHost): void {\n\t\t// Determine editor (respect $VISUAL, then $EDITOR)\n\t\tconst editorCmd = process.env.VISUAL || process.env.EDITOR;\n\t\tif (!editorCmd) {\n\t\t\tlet msg = \"No editor configured. Set $VISUAL or $EDITOR environment variable.\";\n\t\t\tif (process.env.TERM_PROGRAM === \"iTerm.app\") {\n\t\t\t\tmsg +=\n\t\t\t\t\t\"\\n\\nTip: If you meant to open the GSD dashboard (Ctrl+Alt+G), set Left Option Key to\" +\n\t\t\t\t\t\" \\\"Esc+\\\" in iTerm2 → Profiles → Keys. With the default \\\"Normal\\\" setting,\" +\n\t\t\t\t\t\" Ctrl+Alt+G sends Ctrl+G instead.\";\n\t\t\t}\n\t\t\thost.showWarning(msg);\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentText = host.editor.getExpandedText?.() ?? host.editor.getText();\n\t\tconst tmpFile = path.join(os.tmpdir(), `pi-editor-${Date.now()}.pi.md`);\n\n\t\ttry {\n\t\t\t// Write current content to temp file\n\t\t\tfs.writeFileSync(tmpFile, currentText, \"utf-8\");\n\n\t\t\t// Stop TUI to release terminal\n\t\t\thost.ui.stop();\n\n\t\t\t// Split by space to support editor arguments (e.g., \"code --wait\")\n\t\t\tconst [editor, ...editorArgs] = editorCmd.split(\" \");\n\n\t\t\t// Spawn editor synchronously with inherited stdio for interactive editing\n\t\t\tconst result = spawnSync(editor, [...editorArgs, tmpFile], {\n\t\t\t\tstdio: \"inherit\",\n\t\t\t\tshell: process.platform === \"win32\",\n\t\t\t});\n\n\t\t\t// On successful exit (status 0), replace editor content\n\t\t\tif (result.status === 0) {\n\t\t\t\tconst newContent = fs.readFileSync(tmpFile, \"utf-8\").replace(/\\n$/, \"\");\n\t\t\t\thost.editor.setText(newContent);\n\t\t\t}\n\t\t\t// On non-zero exit, keep original text (no action needed)\n\t\t} finally {\n\t\t\t// Clean up temp file\n\t\t\ttry {\n\t\t\t\tfs.unlinkSync(tmpFile);\n\t\t\t} catch {\n\t\t\t\t// Ignore cleanup errors\n\t\t\t}\n\n\t\t\t// Restart TUI\n\t\t\thost.ui.start();\n\t\t\t// Force full re-render since external editor uses alternate screen\n\t\t\thost.ui.requestRender(true);\n\t\t}\n\t}\n"]}
|
|
@@ -2,6 +2,7 @@ import type { InteractiveModeDelegateHost } from "./interactive-mode-delegate-ho
|
|
|
2
2
|
export { getChangelogForDisplay, checkForNewVersion, checkTmuxKeyboardSetup } from "./interactive-startup.js";
|
|
3
3
|
export declare function installStdinErrorRecovery(host: InteractiveModeDelegateHost): void;
|
|
4
4
|
export declare function mountStartupHeader(host: InteractiveModeDelegateHost): void;
|
|
5
|
+
export declare function dismissStartupHeader(host: InteractiveModeDelegateHost): void;
|
|
5
6
|
export declare function updateTerminalTitle(host: InteractiveModeDelegateHost): void;
|
|
6
7
|
export { showNewVersionNotification } from "./interactive-ui-messaging.js";
|
|
7
8
|
//# sourceMappingURL=interactive-mode-init.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactive-mode-init.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-mode-init.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"interactive-mode-init.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-mode-init.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAEvF,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAE9G,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CAcjF;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CA+B1E;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CAO5E;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CAQ3E;AAED,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC"}
|
|
@@ -2,13 +2,9 @@
|
|
|
2
2
|
// File Purpose: Extracted from interactive-mode.ts (Phase E2 seam remediation).
|
|
3
3
|
// @ts-nocheck
|
|
4
4
|
import * as path from "node:path";
|
|
5
|
-
import {
|
|
5
|
+
import { Text } from "@gsd/pi-tui";
|
|
6
6
|
import { APP_NAME } from "@gsd/pi-coding-agent/config.js";
|
|
7
7
|
import { theme } from "@gsd/pi-coding-agent/theme/theme.js";
|
|
8
|
-
import { appKey, appKeyHint, keyHint, rawKeyHint } from "./components/keybinding-hints.js";
|
|
9
|
-
import { DynamicBorder } from "./components/dynamic-border.js";
|
|
10
|
-
import { getToolExpansionStartupHint } from "./interactive-notify-render.js";
|
|
11
|
-
import { getMarkdownThemeWithSettings } from "./interactive-theme-cache.js";
|
|
12
8
|
export { getChangelogForDisplay, checkForNewVersion, checkTmuxKeyboardSetup } from "./interactive-startup.js";
|
|
13
9
|
export function installStdinErrorRecovery(host) {
|
|
14
10
|
if (host.stdinErrorHandler)
|
|
@@ -27,64 +23,39 @@ export function installStdinErrorRecovery(host) {
|
|
|
27
23
|
process.stdin.on("error", host.stdinErrorHandler);
|
|
28
24
|
}
|
|
29
25
|
export function mountStartupHeader(host) {
|
|
26
|
+
const logo = theme.bold(theme.fg("accent", APP_NAME)) + theme.fg("dim", ` v${host.version}`);
|
|
27
|
+
const model = host.session.state.model?.id ?? "no model";
|
|
28
|
+
const lineOne = `${logo} · ${theme.fg("dim", model)} · ${theme.fg("accent", "/help")}`;
|
|
30
29
|
if (host.options.verbose || !host.settingsManager.getQuietStartup()) {
|
|
31
|
-
|
|
32
|
-
const kb = host.keybindings;
|
|
33
|
-
const hint = (action, desc) => appKeyHint(kb, action, desc);
|
|
34
|
-
const instructions = [
|
|
35
|
-
hint("interrupt", "to interrupt"),
|
|
36
|
-
hint("clear", "to clear"),
|
|
37
|
-
rawKeyHint(`${appKey(kb, "clear")} twice`, "to exit"),
|
|
38
|
-
hint("exit", "to exit (empty)"),
|
|
39
|
-
hint("suspend", "to suspend"),
|
|
40
|
-
keyHint("deleteToLineEnd", "to delete to end"),
|
|
41
|
-
hint("cycleThinkingLevel", "to cycle thinking level"),
|
|
42
|
-
rawKeyHint(`${appKey(kb, "cycleModelForward")}/${appKey(kb, "cycleModelBackward")}`, "to cycle models"),
|
|
43
|
-
hint("selectModel", "to select model"),
|
|
44
|
-
getToolExpansionStartupHint(host.toolOutputExpanded, kb),
|
|
45
|
-
hint("toggleThinking", "to expand thinking"),
|
|
46
|
-
hint("externalEditor", "for external editor"),
|
|
47
|
-
rawKeyHint("/", "for commands"),
|
|
48
|
-
rawKeyHint("!", "to run bash"),
|
|
49
|
-
rawKeyHint("!!", "to run bash (no context)"),
|
|
50
|
-
hint("followUp", "to queue follow-up"),
|
|
51
|
-
hint("dequeue", "to edit all queued messages"),
|
|
52
|
-
hint("pasteImage", "to paste image"),
|
|
53
|
-
rawKeyHint("drop files", "to attach"),
|
|
54
|
-
].join("\n");
|
|
55
|
-
host.builtInHeader = new Text(`${logo}\n${instructions}`, 1, 0);
|
|
56
|
-
host.headerContainer.addChild(new Spacer(1));
|
|
30
|
+
host.builtInHeader = new Text(lineOne, 1, 0);
|
|
57
31
|
host.headerContainer.addChild(host.builtInHeader);
|
|
58
|
-
host.headerContainer.addChild(new Spacer(1));
|
|
59
32
|
if (host.changelogMarkdown) {
|
|
60
|
-
host.
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
const condensedText = `Updated to v${latestVersion}. Use ${theme.bold("/changelog")} to view full changelog.`;
|
|
65
|
-
host.headerContainer.addChild(new Text(condensedText, 1, 0));
|
|
66
|
-
}
|
|
67
|
-
else {
|
|
68
|
-
host.headerContainer.addChild(new Text(theme.bold(theme.fg("accent", "What's New")), 1, 0));
|
|
69
|
-
host.headerContainer.addChild(new Spacer(1));
|
|
70
|
-
host.headerContainer.addChild(new Markdown(host.changelogMarkdown.trim(), 1, 0, getMarkdownThemeWithSettings(host)));
|
|
71
|
-
host.headerContainer.addChild(new Spacer(1));
|
|
72
|
-
}
|
|
73
|
-
host.headerContainer.addChild(new DynamicBorder());
|
|
33
|
+
const versionMatch = host.changelogMarkdown.match(/##\s+\[?(\d+\.\d+\.\d+)\]?/);
|
|
34
|
+
const latestVersion = versionMatch ? versionMatch[1] : host.version;
|
|
35
|
+
const condensedText = theme.fg("muted", `Updated to v${latestVersion}. Use ${theme.bold("/changelog")} for details.`);
|
|
36
|
+
host.headerContainer.addChild(new Text(condensedText, 1, 0));
|
|
74
37
|
}
|
|
75
38
|
}
|
|
76
39
|
else {
|
|
77
|
-
host.builtInHeader = new Text(
|
|
40
|
+
host.builtInHeader = new Text(lineOne, 1, 0);
|
|
78
41
|
host.headerContainer.addChild(host.builtInHeader);
|
|
79
42
|
if (host.changelogMarkdown) {
|
|
80
|
-
host.headerContainer.addChild(new Spacer(1));
|
|
81
43
|
const versionMatch = host.changelogMarkdown.match(/##\s+\[?(\d+\.\d+\.\d+)\]?/);
|
|
82
44
|
const latestVersion = versionMatch ? versionMatch[1] : host.version;
|
|
83
|
-
const condensedText = `Updated to v${latestVersion}. Use ${theme.bold("/changelog")}
|
|
45
|
+
const condensedText = theme.fg("muted", `Updated to v${latestVersion}. Use ${theme.bold("/changelog")} for details.`);
|
|
84
46
|
host.headerContainer.addChild(new Text(condensedText, 1, 0));
|
|
85
47
|
}
|
|
86
48
|
}
|
|
87
49
|
}
|
|
50
|
+
export function dismissStartupHeader(host) {
|
|
51
|
+
if (host.startupHeaderDismissed)
|
|
52
|
+
return;
|
|
53
|
+
host.startupHeaderDismissed = true;
|
|
54
|
+
host.headerContainer.clear();
|
|
55
|
+
host.builtInHeader = new Text("", 0, 0);
|
|
56
|
+
host.headerContainer.addChild(host.builtInHeader);
|
|
57
|
+
host.ui.requestRender();
|
|
58
|
+
}
|
|
88
59
|
export function updateTerminalTitle(host) {
|
|
89
60
|
const cwdBasename = path.basename(process.cwd());
|
|
90
61
|
const sessionName = host.sessionManager.getSessionName();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactive-mode-init.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-mode-init.ts"],"names":[],"mappings":"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","sourcesContent":["// Project/App: gsd-pi\n// File Purpose: Extracted from interactive-mode.ts (Phase E2 seam remediation).\n// @ts-nocheck\n\nimport * as path from \"node:path\";\nimport { Markdown, Spacer, Text } from \"@gsd/pi-tui\";\nimport { APP_NAME } from \"@gsd/pi-coding-agent/config.js\";\nimport type { AppAction } from \"@gsd/agent-core\";\nimport { theme } from \"@gsd/pi-coding-agent/theme/theme.js\";\nimport { appKey, appKeyHint, keyHint, rawKeyHint } from \"./components/keybinding-hints.js\";\nimport { DynamicBorder } from \"./components/dynamic-border.js\";\nimport { getToolExpansionStartupHint } from \"./interactive-notify-render.js\";\nimport { getChangelogForDisplay } from \"./interactive-startup.js\";\nimport { getMarkdownThemeWithSettings } from \"./interactive-theme-cache.js\";\nimport type { InteractiveModeDelegateHost } from \"./interactive-mode-delegate-host.js\";\n\nexport { getChangelogForDisplay, checkForNewVersion, checkTmuxKeyboardSetup } from \"./interactive-startup.js\";\n\nexport function installStdinErrorRecovery(host: InteractiveModeDelegateHost): void {\n\tif (host.stdinErrorHandler) return;\n\thost.stdinErrorHandler = (err: Error) => {\n\t\tconst errno = err as NodeJS.ErrnoException;\n\t\tconst isReadEio = errno.code === \"EIO\" || /read EIO/i.test(err.message);\n\t\tif (!isReadEio) return;\n\n\t\tprocess.stderr.write(`[pi] stdin EIO detected, aborting active stream\\n`);\n\t\tif (host.session.isStreaming) {\n\t\t\thost.agent.abort();\n\t\t\thost.showWarning(\"Terminal input was interrupted (EIO). Aborted the active response; send your message again.\");\n\t\t}\n\t};\n\tprocess.stdin.on(\"error\", host.stdinErrorHandler);\n}\n\nexport function mountStartupHeader(host: InteractiveModeDelegateHost): void {\n\tif (host.options.verbose || !host.settingsManager.getQuietStartup()) {\n\t\tconst logo = theme.bold(theme.fg(\"accent\", APP_NAME)) + theme.fg(\"dim\", ` v${host.version}`);\n\n\t\tconst kb = host.keybindings;\n\t\tconst hint = (action: AppAction, desc: string) => appKeyHint(kb, action, desc);\n\n\t\tconst instructions = [\n\t\t\thint(\"interrupt\", \"to interrupt\"),\n\t\t\thint(\"clear\", \"to clear\"),\n\t\t\trawKeyHint(`${appKey(kb, \"clear\")} twice`, \"to exit\"),\n\t\t\thint(\"exit\", \"to exit (empty)\"),\n\t\t\thint(\"suspend\", \"to suspend\"),\n\t\t\tkeyHint(\"deleteToLineEnd\", \"to delete to end\"),\n\t\t\thint(\"cycleThinkingLevel\", \"to cycle thinking level\"),\n\t\t\trawKeyHint(`${appKey(kb, \"cycleModelForward\")}/${appKey(kb, \"cycleModelBackward\")}`, \"to cycle models\"),\n\t\t\thint(\"selectModel\", \"to select model\"),\n\t\t\tgetToolExpansionStartupHint(host.toolOutputExpanded, kb),\n\t\t\thint(\"toggleThinking\", \"to expand thinking\"),\n\t\t\thint(\"externalEditor\", \"for external editor\"),\n\t\t\trawKeyHint(\"/\", \"for commands\"),\n\t\t\trawKeyHint(\"!\", \"to run bash\"),\n\t\t\trawKeyHint(\"!!\", \"to run bash (no context)\"),\n\t\t\thint(\"followUp\", \"to queue follow-up\"),\n\t\t\thint(\"dequeue\", \"to edit all queued messages\"),\n\t\t\thint(\"pasteImage\", \"to paste image\"),\n\t\t\trawKeyHint(\"drop files\", \"to attach\"),\n\t\t].join(\"\\n\");\n\t\thost.builtInHeader = new Text(`${logo}\\n${instructions}`, 1, 0);\n\n\t\thost.headerContainer.addChild(new Spacer(1));\n\t\thost.headerContainer.addChild(host.builtInHeader);\n\t\thost.headerContainer.addChild(new Spacer(1));\n\n\t\tif (host.changelogMarkdown) {\n\t\t\thost.headerContainer.addChild(new DynamicBorder());\n\t\t\tif (host.settingsManager.getCollapseChangelog()) {\n\t\t\t\tconst versionMatch = host.changelogMarkdown.match(/##\\s+\\[?(\\d+\\.\\d+\\.\\d+)\\]?/);\n\t\t\t\tconst latestVersion = versionMatch ? versionMatch[1] : host.version;\n\t\t\t\tconst condensedText = `Updated to v${latestVersion}. Use ${theme.bold(\"/changelog\")} to view full changelog.`;\n\t\t\t\thost.headerContainer.addChild(new Text(condensedText, 1, 0));\n\t\t\t} else {\n\t\t\t\thost.headerContainer.addChild(new Text(theme.bold(theme.fg(\"accent\", \"What's New\")), 1, 0));\n\t\t\t\thost.headerContainer.addChild(new Spacer(1));\n\t\t\t\thost.headerContainer.addChild(\n\t\t\t\t\tnew Markdown(host.changelogMarkdown.trim(), 1, 0, getMarkdownThemeWithSettings(host)),\n\t\t\t\t);\n\t\t\t\thost.headerContainer.addChild(new Spacer(1));\n\t\t\t}\n\t\t\thost.headerContainer.addChild(new DynamicBorder());\n\t\t}\n\t} else {\n\t\thost.builtInHeader = new Text(\"\", 0, 0);\n\t\thost.headerContainer.addChild(host.builtInHeader);\n\t\tif (host.changelogMarkdown) {\n\t\t\thost.headerContainer.addChild(new Spacer(1));\n\t\t\tconst versionMatch = host.changelogMarkdown.match(/##\\s+\\[?(\\d+\\.\\d+\\.\\d+)\\]?/);\n\t\t\tconst latestVersion = versionMatch ? versionMatch[1] : host.version;\n\t\t\tconst condensedText = `Updated to v${latestVersion}. Use ${theme.bold(\"/changelog\")} to view full changelog.`;\n\t\t\thost.headerContainer.addChild(new Text(condensedText, 1, 0));\n\t\t}\n\t}\n}\n\nexport function updateTerminalTitle(host: InteractiveModeDelegateHost): void {\n\tconst cwdBasename = path.basename(process.cwd());\n\tconst sessionName = host.sessionManager.getSessionName();\n\tif (sessionName) {\n\t\thost.ui.terminal.setTitle(`π - ${sessionName} - ${cwdBasename}`);\n\t} else {\n\t\thost.ui.terminal.setTitle(`π - ${cwdBasename}`);\n\t}\n}\n\nexport { showNewVersionNotification } from \"./interactive-ui-messaging.js\";\n"]}
|
|
1
|
+
{"version":3,"file":"interactive-mode-init.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-mode-init.ts"],"names":[],"mappings":"AAAA,sBAAsB;AACtB,gFAAgF;AAChF,cAAc;AAEd,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAC1D,OAAO,EAAE,KAAK,EAAE,MAAM,qCAAqC,CAAC;AAI5D,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAE9G,MAAM,UAAU,yBAAyB,CAAC,IAAiC;IAC1E,IAAI,IAAI,CAAC,iBAAiB;QAAE,OAAO;IACnC,IAAI,CAAC,iBAAiB,GAAG,CAAC,GAAU,EAAE,EAAE;QACvC,MAAM,KAAK,GAAG,GAA4B,CAAC;QAC3C,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACxE,IAAI,CAAC,SAAS;YAAE,OAAO;QAEvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;QAC1E,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YAC9B,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACnB,IAAI,CAAC,WAAW,CAAC,6FAA6F,CAAC,CAAC;QACjH,CAAC;IACF,CAAC,CAAC;IACF,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAiC;IACnE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7F,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,IAAI,UAAU,CAAC;IACzD,MAAM,OAAO,GAAG,GAAG,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;IAEvF,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,eAAe,EAAE,EAAE,CAAC;QACrE,IAAI,CAAC,aAAa,GAAG,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAElD,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAChF,MAAM,aAAa,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;YACpE,MAAM,aAAa,GAAG,KAAK,CAAC,EAAE,CAC7B,OAAO,EACP,eAAe,aAAa,SAAS,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,eAAe,CAC5E,CAAC;YACF,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9D,CAAC;IACF,CAAC;SAAM,CAAC;QACP,IAAI,CAAC,aAAa,GAAG,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAClD,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAChF,MAAM,aAAa,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;YACpE,MAAM,aAAa,GAAG,KAAK,CAAC,EAAE,CAC7B,OAAO,EACP,eAAe,aAAa,SAAS,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,eAAe,CAC5E,CAAC;YACF,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9D,CAAC;IACF,CAAC;AACF,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAiC;IACrE,IAAI,IAAI,CAAC,sBAAsB;QAAE,OAAO;IACxC,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;IACnC,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;IAC7B,IAAI,CAAC,aAAa,GAAG,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACxC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAClD,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAiC;IACpE,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACjD,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC;IACzD,IAAI,WAAW,EAAE,CAAC;QACjB,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,WAAW,MAAM,WAAW,EAAE,CAAC,CAAC;IAClE,CAAC;SAAM,CAAC;QACP,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,WAAW,EAAE,CAAC,CAAC;IACjD,CAAC;AACF,CAAC;AAED,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC","sourcesContent":["// Project/App: gsd-pi\n// File Purpose: Extracted from interactive-mode.ts (Phase E2 seam remediation).\n// @ts-nocheck\n\nimport * as path from \"node:path\";\nimport { Text } from \"@gsd/pi-tui\";\nimport { APP_NAME } from \"@gsd/pi-coding-agent/config.js\";\nimport { theme } from \"@gsd/pi-coding-agent/theme/theme.js\";\nimport { getChangelogForDisplay } from \"./interactive-startup.js\";\nimport type { InteractiveModeDelegateHost } from \"./interactive-mode-delegate-host.js\";\n\nexport { getChangelogForDisplay, checkForNewVersion, checkTmuxKeyboardSetup } from \"./interactive-startup.js\";\n\nexport function installStdinErrorRecovery(host: InteractiveModeDelegateHost): void {\n\tif (host.stdinErrorHandler) return;\n\thost.stdinErrorHandler = (err: Error) => {\n\t\tconst errno = err as NodeJS.ErrnoException;\n\t\tconst isReadEio = errno.code === \"EIO\" || /read EIO/i.test(err.message);\n\t\tif (!isReadEio) return;\n\n\t\tprocess.stderr.write(`[pi] stdin EIO detected, aborting active stream\\n`);\n\t\tif (host.session.isStreaming) {\n\t\t\thost.agent.abort();\n\t\t\thost.showWarning(\"Terminal input was interrupted (EIO). Aborted the active response; send your message again.\");\n\t\t}\n\t};\n\tprocess.stdin.on(\"error\", host.stdinErrorHandler);\n}\n\nexport function mountStartupHeader(host: InteractiveModeDelegateHost): void {\n\tconst logo = theme.bold(theme.fg(\"accent\", APP_NAME)) + theme.fg(\"dim\", ` v${host.version}`);\n\tconst model = host.session.state.model?.id ?? \"no model\";\n\tconst lineOne = `${logo} · ${theme.fg(\"dim\", model)} · ${theme.fg(\"accent\", \"/help\")}`;\n\n\tif (host.options.verbose || !host.settingsManager.getQuietStartup()) {\n\t\thost.builtInHeader = new Text(lineOne, 1, 0);\n\t\thost.headerContainer.addChild(host.builtInHeader);\n\n\t\tif (host.changelogMarkdown) {\n\t\t\tconst versionMatch = host.changelogMarkdown.match(/##\\s+\\[?(\\d+\\.\\d+\\.\\d+)\\]?/);\n\t\t\tconst latestVersion = versionMatch ? versionMatch[1] : host.version;\n\t\t\tconst condensedText = theme.fg(\n\t\t\t\t\"muted\",\n\t\t\t\t`Updated to v${latestVersion}. Use ${theme.bold(\"/changelog\")} for details.`,\n\t\t\t);\n\t\t\thost.headerContainer.addChild(new Text(condensedText, 1, 0));\n\t\t}\n\t} else {\n\t\thost.builtInHeader = new Text(lineOne, 1, 0);\n\t\thost.headerContainer.addChild(host.builtInHeader);\n\t\tif (host.changelogMarkdown) {\n\t\t\tconst versionMatch = host.changelogMarkdown.match(/##\\s+\\[?(\\d+\\.\\d+\\.\\d+)\\]?/);\n\t\t\tconst latestVersion = versionMatch ? versionMatch[1] : host.version;\n\t\t\tconst condensedText = theme.fg(\n\t\t\t\t\"muted\",\n\t\t\t\t`Updated to v${latestVersion}. Use ${theme.bold(\"/changelog\")} for details.`,\n\t\t\t);\n\t\t\thost.headerContainer.addChild(new Text(condensedText, 1, 0));\n\t\t}\n\t}\n}\n\nexport function dismissStartupHeader(host: InteractiveModeDelegateHost): void {\n\tif (host.startupHeaderDismissed) return;\n\thost.startupHeaderDismissed = true;\n\thost.headerContainer.clear();\n\thost.builtInHeader = new Text(\"\", 0, 0);\n\thost.headerContainer.addChild(host.builtInHeader);\n\thost.ui.requestRender();\n}\n\nexport function updateTerminalTitle(host: InteractiveModeDelegateHost): void {\n\tconst cwdBasename = path.basename(process.cwd());\n\tconst sessionName = host.sessionManager.getSessionName();\n\tif (sessionName) {\n\t\thost.ui.terminal.setTitle(`π - ${sessionName} - ${cwdBasename}`);\n\t} else {\n\t\thost.ui.terminal.setTitle(`π - ${cwdBasename}`);\n\t}\n}\n\nexport { showNewVersionNotification } from \"./interactive-ui-messaging.js\";\n"]}
|
|
@@ -18,7 +18,11 @@ export interface InteractiveModeStateHost {
|
|
|
18
18
|
onInputCallback?: (text: string) => void;
|
|
19
19
|
isInitialized: boolean;
|
|
20
20
|
loadingAnimation?: any;
|
|
21
|
+
activityLoader?: any;
|
|
21
22
|
pendingWorkingMessage?: string | null;
|
|
23
|
+
gsdProgressState?: {
|
|
24
|
+
phase?: string;
|
|
25
|
+
};
|
|
22
26
|
clearBlockingError(): void;
|
|
23
27
|
defaultWorkingMessage: string;
|
|
24
28
|
streamingComponent?: any;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactive-mode-state.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-mode-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,MAAM,WAAW,wBAAwB;IACxC,aAAa,EAAE,GAAG,CAAC;IACnB,MAAM,EAAE,GAAG,CAAC;IACZ,OAAO,EAAE,GAAG,CAAC;IACb,EAAE,EAAE,GAAG,CAAC;IACR,MAAM,EAAE,GAAG,CAAC;IACZ,WAAW,EAAE,GAAG,CAAC;IACjB,eAAe,EAAE,GAAG,CAAC;IACrB,aAAa,EAAE,GAAG,CAAC;IACnB,sBAAsB,EAAE,GAAG,CAAC;IAC5B,eAAe,EAAE,GAAG,CAAC;IACrB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,aAAa,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,GAAG,CAAC;IACvB,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,kBAAkB,IAAI,IAAI,CAAC;IAC3B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,kBAAkB,CAAC,EAAE,GAAG,CAAC;IACzB,gBAAgB,CAAC,EAAE,GAAG,CAAC;IACvB,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;IAChC,WAAW,CAAC,EAAE,GAAG,CAAC;IAClB,oBAAoB,CAAC,EAAE,GAAG,CAAC;IAC3B,2BAA2B,CAAC,EAAE,MAAM,IAAI,CAAC;IACzC,wBAAwB,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,GAAG,UAAU,CAAA;KAAE,CAAC,CAAC;IAC9E,iBAAiB,CAAC,EAAE,GAAG,CAAC;IACxB,cAAc,CAAC,EAAE,GAAG,CAAC;IACrB,eAAe,CAAC,EAAE,GAAG,CAAC;IACtB,eAAe,EAAE,GAAG,CAAC;IACrB,kBAAkB,CAAC,EAAE,GAAG,CAAC;IACzB,aAAa,EAAE,YAAY,EAAE,CAAC;CAC9B;AAED,MAAM,MAAM,oBAAoB,GAAG,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"interactive-mode-state.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-mode-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,MAAM,WAAW,wBAAwB;IACxC,aAAa,EAAE,GAAG,CAAC;IACnB,MAAM,EAAE,GAAG,CAAC;IACZ,OAAO,EAAE,GAAG,CAAC;IACb,EAAE,EAAE,GAAG,CAAC;IACR,MAAM,EAAE,GAAG,CAAC;IACZ,WAAW,EAAE,GAAG,CAAC;IACjB,eAAe,EAAE,GAAG,CAAC;IACrB,aAAa,EAAE,GAAG,CAAC;IACnB,sBAAsB,EAAE,GAAG,CAAC;IAC5B,eAAe,EAAE,GAAG,CAAC;IACrB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,aAAa,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,GAAG,CAAC;IACvB,cAAc,CAAC,EAAE,GAAG,CAAC;IACrB,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,gBAAgB,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACtC,kBAAkB,IAAI,IAAI,CAAC;IAC3B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,kBAAkB,CAAC,EAAE,GAAG,CAAC;IACzB,gBAAgB,CAAC,EAAE,GAAG,CAAC;IACvB,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;IAChC,WAAW,CAAC,EAAE,GAAG,CAAC;IAClB,oBAAoB,CAAC,EAAE,GAAG,CAAC;IAC3B,2BAA2B,CAAC,EAAE,MAAM,IAAI,CAAC;IACzC,wBAAwB,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,GAAG,UAAU,CAAA;KAAE,CAAC,CAAC;IAC9E,iBAAiB,CAAC,EAAE,GAAG,CAAC;IACxB,cAAc,CAAC,EAAE,GAAG,CAAC;IACrB,eAAe,CAAC,EAAE,GAAG,CAAC;IACtB,eAAe,EAAE,GAAG,CAAC;IACrB,kBAAkB,CAAC,EAAE,GAAG,CAAC;IACzB,aAAa,EAAE,YAAY,EAAE,CAAC;CAC9B;AAED,MAAM,MAAM,oBAAoB,GAAG,iBAAiB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactive-mode-state.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-mode-state.ts"],"names":[],"mappings":"","sourcesContent":["import type { ImageContent } from \"@gsd/pi-ai\";\nimport type { AgentSessionEvent } from \"@gsd/agent-core\";\n\nexport interface InteractiveModeStateHost {\n\tdefaultEditor: any;\n\teditor: any;\n\tsession: any;\n\tui: any;\n\tfooter: any;\n\tkeybindings: any;\n\tstatusContainer: any;\n\tchatContainer: any;\n\tpinnedMessageContainer: any;\n\tsettingsManager: any;\n\tpendingTools: Map<string, any>;\n\ttoolOutputExpanded: boolean;\n\thideThinkingBlock: boolean;\n\tisBashMode: boolean;\n\tonInputCallback?: (text: string) => void;\n\tisInitialized: boolean;\n\tloadingAnimation?: any;\n\tpendingWorkingMessage?: string | null;\n\tclearBlockingError(): void;\n\tdefaultWorkingMessage: string;\n\tstreamingComponent?: any;\n\tstreamingMessage?: any;\n\tretryEscapeHandler?: () => void;\n\tretryLoader?: any;\n\tautoCompactionLoader?: any;\n\tautoCompactionEscapeHandler?: () => void;\n\tcompactionQueuedMessages: Array<{ text: string; mode: \"steer\" | \"followUp\" }>;\n\textensionSelector?: any;\n\textensionInput?: any;\n\textensionEditor?: any;\n\teditorContainer: any;\n\tkeybindingsManager?: any;\n\tpendingImages: ImageContent[];\n}\n\nexport type InteractiveModeEvent = AgentSessionEvent;\n"]}
|
|
1
|
+
{"version":3,"file":"interactive-mode-state.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-mode-state.ts"],"names":[],"mappings":"","sourcesContent":["import type { ImageContent } from \"@gsd/pi-ai\";\nimport type { AgentSessionEvent } from \"@gsd/agent-core\";\n\nexport interface InteractiveModeStateHost {\n\tdefaultEditor: any;\n\teditor: any;\n\tsession: any;\n\tui: any;\n\tfooter: any;\n\tkeybindings: any;\n\tstatusContainer: any;\n\tchatContainer: any;\n\tpinnedMessageContainer: any;\n\tsettingsManager: any;\n\tpendingTools: Map<string, any>;\n\ttoolOutputExpanded: boolean;\n\thideThinkingBlock: boolean;\n\tisBashMode: boolean;\n\tonInputCallback?: (text: string) => void;\n\tisInitialized: boolean;\n\tloadingAnimation?: any;\n\tactivityLoader?: any;\n\tpendingWorkingMessage?: string | null;\n\tgsdProgressState?: { phase?: string };\n\tclearBlockingError(): void;\n\tdefaultWorkingMessage: string;\n\tstreamingComponent?: any;\n\tstreamingMessage?: any;\n\tretryEscapeHandler?: () => void;\n\tretryLoader?: any;\n\tautoCompactionLoader?: any;\n\tautoCompactionEscapeHandler?: () => void;\n\tcompactionQueuedMessages: Array<{ text: string; mode: \"steer\" | \"followUp\" }>;\n\textensionSelector?: any;\n\textensionInput?: any;\n\textensionEditor?: any;\n\teditorContainer: any;\n\tkeybindingsManager?: any;\n\tpendingImages: ImageContent[];\n}\n\nexport type InteractiveModeEvent = AgentSessionEvent;\n"]}
|
|
@@ -36,7 +36,10 @@ export declare class InteractiveMode {
|
|
|
36
36
|
private ui;
|
|
37
37
|
private chatContainer;
|
|
38
38
|
private pendingMessagesContainer;
|
|
39
|
-
private
|
|
39
|
+
private gsdStatusWidget;
|
|
40
|
+
private gsdStatusExpanded;
|
|
41
|
+
private gsdProgressState;
|
|
42
|
+
private gsdProgressDispose?;
|
|
40
43
|
private statusContainer;
|
|
41
44
|
private pinnedMessageContainer;
|
|
42
45
|
private blockingErrorContainer;
|
|
@@ -51,12 +54,14 @@ export declare class InteractiveMode {
|
|
|
51
54
|
private isInitialized;
|
|
52
55
|
private onInputCallback?;
|
|
53
56
|
private loadingAnimation;
|
|
57
|
+
private activityLoader;
|
|
54
58
|
private pendingWorkingMessage;
|
|
55
59
|
private readonly defaultWorkingMessage;
|
|
56
60
|
private lastBlockingError;
|
|
57
61
|
private lastSigintTime;
|
|
58
62
|
private lastEscapeTime;
|
|
59
63
|
private changelogMarkdown;
|
|
64
|
+
private startupHeaderDismissed;
|
|
60
65
|
private lastStatusSpacer;
|
|
61
66
|
private lastStatusText;
|
|
62
67
|
private streamingComponent;
|
|
@@ -116,7 +121,7 @@ export declare class InteractiveMode {
|
|
|
116
121
|
getContextPercent(): number | undefined;
|
|
117
122
|
renderInitialMessages(): void;
|
|
118
123
|
getUserInput(): Promise<string>;
|
|
119
|
-
getExtensionUIContext(): import("@gsd/pi-coding-agent/core/extensions/extension-upstream-types").ExtensionUIContext;
|
|
124
|
+
getExtensionUIContext(): import("@gsd/pi-coding-agent/core/extensions/extension-upstream-types.js").ExtensionUIContext;
|
|
120
125
|
requestRender(force?: boolean): void;
|
|
121
126
|
stop(): void;
|
|
122
127
|
private formatDisplayPath;
|
|
@@ -127,6 +132,7 @@ export declare class InteractiveMode {
|
|
|
127
132
|
private formatWebSearchResult;
|
|
128
133
|
private setupExtensionShortcuts;
|
|
129
134
|
private setExtensionStatus;
|
|
135
|
+
private setGsdProgress;
|
|
130
136
|
private setExtensionWidget;
|
|
131
137
|
private clearExtensionWidgets;
|
|
132
138
|
private resetExtensionUI;
|
|
@@ -181,6 +187,8 @@ export declare class InteractiveMode {
|
|
|
181
187
|
private cycleModel;
|
|
182
188
|
private toggleToolOutputExpansion;
|
|
183
189
|
private setToolsExpanded;
|
|
190
|
+
toggleGsdStatusWidget(): void;
|
|
191
|
+
private setToolRailAnimation;
|
|
184
192
|
private toggleThinkingBlockVisibility;
|
|
185
193
|
private openExternalEditor;
|
|
186
194
|
private showSelector;
|