@opengsd/gsd-pi 1.2.0-dev.955e4da0 → 1.2.0-dev.a6376d75
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli-model-override.d.ts +15 -0
- package/dist/cli-model-override.js +21 -0
- package/dist/cli-style.d.ts +17 -0
- package/dist/cli-style.js +28 -0
- package/dist/cli.js +2 -19
- package/dist/headless-events.d.ts +4 -2
- package/dist/headless-events.js +14 -34
- package/dist/loader.js +6 -4
- package/dist/mcp-server.js +2 -1
- package/dist/models-resolver.d.ts +3 -13
- package/dist/models-resolver.js +3 -22
- package/dist/register-agent-bundles.d.ts +11 -2
- package/dist/register-agent-bundles.js +18 -4
- package/dist/resource-loader.d.ts +10 -5
- package/dist/resource-loader.js +123 -20
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +5 -4
- package/dist/resources/extensions/ask-user-questions.js +3 -2
- package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
- package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
- package/dist/resources/extensions/async-jobs/index.js +65 -0
- package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
- package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
- package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
- package/dist/resources/extensions/bg-shell/overlay.js +9 -6
- package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
- package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
- package/dist/resources/extensions/bg-shell/utilities.js +3 -0
- package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
- package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
- package/dist/resources/extensions/browser-tools/index.js +69 -12
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +456 -198
- package/dist/resources/extensions/claude-code-cli/turn-assembler.js +33 -1
- package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
- package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
- package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
- package/dist/resources/extensions/gsd/auto/dispatch-history.js +120 -0
- package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
- package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
- package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
- package/dist/resources/extensions/gsd/auto/loop.js +7 -1
- package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
- package/dist/resources/extensions/gsd/auto/orchestrator.js +174 -69
- package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
- package/dist/resources/extensions/gsd/auto/phases.js +17 -2329
- package/dist/resources/extensions/gsd/auto/pre-dispatch.js +534 -0
- package/dist/resources/extensions/gsd/auto/session.js +3 -0
- package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
- package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
- package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
- package/dist/resources/extensions/gsd/auto-dispatch.js +50 -58
- package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
- package/dist/resources/extensions/gsd/auto-post-unit.js +35 -8
- package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
- package/dist/resources/extensions/gsd/auto-start.js +41 -18
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
- package/dist/resources/extensions/gsd/auto-verification.js +23 -30
- package/dist/resources/extensions/gsd/auto-worktree.js +45 -92
- package/dist/resources/extensions/gsd/auto.js +56 -15
- package/dist/resources/extensions/gsd/blocked-models.js +28 -0
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +29 -8
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +60 -13
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +212 -48
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +303 -77
- package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
- package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
- package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
- package/dist/resources/extensions/gsd/captures.js +4 -6
- package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
- package/dist/resources/extensions/gsd/commands/context.js +16 -2
- package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
- package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
- package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
- package/dist/resources/extensions/gsd/consent-question.js +353 -0
- package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
- package/dist/resources/extensions/gsd/constants.js +0 -2
- package/dist/resources/extensions/gsd/crash-recovery.js +12 -15
- package/dist/resources/extensions/gsd/db/queries.js +56 -0
- package/dist/resources/extensions/gsd/db-writer.js +8 -17
- package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
- package/dist/resources/extensions/gsd/doctor-environment.js +258 -131
- package/dist/resources/extensions/gsd/doctor-format.js +9 -6
- package/dist/resources/extensions/gsd/doctor-git-checks.js +2 -18
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +13 -15
- package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
- package/dist/resources/extensions/gsd/error-classifier.js +9 -0
- package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
- package/dist/resources/extensions/gsd/files.js +33 -19
- package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
- package/dist/resources/extensions/gsd/gsd-db.js +2 -1
- package/dist/resources/extensions/gsd/guidance.js +158 -0
- package/dist/resources/extensions/gsd/guided-flow.js +110 -6
- package/dist/resources/extensions/gsd/health-widget.js +87 -28
- package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
- package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
- package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
- package/dist/resources/extensions/gsd/mcp-tool-name.js +5 -13
- package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
- package/dist/resources/extensions/gsd/migrate/safety.js +4 -1
- package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
- package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
- package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
- package/dist/resources/extensions/gsd/milestone-settlement.js +2 -2
- package/dist/resources/extensions/gsd/notification-store.js +11 -4
- package/dist/resources/extensions/gsd/notifications.js +12 -7
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +6 -4
- package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
- package/dist/resources/extensions/gsd/paths.js +27 -0
- package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
- package/dist/resources/extensions/gsd/preferences-models.js +14 -48
- package/dist/resources/extensions/gsd/projection-flush.js +7 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +4 -4
- package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -2
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/dist/resources/extensions/gsd/prompts/run-uat.md +9 -5
- package/dist/resources/extensions/gsd/prompts/system.md +5 -2
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
- package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
- package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
- package/dist/resources/extensions/gsd/publication.js +87 -0
- package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
- package/dist/resources/extensions/gsd/recovery-classification.js +37 -94
- package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
- package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
- package/dist/resources/extensions/gsd/session-lock.js +1 -1
- package/dist/resources/extensions/gsd/skill-activation.js +3 -6
- package/dist/resources/extensions/gsd/state.js +12 -22
- package/dist/resources/extensions/gsd/stop-notice.js +57 -0
- package/dist/resources/extensions/gsd/tool-contract.js +14 -3
- package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
- package/dist/resources/extensions/gsd/tool-surface-readiness.js +108 -0
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
- package/dist/resources/extensions/gsd/tools/complete-slice.js +22 -12
- package/dist/resources/extensions/gsd/tools/complete-task.js +65 -2
- package/dist/resources/extensions/gsd/tools/exec-tool.js +9 -7
- package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -8
- package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +2 -2
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +2 -2
- package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
- package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
- package/dist/resources/extensions/gsd/uat-policy.js +42 -16
- package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
- package/dist/resources/extensions/gsd/unit-context-composer.js +74 -1
- package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
- package/dist/resources/extensions/gsd/unit-registry.js +367 -0
- package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -182
- package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
- package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
- package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
- package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
- package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
- package/dist/resources/extensions/gsd/workflow-events.js +6 -18
- package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
- package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
- package/dist/resources/extensions/gsd/workflow-reconcile.js +21 -56
- package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
- package/dist/resources/extensions/gsd/worktree-git-recovery.js +15 -9
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +3 -2
- package/dist/resources/extensions/gsd/worktree-manager.js +7 -1
- package/dist/resources/extensions/gsd/worktree-root.js +11 -0
- package/dist/resources/extensions/gsd/worktree-safety.js +28 -26
- package/dist/resources/extensions/gsd/worktree-session-state.js +4 -5
- package/dist/resources/extensions/gsd/worktree.js +8 -1
- package/dist/resources/extensions/mcp-client/manager.js +6 -1
- package/dist/resources/extensions/search-the-web/native-search.js +5 -3
- package/dist/resources/extensions/shared/browser-contract.js +59 -0
- package/dist/resources/extensions/shared/gsd-browser-cli.js +116 -6
- package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
- package/dist/resources/shared/package-manager-detection.js +1 -1
- package/dist/resources/shared/package.json +3 -0
- package/dist/resources/skills/create-skill/SKILL.md +3 -0
- package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
- package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
- package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
- package/dist/runtime-checks.d.ts +10 -0
- package/dist/runtime-checks.js +27 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/update-check.d.ts +2 -0
- package/dist/update-check.js +24 -1
- package/dist/update-cmd.js +20 -3
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +13 -13
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
- 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/api/update/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +13 -13
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
- package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
- package/dist/web/standalone/package.json +1 -1
- package/dist/worktree-cli.js +3 -6
- package/dist/worktree-status-banner.js +7 -15
- package/package.json +3 -3
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/dist/rpc.d.ts +1 -0
- package/packages/contracts/dist/rpc.d.ts.map +1 -1
- package/packages/contracts/dist/rpc.js.map +1 -1
- package/packages/contracts/dist/workflow.d.ts +4 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js.map +1 -1
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/sdk.js +6 -4
- package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +13 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +55 -6
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +34 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +12 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/README.md +12 -3
- package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
- package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
- package/packages/mcp-server/dist/cli-runner.js +137 -0
- package/packages/mcp-server/dist/cli-runner.js.map +1 -0
- package/packages/mcp-server/dist/cli.js +2 -50
- package/packages/mcp-server/dist/cli.js.map +1 -1
- package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
- package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
- package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
- package/packages/mcp-server/dist/pid-registry.js +452 -0
- package/packages/mcp-server/dist/pid-registry.js.map +1 -0
- package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
- package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
- package/packages/mcp-server/dist/probe-mode.js +10 -0
- package/packages/mcp-server/dist/probe-mode.js.map +1 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +4 -0
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
- package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
- package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
- package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts +26 -18
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +178 -82
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +5 -4
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +43 -2
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
- package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
- package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
- package/packages/pi-agent-core/dist/index.d.ts +1 -0
- package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/index.js +3 -0
- package/packages/pi-agent-core/dist/index.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/README.md +1 -0
- package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
- package/packages/pi-ai/dist/image-models.generated.js +6 -6
- package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
- package/packages/pi-ai/dist/index.d.ts +2 -0
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +2 -0
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +35 -125
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +46 -120
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +12 -7
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
- package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/google-shared.js +12 -3
- package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
- package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
- package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
- package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
- package/packages/pi-ai/package.json +3 -2
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
- package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
- package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -1
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
- package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
- package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
- package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/dist/index.d.ts +1 -1
- package/packages/pi-tui/dist/index.d.ts.map +1 -1
- package/packages/pi-tui/dist/index.js +1 -1
- package/packages/pi-tui/dist/index.js.map +1 -1
- package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
- package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal-image.js +54 -2
- package/packages/pi-tui/dist/terminal-image.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts +8 -0
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +72 -18
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/dist/utils.d.ts.map +1 -1
- package/packages/pi-tui/dist/utils.js +110 -36
- package/packages/pi-tui/dist/utils.js.map +1 -1
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/dist/theme/theme.d.ts.map +1 -1
- package/pkg/dist/theme/theme.js +45 -17
- package/pkg/dist/theme/theme.js.map +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +5 -4
- package/src/resources/extensions/ask-user-questions.ts +7 -2
- package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
- package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
- package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
- package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
- package/src/resources/extensions/async-jobs/index.ts +79 -0
- package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
- package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
- package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
- package/src/resources/extensions/bg-shell/overlay.ts +9 -5
- package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
- package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
- package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
- package/src/resources/extensions/bg-shell/utilities.ts +3 -0
- package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
- package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
- package/src/resources/extensions/browser-tools/index.ts +71 -13
- package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
- package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +40 -1
- package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +537 -202
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +672 -7
- package/src/resources/extensions/claude-code-cli/turn-assembler.ts +38 -1
- package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
- package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
- package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
- package/src/resources/extensions/gsd/auto/dispatch-history.ts +168 -0
- package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
- package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
- package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
- package/src/resources/extensions/gsd/auto/loop.ts +7 -1
- package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
- package/src/resources/extensions/gsd/auto/orchestrator.ts +193 -71
- package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
- package/src/resources/extensions/gsd/auto/phases.ts +58 -3022
- package/src/resources/extensions/gsd/auto/pre-dispatch.ts +704 -0
- package/src/resources/extensions/gsd/auto/session.ts +3 -0
- package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
- package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
- package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
- package/src/resources/extensions/gsd/auto-dispatch.ts +48 -61
- package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
- package/src/resources/extensions/gsd/auto-post-unit.ts +40 -8
- package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
- package/src/resources/extensions/gsd/auto-start.ts +42 -21
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
- package/src/resources/extensions/gsd/auto-verification.ts +26 -28
- package/src/resources/extensions/gsd/auto-worktree.ts +45 -95
- package/src/resources/extensions/gsd/auto.ts +72 -17
- package/src/resources/extensions/gsd/blocked-models.ts +49 -0
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +37 -10
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +79 -12
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +251 -47
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +352 -84
- package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
- package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
- package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
- package/src/resources/extensions/gsd/captures.ts +4 -6
- package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
- package/src/resources/extensions/gsd/commands/context.ts +16 -2
- package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
- package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
- package/src/resources/extensions/gsd/consent-question.ts +431 -0
- package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
- package/src/resources/extensions/gsd/constants.ts +0 -3
- package/src/resources/extensions/gsd/crash-recovery.ts +13 -11
- package/src/resources/extensions/gsd/db/queries.ts +66 -0
- package/src/resources/extensions/gsd/db-writer.ts +11 -19
- package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
- package/src/resources/extensions/gsd/doctor-environment.ts +269 -149
- package/src/resources/extensions/gsd/doctor-format.ts +12 -7
- package/src/resources/extensions/gsd/doctor-git-checks.ts +2 -19
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +13 -15
- package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
- package/src/resources/extensions/gsd/error-classifier.ts +11 -0
- package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
- package/src/resources/extensions/gsd/files.ts +33 -12
- package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
- package/src/resources/extensions/gsd/gsd-db.ts +4 -3
- package/src/resources/extensions/gsd/guidance.ts +217 -0
- package/src/resources/extensions/gsd/guided-flow.ts +161 -26
- package/src/resources/extensions/gsd/health-widget.ts +91 -27
- package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
- package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
- package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
- package/src/resources/extensions/gsd/mcp-tool-name.ts +6 -11
- package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
- package/src/resources/extensions/gsd/migrate/safety.ts +4 -1
- package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
- package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
- package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
- package/src/resources/extensions/gsd/milestone-settlement.ts +2 -2
- package/src/resources/extensions/gsd/notification-store.ts +26 -3
- package/src/resources/extensions/gsd/notifications.ts +13 -6
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +6 -4
- package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
- package/src/resources/extensions/gsd/paths.ts +33 -0
- package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
- package/src/resources/extensions/gsd/preferences-models.ts +12 -47
- package/src/resources/extensions/gsd/projection-flush.ts +20 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +4 -4
- package/src/resources/extensions/gsd/prompts/execute-task.md +3 -2
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
- package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/src/resources/extensions/gsd/prompts/run-uat.md +9 -5
- package/src/resources/extensions/gsd/prompts/system.md +5 -2
- package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
- package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
- package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
- package/src/resources/extensions/gsd/publication.ts +122 -0
- package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
- package/src/resources/extensions/gsd/recovery-classification.ts +42 -96
- package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
- package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
- package/src/resources/extensions/gsd/session-lock.ts +1 -1
- package/src/resources/extensions/gsd/skill-activation.ts +3 -6
- package/src/resources/extensions/gsd/state.ts +16 -22
- package/src/resources/extensions/gsd/stop-notice.ts +75 -0
- package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +206 -22
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +97 -1
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +273 -37
- package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +77 -1
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
- package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
- package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
- package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
- package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
- package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +8 -7
- package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
- package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
- package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +12 -11
- package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
- package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
- package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +328 -0
- package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
- package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
- package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
- package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +117 -91
- package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
- package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
- package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
- package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/guidance.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +18 -6
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +53 -11
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +88 -58
- package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
- package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +217 -0
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
- package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
- package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
- package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +143 -0
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +10 -2
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
- package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
- package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +27 -2
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +7 -3
- package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +80 -2
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +329 -0
- package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -29
- package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -2
- package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
- package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
- package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +67 -4
- package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
- package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
- package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +72 -0
- package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +67 -1
- package/src/resources/extensions/gsd/tool-contract.ts +38 -3
- package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
- package/src/resources/extensions/gsd/tool-surface-readiness.ts +183 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
- package/src/resources/extensions/gsd/tools/complete-slice.ts +22 -12
- package/src/resources/extensions/gsd/tools/complete-task.ts +90 -2
- package/src/resources/extensions/gsd/tools/exec-tool.ts +8 -7
- package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -8
- package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +2 -2
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +2 -2
- package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
- package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
- package/src/resources/extensions/gsd/uat-policy.ts +62 -16
- package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
- package/src/resources/extensions/gsd/unit-context-composer.ts +111 -1
- package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
- package/src/resources/extensions/gsd/unit-registry.ts +442 -0
- package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -192
- package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
- package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
- package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
- package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
- package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
- package/src/resources/extensions/gsd/workflow-events.ts +12 -20
- package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -0
- package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
- package/src/resources/extensions/gsd/workflow-reconcile.ts +29 -62
- package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
- package/src/resources/extensions/gsd/worktree-git-recovery.ts +15 -9
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +3 -8
- package/src/resources/extensions/gsd/worktree-manager.ts +6 -1
- package/src/resources/extensions/gsd/worktree-root.ts +12 -0
- package/src/resources/extensions/gsd/worktree-safety.ts +41 -39
- package/src/resources/extensions/gsd/worktree-session-state.ts +3 -5
- package/src/resources/extensions/gsd/worktree.ts +7 -1
- package/src/resources/extensions/mcp-client/manager.ts +7 -1
- package/src/resources/extensions/search-the-web/native-search.ts +5 -3
- package/src/resources/extensions/shared/browser-contract.ts +66 -0
- package/src/resources/extensions/shared/gsd-browser-cli.ts +141 -6
- package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
- package/src/resources/shared/package-manager-detection.ts +1 -1
- package/src/resources/shared/package.json +3 -0
- package/src/resources/skills/create-skill/SKILL.md +3 -0
- package/src/resources/skills/create-skill/references/executable-code.md +1 -1
- package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
- package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
- package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
- package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
- package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
- package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
- package/src/resources/skills/gsd-browser/SKILL.md +0 -41
- /package/dist/web/standalone/.next/static/{C24pqUd-aru-l0Dp0gLZP → xyMkEaICFHJoa98VgJyzY}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{C24pqUd-aru-l0Dp0gLZP → xyMkEaICFHJoa98VgJyzY}/_ssgManifest.js +0 -0
|
@@ -6,7 +6,7 @@ import { spawn, spawnSync } from "node:child_process";
|
|
|
6
6
|
import { randomUUID } from "node:crypto";
|
|
7
7
|
import { writeFileSync, readFileSync, existsSync, mkdirSync } from "node:fs";
|
|
8
8
|
import { join } from "node:path";
|
|
9
|
-
import { getShellConfig, sanitizeCommand } from "@gsd/pi-coding-agent";
|
|
9
|
+
import { getShellConfig, sanitizeCommand, killProcessTree } from "@gsd/pi-coding-agent";
|
|
10
10
|
import { rewriteCommandWithRtk } from "../shared/rtk.js";
|
|
11
11
|
import { MAX_BUFFER_LINES, MAX_EVENTS, DEAD_PROCESS_TTL, } from "./types.js";
|
|
12
12
|
import { restoreWindowsVTInput, formatUptime } from "./utilities.js";
|
|
@@ -221,6 +221,38 @@ export function startProcess(opts) {
|
|
|
221
221
|
return bg;
|
|
222
222
|
}
|
|
223
223
|
// ── Process Kill ───────────────────────────────────────────────────────────
|
|
224
|
+
/**
|
|
225
|
+
* Gracefully terminate a process and its tree using the shared killProcessTree
|
|
226
|
+
* ladder (SIGTERM → grace window → SIGKILL), the same path bash/async_bash/exec
|
|
227
|
+
* use. This is the "I want it dead, cleanly" intent — use it for the `kill`
|
|
228
|
+
* action, `restart`, and session cleanup. For sending a SPECIFIC signal the
|
|
229
|
+
* agent chose on purpose (SIGINT, SIGHUP, …) use killProcess(), which delivers
|
|
230
|
+
* that exact signal once and does not escalate.
|
|
231
|
+
*
|
|
232
|
+
* `graceMs` overrides the SIGTERM→SIGKILL window (default: killProcessTree's 5s);
|
|
233
|
+
* session cleanup passes a shorter grace so it stays snappy between units.
|
|
234
|
+
*
|
|
235
|
+
* Returns false only when the process is unknown/already dead; the actual
|
|
236
|
+
* SIGKILL escalation fires asynchronously after the grace window, so callers
|
|
237
|
+
* should not assume the process is dead the instant this returns.
|
|
238
|
+
*/
|
|
239
|
+
export function terminateProcess(id, graceMs) {
|
|
240
|
+
const bg = processes.get(id);
|
|
241
|
+
if (!bg)
|
|
242
|
+
return false;
|
|
243
|
+
if (!bg.alive)
|
|
244
|
+
return true;
|
|
245
|
+
if (!bg.proc.pid) {
|
|
246
|
+
// No pid to target a tree; fall back to a direct graceful signal.
|
|
247
|
+
try {
|
|
248
|
+
bg.proc.kill("SIGTERM");
|
|
249
|
+
}
|
|
250
|
+
catch { /* already gone */ }
|
|
251
|
+
return true;
|
|
252
|
+
}
|
|
253
|
+
killProcessTree(bg.proc.pid, graceMs !== undefined ? { graceMs } : undefined);
|
|
254
|
+
return true;
|
|
255
|
+
}
|
|
224
256
|
export function killProcess(id, sig = "SIGTERM") {
|
|
225
257
|
const bg = processes.get(id);
|
|
226
258
|
if (!bg)
|
|
@@ -272,13 +304,14 @@ export async function restartProcess(id) {
|
|
|
272
304
|
return null;
|
|
273
305
|
const config = old.startConfig;
|
|
274
306
|
const restartCount = old.restartCount + 1;
|
|
275
|
-
// Kill old process
|
|
307
|
+
// Kill old process via the graceful ladder, then wait for it to actually die.
|
|
308
|
+
// killProcessTree escalates SIGTERM → grace → SIGKILL asynchronously, so poll
|
|
309
|
+
// for death rather than assuming a fixed sleep is enough.
|
|
276
310
|
if (old.alive) {
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
await new Promise(r => setTimeout(r, 200));
|
|
311
|
+
terminateProcess(id);
|
|
312
|
+
const deadline = Date.now() + 6_000; // grace (5s) + slack
|
|
313
|
+
while (old.alive && Date.now() < deadline) {
|
|
314
|
+
await new Promise(r => setTimeout(r, 100));
|
|
282
315
|
}
|
|
283
316
|
}
|
|
284
317
|
processes.delete(id);
|
|
@@ -328,24 +361,16 @@ export function pruneDeadProcesses() {
|
|
|
328
361
|
}
|
|
329
362
|
}
|
|
330
363
|
export function cleanupAll() {
|
|
364
|
+
// Deliberately a bare, synchronous SIGKILL — not the graceful ladder. This runs
|
|
365
|
+
// from process 'exit'/signal handlers where timers no longer fire, so a deferred
|
|
366
|
+
// SIGKILL would never be delivered and children would be orphaned when we vanish.
|
|
367
|
+
// Immediate force-kill is the correct teardown semantics here.
|
|
331
368
|
for (const [id, bg] of processes) {
|
|
332
369
|
if (bg.alive)
|
|
333
370
|
killProcess(id, "SIGKILL");
|
|
334
371
|
}
|
|
335
372
|
processes.clear();
|
|
336
373
|
}
|
|
337
|
-
/**
|
|
338
|
-
* Kill all alive, non-persistent bg processes.
|
|
339
|
-
* Called between auto-mode units to prevent orphaned servers from
|
|
340
|
-
* keeping ports bound across task boundaries (#1209).
|
|
341
|
-
*/
|
|
342
|
-
export function killSessionProcesses() {
|
|
343
|
-
for (const [id, bg] of processes) {
|
|
344
|
-
if (bg.alive && !bg.persistAcrossSessions) {
|
|
345
|
-
killProcess(id, "SIGTERM");
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
}
|
|
349
374
|
async function waitForProcessExit(bg, timeoutMs) {
|
|
350
375
|
if (!bg.alive)
|
|
351
376
|
return true;
|
|
@@ -359,20 +384,24 @@ async function waitForProcessExit(bg, timeoutMs) {
|
|
|
359
384
|
});
|
|
360
385
|
return !bg.alive;
|
|
361
386
|
}
|
|
387
|
+
/**
|
|
388
|
+
* Terminate the alive, non-persistent processes owned by a session, gracefully.
|
|
389
|
+
* Routes through the shared killProcessTree ladder (SIGTERM → grace → SIGKILL)
|
|
390
|
+
* via terminateProcess, with a short grace (default 300ms) so cleanup between
|
|
391
|
+
* units stays snappy; killProcessTree handles the SIGKILL escalation itself, so
|
|
392
|
+
* there is no separate force-kill pass here.
|
|
393
|
+
*/
|
|
362
394
|
export async function cleanupSessionProcesses(sessionFile, options) {
|
|
363
395
|
const graceMs = Math.max(0, options?.graceMs ?? 300);
|
|
364
396
|
const matches = Array.from(processes.values()).filter((bg) => bg.alive && !bg.persistAcrossSessions && bg.ownerSessionFile === sessionFile);
|
|
365
397
|
if (matches.length === 0)
|
|
366
398
|
return [];
|
|
367
399
|
for (const bg of matches) {
|
|
368
|
-
|
|
400
|
+
terminateProcess(bg.id, graceMs);
|
|
369
401
|
}
|
|
370
402
|
if (graceMs > 0) {
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
for (const bg of matches) {
|
|
374
|
-
if (bg.alive)
|
|
375
|
-
killProcess(bg.id, "SIGKILL");
|
|
403
|
+
// Wait past the grace so the SIGKILL escalation has fired and exits are observed.
|
|
404
|
+
await Promise.all(matches.map((bg) => waitForProcessExit(bg, graceMs + 200)));
|
|
376
405
|
}
|
|
377
406
|
return matches.map((bg) => bg.id);
|
|
378
407
|
}
|
|
@@ -72,6 +72,17 @@ export async function waitForReady(bg, timeout, signal) {
|
|
|
72
72
|
return { ready: false, detail: "Cancelled" };
|
|
73
73
|
}
|
|
74
74
|
if (!bg.alive) {
|
|
75
|
+
// A clean exit-0 means the command ran to completion — it was a batch
|
|
76
|
+
// command (e.g. terraform apply, a migration, a build), not a long-lived
|
|
77
|
+
// server. That is success, not a readiness failure; say so plainly and
|
|
78
|
+
// point at the right tool so the agent stops using wait_for_ready here.
|
|
79
|
+
if (bg.exitCode === 0) {
|
|
80
|
+
return {
|
|
81
|
+
ready: false,
|
|
82
|
+
detail: "Process completed (exit 0) before signaling readiness — it ran to completion rather than staying alive. " +
|
|
83
|
+
"wait_for_ready is for long-lived servers/watchers; for a run-to-completion command use async_bash (or bg_shell 'run').",
|
|
84
|
+
};
|
|
85
|
+
}
|
|
75
86
|
const stderrLines = bg.output.filter(l => l.stream === "stderr").slice(-5).map(l => l.line);
|
|
76
87
|
const stderrContext = stderrLines.length > 0 ? `\nstderr:\n${stderrLines.join("\n").slice(0, 500)}` : "";
|
|
77
88
|
return {
|
|
@@ -37,6 +37,9 @@ export const formatUptime = formatDuration;
|
|
|
37
37
|
export function formatTimeAgo(timestamp) {
|
|
38
38
|
return formatDuration(Date.now() - timestamp) + " ago";
|
|
39
39
|
}
|
|
40
|
+
// NOTE: these worktree-layout regexes mirror findWorktreeSegment in
|
|
41
|
+
// src/resources/extensions/gsd/worktree-root.ts (bg-shell does not import the
|
|
42
|
+
// gsd extension). Keep them synchronized when a layout changes.
|
|
40
43
|
function deriveProjectRootFromAutoWorktree(cachedCwd) {
|
|
41
44
|
if (!cachedCwd)
|
|
42
45
|
return undefined;
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
2
2
|
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
|
|
3
3
|
import { Type } from "@sinclair/typebox";
|
|
4
|
+
import { BROWSER_CONTRACT_TOOL_NAMES } from "../../shared/browser-contract.js";
|
|
4
5
|
import { resolveGsdBrowserMcpLaunchConfig } from "../../shared/gsd-browser-cli.js";
|
|
5
6
|
import { buildMcpChildEnv } from "../../mcp-client/manager.js";
|
|
6
7
|
const connections = new Map();
|
|
7
8
|
const pendingConnections = new Map();
|
|
8
9
|
const DEFAULT_MAX_LINES = 2_000;
|
|
9
10
|
const DEFAULT_MAX_BYTES = 50 * 1024;
|
|
11
|
+
const MCP_CALL_TIMEOUT_MS = 60_000;
|
|
10
12
|
const AssertionCheck = Type.Object({
|
|
11
13
|
kind: Type.String({ description: "Assertion kind, e.g. url_contains, text_visible, selector_visible, no_console_errors, no_failed_requests." }),
|
|
12
14
|
selector: Type.Optional(Type.String()),
|
|
@@ -30,29 +32,15 @@ const BatchStep = Type.Object({
|
|
|
30
32
|
ref: Type.Optional(Type.String()),
|
|
31
33
|
checks: Type.Optional(Type.Array(AssertionCheck)),
|
|
32
34
|
}, { additionalProperties: true });
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
"browser_verify",
|
|
43
|
-
"browser_screenshot",
|
|
44
|
-
"browser_snapshot_refs",
|
|
45
|
-
"browser_find",
|
|
46
|
-
"browser_get_console_logs",
|
|
47
|
-
"browser_get_network_logs",
|
|
48
|
-
"browser_evaluate",
|
|
49
|
-
"browser_reload",
|
|
50
|
-
"browser_batch",
|
|
51
|
-
"browser_act",
|
|
52
|
-
];
|
|
53
|
-
const MANAGED_BROWSER_TOOLS = [
|
|
54
|
-
{
|
|
55
|
-
name: "browser_navigate",
|
|
35
|
+
/**
|
|
36
|
+
* The managed adapter serves exactly the Browser Automation Contract
|
|
37
|
+
* vocabulary. The spec table below is keyed by contract name, so adding a
|
|
38
|
+
* contract capability fails typecheck here until the adapter declares how the
|
|
39
|
+
* gsd-browser server satisfies it.
|
|
40
|
+
*/
|
|
41
|
+
export const MANAGED_GSD_BROWSER_TOOL_NAMES = BROWSER_CONTRACT_TOOL_NAMES;
|
|
42
|
+
export const MANAGED_BROWSER_TOOL_SPECS = {
|
|
43
|
+
browser_navigate: {
|
|
56
44
|
label: "Browser Navigate",
|
|
57
45
|
description: "Navigate the managed gsd-browser session to a URL and return page state. Use for local web app verification and UAT evidence.",
|
|
58
46
|
parameters: Type.Object({
|
|
@@ -60,8 +48,14 @@ const MANAGED_BROWSER_TOOLS = [
|
|
|
60
48
|
screenshot: Type.Optional(Type.Boolean({ description: "Capture screenshot evidence when supported." })),
|
|
61
49
|
}, { additionalProperties: true }),
|
|
62
50
|
},
|
|
63
|
-
{
|
|
64
|
-
|
|
51
|
+
browser_click: {
|
|
52
|
+
translate: {
|
|
53
|
+
requires: ["browser_batch"],
|
|
54
|
+
build: (args) => [{
|
|
55
|
+
mcpTool: "browser_batch",
|
|
56
|
+
args: { steps: [{ action: "click", ...args }] },
|
|
57
|
+
}],
|
|
58
|
+
},
|
|
65
59
|
label: "Browser Click",
|
|
66
60
|
description: "Click an element in the managed gsd-browser session by selector or coordinates.",
|
|
67
61
|
parameters: Type.Object({
|
|
@@ -70,8 +64,14 @@ const MANAGED_BROWSER_TOOLS = [
|
|
|
70
64
|
y: Type.Optional(Type.Number({ description: "Y coordinate to click." })),
|
|
71
65
|
}, { additionalProperties: true }),
|
|
72
66
|
},
|
|
73
|
-
{
|
|
74
|
-
|
|
67
|
+
browser_type: {
|
|
68
|
+
translate: {
|
|
69
|
+
requires: ["browser_batch"],
|
|
70
|
+
build: (args) => [{
|
|
71
|
+
mcpTool: "browser_batch",
|
|
72
|
+
args: { steps: [{ action: "type", ...args }] },
|
|
73
|
+
}],
|
|
74
|
+
},
|
|
75
75
|
label: "Browser Type",
|
|
76
76
|
description: "Type or fill text into an input in the managed gsd-browser session.",
|
|
77
77
|
parameters: Type.Object({
|
|
@@ -82,8 +82,7 @@ const MANAGED_BROWSER_TOOLS = [
|
|
|
82
82
|
slowly: Type.Optional(Type.Boolean({ description: "Type character by character." })),
|
|
83
83
|
}, { additionalProperties: true }),
|
|
84
84
|
},
|
|
85
|
-
{
|
|
86
|
-
name: "browser_fill_form",
|
|
85
|
+
browser_fill_form: {
|
|
87
86
|
label: "Browser Fill Form",
|
|
88
87
|
description: "Fill a form in the managed gsd-browser session using field labels, names, placeholders, or aria labels.",
|
|
89
88
|
parameters: Type.Object({
|
|
@@ -92,16 +91,14 @@ const MANAGED_BROWSER_TOOLS = [
|
|
|
92
91
|
submit: Type.Optional(Type.Boolean({ description: "Submit the form after filling." })),
|
|
93
92
|
}, { additionalProperties: true }),
|
|
94
93
|
},
|
|
95
|
-
{
|
|
96
|
-
name: "browser_click_ref",
|
|
94
|
+
browser_click_ref: {
|
|
97
95
|
label: "Browser Click Ref",
|
|
98
96
|
description: "Click a versioned ref from the latest gsd-browser snapshot.",
|
|
99
97
|
parameters: Type.Object({
|
|
100
98
|
ref: Type.String({ description: "Versioned ref, e.g. @v3:e2." }),
|
|
101
99
|
}, { additionalProperties: true }),
|
|
102
100
|
},
|
|
103
|
-
{
|
|
104
|
-
name: "browser_fill_ref",
|
|
101
|
+
browser_fill_ref: {
|
|
105
102
|
label: "Browser Fill Ref",
|
|
106
103
|
description: "Fill text into an input-like versioned ref from the latest gsd-browser snapshot.",
|
|
107
104
|
parameters: Type.Object({
|
|
@@ -112,8 +109,7 @@ const MANAGED_BROWSER_TOOLS = [
|
|
|
112
109
|
slowly: Type.Optional(Type.Boolean({ description: "Type character by character." })),
|
|
113
110
|
}, { additionalProperties: true }),
|
|
114
111
|
},
|
|
115
|
-
{
|
|
116
|
-
name: "browser_wait_for",
|
|
112
|
+
browser_wait_for: {
|
|
117
113
|
label: "Browser Wait For",
|
|
118
114
|
description: "Wait for a browser condition such as network idle, selector visibility, text visibility, or URL change.",
|
|
119
115
|
parameters: Type.Object({
|
|
@@ -123,8 +119,7 @@ const MANAGED_BROWSER_TOOLS = [
|
|
|
123
119
|
timeout: Type.Optional(Type.Number({ description: "Maximum milliseconds to wait." })),
|
|
124
120
|
}, { additionalProperties: true }),
|
|
125
121
|
},
|
|
126
|
-
{
|
|
127
|
-
name: "browser_assert",
|
|
122
|
+
browser_assert: {
|
|
128
123
|
label: "Browser Assert",
|
|
129
124
|
description: "Run explicit browser assertions and return structured PASS/FAIL evidence.",
|
|
130
125
|
promptGuidelines: [
|
|
@@ -135,8 +130,40 @@ const MANAGED_BROWSER_TOOLS = [
|
|
|
135
130
|
checks: Type.Array(AssertionCheck),
|
|
136
131
|
}, { additionalProperties: true }),
|
|
137
132
|
},
|
|
138
|
-
{
|
|
139
|
-
|
|
133
|
+
browser_verify: {
|
|
134
|
+
translate: {
|
|
135
|
+
requires: ["browser_navigate", "browser_assert", "browser_screenshot"],
|
|
136
|
+
build: (args) => {
|
|
137
|
+
const calls = [
|
|
138
|
+
{
|
|
139
|
+
mcpTool: "browser_navigate",
|
|
140
|
+
args: { url: args.url, ...(args.timeout === undefined ? {} : { timeout: args.timeout }) },
|
|
141
|
+
},
|
|
142
|
+
];
|
|
143
|
+
const verifyChecks = Array.isArray(args.checks) ? args.checks : [];
|
|
144
|
+
const assertChecks = [];
|
|
145
|
+
for (const check of verifyChecks) {
|
|
146
|
+
if (typeof check.expectedText === "string") {
|
|
147
|
+
assertChecks.push({ kind: "text_visible", text: check.expectedText });
|
|
148
|
+
}
|
|
149
|
+
if (typeof check.selector === "string") {
|
|
150
|
+
if (check.expectedVisible === false) {
|
|
151
|
+
assertChecks.push({ kind: "selector_hidden", selector: check.selector });
|
|
152
|
+
}
|
|
153
|
+
else if (check.expectedVisible === true || check.expectedText === undefined) {
|
|
154
|
+
assertChecks.push({ kind: "selector_visible", selector: check.selector });
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
if (assertChecks.length > 0) {
|
|
159
|
+
calls.push({ mcpTool: "browser_assert", args: { checks: assertChecks } });
|
|
160
|
+
}
|
|
161
|
+
if (verifyChecks.some((check) => check.screenshot === true)) {
|
|
162
|
+
calls.push({ mcpTool: "browser_screenshot", args: {}, optional: true });
|
|
163
|
+
}
|
|
164
|
+
return calls;
|
|
165
|
+
},
|
|
166
|
+
},
|
|
140
167
|
label: "Browser Verify",
|
|
141
168
|
description: "Run a structured browser verification flow and return evidence from the managed gsd-browser session.",
|
|
142
169
|
parameters: Type.Object({
|
|
@@ -151,8 +178,7 @@ const MANAGED_BROWSER_TOOLS = [
|
|
|
151
178
|
timeout: Type.Optional(Type.Number({ description: "Navigation timeout in milliseconds." })),
|
|
152
179
|
}, { additionalProperties: true }),
|
|
153
180
|
},
|
|
154
|
-
{
|
|
155
|
-
name: "browser_screenshot",
|
|
181
|
+
browser_screenshot: {
|
|
156
182
|
label: "Browser Screenshot",
|
|
157
183
|
description: "Capture browser screenshot evidence from the managed gsd-browser session.",
|
|
158
184
|
compatibility: { producesImages: true },
|
|
@@ -162,8 +188,7 @@ const MANAGED_BROWSER_TOOLS = [
|
|
|
162
188
|
quality: Type.Optional(Type.Number({ description: "JPEG quality when supported." })),
|
|
163
189
|
}, { additionalProperties: true }),
|
|
164
190
|
},
|
|
165
|
-
{
|
|
166
|
-
name: "browser_snapshot_refs",
|
|
191
|
+
browser_snapshot_refs: {
|
|
167
192
|
mcpTools: ["browser_snapshot", "browser_snapshot_refs"],
|
|
168
193
|
label: "Browser Snapshot Refs",
|
|
169
194
|
description: "Capture a compact gsd-browser snapshot with versioned refs for reliable interaction.",
|
|
@@ -174,8 +199,7 @@ const MANAGED_BROWSER_TOOLS = [
|
|
|
174
199
|
mode: Type.Optional(Type.String({ description: "Snapshot mode: interactive, form, dialog, navigation, errors, headings, visible_only." })),
|
|
175
200
|
}, { additionalProperties: true }),
|
|
176
201
|
},
|
|
177
|
-
{
|
|
178
|
-
name: "browser_find",
|
|
202
|
+
browser_find: {
|
|
179
203
|
mcpTools: ["browser_find_element", "browser_find"],
|
|
180
204
|
label: "Browser Find",
|
|
181
205
|
description: "Find elements by text, role, or selector in the managed gsd-browser session.",
|
|
@@ -186,8 +210,7 @@ const MANAGED_BROWSER_TOOLS = [
|
|
|
186
210
|
limit: Type.Optional(Type.Number({ description: "Maximum results to return." })),
|
|
187
211
|
}, { additionalProperties: true }),
|
|
188
212
|
},
|
|
189
|
-
{
|
|
190
|
-
name: "browser_get_console_logs",
|
|
213
|
+
browser_get_console_logs: {
|
|
191
214
|
mcpTools: ["browser_console", "browser_get_console_logs"],
|
|
192
215
|
label: "Browser Console Logs",
|
|
193
216
|
description: "Return buffered console logs and JavaScript errors from the managed gsd-browser session.",
|
|
@@ -195,8 +218,7 @@ const MANAGED_BROWSER_TOOLS = [
|
|
|
195
218
|
clear: Type.Optional(Type.Boolean({ description: "Clear the buffer after reading logs." })),
|
|
196
219
|
}, { additionalProperties: true }),
|
|
197
220
|
},
|
|
198
|
-
{
|
|
199
|
-
name: "browser_get_network_logs",
|
|
221
|
+
browser_get_network_logs: {
|
|
200
222
|
mcpTools: ["browser_network", "browser_get_network_logs"],
|
|
201
223
|
label: "Browser Network Logs",
|
|
202
224
|
description: "Return buffered network requests and responses from the managed gsd-browser session.",
|
|
@@ -205,8 +227,7 @@ const MANAGED_BROWSER_TOOLS = [
|
|
|
205
227
|
filter: Type.Optional(Type.String({ description: "Filter, e.g. all, errors, fetch-xhr." })),
|
|
206
228
|
}, { additionalProperties: true }),
|
|
207
229
|
},
|
|
208
|
-
{
|
|
209
|
-
name: "browser_evaluate",
|
|
230
|
+
browser_evaluate: {
|
|
210
231
|
mcpTools: ["browser_eval", "browser_evaluate"],
|
|
211
232
|
label: "Browser Evaluate",
|
|
212
233
|
description: "Evaluate a JavaScript expression in the managed gsd-browser page context.",
|
|
@@ -214,14 +235,22 @@ const MANAGED_BROWSER_TOOLS = [
|
|
|
214
235
|
expression: Type.String({ description: "JavaScript expression to evaluate." }),
|
|
215
236
|
}, { additionalProperties: true }),
|
|
216
237
|
},
|
|
217
|
-
{
|
|
218
|
-
|
|
238
|
+
browser_reload: {
|
|
239
|
+
// gsd-browser's daemon has a reload command but does not expose it over
|
|
240
|
+
// MCP, so reload rides browser_evaluate. The network-idle settle is
|
|
241
|
+
// best-effort: pages with persistent connections never go idle.
|
|
242
|
+
translate: {
|
|
243
|
+
requires: ["browser_evaluate", "browser_wait_for"],
|
|
244
|
+
build: () => [
|
|
245
|
+
{ mcpTool: "browser_evaluate", args: { expression: "location.reload()" } },
|
|
246
|
+
{ mcpTool: "browser_wait_for", args: { condition: "network_idle", timeout: 3_000 }, optional: true },
|
|
247
|
+
],
|
|
248
|
+
},
|
|
219
249
|
label: "Browser Reload",
|
|
220
250
|
description: "Reload the current page in the managed gsd-browser session.",
|
|
221
251
|
parameters: Type.Object({}, { additionalProperties: true }),
|
|
222
252
|
},
|
|
223
|
-
{
|
|
224
|
-
name: "browser_batch",
|
|
253
|
+
browser_batch: {
|
|
225
254
|
label: "Browser Batch",
|
|
226
255
|
description: "Execute multiple explicit browser steps through the managed gsd-browser session in one call.",
|
|
227
256
|
promptGuidelines: [
|
|
@@ -234,8 +263,7 @@ const MANAGED_BROWSER_TOOLS = [
|
|
|
234
263
|
finalSummaryOnly: Type.Optional(Type.Boolean({ description: "Return only the compact final summary." })),
|
|
235
264
|
}, { additionalProperties: true }),
|
|
236
265
|
},
|
|
237
|
-
{
|
|
238
|
-
name: "browser_act",
|
|
266
|
+
browser_act: {
|
|
239
267
|
label: "Browser Act",
|
|
240
268
|
description: "Execute a semantic browser action through gsd-browser, such as primary_cta, submit_form, or close_dialog.",
|
|
241
269
|
parameters: Type.Object({
|
|
@@ -243,7 +271,7 @@ const MANAGED_BROWSER_TOOLS = [
|
|
|
243
271
|
scope: Type.Optional(Type.String({ description: "CSS selector to narrow the search area." })),
|
|
244
272
|
}, { additionalProperties: true }),
|
|
245
273
|
},
|
|
246
|
-
|
|
274
|
+
};
|
|
247
275
|
function resolveProjectRoot(ctx) {
|
|
248
276
|
return ctx?.cwd || process.cwd();
|
|
249
277
|
}
|
|
@@ -324,11 +352,27 @@ function isUnknownMcpToolError(error) {
|
|
|
324
352
|
const message = error instanceof Error ? error.message : String(error);
|
|
325
353
|
return /unknown tool|tool .*not found|tool not found|not registered|does not exist/i.test(message);
|
|
326
354
|
}
|
|
327
|
-
function
|
|
355
|
+
function normalizeBatchStep(step) {
|
|
356
|
+
if (!step || typeof step !== "object")
|
|
357
|
+
return step;
|
|
358
|
+
const { clearFirst, ...rest } = step;
|
|
359
|
+
return clearFirst === undefined ? step : { ...rest, clear_first: clearFirst };
|
|
360
|
+
}
|
|
361
|
+
export function normalizeManagedArgs(piToolName, args) {
|
|
328
362
|
if (piToolName === "browser_snapshot_refs") {
|
|
329
363
|
const { interactiveOnly: _interactiveOnly, ...snapshotArgs } = args;
|
|
330
364
|
return snapshotArgs;
|
|
331
365
|
}
|
|
366
|
+
if (piToolName === "browser_batch") {
|
|
367
|
+
// gsd-browser's MCP batch tool reads snake_case option and step keys.
|
|
368
|
+
const { stopOnFailure, finalSummaryOnly, steps, ...rest } = args;
|
|
369
|
+
return {
|
|
370
|
+
...rest,
|
|
371
|
+
...(Array.isArray(steps) ? { steps: steps.map(normalizeBatchStep) } : {}),
|
|
372
|
+
...(stopOnFailure === undefined ? {} : { stop_on_failure: stopOnFailure }),
|
|
373
|
+
...(finalSummaryOnly === undefined ? {} : { summary_only: finalSummaryOnly }),
|
|
374
|
+
};
|
|
375
|
+
}
|
|
332
376
|
return args;
|
|
333
377
|
}
|
|
334
378
|
function serializeMcpContent(contentItems) {
|
|
@@ -395,32 +439,70 @@ function truncateHeadText(text, options) {
|
|
|
395
439
|
totalBytes,
|
|
396
440
|
};
|
|
397
441
|
}
|
|
398
|
-
|
|
442
|
+
function callGsdBrowserMcp(connection, mcpTool, args, signal) {
|
|
443
|
+
return connection.client.callTool({ name: mcpTool, arguments: args }, undefined, { signal, timeout: MCP_CALL_TIMEOUT_MS });
|
|
444
|
+
}
|
|
445
|
+
function buildManagedToolResult(connection, piToolName, mcpToolsUsed, contentItems, lastResult) {
|
|
446
|
+
const serialized = serializeMcpContent(contentItems);
|
|
447
|
+
return {
|
|
448
|
+
content: serialized.content,
|
|
449
|
+
details: {
|
|
450
|
+
engine: "gsd-browser",
|
|
451
|
+
server: connection.launch.serverName,
|
|
452
|
+
tool: piToolName,
|
|
453
|
+
mcpTool: mcpToolsUsed[mcpToolsUsed.length - 1] ?? piToolName,
|
|
454
|
+
...(mcpToolsUsed.length > 1 ? { mcpTools: mcpToolsUsed } : {}),
|
|
455
|
+
sessionName: connection.launch.sessionName,
|
|
456
|
+
projectRoot: connection.launch.projectRoot,
|
|
457
|
+
truncated: serialized.truncated,
|
|
458
|
+
outputLines: serialized.outputLines,
|
|
459
|
+
outputBytes: serialized.outputBytes,
|
|
460
|
+
structuredContent: lastResult.structuredContent,
|
|
461
|
+
mcpIsError: Boolean(lastResult.isError),
|
|
462
|
+
},
|
|
463
|
+
isError: Boolean(lastResult.isError),
|
|
464
|
+
};
|
|
465
|
+
}
|
|
466
|
+
async function callTranslatedGsdBrowserTool(connection, piToolName, translation, args, options) {
|
|
467
|
+
const calls = translation.build(args);
|
|
468
|
+
const contentItems = [];
|
|
469
|
+
const toolsUsed = [];
|
|
470
|
+
let lastResult = {};
|
|
471
|
+
for (const call of calls) {
|
|
472
|
+
let result;
|
|
473
|
+
try {
|
|
474
|
+
result = await callGsdBrowserMcp(connection, call.mcpTool, normalizeManagedArgs(call.mcpTool, call.args), options.signal);
|
|
475
|
+
}
|
|
476
|
+
catch (error) {
|
|
477
|
+
if (call.optional)
|
|
478
|
+
continue;
|
|
479
|
+
throw error;
|
|
480
|
+
}
|
|
481
|
+
if (call.optional && result.isError)
|
|
482
|
+
continue;
|
|
483
|
+
toolsUsed.push(call.mcpTool);
|
|
484
|
+
if (Array.isArray(result.content))
|
|
485
|
+
contentItems.push(...result.content);
|
|
486
|
+
lastResult = result;
|
|
487
|
+
// Later calls assume the earlier ones took effect (e.g. assert after a
|
|
488
|
+
// failed navigation would report misleading evidence), so stop here.
|
|
489
|
+
if (lastResult.isError)
|
|
490
|
+
break;
|
|
491
|
+
}
|
|
492
|
+
return buildManagedToolResult(connection, piToolName, toolsUsed, contentItems, lastResult);
|
|
493
|
+
}
|
|
494
|
+
async function callManagedGsdBrowserTool(piToolName, spec, args, options) {
|
|
399
495
|
const connection = await getOrConnectManagedGsdBrowser(options.ctx, options.signal);
|
|
400
496
|
const normalizedArgs = normalizeManagedArgs(piToolName, args);
|
|
497
|
+
if (spec.translate) {
|
|
498
|
+
return callTranslatedGsdBrowserTool(connection, piToolName, spec.translate, normalizedArgs, options);
|
|
499
|
+
}
|
|
401
500
|
let lastError;
|
|
402
|
-
for (const mcpTool of mcpTools) {
|
|
501
|
+
for (const mcpTool of spec.mcpTools ?? [piToolName]) {
|
|
403
502
|
try {
|
|
404
|
-
const result = await connection
|
|
503
|
+
const result = await callGsdBrowserMcp(connection, mcpTool, normalizedArgs, options.signal);
|
|
405
504
|
const contentItems = Array.isArray(result.content) ? result.content : [];
|
|
406
|
-
|
|
407
|
-
return {
|
|
408
|
-
content: serialized.content,
|
|
409
|
-
details: {
|
|
410
|
-
engine: "gsd-browser",
|
|
411
|
-
server: connection.launch.serverName,
|
|
412
|
-
tool: piToolName,
|
|
413
|
-
mcpTool,
|
|
414
|
-
sessionName: connection.launch.sessionName,
|
|
415
|
-
projectRoot: connection.launch.projectRoot,
|
|
416
|
-
truncated: serialized.truncated,
|
|
417
|
-
outputLines: serialized.outputLines,
|
|
418
|
-
outputBytes: serialized.outputBytes,
|
|
419
|
-
structuredContent: result.structuredContent,
|
|
420
|
-
mcpIsError: Boolean(result.isError),
|
|
421
|
-
},
|
|
422
|
-
isError: Boolean(result.isError),
|
|
423
|
-
};
|
|
505
|
+
return buildManagedToolResult(connection, piToolName, [mcpTool], contentItems, result);
|
|
424
506
|
}
|
|
425
507
|
catch (error) {
|
|
426
508
|
lastError = error;
|
|
@@ -440,6 +522,43 @@ function formatManagedBrowserError(toolName, error) {
|
|
|
440
522
|
"Unset GSD_BROWSER_ENGINE or set GSD_BROWSER_ENGINE=playwright to use the default Playwright engine.",
|
|
441
523
|
].join("\n");
|
|
442
524
|
}
|
|
525
|
+
/**
|
|
526
|
+
* Contract tools the server's advertised tool list cannot satisfy through any
|
|
527
|
+
* of their declared MCP candidates or translations.
|
|
528
|
+
*/
|
|
529
|
+
export function findMissingContractCoverage(servedToolNames) {
|
|
530
|
+
const served = new Set(servedToolNames);
|
|
531
|
+
return BROWSER_CONTRACT_TOOL_NAMES.filter((name) => {
|
|
532
|
+
const spec = MANAGED_BROWSER_TOOL_SPECS[name];
|
|
533
|
+
if (spec.translate) {
|
|
534
|
+
return !spec.translate.requires.every((required) => served.has(required));
|
|
535
|
+
}
|
|
536
|
+
const candidates = spec.mcpTools ?? [name];
|
|
537
|
+
return !candidates.some((candidate) => served.has(candidate));
|
|
538
|
+
});
|
|
539
|
+
}
|
|
540
|
+
/**
|
|
541
|
+
* Compare the server's advertised tool list against the Browser Automation
|
|
542
|
+
* Contract so a server that stops serving a contract tool surfaces at warm-up
|
|
543
|
+
* instead of as a first-use error. Best-effort: a failed or empty listing
|
|
544
|
+
* returns no warning (call-time alias fallback still applies).
|
|
545
|
+
*/
|
|
546
|
+
async function verifyContractCoverage(connection, signal) {
|
|
547
|
+
let served;
|
|
548
|
+
try {
|
|
549
|
+
const result = await connection.client.listTools(undefined, { signal, timeout: 10000 });
|
|
550
|
+
served = (result.tools ?? []).map((tool) => tool.name);
|
|
551
|
+
}
|
|
552
|
+
catch {
|
|
553
|
+
return undefined;
|
|
554
|
+
}
|
|
555
|
+
if (served.length === 0)
|
|
556
|
+
return undefined;
|
|
557
|
+
const missing = findMissingContractCoverage(served);
|
|
558
|
+
if (missing.length === 0)
|
|
559
|
+
return undefined;
|
|
560
|
+
return `gsd-browser does not serve ${missing.length} Browser Automation Contract tool(s): ${missing.join(", ")}. These will error on first use; update gsd-browser or check GSD_BROWSER_* overrides.`;
|
|
561
|
+
}
|
|
443
562
|
/**
|
|
444
563
|
* Eagerly establish the managed gsd-browser connection so browser tools are
|
|
445
564
|
* ready before first use. Best-effort: returns the error instead of throwing so
|
|
@@ -449,17 +568,19 @@ function formatManagedBrowserError(toolName, error) {
|
|
|
449
568
|
*/
|
|
450
569
|
export async function warmUpManagedGsdBrowser(ctx, signal) {
|
|
451
570
|
try {
|
|
452
|
-
await getOrConnectManagedGsdBrowser(ctx, signal);
|
|
453
|
-
|
|
571
|
+
const connection = await getOrConnectManagedGsdBrowser(ctx, signal);
|
|
572
|
+
const coverageWarning = await verifyContractCoverage(connection, signal);
|
|
573
|
+
return coverageWarning ? { ok: true, coverageWarning } : { ok: true };
|
|
454
574
|
}
|
|
455
575
|
catch (error) {
|
|
456
576
|
return { ok: false, error: error instanceof Error ? error.message : String(error) };
|
|
457
577
|
}
|
|
458
578
|
}
|
|
459
579
|
export function registerManagedGsdBrowserTools(pi) {
|
|
460
|
-
for (const
|
|
580
|
+
for (const name of BROWSER_CONTRACT_TOOL_NAMES) {
|
|
581
|
+
const tool = MANAGED_BROWSER_TOOL_SPECS[name];
|
|
461
582
|
pi.registerTool({
|
|
462
|
-
name
|
|
583
|
+
name,
|
|
463
584
|
label: tool.label,
|
|
464
585
|
description: tool.description,
|
|
465
586
|
...(tool.promptGuidelines ? { promptGuidelines: tool.promptGuidelines } : {}),
|
|
@@ -467,17 +588,17 @@ export function registerManagedGsdBrowserTools(pi) {
|
|
|
467
588
|
parameters: tool.parameters,
|
|
468
589
|
async execute(_toolCallId, params, signal, _onUpdate, ctx) {
|
|
469
590
|
try {
|
|
470
|
-
return await callManagedGsdBrowserTool(
|
|
591
|
+
return await callManagedGsdBrowserTool(name, tool, params, { signal, ctx });
|
|
471
592
|
}
|
|
472
593
|
catch (error) {
|
|
473
|
-
const message = formatManagedBrowserError(
|
|
594
|
+
const message = formatManagedBrowserError(name, error);
|
|
474
595
|
return {
|
|
475
596
|
content: [{ type: "text", text: message }],
|
|
476
597
|
details: {
|
|
477
598
|
engine: "gsd-browser",
|
|
478
599
|
server: "gsd-browser",
|
|
479
|
-
tool:
|
|
480
|
-
mcpTool: tool.
|
|
600
|
+
tool: name,
|
|
601
|
+
mcpTool: tool.translate?.requires[0] ?? tool.mcpTools?.[0] ?? name,
|
|
481
602
|
error: error instanceof Error ? error.message : String(error),
|
|
482
603
|
},
|
|
483
604
|
isError: true,
|