@opengsd/gsd-pi 1.4.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -11
- package/dist/onboarding.js +11 -0
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +20 -25
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +118 -53
- package/dist/resources/extensions/cursor-cli/index.js +16 -0
- package/dist/resources/extensions/cursor-cli/models.js +63 -0
- package/dist/resources/extensions/cursor-cli/package.json +11 -0
- package/dist/resources/extensions/cursor-cli/readiness.js +128 -0
- package/dist/resources/extensions/cursor-cli/stream-adapter.js +353 -0
- package/dist/resources/extensions/gsd/activity-log.js +4 -1
- package/dist/resources/extensions/gsd/artifact-verification.js +25 -9
- package/dist/resources/extensions/gsd/auto/closeout.js +45 -42
- package/dist/resources/extensions/gsd/auto/finalize.js +9 -0
- package/dist/resources/extensions/gsd/auto/orchestrator.js +1 -1
- package/dist/resources/extensions/gsd/auto/run-unit.js +5 -2
- package/dist/resources/extensions/gsd/auto/schedule-wakeup.js +3 -0
- package/dist/resources/extensions/gsd/auto-dispatch.js +15 -5
- package/dist/resources/extensions/gsd/auto-model-selection.js +36 -18
- package/dist/resources/extensions/gsd/auto-prompts.js +76 -2
- package/dist/resources/extensions/gsd/auto-start.js +4 -3
- package/dist/resources/extensions/gsd/auto-timeout-recovery.js +4 -0
- package/dist/resources/extensions/gsd/auto-worktree.js +38 -11
- package/dist/resources/extensions/gsd/auto.js +23 -3
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +3 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +114 -5
- package/dist/resources/extensions/gsd/bootstrap/schedule-wakeup-tool.js +58 -9
- package/dist/resources/extensions/gsd/bootstrap/tool-call-loop-guard.js +10 -2
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +14 -1
- package/dist/resources/extensions/gsd/codebase-generator.js +157 -19
- package/dist/resources/extensions/gsd/commands/handlers/core.js +40 -4
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +153 -1
- package/dist/resources/extensions/gsd/commands-worktree.js +11 -2
- package/dist/resources/extensions/gsd/db/queries.js +39 -0
- package/dist/resources/extensions/gsd/discussion-handoff.js +8 -3
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +8 -2
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +206 -14
- package/dist/resources/extensions/gsd/doctor-providers.js +38 -10
- package/dist/resources/extensions/gsd/doctor.js +93 -3
- package/dist/resources/extensions/gsd/exec-sandbox.js +6 -2
- package/dist/resources/extensions/gsd/flat-phase-migration.js +74 -23
- package/dist/resources/extensions/gsd/git-service.js +14 -18
- package/dist/resources/extensions/gsd/gsd-db.js +52 -0
- package/dist/resources/extensions/gsd/guidance.js +1 -0
- package/dist/resources/extensions/gsd/guided-flow.js +40 -2
- package/dist/resources/extensions/gsd/key-manager.js +1 -0
- package/dist/resources/extensions/gsd/markdown-renderer.js +25 -8
- package/dist/resources/extensions/gsd/migrate-external.js +24 -7
- package/dist/resources/extensions/gsd/milestone-merge-transaction.js +3 -3
- package/dist/resources/extensions/gsd/preferences-diagnostics.js +24 -1
- package/dist/resources/extensions/gsd/preferences-models.js +6 -4
- package/dist/resources/extensions/gsd/preferences-validation.js +25 -2
- package/dist/resources/extensions/gsd/preferences.js +29 -2
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -2
- package/dist/resources/extensions/gsd/redact-secrets.js +37 -0
- package/dist/resources/extensions/gsd/repo-identity.js +16 -0
- package/dist/resources/extensions/gsd/repository-registry.js +6 -1
- package/dist/resources/extensions/gsd/root-write-leak-guard.js +4 -2
- package/dist/resources/extensions/gsd/safe-fs.js +23 -2
- package/dist/resources/extensions/gsd/skills/gsd-headless/SKILL.md +7 -9
- package/dist/resources/extensions/gsd/skills/gsd-headless/references/commands.md +1 -0
- package/dist/resources/extensions/gsd/tools/plan-task.js +76 -8
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +40 -0
- package/dist/resources/extensions/gsd/unit-context-manifest.js +5 -4
- package/dist/resources/extensions/gsd/unit-registry.js +27 -2
- package/dist/resources/extensions/gsd/unit-runtime.js +21 -0
- package/dist/resources/extensions/gsd/workspace.js +26 -8
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +67 -5
- package/dist/resources/extensions/gsd/worktree-manager.js +97 -4
- 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 +7 -7
- package/dist/web/standalone/.next/build-manifest.json +2 -2
- 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/update/route.js +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 +7 -7
- 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/node_modules/@gsd/native/package.json +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/wizard.d.ts +8 -0
- package/dist/wizard.js +8 -1
- package/integrations/hermes/CONTEXT.md +47 -0
- package/integrations/hermes/README.md +21 -0
- package/integrations/hermes/__init__.py +31 -0
- package/integrations/hermes/docs/issue-1162-grilling.md +197 -0
- package/integrations/hermes/docs/setup.md +4 -0
- package/integrations/hermes/open_gsd_hermes/commands.py +141 -0
- package/integrations/hermes/open_gsd_hermes/config.py +2 -0
- package/integrations/hermes/open_gsd_hermes/gsd_client.py +594 -31
- package/integrations/hermes/open_gsd_hermes/notifications.py +10 -1
- package/integrations/hermes/plugin.yaml +4 -0
- package/integrations/hermes/tests/test_config.py +6 -0
- package/integrations/hermes/tests/test_directory_loader.py +37 -0
- package/integrations/hermes/tests/test_gsd_client_cache.py +3 -0
- package/integrations/hermes/tests/test_gsd_client_execute.py +35 -0
- package/integrations/hermes/tests/test_gsd_client_process_cwd.py +22 -0
- package/integrations/hermes/tests/test_gsd_client_timeout.py +98 -0
- package/integrations/hermes/tests/test_milestone_client.py +447 -0
- package/integrations/hermes/tests/test_new_milestone_command.py +313 -0
- package/integrations/hermes/tests/test_supervisor_fsm.py +40 -0
- package/package.json +8 -8
- package/packages/cloud-mcp-gateway/dist/auth-store.d.ts +1 -0
- package/packages/cloud-mcp-gateway/dist/auth-store.d.ts.map +1 -1
- package/packages/cloud-mcp-gateway/dist/auth-store.js +21 -1
- package/packages/cloud-mcp-gateway/dist/auth-store.js.map +1 -1
- package/packages/cloud-mcp-gateway/dist/auth-store.test.js +34 -0
- package/packages/cloud-mcp-gateway/dist/auth-store.test.js.map +1 -1
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/dist/cloud-runtime.d.ts +2 -0
- package/packages/daemon/dist/cloud-runtime.d.ts.map +1 -1
- package/packages/daemon/dist/cloud-runtime.js +25 -1
- package/packages/daemon/dist/cloud-runtime.js.map +1 -1
- package/packages/daemon/dist/cloud-runtime.test.js +51 -0
- package/packages/daemon/dist/cloud-runtime.test.js.map +1 -1
- package/packages/daemon/dist/message-batcher.d.ts +7 -0
- package/packages/daemon/dist/message-batcher.d.ts.map +1 -1
- package/packages/daemon/dist/message-batcher.js +13 -0
- package/packages/daemon/dist/message-batcher.js.map +1 -1
- package/packages/daemon/dist/message-batcher.test.js +48 -0
- package/packages/daemon/dist/message-batcher.test.js.map +1 -1
- package/packages/daemon/dist/session-manager.js +1 -1
- package/packages/daemon/dist/session-manager.js.map +1 -1
- package/packages/daemon/package.json +5 -5
- package/packages/gsd-agent-core/dist/compaction/compaction.d.ts +13 -1
- package/packages/gsd-agent-core/dist/compaction/compaction.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/compaction/compaction.js +15 -1
- package/packages/gsd-agent-core/dist/compaction/compaction.js.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-navigation.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-navigation.js +4 -1
- package/packages/gsd-agent-core/dist/session/agent-session-navigation.js.map +1 -1
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.js +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/dist/server.d.ts +18 -5
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +46 -5
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/session-manager.js +1 -1
- package/packages/mcp-server/dist/session-manager.js.map +1 -1
- package/packages/mcp-server/package.json +4 -4
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/env-api-keys.d.ts.map +1 -1
- package/packages/pi-ai/dist/env-api-keys.js +3 -0
- package/packages/pi-ai/dist/env-api-keys.js.map +1 -1
- package/packages/pi-ai/dist/types.d.ts +2 -2
- package/packages/pi-ai/dist/types.d.ts.map +1 -1
- package/packages/pi-ai/dist/types.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.js +1 -0
- package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager-types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.js +3 -0
- package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/dist/rpc-client.js +1 -1
- package/packages/rpc-client/dist/rpc-client.js.map +1 -1
- package/packages/rpc-client/package.json +2 -2
- package/pkg/package.json +1 -1
- package/scripts/link-workspace-packages.cjs +14 -4
- package/src/resources/GSD-WORKFLOW.md +20 -25
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +130 -51
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +371 -39
- package/src/resources/extensions/cursor-cli/index.ts +18 -0
- package/src/resources/extensions/cursor-cli/models.ts +65 -0
- package/src/resources/extensions/cursor-cli/package.json +11 -0
- package/src/resources/extensions/cursor-cli/readiness.ts +143 -0
- package/src/resources/extensions/cursor-cli/stream-adapter.ts +440 -0
- package/src/resources/extensions/cursor-cli/tests/index.test.ts +54 -0
- package/src/resources/extensions/cursor-cli/tests/readiness.test.ts +29 -0
- package/src/resources/extensions/cursor-cli/tests/stream-adapter.test.ts +166 -0
- package/src/resources/extensions/gsd/activity-log.ts +4 -1
- package/src/resources/extensions/gsd/artifact-verification.ts +25 -9
- package/src/resources/extensions/gsd/auto/closeout.ts +54 -56
- package/src/resources/extensions/gsd/auto/finalize.ts +8 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
- package/src/resources/extensions/gsd/auto/orchestrator.ts +1 -1
- package/src/resources/extensions/gsd/auto/run-unit.ts +5 -2
- package/src/resources/extensions/gsd/auto/schedule-wakeup.ts +8 -0
- package/src/resources/extensions/gsd/auto-dispatch.ts +17 -5
- package/src/resources/extensions/gsd/auto-model-selection.ts +49 -18
- package/src/resources/extensions/gsd/auto-prompts.ts +73 -2
- package/src/resources/extensions/gsd/auto-start.ts +4 -3
- package/src/resources/extensions/gsd/auto-timeout-recovery.ts +4 -0
- package/src/resources/extensions/gsd/auto-worktree.ts +50 -11
- package/src/resources/extensions/gsd/auto.ts +22 -3
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +3 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +128 -5
- package/src/resources/extensions/gsd/bootstrap/schedule-wakeup-tool.ts +80 -12
- package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +12 -2
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +23 -1
- package/src/resources/extensions/gsd/codebase-generator.ts +179 -18
- package/src/resources/extensions/gsd/commands/handlers/core.ts +39 -3
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +135 -1
- package/src/resources/extensions/gsd/commands-worktree.ts +13 -2
- package/src/resources/extensions/gsd/db/queries.ts +40 -0
- package/src/resources/extensions/gsd/discussion-handoff.ts +10 -2
- package/src/resources/extensions/gsd/docs/preferences-reference.md +8 -2
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +269 -18
- package/src/resources/extensions/gsd/doctor-providers.ts +39 -10
- package/src/resources/extensions/gsd/doctor-types.ts +5 -1
- package/src/resources/extensions/gsd/doctor.ts +95 -3
- package/src/resources/extensions/gsd/exec-sandbox.ts +6 -2
- package/src/resources/extensions/gsd/flat-phase-migration.ts +98 -22
- package/src/resources/extensions/gsd/git-service.ts +14 -17
- package/src/resources/extensions/gsd/gsd-db.ts +72 -0
- package/src/resources/extensions/gsd/guidance.ts +2 -0
- package/src/resources/extensions/gsd/guided-flow.ts +45 -2
- package/src/resources/extensions/gsd/key-manager.ts +1 -0
- package/src/resources/extensions/gsd/markdown-renderer.ts +25 -7
- package/src/resources/extensions/gsd/migrate-external.ts +23 -6
- package/src/resources/extensions/gsd/milestone-merge-transaction.ts +4 -4
- package/src/resources/extensions/gsd/model-router.ts +4 -5
- package/src/resources/extensions/gsd/preferences-diagnostics.ts +24 -0
- package/src/resources/extensions/gsd/preferences-models.ts +6 -3
- package/src/resources/extensions/gsd/preferences-validation.ts +28 -2
- package/src/resources/extensions/gsd/preferences.ts +38 -4
- package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -2
- package/src/resources/extensions/gsd/redact-secrets.ts +40 -0
- package/src/resources/extensions/gsd/repo-identity.ts +17 -0
- package/src/resources/extensions/gsd/repository-registry.ts +7 -1
- package/src/resources/extensions/gsd/root-write-leak-guard.ts +3 -2
- package/src/resources/extensions/gsd/safe-fs.ts +22 -2
- package/src/resources/extensions/gsd/skills/gsd-headless/SKILL.md +7 -9
- package/src/resources/extensions/gsd/skills/gsd-headless/references/commands.md +1 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +131 -5
- package/src/resources/extensions/gsd/tests/auto-migrating-recovery.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +178 -0
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +43 -1
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +54 -0
- package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +41 -0
- package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +41 -0
- package/src/resources/extensions/gsd/tests/auto-session-scope.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/auto-timeout-recovery-harness-abort.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/batch-task-query.test.ts +85 -0
- package/src/resources/extensions/gsd/tests/check-auto-start-ready-guard.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +365 -0
- package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +62 -1
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +138 -1
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +397 -5
- package/src/resources/extensions/gsd/tests/doctor-workspace.test.ts +207 -0
- package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +38 -1
- package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +87 -19
- package/src/resources/extensions/gsd/tests/gate-1b-orphan-discrimination.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +122 -0
- package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +116 -0
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +152 -22
- package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +50 -6
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +17 -0
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +264 -1
- package/src/resources/extensions/gsd/tests/preferences.test.ts +150 -0
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +142 -0
- package/src/resources/extensions/gsd/tests/recovery-verify-logs.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/redact-secrets.test.ts +56 -0
- package/src/resources/extensions/gsd/tests/register-hooks-flat-phase-migration.test.ts +73 -0
- package/src/resources/extensions/gsd/tests/register-hooks-loop-guard-auto.test.ts +275 -0
- package/src/resources/extensions/gsd/tests/repository-registry.test.ts +41 -2
- package/src/resources/extensions/gsd/tests/require-slice-discussion-dispatch.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/root-write-leak-guard.test.ts +31 -9
- package/src/resources/extensions/gsd/tests/schedule-wakeup-tool.test.ts +167 -0
- package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +49 -0
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/status-per-repo.test.ts +94 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +66 -18
- package/src/resources/extensions/gsd/tests/unit-registry.test.ts +56 -0
- package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +52 -0
- package/src/resources/extensions/gsd/tests/validator-scope-parity.test.ts +53 -1
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +208 -1
- package/src/resources/extensions/gsd/tests/workspace.test.ts +18 -4
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +31 -1
- package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +32 -0
- package/src/resources/extensions/gsd/tools/plan-task.ts +107 -9
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +58 -0
- package/src/resources/extensions/gsd/unit-context-manifest.ts +11 -5
- package/src/resources/extensions/gsd/unit-registry.ts +34 -2
- package/src/resources/extensions/gsd/unit-runtime.ts +42 -0
- package/src/resources/extensions/gsd/workspace.ts +42 -8
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +135 -11
- package/src/resources/extensions/gsd/worktree-manager.ts +143 -5
- /package/dist/web/standalone/.next/static/{zQLcXm0Za8lexoXtgDpMG → bCg3aYrFN1DKZr2dqgE7L}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{zQLcXm0Za8lexoXtgDpMG → bCg3aYrFN1DKZr2dqgE7L}/_ssgManifest.js +0 -0
package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-segment-walker.js","sourceRoot":"","sources":["../../../../src/modes/interactive/controllers/chat-segment-walker.ts"],"names":[],"mappings":"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","sourcesContent":["// Project/App: gsd-pi\n// File Purpose: Segment walker and message_end rebuild for interactive chat streaming.\nimport type { InteractiveModeStateHost } from \"../interactive-mode-state.js\";\nimport type { RenderedSegment, StreamingRenderState } from \"../streaming-render-state.js\";\nimport { AssistantMessageComponent } from \"../components/assistant-message.js\";\nimport type { TimestampFormat } from \"../components/timestamp.js\";\nimport { reconcileChatTurnConnections } from \"../components/chat-turn-connect.js\";\nimport { ToolExecutionComponent } from \"../components/tool-execution.js\";\nimport { markFirstVisibleAssistantOutput } from \"./chat-controller-latency.js\";\nimport {\n\tbuildDesiredSegmentsForMessage,\n\tfilterRedundantDiscussTextRuns,\n\tgetProvisionalPreToolPrunePlan,\n\tgetTextFromContentBlocks,\n\tisProvisionalPreToolProse,\n\tisSubTurnTextReplacement,\n\tshouldSuppressRedundantHandoffText,\n} from \"./chat-handoff-filter.js\";\nimport { registerPendingToolComponent } from \"./chat-tool-rollup.js\";\n\n/** Host surface for streaming helpers — extends state host with mode methods. */\ntype ChatStreamHost = InteractiveModeStateHost & {\n\tformatWebSearchResult: (content: unknown) => string;\n\tgetRegisteredToolDefinition: (toolName: string) => any;\n\tgetMarkdownThemeWithSettings: () => any;\n};\n\nexport function applySubTurnContentShrink(\n\trs: StreamingRenderState,\n\tcontentBlocks: Array<any>,\n): void {\n\tconst replacedAt = contentBlocks.length <= rs.lastContentLength\n\t\t? isSubTurnTextReplacement(contentBlocks, rs.renderedSegments)\n\t\t: null;\n\tif (contentBlocks.length < rs.lastContentLength) {\n\t\t// Accumulate across successive shrinks — overwriting would drop\n\t\t// segments displaced by an earlier shrink, leaving them stranded\n\t\t// in chatContainer once the prune pass finally runs.\n\t\trs.orphanedSegments = [...rs.orphanedSegments, ...rs.renderedSegments];\n\t\trs.renderedSegments = [];\n\t\trs.lastPinnedText = \"\";\n\t\trs.lastProcessedContentIndex = 0;\n\t} else if (replacedAt !== null) {\n\t\t// Same-index wholesale replacement: orphan only the replaced\n\t\t// text-run and any text-runs after it. Earlier unchanged text\n\t\t// and tool segments stay in rs.renderedSegments so they are not\n\t\t// re-rendered and duplicated in chatContainer.\n\t\trs.orphanedSegments = [\n\t\t\t...rs.orphanedSegments,\n\t\t\t...rs.renderedSegments.filter((seg) => seg.kind === \"text-run\" && seg.startIndex >= replacedAt),\n\t\t];\n\t\trs.renderedSegments = rs.renderedSegments.filter(\n\t\t\t(seg) => !(seg.kind === \"text-run\" && seg.startIndex >= replacedAt),\n\t\t);\n\t\trs.lastPinnedText = \"\";\n\t\trs.lastProcessedContentIndex = replacedAt;\n\t} else if (rs.lastProcessedContentIndex >= contentBlocks.length) {\n\t\trs.lastProcessedContentIndex = 0;\n\t}\n\trs.lastContentLength = contentBlocks.length;\n}\n\nexport function scanNewContentBlocks(\n\thost: ChatStreamHost,\n\trs: StreamingRenderState,\n\tcontentBlocks: Array<any>,\n): void {\n\tfor (let i = rs.lastProcessedContentIndex; i < contentBlocks.length; i++) {\n\t\tconst content = contentBlocks[i];\n\t\tif (content.type === \"toolCall\") {\n\t\t\tconst { component } = registerPendingToolComponent(\n\t\t\t\thost,\n\t\t\t\tcontent.id,\n\t\t\t\tcontent.name,\n\t\t\t\tcontent.arguments,\n\t\t\t\t\"content\",\n\t\t\t\t() =>\n\t\t\t\t\tnew ToolExecutionComponent(\n\t\t\t\t\t\tcontent.name,\n\t\t\t\t\t\tcontent.arguments,\n\t\t\t\t\t\t{ showImages: host.settingsManager.getShowImages() },\n\t\t\t\t\t\thost.getRegisteredToolDefinition(content.name),\n\t\t\t\t\t\thost.ui,\n\t\t\t\t\t),\n\t\t\t);\n\t\t\tcomponent.updateArgs(content.arguments);\n\t\t} else if (content.type === \"serverToolUse\") {\n\t\t\tregisterPendingToolComponent(\n\t\t\t\thost,\n\t\t\t\tcontent.id,\n\t\t\t\tcontent.name,\n\t\t\t\tcontent.input ?? {},\n\t\t\t\t\"content\",\n\t\t\t\t() =>\n\t\t\t\t\tnew ToolExecutionComponent(\n\t\t\t\t\t\tcontent.name,\n\t\t\t\t\t\tcontent.input ?? {},\n\t\t\t\t\t\t{ showImages: host.settingsManager.getShowImages() },\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\thost.ui,\n\t\t\t\t\t),\n\t\t\t);\n\t\t} else if (content.type === \"webSearchResult\") {\n\t\t\tconst component = host.pendingTools.get(content.toolUseId);\n\t\t\tif (component) {\n\t\t\t\tif (process.env.PI_OFFLINE === \"1\") {\n\t\t\t\t\tcomponent.updateResult({\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"Web search disabled (offline mode)\" }],\n\t\t\t\t\t\tisError: false,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tconst searchContent = content.content;\n\t\t\t\t\tconst isError = searchContent && typeof searchContent === \"object\" && \"type\" in (searchContent as any) && (searchContent as any).type === \"web_search_tool_result_error\";\n\t\t\t\t\tcomponent.updateResult({\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: host.formatWebSearchResult(searchContent) }],\n\t\t\t\t\t\tisError: !!isError,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport function runSegmentWalker(\n\thost: ChatStreamHost,\n\trs: StreamingRenderState,\n\ttimestampFormat: TimestampFormat,\n): void {\n\tconst blocks = host.streamingMessage.content;\n\t// Only prune provisional pre-tool prose after post-tool prose exists,\n\t// so MCP tool-only windows do not blank the assistant content.\n\tconst { shouldPrune: shouldPruneProvisionalPreToolProse } =\n\t\tgetProvisionalPreToolPrunePlan(host.streamingMessage);\n\tlet desired = buildDesiredSegmentsForMessage(host.streamingMessage, {\n\t\thideThinkingBlock: host.hideThinkingBlock,\n\t});\n\tdesired = filterRedundantDiscussTextRuns(desired, blocks);\n\n\t// Claude Code MCP can emit provisional pre-tool prose that gets\n\t// superseded by post-tool output. Prune stale text-run segments so\n\t// the final assistant output remains below tool output.\n\tif (shouldPruneProvisionalPreToolProse) {\n\t\tif (rs.orphanedSegments.length > 0) {\n\t\t\tconst remainingOrphans: RenderedSegment[] = [];\n\t\t\tfor (const orphan of rs.orphanedSegments) {\n\t\t\t\tif (\n\t\t\t\t\torphan.kind === \"text-run\"\n\t\t\t\t\t&& orphan.contentType === \"text\"\n\t\t\t\t\t&& isProvisionalPreToolProse(orphan.cachedText ?? \"\")\n\t\t\t\t) {\n\t\t\t\t\thost.chatContainer.removeChild(orphan.component);\n\t\t\t\t\tif (host.streamingComponent === orphan.component) {\n\t\t\t\t\t\thost.streamingComponent = undefined;\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tremainingOrphans.push(orphan);\n\t\t\t}\n\t\t\trs.orphanedSegments = remainingOrphans;\n\t\t}\n\t\tconst desiredTextKeys = new Set(\n\t\t\tdesired\n\t\t\t\t.filter((seg): seg is Extract<typeof desired[number], { kind: \"text-run\" }> => seg.kind === \"text-run\")\n\t\t\t\t.map((seg) => `${seg.contentType}:${seg.startIndex}`),\n\t\t);\n\t\tconst desiredToolIndices = new Set(\n\t\t\tdesired\n\t\t\t\t.filter((seg): seg is Extract<typeof desired[number], { kind: \"tool\" }> => seg.kind === \"tool\")\n\t\t\t\t.map((seg) => seg.contentIndex),\n\t\t);\n\t\tconst nextRendered: RenderedSegment[] = [];\n\t\tfor (const seg of rs.renderedSegments) {\n\t\t\tif (\n\t\t\t\tseg.kind === \"text-run\"\n\t\t\t\t&& seg.contentType === \"text\"\n\t\t\t\t&& !desiredTextKeys.has(`${seg.contentType}:${seg.startIndex}`)\n\t\t\t) {\n\t\t\t\thost.chatContainer.removeChild(seg.component);\n\t\t\t\tif (host.streamingComponent === seg.component) {\n\t\t\t\t\thost.streamingComponent = undefined;\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (seg.kind === \"tool\" && !desiredToolIndices.has(seg.contentIndex)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tnextRendered.push(seg);\n\t\t}\n\t\trs.renderedSegments = nextRendered;\n\t}\n\n\t// Append any newly needed segments (never reorder existing ones).\n\tfor (const seg of desired) {\n\t\tif (seg.kind === \"tool\") {\n\t\t\t// Tool segments are already handled above via pendingTools; just\n\t\t\t// register them in rs.renderedSegments if not yet tracked.\n\t\t\tconst existing = rs.renderedSegments.find(\n\t\t\t\t(s) => s.kind === \"tool\" && s.contentIndex === seg.contentIndex,\n\t\t\t);\n\t\t\tif (!existing) {\n\t\t\t\tconst comp = host.pendingTools.get(seg.toolId);\n\t\t\t\tif (comp) {\n\t\t\t\t\trs.renderedSegments.push({ kind: \"tool\", contentIndex: seg.contentIndex, component: comp });\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// text-run segment\n\t\t\tconst existing = rs.renderedSegments.find(\n\t\t\t\t(s) => s.kind === \"text-run\" && s.startIndex === seg.startIndex && s.contentType === seg.contentType,\n\t\t\t);\n\t\t\tif (!existing) {\n\t\t\t\tconst segmentText = getTextFromContentBlocks(blocks, seg.startIndex, seg.endIndex, seg.contentType);\n\t\t\t\tif (\n\t\t\t\t\tseg.contentType === \"text\" &&\n\t\t\t\t\tshouldSuppressRedundantHandoffText(\n\t\t\t\t\t\thost.session.messages,\n\t\t\t\t\t\tsegmentText,\n\t\t\t\t\t\trs.orphanedSegments,\n\t\t\t\t\t\trs.renderedSegments,\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst comp = new AssistantMessageComponent(\n\t\t\t\t\tundefined,\n\t\t\t\t\thost.hideThinkingBlock,\n\t\t\t\t\thost.getMarkdownThemeWithSettings(),\n\t\t\t\t\ttimestampFormat,\n\t\t\t\t\t{ startIndex: seg.startIndex, endIndex: seg.endIndex },\n\t\t\t\t);\n\t\t\t\thost.chatContainer.addChild(comp);\n\t\t\t\tcomp.updateContent(host.streamingMessage);\n\t\t\t\tmarkFirstVisibleAssistantOutput(host, seg.contentType, {\n\t\t\t\t\tcontentIndex: seg.startIndex,\n\t\t\t\t});\n\t\t\t\trs.renderedSegments.push({\n\t\t\t\t\tkind: \"text-run\",\n\t\t\t\t\tstartIndex: seg.startIndex,\n\t\t\t\t\tendIndex: seg.endIndex,\n\t\t\t\t\tcontentType: seg.contentType,\n\t\t\t\t\tcomponent: comp,\n\t\t\t\t\tcachedText: segmentText,\n\t\t\t\t});\n\t\t\t\thost.streamingComponent = comp;\n\t\t\t\treconcileChatTurnConnections(host.chatContainer.children);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Update all trailing text-run segments with the latest message so\n\t// streaming text grows in place.\n\tfor (const seg of rs.renderedSegments) {\n\t\tif (seg.kind === \"text-run\") {\n\t\t\t// Find corresponding desired segment to get current endIndex\n\t\t\tconst d = desired.find(\n\t\t\t\t(ds) => ds.kind === \"text-run\" && ds.startIndex === seg.startIndex && ds.contentType === seg.contentType,\n\t\t\t);\n\t\t\tif (d && d.kind === \"text-run\" && d.endIndex !== seg.endIndex) {\n\t\t\t\tseg.endIndex = d.endIndex;\n\t\t\t\tseg.component.setRange({ startIndex: seg.startIndex, endIndex: seg.endIndex });\n\t\t\t}\n\t\t\tconst newText = getTextFromContentBlocks(blocks, seg.startIndex, seg.endIndex, seg.contentType);\n\t\t\tif (newText !== seg.cachedText) {\n\t\t\t\tseg.cachedText = newText;\n\t\t\t\tseg.component.updateContent(host.streamingMessage);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Keep streamingComponent pointing at the last text-run for message_end compatibility.\n\tconst lastTextSeg = [...rs.renderedSegments].reverse().find((s) => s.kind === \"text-run\");\n\tif (lastTextSeg && lastTextSeg.kind === \"text-run\") {\n\t\thost.streamingComponent = lastTextSeg.component;\n\t}\n}\n\nexport function rebuildSegmentsOnMessageEnd(\n\thost: ChatStreamHost,\n\trs: StreamingRenderState,\n\ttimestampFormat: TimestampFormat,\n): void {\n\tif (rs.renderedSegments.length === 0) return;\n\n\tconst finalBlocks = host.streamingMessage.content;\n\tconst desired = filterRedundantDiscussTextRuns(\n\t\tbuildDesiredSegmentsForMessage(host.streamingMessage, {\n\t\t\thideThinkingBlock: host.hideThinkingBlock,\n\t\t}),\n\t\tfinalBlocks,\n\t);\n\n\tconst toolComponentsById = new Map<string, ToolExecutionComponent>();\n\tfor (const [toolId, component] of host.pendingTools.entries()) {\n\t\ttoolComponentsById.set(toolId, component);\n\t}\n\n\tfor (const seg of rs.renderedSegments) {\n\t\thost.chatContainer.removeChild(seg.component);\n\t\tif (seg.kind === \"tool\") {\n\t\t\tconst priorBlocks = host.streamingMessage.content;\n\t\t\tconst priorBlock = priorBlocks[seg.contentIndex] as any;\n\t\t\tif (priorBlock?.id && !toolComponentsById.has(priorBlock.id)) {\n\t\t\t\ttoolComponentsById.set(priorBlock.id, seg.component);\n\t\t\t}\n\t\t}\n\t}\n\trs.renderedSegments = [];\n\thost.streamingComponent = undefined;\n\n\tfor (const seg of desired) {\n\t\tif (seg.kind === \"tool\") {\n\t\t\tconst finalBlock = finalBlocks[seg.contentIndex] as any;\n\t\t\tlet component = toolComponentsById.get(seg.toolId);\n\t\t\tif (!component && finalBlock?.id) {\n\t\t\t\tcomponent = host.pendingTools.get(finalBlock.id);\n\t\t\t}\n\t\t\tif (!component && finalBlock?.type === \"toolCall\") {\n\t\t\t\tcomponent = new ToolExecutionComponent(\n\t\t\t\t\tfinalBlock.name,\n\t\t\t\t\tfinalBlock.arguments,\n\t\t\t\t\t{ showImages: host.settingsManager.getShowImages() },\n\t\t\t\t\thost.getRegisteredToolDefinition(finalBlock.name),\n\t\t\t\t\thost.ui,\n\t\t\t\t);\n\t\t\t\tcomponent.setExpanded(host.toolOutputExpanded);\n\t\t\t\thost.pendingTools.set(finalBlock.id, component);\n\t\t\t\ttoolComponentsById.set(finalBlock.id, component);\n\t\t\t} else if (!component && finalBlock?.type === \"serverToolUse\") {\n\t\t\t\tcomponent = new ToolExecutionComponent(\n\t\t\t\t\tfinalBlock.name,\n\t\t\t\t\tfinalBlock.input ?? {},\n\t\t\t\t\t{ showImages: host.settingsManager.getShowImages() },\n\t\t\t\t\tundefined,\n\t\t\t\t\thost.ui,\n\t\t\t\t);\n\t\t\t\tcomponent.setExpanded(host.toolOutputExpanded);\n\t\t\t\thost.pendingTools.set(finalBlock.id, component);\n\t\t\t\ttoolComponentsById.set(finalBlock.id, component);\n\t\t\t}\n\t\t\tif (component) {\n\t\t\t\thost.chatContainer.addChild(component);\n\t\t\t\trs.renderedSegments.push({ kind: \"tool\", contentIndex: seg.contentIndex, component });\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst comp = new AssistantMessageComponent(\n\t\t\tundefined,\n\t\t\thost.hideThinkingBlock,\n\t\t\thost.getMarkdownThemeWithSettings(),\n\t\t\ttimestampFormat,\n\t\t\t{ startIndex: seg.startIndex, endIndex: seg.endIndex },\n\t\t);\n\t\tcomp.updateContent(host.streamingMessage);\n\t\tconst segmentText = getTextFromContentBlocks(finalBlocks, seg.startIndex, seg.endIndex, seg.contentType);\n\t\tif (\n\t\t\tseg.contentType === \"text\" &&\n\t\t\tshouldSuppressRedundantHandoffText(\n\t\t\t\thost.session.messages,\n\t\t\t\tsegmentText,\n\t\t\t\trs.orphanedSegments,\n\t\t\t\trs.renderedSegments,\n\t\t\t)\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\t\thost.chatContainer.addChild(comp);\n\t\tmarkFirstVisibleAssistantOutput(host, seg.contentType, {\n\t\t\tcontentIndex: seg.startIndex,\n\t\t\tsource: \"message_end_rebuild\",\n\t\t});\n\t\trs.renderedSegments.push({\n\t\t\tkind: \"text-run\",\n\t\t\tstartIndex: seg.startIndex,\n\t\t\tendIndex: seg.endIndex,\n\t\t\tcontentType: seg.contentType,\n\t\t\tcomponent: comp,\n\t\t\tcachedText: segmentText,\n\t\t});\n\t\thost.streamingComponent = comp;\n\t}\n\treconcileChatTurnConnections(host.chatContainer.children);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"chat-segment-walker.js","sourceRoot":"","sources":["../../../../src/modes/interactive/controllers/chat-segment-walker.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAE/E,OAAO,EAAE,4BAA4B,EAAE,MAAM,oCAAoC,CAAC;AAClF,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,+BAA+B,EAAE,MAAM,8BAA8B,CAAC;AAC/E,OAAO,EACN,8BAA8B,EAC9B,8BAA8B,EAC9B,8BAA8B,EAC9B,wBAAwB,EACxB,yBAAyB,EACzB,wBAAwB,EACxB,kCAAkC,GAClC,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AASrE,MAAM,UAAU,yBAAyB,CACxC,EAAwB,EACxB,aAAyB;IAEzB,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,IAAI,EAAE,CAAC,iBAAiB;QAC9D,CAAC,CAAC,wBAAwB,CAAC,aAAa,EAAE,EAAE,CAAC,gBAAgB,CAAC;QAC9D,CAAC,CAAC,IAAI,CAAC;IACR,IAAI,aAAa,CAAC,MAAM,GAAG,EAAE,CAAC,iBAAiB,EAAE,CAAC;QACjD,gEAAgE;QAChE,iEAAiE;QACjE,qDAAqD;QACrD,EAAE,CAAC,gBAAgB,GAAG,CAAC,GAAG,EAAE,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,CAAC;QACvE,EAAE,CAAC,gBAAgB,GAAG,EAAE,CAAC;QACzB,EAAE,CAAC,cAAc,GAAG,EAAE,CAAC;QACvB,EAAE,CAAC,yBAAyB,GAAG,CAAC,CAAC;IAClC,CAAC;SAAM,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QAChC,6DAA6D;QAC7D,8DAA8D;QAC9D,gEAAgE;QAChE,+CAA+C;QAC/C,EAAE,CAAC,gBAAgB,GAAG;YACrB,GAAG,EAAE,CAAC,gBAAgB;YACtB,GAAG,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,UAAU,IAAI,GAAG,CAAC,UAAU,IAAI,UAAU,CAAC;SAC/F,CAAC;QACF,EAAE,CAAC,gBAAgB,GAAG,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAC/C,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,UAAU,IAAI,GAAG,CAAC,UAAU,IAAI,UAAU,CAAC,CACnE,CAAC;QACF,EAAE,CAAC,cAAc,GAAG,EAAE,CAAC;QACvB,EAAE,CAAC,yBAAyB,GAAG,UAAU,CAAC;IAC3C,CAAC;SAAM,IAAI,EAAE,CAAC,yBAAyB,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;QACjE,EAAE,CAAC,yBAAyB,GAAG,CAAC,CAAC;IAClC,CAAC;IACD,EAAE,CAAC,iBAAiB,GAAG,aAAa,CAAC,MAAM,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,oBAAoB,CACnC,IAAoB,EACpB,EAAwB,EACxB,aAAyB;IAEzB,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC,yBAAyB,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1E,MAAM,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QACjC,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACjC,MAAM,EAAE,SAAS,EAAE,GAAG,4BAA4B,CACjD,IAAI,EACJ,OAAO,CAAC,EAAE,EACV,OAAO,CAAC,IAAI,EACZ,OAAO,CAAC,SAAS,EACjB,SAAS,EACT,GAAG,EAAE,CACJ,IAAI,sBAAsB,CACzB,OAAO,CAAC,IAAI,EACZ,OAAO,CAAC,SAAS,EACjB,EAAE,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,EAAE,EACpD,IAAI,CAAC,2BAA2B,CAAC,OAAO,CAAC,IAAI,CAAC,EAC9C,IAAI,CAAC,EAAE,CACP,CACF,CAAC;YACF,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACzC,CAAC;aAAM,IAAI,OAAO,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;YAC7C,4BAA4B,CAC3B,IAAI,EACJ,OAAO,CAAC,EAAE,EACV,OAAO,CAAC,IAAI,EACZ,OAAO,CAAC,KAAK,IAAI,EAAE,EACnB,SAAS,EACT,GAAG,EAAE,CACJ,IAAI,sBAAsB,CACzB,OAAO,CAAC,IAAI,EACZ,OAAO,CAAC,KAAK,IAAI,EAAE,EACnB,EAAE,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,EAAE,EACpD,SAAS,EACT,IAAI,CAAC,EAAE,CACP,CACF,CAAC;QACH,CAAC;aAAM,IAAI,OAAO,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;YAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC3D,IAAI,SAAS,EAAE,CAAC;gBACf,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;oBACpC,SAAS,CAAC,YAAY,CAAC;wBACtB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,oCAAoC,EAAE,CAAC;wBACvE,OAAO,EAAE,KAAK;qBACd,CAAC,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACP,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;oBACtC,MAAM,OAAO,GAAG,aAAa,IAAI,OAAO,aAAa,KAAK,QAAQ,IAAI,MAAM,IAAK,aAAqB,IAAK,aAAqB,CAAC,IAAI,KAAK,8BAA8B,CAAC;oBACzK,SAAS,CAAC,YAAY,CAAC;wBACtB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,qBAAqB,CAAC,aAAa,CAAC,EAAE,CAAC;wBAC5E,OAAO,EAAE,CAAC,CAAC,OAAO;qBAClB,CAAC,CAAC;gBACJ,CAAC;YACF,CAAC;QACF,CAAC;IACF,CAAC;AACF,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC/B,IAAoB,EACpB,EAAwB,EACxB,eAAgC;IAEhC,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;IAC7C,sEAAsE;IACtE,+DAA+D;IAC/D,MAAM,EAAE,WAAW,EAAE,kCAAkC,EAAE,GACxD,8BAA8B,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACvD,IAAI,OAAO,GAAG,8BAA8B,CAAC,IAAI,CAAC,gBAAgB,EAAE;QACnE,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;KACzC,CAAC,CAAC;IACH,OAAO,GAAG,8BAA8B,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAE1D,gEAAgE;IAChE,mEAAmE;IACnE,wDAAwD;IACxD,IAAI,kCAAkC,EAAE,CAAC;QACxC,IAAI,EAAE,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpC,MAAM,gBAAgB,GAAsB,EAAE,CAAC;YAC/C,KAAK,MAAM,MAAM,IAAI,EAAE,CAAC,gBAAgB,EAAE,CAAC;gBAC1C,IACC,MAAM,CAAC,IAAI,KAAK,UAAU;uBACvB,MAAM,CAAC,WAAW,KAAK,MAAM;uBAC7B,yBAAyB,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,EACpD,CAAC;oBACF,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;oBACjD,IAAI,IAAI,CAAC,kBAAkB,KAAK,MAAM,CAAC,SAAS,EAAE,CAAC;wBAClD,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;oBACrC,CAAC;oBACD,SAAS;gBACV,CAAC;gBACD,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC/B,CAAC;YACD,EAAE,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;QACxC,CAAC;QACD,MAAM,eAAe,GAAG,IAAI,GAAG,CAC9B,OAAO;aACL,MAAM,CAAC,CAAC,GAAG,EAAgE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,UAAU,CAAC;aACtG,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CACtD,CAAC;QACF,MAAM,kBAAkB,GAAG,IAAI,GAAG,CACjC,OAAO;aACL,MAAM,CAAC,CAAC,GAAG,EAA4D,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC;aAC9F,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,CAChC,CAAC;QACF,MAAM,YAAY,GAAsB,EAAE,CAAC;QAC3C,KAAK,MAAM,GAAG,IAAI,EAAE,CAAC,gBAAgB,EAAE,CAAC;YACvC,IACC,GAAG,CAAC,IAAI,KAAK,UAAU;mBACpB,GAAG,CAAC,WAAW,KAAK,MAAM;mBAC1B,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,EAC9D,CAAC;gBACF,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBAC9C,IAAI,IAAI,CAAC,kBAAkB,KAAK,GAAG,CAAC,SAAS,EAAE,CAAC;oBAC/C,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;gBACrC,CAAC;gBACD,SAAS;YACV,CAAC;YACD,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;gBACtE,SAAS;YACV,CAAC;YACD,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;QACD,EAAE,CAAC,gBAAgB,GAAG,YAAY,CAAC;IACpC,CAAC;IAED,kEAAkE;IAClE,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC3B,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACzB,iEAAiE;YACjE,2DAA2D;YAC3D,MAAM,QAAQ,GAAG,EAAE,CAAC,gBAAgB,CAAC,IAAI,CACxC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,YAAY,KAAK,GAAG,CAAC,YAAY,CAC/D,CAAC;YACF,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACf,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAC/C,IAAI,IAAI,EAAE,CAAC;oBACV,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,CAAC,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC7F,CAAC;YACF,CAAC;QACF,CAAC;aAAM,CAAC;YACP,mBAAmB;YACnB,MAAM,QAAQ,GAAG,EAAE,CAAC,gBAAgB,CAAC,IAAI,CACxC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,CAAC,UAAU,KAAK,GAAG,CAAC,UAAU,IAAI,CAAC,CAAC,WAAW,KAAK,GAAG,CAAC,WAAW,CACpG,CAAC;YACF,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACf,MAAM,WAAW,GAAG,wBAAwB,CAAC,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;gBACpG,IACC,GAAG,CAAC,WAAW,KAAK,MAAM;oBAC1B,kCAAkC,CACjC,IAAI,CAAC,OAAO,CAAC,QAAQ,EACrB,WAAW,EACX,EAAE,CAAC,gBAAgB,EACnB,EAAE,CAAC,gBAAgB,CACnB,EACA,CAAC;oBACF,SAAS;gBACV,CAAC;gBACD,MAAM,IAAI,GAAG,IAAI,yBAAyB,CACzC,SAAS,EACT,IAAI,CAAC,iBAAiB,EACtB,IAAI,CAAC,4BAA4B,EAAE,EACnC,eAAe,EACf,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CACtD,CAAC;gBACF,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAClC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBAC1C,+BAA+B,CAAC,IAAI,EAAE,GAAG,CAAC,WAAW,EAAE;oBACtD,YAAY,EAAE,GAAG,CAAC,UAAU;iBAC5B,CAAC,CAAC;gBACH,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC;oBACxB,IAAI,EAAE,UAAU;oBAChB,UAAU,EAAE,GAAG,CAAC,UAAU;oBAC1B,QAAQ,EAAE,GAAG,CAAC,QAAQ;oBACtB,WAAW,EAAE,GAAG,CAAC,WAAW;oBAC5B,SAAS,EAAE,IAAI;oBACf,UAAU,EAAE,WAAW;iBACvB,CAAC,CAAC;gBACH,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;gBAC/B,4BAA4B,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YAC3D,CAAC;QACF,CAAC;IACF,CAAC;IAED,mEAAmE;IACnE,iCAAiC;IACjC,KAAK,MAAM,GAAG,IAAI,EAAE,CAAC,gBAAgB,EAAE,CAAC;QACvC,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC7B,6DAA6D;YAC7D,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CACrB,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,UAAU,IAAI,EAAE,CAAC,UAAU,KAAK,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,WAAW,KAAK,GAAG,CAAC,WAAW,CACxG,CAAC;YACF,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,CAAC,QAAQ,KAAK,GAAG,CAAC,QAAQ,EAAE,CAAC;gBAC/D,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;gBAC1B,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;YAChF,CAAC;YACD,MAAM,OAAO,GAAG,wBAAwB,CAAC,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;YAChG,IAAI,OAAO,KAAK,GAAG,CAAC,UAAU,EAAE,CAAC;gBAChC,GAAG,CAAC,UAAU,GAAG,OAAO,CAAC;gBACzB,GAAG,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACpD,CAAC;QACF,CAAC;IACF,CAAC;IAED,uFAAuF;IACvF,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;IAC1F,IAAI,WAAW,IAAI,WAAW,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACpD,IAAI,CAAC,kBAAkB,GAAG,WAAW,CAAC,SAAS,CAAC;IACjD,CAAC;AACF,CAAC;AAED,MAAM,UAAU,2BAA2B,CAC1C,IAAoB,EACpB,EAAwB,EACxB,eAAgC;IAEhC,IAAI,EAAE,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAE7C,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;IAClD,MAAM,OAAO,GAAG,8BAA8B,CAC7C,8BAA8B,CAAC,IAAI,CAAC,gBAAgB,EAAE;QACrD,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;KACzC,CAAC,EACF,WAAW,CACX,CAAC;IAEF,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAkC,CAAC;IACrE,KAAK,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;QAC/D,kBAAkB,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,EAAE,CAAC,gBAAgB,EAAE,CAAC;QACvC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC9C,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACzB,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;YAClD,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,YAAY,CAAQ,CAAC;YACxD,IAAI,UAAU,EAAE,EAAE,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC;gBAC9D,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;YACtD,CAAC;QACF,CAAC;IACF,CAAC;IACD,EAAE,CAAC,gBAAgB,GAAG,EAAE,CAAC;IACzB,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;IAEpC,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC3B,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACzB,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,YAAY,CAAQ,CAAC;YACxD,IAAI,SAAS,GAAG,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACnD,IAAI,CAAC,SAAS,IAAI,UAAU,EAAE,EAAE,EAAE,CAAC;gBAClC,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAClD,CAAC;YACD,IAAI,CAAC,SAAS,IAAI,UAAU,EAAE,IAAI,KAAK,UAAU,EAAE,CAAC;gBACnD,SAAS,GAAG,IAAI,sBAAsB,CACrC,UAAU,CAAC,IAAI,EACf,UAAU,CAAC,SAAS,EACpB,EAAE,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,EAAE,EACpD,IAAI,CAAC,2BAA2B,CAAC,UAAU,CAAC,IAAI,CAAC,EACjD,IAAI,CAAC,EAAE,CACP,CAAC;gBACF,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;gBAC/C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;gBAChD,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;YAClD,CAAC;iBAAM,IAAI,CAAC,SAAS,IAAI,UAAU,EAAE,IAAI,KAAK,eAAe,EAAE,CAAC;gBAC/D,SAAS,GAAG,IAAI,sBAAsB,CACrC,UAAU,CAAC,IAAI,EACf,UAAU,CAAC,KAAK,IAAI,EAAE,EACtB,EAAE,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,EAAE,EACpD,SAAS,EACT,IAAI,CAAC,EAAE,CACP,CAAC;gBACF,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;gBAC/C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;gBAChD,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;YAClD,CAAC;YACD,IAAI,SAAS,EAAE,CAAC;gBACf,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;gBAC1C,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;gBACvC,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,CAAC,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC;YACvF,CAAC;YACD,SAAS;QACV,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,yBAAyB,CACzC,SAAS,EACT,IAAI,CAAC,iBAAiB,EACtB,IAAI,CAAC,4BAA4B,EAAE,EACnC,eAAe,EACf,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CACtD,CAAC;QACF,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC1C,MAAM,WAAW,GAAG,wBAAwB,CAAC,WAAW,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;QACzG,IACC,GAAG,CAAC,WAAW,KAAK,MAAM;YAC1B,kCAAkC,CACjC,IAAI,CAAC,OAAO,CAAC,QAAQ,EACrB,WAAW,EACX,EAAE,CAAC,gBAAgB,EACnB,EAAE,CAAC,gBAAgB,CACnB,EACA,CAAC;YACF,SAAS;QACV,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAClC,+BAA+B,CAAC,IAAI,EAAE,GAAG,CAAC,WAAW,EAAE;YACtD,YAAY,EAAE,GAAG,CAAC,UAAU;YAC5B,MAAM,EAAE,qBAAqB;SAC7B,CAAC,CAAC;QACH,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC;YACxB,IAAI,EAAE,UAAU;YAChB,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,SAAS,EAAE,IAAI;YACf,UAAU,EAAE,WAAW;SACvB,CAAC,CAAC;QACH,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAChC,CAAC;IACD,4BAA4B,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;AAC3D,CAAC","sourcesContent":["// Project/App: gsd-pi\n// File Purpose: Segment walker and message_end rebuild for interactive chat streaming.\nimport type { InteractiveModeStateHost } from \"../interactive-mode-state.js\";\nimport type { RenderedSegment, StreamingRenderState } from \"../streaming-render-state.js\";\nimport { AssistantMessageComponent } from \"../components/assistant-message.js\";\nimport type { TimestampFormat } from \"../components/timestamp.js\";\nimport { reconcileChatTurnConnections } from \"../components/chat-turn-connect.js\";\nimport { ToolExecutionComponent } from \"../components/tool-execution.js\";\nimport { markFirstVisibleAssistantOutput } from \"./chat-controller-latency.js\";\nimport {\n\tbuildDesiredSegmentsForMessage,\n\tfilterRedundantDiscussTextRuns,\n\tgetProvisionalPreToolPrunePlan,\n\tgetTextFromContentBlocks,\n\tisProvisionalPreToolProse,\n\tisSubTurnTextReplacement,\n\tshouldSuppressRedundantHandoffText,\n} from \"./chat-handoff-filter.js\";\nimport { registerPendingToolComponent } from \"./chat-tool-rollup.js\";\n\n/** Host surface for streaming helpers — extends state host with mode methods. */\ntype ChatStreamHost = InteractiveModeStateHost & {\n\tformatWebSearchResult: (content: unknown) => string;\n\tgetRegisteredToolDefinition: (toolName: string) => any;\n\tgetMarkdownThemeWithSettings: () => any;\n};\n\nexport function applySubTurnContentShrink(\n\trs: StreamingRenderState,\n\tcontentBlocks: Array<any>,\n): void {\n\tconst replacedAt = contentBlocks.length <= rs.lastContentLength\n\t\t? isSubTurnTextReplacement(contentBlocks, rs.renderedSegments)\n\t\t: null;\n\tif (contentBlocks.length < rs.lastContentLength) {\n\t\t// Accumulate across successive shrinks — overwriting would drop\n\t\t// segments displaced by an earlier shrink, leaving them stranded\n\t\t// in chatContainer once the prune pass finally runs.\n\t\trs.orphanedSegments = [...rs.orphanedSegments, ...rs.renderedSegments];\n\t\trs.renderedSegments = [];\n\t\trs.lastPinnedText = \"\";\n\t\trs.lastProcessedContentIndex = 0;\n\t} else if (replacedAt !== null) {\n\t\t// Same-index wholesale replacement: orphan only the replaced\n\t\t// text-run and any text-runs after it. Earlier unchanged text\n\t\t// and tool segments stay in rs.renderedSegments so they are not\n\t\t// re-rendered and duplicated in chatContainer.\n\t\trs.orphanedSegments = [\n\t\t\t...rs.orphanedSegments,\n\t\t\t...rs.renderedSegments.filter((seg) => seg.kind === \"text-run\" && seg.startIndex >= replacedAt),\n\t\t];\n\t\trs.renderedSegments = rs.renderedSegments.filter(\n\t\t\t(seg) => !(seg.kind === \"text-run\" && seg.startIndex >= replacedAt),\n\t\t);\n\t\trs.lastPinnedText = \"\";\n\t\trs.lastProcessedContentIndex = replacedAt;\n\t} else if (rs.lastProcessedContentIndex >= contentBlocks.length) {\n\t\trs.lastProcessedContentIndex = 0;\n\t}\n\trs.lastContentLength = contentBlocks.length;\n}\n\nexport function scanNewContentBlocks(\n\thost: ChatStreamHost,\n\trs: StreamingRenderState,\n\tcontentBlocks: Array<any>,\n): void {\n\tfor (let i = rs.lastProcessedContentIndex; i < contentBlocks.length; i++) {\n\t\tconst content = contentBlocks[i];\n\t\tif (content.type === \"toolCall\") {\n\t\t\tconst { component } = registerPendingToolComponent(\n\t\t\t\thost,\n\t\t\t\tcontent.id,\n\t\t\t\tcontent.name,\n\t\t\t\tcontent.arguments,\n\t\t\t\t\"content\",\n\t\t\t\t() =>\n\t\t\t\t\tnew ToolExecutionComponent(\n\t\t\t\t\t\tcontent.name,\n\t\t\t\t\t\tcontent.arguments,\n\t\t\t\t\t\t{ showImages: host.settingsManager.getShowImages() },\n\t\t\t\t\t\thost.getRegisteredToolDefinition(content.name),\n\t\t\t\t\t\thost.ui,\n\t\t\t\t\t),\n\t\t\t);\n\t\t\tcomponent.updateArgs(content.arguments);\n\t\t} else if (content.type === \"serverToolUse\") {\n\t\t\tregisterPendingToolComponent(\n\t\t\t\thost,\n\t\t\t\tcontent.id,\n\t\t\t\tcontent.name,\n\t\t\t\tcontent.input ?? {},\n\t\t\t\t\"content\",\n\t\t\t\t() =>\n\t\t\t\t\tnew ToolExecutionComponent(\n\t\t\t\t\t\tcontent.name,\n\t\t\t\t\t\tcontent.input ?? {},\n\t\t\t\t\t\t{ showImages: host.settingsManager.getShowImages() },\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\thost.ui,\n\t\t\t\t\t),\n\t\t\t);\n\t\t} else if (content.type === \"webSearchResult\") {\n\t\t\tconst component = host.pendingTools.get(content.toolUseId);\n\t\t\tif (component) {\n\t\t\t\tif (process.env.PI_OFFLINE === \"1\") {\n\t\t\t\t\tcomponent.updateResult({\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"Web search disabled (offline mode)\" }],\n\t\t\t\t\t\tisError: false,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tconst searchContent = content.content;\n\t\t\t\t\tconst isError = searchContent && typeof searchContent === \"object\" && \"type\" in (searchContent as any) && (searchContent as any).type === \"web_search_tool_result_error\";\n\t\t\t\t\tcomponent.updateResult({\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: host.formatWebSearchResult(searchContent) }],\n\t\t\t\t\t\tisError: !!isError,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport function runSegmentWalker(\n\thost: ChatStreamHost,\n\trs: StreamingRenderState,\n\ttimestampFormat: TimestampFormat,\n): void {\n\tconst blocks = host.streamingMessage.content;\n\t// Only prune provisional pre-tool prose after post-tool prose exists,\n\t// so MCP tool-only windows do not blank the assistant content.\n\tconst { shouldPrune: shouldPruneProvisionalPreToolProse } =\n\t\tgetProvisionalPreToolPrunePlan(host.streamingMessage);\n\tlet desired = buildDesiredSegmentsForMessage(host.streamingMessage, {\n\t\thideThinkingBlock: host.hideThinkingBlock,\n\t});\n\tdesired = filterRedundantDiscussTextRuns(desired, blocks);\n\n\t// Claude Code MCP can emit provisional pre-tool prose that gets\n\t// superseded by post-tool output. Prune stale text-run segments so\n\t// the final assistant output remains below tool output.\n\tif (shouldPruneProvisionalPreToolProse) {\n\t\tif (rs.orphanedSegments.length > 0) {\n\t\t\tconst remainingOrphans: RenderedSegment[] = [];\n\t\t\tfor (const orphan of rs.orphanedSegments) {\n\t\t\t\tif (\n\t\t\t\t\torphan.kind === \"text-run\"\n\t\t\t\t\t&& orphan.contentType === \"text\"\n\t\t\t\t\t&& isProvisionalPreToolProse(orphan.cachedText ?? \"\")\n\t\t\t\t) {\n\t\t\t\t\thost.chatContainer.removeChild(orphan.component);\n\t\t\t\t\tif (host.streamingComponent === orphan.component) {\n\t\t\t\t\t\thost.streamingComponent = undefined;\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tremainingOrphans.push(orphan);\n\t\t\t}\n\t\t\trs.orphanedSegments = remainingOrphans;\n\t\t}\n\t\tconst desiredTextKeys = new Set(\n\t\t\tdesired\n\t\t\t\t.filter((seg): seg is Extract<typeof desired[number], { kind: \"text-run\" }> => seg.kind === \"text-run\")\n\t\t\t\t.map((seg) => `${seg.contentType}:${seg.startIndex}`),\n\t\t);\n\t\tconst desiredToolIndices = new Set(\n\t\t\tdesired\n\t\t\t\t.filter((seg): seg is Extract<typeof desired[number], { kind: \"tool\" }> => seg.kind === \"tool\")\n\t\t\t\t.map((seg) => seg.contentIndex),\n\t\t);\n\t\tconst nextRendered: RenderedSegment[] = [];\n\t\tfor (const seg of rs.renderedSegments) {\n\t\t\tif (\n\t\t\t\tseg.kind === \"text-run\"\n\t\t\t\t&& seg.contentType === \"text\"\n\t\t\t\t&& !desiredTextKeys.has(`${seg.contentType}:${seg.startIndex}`)\n\t\t\t) {\n\t\t\t\thost.chatContainer.removeChild(seg.component);\n\t\t\t\tif (host.streamingComponent === seg.component) {\n\t\t\t\t\thost.streamingComponent = undefined;\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (seg.kind === \"tool\" && !desiredToolIndices.has(seg.contentIndex)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tnextRendered.push(seg);\n\t\t}\n\t\trs.renderedSegments = nextRendered;\n\t}\n\n\t// Append any newly needed segments (never reorder existing ones).\n\tfor (const seg of desired) {\n\t\tif (seg.kind === \"tool\") {\n\t\t\t// Tool segments are already handled above via pendingTools; just\n\t\t\t// register them in rs.renderedSegments if not yet tracked.\n\t\t\tconst existing = rs.renderedSegments.find(\n\t\t\t\t(s) => s.kind === \"tool\" && s.contentIndex === seg.contentIndex,\n\t\t\t);\n\t\t\tif (!existing) {\n\t\t\t\tconst comp = host.pendingTools.get(seg.toolId);\n\t\t\t\tif (comp) {\n\t\t\t\t\trs.renderedSegments.push({ kind: \"tool\", contentIndex: seg.contentIndex, component: comp });\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// text-run segment\n\t\t\tconst existing = rs.renderedSegments.find(\n\t\t\t\t(s) => s.kind === \"text-run\" && s.startIndex === seg.startIndex && s.contentType === seg.contentType,\n\t\t\t);\n\t\t\tif (!existing) {\n\t\t\t\tconst segmentText = getTextFromContentBlocks(blocks, seg.startIndex, seg.endIndex, seg.contentType);\n\t\t\t\tif (\n\t\t\t\t\tseg.contentType === \"text\" &&\n\t\t\t\t\tshouldSuppressRedundantHandoffText(\n\t\t\t\t\t\thost.session.messages,\n\t\t\t\t\t\tsegmentText,\n\t\t\t\t\t\trs.orphanedSegments,\n\t\t\t\t\t\trs.renderedSegments,\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst comp = new AssistantMessageComponent(\n\t\t\t\t\tundefined,\n\t\t\t\t\thost.hideThinkingBlock,\n\t\t\t\t\thost.getMarkdownThemeWithSettings(),\n\t\t\t\t\ttimestampFormat,\n\t\t\t\t\t{ startIndex: seg.startIndex, endIndex: seg.endIndex },\n\t\t\t\t);\n\t\t\t\thost.chatContainer.addChild(comp);\n\t\t\t\tcomp.updateContent(host.streamingMessage);\n\t\t\t\tmarkFirstVisibleAssistantOutput(host, seg.contentType, {\n\t\t\t\t\tcontentIndex: seg.startIndex,\n\t\t\t\t});\n\t\t\t\trs.renderedSegments.push({\n\t\t\t\t\tkind: \"text-run\",\n\t\t\t\t\tstartIndex: seg.startIndex,\n\t\t\t\t\tendIndex: seg.endIndex,\n\t\t\t\t\tcontentType: seg.contentType,\n\t\t\t\t\tcomponent: comp,\n\t\t\t\t\tcachedText: segmentText,\n\t\t\t\t});\n\t\t\t\thost.streamingComponent = comp;\n\t\t\t\treconcileChatTurnConnections(host.chatContainer.children);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Update all trailing text-run segments with the latest message so\n\t// streaming text grows in place.\n\tfor (const seg of rs.renderedSegments) {\n\t\tif (seg.kind === \"text-run\") {\n\t\t\t// Find corresponding desired segment to get current endIndex\n\t\t\tconst d = desired.find(\n\t\t\t\t(ds) => ds.kind === \"text-run\" && ds.startIndex === seg.startIndex && ds.contentType === seg.contentType,\n\t\t\t);\n\t\t\tif (d && d.kind === \"text-run\" && d.endIndex !== seg.endIndex) {\n\t\t\t\tseg.endIndex = d.endIndex;\n\t\t\t\tseg.component.setRange({ startIndex: seg.startIndex, endIndex: seg.endIndex });\n\t\t\t}\n\t\t\tconst newText = getTextFromContentBlocks(blocks, seg.startIndex, seg.endIndex, seg.contentType);\n\t\t\tif (newText !== seg.cachedText) {\n\t\t\t\tseg.cachedText = newText;\n\t\t\t\tseg.component.updateContent(host.streamingMessage);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Keep streamingComponent pointing at the last text-run for message_end compatibility.\n\tconst lastTextSeg = [...rs.renderedSegments].reverse().find((s) => s.kind === \"text-run\");\n\tif (lastTextSeg && lastTextSeg.kind === \"text-run\") {\n\t\thost.streamingComponent = lastTextSeg.component;\n\t}\n}\n\nexport function rebuildSegmentsOnMessageEnd(\n\thost: ChatStreamHost,\n\trs: StreamingRenderState,\n\ttimestampFormat: TimestampFormat,\n): void {\n\tif (rs.renderedSegments.length === 0) return;\n\n\tconst finalBlocks = host.streamingMessage.content;\n\tconst desired = filterRedundantDiscussTextRuns(\n\t\tbuildDesiredSegmentsForMessage(host.streamingMessage, {\n\t\t\thideThinkingBlock: host.hideThinkingBlock,\n\t\t}),\n\t\tfinalBlocks,\n\t);\n\n\tconst toolComponentsById = new Map<string, ToolExecutionComponent>();\n\tfor (const [toolId, component] of host.pendingTools.entries()) {\n\t\ttoolComponentsById.set(toolId, component);\n\t}\n\n\tfor (const seg of rs.renderedSegments) {\n\t\thost.chatContainer.removeChild(seg.component);\n\t\tif (seg.kind === \"tool\") {\n\t\t\tconst priorBlocks = host.streamingMessage.content;\n\t\t\tconst priorBlock = priorBlocks[seg.contentIndex] as any;\n\t\t\tif (priorBlock?.id && !toolComponentsById.has(priorBlock.id)) {\n\t\t\t\ttoolComponentsById.set(priorBlock.id, seg.component);\n\t\t\t}\n\t\t}\n\t}\n\trs.renderedSegments = [];\n\thost.streamingComponent = undefined;\n\n\tfor (const seg of desired) {\n\t\tif (seg.kind === \"tool\") {\n\t\t\tconst finalBlock = finalBlocks[seg.contentIndex] as any;\n\t\t\tlet component = toolComponentsById.get(seg.toolId);\n\t\t\tif (!component && finalBlock?.id) {\n\t\t\t\tcomponent = host.pendingTools.get(finalBlock.id);\n\t\t\t}\n\t\t\tif (!component && finalBlock?.type === \"toolCall\") {\n\t\t\t\tcomponent = new ToolExecutionComponent(\n\t\t\t\t\tfinalBlock.name,\n\t\t\t\t\tfinalBlock.arguments,\n\t\t\t\t\t{ showImages: host.settingsManager.getShowImages() },\n\t\t\t\t\thost.getRegisteredToolDefinition(finalBlock.name),\n\t\t\t\t\thost.ui,\n\t\t\t\t);\n\t\t\t\tcomponent.setExpanded(host.toolOutputExpanded);\n\t\t\t\thost.pendingTools.set(finalBlock.id, component);\n\t\t\t\ttoolComponentsById.set(finalBlock.id, component);\n\t\t\t} else if (!component && finalBlock?.type === \"serverToolUse\") {\n\t\t\t\tcomponent = new ToolExecutionComponent(\n\t\t\t\t\tfinalBlock.name,\n\t\t\t\t\tfinalBlock.input ?? {},\n\t\t\t\t\t{ showImages: host.settingsManager.getShowImages() },\n\t\t\t\t\tundefined,\n\t\t\t\t\thost.ui,\n\t\t\t\t);\n\t\t\t\tcomponent.setExpanded(host.toolOutputExpanded);\n\t\t\t\thost.pendingTools.set(finalBlock.id, component);\n\t\t\t\ttoolComponentsById.set(finalBlock.id, component);\n\t\t\t}\n\t\t\tif (component) {\n\t\t\t\thost.chatContainer.removeChild(component);\n\t\t\t\thost.chatContainer.addChild(component);\n\t\t\t\trs.renderedSegments.push({ kind: \"tool\", contentIndex: seg.contentIndex, component });\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst comp = new AssistantMessageComponent(\n\t\t\tundefined,\n\t\t\thost.hideThinkingBlock,\n\t\t\thost.getMarkdownThemeWithSettings(),\n\t\t\ttimestampFormat,\n\t\t\t{ startIndex: seg.startIndex, endIndex: seg.endIndex },\n\t\t);\n\t\tcomp.updateContent(host.streamingMessage);\n\t\tconst segmentText = getTextFromContentBlocks(finalBlocks, seg.startIndex, seg.endIndex, seg.contentType);\n\t\tif (\n\t\t\tseg.contentType === \"text\" &&\n\t\t\tshouldSuppressRedundantHandoffText(\n\t\t\t\thost.session.messages,\n\t\t\t\tsegmentText,\n\t\t\t\trs.orphanedSegments,\n\t\t\t\trs.renderedSegments,\n\t\t\t)\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\t\thost.chatContainer.addChild(comp);\n\t\tmarkFirstVisibleAssistantOutput(host, seg.contentType, {\n\t\t\tcontentIndex: seg.startIndex,\n\t\t\tsource: \"message_end_rebuild\",\n\t\t});\n\t\trs.renderedSegments.push({\n\t\t\tkind: \"text-run\",\n\t\t\tstartIndex: seg.startIndex,\n\t\t\tendIndex: seg.endIndex,\n\t\t\tcontentType: seg.contentType,\n\t\t\tcomponent: comp,\n\t\t\tcachedText: segmentText,\n\t\t});\n\t\thost.streamingComponent = comp;\n\t}\n\treconcileChatTurnConnections(host.chatContainer.children);\n}\n"]}
|
|
@@ -98,7 +98,7 @@ export class RpcClient {
|
|
|
98
98
|
const timeout = setTimeout(() => {
|
|
99
99
|
this.process?.kill("SIGKILL");
|
|
100
100
|
resolve();
|
|
101
|
-
},
|
|
101
|
+
}, 5000); // match shutdown()'s grace so a cooperative SIGTERM handler can finish
|
|
102
102
|
this.process?.on("exit", () => {
|
|
103
103
|
clearTimeout(timeout);
|
|
104
104
|
resolve();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpc-client.js","sourceRoot":"","sources":["../../../src/modes/rpc/rpc-client.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * RPC Client for programmatic access to the coding agent.\n *\n * Spawns the agent in RPC mode and provides a typed API for all operations.\n */\n\nimport { type ChildProcess, spawn } from \"node:child_process\";\nimport type { AgentEvent, AgentMessage, ThinkingLevel } from \"@gsd/pi-agent-core\";\nimport type { ImageContent } from \"@gsd/pi-ai\";\nimport type { SessionStats } from \"@gsd/agent-core\";\nimport type { BashResult } from \"@gsd/agent-core\";\nimport type { CompactionResult } from \"@gsd/agent-core/compaction/index.js\";\nimport { attachJsonlLineReader, serializeJsonLine } from \"./jsonl.js\";\nimport type { RpcCommand, RpcInitResult, RpcResponse, RpcSessionState, RpcSlashCommand } from \"./rpc-types.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Distributive Omit that works with union types */\ntype DistributiveOmit<T, K extends keyof T> = T extends unknown ? Omit<T, K> : never;\n\n/** RpcCommand without the id field (for internal send) */\ntype RpcCommandBody = DistributiveOmit<RpcCommand, \"id\">;\n\nexport interface RpcClientOptions {\n\t/** Path to the CLI entry point (default: searches for dist/cli.js) */\n\tcliPath?: string;\n\t/** Working directory for the agent */\n\tcwd?: string;\n\t/** Environment variables */\n\tenv?: Record<string, string>;\n\t/** Provider to use */\n\tprovider?: string;\n\t/** Model ID to use */\n\tmodel?: string;\n\t/** Additional CLI arguments */\n\targs?: string[];\n}\n\nexport interface ModelInfo {\n\tprovider: string;\n\tid: string;\n\tcontextWindow: number;\n\treasoning: boolean;\n}\n\nexport type RpcEventListener = (event: AgentEvent) => void;\n\n/** Cap on retained stderr tail (bytes) to bound heap for long-lived agents. */\nconst MAX_STDERR_BYTES = 64 * 1024;\n\n// ============================================================================\n// RPC Client\n// ============================================================================\n\nexport class RpcClient {\n\tprivate process: ChildProcess | null = null;\n\tprivate stopReadingStdout: (() => void) | null = null;\n\tprivate _stderrHandler?: (data: Buffer) => void;\n\tprivate eventListeners: RpcEventListener[] = [];\n\tprivate pendingRequests: Map<string, { resolve: (response: RpcResponse) => void; reject: (error: Error) => void }> =\n\t\tnew Map();\n\tprivate requestId = 0;\n\tprivate stderr = \"\";\n\n\tconstructor(private options: RpcClientOptions = {}) {}\n\n\t/**\n\t * Start the RPC agent process.\n\t */\n\tasync start(): Promise<void> {\n\t\tif (this.process) {\n\t\t\tthrow new Error(\"Client already started\");\n\t\t}\n\n\t\tconst cliPath = this.options.cliPath ?? \"dist/cli.js\";\n\t\tconst args = [\"--mode\", \"rpc\"];\n\n\t\tif (this.options.provider) {\n\t\t\targs.push(\"--provider\", this.options.provider);\n\t\t}\n\t\tif (this.options.model) {\n\t\t\targs.push(\"--model\", this.options.model);\n\t\t}\n\t\tif (this.options.args) {\n\t\t\targs.push(...this.options.args);\n\t\t}\n\n\t\tlet startupError: Error | null = null;\n\n\t\tthis.process = spawn(process.execPath, [cliPath, ...args], {\n\t\t\tcwd: this.options.cwd,\n\t\t\tenv: { ...process.env, ...this.options.env },\n\t\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\t});\n\n\t\tconst onProcessError = (error: Error) => {\n\t\t\tstartupError = this.handleProcessError(error);\n\t\t};\n\t\tthis.process.on(\"error\", onProcessError);\n\t\tthis.process.stdin?.on(\"error\", onProcessError);\n\n\t\t// Collect stderr for debugging. The agent process can run for hours/days,\n\t\t// so cap the retained tail to avoid unbounded heap growth — only the most\n\t\t// recent output is useful for error messages.\n\t\tthis._stderrHandler = (data: Buffer) => {\n\t\t\tthis.stderr += data.toString();\n\t\t\tif (this.stderr.length > MAX_STDERR_BYTES) {\n\t\t\t\tthis.stderr = this.stderr.slice(-MAX_STDERR_BYTES);\n\t\t\t}\n\t\t};\n\t\tthis.process.stderr?.on(\"data\", this._stderrHandler);\n\n\t\t// Set up strict JSONL reader for stdout.\n\t\tthis.stopReadingStdout = attachJsonlLineReader(this.process.stdout!, (line) => {\n\t\t\tthis.handleLine(line);\n\t\t});\n\n\t\t// Detect unexpected subprocess exit and reject all pending requests\n\t\tthis.process.on(\"exit\", (code, signal) => {\n\t\t\tif (this.pendingRequests.size > 0) {\n\t\t\t\tconst reason = signal ? `signal ${signal}` : `code ${code}`;\n\t\t\t\tconst error = new Error(`Agent process exited unexpectedly (${reason}). Stderr: ${this.stderr}`);\n\t\t\t\tthis.rejectPendingRequests(error);\n\t\t\t}\n\t\t});\n\n\t\t// Wait a moment for process to initialize\n\t\tawait new Promise((resolve) => setTimeout(resolve, 100));\n\n\t\tif (startupError) {\n\t\t\tthrow startupError;\n\t\t}\n\n\t\tif (this.process.exitCode !== null) {\n\t\t\tthrow new Error(`Agent process exited immediately with code ${this.process.exitCode}. Stderr: ${this.stderr}`);\n\t\t}\n\t}\n\n\t/**\n\t * Stop the RPC agent process.\n\t */\n\tasync stop(): Promise<void> {\n\t\tif (!this.process) return;\n\n\t\tthis.stopReadingStdout?.();\n\t\tthis.stopReadingStdout = null;\n\t\tif (this._stderrHandler) {\n\t\t\tthis.process.stderr?.removeListener(\"data\", this._stderrHandler);\n\t\t\tthis._stderrHandler = undefined;\n\t\t}\n\t\tthis.process.kill(\"SIGTERM\");\n\n\t\t// Wait for process to exit\n\t\tawait new Promise<void>((resolve) => {\n\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\tthis.process?.kill(\"SIGKILL\");\n\t\t\t\tresolve();\n\t\t\t}, 1000);\n\n\t\t\tthis.process?.on(\"exit\", () => {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t\tresolve();\n\t\t\t});\n\t\t});\n\n\t\tthis.process = null;\n\t\tthis.pendingRequests.clear();\n\t}\n\n\t/**\n\t * Subscribe to agent events.\n\t */\n\tonEvent(listener: RpcEventListener): () => void {\n\t\tthis.eventListeners.push(listener);\n\t\treturn () => {\n\t\t\tconst index = this.eventListeners.indexOf(listener);\n\t\t\tif (index !== -1) {\n\t\t\t\tthis.eventListeners.splice(index, 1);\n\t\t\t}\n\t\t};\n\t}\n\n\t/**\n\t * Get collected stderr output (useful for debugging).\n\t */\n\tgetStderr(): string {\n\t\treturn this.stderr;\n\t}\n\n\t// =========================================================================\n\t// Command Methods\n\t// =========================================================================\n\n\t/**\n\t * Send a prompt to the agent.\n\t * Returns immediately after sending; use onEvent() to receive streaming events.\n\t * Use waitForIdle() to wait for completion.\n\t */\n\tasync prompt(message: string, images?: ImageContent[]): Promise<void> {\n\t\tawait this.send({ type: \"prompt\", message, images });\n\t}\n\n\t/**\n\t * Queue a steering message to interrupt the agent mid-run.\n\t */\n\tasync steer(message: string, images?: ImageContent[]): Promise<void> {\n\t\tawait this.send({ type: \"steer\", message, images });\n\t}\n\n\t/**\n\t * Queue a follow-up message to be processed after the agent finishes.\n\t */\n\tasync followUp(message: string, images?: ImageContent[]): Promise<void> {\n\t\tawait this.send({ type: \"follow_up\", message, images });\n\t}\n\n\t/**\n\t * Abort current operation.\n\t */\n\tasync abort(): Promise<void> {\n\t\tawait this.send({ type: \"abort\" });\n\t}\n\n\t/**\n\t * Start a new session, optionally with parent tracking.\n\t * @param parentSession - Optional parent session path for lineage tracking\n\t * @returns Object with `cancelled: true` if an extension cancelled the new session\n\t */\n\tasync newSession(parentSession?: string): Promise<{ cancelled: boolean }> {\n\t\tconst response = await this.send({ type: \"new_session\", parentSession });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Get current session state.\n\t */\n\tasync getState(): Promise<RpcSessionState> {\n\t\tconst response = await this.send({ type: \"get_state\" });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Set model by provider and ID.\n\t */\n\tasync setModel(provider: string, modelId: string): Promise<{ provider: string; id: string }> {\n\t\tconst response = await this.send({ type: \"set_model\", provider, modelId });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Cycle to next model.\n\t */\n\tasync cycleModel(): Promise<{\n\t\tmodel: { provider: string; id: string };\n\t\tthinkingLevel: ThinkingLevel;\n\t\tisScoped: boolean;\n\t} | null> {\n\t\tconst response = await this.send({ type: \"cycle_model\" });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Get list of available models.\n\t */\n\tasync getAvailableModels(): Promise<ModelInfo[]> {\n\t\tconst response = await this.send({ type: \"get_available_models\" });\n\t\treturn this.getData<{ models: ModelInfo[] }>(response).models;\n\t}\n\n\t/**\n\t * Set thinking level.\n\t */\n\tasync setThinkingLevel(level: ThinkingLevel): Promise<void> {\n\t\tawait this.send({ type: \"set_thinking_level\", level });\n\t}\n\n\t/**\n\t * Cycle thinking level.\n\t */\n\tasync cycleThinkingLevel(): Promise<{ level: ThinkingLevel } | null> {\n\t\tconst response = await this.send({ type: \"cycle_thinking_level\" });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Set steering mode.\n\t */\n\tasync setSteeringMode(mode: \"all\" | \"one-at-a-time\"): Promise<void> {\n\t\tawait this.send({ type: \"set_steering_mode\", mode });\n\t}\n\n\t/**\n\t * Set follow-up mode.\n\t */\n\tasync setFollowUpMode(mode: \"all\" | \"one-at-a-time\"): Promise<void> {\n\t\tawait this.send({ type: \"set_follow_up_mode\", mode });\n\t}\n\n\t/**\n\t * Compact session context.\n\t */\n\tasync compact(customInstructions?: string): Promise<CompactionResult> {\n\t\tconst response = await this.send({ type: \"compact\", customInstructions });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Set auto-compaction enabled/disabled.\n\t */\n\tasync setAutoCompaction(enabled: boolean): Promise<void> {\n\t\tawait this.send({ type: \"set_auto_compaction\", enabled });\n\t}\n\n\t/**\n\t * Set auto-retry enabled/disabled.\n\t */\n\tasync setAutoRetry(enabled: boolean): Promise<void> {\n\t\tawait this.send({ type: \"set_auto_retry\", enabled });\n\t}\n\n\t/**\n\t * Abort in-progress retry.\n\t */\n\tasync abortRetry(): Promise<void> {\n\t\tawait this.send({ type: \"abort_retry\" });\n\t}\n\n\t/**\n\t * Execute a bash command.\n\t */\n\tasync bash(command: string): Promise<BashResult> {\n\t\tconst response = await this.send({ type: \"bash\", command });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Abort running bash command.\n\t */\n\tasync abortBash(): Promise<void> {\n\t\tawait this.send({ type: \"abort_bash\" });\n\t}\n\n\t/**\n\t * Get session statistics.\n\t */\n\tasync getSessionStats(): Promise<SessionStats> {\n\t\tconst response = await this.send({ type: \"get_session_stats\" });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Export session to HTML.\n\t */\n\tasync exportHtml(outputPath?: string): Promise<{ path: string }> {\n\t\tconst response = await this.send({ type: \"export_html\", outputPath });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Switch to a different session file.\n\t * @returns Object with `cancelled: true` if an extension cancelled the switch\n\t */\n\tasync switchSession(sessionPath: string): Promise<{ cancelled: boolean }> {\n\t\tconst response = await this.send({ type: \"switch_session\", sessionPath });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Fork from a specific message.\n\t * @returns Object with `text` (the message text) and `cancelled` (if extension cancelled)\n\t */\n\tasync fork(entryId: string): Promise<{ text: string; cancelled: boolean }> {\n\t\tconst response = await this.send({ type: \"fork\", entryId });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Get messages available for forking.\n\t */\n\tasync getForkMessages(): Promise<Array<{ entryId: string; text: string }>> {\n\t\tconst response = await this.send({ type: \"get_fork_messages\" });\n\t\treturn this.getData<{ messages: Array<{ entryId: string; text: string }> }>(response).messages;\n\t}\n\n\t/**\n\t * Get text of last assistant message.\n\t */\n\tasync getLastAssistantText(): Promise<string | null> {\n\t\tconst response = await this.send({ type: \"get_last_assistant_text\" });\n\t\treturn this.getData<{ text: string | null }>(response).text;\n\t}\n\n\t/**\n\t * Set the session display name.\n\t */\n\tasync setSessionName(name: string): Promise<void> {\n\t\tawait this.send({ type: \"set_session_name\", name });\n\t}\n\n\t/**\n\t * Get all messages in the session.\n\t */\n\tasync getMessages(): Promise<AgentMessage[]> {\n\t\tconst response = await this.send({ type: \"get_messages\" });\n\t\treturn this.getData<{ messages: AgentMessage[] }>(response).messages;\n\t}\n\n\t/**\n\t * Get available commands (extension commands, prompt templates, skills).\n\t */\n\tasync getCommands(): Promise<RpcSlashCommand[]> {\n\t\tconst response = await this.send({ type: \"get_commands\" });\n\t\treturn this.getData<{ commands: RpcSlashCommand[] }>(response).commands;\n\t}\n\n\t/**\n\t * Send a UI response to a pending extension_ui_request.\n\t * Fire-and-forget — no request/response correlation.\n\t */\n\tsendUIResponse(id: string, response: { value?: string; values?: string[]; confirmed?: boolean; cancelled?: boolean }): void {\n\t\tif (!this.process?.stdin) {\n\t\t\tthrow new Error(\"Client not started\");\n\t\t}\n\t\tthis.process.stdin.write(serializeJsonLine({\n\t\t\ttype: \"extension_ui_response\",\n\t\t\tid,\n\t\t\t...response,\n\t\t}));\n\t}\n\n\t/**\n\t * Initialize a v2 protocol session. Must be sent as the first command.\n\t * Returns the negotiated protocol version, session ID, and server capabilities.\n\t */\n\tasync init(options?: { clientId?: string }): Promise<RpcInitResult> {\n\t\tconst response = await this.send({ type: \"init\", protocolVersion: 2, clientId: options?.clientId });\n\t\treturn this.getData<RpcInitResult>(response);\n\t}\n\n\t/**\n\t * Request a graceful shutdown of the agent process.\n\t * Waits for the response before the process exits.\n\t */\n\tasync shutdown(): Promise<void> {\n\t\tawait this.send({ type: \"shutdown\" });\n\t\t// Wait for process to exit after shutdown acknowledgment\n\t\tif (this.process) {\n\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\t\tthis.process?.kill(\"SIGKILL\");\n\t\t\t\t\tresolve();\n\t\t\t\t}, 5000);\n\t\t\t\tthis.process?.on(\"exit\", () => {\n\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Subscribe to specific event types (v2 only).\n\t * Pass [\"*\"] to receive all events, or a list of event type strings to filter.\n\t */\n\tasync subscribe(events: string[]): Promise<void> {\n\t\tawait this.send({ type: \"subscribe\", events });\n\t}\n\n\t// =========================================================================\n\t// Helpers\n\t// =========================================================================\n\n\t/**\n\t * Wait for agent to become idle (no streaming).\n\t * Resolves when agent_end event is received.\n\t */\n\twaitForIdle(timeout = 60000): Promise<void> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tunsubscribe();\n\t\t\t\treject(new Error(`Timeout waiting for agent to become idle. Stderr: ${this.stderr}`));\n\t\t\t}, timeout);\n\n\t\t\tconst unsubscribe = this.onEvent((event) => {\n\t\t\t\tif (event.type === \"agent_end\") {\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\tunsubscribe();\n\t\t\t\t\tresolve();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Collect events until agent becomes idle.\n\t */\n\tcollectEvents(timeout = 60000): Promise<AgentEvent[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst events: AgentEvent[] = [];\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tunsubscribe();\n\t\t\t\treject(new Error(`Timeout collecting events. Stderr: ${this.stderr}`));\n\t\t\t}, timeout);\n\n\t\t\tconst unsubscribe = this.onEvent((event) => {\n\t\t\t\tevents.push(event);\n\t\t\t\tif (event.type === \"agent_end\") {\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\tunsubscribe();\n\t\t\t\t\tresolve(events);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Send prompt and wait for completion, returning all events.\n\t */\n\tasync promptAndWait(message: string, images?: ImageContent[], timeout = 60000): Promise<AgentEvent[]> {\n\t\tconst eventsPromise = this.collectEvents(timeout);\n\t\tawait this.prompt(message, images);\n\t\treturn eventsPromise;\n\t}\n\n\t// =========================================================================\n\t// Internal\n\t// =========================================================================\n\n\tprivate handleLine(line: string): void {\n\t\ttry {\n\t\t\tconst data = JSON.parse(line);\n\n\t\t\t// Check if it's a response to a pending request\n\t\t\tif (data.type === \"response\" && data.id && this.pendingRequests.has(data.id)) {\n\t\t\t\tconst pending = this.pendingRequests.get(data.id)!;\n\t\t\t\tthis.pendingRequests.delete(data.id);\n\t\t\t\tpending.resolve(data as RpcResponse);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Otherwise it's an event\n\t\t\tfor (const listener of this.eventListeners) {\n\t\t\t\tlistener(data as AgentEvent);\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore non-JSON lines\n\t\t}\n\t}\n\n\tprivate handleProcessError(error: Error): Error {\n\t\tconst stderr = this.stderr ? ` Stderr: ${this.stderr}` : \"\";\n\t\tconst wrapped = new Error(`Agent process error: ${error.message}.${stderr}`, { cause: error });\n\t\tthis.rejectPendingRequests(wrapped);\n\t\treturn wrapped;\n\t}\n\n\tprivate rejectPendingRequests(error: Error): void {\n\t\tfor (const [id, pending] of this.pendingRequests) {\n\t\t\tthis.pendingRequests.delete(id);\n\t\t\tpending.reject(error);\n\t\t}\n\t}\n\n\tprivate async send(command: RpcCommandBody): Promise<RpcResponse> {\n\t\tif (!this.process?.stdin) {\n\t\t\tthrow new Error(\"Client not started\");\n\t\t}\n\n\t\tconst id = `req_${++this.requestId}`;\n\t\tconst fullCommand = { ...command, id } as RpcCommand;\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\tthis.pendingRequests.delete(id);\n\t\t\t\treject(new Error(`Timeout waiting for response to ${command.type}. Stderr: ${this.stderr}`));\n\t\t\t}, 30000);\n\n\t\t\tthis.pendingRequests.set(id, {\n\t\t\t\tresolve: (response) => {\n\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\tresolve(response);\n\t\t\t\t},\n\t\t\t\treject: (error) => {\n\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\treject(error);\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tthis.process!.stdin!.write(serializeJsonLine(fullCommand));\n\t\t});\n\t}\n\n\tprivate getData<T>(response: RpcResponse): T {\n\t\tif (!response.success) {\n\t\t\tconst errorResponse = response as Extract<RpcResponse, { success: false }>;\n\t\t\tthrow new Error(errorResponse.error);\n\t\t}\n\t\t// Type assertion: we trust response.data matches T based on the command sent.\n\t\t// This is safe because each public method specifies the correct T for its command.\n\t\tconst successResponse = response as Extract<RpcResponse, { success: true; data: unknown }>;\n\t\treturn successResponse.data as T;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"rpc-client.js","sourceRoot":"","sources":["../../../src/modes/rpc/rpc-client.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * RPC Client for programmatic access to the coding agent.\n *\n * Spawns the agent in RPC mode and provides a typed API for all operations.\n */\n\nimport { type ChildProcess, spawn } from \"node:child_process\";\nimport type { AgentEvent, AgentMessage, ThinkingLevel } from \"@gsd/pi-agent-core\";\nimport type { ImageContent } from \"@gsd/pi-ai\";\nimport type { SessionStats } from \"@gsd/agent-core\";\nimport type { BashResult } from \"@gsd/agent-core\";\nimport type { CompactionResult } from \"@gsd/agent-core/compaction/index.js\";\nimport { attachJsonlLineReader, serializeJsonLine } from \"./jsonl.js\";\nimport type { RpcCommand, RpcInitResult, RpcResponse, RpcSessionState, RpcSlashCommand } from \"./rpc-types.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Distributive Omit that works with union types */\ntype DistributiveOmit<T, K extends keyof T> = T extends unknown ? Omit<T, K> : never;\n\n/** RpcCommand without the id field (for internal send) */\ntype RpcCommandBody = DistributiveOmit<RpcCommand, \"id\">;\n\nexport interface RpcClientOptions {\n\t/** Path to the CLI entry point (default: searches for dist/cli.js) */\n\tcliPath?: string;\n\t/** Working directory for the agent */\n\tcwd?: string;\n\t/** Environment variables */\n\tenv?: Record<string, string>;\n\t/** Provider to use */\n\tprovider?: string;\n\t/** Model ID to use */\n\tmodel?: string;\n\t/** Additional CLI arguments */\n\targs?: string[];\n}\n\nexport interface ModelInfo {\n\tprovider: string;\n\tid: string;\n\tcontextWindow: number;\n\treasoning: boolean;\n}\n\nexport type RpcEventListener = (event: AgentEvent) => void;\n\n/** Cap on retained stderr tail (bytes) to bound heap for long-lived agents. */\nconst MAX_STDERR_BYTES = 64 * 1024;\n\n// ============================================================================\n// RPC Client\n// ============================================================================\n\nexport class RpcClient {\n\tprivate process: ChildProcess | null = null;\n\tprivate stopReadingStdout: (() => void) | null = null;\n\tprivate _stderrHandler?: (data: Buffer) => void;\n\tprivate eventListeners: RpcEventListener[] = [];\n\tprivate pendingRequests: Map<string, { resolve: (response: RpcResponse) => void; reject: (error: Error) => void }> =\n\t\tnew Map();\n\tprivate requestId = 0;\n\tprivate stderr = \"\";\n\n\tconstructor(private options: RpcClientOptions = {}) {}\n\n\t/**\n\t * Start the RPC agent process.\n\t */\n\tasync start(): Promise<void> {\n\t\tif (this.process) {\n\t\t\tthrow new Error(\"Client already started\");\n\t\t}\n\n\t\tconst cliPath = this.options.cliPath ?? \"dist/cli.js\";\n\t\tconst args = [\"--mode\", \"rpc\"];\n\n\t\tif (this.options.provider) {\n\t\t\targs.push(\"--provider\", this.options.provider);\n\t\t}\n\t\tif (this.options.model) {\n\t\t\targs.push(\"--model\", this.options.model);\n\t\t}\n\t\tif (this.options.args) {\n\t\t\targs.push(...this.options.args);\n\t\t}\n\n\t\tlet startupError: Error | null = null;\n\n\t\tthis.process = spawn(process.execPath, [cliPath, ...args], {\n\t\t\tcwd: this.options.cwd,\n\t\t\tenv: { ...process.env, ...this.options.env },\n\t\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\t});\n\n\t\tconst onProcessError = (error: Error) => {\n\t\t\tstartupError = this.handleProcessError(error);\n\t\t};\n\t\tthis.process.on(\"error\", onProcessError);\n\t\tthis.process.stdin?.on(\"error\", onProcessError);\n\n\t\t// Collect stderr for debugging. The agent process can run for hours/days,\n\t\t// so cap the retained tail to avoid unbounded heap growth — only the most\n\t\t// recent output is useful for error messages.\n\t\tthis._stderrHandler = (data: Buffer) => {\n\t\t\tthis.stderr += data.toString();\n\t\t\tif (this.stderr.length > MAX_STDERR_BYTES) {\n\t\t\t\tthis.stderr = this.stderr.slice(-MAX_STDERR_BYTES);\n\t\t\t}\n\t\t};\n\t\tthis.process.stderr?.on(\"data\", this._stderrHandler);\n\n\t\t// Set up strict JSONL reader for stdout.\n\t\tthis.stopReadingStdout = attachJsonlLineReader(this.process.stdout!, (line) => {\n\t\t\tthis.handleLine(line);\n\t\t});\n\n\t\t// Detect unexpected subprocess exit and reject all pending requests\n\t\tthis.process.on(\"exit\", (code, signal) => {\n\t\t\tif (this.pendingRequests.size > 0) {\n\t\t\t\tconst reason = signal ? `signal ${signal}` : `code ${code}`;\n\t\t\t\tconst error = new Error(`Agent process exited unexpectedly (${reason}). Stderr: ${this.stderr}`);\n\t\t\t\tthis.rejectPendingRequests(error);\n\t\t\t}\n\t\t});\n\n\t\t// Wait a moment for process to initialize\n\t\tawait new Promise((resolve) => setTimeout(resolve, 100));\n\n\t\tif (startupError) {\n\t\t\tthrow startupError;\n\t\t}\n\n\t\tif (this.process.exitCode !== null) {\n\t\t\tthrow new Error(`Agent process exited immediately with code ${this.process.exitCode}. Stderr: ${this.stderr}`);\n\t\t}\n\t}\n\n\t/**\n\t * Stop the RPC agent process.\n\t */\n\tasync stop(): Promise<void> {\n\t\tif (!this.process) return;\n\n\t\tthis.stopReadingStdout?.();\n\t\tthis.stopReadingStdout = null;\n\t\tif (this._stderrHandler) {\n\t\t\tthis.process.stderr?.removeListener(\"data\", this._stderrHandler);\n\t\t\tthis._stderrHandler = undefined;\n\t\t}\n\t\tthis.process.kill(\"SIGTERM\");\n\n\t\t// Wait for process to exit\n\t\tawait new Promise<void>((resolve) => {\n\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\tthis.process?.kill(\"SIGKILL\");\n\t\t\t\tresolve();\n\t\t\t}, 5000); // match shutdown()'s grace so a cooperative SIGTERM handler can finish\n\n\t\t\tthis.process?.on(\"exit\", () => {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t\tresolve();\n\t\t\t});\n\t\t});\n\n\t\tthis.process = null;\n\t\tthis.pendingRequests.clear();\n\t}\n\n\t/**\n\t * Subscribe to agent events.\n\t */\n\tonEvent(listener: RpcEventListener): () => void {\n\t\tthis.eventListeners.push(listener);\n\t\treturn () => {\n\t\t\tconst index = this.eventListeners.indexOf(listener);\n\t\t\tif (index !== -1) {\n\t\t\t\tthis.eventListeners.splice(index, 1);\n\t\t\t}\n\t\t};\n\t}\n\n\t/**\n\t * Get collected stderr output (useful for debugging).\n\t */\n\tgetStderr(): string {\n\t\treturn this.stderr;\n\t}\n\n\t// =========================================================================\n\t// Command Methods\n\t// =========================================================================\n\n\t/**\n\t * Send a prompt to the agent.\n\t * Returns immediately after sending; use onEvent() to receive streaming events.\n\t * Use waitForIdle() to wait for completion.\n\t */\n\tasync prompt(message: string, images?: ImageContent[]): Promise<void> {\n\t\tawait this.send({ type: \"prompt\", message, images });\n\t}\n\n\t/**\n\t * Queue a steering message to interrupt the agent mid-run.\n\t */\n\tasync steer(message: string, images?: ImageContent[]): Promise<void> {\n\t\tawait this.send({ type: \"steer\", message, images });\n\t}\n\n\t/**\n\t * Queue a follow-up message to be processed after the agent finishes.\n\t */\n\tasync followUp(message: string, images?: ImageContent[]): Promise<void> {\n\t\tawait this.send({ type: \"follow_up\", message, images });\n\t}\n\n\t/**\n\t * Abort current operation.\n\t */\n\tasync abort(): Promise<void> {\n\t\tawait this.send({ type: \"abort\" });\n\t}\n\n\t/**\n\t * Start a new session, optionally with parent tracking.\n\t * @param parentSession - Optional parent session path for lineage tracking\n\t * @returns Object with `cancelled: true` if an extension cancelled the new session\n\t */\n\tasync newSession(parentSession?: string): Promise<{ cancelled: boolean }> {\n\t\tconst response = await this.send({ type: \"new_session\", parentSession });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Get current session state.\n\t */\n\tasync getState(): Promise<RpcSessionState> {\n\t\tconst response = await this.send({ type: \"get_state\" });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Set model by provider and ID.\n\t */\n\tasync setModel(provider: string, modelId: string): Promise<{ provider: string; id: string }> {\n\t\tconst response = await this.send({ type: \"set_model\", provider, modelId });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Cycle to next model.\n\t */\n\tasync cycleModel(): Promise<{\n\t\tmodel: { provider: string; id: string };\n\t\tthinkingLevel: ThinkingLevel;\n\t\tisScoped: boolean;\n\t} | null> {\n\t\tconst response = await this.send({ type: \"cycle_model\" });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Get list of available models.\n\t */\n\tasync getAvailableModels(): Promise<ModelInfo[]> {\n\t\tconst response = await this.send({ type: \"get_available_models\" });\n\t\treturn this.getData<{ models: ModelInfo[] }>(response).models;\n\t}\n\n\t/**\n\t * Set thinking level.\n\t */\n\tasync setThinkingLevel(level: ThinkingLevel): Promise<void> {\n\t\tawait this.send({ type: \"set_thinking_level\", level });\n\t}\n\n\t/**\n\t * Cycle thinking level.\n\t */\n\tasync cycleThinkingLevel(): Promise<{ level: ThinkingLevel } | null> {\n\t\tconst response = await this.send({ type: \"cycle_thinking_level\" });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Set steering mode.\n\t */\n\tasync setSteeringMode(mode: \"all\" | \"one-at-a-time\"): Promise<void> {\n\t\tawait this.send({ type: \"set_steering_mode\", mode });\n\t}\n\n\t/**\n\t * Set follow-up mode.\n\t */\n\tasync setFollowUpMode(mode: \"all\" | \"one-at-a-time\"): Promise<void> {\n\t\tawait this.send({ type: \"set_follow_up_mode\", mode });\n\t}\n\n\t/**\n\t * Compact session context.\n\t */\n\tasync compact(customInstructions?: string): Promise<CompactionResult> {\n\t\tconst response = await this.send({ type: \"compact\", customInstructions });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Set auto-compaction enabled/disabled.\n\t */\n\tasync setAutoCompaction(enabled: boolean): Promise<void> {\n\t\tawait this.send({ type: \"set_auto_compaction\", enabled });\n\t}\n\n\t/**\n\t * Set auto-retry enabled/disabled.\n\t */\n\tasync setAutoRetry(enabled: boolean): Promise<void> {\n\t\tawait this.send({ type: \"set_auto_retry\", enabled });\n\t}\n\n\t/**\n\t * Abort in-progress retry.\n\t */\n\tasync abortRetry(): Promise<void> {\n\t\tawait this.send({ type: \"abort_retry\" });\n\t}\n\n\t/**\n\t * Execute a bash command.\n\t */\n\tasync bash(command: string): Promise<BashResult> {\n\t\tconst response = await this.send({ type: \"bash\", command });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Abort running bash command.\n\t */\n\tasync abortBash(): Promise<void> {\n\t\tawait this.send({ type: \"abort_bash\" });\n\t}\n\n\t/**\n\t * Get session statistics.\n\t */\n\tasync getSessionStats(): Promise<SessionStats> {\n\t\tconst response = await this.send({ type: \"get_session_stats\" });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Export session to HTML.\n\t */\n\tasync exportHtml(outputPath?: string): Promise<{ path: string }> {\n\t\tconst response = await this.send({ type: \"export_html\", outputPath });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Switch to a different session file.\n\t * @returns Object with `cancelled: true` if an extension cancelled the switch\n\t */\n\tasync switchSession(sessionPath: string): Promise<{ cancelled: boolean }> {\n\t\tconst response = await this.send({ type: \"switch_session\", sessionPath });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Fork from a specific message.\n\t * @returns Object with `text` (the message text) and `cancelled` (if extension cancelled)\n\t */\n\tasync fork(entryId: string): Promise<{ text: string; cancelled: boolean }> {\n\t\tconst response = await this.send({ type: \"fork\", entryId });\n\t\treturn this.getData(response);\n\t}\n\n\t/**\n\t * Get messages available for forking.\n\t */\n\tasync getForkMessages(): Promise<Array<{ entryId: string; text: string }>> {\n\t\tconst response = await this.send({ type: \"get_fork_messages\" });\n\t\treturn this.getData<{ messages: Array<{ entryId: string; text: string }> }>(response).messages;\n\t}\n\n\t/**\n\t * Get text of last assistant message.\n\t */\n\tasync getLastAssistantText(): Promise<string | null> {\n\t\tconst response = await this.send({ type: \"get_last_assistant_text\" });\n\t\treturn this.getData<{ text: string | null }>(response).text;\n\t}\n\n\t/**\n\t * Set the session display name.\n\t */\n\tasync setSessionName(name: string): Promise<void> {\n\t\tawait this.send({ type: \"set_session_name\", name });\n\t}\n\n\t/**\n\t * Get all messages in the session.\n\t */\n\tasync getMessages(): Promise<AgentMessage[]> {\n\t\tconst response = await this.send({ type: \"get_messages\" });\n\t\treturn this.getData<{ messages: AgentMessage[] }>(response).messages;\n\t}\n\n\t/**\n\t * Get available commands (extension commands, prompt templates, skills).\n\t */\n\tasync getCommands(): Promise<RpcSlashCommand[]> {\n\t\tconst response = await this.send({ type: \"get_commands\" });\n\t\treturn this.getData<{ commands: RpcSlashCommand[] }>(response).commands;\n\t}\n\n\t/**\n\t * Send a UI response to a pending extension_ui_request.\n\t * Fire-and-forget — no request/response correlation.\n\t */\n\tsendUIResponse(id: string, response: { value?: string; values?: string[]; confirmed?: boolean; cancelled?: boolean }): void {\n\t\tif (!this.process?.stdin) {\n\t\t\tthrow new Error(\"Client not started\");\n\t\t}\n\t\tthis.process.stdin.write(serializeJsonLine({\n\t\t\ttype: \"extension_ui_response\",\n\t\t\tid,\n\t\t\t...response,\n\t\t}));\n\t}\n\n\t/**\n\t * Initialize a v2 protocol session. Must be sent as the first command.\n\t * Returns the negotiated protocol version, session ID, and server capabilities.\n\t */\n\tasync init(options?: { clientId?: string }): Promise<RpcInitResult> {\n\t\tconst response = await this.send({ type: \"init\", protocolVersion: 2, clientId: options?.clientId });\n\t\treturn this.getData<RpcInitResult>(response);\n\t}\n\n\t/**\n\t * Request a graceful shutdown of the agent process.\n\t * Waits for the response before the process exits.\n\t */\n\tasync shutdown(): Promise<void> {\n\t\tawait this.send({ type: \"shutdown\" });\n\t\t// Wait for process to exit after shutdown acknowledgment\n\t\tif (this.process) {\n\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\t\tthis.process?.kill(\"SIGKILL\");\n\t\t\t\t\tresolve();\n\t\t\t\t}, 5000);\n\t\t\t\tthis.process?.on(\"exit\", () => {\n\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Subscribe to specific event types (v2 only).\n\t * Pass [\"*\"] to receive all events, or a list of event type strings to filter.\n\t */\n\tasync subscribe(events: string[]): Promise<void> {\n\t\tawait this.send({ type: \"subscribe\", events });\n\t}\n\n\t// =========================================================================\n\t// Helpers\n\t// =========================================================================\n\n\t/**\n\t * Wait for agent to become idle (no streaming).\n\t * Resolves when agent_end event is received.\n\t */\n\twaitForIdle(timeout = 60000): Promise<void> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tunsubscribe();\n\t\t\t\treject(new Error(`Timeout waiting for agent to become idle. Stderr: ${this.stderr}`));\n\t\t\t}, timeout);\n\n\t\t\tconst unsubscribe = this.onEvent((event) => {\n\t\t\t\tif (event.type === \"agent_end\") {\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\tunsubscribe();\n\t\t\t\t\tresolve();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Collect events until agent becomes idle.\n\t */\n\tcollectEvents(timeout = 60000): Promise<AgentEvent[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst events: AgentEvent[] = [];\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tunsubscribe();\n\t\t\t\treject(new Error(`Timeout collecting events. Stderr: ${this.stderr}`));\n\t\t\t}, timeout);\n\n\t\t\tconst unsubscribe = this.onEvent((event) => {\n\t\t\t\tevents.push(event);\n\t\t\t\tif (event.type === \"agent_end\") {\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\tunsubscribe();\n\t\t\t\t\tresolve(events);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Send prompt and wait for completion, returning all events.\n\t */\n\tasync promptAndWait(message: string, images?: ImageContent[], timeout = 60000): Promise<AgentEvent[]> {\n\t\tconst eventsPromise = this.collectEvents(timeout);\n\t\tawait this.prompt(message, images);\n\t\treturn eventsPromise;\n\t}\n\n\t// =========================================================================\n\t// Internal\n\t// =========================================================================\n\n\tprivate handleLine(line: string): void {\n\t\ttry {\n\t\t\tconst data = JSON.parse(line);\n\n\t\t\t// Check if it's a response to a pending request\n\t\t\tif (data.type === \"response\" && data.id && this.pendingRequests.has(data.id)) {\n\t\t\t\tconst pending = this.pendingRequests.get(data.id)!;\n\t\t\t\tthis.pendingRequests.delete(data.id);\n\t\t\t\tpending.resolve(data as RpcResponse);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Otherwise it's an event\n\t\t\tfor (const listener of this.eventListeners) {\n\t\t\t\tlistener(data as AgentEvent);\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore non-JSON lines\n\t\t}\n\t}\n\n\tprivate handleProcessError(error: Error): Error {\n\t\tconst stderr = this.stderr ? ` Stderr: ${this.stderr}` : \"\";\n\t\tconst wrapped = new Error(`Agent process error: ${error.message}.${stderr}`, { cause: error });\n\t\tthis.rejectPendingRequests(wrapped);\n\t\treturn wrapped;\n\t}\n\n\tprivate rejectPendingRequests(error: Error): void {\n\t\tfor (const [id, pending] of this.pendingRequests) {\n\t\t\tthis.pendingRequests.delete(id);\n\t\t\tpending.reject(error);\n\t\t}\n\t}\n\n\tprivate async send(command: RpcCommandBody): Promise<RpcResponse> {\n\t\tif (!this.process?.stdin) {\n\t\t\tthrow new Error(\"Client not started\");\n\t\t}\n\n\t\tconst id = `req_${++this.requestId}`;\n\t\tconst fullCommand = { ...command, id } as RpcCommand;\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\tthis.pendingRequests.delete(id);\n\t\t\t\treject(new Error(`Timeout waiting for response to ${command.type}. Stderr: ${this.stderr}`));\n\t\t\t}, 30000);\n\n\t\t\tthis.pendingRequests.set(id, {\n\t\t\t\tresolve: (response) => {\n\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\tresolve(response);\n\t\t\t\t},\n\t\t\t\treject: (error) => {\n\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\treject(error);\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tthis.process!.stdin!.write(serializeJsonLine(fullCommand));\n\t\t});\n\t}\n\n\tprivate getData<T>(response: RpcResponse): T {\n\t\tif (!response.success) {\n\t\t\tconst errorResponse = response as Extract<RpcResponse, { success: false }>;\n\t\t\tthrow new Error(errorResponse.error);\n\t\t}\n\t\t// Type assertion: we trust response.data matches T based on the command sent.\n\t\t// This is safe because each public method specifies the correct T for its command.\n\t\tconst successResponse = response as Extract<RpcResponse, { success: true; data: unknown }>;\n\t\treturn successResponse.data as T;\n\t}\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gsd/agent-modes",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.5.0",
|
|
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.
|
|
29
|
-
"@gsd/pi-agent-core": "^1.
|
|
30
|
-
"@gsd/pi-ai": "^1.
|
|
31
|
-
"@gsd/pi-coding-agent": "^1.
|
|
32
|
-
"@gsd/pi-tui": "^1.
|
|
33
|
-
"@opengsd/contracts": "^1.
|
|
28
|
+
"@gsd/agent-core": "^1.5.0",
|
|
29
|
+
"@gsd/pi-agent-core": "^1.5.0",
|
|
30
|
+
"@gsd/pi-ai": "^1.5.0",
|
|
31
|
+
"@gsd/pi-coding-agent": "^1.5.0",
|
|
32
|
+
"@gsd/pi-tui": "^1.5.0",
|
|
33
|
+
"@opengsd/contracts": "^1.5.0",
|
|
34
34
|
"chalk": "^5.5.0"
|
|
35
35
|
}
|
|
36
36
|
}
|
|
@@ -42,10 +42,14 @@ export interface McpToolExtra {
|
|
|
42
42
|
requestId?: string | number;
|
|
43
43
|
sendNotification?: (notification: unknown) => void | Promise<void>;
|
|
44
44
|
}
|
|
45
|
+
interface ElicitRequestOptions {
|
|
46
|
+
timeout?: number;
|
|
47
|
+
signal?: AbortSignal;
|
|
48
|
+
}
|
|
45
49
|
interface McpServerInstance {
|
|
46
50
|
tool(name: string, description: string, params: Record<string, unknown>, handler: (args: Record<string, unknown>, extra?: McpToolExtra) => Promise<unknown>): unknown;
|
|
47
51
|
server: {
|
|
48
|
-
elicitInput(params: AskUserQuestionsElicitRequest | ElicitRequestFormParams, options?:
|
|
52
|
+
elicitInput(params: AskUserQuestionsElicitRequest | ElicitRequestFormParams, options?: ElicitRequestOptions): Promise<AskUserQuestionsElicitResult>;
|
|
49
53
|
};
|
|
50
54
|
connect(transport: unknown): Promise<void>;
|
|
51
55
|
close(): Promise<void>;
|
|
@@ -141,7 +145,7 @@ export declare function formatAskUserQuestionsTimeoutMessage(err: unknown): stri
|
|
|
141
145
|
*/
|
|
142
146
|
export declare function buildAskUserQuestionsRoundResult(questions: AskUserQuestion[], result: AskUserQuestionsElicitResult): AskUserQuestionsRoundResult;
|
|
143
147
|
interface AskUserQuestionsHandlerDeps {
|
|
144
|
-
elicitInput(params: AskUserQuestionsElicitRequest): Promise<AskUserQuestionsElicitResult>;
|
|
148
|
+
elicitInput(params: AskUserQuestionsElicitRequest, options?: ElicitRequestOptions): Promise<AskUserQuestionsElicitResult>;
|
|
145
149
|
isRemoteConfigured(): boolean;
|
|
146
150
|
tryRemoteQuestions(questions: AskUserQuestion[], signal?: AbortSignal): Promise<RemoteToolResult | null>;
|
|
147
151
|
writeGate?: AskUserQuestionsWriteGateModule | null;
|
|
@@ -151,15 +155,24 @@ interface AskUserQuestionsHandlerDeps {
|
|
|
151
155
|
* Detect an elicitation-side timeout error so the handler returns a clean
|
|
152
156
|
* "timed_out" result rather than a raw error the model will retry.
|
|
153
157
|
*
|
|
154
|
-
* The
|
|
155
|
-
* (`MCP error -32001: Request timed out`); `withElicitTimeout` enforces
|
|
156
|
-
*
|
|
158
|
+
* The MCP SDK surfaces request deadline expiry as
|
|
159
|
+
* (`MCP error -32001: Request timed out`); `withElicitTimeout` also enforces
|
|
160
|
+
* the 10-minute user window (`… timed out after … minutes`). Both surface as
|
|
157
161
|
* elicitation fallback errors that should never become a raw `errorContent`
|
|
158
162
|
* response — without recognition they re-throw, skip
|
|
159
163
|
* `recordAskUserQuestionsGateResult`, leave the depth-verification gate
|
|
160
164
|
* pending, and the model loops on the blocked call (#852).
|
|
161
165
|
*/
|
|
162
166
|
export declare function isLocalElicitTimeoutError(err: unknown): boolean;
|
|
167
|
+
/**
|
|
168
|
+
* Detect a client-side cancellation of the tools/call. `withElicitTimeout`
|
|
169
|
+
* rejects with `<label> cancelled by client` when the tool-call AbortSignal
|
|
170
|
+
* fires. This is the caller tearing down the request, not a channel failure,
|
|
171
|
+
* so the handler must return a clean cancelled result rather than re-throwing
|
|
172
|
+
* into a raw `isError` response that skips `recordAskUserQuestionsGateResult`
|
|
173
|
+
* and leaves the depth-verification gate pending with no cancellation signal.
|
|
174
|
+
*/
|
|
175
|
+
export declare function isLocalElicitClientAbortError(err: unknown): boolean;
|
|
163
176
|
export declare function askUserQuestionsHandler(questions: AskUserQuestion[], extra: McpToolExtra | undefined, deps: AskUserQuestionsHandlerDeps): Promise<ToolContent>;
|
|
164
177
|
export type ElicitInputFn = (params: {
|
|
165
178
|
message: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAQH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAG3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAmF9D;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,EACvC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EACnB,KAAK,EAAE,MAAM,EACb,SAAS,SAAoB,EAC7B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,CAAC,CAAC,CA8BZ;AA6KD,UAAU,uBAAuB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE;QACf,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;QACpD,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;CACH;AAED;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,CAAC,YAAY,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpE;AAED,UAAU,iBAAiB;IACzB,IAAI,CACF,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,EAAE,YAAY,KAAK,OAAO,CAAC,OAAO,CAAC,GACjF,OAAO,CAAC;IACX,MAAM,EAAE;QACN,WAAW,CACT,MAAM,EAAE,6BAA6B,GAAG,uBAAuB,EAC/D,OAAO,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -481,9 +481,9 @@ async function recordAskUserQuestionsGateResult(structured, deps) {
|
|
|
481
481
|
* Detect an elicitation-side timeout error so the handler returns a clean
|
|
482
482
|
* "timed_out" result rather than a raw error the model will retry.
|
|
483
483
|
*
|
|
484
|
-
* The
|
|
485
|
-
* (`MCP error -32001: Request timed out`); `withElicitTimeout` enforces
|
|
486
|
-
*
|
|
484
|
+
* The MCP SDK surfaces request deadline expiry as
|
|
485
|
+
* (`MCP error -32001: Request timed out`); `withElicitTimeout` also enforces
|
|
486
|
+
* the 10-minute user window (`… timed out after … minutes`). Both surface as
|
|
487
487
|
* elicitation fallback errors that should never become a raw `errorContent`
|
|
488
488
|
* response — without recognition they re-throw, skip
|
|
489
489
|
* `recordAskUserQuestionsGateResult`, leave the depth-verification gate
|
|
@@ -497,9 +497,24 @@ export function isLocalElicitTimeoutError(err) {
|
|
|
497
497
|
message.includes('request timed out') ||
|
|
498
498
|
message.includes('timed out after'));
|
|
499
499
|
}
|
|
500
|
+
/**
|
|
501
|
+
* Detect a client-side cancellation of the tools/call. `withElicitTimeout`
|
|
502
|
+
* rejects with `<label> cancelled by client` when the tool-call AbortSignal
|
|
503
|
+
* fires. This is the caller tearing down the request, not a channel failure,
|
|
504
|
+
* so the handler must return a clean cancelled result rather than re-throwing
|
|
505
|
+
* into a raw `isError` response that skips `recordAskUserQuestionsGateResult`
|
|
506
|
+
* and leaves the depth-verification gate pending with no cancellation signal.
|
|
507
|
+
*/
|
|
508
|
+
export function isLocalElicitClientAbortError(err) {
|
|
509
|
+
if (!(err instanceof Error))
|
|
510
|
+
return false;
|
|
511
|
+
return err.message.toLowerCase().includes('cancelled by client');
|
|
512
|
+
}
|
|
500
513
|
function isLocalElicitFallbackError(err) {
|
|
501
514
|
if (isLocalElicitTimeoutError(err))
|
|
502
515
|
return true;
|
|
516
|
+
if (isLocalElicitClientAbortError(err))
|
|
517
|
+
return true;
|
|
503
518
|
if (!(err instanceof Error))
|
|
504
519
|
return false;
|
|
505
520
|
const message = err.message.toLowerCase();
|
|
@@ -537,8 +552,12 @@ export async function askUserQuestionsHandler(questions, extra, deps) {
|
|
|
537
552
|
// depth-verification gate when the user is sitting in front of the host.
|
|
538
553
|
let localElicitError;
|
|
539
554
|
let localElicitTimedOut = false;
|
|
555
|
+
let localElicitCancelledByClient = false;
|
|
540
556
|
try {
|
|
541
|
-
const elicitation = await withElicitTimeout(deps.elicitInput(buildAskUserQuestionsElicitRequest(questions)
|
|
557
|
+
const elicitation = await withElicitTimeout(deps.elicitInput(buildAskUserQuestionsElicitRequest(questions), {
|
|
558
|
+
timeout: ELICIT_TIMEOUT_MS,
|
|
559
|
+
...(extra?.signal ? { signal: extra.signal } : {}),
|
|
560
|
+
}), 'ask_user_questions', undefined, extra?.signal);
|
|
542
561
|
if (elicitation.action === 'accept' && elicitation.content) {
|
|
543
562
|
const structured = {
|
|
544
563
|
questions,
|
|
@@ -563,6 +582,12 @@ export async function askUserQuestionsHandler(questions, extra, deps) {
|
|
|
563
582
|
if (isLocalElicitTimeoutError(err)) {
|
|
564
583
|
localElicitTimedOut = true;
|
|
565
584
|
}
|
|
585
|
+
else if (isLocalElicitClientAbortError(err)) {
|
|
586
|
+
// The caller aborted the tools/call. Handled below (do not fall
|
|
587
|
+
// through to remote; the signal is already aborted and no one is
|
|
588
|
+
// there to answer it either).
|
|
589
|
+
localElicitCancelledByClient = true;
|
|
590
|
+
}
|
|
566
591
|
else {
|
|
567
592
|
console.warn(`[gsd:mcp] ask_user_questions local elicitation unavailable; trying remote fallback: ${formatErrorMessage(err)}`);
|
|
568
593
|
}
|
|
@@ -583,6 +608,22 @@ export async function askUserQuestionsHandler(questions, extra, deps) {
|
|
|
583
608
|
structuredContent: timedOutStructured,
|
|
584
609
|
};
|
|
585
610
|
}
|
|
611
|
+
// Client aborted the tools/call. Do not fall through to remote (the signal
|
|
612
|
+
// is already aborted and no one is there to answer). Return a clean
|
|
613
|
+
// `cancelled` result so the gate hook sees a cancellation (gate stays
|
|
614
|
+
// pending, model re-asks) instead of a raw `isError` that skips the gate
|
|
615
|
+
// result recording entirely.
|
|
616
|
+
if (localElicitCancelledByClient) {
|
|
617
|
+
const cancelledStructured = {
|
|
618
|
+
questions,
|
|
619
|
+
response: null,
|
|
620
|
+
cancelled: true,
|
|
621
|
+
};
|
|
622
|
+
return {
|
|
623
|
+
content: [{ type: 'text', text: 'ask_user_questions was cancelled by the client' }],
|
|
624
|
+
structuredContent: cancelledStructured,
|
|
625
|
+
};
|
|
626
|
+
}
|
|
586
627
|
// Local cancelled / unavailable — fall back to the configured remote
|
|
587
628
|
// channel (Discord, Slack, Telegram) if one is set.
|
|
588
629
|
if (deps.isRemoteConfigured()) {
|
|
@@ -931,7 +972,7 @@ export async function createMcpServer(sessionManager) {
|
|
|
931
972
|
}, async (args, extra) => {
|
|
932
973
|
const { questions } = args;
|
|
933
974
|
return askUserQuestionsHandler(questions, extra, {
|
|
934
|
-
elicitInput: (params) => server.server.elicitInput(params),
|
|
975
|
+
elicitInput: (params, options) => server.server.elicitInput(params, options),
|
|
935
976
|
isRemoteConfigured,
|
|
936
977
|
tryRemoteQuestions,
|
|
937
978
|
});
|