@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
|
@@ -1,36 +1,19 @@
|
|
|
1
1
|
// Project/App: gsd-pi
|
|
2
2
|
// File Purpose: Interactive terminal footer renderer for workspace, model, usage, context, and extension status.
|
|
3
|
-
import { truncateToWidth
|
|
3
|
+
import { truncateToWidth } from "@gsd/pi-tui";
|
|
4
4
|
import { theme } from "@gsd/pi-coding-agent/theme/theme.js";
|
|
5
5
|
import { providerAuthBadge, providerDisplayName } from "./model-selector.js";
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
6
|
+
import { badge, layoutFullWidthMinimalFooter, renderMinimalFooterLine, renderProgressBar, } from "./transcript-design.js";
|
|
7
|
+
import { isGsdStatusWidgetVisible } from "./gsd-status-widget.js";
|
|
8
|
+
const CONTEXT_BAR_WIDTH = 6;
|
|
9
|
+
/** Extension status keys shown in the footer center when the GSD strip is visible. */
|
|
10
|
+
const PRIMARY_STATUS_KEYS = ["gsd-step", "zz-notifications", "gsd-fast"];
|
|
11
11
|
function sanitizeStatusText(text) {
|
|
12
|
-
// Replace newlines, tabs, carriage returns with space, then collapse multiple spaces
|
|
13
12
|
return text
|
|
14
13
|
.replace(/[\r\n\t]/g, " ")
|
|
15
14
|
.replace(/ +/g, " ")
|
|
16
15
|
.trim();
|
|
17
16
|
}
|
|
18
|
-
function truncateFooterPath(text, width) {
|
|
19
|
-
if (visibleWidth(text) <= width)
|
|
20
|
-
return text;
|
|
21
|
-
const tailMatch = text.match(/( \([^)]+\)(?: • .*)?)$/);
|
|
22
|
-
if (!tailMatch)
|
|
23
|
-
return truncateToWidth(text, width, "...");
|
|
24
|
-
const tail = tailMatch[1];
|
|
25
|
-
const tailWidth = visibleWidth(tail);
|
|
26
|
-
if (tailWidth >= width - 4)
|
|
27
|
-
return truncateToWidth(text, width, "...");
|
|
28
|
-
const head = text.slice(0, -tail.length);
|
|
29
|
-
return `${truncateToWidth(head, width - tailWidth, "...")}${tail}`;
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Format token counts (similar to web-ui)
|
|
33
|
-
*/
|
|
34
17
|
function formatTokens(count) {
|
|
35
18
|
if (count < 1000)
|
|
36
19
|
return count.toString();
|
|
@@ -42,9 +25,49 @@ function formatTokens(count) {
|
|
|
42
25
|
return `${(count / 1000000).toFixed(1)}M`;
|
|
43
26
|
return `${Math.round(count / 1000000)}M`;
|
|
44
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* Abbreviate cwd for the footer — `~` for home and descendants only.
|
|
30
|
+
* @internal Exported for testing only.
|
|
31
|
+
*/
|
|
32
|
+
export function formatCwdForFooter(cwd, home = process.env.HOME ?? process.env.USERPROFILE ?? "") {
|
|
33
|
+
if (!home)
|
|
34
|
+
return cwd;
|
|
35
|
+
if (cwd === home)
|
|
36
|
+
return "~";
|
|
37
|
+
const withForwardSep = home.endsWith("/") ? home : `${home}/`;
|
|
38
|
+
const withBackSep = home.endsWith("\\") ? home : `${home}\\`;
|
|
39
|
+
if (cwd.startsWith(withForwardSep) || cwd.startsWith(withBackSep)) {
|
|
40
|
+
return `~${cwd.slice(home.length)}`;
|
|
41
|
+
}
|
|
42
|
+
return cwd;
|
|
43
|
+
}
|
|
44
|
+
function pickPrimaryExtensionStatus(statuses) {
|
|
45
|
+
for (const key of PRIMARY_STATUS_KEYS) {
|
|
46
|
+
const raw = statuses.get(key);
|
|
47
|
+
if (!raw)
|
|
48
|
+
continue;
|
|
49
|
+
const text = sanitizeStatusText(raw);
|
|
50
|
+
if (text)
|
|
51
|
+
return { key, text };
|
|
52
|
+
}
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
function formatSecondaryExtensionStatuses(statuses, excludedKeys) {
|
|
56
|
+
return Array.from(statuses.entries())
|
|
57
|
+
.filter(([key]) => !excludedKeys.has(key))
|
|
58
|
+
.sort(([a], [b]) => a.localeCompare(b))
|
|
59
|
+
.map(([, text]) => sanitizeStatusText(text))
|
|
60
|
+
.filter(Boolean)
|
|
61
|
+
.join(" ");
|
|
62
|
+
}
|
|
63
|
+
function formatWorkspaceCenter(cwd, sessionName) {
|
|
64
|
+
const parts = [formatCwdForFooter(cwd)];
|
|
65
|
+
if (sessionName)
|
|
66
|
+
parts.push(sessionName);
|
|
67
|
+
return parts.join(" · ");
|
|
68
|
+
}
|
|
45
69
|
/**
|
|
46
70
|
* Format a cost value for compact display.
|
|
47
|
-
* Uses fewer decimal places for larger amounts.
|
|
48
71
|
* @internal Exported for testing only.
|
|
49
72
|
*/
|
|
50
73
|
export function formatPromptCost(cost) {
|
|
@@ -57,185 +80,96 @@ export function formatPromptCost(cost) {
|
|
|
57
80
|
return `$${cost.toFixed(2)}`;
|
|
58
81
|
}
|
|
59
82
|
/**
|
|
60
|
-
* Footer component
|
|
61
|
-
* Computes token/context stats from session, gets git branch and extension statuses from provider.
|
|
83
|
+
* Footer component — one minimal status line (branch, model, context, cost).
|
|
62
84
|
*/
|
|
63
85
|
export class FooterComponent {
|
|
64
|
-
constructor(session, footerData) {
|
|
86
|
+
constructor(session, footerData, getGsdStatus) {
|
|
65
87
|
this.session = session;
|
|
66
88
|
this.footerData = footerData;
|
|
89
|
+
this.getGsdStatus = getGsdStatus;
|
|
67
90
|
this.autoCompactEnabled = true;
|
|
68
91
|
}
|
|
69
92
|
setAutoCompactEnabled(enabled) {
|
|
70
93
|
this.autoCompactEnabled = enabled;
|
|
71
94
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
* Kept for compatibility with existing call sites in interactive-mode.
|
|
75
|
-
*/
|
|
76
|
-
invalidate() {
|
|
77
|
-
// No-op: git branch is cached/invalidated by provider
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Clean up resources.
|
|
81
|
-
* Git watcher cleanup now handled by provider.
|
|
82
|
-
*/
|
|
83
|
-
dispose() {
|
|
84
|
-
// Git watcher cleanup handled by provider
|
|
85
|
-
}
|
|
95
|
+
invalidate() { }
|
|
96
|
+
dispose() { }
|
|
86
97
|
render(width) {
|
|
87
98
|
const state = this.session.state;
|
|
99
|
+
const gsdState = this.getGsdStatus?.();
|
|
88
100
|
const usageTotals = this.session.sessionManager.getUsageTotals();
|
|
89
101
|
const totalInput = usageTotals.input;
|
|
90
102
|
const totalOutput = usageTotals.output;
|
|
91
103
|
const totalCacheRead = usageTotals.cacheRead;
|
|
92
104
|
const totalCacheWrite = usageTotals.cacheWrite;
|
|
93
105
|
const totalCost = usageTotals.cost;
|
|
94
|
-
// Use activeInferenceModel during streaming to show the model actually
|
|
95
|
-
// being used, not the configured model which may have been switched mid-turn.
|
|
96
106
|
const displayModel = state.activeInferenceModel ?? state.model;
|
|
97
|
-
// Calculate context usage from session (handles compaction correctly).
|
|
98
|
-
// After compaction, tokens are unknown until the next LLM response.
|
|
99
107
|
const contextUsage = this.session.getContextUsage();
|
|
100
108
|
const contextWindow = contextUsage?.contextWindow ?? displayModel?.contextWindow ?? 0;
|
|
101
109
|
const contextPercentValue = contextUsage?.percent ?? 0;
|
|
102
|
-
const contextPercent = contextUsage?.percent !== null ? contextPercentValue.toFixed(
|
|
103
|
-
// Replace home directory with ~
|
|
104
|
-
let pwd = process.cwd();
|
|
105
|
-
const home = process.env.HOME || process.env.USERPROFILE;
|
|
106
|
-
if (home && pwd.startsWith(home)) {
|
|
107
|
-
pwd = `~${pwd.slice(home.length)}`;
|
|
108
|
-
}
|
|
109
|
-
// Add git branch if available
|
|
110
|
+
const contextPercent = contextUsage?.percent !== null ? contextPercentValue.toFixed(0) : "?";
|
|
110
111
|
const branch = this.footerData.getGitBranch();
|
|
111
|
-
|
|
112
|
-
pwd = `${pwd} (${branch})`;
|
|
113
|
-
}
|
|
114
|
-
// Add session name if set
|
|
115
|
-
const sessionName = this.session.sessionManager.getSessionName();
|
|
116
|
-
if (sessionName) {
|
|
117
|
-
pwd = `${pwd} • ${sessionName}`;
|
|
118
|
-
}
|
|
119
|
-
// Build stats line as separate groups joined by a dim middle-dot separator
|
|
120
|
-
const sep = ` ${theme.fg("dim", "\u00B7")} `;
|
|
121
|
-
// Group 1: total tokens.
|
|
122
|
-
const tokenGroup = [];
|
|
123
|
-
const totalTokens = totalInput + totalOutput + totalCacheRead + totalCacheWrite;
|
|
124
|
-
if (totalTokens > 0)
|
|
125
|
-
tokenGroup.push(formatTokens(totalTokens));
|
|
126
|
-
// Group 2: cache efficiency — cacheRead / all input-side tokens.
|
|
127
|
-
// Collapses the old cr/cw pair into a single "how much was served
|
|
128
|
-
// from cache" signal. cr/cw breakdown moved to `/stats`.
|
|
129
|
-
const cacheGroup = [];
|
|
112
|
+
const modelName = displayModel?.id || "no-model";
|
|
130
113
|
const inputSide = totalInput + totalCacheRead + totalCacheWrite;
|
|
114
|
+
let cacheSegment;
|
|
131
115
|
if (totalCacheRead > 0 && inputSide > 0) {
|
|
132
116
|
const cachedPct = Math.round((totalCacheRead / inputSide) * 100);
|
|
133
|
-
|
|
117
|
+
cacheSegment = theme.fg("success", `${cachedPct}%↺`);
|
|
134
118
|
}
|
|
135
|
-
|
|
136
|
-
const costGroup = [];
|
|
119
|
+
let costSegment;
|
|
137
120
|
const usingSubscription = displayModel ? this.session.modelRegistry.isUsingOAuth(displayModel) : false;
|
|
138
121
|
if (totalCost || usingSubscription) {
|
|
139
|
-
const
|
|
140
|
-
|
|
122
|
+
const costLabel = usingSubscription ? `$${totalCost.toFixed(2)}*` : `$${totalCost.toFixed(2)}`;
|
|
123
|
+
costSegment = theme.fg("warning", costLabel);
|
|
141
124
|
}
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
const lastTurnCost = this.session.getLastTurnCost();
|
|
145
|
-
if (lastTurnCost > 0) {
|
|
146
|
-
costGroup.push(`(last: ${formatPromptCost(lastTurnCost)})`);
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
// Group 4: context bar + percentage (mirrors /gsd auto dashboard style).
|
|
150
|
-
// Bar colors track the same thresholds as the percent text.
|
|
151
|
-
const autoIndicator = this.autoCompactEnabled ? " (auto)" : "";
|
|
125
|
+
const gsdWidgetVisible = gsdState ? isGsdStatusWidgetVisible(gsdState, width) : false;
|
|
126
|
+
const gsdSegment = gsdWidgetVisible ? undefined : badge("● GSD", "default");
|
|
152
127
|
const barColor = contextPercentValue > 90 ? "error" : contextPercentValue > 70 ? "warning" : "success";
|
|
153
|
-
const
|
|
154
|
-
const
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
const bar = theme.fg(barColor, "█".repeat(filled)) +
|
|
158
|
-
theme.fg("dim", "░".repeat(Math.max(0, BAR_WIDTH - filled)));
|
|
159
|
-
const pctText = contextPercent === "?" ? "?" : `${contextPercent}%`;
|
|
160
|
-
const suffix = `/${formatTokens(contextWindow)}${autoIndicator}`;
|
|
161
|
-
const colorizedPct = contextPercentValue > 90
|
|
162
|
-
? theme.fg("error", pctText)
|
|
163
|
-
: contextPercentValue > 70
|
|
164
|
-
? theme.fg("warning", pctText)
|
|
165
|
-
: pctText;
|
|
166
|
-
const contextPercentStr = `${bar} ${colorizedPct}${suffix}`;
|
|
167
|
-
// Assemble groups: items within a group are space-separated,
|
|
168
|
-
// groups are separated by a dim middle-dot
|
|
169
|
-
const groups = [];
|
|
170
|
-
if (tokenGroup.length > 0)
|
|
171
|
-
groups.push(tokenGroup.join(" "));
|
|
172
|
-
if (cacheGroup.length > 0)
|
|
173
|
-
groups.push(cacheGroup.join(" "));
|
|
174
|
-
if (costGroup.length > 0)
|
|
175
|
-
groups.push(costGroup.join(" "));
|
|
176
|
-
groups.push(contextPercentStr);
|
|
177
|
-
let statsLeft = groups.join(sep);
|
|
178
|
-
// Add model name on the right side, plus thinking level if model supports it
|
|
179
|
-
const modelName = displayModel?.id || "no-model";
|
|
180
|
-
let statsLeftWidth = visibleWidth(statsLeft);
|
|
181
|
-
// If statsLeft is too wide, truncate it
|
|
182
|
-
if (statsLeftWidth > width) {
|
|
183
|
-
statsLeft = truncateToWidth(statsLeft, width, "...");
|
|
184
|
-
statsLeftWidth = visibleWidth(statsLeft);
|
|
185
|
-
}
|
|
186
|
-
// Calculate available space for padding (minimum 2 spaces between stats and model)
|
|
187
|
-
const minPadding = 2;
|
|
188
|
-
// Add thinking level indicator if model supports reasoning
|
|
189
|
-
let rightSideWithoutProvider = modelName;
|
|
190
|
-
if (displayModel?.reasoning) {
|
|
191
|
-
const thinkingLevel = state.thinkingLevel || "off";
|
|
192
|
-
rightSideWithoutProvider =
|
|
193
|
-
thinkingLevel === "off" ? `${modelName} • thinking off` : `${modelName} • ${thinkingLevel}`;
|
|
194
|
-
}
|
|
195
|
-
// Prepend the provider in parentheses if there are multiple providers and there's enough room.
|
|
196
|
-
// Include the auth mode so users can tell at a glance whether the active model is
|
|
197
|
-
// API-key-backed, OAuth-backed, or delegated to a third-party CLI.
|
|
198
|
-
let rightSide = rightSideWithoutProvider;
|
|
128
|
+
const extensionStatuses = this.footerData.getExtensionStatuses();
|
|
129
|
+
const primaryStatus = gsdWidgetVisible ? pickPrimaryExtensionStatus(extensionStatuses) : undefined;
|
|
130
|
+
const secondaryExtText = formatSecondaryExtensionStatuses(extensionStatuses, primaryStatus ? new Set([primaryStatus.key]) : new Set());
|
|
131
|
+
let providerSuffix = "";
|
|
199
132
|
if (this.footerData.getAvailableProviderCount() > 1 && displayModel) {
|
|
200
133
|
const authMode = this.session.modelRegistry.getProviderAuthMode(displayModel.provider);
|
|
201
134
|
const authLabel = providerAuthBadge(authMode);
|
|
202
135
|
const providerLabel = providerDisplayName(displayModel.provider);
|
|
203
|
-
|
|
204
|
-
rightSide = `(${parenthetical}) ${rightSideWithoutProvider}`;
|
|
205
|
-
if (statsLeftWidth + minPadding + visibleWidth(rightSide) > width) {
|
|
206
|
-
// Too wide: drop the auth suffix first, then fall back to no parenthetical.
|
|
207
|
-
rightSide = `(${providerLabel}) ${rightSideWithoutProvider}`;
|
|
208
|
-
if (statsLeftWidth + minPadding + visibleWidth(rightSide) > width) {
|
|
209
|
-
rightSide = rightSideWithoutProvider;
|
|
210
|
-
}
|
|
211
|
-
}
|
|
136
|
+
providerSuffix = authLabel ? `${providerLabel} ${authLabel}` : providerLabel;
|
|
212
137
|
}
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
const
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
.join(" ")
|
|
223
|
-
: "";
|
|
224
|
-
const footerRight = [rightSide, extStatusText].filter(Boolean).join(" ");
|
|
225
|
-
const gsdSegment = theme.fg("accent", "● GSD");
|
|
226
|
-
const dimStatsLeft = theme.fg("dim", statsLeft);
|
|
227
|
-
const innerWidth = Math.max(1, width - 2);
|
|
228
|
-
const rightWidth = visibleWidth(footerRight);
|
|
229
|
-
const leftBudget = footerRight ? Math.max(1, innerWidth - rightWidth - 3) : innerWidth;
|
|
230
|
-
const sepWidth = visibleWidth(" │ ");
|
|
231
|
-
const pwdBudget = Math.max(1, leftBudget - visibleWidth(gsdSegment) - visibleWidth(dimStatsLeft) - sepWidth * 2);
|
|
232
|
-
const pwdSegment = theme.fg("dim", truncateFooterPath(pwd, pwdBudget));
|
|
138
|
+
const pctLabel = theme.fg(barColor, contextPercent === "?" ? "?" : `${contextPercent}%`);
|
|
139
|
+
const contextTokens = contextUsage?.tokens;
|
|
140
|
+
const tokenHint = contextPercent === "?" || contextTokens == null
|
|
141
|
+
? ""
|
|
142
|
+
: theme.fg("dim", ` ${formatTokens(contextTokens)}/${formatTokens(contextWindow)}`);
|
|
143
|
+
const pct = contextPercent === "?" ? 0 : contextPercentValue;
|
|
144
|
+
const contextBar = renderProgressBar(pct, 100, CONTEXT_BAR_WIDTH, barColor);
|
|
145
|
+
const autoHint = this.autoCompactEnabled ? theme.fg("dim", " (auto)") : "";
|
|
146
|
+
const contextSegment = `${contextBar} ${pctLabel}${tokenHint}${autoHint}`;
|
|
233
147
|
const leftSegments = [
|
|
234
148
|
gsdSegment,
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
];
|
|
238
|
-
|
|
149
|
+
branch ? theme.fg("dim", branch) : undefined,
|
|
150
|
+
theme.fg("text", modelName),
|
|
151
|
+
].filter((segment) => !!segment);
|
|
152
|
+
const rightSegments = [
|
|
153
|
+
contextSegment,
|
|
154
|
+
cacheSegment,
|
|
155
|
+
costSegment,
|
|
156
|
+
providerSuffix ? theme.fg("dim", providerSuffix) : undefined,
|
|
157
|
+
secondaryExtText ? theme.fg("dim", secondaryExtText) : undefined,
|
|
158
|
+
].filter((segment) => !!segment);
|
|
159
|
+
const cwd = gsdState?.cwd ?? process.cwd();
|
|
160
|
+
const sessionName = this.session.sessionManager.getSessionName() ?? gsdState?.sessionName;
|
|
161
|
+
const centerSource = gsdWidgetVisible
|
|
162
|
+
? primaryStatus?.text
|
|
163
|
+
: formatWorkspaceCenter(cwd, sessionName);
|
|
164
|
+
const line = layoutFullWidthMinimalFooter(leftSegments, rightSegments, width, (budget) => {
|
|
165
|
+
if (!centerSource)
|
|
166
|
+
return "";
|
|
167
|
+
const styled = gsdWidgetVisible
|
|
168
|
+
? theme.fg("text", centerSource)
|
|
169
|
+
: theme.fg("dim", centerSource);
|
|
170
|
+
return truncateToWidth(styled, budget, "…");
|
|
171
|
+
});
|
|
172
|
+
return renderMinimalFooterLine(line, width);
|
|
239
173
|
}
|
|
240
174
|
}
|
|
241
175
|
//# sourceMappingURL=footer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"footer.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/footer.ts"],"names":[],"mappings":"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","sourcesContent":["// Project/App: gsd-pi\n// File Purpose: Interactive terminal footer renderer for workspace, model, usage, context, and extension status.\n\nimport { type Component, truncateToWidth, visibleWidth } from \"@gsd/pi-tui\";\nimport type { AgentSession } from \"@gsd/agent-core\";\nimport type { ReadonlyFooterDataProvider } from \"@gsd/pi-coding-agent/core/footer-data-provider.js\";\nimport { theme } from \"@gsd/pi-coding-agent/theme/theme.js\";\nimport { providerAuthBadge, providerDisplayName } from \"./model-selector.js\";\nimport { renderFooterStrip } from \"./transcript-design.js\";\n\n/**\n * Sanitize text for display in a single-line status.\n * Removes newlines, tabs, carriage returns, and other control characters.\n */\nfunction sanitizeStatusText(text: string): string {\n\t// Replace newlines, tabs, carriage returns with space, then collapse multiple spaces\n\treturn text\n\t\t.replace(/[\\r\\n\\t]/g, \" \")\n\t\t.replace(/ +/g, \" \")\n\t\t.trim();\n}\n\nfunction truncateFooterPath(text: string, width: number): string {\n\tif (visibleWidth(text) <= width) return text;\n\tconst tailMatch = text.match(/( \\([^)]+\\)(?: • .*)?)$/);\n\tif (!tailMatch) return truncateToWidth(text, width, \"...\");\n\tconst tail = tailMatch[1];\n\tconst tailWidth = visibleWidth(tail);\n\tif (tailWidth >= width - 4) return truncateToWidth(text, width, \"...\");\n\tconst head = text.slice(0, -tail.length);\n\treturn `${truncateToWidth(head, width - tailWidth, \"...\")}${tail}`;\n}\n\n/**\n * Format token counts (similar to web-ui)\n */\nfunction formatTokens(count: number): string {\n\tif (count < 1000) return count.toString();\n\tif (count < 10000) return `${(count / 1000).toFixed(1)}k`;\n\tif (count < 1000000) return `${Math.round(count / 1000)}k`;\n\tif (count < 10000000) return `${(count / 1000000).toFixed(1)}M`;\n\treturn `${Math.round(count / 1000000)}M`;\n}\n\n/**\n * Format a cost value for compact display.\n * Uses fewer decimal places for larger amounts.\n * @internal Exported for testing only.\n */\nexport function formatPromptCost(cost: number): string {\n\tif (cost < 0.001) return `$${cost.toFixed(4)}`;\n\tif (cost < 0.01) return `$${cost.toFixed(3)}`;\n\tif (cost < 1) return `$${cost.toFixed(3)}`;\n\treturn `$${cost.toFixed(2)}`;\n}\n\n/**\n * Footer component that shows pwd, token stats, and context usage.\n * Computes token/context stats from session, gets git branch and extension statuses from provider.\n */\nexport class FooterComponent implements Component {\n\tprivate autoCompactEnabled = true;\n\n\tconstructor(\n\t\tprivate session: AgentSession,\n\t\tprivate footerData: ReadonlyFooterDataProvider,\n\t) {}\n\n\tsetAutoCompactEnabled(enabled: boolean): void {\n\t\tthis.autoCompactEnabled = enabled;\n\t}\n\n\t/**\n\t * No-op: git branch caching now handled by provider.\n\t * Kept for compatibility with existing call sites in interactive-mode.\n\t */\n\tinvalidate(): void {\n\t\t// No-op: git branch is cached/invalidated by provider\n\t}\n\n\t/**\n\t * Clean up resources.\n\t * Git watcher cleanup now handled by provider.\n\t */\n\tdispose(): void {\n\t\t// Git watcher cleanup handled by provider\n\t}\n\n\trender(width: number): string[] {\n\t\tconst state = this.session.state;\n\n\t\tconst usageTotals = this.session.sessionManager.getUsageTotals();\n\t\tconst totalInput = usageTotals.input;\n\t\tconst totalOutput = usageTotals.output;\n\t\tconst totalCacheRead = usageTotals.cacheRead;\n\t\tconst totalCacheWrite = usageTotals.cacheWrite;\n\t\tconst totalCost = usageTotals.cost;\n\n\t\t// Use activeInferenceModel during streaming to show the model actually\n\t\t// being used, not the configured model which may have been switched mid-turn.\n\t\tconst displayModel = state.activeInferenceModel ?? state.model;\n\n\t\t// Calculate context usage from session (handles compaction correctly).\n\t\t// After compaction, tokens are unknown until the next LLM response.\n\t\tconst contextUsage = this.session.getContextUsage();\n\t\tconst contextWindow = contextUsage?.contextWindow ?? displayModel?.contextWindow ?? 0;\n\t\tconst contextPercentValue = contextUsage?.percent ?? 0;\n\t\tconst contextPercent = contextUsage?.percent !== null ? contextPercentValue.toFixed(1) : \"?\";\n\n\t\t// Replace home directory with ~\n\t\tlet pwd = process.cwd();\n\t\tconst home = process.env.HOME || process.env.USERPROFILE;\n\t\tif (home && pwd.startsWith(home)) {\n\t\t\tpwd = `~${pwd.slice(home.length)}`;\n\t\t}\n\n\t\t// Add git branch if available\n\t\tconst branch = this.footerData.getGitBranch();\n\t\tif (branch) {\n\t\t\tpwd = `${pwd} (${branch})`;\n\t\t}\n\n\t\t// Add session name if set\n\t\tconst sessionName = this.session.sessionManager.getSessionName();\n\t\tif (sessionName) {\n\t\t\tpwd = `${pwd} • ${sessionName}`;\n\t\t}\n\n\t\t// Build stats line as separate groups joined by a dim middle-dot separator\n\t\tconst sep = ` ${theme.fg(\"dim\", \"\\u00B7\")} `;\n\n\t\t// Group 1: total tokens.\n\t\tconst tokenGroup: string[] = [];\n\t\tconst totalTokens = totalInput + totalOutput + totalCacheRead + totalCacheWrite;\n\t\tif (totalTokens > 0) tokenGroup.push(formatTokens(totalTokens));\n\n\t\t// Group 2: cache efficiency — cacheRead / all input-side tokens.\n\t\t// Collapses the old cr/cw pair into a single \"how much was served\n\t\t// from cache\" signal. cr/cw breakdown moved to `/stats`.\n\t\tconst cacheGroup: string[] = [];\n\t\tconst inputSide = totalInput + totalCacheRead + totalCacheWrite;\n\t\tif (totalCacheRead > 0 && inputSide > 0) {\n\t\t\tconst cachedPct = Math.round((totalCacheRead / inputSide) * 100);\n\t\t\tcacheGroup.push(`${cachedPct}% cached`);\n\t\t}\n\n\t\t// Group 3: cost\n\t\tconst costGroup: string[] = [];\n\t\tconst usingSubscription = displayModel ? this.session.modelRegistry.isUsingOAuth(displayModel) : false;\n\t\tif (totalCost || usingSubscription) {\n\t\t\tconst costStr = `$${totalCost.toFixed(3)}${usingSubscription ? \" (sub)\" : \"\"}`;\n\t\t\tcostGroup.push(costStr);\n\t\t}\n\n\t\t// Per-prompt cost annotation (opt-in via show_token_cost preference, #1515)\n\t\tif (process.env.GSD_SHOW_TOKEN_COST === \"1\") {\n\t\t\tconst lastTurnCost = this.session.getLastTurnCost();\n\t\t\tif (lastTurnCost > 0) {\n\t\t\t\tcostGroup.push(`(last: ${formatPromptCost(lastTurnCost)})`);\n\t\t\t}\n\t\t}\n\n\t\t// Group 4: context bar + percentage (mirrors /gsd auto dashboard style).\n\t\t// Bar colors track the same thresholds as the percent text.\n\t\tconst autoIndicator = this.autoCompactEnabled ? \" (auto)\" : \"\";\n\t\tconst barColor: \"error\" | \"warning\" | \"success\" =\n\t\t\tcontextPercentValue > 90 ? \"error\" : contextPercentValue > 70 ? \"warning\" : \"success\";\n\t\tconst BAR_WIDTH = 8;\n\t\tconst filled = contextUsage?.percent !== null\n\t\t\t? Math.max(0, Math.min(BAR_WIDTH, Math.round((contextPercentValue / 100) * BAR_WIDTH)))\n\t\t\t: 0;\n\t\tconst bar =\n\t\t\ttheme.fg(barColor, \"█\".repeat(filled)) +\n\t\t\ttheme.fg(\"dim\", \"░\".repeat(Math.max(0, BAR_WIDTH - filled)));\n\t\tconst pctText = contextPercent === \"?\" ? \"?\" : `${contextPercent}%`;\n\t\tconst suffix = `/${formatTokens(contextWindow)}${autoIndicator}`;\n\t\tconst colorizedPct =\n\t\t\tcontextPercentValue > 90\n\t\t\t\t? theme.fg(\"error\", pctText)\n\t\t\t\t: contextPercentValue > 70\n\t\t\t\t\t? theme.fg(\"warning\", pctText)\n\t\t\t\t\t: pctText;\n\t\tconst contextPercentStr = `${bar} ${colorizedPct}${suffix}`;\n\n\t\t// Assemble groups: items within a group are space-separated,\n\t\t// groups are separated by a dim middle-dot\n\t\tconst groups: string[] = [];\n\t\tif (tokenGroup.length > 0) groups.push(tokenGroup.join(\" \"));\n\t\tif (cacheGroup.length > 0) groups.push(cacheGroup.join(\" \"));\n\t\tif (costGroup.length > 0) groups.push(costGroup.join(\" \"));\n\t\tgroups.push(contextPercentStr);\n\n\t\tlet statsLeft = groups.join(sep);\n\n\t\t// Add model name on the right side, plus thinking level if model supports it\n\t\tconst modelName = displayModel?.id || \"no-model\";\n\n\t\tlet statsLeftWidth = visibleWidth(statsLeft);\n\n\t\t// If statsLeft is too wide, truncate it\n\t\tif (statsLeftWidth > width) {\n\t\t\tstatsLeft = truncateToWidth(statsLeft, width, \"...\");\n\t\t\tstatsLeftWidth = visibleWidth(statsLeft);\n\t\t}\n\n\t\t// Calculate available space for padding (minimum 2 spaces between stats and model)\n\t\tconst minPadding = 2;\n\n\t\t// Add thinking level indicator if model supports reasoning\n\t\tlet rightSideWithoutProvider = modelName;\n\t\tif (displayModel?.reasoning) {\n\t\t\tconst thinkingLevel = state.thinkingLevel || \"off\";\n\t\t\trightSideWithoutProvider =\n\t\t\t\tthinkingLevel === \"off\" ? `${modelName} • thinking off` : `${modelName} • ${thinkingLevel}`;\n\t\t}\n\n\t\t// Prepend the provider in parentheses if there are multiple providers and there's enough room.\n\t\t// Include the auth mode so users can tell at a glance whether the active model is\n\t\t// API-key-backed, OAuth-backed, or delegated to a third-party CLI.\n\t\tlet rightSide = rightSideWithoutProvider;\n\t\tif (this.footerData.getAvailableProviderCount() > 1 && displayModel) {\n\t\t\tconst authMode = this.session.modelRegistry.getProviderAuthMode(displayModel.provider);\n\t\t\tconst authLabel = providerAuthBadge(authMode);\n\t\t\tconst providerLabel = providerDisplayName(displayModel.provider);\n\t\t\tconst parenthetical = authLabel ? `${providerLabel} · ${authLabel}` : providerLabel;\n\t\t\trightSide = `(${parenthetical}) ${rightSideWithoutProvider}`;\n\t\t\tif (statsLeftWidth + minPadding + visibleWidth(rightSide) > width) {\n\t\t\t\t// Too wide: drop the auth suffix first, then fall back to no parenthetical.\n\t\t\t\trightSide = `(${providerLabel}) ${rightSideWithoutProvider}`;\n\t\t\t\tif (statsLeftWidth + minPadding + visibleWidth(rightSide) > width) {\n\t\t\t\t\trightSide = rightSideWithoutProvider;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Extension statuses right-aligned on the pwd line (sorted by key).\n\t\t// Keeps the footer compact by avoiding a dedicated row when the content\n\t\t// fits alongside pwd. Falls back to pwd-only if the combined line would\n\t\t// exceed width.\n\t\tconst extensionStatuses = this.footerData.getExtensionStatuses();\n\t\tconst extStatusText =\n\t\t\textensionStatuses.size > 0\n\t\t\t\t? Array.from(extensionStatuses.entries())\n\t\t\t\t\t\t.sort(([a], [b]) => a.localeCompare(b))\n\t\t\t\t\t\t.map(([, text]) => sanitizeStatusText(text))\n\t\t\t\t\t\t.join(\" \")\n\t\t\t\t: \"\";\n\n\t\tconst footerRight = [rightSide, extStatusText].filter(Boolean).join(\" \");\n\t\tconst gsdSegment = theme.fg(\"accent\", \"● GSD\");\n\t\tconst dimStatsLeft = theme.fg(\"dim\", statsLeft);\n\t\tconst innerWidth = Math.max(1, width - 2);\n\t\tconst rightWidth = visibleWidth(footerRight);\n\t\tconst leftBudget = footerRight ? Math.max(1, innerWidth - rightWidth - 3) : innerWidth;\n\t\tconst sepWidth = visibleWidth(\" │ \");\n\t\tconst pwdBudget = Math.max(1, leftBudget - visibleWidth(gsdSegment) - visibleWidth(dimStatsLeft) - sepWidth * 2);\n\t\tconst pwdSegment = theme.fg(\"dim\", truncateFooterPath(pwd, pwdBudget));\n\n\t\tconst leftSegments = [\n\t\t\tgsdSegment,\n\t\t\tpwdSegment,\n\t\t\tdimStatsLeft,\n\t\t];\n\t\treturn renderFooterStrip(leftSegments, footerRight, width);\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"footer.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/footer.ts"],"names":[],"mappings":"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","sourcesContent":["// Project/App: gsd-pi\n// File Purpose: Interactive terminal footer renderer for workspace, model, usage, context, and extension status.\n\nimport { type Component, truncateToWidth } from \"@gsd/pi-tui\";\nimport type { AgentSession } from \"@gsd/agent-core\";\nimport type { ReadonlyFooterDataProvider } from \"@gsd/pi-coding-agent/core/footer-data-provider.js\";\nimport { theme } from \"@gsd/pi-coding-agent/theme/theme.js\";\nimport { providerAuthBadge, providerDisplayName } from \"./model-selector.js\";\nimport {\n\tbadge,\n\tlayoutFullWidthMinimalFooter,\n\trenderMinimalFooterLine,\n\trenderProgressBar,\n} from \"./transcript-design.js\";\nimport type { GsdStatusWidgetState } from \"./gsd-status-widget.js\";\nimport { isGsdStatusWidgetVisible } from \"./gsd-status-widget.js\";\n\nconst CONTEXT_BAR_WIDTH = 6;\n\n/** Extension status keys shown in the footer center when the GSD strip is visible. */\nconst PRIMARY_STATUS_KEYS = [\"gsd-step\", \"zz-notifications\", \"gsd-fast\"] as const;\n\nfunction sanitizeStatusText(text: string): string {\n\treturn text\n\t\t.replace(/[\\r\\n\\t]/g, \" \")\n\t\t.replace(/ +/g, \" \")\n\t\t.trim();\n}\n\nfunction formatTokens(count: number): string {\n\tif (count < 1000) return count.toString();\n\tif (count < 10000) return `${(count / 1000).toFixed(1)}k`;\n\tif (count < 1000000) return `${Math.round(count / 1000)}k`;\n\tif (count < 10000000) return `${(count / 1000000).toFixed(1)}M`;\n\treturn `${Math.round(count / 1000000)}M`;\n}\n\n/**\n * Abbreviate cwd for the footer — `~` for home and descendants only.\n * @internal Exported for testing only.\n */\nexport function formatCwdForFooter(cwd: string, home = process.env.HOME ?? process.env.USERPROFILE ?? \"\"): string {\n\tif (!home) return cwd;\n\tif (cwd === home) return \"~\";\n\tconst withForwardSep = home.endsWith(\"/\") ? home : `${home}/`;\n\tconst withBackSep = home.endsWith(\"\\\\\") ? home : `${home}\\\\`;\n\tif (cwd.startsWith(withForwardSep) || cwd.startsWith(withBackSep)) {\n\t\treturn `~${cwd.slice(home.length)}`;\n\t}\n\treturn cwd;\n}\n\nfunction pickPrimaryExtensionStatus(\n\tstatuses: ReadonlyMap<string, string>,\n): { key: string; text: string } | undefined {\n\tfor (const key of PRIMARY_STATUS_KEYS) {\n\t\tconst raw = statuses.get(key);\n\t\tif (!raw) continue;\n\t\tconst text = sanitizeStatusText(raw);\n\t\tif (text) return { key, text };\n\t}\n\treturn undefined;\n}\n\nfunction formatSecondaryExtensionStatuses(\n\tstatuses: ReadonlyMap<string, string>,\n\texcludedKeys: ReadonlySet<string>,\n): string {\n\treturn Array.from(statuses.entries())\n\t\t.filter(([key]) => !excludedKeys.has(key))\n\t\t.sort(([a], [b]) => a.localeCompare(b))\n\t\t.map(([, text]) => sanitizeStatusText(text))\n\t\t.filter(Boolean)\n\t\t.join(\" \");\n}\n\nfunction formatWorkspaceCenter(cwd: string, sessionName?: string): string {\n\tconst parts = [formatCwdForFooter(cwd)];\n\tif (sessionName) parts.push(sessionName);\n\treturn parts.join(\" · \");\n}\n\n/**\n * Format a cost value for compact display.\n * @internal Exported for testing only.\n */\nexport function formatPromptCost(cost: number): string {\n\tif (cost < 0.001) return `$${cost.toFixed(4)}`;\n\tif (cost < 0.01) return `$${cost.toFixed(3)}`;\n\tif (cost < 1) return `$${cost.toFixed(3)}`;\n\treturn `$${cost.toFixed(2)}`;\n}\n\n/**\n * Footer component — one minimal status line (branch, model, context, cost).\n */\nexport class FooterComponent implements Component {\n\tprivate autoCompactEnabled = true;\n\n\tconstructor(\n\t\tprivate session: AgentSession,\n\t\tprivate footerData: ReadonlyFooterDataProvider,\n\t\tprivate readonly getGsdStatus?: () => GsdStatusWidgetState,\n\t) {}\n\n\tsetAutoCompactEnabled(enabled: boolean): void {\n\t\tthis.autoCompactEnabled = enabled;\n\t}\n\n\tinvalidate(): void {}\n\n\tdispose(): void {}\n\n\trender(width: number): string[] {\n\t\tconst state = this.session.state;\n\t\tconst gsdState = this.getGsdStatus?.();\n\n\t\tconst usageTotals = this.session.sessionManager.getUsageTotals();\n\t\tconst totalInput = usageTotals.input;\n\t\tconst totalOutput = usageTotals.output;\n\t\tconst totalCacheRead = usageTotals.cacheRead;\n\t\tconst totalCacheWrite = usageTotals.cacheWrite;\n\t\tconst totalCost = usageTotals.cost;\n\n\t\tconst displayModel = state.activeInferenceModel ?? state.model;\n\t\tconst contextUsage = this.session.getContextUsage();\n\t\tconst contextWindow = contextUsage?.contextWindow ?? displayModel?.contextWindow ?? 0;\n\t\tconst contextPercentValue = contextUsage?.percent ?? 0;\n\t\tconst contextPercent = contextUsage?.percent !== null ? contextPercentValue.toFixed(0) : \"?\";\n\n\t\tconst branch = this.footerData.getGitBranch();\n\t\tconst modelName = displayModel?.id || \"no-model\";\n\n\t\tconst inputSide = totalInput + totalCacheRead + totalCacheWrite;\n\t\tlet cacheSegment: string | undefined;\n\t\tif (totalCacheRead > 0 && inputSide > 0) {\n\t\t\tconst cachedPct = Math.round((totalCacheRead / inputSide) * 100);\n\t\t\tcacheSegment = theme.fg(\"success\", `${cachedPct}%↺`);\n\t\t}\n\n\t\tlet costSegment: string | undefined;\n\t\tconst usingSubscription = displayModel ? this.session.modelRegistry.isUsingOAuth(displayModel) : false;\n\t\tif (totalCost || usingSubscription) {\n\t\t\tconst costLabel = usingSubscription ? `$${totalCost.toFixed(2)}*` : `$${totalCost.toFixed(2)}`;\n\t\t\tcostSegment = theme.fg(\"warning\", costLabel);\n\t\t}\n\n\t\tconst gsdWidgetVisible = gsdState ? isGsdStatusWidgetVisible(gsdState, width) : false;\n\t\tconst gsdSegment = gsdWidgetVisible ? undefined : badge(\"● GSD\", \"default\");\n\n\t\tconst barColor: \"error\" | \"warning\" | \"success\" =\n\t\t\tcontextPercentValue > 90 ? \"error\" : contextPercentValue > 70 ? \"warning\" : \"success\";\n\n\t\tconst extensionStatuses = this.footerData.getExtensionStatuses();\n\t\tconst primaryStatus = gsdWidgetVisible ? pickPrimaryExtensionStatus(extensionStatuses) : undefined;\n\t\tconst secondaryExtText = formatSecondaryExtensionStatuses(\n\t\t\textensionStatuses,\n\t\t\tprimaryStatus ? new Set([primaryStatus.key]) : new Set(),\n\t\t);\n\n\t\tlet providerSuffix = \"\";\n\t\tif (this.footerData.getAvailableProviderCount() > 1 && displayModel) {\n\t\t\tconst authMode = this.session.modelRegistry.getProviderAuthMode(displayModel.provider);\n\t\t\tconst authLabel = providerAuthBadge(authMode);\n\t\t\tconst providerLabel = providerDisplayName(displayModel.provider);\n\t\t\tproviderSuffix = authLabel ? `${providerLabel} ${authLabel}` : providerLabel;\n\t\t}\n\n\t\tconst pctLabel = theme.fg(barColor, contextPercent === \"?\" ? \"?\" : `${contextPercent}%`);\n\t\tconst contextTokens = contextUsage?.tokens;\n\t\tconst tokenHint =\n\t\t\tcontextPercent === \"?\" || contextTokens == null\n\t\t\t\t? \"\"\n\t\t\t\t: theme.fg(\"dim\", ` ${formatTokens(contextTokens)}/${formatTokens(contextWindow)}`);\n\t\tconst pct = contextPercent === \"?\" ? 0 : contextPercentValue;\n\t\tconst contextBar = renderProgressBar(pct, 100, CONTEXT_BAR_WIDTH, barColor);\n\t\tconst autoHint = this.autoCompactEnabled ? theme.fg(\"dim\", \" (auto)\") : \"\";\n\t\tconst contextSegment = `${contextBar} ${pctLabel}${tokenHint}${autoHint}`;\n\n\t\tconst leftSegments = [\n\t\t\tgsdSegment,\n\t\t\tbranch ? theme.fg(\"dim\", branch) : undefined,\n\t\t\ttheme.fg(\"text\", modelName),\n\t\t].filter((segment): segment is string => !!segment);\n\n\t\tconst rightSegments = [\n\t\t\tcontextSegment,\n\t\t\tcacheSegment,\n\t\t\tcostSegment,\n\t\t\tproviderSuffix ? theme.fg(\"dim\", providerSuffix) : undefined,\n\t\t\tsecondaryExtText ? theme.fg(\"dim\", secondaryExtText) : undefined,\n\t\t].filter((segment): segment is string => !!segment);\n\n\t\tconst cwd = gsdState?.cwd ?? process.cwd();\n\t\tconst sessionName = this.session.sessionManager.getSessionName() ?? gsdState?.sessionName;\n\t\tconst centerSource = gsdWidgetVisible\n\t\t\t? primaryStatus?.text\n\t\t\t: formatWorkspaceCenter(cwd, sessionName);\n\n\t\tconst line = layoutFullWidthMinimalFooter(leftSegments, rightSegments, width, (budget) => {\n\t\t\tif (!centerSource) return \"\";\n\t\t\tconst styled = gsdWidgetVisible\n\t\t\t\t? theme.fg(\"text\", centerSource)\n\t\t\t\t: theme.fg(\"dim\", centerSource);\n\t\t\treturn truncateToWidth(styled, budget, \"…\");\n\t\t});\n\n\t\treturn renderMinimalFooterLine(line, width);\n\t}\n}\n"]}
|
package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gsd-progress-state.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/gsd-progress-state.ts"],"names":[],"mappings":"AAGA,YAAY,EACX,gBAAgB,EAChB,qBAAqB,GACrB,MAAM,+CAA+C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gsd-progress-state.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/gsd-progress-state.ts"],"names":[],"mappings":"AAAA,sBAAsB;AACtB,yFAAyF","sourcesContent":["// Project/App: gsd-pi\n// File Purpose: Re-export structured GSD progress types for interactive mode components.\n\nexport type {\n\tGsdProgressState,\n\tGsdProgressWidgetMode,\n} from \"@gsd/pi-coding-agent/core/extensions/index.js\";\n"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type Component } from "@gsd/pi-tui";
|
|
2
|
+
import type { AdaptiveLayoutState } from "./adaptive-layout.js";
|
|
3
|
+
import type { GsdProgressState } from "./gsd-progress-state.js";
|
|
4
|
+
export interface GsdStatusWidgetState extends AdaptiveLayoutState {
|
|
5
|
+
/**
|
|
6
|
+
* `undefined` — not yet toggled, use widgetMode default.
|
|
7
|
+
* `true` — user explicitly expanded (overrides widgetMode: "min").
|
|
8
|
+
* `false` — user explicitly collapsed (overrides widgetMode: "full").
|
|
9
|
+
*/
|
|
10
|
+
manuallyExpanded: boolean | undefined;
|
|
11
|
+
gsdProgress?: GsdProgressState;
|
|
12
|
+
/** True while the agent turn is in flight (model thinking, tools, etc.). */
|
|
13
|
+
isStreaming?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export declare function isGsdStatusWidgetVisible(state: GsdStatusWidgetState, width: number): boolean;
|
|
16
|
+
export declare class GsdStatusWidget implements Component {
|
|
17
|
+
private readonly getState;
|
|
18
|
+
constructor(getState: () => GsdStatusWidgetState);
|
|
19
|
+
invalidate(): void;
|
|
20
|
+
render(width: number): string[];
|
|
21
|
+
}
|
|
22
|
+
export declare function gsdStatusCollapsedLine(state: GsdStatusWidgetState, width: number): string | undefined;
|
|
23
|
+
//# sourceMappingURL=gsd-status-widget.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gsd-status-widget.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/gsd-status-widget.ts"],"names":[],"mappings":"AAGA,OAAO,EAAc,KAAK,SAAS,EAA6B,MAAM,aAAa,CAAC;AAEpF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAIhE,MAAM,WAAW,oBAAqB,SAAQ,mBAAmB;IAChE;;;;OAIG;IACH,gBAAgB,EAAE,OAAO,GAAG,SAAS,CAAC;IACtC,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,4EAA4E;IAC5E,WAAW,CAAC,EAAE,OAAO,CAAC;CACtB;AA6BD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,oBAAoB,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAE5F;AA4GD,qBAAa,eAAgB,YAAW,SAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,MAAM,oBAAoB;IAEjE,UAAU,IAAI,IAAI;IAElB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;CAmD/B;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,oBAAoB,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAIrG"}
|