@opengsd/gsd-pi 1.2.0-dev.9ad8ae33 → 1.2.0-dev.a6376d75
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 +1 -18
- package/dist/loader.js +6 -4
- package/dist/register-agent-bundles.d.ts +11 -2
- package/dist/register-agent-bundles.js +18 -4
- 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/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 +85 -15
- 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 +534 -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-worktree.js +1 -1
- package/dist/resources/extensions/gsd/auto.js +15 -1
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -7
- package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
- package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
- package/dist/resources/extensions/gsd/db/queries.js +30 -0
- package/dist/resources/extensions/gsd/doctor-environment.js +256 -125
- 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/milestone-settlement.js +2 -2
- package/dist/resources/extensions/gsd/notifications.js +12 -7
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/execute-task.md +2 -1
- package/dist/resources/extensions/gsd/prompts/run-uat.md +2 -0
- package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
- package/dist/resources/extensions/gsd/skill-activation.js +3 -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/unit-context-composer.js +1 -1
- package/dist/resources/extensions/gsd/unit-registry.js +34 -4
- 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-safety.js +28 -26
- package/dist/resources/extensions/mcp-client/manager.js +6 -1
- 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 +8 -8
- 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/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 +8 -8
- 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/package.json +2 -2
- 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 +6 -4
- 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/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/tool-execution.d.ts +8 -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 +50 -6
- 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 +2 -0
- 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 +34 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +1 -0
- 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 +12 -0
- 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/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 +452 -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 +43 -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/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/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 +7 -7
- package/packages/pi-tui/dist/index.d.ts +1 -1
- package/packages/pi-tui/dist/index.d.ts.map +1 -1
- package/packages/pi-tui/dist/index.js +1 -1
- 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/tui.d.ts +8 -0
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +63 -18
- 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/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/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 +95 -15
- 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 +704 -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-worktree.ts +1 -1
- package/src/resources/extensions/gsd/auto.ts +20 -1
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +56 -6
- package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
- package/src/resources/extensions/gsd/db/queries.ts +29 -0
- package/src/resources/extensions/gsd/doctor-environment.ts +267 -142
- 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/milestone-settlement.ts +2 -2
- package/src/resources/extensions/gsd/notifications.ts +13 -6
- package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/execute-task.md +2 -1
- package/src/resources/extensions/gsd/prompts/run-uat.md +2 -0
- package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
- package/src/resources/extensions/gsd/skill-activation.ts +3 -6
- 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-loop.test.ts +206 -22
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +76 -12
- 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 +77 -1
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
- 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 +36 -0
- package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
- 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/guided-dispatch-root.test.ts +16 -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/journal-integration.test.ts +47 -16
- 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/notifications.test.ts +64 -9
- 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/prompt-contracts.test.ts +10 -2
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
- package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +7 -1
- 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/stop-auto-race-null-unit.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/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-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/tool-surface-readiness.ts +126 -19
- package/src/resources/extensions/gsd/tools/complete-task.ts +87 -0
- 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-mcp-auto-prep.ts +2 -0
- package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
- package/src/resources/extensions/gsd/worktree-safety.ts +41 -39
- package/src/resources/extensions/mcp-client/manager.ts +7 -1
- /package/dist/web/standalone/.next/static/{FBNo5cT_chy7YNoAQsU3o → xyMkEaICFHJoa98VgJyzY}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{FBNo5cT_chy7YNoAQsU3o → xyMkEaICFHJoa98VgJyzY}/_ssgManifest.js +0 -0
|
@@ -38,6 +38,7 @@ export function showSettingsSelector(host) {
|
|
|
38
38
|
availableThemes: getAvailableThemes(),
|
|
39
39
|
hideThinkingBlock: host.hideThinkingBlock,
|
|
40
40
|
toolsExpanded: host.toolOutputExpanded,
|
|
41
|
+
toolRailAnimation: host.settingsManager.getToolRailAnimation(),
|
|
41
42
|
collapseChangelog: host.settingsManager.getCollapseChangelog(),
|
|
42
43
|
doubleEscapeAction: host.settingsManager.getDoubleEscapeAction(),
|
|
43
44
|
treeFilterMode: host.settingsManager.getTreeFilterMode(),
|
|
@@ -119,6 +120,9 @@ export function showSettingsSelector(host) {
|
|
|
119
120
|
host.settingsManager.setToolsExpanded(expanded);
|
|
120
121
|
host.setToolsExpanded(expanded);
|
|
121
122
|
},
|
|
123
|
+
onToolRailAnimationChange: (enabled) => {
|
|
124
|
+
host.setToolRailAnimation(enabled);
|
|
125
|
+
},
|
|
122
126
|
onCollapseChangelogChange: (collapsed) => {
|
|
123
127
|
host.settingsManager.setCollapseChangelog(collapsed);
|
|
124
128
|
},
|
package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactive-selectors-settings.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-selectors-settings.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 { Loader, Spacer } from \"@gsd/pi-tui\";\nimport type { Component } from \"@gsd/pi-tui\";\nimport type { Model, OAuthProviderId } from \"@gsd/pi-ai\";\nimport { getAuthPath } from \"@gsd/pi-coding-agent/config.js\";\nimport { resolveModelScope } from \"@gsd/pi-coding-agent/core/model-resolver.js\";\nimport { SessionManager } from \"@gsd/pi-coding-agent/core/session-manager.js\";\nimport { getAvailableThemes, setRegisteredThemes, setTheme, theme } from \"@gsd/pi-coding-agent/theme/theme.js\";\nimport { appKey } from \"./components/keybinding-hints.js\";\nimport { LoginDialogComponent } from \"./components/login-dialog.js\";\nimport { ModelSelectorComponent } from \"./components/model-selector.js\";\nimport { OAuthSelectorComponent } from \"./components/oauth-selector.js\";\nimport { ProviderManagerComponent } from \"./components/provider-manager.js\";\nimport { ScopedModelsSelectorComponent } from \"./components/scoped-models-selector.js\";\nimport { SessionSelectorComponent } from \"./components/session-selector.js\";\nimport { SettingsSelectorComponent } from \"./components/settings-selector.js\";\nimport { ToolExecutionComponent } from \"./components/tool-execution.js\";\nimport { TreeSelectorComponent } from \"./components/tree-selector.js\";\nimport { UserMessageSelectorComponent } from \"./components/user-message-selector.js\";\nimport { AssistantMessageComponent } from \"./components/assistant-message.js\";\nimport {\n findExactModelMatch as findExactModelMatchController,\n getModelCandidates as getModelCandidatesController,\n handleModelCommand as handleModelCommandController,\n updateAvailableProviderCount as updateAvailableProviderCountController,\n} from \"./controllers/model-controller.js\";\nimport type { InteractiveModeDelegateHost } from \"./interactive-mode-delegate-host.js\";\n\n\nimport { Loader, Spacer } from \"@gsd/pi-tui\";\nimport type { Component } from \"@gsd/pi-tui\";\nimport type { Model, OAuthProviderId } from \"@gsd/pi-ai\";\nimport { getAuthPath } from \"@gsd/pi-coding-agent/config.js\";\nimport { resolveModelScope } from \"@gsd/pi-coding-agent/core/model-resolver.js\";\nimport { SessionManager } from \"@gsd/pi-coding-agent/core/session-manager.js\";\nimport { getAvailableThemes, setRegisteredThemes, setTheme, theme } from \"@gsd/pi-coding-agent/theme/theme.js\";\nimport { appKey } from \"./components/keybinding-hints.js\";\nimport { LoginDialogComponent } from \"./components/login-dialog.js\";\nimport { ModelSelectorComponent } from \"./components/model-selector.js\";\nimport { OAuthSelectorComponent } from \"./components/oauth-selector.js\";\nimport { ProviderManagerComponent } from \"./components/provider-manager.js\";\nimport { ScopedModelsSelectorComponent } from \"./components/scoped-models-selector.js\";\nimport { SessionSelectorComponent } from \"./components/session-selector.js\";\nimport { SettingsSelectorComponent } from \"./components/settings-selector.js\";\nimport { ToolExecutionComponent } from \"./components/tool-execution.js\";\nimport { TreeSelectorComponent } from \"./components/tree-selector.js\";\nimport { UserMessageSelectorComponent } from \"./components/user-message-selector.js\";\nimport { AssistantMessageComponent } from \"./components/assistant-message.js\";\nimport {\n\tfindExactModelMatch as findExactModelMatchController,\n\tgetModelCandidates as getModelCandidatesController,\n\thandleModelCommand as handleModelCommandController,\n\tupdateAvailableProviderCount as updateAvailableProviderCountController,\n} from \"./controllers/model-controller.js\";\nimport type { InteractiveModeDelegateHost } from \"./interactive-mode-delegate-host.js\";\n\nexport function showSelector(host: InteractiveModeDelegateHost, create: (done: () => void) => { component: Component; focus: Component }): void {\n\t\tconst done = () => {\n\t\t\thost.editorContainer.clear();\n\t\t\thost.editorContainer.addChild(host.editor);\n\t\t\thost.ui.setFocus(host.editor);\n\t\t};\n\t\tconst { component, focus } = create(done);\n\t\thost.editorContainer.clear();\n\t\thost.editorContainer.addChild(component);\n\t\thost.ui.setFocus(focus);\n\t\thost.ui.requestRender();\n\t}\n\nexport function showSettingsSelector(host: InteractiveModeDelegateHost): void {\n\t\thost.showSelector((done) => {\n\t\t\tconst selector = new SettingsSelectorComponent(\n\t\t\t\t{\n\t\t\t\t\tautoCompact: host.session.autoCompactionEnabled,\n\t\t\t\t\tshowImages: host.settingsManager.getShowImages(),\n\t\t\t\t\tautoResizeImages: host.settingsManager.getImageAutoResize(),\n\t\t\t\t\tblockImages: host.settingsManager.getBlockImages(),\n\t\t\t\t\tenableSkillCommands: host.settingsManager.getEnableSkillCommands(),\n\t\t\t\t\tsteeringMode: host.session.steeringMode,\n\t\t\t\t\tfollowUpMode: host.session.followUpMode,\n\t\t\t\t\ttransport: host.settingsManager.getTransport(),\n\t\t\t\t\tthinkingLevel: host.session.thinkingLevel,\n\t\t\t\t\tavailableThinkingLevels: host.session.getAvailableThinkingLevels(),\n\t\t\t\t\tcurrentTheme: host.settingsManager.getTheme() || \"dark\",\n\t\t\t\t\tavailableThemes: getAvailableThemes(),\n\t\t\t\t\thideThinkingBlock: host.hideThinkingBlock,\n\t\t\t\t\ttoolsExpanded: host.toolOutputExpanded,\n\t\t\t\t\tcollapseChangelog: host.settingsManager.getCollapseChangelog(),\n\t\t\t\t\tdoubleEscapeAction: host.settingsManager.getDoubleEscapeAction(),\n\t\t\t\t\ttreeFilterMode: host.settingsManager.getTreeFilterMode(),\n\t\t\t\t\tshowHardwareCursor: host.settingsManager.getShowHardwareCursor(),\n\t\t\t\t\teditorPaddingX: host.settingsManager.getEditorPaddingX(),\n\t\t\t\t\tautocompleteMaxVisible: host.settingsManager.getAutocompleteMaxVisible(),\n\t\t\t\t\trespectGitignoreInPicker: host.settingsManager.getRespectGitignoreInPicker(),\n\t\t\t\t\tquietStartup: host.settingsManager.getQuietStartup(),\n\t\t\t\t\tclearOnShrink: host.settingsManager.getClearOnShrink(),\n\t\t\t\t\ttimestampFormat: host.settingsManager.getTimestampFormat(),\n\t\t\t\t\tadaptiveMode: host.settingsManager.getAdaptiveMode(),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tonAutoCompactChange: (enabled) => {\n\t\t\t\t\t\thost.session.setAutoCompactionEnabled(enabled);\n\t\t\t\t\t\thost.footer.setAutoCompactEnabled(enabled);\n\t\t\t\t\t},\n\t\t\t\t\tonShowImagesChange: (enabled) => {\n\t\t\t\t\t\thost.settingsManager.setShowImages(enabled);\n\t\t\t\t\t\tfor (const child of host.chatContainer.children) {\n\t\t\t\t\t\t\tif (child instanceof ToolExecutionComponent) {\n\t\t\t\t\t\t\t\tchild.setShowImages(enabled);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tonAutoResizeImagesChange: (enabled) => {\n\t\t\t\t\t\thost.settingsManager.setImageAutoResize(enabled);\n\t\t\t\t\t},\n\t\t\t\t\tonBlockImagesChange: (blocked) => {\n\t\t\t\t\t\thost.settingsManager.setBlockImages(blocked);\n\t\t\t\t\t},\n\t\t\t\t\tonEnableSkillCommandsChange: (enabled) => {\n\t\t\t\t\t\thost.settingsManager.setEnableSkillCommands(enabled);\n\t\t\t\t\t\thost.setupAutocomplete();\n\t\t\t\t\t},\n\t\t\t\t\tonSteeringModeChange: (mode) => {\n\t\t\t\t\t\thost.session.setSteeringMode(mode);\n\t\t\t\t\t},\n\t\t\t\t\tonFollowUpModeChange: (mode) => {\n\t\t\t\t\t\thost.session.setFollowUpMode(mode);\n\t\t\t\t\t},\n\t\t\t\t\tonTransportChange: (transport) => {\n\t\t\t\t\t\thost.settingsManager.setTransport(transport);\n\t\t\t\t\t\thost.session.agent.transport = transport;\n\t\t\t\t\t},\n\t\t\t\t\tonThinkingLevelChange: (level) => {\n\t\t\t\t\t\thost.session.setThinkingLevel(level);\n\t\t\t\t\t\thost.footer.invalidate();\n\t\t\t\t\t\thost.updateEditorBorderColor();\n\t\t\t\t\t},\n\t\t\t\t\tonThemeChange: (themeName) => {\n\t\t\t\t\t\tconst result = setTheme(themeName, true);\n\t\t\t\t\t\thost.settingsManager.setTheme(themeName);\n\t\t\t\t\t\thost.clearMarkdownThemeCache();\n\t\t\t\t\t\thost.ui.invalidate();\n\t\t\t\t\t\tif (!result.success) {\n\t\t\t\t\t\t\thost.showError(`Failed to load theme \"${themeName}\": ${result.error}\\nFell back to dark theme.`);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tonThemePreview: (themeName) => {\n\t\t\t\t\t\tconst result = setTheme(themeName, true);\n\t\t\t\t\t\tif (result.success) {\n\t\t\t\t\t\t\thost.clearMarkdownThemeCache();\n\t\t\t\t\t\t\thost.ui.invalidate();\n\t\t\t\t\t\t\thost.ui.requestRender();\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tonHideThinkingBlockChange: (hidden) => {\n\t\t\t\t\t\thost.hideThinkingBlock = hidden;\n\t\t\t\t\t\thost.settingsManager.setHideThinkingBlock(hidden);\n\t\t\t\t\t\tfor (const child of host.chatContainer.children) {\n\t\t\t\t\t\t\tif (child instanceof AssistantMessageComponent) {\n\t\t\t\t\t\t\t\tchild.setHideThinkingBlock(hidden);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\thost.chatContainer.clear();\n\t\t\t\t\t\thost.rebuildChatFromMessages();\n\t\t\t\t\t},\n\t\t\t\t\tonToolsExpandedChange: (expanded) => {\n\t\t\t\t\t\thost.settingsManager.setToolsExpanded(expanded);\n\t\t\t\t\t\thost.setToolsExpanded(expanded);\n\t\t\t\t\t},\n\t\t\t\t\tonCollapseChangelogChange: (collapsed) => {\n\t\t\t\t\t\thost.settingsManager.setCollapseChangelog(collapsed);\n\t\t\t\t\t},\n\t\t\t\t\tonQuietStartupChange: (enabled) => {\n\t\t\t\t\t\thost.settingsManager.setQuietStartup(enabled);\n\t\t\t\t\t},\n\t\t\t\t\tonDoubleEscapeActionChange: (action) => {\n\t\t\t\t\t\thost.settingsManager.setDoubleEscapeAction(action);\n\t\t\t\t\t},\n\t\t\t\t\tonTreeFilterModeChange: (mode) => {\n\t\t\t\t\t\thost.settingsManager.setTreeFilterMode(mode);\n\t\t\t\t\t},\n\t\t\t\t\tonShowHardwareCursorChange: (enabled) => {\n\t\t\t\t\t\thost.settingsManager.setShowHardwareCursor(enabled);\n\t\t\t\t\t\thost.ui.setShowHardwareCursor(enabled);\n\t\t\t\t\t},\n\t\t\t\t\tonEditorPaddingXChange: (padding) => {\n\t\t\t\t\t\thost.settingsManager.setEditorPaddingX(padding);\n\t\t\t\t\t\thost.defaultEditor.setPaddingX(padding);\n\t\t\t\t\t\tif (host.editor !== host.defaultEditor && host.editor.setPaddingX !== undefined) {\n\t\t\t\t\t\t\thost.editor.setPaddingX(padding);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tonAutocompleteMaxVisibleChange: (maxVisible) => {\n\t\t\t\t\t\thost.settingsManager.setAutocompleteMaxVisible(maxVisible);\n\t\t\t\t\t\thost.defaultEditor.setAutocompleteMaxVisible(maxVisible);\n\t\t\t\t\t\tif (host.editor !== host.defaultEditor && host.editor.setAutocompleteMaxVisible !== undefined) {\n\t\t\t\t\t\t\thost.editor.setAutocompleteMaxVisible(maxVisible);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tonClearOnShrinkChange: (enabled) => {\n\t\t\t\t\t\thost.settingsManager.setClearOnShrink(enabled);\n\t\t\t\t\t\thost.ui.setClearOnShrink(enabled);\n\t\t\t\t\t},\n\t\t\t\t\tonRespectGitignoreInPickerChange: (enabled) => {\n\t\t\t\t\t\thost.settingsManager.setRespectGitignoreInPicker(enabled);\n\t\t\t\t\t\thost.autocompleteProvider?.setRespectGitignore(enabled);\n\t\t\t\t\t},\n\t\t\t\t\tonTimestampFormatChange: (format) => {\n\t\t\t\t\t\thost.settingsManager.setTimestampFormat(format);\n\t\t\t\t\t},\n\t\t\t\t\tonAdaptiveModeChange: (mode) => {\n\t\t\t\t\t\thost.settingsManager.setAdaptiveMode(mode);\n\t\t\t\t\t\thost.ui.requestRender();\n\t\t\t\t\t},\n\t\t\t\t\tonCancel: () => {\n\t\t\t\t\t\tdone();\n\t\t\t\t\t\thost.ui.requestRender();\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t\treturn { component: selector, focus: selector.getSettingsList() };\n\t\t});\n\t}\n\nexport async function handleModelCommand(host: InteractiveModeDelegateHost, searchTerm?: string): Promise<void> {\n\t\tawait handleModelCommandController(host, searchTerm);\n\t}\n\nexport async function findExactModelMatch(host: InteractiveModeDelegateHost, searchTerm: string): Promise<Model<any> | undefined> {\n\t\treturn findExactModelMatchController(host, searchTerm);\n\t}\n\nexport async function getModelCandidates(host: InteractiveModeDelegateHost): Promise<Model<any>[]> {\n\t\treturn getModelCandidatesController(host);\n\t}\n\n\t/** Update the footer's available provider count from current model candidates */\nexport async function updateAvailableProviderCount(host: InteractiveModeDelegateHost): Promise<void> {\n\t\tawait updateAvailableProviderCountController(host);\n\t}\n\nexport function showModelSelector(host: InteractiveModeDelegateHost, initialSearchInput?: string): void {\n\t\thost.showSelector((done) => {\n\t\t\tconst selector = new ModelSelectorComponent(\n\t\t\t\thost.ui,\n\t\t\t\thost.session.model,\n\t\t\t\thost.settingsManager,\n\t\t\t\thost.session.modelRegistry,\n\t\t\t\thost.session.scopedModels,\n\t\t\t\tasync (model) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait host.session.setModel(model);\n\t\t\t\t\t\thost.footer.invalidate();\n\t\t\t\t\t\thost.updateEditorBorderColor();\n\t\t\t\t\t\tdone();\n\t\t\t\t\t\thost.showStatus(`Model: ${model.id}`);\n\t\t\t\t\t\thost.checkDaxnutsEasterEgg(model);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tdone();\n\t\t\t\t\t\thost.showError(error instanceof Error ? error.message : String(error));\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t() => {\n\t\t\t\t\tdone();\n\t\t\t\t\thost.ui.requestRender();\n\t\t\t\t},\n\t\t\t\tinitialSearchInput,\n\t\t\t);\n\t\t\treturn { component: selector, focus: selector };\n\t\t});\n\t}\n\nexport async function showModelsSelector(host: InteractiveModeDelegateHost): Promise<void> {\n\t\t// Get all available models\n\t\thost.session.modelRegistry.refresh();\n\t\tconst allModels = host.session.modelRegistry.getAvailable();\n\n\t\tif (allModels.length === 0) {\n\t\t\thost.showStatus(\"No models available\");\n\t\t\treturn;\n\t\t}\n\n\t\t// Check if session has scoped models (from previous session-only changes or CLI --models)\n\t\tconst sessionScopedModels = host.session.scopedModels;\n\t\tconst hasSessionScope = sessionScopedModels.length > 0;\n\n\t\t// Build enabled model IDs from session state or settings\n\t\tconst enabledModelIds = new Set<string>();\n\t\tlet hasFilter = false;\n\n\t\tif (hasSessionScope) {\n\t\t\t// Use current session's scoped models\n\t\t\tfor (const sm of sessionScopedModels) {\n\t\t\t\tenabledModelIds.add(`${sm.model.provider}/${sm.model.id}`);\n\t\t\t}\n\t\t\thasFilter = true;\n\t\t} else {\n\t\t\t// Fall back to settings\n\t\t\tconst patterns = host.settingsManager.getEnabledModels();\n\t\t\tif (patterns !== undefined && patterns.length > 0) {\n\t\t\t\thasFilter = true;\n\t\t\t\tconst scopedModels = await resolveModelScope(patterns, host.session.modelRegistry);\n\t\t\t\tfor (const sm of scopedModels) {\n\t\t\t\t\tenabledModelIds.add(`${sm.model.provider}/${sm.model.id}`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Track current enabled state (session-only until persisted)\n\t\tconst currentEnabledIds = new Set(enabledModelIds);\n\t\tlet currentHasFilter = hasFilter;\n\n\t\t// Helper to update session's scoped models (session-only, no persist)\n\t\tconst updateSessionModels = async (enabledIds: Set<string>) => {\n\t\t\tif (enabledIds.size > 0 && enabledIds.size < allModels.length) {\n\t\t\t\tconst newScopedModels = await resolveModelScope(Array.from(enabledIds), host.session.modelRegistry);\n\t\t\t\thost.session.setScopedModels(\n\t\t\t\t\tnewScopedModels.map((sm) => ({\n\t\t\t\t\t\tmodel: sm.model,\n\t\t\t\t\t\tthinkingLevel: sm.thinkingLevel,\n\t\t\t\t\t})),\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\t// All enabled or none enabled = no filter\n\t\t\t\thost.session.setScopedModels([]);\n\t\t\t}\n\t\t\tawait host.updateAvailableProviderCount();\n\t\t\thost.ui.requestRender();\n\t\t};\n\n\t\thost.showSelector((done) => {\n\t\t\tconst selector = new ScopedModelsSelectorComponent(\n\t\t\t\t{\n\t\t\t\t\tallModels,\n\t\t\t\t\tenabledModelIds: currentEnabledIds,\n\t\t\t\t\thasEnabledModelsFilter: currentHasFilter,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tonModelToggle: async (modelId, enabled) => {\n\t\t\t\t\t\tif (enabled) {\n\t\t\t\t\t\t\tcurrentEnabledIds.add(modelId);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcurrentEnabledIds.delete(modelId);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcurrentHasFilter = true;\n\t\t\t\t\t\tawait updateSessionModels(currentEnabledIds);\n\t\t\t\t\t},\n\t\t\t\t\tonEnableAll: async (allModelIds) => {\n\t\t\t\t\t\tcurrentEnabledIds.clear();\n\t\t\t\t\t\tfor (const id of allModelIds) {\n\t\t\t\t\t\t\tcurrentEnabledIds.add(id);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcurrentHasFilter = false;\n\t\t\t\t\t\tawait updateSessionModels(currentEnabledIds);\n\t\t\t\t\t},\n\t\t\t\t\tonClearAll: async () => {\n\t\t\t\t\t\tcurrentEnabledIds.clear();\n\t\t\t\t\t\tcurrentHasFilter = true;\n\t\t\t\t\t\tawait updateSessionModels(currentEnabledIds);\n\t\t\t\t\t},\n\t\t\t\t\tonToggleProvider: async (_provider, modelIds, enabled) => {\n\t\t\t\t\t\tfor (const id of modelIds) {\n\t\t\t\t\t\t\tif (enabled) {\n\t\t\t\t\t\t\t\tcurrentEnabledIds.add(id);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcurrentEnabledIds.delete(id);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcurrentHasFilter = true;\n\t\t\t\t\t\tawait updateSessionModels(currentEnabledIds);\n\t\t\t\t\t},\n\t\t\t\t\tonPersist: (enabledIds) => {\n\t\t\t\t\t\t// Persist to settings\n\t\t\t\t\t\tconst newPatterns =\n\t\t\t\t\t\t\tenabledIds.length === allModels.length\n\t\t\t\t\t\t\t\t? undefined // All enabled = clear filter\n\t\t\t\t\t\t\t\t: enabledIds;\n\t\t\t\t\t\thost.settingsManager.setEnabledModels(newPatterns);\n\t\t\t\t\t\thost.showStatus(\"Model selection saved to settings\");\n\t\t\t\t\t},\n\t\t\t\t\tonCancel: () => {\n\t\t\t\t\t\tdone();\n\t\t\t\t\t\thost.ui.requestRender();\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t\treturn { component: selector, focus: selector };\n\t\t});\n\t}\n"]}
|
|
1
|
+
{"version":3,"file":"interactive-selectors-settings.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-selectors-settings.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 { Loader, Spacer } from \"@gsd/pi-tui\";\nimport type { Component } from \"@gsd/pi-tui\";\nimport type { Model, OAuthProviderId } from \"@gsd/pi-ai\";\nimport { getAuthPath } from \"@gsd/pi-coding-agent/config.js\";\nimport { resolveModelScope } from \"@gsd/pi-coding-agent/core/model-resolver.js\";\nimport { SessionManager } from \"@gsd/pi-coding-agent/core/session-manager.js\";\nimport { getAvailableThemes, setRegisteredThemes, setTheme, theme } from \"@gsd/pi-coding-agent/theme/theme.js\";\nimport { appKey } from \"./components/keybinding-hints.js\";\nimport { LoginDialogComponent } from \"./components/login-dialog.js\";\nimport { ModelSelectorComponent } from \"./components/model-selector.js\";\nimport { OAuthSelectorComponent } from \"./components/oauth-selector.js\";\nimport { ProviderManagerComponent } from \"./components/provider-manager.js\";\nimport { ScopedModelsSelectorComponent } from \"./components/scoped-models-selector.js\";\nimport { SessionSelectorComponent } from \"./components/session-selector.js\";\nimport { SettingsSelectorComponent } from \"./components/settings-selector.js\";\nimport { ToolExecutionComponent } from \"./components/tool-execution.js\";\nimport { TreeSelectorComponent } from \"./components/tree-selector.js\";\nimport { UserMessageSelectorComponent } from \"./components/user-message-selector.js\";\nimport { AssistantMessageComponent } from \"./components/assistant-message.js\";\nimport {\n findExactModelMatch as findExactModelMatchController,\n getModelCandidates as getModelCandidatesController,\n handleModelCommand as handleModelCommandController,\n updateAvailableProviderCount as updateAvailableProviderCountController,\n} from \"./controllers/model-controller.js\";\nimport type { InteractiveModeDelegateHost } from \"./interactive-mode-delegate-host.js\";\n\n\nimport { Loader, Spacer } from \"@gsd/pi-tui\";\nimport type { Component } from \"@gsd/pi-tui\";\nimport type { Model, OAuthProviderId } from \"@gsd/pi-ai\";\nimport { getAuthPath } from \"@gsd/pi-coding-agent/config.js\";\nimport { resolveModelScope } from \"@gsd/pi-coding-agent/core/model-resolver.js\";\nimport { SessionManager } from \"@gsd/pi-coding-agent/core/session-manager.js\";\nimport { getAvailableThemes, setRegisteredThemes, setTheme, theme } from \"@gsd/pi-coding-agent/theme/theme.js\";\nimport { appKey } from \"./components/keybinding-hints.js\";\nimport { LoginDialogComponent } from \"./components/login-dialog.js\";\nimport { ModelSelectorComponent } from \"./components/model-selector.js\";\nimport { OAuthSelectorComponent } from \"./components/oauth-selector.js\";\nimport { ProviderManagerComponent } from \"./components/provider-manager.js\";\nimport { ScopedModelsSelectorComponent } from \"./components/scoped-models-selector.js\";\nimport { SessionSelectorComponent } from \"./components/session-selector.js\";\nimport { SettingsSelectorComponent } from \"./components/settings-selector.js\";\nimport { ToolExecutionComponent } from \"./components/tool-execution.js\";\nimport { TreeSelectorComponent } from \"./components/tree-selector.js\";\nimport { UserMessageSelectorComponent } from \"./components/user-message-selector.js\";\nimport { AssistantMessageComponent } from \"./components/assistant-message.js\";\nimport {\n\tfindExactModelMatch as findExactModelMatchController,\n\tgetModelCandidates as getModelCandidatesController,\n\thandleModelCommand as handleModelCommandController,\n\tupdateAvailableProviderCount as updateAvailableProviderCountController,\n} from \"./controllers/model-controller.js\";\nimport type { InteractiveModeDelegateHost } from \"./interactive-mode-delegate-host.js\";\n\nexport function showSelector(host: InteractiveModeDelegateHost, create: (done: () => void) => { component: Component; focus: Component }): void {\n\t\tconst done = () => {\n\t\t\thost.editorContainer.clear();\n\t\t\thost.editorContainer.addChild(host.editor);\n\t\t\thost.ui.setFocus(host.editor);\n\t\t};\n\t\tconst { component, focus } = create(done);\n\t\thost.editorContainer.clear();\n\t\thost.editorContainer.addChild(component);\n\t\thost.ui.setFocus(focus);\n\t\thost.ui.requestRender();\n\t}\n\nexport function showSettingsSelector(host: InteractiveModeDelegateHost): void {\n\t\thost.showSelector((done) => {\n\t\t\tconst selector = new SettingsSelectorComponent(\n\t\t\t\t{\n\t\t\t\t\tautoCompact: host.session.autoCompactionEnabled,\n\t\t\t\t\tshowImages: host.settingsManager.getShowImages(),\n\t\t\t\t\tautoResizeImages: host.settingsManager.getImageAutoResize(),\n\t\t\t\t\tblockImages: host.settingsManager.getBlockImages(),\n\t\t\t\t\tenableSkillCommands: host.settingsManager.getEnableSkillCommands(),\n\t\t\t\t\tsteeringMode: host.session.steeringMode,\n\t\t\t\t\tfollowUpMode: host.session.followUpMode,\n\t\t\t\t\ttransport: host.settingsManager.getTransport(),\n\t\t\t\t\tthinkingLevel: host.session.thinkingLevel,\n\t\t\t\t\tavailableThinkingLevels: host.session.getAvailableThinkingLevels(),\n\t\t\t\t\tcurrentTheme: host.settingsManager.getTheme() || \"dark\",\n\t\t\t\t\tavailableThemes: getAvailableThemes(),\n\t\t\t\t\thideThinkingBlock: host.hideThinkingBlock,\n\t\t\t\t\ttoolsExpanded: host.toolOutputExpanded,\n\t\t\t\t\ttoolRailAnimation: host.settingsManager.getToolRailAnimation(),\n\t\t\t\t\tcollapseChangelog: host.settingsManager.getCollapseChangelog(),\n\t\t\t\t\tdoubleEscapeAction: host.settingsManager.getDoubleEscapeAction(),\n\t\t\t\t\ttreeFilterMode: host.settingsManager.getTreeFilterMode(),\n\t\t\t\t\tshowHardwareCursor: host.settingsManager.getShowHardwareCursor(),\n\t\t\t\t\teditorPaddingX: host.settingsManager.getEditorPaddingX(),\n\t\t\t\t\tautocompleteMaxVisible: host.settingsManager.getAutocompleteMaxVisible(),\n\t\t\t\t\trespectGitignoreInPicker: host.settingsManager.getRespectGitignoreInPicker(),\n\t\t\t\t\tquietStartup: host.settingsManager.getQuietStartup(),\n\t\t\t\t\tclearOnShrink: host.settingsManager.getClearOnShrink(),\n\t\t\t\t\ttimestampFormat: host.settingsManager.getTimestampFormat(),\n\t\t\t\t\tadaptiveMode: host.settingsManager.getAdaptiveMode(),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tonAutoCompactChange: (enabled) => {\n\t\t\t\t\t\thost.session.setAutoCompactionEnabled(enabled);\n\t\t\t\t\t\thost.footer.setAutoCompactEnabled(enabled);\n\t\t\t\t\t},\n\t\t\t\t\tonShowImagesChange: (enabled) => {\n\t\t\t\t\t\thost.settingsManager.setShowImages(enabled);\n\t\t\t\t\t\tfor (const child of host.chatContainer.children) {\n\t\t\t\t\t\t\tif (child instanceof ToolExecutionComponent) {\n\t\t\t\t\t\t\t\tchild.setShowImages(enabled);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tonAutoResizeImagesChange: (enabled) => {\n\t\t\t\t\t\thost.settingsManager.setImageAutoResize(enabled);\n\t\t\t\t\t},\n\t\t\t\t\tonBlockImagesChange: (blocked) => {\n\t\t\t\t\t\thost.settingsManager.setBlockImages(blocked);\n\t\t\t\t\t},\n\t\t\t\t\tonEnableSkillCommandsChange: (enabled) => {\n\t\t\t\t\t\thost.settingsManager.setEnableSkillCommands(enabled);\n\t\t\t\t\t\thost.setupAutocomplete();\n\t\t\t\t\t},\n\t\t\t\t\tonSteeringModeChange: (mode) => {\n\t\t\t\t\t\thost.session.setSteeringMode(mode);\n\t\t\t\t\t},\n\t\t\t\t\tonFollowUpModeChange: (mode) => {\n\t\t\t\t\t\thost.session.setFollowUpMode(mode);\n\t\t\t\t\t},\n\t\t\t\t\tonTransportChange: (transport) => {\n\t\t\t\t\t\thost.settingsManager.setTransport(transport);\n\t\t\t\t\t\thost.session.agent.transport = transport;\n\t\t\t\t\t},\n\t\t\t\t\tonThinkingLevelChange: (level) => {\n\t\t\t\t\t\thost.session.setThinkingLevel(level);\n\t\t\t\t\t\thost.footer.invalidate();\n\t\t\t\t\t\thost.updateEditorBorderColor();\n\t\t\t\t\t},\n\t\t\t\t\tonThemeChange: (themeName) => {\n\t\t\t\t\t\tconst result = setTheme(themeName, true);\n\t\t\t\t\t\thost.settingsManager.setTheme(themeName);\n\t\t\t\t\t\thost.clearMarkdownThemeCache();\n\t\t\t\t\t\thost.ui.invalidate();\n\t\t\t\t\t\tif (!result.success) {\n\t\t\t\t\t\t\thost.showError(`Failed to load theme \"${themeName}\": ${result.error}\\nFell back to dark theme.`);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tonThemePreview: (themeName) => {\n\t\t\t\t\t\tconst result = setTheme(themeName, true);\n\t\t\t\t\t\tif (result.success) {\n\t\t\t\t\t\t\thost.clearMarkdownThemeCache();\n\t\t\t\t\t\t\thost.ui.invalidate();\n\t\t\t\t\t\t\thost.ui.requestRender();\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tonHideThinkingBlockChange: (hidden) => {\n\t\t\t\t\t\thost.hideThinkingBlock = hidden;\n\t\t\t\t\t\thost.settingsManager.setHideThinkingBlock(hidden);\n\t\t\t\t\t\tfor (const child of host.chatContainer.children) {\n\t\t\t\t\t\t\tif (child instanceof AssistantMessageComponent) {\n\t\t\t\t\t\t\t\tchild.setHideThinkingBlock(hidden);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\thost.chatContainer.clear();\n\t\t\t\t\t\thost.rebuildChatFromMessages();\n\t\t\t\t\t},\n\t\t\t\t\tonToolsExpandedChange: (expanded) => {\n\t\t\t\t\t\thost.settingsManager.setToolsExpanded(expanded);\n\t\t\t\t\t\thost.setToolsExpanded(expanded);\n\t\t\t\t\t},\n\t\t\t\t\tonToolRailAnimationChange: (enabled) => {\n\t\t\t\t\t\thost.setToolRailAnimation(enabled);\n\t\t\t\t\t},\n\t\t\t\t\tonCollapseChangelogChange: (collapsed) => {\n\t\t\t\t\t\thost.settingsManager.setCollapseChangelog(collapsed);\n\t\t\t\t\t},\n\t\t\t\t\tonQuietStartupChange: (enabled) => {\n\t\t\t\t\t\thost.settingsManager.setQuietStartup(enabled);\n\t\t\t\t\t},\n\t\t\t\t\tonDoubleEscapeActionChange: (action) => {\n\t\t\t\t\t\thost.settingsManager.setDoubleEscapeAction(action);\n\t\t\t\t\t},\n\t\t\t\t\tonTreeFilterModeChange: (mode) => {\n\t\t\t\t\t\thost.settingsManager.setTreeFilterMode(mode);\n\t\t\t\t\t},\n\t\t\t\t\tonShowHardwareCursorChange: (enabled) => {\n\t\t\t\t\t\thost.settingsManager.setShowHardwareCursor(enabled);\n\t\t\t\t\t\thost.ui.setShowHardwareCursor(enabled);\n\t\t\t\t\t},\n\t\t\t\t\tonEditorPaddingXChange: (padding) => {\n\t\t\t\t\t\thost.settingsManager.setEditorPaddingX(padding);\n\t\t\t\t\t\thost.defaultEditor.setPaddingX(padding);\n\t\t\t\t\t\tif (host.editor !== host.defaultEditor && host.editor.setPaddingX !== undefined) {\n\t\t\t\t\t\t\thost.editor.setPaddingX(padding);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tonAutocompleteMaxVisibleChange: (maxVisible) => {\n\t\t\t\t\t\thost.settingsManager.setAutocompleteMaxVisible(maxVisible);\n\t\t\t\t\t\thost.defaultEditor.setAutocompleteMaxVisible(maxVisible);\n\t\t\t\t\t\tif (host.editor !== host.defaultEditor && host.editor.setAutocompleteMaxVisible !== undefined) {\n\t\t\t\t\t\t\thost.editor.setAutocompleteMaxVisible(maxVisible);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tonClearOnShrinkChange: (enabled) => {\n\t\t\t\t\t\thost.settingsManager.setClearOnShrink(enabled);\n\t\t\t\t\t\thost.ui.setClearOnShrink(enabled);\n\t\t\t\t\t},\n\t\t\t\t\tonRespectGitignoreInPickerChange: (enabled) => {\n\t\t\t\t\t\thost.settingsManager.setRespectGitignoreInPicker(enabled);\n\t\t\t\t\t\thost.autocompleteProvider?.setRespectGitignore(enabled);\n\t\t\t\t\t},\n\t\t\t\t\tonTimestampFormatChange: (format) => {\n\t\t\t\t\t\thost.settingsManager.setTimestampFormat(format);\n\t\t\t\t\t},\n\t\t\t\t\tonAdaptiveModeChange: (mode) => {\n\t\t\t\t\t\thost.settingsManager.setAdaptiveMode(mode);\n\t\t\t\t\t\thost.ui.requestRender();\n\t\t\t\t\t},\n\t\t\t\t\tonCancel: () => {\n\t\t\t\t\t\tdone();\n\t\t\t\t\t\thost.ui.requestRender();\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t\treturn { component: selector, focus: selector.getSettingsList() };\n\t\t});\n\t}\n\nexport async function handleModelCommand(host: InteractiveModeDelegateHost, searchTerm?: string): Promise<void> {\n\t\tawait handleModelCommandController(host, searchTerm);\n\t}\n\nexport async function findExactModelMatch(host: InteractiveModeDelegateHost, searchTerm: string): Promise<Model<any> | undefined> {\n\t\treturn findExactModelMatchController(host, searchTerm);\n\t}\n\nexport async function getModelCandidates(host: InteractiveModeDelegateHost): Promise<Model<any>[]> {\n\t\treturn getModelCandidatesController(host);\n\t}\n\n\t/** Update the footer's available provider count from current model candidates */\nexport async function updateAvailableProviderCount(host: InteractiveModeDelegateHost): Promise<void> {\n\t\tawait updateAvailableProviderCountController(host);\n\t}\n\nexport function showModelSelector(host: InteractiveModeDelegateHost, initialSearchInput?: string): void {\n\t\thost.showSelector((done) => {\n\t\t\tconst selector = new ModelSelectorComponent(\n\t\t\t\thost.ui,\n\t\t\t\thost.session.model,\n\t\t\t\thost.settingsManager,\n\t\t\t\thost.session.modelRegistry,\n\t\t\t\thost.session.scopedModels,\n\t\t\t\tasync (model) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait host.session.setModel(model);\n\t\t\t\t\t\thost.footer.invalidate();\n\t\t\t\t\t\thost.updateEditorBorderColor();\n\t\t\t\t\t\tdone();\n\t\t\t\t\t\thost.showStatus(`Model: ${model.id}`);\n\t\t\t\t\t\thost.checkDaxnutsEasterEgg(model);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tdone();\n\t\t\t\t\t\thost.showError(error instanceof Error ? error.message : String(error));\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t() => {\n\t\t\t\t\tdone();\n\t\t\t\t\thost.ui.requestRender();\n\t\t\t\t},\n\t\t\t\tinitialSearchInput,\n\t\t\t);\n\t\t\treturn { component: selector, focus: selector };\n\t\t});\n\t}\n\nexport async function showModelsSelector(host: InteractiveModeDelegateHost): Promise<void> {\n\t\t// Get all available models\n\t\thost.session.modelRegistry.refresh();\n\t\tconst allModels = host.session.modelRegistry.getAvailable();\n\n\t\tif (allModels.length === 0) {\n\t\t\thost.showStatus(\"No models available\");\n\t\t\treturn;\n\t\t}\n\n\t\t// Check if session has scoped models (from previous session-only changes or CLI --models)\n\t\tconst sessionScopedModels = host.session.scopedModels;\n\t\tconst hasSessionScope = sessionScopedModels.length > 0;\n\n\t\t// Build enabled model IDs from session state or settings\n\t\tconst enabledModelIds = new Set<string>();\n\t\tlet hasFilter = false;\n\n\t\tif (hasSessionScope) {\n\t\t\t// Use current session's scoped models\n\t\t\tfor (const sm of sessionScopedModels) {\n\t\t\t\tenabledModelIds.add(`${sm.model.provider}/${sm.model.id}`);\n\t\t\t}\n\t\t\thasFilter = true;\n\t\t} else {\n\t\t\t// Fall back to settings\n\t\t\tconst patterns = host.settingsManager.getEnabledModels();\n\t\t\tif (patterns !== undefined && patterns.length > 0) {\n\t\t\t\thasFilter = true;\n\t\t\t\tconst scopedModels = await resolveModelScope(patterns, host.session.modelRegistry);\n\t\t\t\tfor (const sm of scopedModels) {\n\t\t\t\t\tenabledModelIds.add(`${sm.model.provider}/${sm.model.id}`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Track current enabled state (session-only until persisted)\n\t\tconst currentEnabledIds = new Set(enabledModelIds);\n\t\tlet currentHasFilter = hasFilter;\n\n\t\t// Helper to update session's scoped models (session-only, no persist)\n\t\tconst updateSessionModels = async (enabledIds: Set<string>) => {\n\t\t\tif (enabledIds.size > 0 && enabledIds.size < allModels.length) {\n\t\t\t\tconst newScopedModels = await resolveModelScope(Array.from(enabledIds), host.session.modelRegistry);\n\t\t\t\thost.session.setScopedModels(\n\t\t\t\t\tnewScopedModels.map((sm) => ({\n\t\t\t\t\t\tmodel: sm.model,\n\t\t\t\t\t\tthinkingLevel: sm.thinkingLevel,\n\t\t\t\t\t})),\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\t// All enabled or none enabled = no filter\n\t\t\t\thost.session.setScopedModels([]);\n\t\t\t}\n\t\t\tawait host.updateAvailableProviderCount();\n\t\t\thost.ui.requestRender();\n\t\t};\n\n\t\thost.showSelector((done) => {\n\t\t\tconst selector = new ScopedModelsSelectorComponent(\n\t\t\t\t{\n\t\t\t\t\tallModels,\n\t\t\t\t\tenabledModelIds: currentEnabledIds,\n\t\t\t\t\thasEnabledModelsFilter: currentHasFilter,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tonModelToggle: async (modelId, enabled) => {\n\t\t\t\t\t\tif (enabled) {\n\t\t\t\t\t\t\tcurrentEnabledIds.add(modelId);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcurrentEnabledIds.delete(modelId);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcurrentHasFilter = true;\n\t\t\t\t\t\tawait updateSessionModels(currentEnabledIds);\n\t\t\t\t\t},\n\t\t\t\t\tonEnableAll: async (allModelIds) => {\n\t\t\t\t\t\tcurrentEnabledIds.clear();\n\t\t\t\t\t\tfor (const id of allModelIds) {\n\t\t\t\t\t\t\tcurrentEnabledIds.add(id);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcurrentHasFilter = false;\n\t\t\t\t\t\tawait updateSessionModels(currentEnabledIds);\n\t\t\t\t\t},\n\t\t\t\t\tonClearAll: async () => {\n\t\t\t\t\t\tcurrentEnabledIds.clear();\n\t\t\t\t\t\tcurrentHasFilter = true;\n\t\t\t\t\t\tawait updateSessionModels(currentEnabledIds);\n\t\t\t\t\t},\n\t\t\t\t\tonToggleProvider: async (_provider, modelIds, enabled) => {\n\t\t\t\t\t\tfor (const id of modelIds) {\n\t\t\t\t\t\t\tif (enabled) {\n\t\t\t\t\t\t\t\tcurrentEnabledIds.add(id);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcurrentEnabledIds.delete(id);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcurrentHasFilter = true;\n\t\t\t\t\t\tawait updateSessionModels(currentEnabledIds);\n\t\t\t\t\t},\n\t\t\t\t\tonPersist: (enabledIds) => {\n\t\t\t\t\t\t// Persist to settings\n\t\t\t\t\t\tconst newPatterns =\n\t\t\t\t\t\t\tenabledIds.length === allModels.length\n\t\t\t\t\t\t\t\t? undefined // All enabled = clear filter\n\t\t\t\t\t\t\t\t: enabledIds;\n\t\t\t\t\t\thost.settingsManager.setEnabledModels(newPatterns);\n\t\t\t\t\t\thost.showStatus(\"Model selection saved to settings\");\n\t\t\t\t\t},\n\t\t\t\t\tonCancel: () => {\n\t\t\t\t\t\tdone();\n\t\t\t\t\t\thost.ui.requestRender();\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t\treturn { component: selector, focus: selector };\n\t\t});\n\t}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gsd/agent-modes",
|
|
3
|
-
"version": "1.2.0-dev.
|
|
3
|
+
"version": "1.2.0-dev.a6376d75",
|
|
4
4
|
"description": "GSD run modes and CLI layer",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"gsd": {
|
|
@@ -25,12 +25,12 @@
|
|
|
25
25
|
"test": "node --import ../../src/resources/extensions/gsd/tests/resolve-ts.mjs --experimental-strip-types --test src/**/*.test.ts"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@gsd/agent-core": "^1.2.0-dev.
|
|
29
|
-
"@gsd/pi-agent-core": "^1.2.0-dev.
|
|
30
|
-
"@gsd/pi-ai": "^1.2.0-dev.
|
|
31
|
-
"@gsd/pi-coding-agent": "^1.2.0-dev.
|
|
32
|
-
"@gsd/pi-tui": "^1.2.0-dev.
|
|
33
|
-
"@opengsd/contracts": "^1.2.0-dev.
|
|
28
|
+
"@gsd/agent-core": "^1.2.0-dev.a6376d75",
|
|
29
|
+
"@gsd/pi-agent-core": "^1.2.0-dev.a6376d75",
|
|
30
|
+
"@gsd/pi-ai": "^1.2.0-dev.a6376d75",
|
|
31
|
+
"@gsd/pi-coding-agent": "^1.2.0-dev.a6376d75",
|
|
32
|
+
"@gsd/pi-tui": "^1.2.0-dev.a6376d75",
|
|
33
|
+
"@opengsd/contracts": "^1.2.0-dev.a6376d75",
|
|
34
34
|
"chalk": "^5.5.0"
|
|
35
35
|
}
|
|
36
36
|
}
|
|
@@ -4,7 +4,7 @@ MCP server exposing GSD orchestration tools for Claude Code, Cursor, and other M
|
|
|
4
4
|
|
|
5
5
|
Start GSD auto-mode sessions, poll progress, resolve blockers, and retrieve results — all through the [Model Context Protocol](https://modelcontextprotocol.io/).
|
|
6
6
|
|
|
7
|
-
This package
|
|
7
|
+
This package exposes three tool surfaces:
|
|
8
8
|
|
|
9
9
|
- session/read tools for starting and inspecting GSD sessions
|
|
10
10
|
- MCP-native interactive tools for structured user input
|
|
@@ -134,9 +134,15 @@ Current support boundary:
|
|
|
134
134
|
- when running inside the GSD monorepo checkout, the MCP server auto-discovers the shared workflow executor module
|
|
135
135
|
- outside the monorepo, set `GSD_WORKFLOW_EXECUTORS_MODULE` to an importable `workflow-tool-executors` module path if you want the mutation tools enabled
|
|
136
136
|
- `ask_user_questions` and `secure_env_collect` require an MCP client that supports form elicitation
|
|
137
|
-
- session/read
|
|
137
|
+
- session/read tool implementations do not use this bridge, but the packaged CLI still warms it at startup so Claude Code never sees a partial workflow surface
|
|
138
138
|
|
|
139
|
-
If the executor bridge cannot be loaded,
|
|
139
|
+
If the executor bridge cannot be loaded, the packaged CLI fails startup with a precise configuration error instead of silently degrading.
|
|
140
|
+
|
|
141
|
+
Startup is fail-closed for the workflow bridge: `gsd-mcp-server` loads the workflow executor and write-gate bridge before it connects over stdio. If bridge warm-up fails, the MCP host sees a startup failure instead of a partially advertised tool surface.
|
|
142
|
+
|
|
143
|
+
The server also keeps a per-project PID registry at `$GSD_HOME/mcp-instances.json` (default `~/.gsd/mcp-instances.json`). On startup it terminates a previously registered `gsd-mcp-server` process for the same project when the saved PID still belongs to an MCP server, then records the current PID. On normal shutdown it removes only its own entry. Corrupt registry files are preserved as `.corrupt-<timestamp>` backups before a new registry is written.
|
|
144
|
+
|
|
145
|
+
For stdio hosts that leave child processes behind, the server watches stdin activity. If stdin is idle for five minutes and the original parent process is gone, it cleans up sessions, unregisters its PID, and exits.
|
|
140
146
|
|
|
141
147
|
### `gsd_execute`
|
|
142
148
|
|
|
@@ -245,6 +251,9 @@ Resolve a pending blocker in a session by sending a response to the blocked UI r
|
|
|
245
251
|
|----------|-------------|
|
|
246
252
|
| `GSD_CLI_PATH` | Absolute path to the GSD CLI binary. If not set, the server resolves `gsd` via `which`. |
|
|
247
253
|
| `GSD_WORKFLOW_EXECUTORS_MODULE` | Optional absolute path or `file:` URL for the shared GSD workflow executor module used by workflow mutation tools. |
|
|
254
|
+
| `GSD_WORKFLOW_WRITE_GATE_MODULE` | Optional absolute path or `file:` URL for the shared write-gate module used by workflow mutation tools. |
|
|
255
|
+
| `GSD_WORKFLOW_PROJECT_ROOT` | Canonical project root for workflow tools and the per-project MCP PID registry key. Defaults to the server's current working directory. |
|
|
256
|
+
| `GSD_HOME` | Global GSD directory. Also controls where `mcp-instances.json` is stored. |
|
|
248
257
|
|
|
249
258
|
The server also hydrates supported model-provider and tool credentials from `~/.gsd/agent/auth.json` on startup. Keys saved through `/gsd config` or `/gsd keys` become available to the MCP server process automatically, and any explicitly-set environment variable still wins.
|
|
250
259
|
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { Readable, Writable } from 'node:stream';
|
|
2
|
+
interface SessionManagerLike {
|
|
3
|
+
cleanup(): Promise<void>;
|
|
4
|
+
}
|
|
5
|
+
interface McpServerLike {
|
|
6
|
+
connect(transport: unknown): Promise<void>;
|
|
7
|
+
close(): Promise<void>;
|
|
8
|
+
}
|
|
9
|
+
interface StdioTransportConstructor {
|
|
10
|
+
new (input?: Readable, output?: Writable): unknown;
|
|
11
|
+
}
|
|
12
|
+
export interface RunMcpServerCliOptions {
|
|
13
|
+
cwd?: () => string;
|
|
14
|
+
env?: NodeJS.ProcessEnv;
|
|
15
|
+
exit?: (code: number) => never;
|
|
16
|
+
loadStoredCredentialEnvKeys?: () => void;
|
|
17
|
+
registerMcpInstance?: (projectDir: string) => boolean | void;
|
|
18
|
+
sweepProjectOrphanMcpServers?: (projectDir: string) => void;
|
|
19
|
+
unregisterMcpInstance?: (projectDir: string) => void;
|
|
20
|
+
createSessionManager?: () => SessionManagerLike;
|
|
21
|
+
createMcpServer?: (sessionManager: SessionManagerLike) => Promise<{
|
|
22
|
+
server: McpServerLike;
|
|
23
|
+
}>;
|
|
24
|
+
importStdioServerTransport?: () => Promise<{
|
|
25
|
+
StdioServerTransport: StdioTransportConstructor;
|
|
26
|
+
}>;
|
|
27
|
+
warmWorkflowToolBridges?: () => Promise<unknown> | unknown;
|
|
28
|
+
stdin?: Readable;
|
|
29
|
+
stdout?: Writable;
|
|
30
|
+
stderr?: Writable;
|
|
31
|
+
onSignal?: (signal: NodeJS.Signals, listener: () => void) => void;
|
|
32
|
+
now?: () => number;
|
|
33
|
+
setInterval?: typeof setInterval;
|
|
34
|
+
clearInterval?: typeof clearInterval;
|
|
35
|
+
isOrphaned?: () => boolean;
|
|
36
|
+
cleanupStepTimeoutMs?: number;
|
|
37
|
+
}
|
|
38
|
+
export declare function runMcpServerCli(options?: RunMcpServerCliOptions): Promise<void>;
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=cli-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-runner.d.ts","sourceRoot":"","sources":["../src/cli-runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAoBtD,UAAU,kBAAkB;IAC1B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,UAAU,aAAa;IACrB,OAAO,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,UAAU,yBAAyB;IACjC,KAAI,KAAK,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;CACnD;AAED,MAAM,WAAW,sBAAsB;IACrC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK,CAAC;IAC/B,2BAA2B,CAAC,EAAE,MAAM,IAAI,CAAC;IACzC,mBAAmB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,GAAG,IAAI,CAAC;IAC7D,4BAA4B,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5D,qBAAqB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACrD,oBAAoB,CAAC,EAAE,MAAM,kBAAkB,CAAC;IAChD,eAAe,CAAC,EAAE,CAAC,cAAc,EAAE,kBAAkB,KAAK,OAAO,CAAC;QAAE,MAAM,EAAE,aAAa,CAAA;KAAE,CAAC,CAAC;IAC7F,0BAA0B,CAAC,EAAE,MAAM,OAAO,CAAC;QAAE,oBAAoB,EAAE,yBAAyB,CAAA;KAAE,CAAC,CAAC;IAChG,uBAAuB,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IAC3D,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;IAClE,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,WAAW,CAAC;IACjC,aAAa,CAAC,EAAE,OAAO,aAAa,CAAC;IACrC,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC;IAC3B,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAkBD,wBAAsB,eAAe,CAAC,OAAO,GAAE,sBAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CAuHzF"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { SessionManager } from './session-manager.js';
|
|
2
|
+
import { createMcpServer } from './server.js';
|
|
3
|
+
import { loadStoredCredentialEnvKeys } from './tool-credentials.js';
|
|
4
|
+
import { warmWorkflowToolBridges } from './workflow-tools.js';
|
|
5
|
+
import { isMcpProbeSession } from './probe-mode.js';
|
|
6
|
+
import { registerMcpInstance, sweepProjectOrphanMcpServers, unregisterMcpInstance, } from './pid-registry.js';
|
|
7
|
+
import { createActivityTrackingInput } from './stdio-watchdog.js';
|
|
8
|
+
const MCP_PKG = '@modelcontextprotocol/sdk';
|
|
9
|
+
const STDIN_IDLE_TIMEOUT_MS = 5 * 60 * 1000;
|
|
10
|
+
const STDIN_IDLE_CHECK_INTERVAL_MS = 60 * 1000;
|
|
11
|
+
const CLEANUP_STEP_TIMEOUT_MS = 2 * 1000;
|
|
12
|
+
function createDefaultIsOrphaned(initialParentPid) {
|
|
13
|
+
return () => {
|
|
14
|
+
if (process.ppid !== initialParentPid)
|
|
15
|
+
return true;
|
|
16
|
+
try {
|
|
17
|
+
process.kill(initialParentPid, 0);
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
return err.code === 'ESRCH';
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
async function importDefaultStdioServerTransport() {
|
|
26
|
+
return import(`${MCP_PKG}/server/stdio.js`);
|
|
27
|
+
}
|
|
28
|
+
export async function runMcpServerCli(options = {}) {
|
|
29
|
+
const cwd = options.cwd ?? (() => process.cwd());
|
|
30
|
+
const env = options.env ?? process.env;
|
|
31
|
+
const exit = options.exit ?? ((code) => process.exit(code));
|
|
32
|
+
const stdin = options.stdin ?? process.stdin;
|
|
33
|
+
const stdout = options.stdout ?? process.stdout;
|
|
34
|
+
const stderr = options.stderr ?? process.stderr;
|
|
35
|
+
const onSignal = options.onSignal ?? ((signal, listener) => process.on(signal, listener));
|
|
36
|
+
const now = options.now ?? (() => Date.now());
|
|
37
|
+
const startInterval = options.setInterval ?? setInterval;
|
|
38
|
+
const stopInterval = options.clearInterval ?? clearInterval;
|
|
39
|
+
const isOrphaned = options.isOrphaned ?? createDefaultIsOrphaned(process.ppid);
|
|
40
|
+
const cleanupStepTimeoutMs = options.cleanupStepTimeoutMs ?? CLEANUP_STEP_TIMEOUT_MS;
|
|
41
|
+
const loadEnv = options.loadStoredCredentialEnvKeys ?? loadStoredCredentialEnvKeys;
|
|
42
|
+
const registerInstance = options.registerMcpInstance ?? registerMcpInstance;
|
|
43
|
+
const sweepOrphans = options.sweepProjectOrphanMcpServers ?? sweepProjectOrphanMcpServers;
|
|
44
|
+
const unregisterInstance = options.unregisterMcpInstance ?? unregisterMcpInstance;
|
|
45
|
+
const createSessionManager = options.createSessionManager ?? (() => new SessionManager());
|
|
46
|
+
const createServer = options.createMcpServer ?? (async (manager) => createMcpServer(manager));
|
|
47
|
+
const importTransport = options.importStdioServerTransport ?? importDefaultStdioServerTransport;
|
|
48
|
+
const warmBridges = options.warmWorkflowToolBridges ?? warmWorkflowToolBridges;
|
|
49
|
+
loadEnv();
|
|
50
|
+
const projectDir = env.GSD_WORKFLOW_PROJECT_ROOT || cwd();
|
|
51
|
+
const probeSession = isMcpProbeSession(env);
|
|
52
|
+
let registered = false;
|
|
53
|
+
let cleaningUp = false;
|
|
54
|
+
let idleWatchdog;
|
|
55
|
+
let trackedStdin;
|
|
56
|
+
let sessionManager;
|
|
57
|
+
let server;
|
|
58
|
+
async function runCleanupStep(label, step) {
|
|
59
|
+
let timeout;
|
|
60
|
+
try {
|
|
61
|
+
await Promise.race([
|
|
62
|
+
Promise.resolve().then(step),
|
|
63
|
+
new Promise((resolve) => {
|
|
64
|
+
timeout = setTimeout(() => {
|
|
65
|
+
stderr.write(`[gsd-mcp-server] Cleanup step timed out: ${label}\n`);
|
|
66
|
+
resolve();
|
|
67
|
+
}, cleanupStepTimeoutMs);
|
|
68
|
+
timeout.unref();
|
|
69
|
+
}),
|
|
70
|
+
]);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
}
|
|
74
|
+
finally {
|
|
75
|
+
if (timeout)
|
|
76
|
+
clearTimeout(timeout);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async function stopRuntime() {
|
|
80
|
+
if (idleWatchdog)
|
|
81
|
+
stopInterval(idleWatchdog);
|
|
82
|
+
trackedStdin?.close();
|
|
83
|
+
if (registered)
|
|
84
|
+
unregisterInstance(projectDir);
|
|
85
|
+
await runCleanupStep('session manager cleanup', () => sessionManager?.cleanup());
|
|
86
|
+
await runCleanupStep('server close', () => server?.close());
|
|
87
|
+
}
|
|
88
|
+
async function cleanup(code = 0) {
|
|
89
|
+
if (cleaningUp)
|
|
90
|
+
return;
|
|
91
|
+
cleaningUp = true;
|
|
92
|
+
stderr.write('[gsd-mcp-server] Shutting down...\n');
|
|
93
|
+
await stopRuntime();
|
|
94
|
+
exit(code);
|
|
95
|
+
}
|
|
96
|
+
onSignal('SIGTERM', () => void cleanup());
|
|
97
|
+
onSignal('SIGINT', () => void cleanup());
|
|
98
|
+
stdin.once('end', () => void cleanup());
|
|
99
|
+
stdin.once('close', () => void cleanup());
|
|
100
|
+
stdin.once('error', () => void cleanup(1));
|
|
101
|
+
try {
|
|
102
|
+
if (!probeSession) {
|
|
103
|
+
sweepOrphans(projectDir);
|
|
104
|
+
if (registerInstance(projectDir) === false) {
|
|
105
|
+
throw new Error('refusing to start: existing MCP server PID could not be verified');
|
|
106
|
+
}
|
|
107
|
+
registered = true;
|
|
108
|
+
}
|
|
109
|
+
sessionManager = createSessionManager();
|
|
110
|
+
({ server } = await createServer(sessionManager));
|
|
111
|
+
const { StdioServerTransport } = await importTransport();
|
|
112
|
+
trackedStdin = createActivityTrackingInput(stdin, now);
|
|
113
|
+
const transport = new StdioServerTransport(trackedStdin.input, stdout);
|
|
114
|
+
idleWatchdog = startInterval(() => {
|
|
115
|
+
if (trackedStdin && now() - trackedStdin.lastActivityAt() > STDIN_IDLE_TIMEOUT_MS && isOrphaned()) {
|
|
116
|
+
stderr.write(`[gsd-mcp-server] Idle stdin watchdog: no activity for ${STDIN_IDLE_TIMEOUT_MS / 1000}s and parent process is gone, shutting down\n`);
|
|
117
|
+
void cleanup();
|
|
118
|
+
}
|
|
119
|
+
}, STDIN_IDLE_CHECK_INTERVAL_MS);
|
|
120
|
+
idleWatchdog.unref();
|
|
121
|
+
// Fail closed (ADR-036): warm the executor / write-gate bridges BEFORE
|
|
122
|
+
// connecting the transport. If a bridge is broken we must not advertise the
|
|
123
|
+
// workflow tool surface — a rejection here propagates to the catch below so
|
|
124
|
+
// startup aborts and the client never sees tools that would error on first
|
|
125
|
+
// call. A healthy warm-up pre-pays the bridge import so the first real tool
|
|
126
|
+
// call stays fast.
|
|
127
|
+
await warmBridges();
|
|
128
|
+
stderr.write('[gsd-mcp-server] workflow bridges ready\n');
|
|
129
|
+
await server.connect(transport);
|
|
130
|
+
stderr.write('[gsd-mcp-server] MCP server started on stdio\n');
|
|
131
|
+
}
|
|
132
|
+
catch (err) {
|
|
133
|
+
stderr.write(`[gsd-mcp-server] Fatal: failed to start — ${err instanceof Error ? err.message : String(err)}\n`);
|
|
134
|
+
await cleanup(1);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=cli-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-runner.js","sourceRoot":"","sources":["../src/cli-runner.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Readable, Writable } from 'node:stream';\n\nimport { SessionManager } from './session-manager.js';\nimport { createMcpServer } from './server.js';\nimport { loadStoredCredentialEnvKeys } from './tool-credentials.js';\nimport { warmWorkflowToolBridges } from './workflow-tools.js';\nimport { isMcpProbeSession } from './probe-mode.js';\nimport {\n registerMcpInstance,\n sweepProjectOrphanMcpServers,\n unregisterMcpInstance,\n} from './pid-registry.js';\nimport { createActivityTrackingInput, type ActivityTrackingInput } from './stdio-watchdog.js';\n\nconst MCP_PKG = '@modelcontextprotocol/sdk';\n\nconst STDIN_IDLE_TIMEOUT_MS = 5 * 60 * 1000;\nconst STDIN_IDLE_CHECK_INTERVAL_MS = 60 * 1000;\nconst CLEANUP_STEP_TIMEOUT_MS = 2 * 1000;\n\ninterface SessionManagerLike {\n cleanup(): Promise<void>;\n}\n\ninterface McpServerLike {\n connect(transport: unknown): Promise<void>;\n close(): Promise<void>;\n}\n\ninterface StdioTransportConstructor {\n new(input?: Readable, output?: Writable): unknown;\n}\n\nexport interface RunMcpServerCliOptions {\n cwd?: () => string;\n env?: NodeJS.ProcessEnv;\n exit?: (code: number) => never;\n loadStoredCredentialEnvKeys?: () => void;\n registerMcpInstance?: (projectDir: string) => boolean | void;\n sweepProjectOrphanMcpServers?: (projectDir: string) => void;\n unregisterMcpInstance?: (projectDir: string) => void;\n createSessionManager?: () => SessionManagerLike;\n createMcpServer?: (sessionManager: SessionManagerLike) => Promise<{ server: McpServerLike }>;\n importStdioServerTransport?: () => Promise<{ StdioServerTransport: StdioTransportConstructor }>;\n warmWorkflowToolBridges?: () => Promise<unknown> | unknown;\n stdin?: Readable;\n stdout?: Writable;\n stderr?: Writable;\n onSignal?: (signal: NodeJS.Signals, listener: () => void) => void;\n now?: () => number;\n setInterval?: typeof setInterval;\n clearInterval?: typeof clearInterval;\n isOrphaned?: () => boolean;\n cleanupStepTimeoutMs?: number;\n}\n\nfunction createDefaultIsOrphaned(initialParentPid: number): () => boolean {\n return () => {\n if (process.ppid !== initialParentPid) return true;\n try {\n process.kill(initialParentPid, 0);\n return false;\n } catch (err) {\n return (err as NodeJS.ErrnoException).code === 'ESRCH';\n }\n };\n}\n\nasync function importDefaultStdioServerTransport(): Promise<{ StdioServerTransport: StdioTransportConstructor }> {\n return import(`${MCP_PKG}/server/stdio.js`) as Promise<{ StdioServerTransport: StdioTransportConstructor }>;\n}\n\nexport async function runMcpServerCli(options: RunMcpServerCliOptions = {}): Promise<void> {\n const cwd = options.cwd ?? (() => process.cwd());\n const env = options.env ?? process.env;\n const exit = options.exit ?? ((code: number): never => process.exit(code));\n const stdin = options.stdin ?? process.stdin;\n const stdout = options.stdout ?? process.stdout;\n const stderr = options.stderr ?? process.stderr;\n const onSignal = options.onSignal ?? ((signal, listener) => process.on(signal, listener));\n const now = options.now ?? (() => Date.now());\n const startInterval = options.setInterval ?? setInterval;\n const stopInterval = options.clearInterval ?? clearInterval;\n const isOrphaned = options.isOrphaned ?? createDefaultIsOrphaned(process.ppid);\n const cleanupStepTimeoutMs = options.cleanupStepTimeoutMs ?? CLEANUP_STEP_TIMEOUT_MS;\n const loadEnv = options.loadStoredCredentialEnvKeys ?? loadStoredCredentialEnvKeys;\n const registerInstance = options.registerMcpInstance ?? registerMcpInstance;\n const sweepOrphans = options.sweepProjectOrphanMcpServers ?? sweepProjectOrphanMcpServers;\n const unregisterInstance = options.unregisterMcpInstance ?? unregisterMcpInstance;\n const createSessionManager = options.createSessionManager ?? (() => new SessionManager());\n const createServer = options.createMcpServer ?? (\n async (manager: SessionManagerLike) => createMcpServer(manager as SessionManager)\n );\n const importTransport = options.importStdioServerTransport ?? importDefaultStdioServerTransport;\n const warmBridges = options.warmWorkflowToolBridges ?? warmWorkflowToolBridges;\n\n loadEnv();\n\n const projectDir = env.GSD_WORKFLOW_PROJECT_ROOT || cwd();\n const probeSession = isMcpProbeSession(env);\n let registered = false;\n let cleaningUp = false;\n let idleWatchdog: ReturnType<typeof setInterval> | undefined;\n let trackedStdin: ActivityTrackingInput | undefined;\n let sessionManager: SessionManagerLike | undefined;\n let server: McpServerLike | undefined;\n\n async function runCleanupStep(label: string, step: () => Promise<void> | void): Promise<void> {\n let timeout: ReturnType<typeof setTimeout> | undefined;\n try {\n await Promise.race([\n Promise.resolve().then(step),\n new Promise<void>((resolve) => {\n timeout = setTimeout(() => {\n stderr.write(`[gsd-mcp-server] Cleanup step timed out: ${label}\\n`);\n resolve();\n }, cleanupStepTimeoutMs);\n timeout.unref();\n }),\n ]);\n } catch {\n } finally {\n if (timeout) clearTimeout(timeout);\n }\n }\n\n async function stopRuntime(): Promise<void> {\n if (idleWatchdog) stopInterval(idleWatchdog);\n trackedStdin?.close();\n if (registered) unregisterInstance(projectDir);\n await runCleanupStep('session manager cleanup', () => sessionManager?.cleanup());\n await runCleanupStep('server close', () => server?.close());\n }\n\n async function cleanup(code = 0): Promise<void> {\n if (cleaningUp) return;\n cleaningUp = true;\n stderr.write('[gsd-mcp-server] Shutting down...\\n');\n await stopRuntime();\n exit(code);\n }\n\n onSignal('SIGTERM', () => void cleanup());\n onSignal('SIGINT', () => void cleanup());\n stdin.once('end', () => void cleanup());\n stdin.once('close', () => void cleanup());\n stdin.once('error', () => void cleanup(1));\n\n try {\n if (!probeSession) {\n sweepOrphans(projectDir);\n if (registerInstance(projectDir) === false) {\n throw new Error('refusing to start: existing MCP server PID could not be verified');\n }\n registered = true;\n }\n\n sessionManager = createSessionManager();\n ({ server } = await createServer(sessionManager));\n\n const { StdioServerTransport } = await importTransport();\n trackedStdin = createActivityTrackingInput(stdin, now);\n const transport = new StdioServerTransport(trackedStdin.input, stdout);\n\n idleWatchdog = startInterval(() => {\n if (trackedStdin && now() - trackedStdin.lastActivityAt() > STDIN_IDLE_TIMEOUT_MS && isOrphaned()) {\n stderr.write(\n `[gsd-mcp-server] Idle stdin watchdog: no activity for ${STDIN_IDLE_TIMEOUT_MS / 1000}s and parent process is gone, shutting down\\n`,\n );\n void cleanup();\n }\n }, STDIN_IDLE_CHECK_INTERVAL_MS);\n idleWatchdog.unref();\n\n // Fail closed (ADR-036): warm the executor / write-gate bridges BEFORE\n // connecting the transport. If a bridge is broken we must not advertise the\n // workflow tool surface — a rejection here propagates to the catch below so\n // startup aborts and the client never sees tools that would error on first\n // call. A healthy warm-up pre-pays the bridge import so the first real tool\n // call stays fast.\n await warmBridges();\n stderr.write('[gsd-mcp-server] workflow bridges ready\\n');\n\n await server.connect(transport);\n stderr.write('[gsd-mcp-server] MCP server started on stdio\\n');\n } catch (err) {\n stderr.write(\n `[gsd-mcp-server] Fatal: failed to start — ${err instanceof Error ? err.message : String(err)}\\n`,\n );\n await cleanup(1);\n }\n}\n"]}
|
|
@@ -4,66 +4,10 @@
|
|
|
4
4
|
* Connects the MCP server to stdin/stdout for use by Claude Code,
|
|
5
5
|
* Cursor, and other MCP-compatible clients.
|
|
6
6
|
*/
|
|
7
|
-
import { SessionManager } from './session-manager.js';
|
|
8
|
-
import { createMcpServer } from './server.js';
|
|
9
7
|
import { installGlobalErrorHandlers } from './cli-errors.js';
|
|
10
|
-
import {
|
|
11
|
-
import { warmWorkflowToolBridges } from './workflow-tools.js';
|
|
12
|
-
const MCP_PKG = '@modelcontextprotocol/sdk';
|
|
8
|
+
import { runMcpServerCli } from './cli-runner.js';
|
|
13
9
|
installGlobalErrorHandlers();
|
|
14
|
-
|
|
15
|
-
loadStoredCredentialEnvKeys();
|
|
16
|
-
const sessionManager = new SessionManager();
|
|
17
|
-
// Create the configured MCP server with session, interactive, read-only,
|
|
18
|
-
// and workflow tools.
|
|
19
|
-
const { server } = await createMcpServer(sessionManager);
|
|
20
|
-
// Dynamic import for StdioServerTransport (same TS subpath workaround)
|
|
21
|
-
const { StdioServerTransport } = await import(`${MCP_PKG}/server/stdio.js`);
|
|
22
|
-
const transport = new StdioServerTransport();
|
|
23
|
-
// Cleanup handler — stop all sessions before exiting
|
|
24
|
-
let cleaningUp = false;
|
|
25
|
-
async function cleanup() {
|
|
26
|
-
if (cleaningUp)
|
|
27
|
-
return;
|
|
28
|
-
cleaningUp = true;
|
|
29
|
-
process.stderr.write('[gsd-mcp-server] Shutting down...\n');
|
|
30
|
-
try {
|
|
31
|
-
await sessionManager.cleanup();
|
|
32
|
-
}
|
|
33
|
-
catch {
|
|
34
|
-
// swallow cleanup errors
|
|
35
|
-
}
|
|
36
|
-
try {
|
|
37
|
-
await server.close();
|
|
38
|
-
}
|
|
39
|
-
catch {
|
|
40
|
-
// swallow close errors
|
|
41
|
-
}
|
|
42
|
-
process.exit(0);
|
|
43
|
-
}
|
|
44
|
-
process.on('SIGTERM', () => void cleanup());
|
|
45
|
-
process.on('SIGINT', () => void cleanup());
|
|
46
|
-
// Handle stdin end — MCP client disconnected
|
|
47
|
-
process.stdin.on('end', () => void cleanup());
|
|
48
|
-
// ponytail: connect first so the client can enumerate tools ~400ms sooner.
|
|
49
|
-
// ADR-036 says "fail closed on broken bridges" — we trade that for startup
|
|
50
|
-
// speed here because: (a) broken bridges are deployment errors, not races,
|
|
51
|
-
// (b) each tool handler awaits the same cached promise so a broken bridge
|
|
52
|
-
// still produces a clear error on first call, and (c) the failure is logged
|
|
53
|
-
// loudly to stderr. Upgrade to Promise.all if silent degradation becomes
|
|
54
|
-
// an issue in practice.
|
|
55
|
-
try {
|
|
56
|
-
warmWorkflowToolBridges().then(() => process.stderr.write('[gsd-mcp-server] workflow bridges ready\n'), (err) => process.stderr.write(`[gsd-mcp-server] workflow bridge warm-up failed (tools will error on first call): ${err instanceof Error ? err.message : String(err)}\n`));
|
|
57
|
-
await server.connect(transport);
|
|
58
|
-
process.stderr.write('[gsd-mcp-server] MCP server started on stdio\n');
|
|
59
|
-
}
|
|
60
|
-
catch (err) {
|
|
61
|
-
process.stderr.write(`[gsd-mcp-server] Fatal: failed to start — ${err instanceof Error ? err.message : String(err)}\n`);
|
|
62
|
-
await sessionManager.cleanup();
|
|
63
|
-
process.exit(1);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
main().catch((err) => {
|
|
10
|
+
runMcpServerCli().catch((err) => {
|
|
67
11
|
process.stderr.write(`[gsd-mcp-server] Fatal: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
68
12
|
process.exit(1);
|
|
69
13
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,0BAA0B,EAAE,CAAC;AAE7B,eAAe,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,2BAA2B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAChF,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC","sourcesContent":["/**\n * @opengsd/mcp-server CLI — stdio transport entry point.\n *\n * Connects the MCP server to stdin/stdout for use by Claude Code,\n * Cursor, and other MCP-compatible clients.\n */\n\nimport { installGlobalErrorHandlers } from './cli-errors.js';\nimport { runMcpServerCli } from './cli-runner.js';\n\ninstallGlobalErrorHandlers();\n\nrunMcpServerCli().catch((err) => {\n process.stderr.write(\n `[gsd-mcp-server] Fatal: ${err instanceof Error ? err.message : String(err)}\\n`\n );\n process.exit(1);\n});\n"]}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP server PID registry — tracks running instances per project so new
|
|
3
|
+
* launches can kill stale ones. Mirrors web-mode's web-instances.json pattern.
|
|
4
|
+
*/
|
|
5
|
+
export interface McpInstanceEntry {
|
|
6
|
+
pid: number;
|
|
7
|
+
projectDir: string;
|
|
8
|
+
startedAt: string;
|
|
9
|
+
}
|
|
10
|
+
export type McpInstanceRegistry = Record<string, McpInstanceEntry>;
|
|
11
|
+
export interface RegisterMcpInstanceOptions {
|
|
12
|
+
kill?: (pid: number, signal?: NodeJS.Signals | 0) => void;
|
|
13
|
+
getProcessCommand?: (pid: number) => string | null;
|
|
14
|
+
getProcessCwd?: (pid: number) => string | null;
|
|
15
|
+
getProcessStartTime?: (pid: number) => number | null;
|
|
16
|
+
waitForExit?: () => void;
|
|
17
|
+
}
|
|
18
|
+
export interface McpProcessSnapshot {
|
|
19
|
+
pid: number;
|
|
20
|
+
ppid: number;
|
|
21
|
+
command: string;
|
|
22
|
+
}
|
|
23
|
+
export interface SweepProjectOrphanMcpServersOptions {
|
|
24
|
+
kill?: (pid: number, signal?: NodeJS.Signals | 0) => void;
|
|
25
|
+
getProcessCwd?: (pid: number) => string | null;
|
|
26
|
+
listProcesses?: () => McpProcessSnapshot[];
|
|
27
|
+
isOrphaned?: (proc: McpProcessSnapshot) => boolean;
|
|
28
|
+
waitForExit?: () => void;
|
|
29
|
+
}
|
|
30
|
+
export interface SweepProjectOrphanMcpServersResult {
|
|
31
|
+
matched: number[];
|
|
32
|
+
terminated: number[];
|
|
33
|
+
forceKilled: number[];
|
|
34
|
+
skipped: number[];
|
|
35
|
+
}
|
|
36
|
+
export declare function readMcpRegistry(registryPath?: string): McpInstanceRegistry;
|
|
37
|
+
export declare function sweepProjectOrphanMcpServers(projectDir: string, options?: SweepProjectOrphanMcpServersOptions): SweepProjectOrphanMcpServersResult;
|
|
38
|
+
/**
|
|
39
|
+
* Kill any existing MCP server for this project, then register our PID.
|
|
40
|
+
*/
|
|
41
|
+
export declare function registerMcpInstance(projectDir: string, registryPath?: string, options?: RegisterMcpInstanceOptions): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Remove our PID from the registry on shutdown.
|
|
44
|
+
*/
|
|
45
|
+
export declare function unregisterMcpInstance(projectDir: string, registryPath?: string): void;
|
|
46
|
+
//# sourceMappingURL=pid-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pid-registry.d.ts","sourceRoot":"","sources":["../src/pid-registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;AAEnE,MAAM,WAAW,0BAA0B;IACzC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,OAAO,GAAG,CAAC,KAAK,IAAI,CAAC;IAC1D,iBAAiB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACnD,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC/C,mBAAmB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACrD,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mCAAmC;IAClD,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,OAAO,GAAG,CAAC,KAAK,IAAI,CAAC;IAC1D,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC/C,aAAa,CAAC,EAAE,MAAM,kBAAkB,EAAE,CAAC;IAC3C,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,OAAO,CAAC;IACnD,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,kCAAkC;IACjD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAaD,wBAAgB,eAAe,CAAC,YAAY,SAAgB,GAAG,mBAAmB,CAwCjF;AA+QD,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,mCAAwC,GAChD,kCAAkC,CAgDpC;AAkED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,YAAY,SAAgB,EAC5B,OAAO,GAAE,0BAA+B,GACvC,OAAO,CAgCT;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,SAAgB,GAAG,IAAI,CAa5F"}
|