@opengsd/gsd-pi 1.2.0-dev.955e4da0 → 1.2.0-dev.9ad8ae33
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-style.d.ts +17 -0
- package/dist/cli-style.js +28 -0
- package/dist/cli.js +1 -1
- package/dist/headless-events.d.ts +4 -2
- package/dist/headless-events.js +14 -34
- package/dist/mcp-server.js +2 -1
- package/dist/models-resolver.d.ts +3 -13
- package/dist/models-resolver.js +3 -22
- 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/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 +30 -4
- 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 +105 -0
- package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
- package/dist/resources/extensions/gsd/auto/loop.js +4 -1
- package/dist/resources/extensions/gsd/auto/orchestrator.js +89 -54
- package/dist/resources/extensions/gsd/auto/phases.js +49 -6
- package/dist/resources/extensions/gsd/auto/session.js +3 -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 +44 -91
- package/dist/resources/extensions/gsd/auto.js +41 -14
- 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 +23 -6
- 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/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 +26 -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 +2 -6
- 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 +23 -5
- package/dist/resources/extensions/gsd/markdown-renderer.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/notification-store.js +11 -4
- 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 +3 -3
- package/dist/resources/extensions/gsd/prompts/execute-task.md +1 -1
- 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 +7 -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/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/state.js +6 -20
- 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 +56 -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 +3 -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 +337 -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-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-session-state.js +4 -5
- package/dist/resources/extensions/gsd/worktree.js +8 -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/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 +2 -2
- 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/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +5 -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 +5 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.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-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/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/dist/cli.js +9 -1
- 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/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/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 +116 -39
- 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/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/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/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/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +9 -0
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +5 -4
- 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 +34 -4
- 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 +152 -0
- package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
- package/src/resources/extensions/gsd/auto/loop.ts +4 -1
- package/src/resources/extensions/gsd/auto/orchestrator.ts +98 -56
- package/src/resources/extensions/gsd/auto/phases.ts +65 -26
- package/src/resources/extensions/gsd/auto/session.ts +3 -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 +44 -94
- package/src/resources/extensions/gsd/auto.ts +52 -16
- 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 +23 -6
- 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/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 +37 -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 +2 -7
- 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 +37 -28
- package/src/resources/extensions/gsd/markdown-renderer.ts +11 -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/notification-store.ts +26 -3
- 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 +3 -3
- package/src/resources/extensions/gsd/prompts/execute-task.md +1 -1
- 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 +7 -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/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/state.ts +9 -21
- package/src/resources/extensions/gsd/stop-notice.ts +75 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +97 -1
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +198 -26
- 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/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/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 +10 -10
- 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 +273 -0
- package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
- 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/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 +2 -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 +73 -58
- package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +199 -0
- package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
- 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/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/parsers-legacy-importers.test.ts +138 -0
- package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
- 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-db.test.ts +124 -6
- package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
- 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/roadmap-slices.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +20 -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 +76 -0
- 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 +155 -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/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.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
- 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 +76 -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 +3 -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 +412 -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-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-session-state.ts +3 -5
- package/src/resources/extensions/gsd/worktree.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 → FBNo5cT_chy7YNoAQsU3o}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{C24pqUd-aru-l0Dp0gLZP → FBNo5cT_chy7YNoAQsU3o}/_ssgManifest.js +0 -0
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { importExtensionModule, type ExtensionAPI, type ExtensionContext } from "@gsd/pi-coding-agent";
|
|
3
3
|
|
|
4
4
|
import { closeManagedGsdBrowser, registerManagedGsdBrowserTools, warmUpManagedGsdBrowser } from "./engine/managed-gsd-browser.js";
|
|
5
|
-
import {
|
|
5
|
+
import { commitBrowserEngineResolution, resolveAmbientBrowserEngineResolution, type BrowserEngineMode } from "./engine/selection.js";
|
|
6
6
|
import { setArtifactRootForCwd } from "./state.js";
|
|
7
7
|
import { detectWebApp } from "./web-app-detect.js";
|
|
8
8
|
|
|
@@ -167,13 +167,59 @@ function withBrowserArtifactCwdScope(pi: ExtensionAPI): ExtensionAPI {
|
|
|
167
167
|
};
|
|
168
168
|
}
|
|
169
169
|
|
|
170
|
-
|
|
171
|
-
|
|
170
|
+
/** Daemon-connect budget when the probe-resolved managed engine is verified at session start. */
|
|
171
|
+
const PROBE_WARMUP_TIMEOUT_MS = 10_000;
|
|
172
|
+
|
|
173
|
+
async function registerBrowserTools(pi: ExtensionAPI, ctx: ExtensionContext): Promise<void> {
|
|
174
|
+
const projectRoot = ctx.cwd || process.cwd();
|
|
175
|
+
const resolution = resolveAmbientBrowserEngineResolution(projectRoot);
|
|
176
|
+
let engine = resolution.engine;
|
|
172
177
|
if (engine === "off") return;
|
|
178
|
+
|
|
179
|
+
// A probe-resolved managed engine is only a prediction that gsd-browser
|
|
180
|
+
// works — prove it by connecting the daemon before committing the session's
|
|
181
|
+
// tool registrations to it. Connect failure falls back to legacy Playwright
|
|
182
|
+
// (the failure mode that made ADR-024 freeze the old default) and commits
|
|
183
|
+
// the outcome so ambient readers see the engine actually in use. When eager
|
|
184
|
+
// warm-up is disabled the daemon-connect proof cannot run, so the probe
|
|
185
|
+
// default treats the managed engine as unprovable and falls back to legacy
|
|
186
|
+
// rather than registering it unverified. An explicit
|
|
187
|
+
// GSD_BROWSER_ENGINE=gsd-browser override skips the gate and is honored
|
|
188
|
+
// verbatim, matching prior behavior.
|
|
189
|
+
if (engine === "gsd-browser" && resolution.source === "probe" && !registeredEngine) {
|
|
190
|
+
if (isWarmUpDisabled()) {
|
|
191
|
+
engine = commitLegacyFallback(projectRoot, "warm-up disabled; managed engine unverifiable; using legacy Playwright");
|
|
192
|
+
} else {
|
|
193
|
+
const warmUp = await warmUpManagedGsdBrowser(ctx, AbortSignal.timeout(PROBE_WARMUP_TIMEOUT_MS));
|
|
194
|
+
if (!warmUp.ok) {
|
|
195
|
+
engine = commitLegacyFallback(projectRoot, `gsd-browser daemon connect failed (${warmUp.error}); using legacy Playwright`);
|
|
196
|
+
if (ctx.hasUI) {
|
|
197
|
+
ctx.ui.notify(
|
|
198
|
+
`gsd-browser engine unavailable (${warmUp.error}); using Playwright browser tools for this session.`,
|
|
199
|
+
"warning",
|
|
200
|
+
);
|
|
201
|
+
}
|
|
202
|
+
} else if (warmUp.coverageWarning && ctx.hasUI) {
|
|
203
|
+
ctx.ui.notify(warmUp.coverageWarning, "warning");
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// Browser tool registrations are process-global and cannot be swapped once
|
|
209
|
+
// live. When an earlier session in this process already registered an engine
|
|
210
|
+
// and this project resolved a different one (per-project probe resolution can
|
|
211
|
+
// diverge across projects in a multi-session process), adopt the registered
|
|
212
|
+
// engine rather than throwing — a throw surfaces as "browser-tools failed to
|
|
213
|
+
// load" and leaves this session with no browser tools at all. Commit the
|
|
214
|
+
// adoption so ambient readers (UAT guidance, warm-up) describe the engine
|
|
215
|
+
// actually in use.
|
|
173
216
|
if (registeredEngine && registeredEngine !== engine) {
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
217
|
+
engine = registeredEngine;
|
|
218
|
+
commitBrowserEngineResolution(projectRoot, {
|
|
219
|
+
engine,
|
|
220
|
+
source: "probe",
|
|
221
|
+
reason: `browser tools already registered with ${engine} earlier in this process; adopting it`,
|
|
222
|
+
});
|
|
177
223
|
}
|
|
178
224
|
|
|
179
225
|
let registration: Promise<void>;
|
|
@@ -202,29 +248,41 @@ async function registerBrowserTools(pi: ExtensionAPI): Promise<void> {
|
|
|
202
248
|
}
|
|
203
249
|
}
|
|
204
250
|
|
|
251
|
+
function commitLegacyFallback(projectRoot: string, reason: string): "legacy" {
|
|
252
|
+
commitBrowserEngineResolution(projectRoot, { engine: "legacy", source: "probe", reason });
|
|
253
|
+
return "legacy";
|
|
254
|
+
}
|
|
255
|
+
|
|
205
256
|
function isWarmUpDisabled(): boolean {
|
|
206
257
|
const value = process.env.GSD_BROWSER_WARMUP?.trim().toLowerCase();
|
|
207
258
|
return value === "0" || value === "false" || value === "off";
|
|
208
259
|
}
|
|
209
260
|
|
|
210
261
|
/**
|
|
211
|
-
* Auto-initialize the managed gsd-browser engine
|
|
212
|
-
*
|
|
213
|
-
*
|
|
262
|
+
* Auto-initialize the managed gsd-browser engine when it was selected via the
|
|
263
|
+
* explicit GSD_BROWSER_ENGINE override, which registers without the
|
|
264
|
+
* daemon-connect gate. Best-effort and non-blocking: warm-up runs in the
|
|
265
|
+
* background and only surfaces a warning if it fails. Probe-resolved sessions
|
|
266
|
+
* already connected (or fell back) during registration, so they are excluded
|
|
267
|
+
* to avoid re-warming and double-notifying.
|
|
214
268
|
*/
|
|
215
269
|
function maybeWarmUpManagedEngine(pi: ExtensionAPI, ctx: ExtensionContext): void {
|
|
216
270
|
if (isWarmUpDisabled()) return;
|
|
217
|
-
if (resolveBrowserEngineMode() !== "gsd-browser") return;
|
|
218
271
|
|
|
219
272
|
const projectRoot = ctx.cwd || process.cwd();
|
|
273
|
+
const resolution = resolveAmbientBrowserEngineResolution(projectRoot);
|
|
274
|
+
if (resolution.engine !== "gsd-browser" || resolution.source !== "env") return;
|
|
220
275
|
if (!detectWebApp(projectRoot)) return;
|
|
221
276
|
|
|
222
277
|
void warmUpManagedGsdBrowser(ctx).then((result) => {
|
|
223
|
-
if (!
|
|
278
|
+
if (!ctx.hasUI) return;
|
|
279
|
+
if (!result.ok) {
|
|
224
280
|
ctx.ui.notify(
|
|
225
281
|
`gsd-browser auto-init failed: ${result.error}. Browser UAT tools will retry on first use; run /gsd doctor if this persists.`,
|
|
226
282
|
"warning",
|
|
227
283
|
);
|
|
284
|
+
} else if (result.coverageWarning) {
|
|
285
|
+
ctx.ui.notify(result.coverageWarning, "warning");
|
|
228
286
|
}
|
|
229
287
|
});
|
|
230
288
|
}
|
|
@@ -240,7 +298,7 @@ async function closeActiveBrowserEngines(): Promise<void> {
|
|
|
240
298
|
export default function (pi: ExtensionAPI) {
|
|
241
299
|
pi.on("session_start", async (_event, ctx) => {
|
|
242
300
|
if (ctx.hasUI) {
|
|
243
|
-
void registerBrowserTools(pi)
|
|
301
|
+
void registerBrowserTools(pi, ctx)
|
|
244
302
|
.then(() => maybeWarmUpManagedEngine(pi, ctx))
|
|
245
303
|
.catch((error) => {
|
|
246
304
|
ctx.ui.notify(`browser-tools failed to load: ${error instanceof Error ? error.message : String(error)}`, "warning");
|
|
@@ -248,7 +306,7 @@ export default function (pi: ExtensionAPI) {
|
|
|
248
306
|
return;
|
|
249
307
|
}
|
|
250
308
|
|
|
251
|
-
await registerBrowserTools(pi);
|
|
309
|
+
await registerBrowserTools(pi, ctx);
|
|
252
310
|
maybeWarmUpManagedEngine(pi, ctx);
|
|
253
311
|
});
|
|
254
312
|
|
|
@@ -1,35 +1,105 @@
|
|
|
1
1
|
import { describe, it } from "node:test";
|
|
2
2
|
import assert from "node:assert/strict";
|
|
3
|
+
import { mkdtempSync, writeFileSync } from "node:fs";
|
|
3
4
|
import { createRequire } from "node:module";
|
|
4
|
-
import {
|
|
5
|
+
import { tmpdir } from "node:os";
|
|
6
|
+
import { dirname, join } from "node:path";
|
|
5
7
|
import { fileURLToPath } from "node:url";
|
|
6
8
|
|
|
7
9
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
8
10
|
const require = createRequire(import.meta.url);
|
|
9
11
|
const jiti = require("jiti")(__dirname, { interopDefault: true, debug: false });
|
|
10
12
|
|
|
11
|
-
const {
|
|
13
|
+
const {
|
|
14
|
+
commitBrowserEngineResolution,
|
|
15
|
+
resolveAmbientBrowserEngineResolution,
|
|
16
|
+
resolveBrowserEngineResolution,
|
|
17
|
+
} = jiti("../engine/selection.ts");
|
|
12
18
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
19
|
+
function makeProject({ webApp }) {
|
|
20
|
+
const dir = mkdtempSync(join(tmpdir(), "gsd-engine-selection-"));
|
|
21
|
+
const pkg = webApp ? { dependencies: { react: "^18.0.0" } } : { name: "cli-tool" };
|
|
22
|
+
writeFileSync(join(dir, "package.json"), JSON.stringify(pkg));
|
|
23
|
+
return dir;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function makeFakeCli() {
|
|
27
|
+
const dir = mkdtempSync(join(tmpdir(), "gsd-fake-cli-"));
|
|
28
|
+
const cliPath = join(dir, "gsd-browser");
|
|
29
|
+
writeFileSync(cliPath, "#!/bin/sh\n");
|
|
30
|
+
return cliPath;
|
|
31
|
+
}
|
|
17
32
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
assert.
|
|
21
|
-
|
|
33
|
+
describe("resolveBrowserEngineResolution", () => {
|
|
34
|
+
it("honors the explicit engine modes verbatim with env source", () => {
|
|
35
|
+
assert.deepEqual(
|
|
36
|
+
["gsd-browser", "legacy", "off"].map(
|
|
37
|
+
(mode) => resolveBrowserEngineResolution({ GSD_BROWSER_ENGINE: mode }).engine,
|
|
38
|
+
),
|
|
39
|
+
["gsd-browser", "legacy", "off"],
|
|
40
|
+
);
|
|
41
|
+
assert.equal(resolveBrowserEngineResolution({ GSD_BROWSER_ENGINE: "gsd-browser" }).source, "env");
|
|
22
42
|
});
|
|
23
43
|
|
|
24
44
|
it("accepts compatibility aliases", () => {
|
|
25
|
-
assert.equal(
|
|
26
|
-
assert.equal(
|
|
45
|
+
assert.equal(resolveBrowserEngineResolution({ GSD_BROWSER_ENGINE: "playwright" }).engine, "legacy");
|
|
46
|
+
assert.equal(resolveBrowserEngineResolution({ GSD_BROWSER_ENGINE: "false" }).engine, "off");
|
|
27
47
|
});
|
|
28
48
|
|
|
29
49
|
it("rejects unknown engine modes", () => {
|
|
30
50
|
assert.throws(
|
|
31
|
-
() =>
|
|
51
|
+
() => resolveBrowserEngineResolution({ GSD_BROWSER_ENGINE: "surprise" }),
|
|
32
52
|
/Expected "gsd-browser", "legacy", or "off"/,
|
|
33
53
|
);
|
|
34
54
|
});
|
|
55
|
+
|
|
56
|
+
it("defaults to legacy Playwright when no project root is known", () => {
|
|
57
|
+
const resolution = resolveBrowserEngineResolution({});
|
|
58
|
+
assert.equal(resolution.engine, "legacy");
|
|
59
|
+
assert.equal(resolution.source, "probe");
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it("keeps legacy Playwright for non-browser-facing projects", () => {
|
|
63
|
+
const cliPath = makeFakeCli();
|
|
64
|
+
const resolution = resolveBrowserEngineResolution(
|
|
65
|
+
{ GSD_BROWSER_CLI_PATH: cliPath },
|
|
66
|
+
makeProject({ webApp: false }),
|
|
67
|
+
);
|
|
68
|
+
assert.equal(resolution.engine, "legacy");
|
|
69
|
+
assert.match(resolution.reason, /not browser-facing/);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it("prefers the managed gsd-browser engine for web apps when the CLI is provable", () => {
|
|
73
|
+
const cliPath = makeFakeCli();
|
|
74
|
+
const resolution = resolveBrowserEngineResolution(
|
|
75
|
+
{ GSD_BROWSER_CLI_PATH: cliPath },
|
|
76
|
+
makeProject({ webApp: true }),
|
|
77
|
+
);
|
|
78
|
+
assert.equal(resolution.engine, "gsd-browser");
|
|
79
|
+
assert.equal(resolution.source, "probe");
|
|
80
|
+
assert.match(resolution.reason, /web app detected/);
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it("falls back to legacy Playwright with a recorded reason when the CLI is unavailable", () => {
|
|
84
|
+
const resolution = resolveBrowserEngineResolution(
|
|
85
|
+
{ GSD_BROWSER_CLI_PATH: "/nonexistent/gsd-browser" },
|
|
86
|
+
makeProject({ webApp: true }),
|
|
87
|
+
);
|
|
88
|
+
assert.equal(resolution.engine, "legacy");
|
|
89
|
+
assert.equal(resolution.source, "probe");
|
|
90
|
+
assert.match(resolution.reason, /falling back to legacy Playwright/);
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
describe("committed resolution", () => {
|
|
95
|
+
it("ambient readers see a committed verification outcome instead of the prediction", () => {
|
|
96
|
+
const projectRoot = makeProject({ webApp: true });
|
|
97
|
+
const fallback = {
|
|
98
|
+
engine: "legacy",
|
|
99
|
+
source: "probe",
|
|
100
|
+
reason: "gsd-browser daemon connect failed (test); using legacy Playwright",
|
|
101
|
+
};
|
|
102
|
+
commitBrowserEngineResolution(projectRoot, fallback);
|
|
103
|
+
assert.deepEqual(resolveAmbientBrowserEngineResolution(projectRoot), fallback);
|
|
104
|
+
});
|
|
35
105
|
});
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { describe, it } from "node:test";
|
|
2
2
|
import assert from "node:assert/strict";
|
|
3
3
|
|
|
4
|
-
const {
|
|
4
|
+
const {
|
|
5
|
+
resolveGsdBrowserDaemonStartInvocation,
|
|
6
|
+
resolveGsdBrowserMcpLaunchConfig,
|
|
7
|
+
} = await import("../../shared/gsd-browser-cli.ts");
|
|
5
8
|
|
|
6
9
|
describe("resolveGsdBrowserMcpLaunchConfig identity flags", () => {
|
|
7
10
|
it("emits a non-empty --identity-key alongside --identity-scope", () => {
|
|
@@ -34,4 +37,40 @@ describe("resolveGsdBrowserMcpLaunchConfig identity flags", () => {
|
|
|
34
37
|
});
|
|
35
38
|
assert.equal(args[args.indexOf("--identity-key") + 1], "custom-key");
|
|
36
39
|
});
|
|
40
|
+
|
|
41
|
+
it("splits GSD_BROWSER_MCP_COMMAND command lines before spawning", () => {
|
|
42
|
+
const commandLine = '"C:\\Program Files\\nodejs\\node.exe" "C:\\Users\\Test User\\AppData\\Roaming\\npm\\node_modules\\@opengsd\\gsd-browser\\bin\\gsd-browser"';
|
|
43
|
+
const { command, args } = resolveGsdBrowserMcpLaunchConfig("C:\\Users\\Test User\\project", {
|
|
44
|
+
GSD_BROWSER_MCP_COMMAND: commandLine,
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
assert.equal(command, "C:\\Program Files\\nodejs\\node.exe");
|
|
48
|
+
assert.equal(args[0], "C:\\Users\\Test User\\AppData\\Roaming\\npm\\node_modules\\@opengsd\\gsd-browser\\bin\\gsd-browser");
|
|
49
|
+
assert.equal(args[1], "mcp");
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it("uses a path-safe identity-project identifier", () => {
|
|
53
|
+
const { args } = resolveGsdBrowserMcpLaunchConfig("/tmp/example/project", {});
|
|
54
|
+
const projectId = args[args.indexOf("--identity-project") + 1];
|
|
55
|
+
assert.equal(typeof projectId, "string");
|
|
56
|
+
assert.doesNotMatch(projectId, /[\\/]/);
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
describe("resolveGsdBrowserDaemonStartInvocation", () => {
|
|
61
|
+
it("mirrors MCP session and identity flags with daemon start", () => {
|
|
62
|
+
const launch = resolveGsdBrowserMcpLaunchConfig("/tmp/example-project", {});
|
|
63
|
+
const daemon = resolveGsdBrowserDaemonStartInvocation("/tmp/example-project", {});
|
|
64
|
+
|
|
65
|
+
assert.equal(daemon.command, launch.command);
|
|
66
|
+
assert.equal(daemon.cwd, launch.cwd);
|
|
67
|
+
assert.deepEqual(
|
|
68
|
+
daemon.args.slice(daemon.args.indexOf("--session")),
|
|
69
|
+
launch.args.slice(launch.args.indexOf("--session")),
|
|
70
|
+
);
|
|
71
|
+
assert.deepEqual(
|
|
72
|
+
daemon.args.slice(0, daemon.args.indexOf("--session")),
|
|
73
|
+
[...launch.args.slice(0, launch.args.indexOf("mcp")), "daemon", "start"],
|
|
74
|
+
);
|
|
75
|
+
});
|
|
37
76
|
});
|
|
@@ -2,10 +2,33 @@ import { describe, it } from "node:test";
|
|
|
2
2
|
import assert from "node:assert/strict";
|
|
3
3
|
|
|
4
4
|
const {
|
|
5
|
+
MANAGED_BROWSER_TOOL_SPECS,
|
|
5
6
|
MANAGED_GSD_BROWSER_TOOL_NAMES,
|
|
7
|
+
findMissingContractCoverage,
|
|
8
|
+
normalizeManagedArgs,
|
|
6
9
|
registerManagedGsdBrowserTools,
|
|
7
10
|
} = await import("../engine/managed-gsd-browser.ts");
|
|
8
11
|
|
|
12
|
+
// The tools @opengsd/gsd-browser actually serves over MCP (subset relevant to
|
|
13
|
+
// the contract). Notably absent: browser_click, browser_type, browser_verify,
|
|
14
|
+
// browser_reload — those are satisfied through translations.
|
|
15
|
+
const GSD_BROWSER_SERVED_TOOLS = [
|
|
16
|
+
"browser_navigate",
|
|
17
|
+
"browser_snapshot",
|
|
18
|
+
"browser_click_ref",
|
|
19
|
+
"browser_fill_ref",
|
|
20
|
+
"browser_fill_form",
|
|
21
|
+
"browser_wait_for",
|
|
22
|
+
"browser_assert",
|
|
23
|
+
"browser_screenshot",
|
|
24
|
+
"browser_find_element",
|
|
25
|
+
"browser_console",
|
|
26
|
+
"browser_network",
|
|
27
|
+
"browser_evaluate",
|
|
28
|
+
"browser_batch",
|
|
29
|
+
"browser_act",
|
|
30
|
+
];
|
|
31
|
+
|
|
9
32
|
describe("registerManagedGsdBrowserTools", () => {
|
|
10
33
|
it("registers the curated Pi browser contract", () => {
|
|
11
34
|
const tools = [];
|
|
@@ -31,3 +54,116 @@ describe("registerManagedGsdBrowserTools", () => {
|
|
|
31
54
|
assert.equal(screenshot?.compatibility?.producesImages, true);
|
|
32
55
|
});
|
|
33
56
|
});
|
|
57
|
+
|
|
58
|
+
describe("findMissingContractCoverage", () => {
|
|
59
|
+
it("reports nothing for the tool list gsd-browser actually serves", () => {
|
|
60
|
+
assert.deepEqual(findMissingContractCoverage(GSD_BROWSER_SERVED_TOOLS), []);
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
it("reports contract tools none of whose MCP candidates are served", () => {
|
|
64
|
+
const served = GSD_BROWSER_SERVED_TOOLS.filter((name) => name !== "browser_assert");
|
|
65
|
+
// browser_verify also depends on browser_assert through its translation.
|
|
66
|
+
assert.deepEqual(findMissingContractCoverage(served), ["browser_assert", "browser_verify"]);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it("reports translated tools when a required MCP tool is missing", () => {
|
|
70
|
+
const served = GSD_BROWSER_SERVED_TOOLS.filter((name) => name !== "browser_batch");
|
|
71
|
+
assert.deepEqual(findMissingContractCoverage(served), ["browser_click", "browser_type", "browser_batch"]);
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
describe("contract tool translations", () => {
|
|
76
|
+
it("translates browser_click into a single-step batch call", () => {
|
|
77
|
+
const calls = MANAGED_BROWSER_TOOL_SPECS.browser_click.translate.build({ selector: "#save" });
|
|
78
|
+
assert.deepEqual(calls, [{
|
|
79
|
+
mcpTool: "browser_batch",
|
|
80
|
+
args: { steps: [{ action: "click", selector: "#save" }] },
|
|
81
|
+
}]);
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
it("translates browser_type into a single-step batch call", () => {
|
|
85
|
+
const calls = MANAGED_BROWSER_TOOL_SPECS.browser_type.translate.build({
|
|
86
|
+
selector: "#name",
|
|
87
|
+
text: "hello",
|
|
88
|
+
clearFirst: true,
|
|
89
|
+
submit: true,
|
|
90
|
+
});
|
|
91
|
+
assert.deepEqual(calls, [{
|
|
92
|
+
mcpTool: "browser_batch",
|
|
93
|
+
args: { steps: [{ action: "type", selector: "#name", text: "hello", clearFirst: true, submit: true }] },
|
|
94
|
+
}]);
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
it("normalizes batch options and step keys to the daemon's snake_case", () => {
|
|
98
|
+
const normalized = normalizeManagedArgs("browser_batch", {
|
|
99
|
+
steps: [{ action: "type", selector: "#name", text: "hi", clearFirst: true }],
|
|
100
|
+
stopOnFailure: false,
|
|
101
|
+
finalSummaryOnly: true,
|
|
102
|
+
});
|
|
103
|
+
assert.deepEqual(normalized, {
|
|
104
|
+
steps: [{ action: "type", selector: "#name", text: "hi", clear_first: true }],
|
|
105
|
+
stop_on_failure: false,
|
|
106
|
+
summary_only: true,
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
it("translates browser_verify into navigate, assert, and screenshot calls", () => {
|
|
111
|
+
const calls = MANAGED_BROWSER_TOOL_SPECS.browser_verify.translate.build({
|
|
112
|
+
url: "http://localhost:3000",
|
|
113
|
+
timeout: 5000,
|
|
114
|
+
checks: [
|
|
115
|
+
{ description: "heading shows", selector: "h1", expectedText: "Welcome" },
|
|
116
|
+
{ description: "spinner gone", selector: ".spinner", expectedVisible: false },
|
|
117
|
+
{ description: "evidence", selector: "main", expectedVisible: true, screenshot: true },
|
|
118
|
+
],
|
|
119
|
+
});
|
|
120
|
+
assert.deepEqual(calls, [
|
|
121
|
+
{ mcpTool: "browser_navigate", args: { url: "http://localhost:3000", timeout: 5000 } },
|
|
122
|
+
{
|
|
123
|
+
mcpTool: "browser_assert",
|
|
124
|
+
args: {
|
|
125
|
+
checks: [
|
|
126
|
+
{ kind: "text_visible", text: "Welcome" },
|
|
127
|
+
{ kind: "selector_hidden", selector: ".spinner" },
|
|
128
|
+
{ kind: "selector_visible", selector: "main" },
|
|
129
|
+
],
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
{ mcpTool: "browser_screenshot", args: {}, optional: true },
|
|
133
|
+
]);
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
it("declares every tool a translation can emit in its coverage requirements", () => {
|
|
137
|
+
for (const [name, spec] of Object.entries(MANAGED_BROWSER_TOOL_SPECS)) {
|
|
138
|
+
if (!spec.translate) continue;
|
|
139
|
+
const maximalArgs = {
|
|
140
|
+
url: "http://localhost:3000",
|
|
141
|
+
timeout: 5000,
|
|
142
|
+
selector: "#el",
|
|
143
|
+
text: "hi",
|
|
144
|
+
clearFirst: true,
|
|
145
|
+
checks: [{ description: "d", selector: "#el", expectedText: "hi", expectedVisible: true, screenshot: true }],
|
|
146
|
+
};
|
|
147
|
+
const emitted = spec.translate.build(maximalArgs).map((call) => call.mcpTool);
|
|
148
|
+
for (const mcpTool of emitted) {
|
|
149
|
+
assert.ok(
|
|
150
|
+
spec.translate.requires.includes(mcpTool),
|
|
151
|
+
`${name} translation emits ${mcpTool} but does not require it for coverage`,
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
it("translates browser_verify without checks into navigation only", () => {
|
|
158
|
+
const calls = MANAGED_BROWSER_TOOL_SPECS.browser_verify.translate.build({ url: "http://localhost:3000", checks: [] });
|
|
159
|
+
assert.deepEqual(calls, [{ mcpTool: "browser_navigate", args: { url: "http://localhost:3000" } }]);
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
it("translates browser_reload into evaluate plus best-effort network-idle wait", () => {
|
|
163
|
+
const calls = MANAGED_BROWSER_TOOL_SPECS.browser_reload.translate.build({});
|
|
164
|
+
assert.deepEqual(calls, [
|
|
165
|
+
{ mcpTool: "browser_evaluate", args: { expression: "location.reload()" } },
|
|
166
|
+
{ mcpTool: "browser_wait_for", args: { condition: "network_idle", timeout: 3_000 }, optional: true },
|
|
167
|
+
]);
|
|
168
|
+
});
|
|
169
|
+
});
|
|
@@ -59,6 +59,8 @@ import {
|
|
|
59
59
|
computeMcpDisallowedTools,
|
|
60
60
|
} from "../gsd/mcp-filter.js";
|
|
61
61
|
import { RUN_UAT_CLAUDE_NATIVE_TOOL_NAMES, RUN_UAT_FORBIDDEN_TOOL_NAMES, RUN_UAT_WORKFLOW_TOOL_NAMES, resolveToolPresentationPlan } from "../gsd/tool-presentation-plan.js";
|
|
62
|
+
import { getToolSurfaceReadinessError } from "../gsd/tool-surface-readiness.js";
|
|
63
|
+
import { hasBrowserContractPrefix } from "../shared/browser-contract.js";
|
|
62
64
|
import { showInterviewRound, type Question, type RoundResult } from "../shared/tui.js";
|
|
63
65
|
import type {
|
|
64
66
|
SDKAssistantMessage,
|
|
@@ -1590,7 +1592,7 @@ function browserMcpServerNameFromAllowedTools(allowedTools: unknown): string | u
|
|
|
1590
1592
|
if (typeof toolName !== "string") continue;
|
|
1591
1593
|
const parsed = parseAllowedMcpToolName(toolName);
|
|
1592
1594
|
if (!parsed) continue;
|
|
1593
|
-
if (parsed.server === "gsd-browser" || parsed.tool
|
|
1595
|
+
if (parsed.server === "gsd-browser" || hasBrowserContractPrefix(parsed.tool)) {
|
|
1594
1596
|
return parsed.server;
|
|
1595
1597
|
}
|
|
1596
1598
|
}
|
|
@@ -1603,7 +1605,7 @@ function workflowMcpServerNameFromAllowedTools(allowedTools: unknown): string |
|
|
|
1603
1605
|
for (const toolName of allowedTools) {
|
|
1604
1606
|
if (typeof toolName !== "string") continue;
|
|
1605
1607
|
const parsed = parseAllowedMcpToolName(toolName);
|
|
1606
|
-
if (!parsed || parsed.server === browserServerName || parsed.tool
|
|
1608
|
+
if (!parsed || parsed.server === browserServerName || hasBrowserContractPrefix(parsed.tool)) continue;
|
|
1607
1609
|
return parsed.server;
|
|
1608
1610
|
}
|
|
1609
1611
|
return undefined;
|
|
@@ -1998,8 +2000,9 @@ async function pumpSdkMessages(
|
|
|
1998
2000
|
: {}),
|
|
1999
2001
|
},
|
|
2000
2002
|
);
|
|
2003
|
+
const workflowMcpServerName = workflowMcpServerNameFromAllowedTools(sdkOpts.allowedTools);
|
|
2001
2004
|
const prompt = buildPromptFromContext(context, {
|
|
2002
|
-
workflowMcpServerName
|
|
2005
|
+
workflowMcpServerName,
|
|
2003
2006
|
browserMcpServerName: browserMcpServerNameFromAllowedTools(sdkOpts.allowedTools),
|
|
2004
2007
|
});
|
|
2005
2008
|
const queryPrompt = buildSdkQueryPrompt(context, prompt);
|
|
@@ -2041,7 +2044,34 @@ async function pumpSdkMessages(
|
|
|
2041
2044
|
switch (msg.type) {
|
|
2042
2045
|
// -- Init --
|
|
2043
2046
|
case "system": {
|
|
2044
|
-
//
|
|
2047
|
+
// Tool Surface Readiness gate: the init message is the first (and
|
|
2048
|
+
// only) point where the session reports its live tool surface and
|
|
2049
|
+
// MCP server statuses. If the workflow server failed or has not
|
|
2050
|
+
// registered this Unit's required tools, abort before the first
|
|
2051
|
+
// model turn with a transient, recovery-classifiable error
|
|
2052
|
+
// (tool-unavailable → retry) instead of letting the model hit
|
|
2053
|
+
// "No such tool available" mid-Unit and improvise around it.
|
|
2054
|
+
const init = msg as unknown as {
|
|
2055
|
+
subtype?: string;
|
|
2056
|
+
tools?: string[];
|
|
2057
|
+
mcp_servers?: { name: string; status: string }[];
|
|
2058
|
+
};
|
|
2059
|
+
if (init.subtype === "init") {
|
|
2060
|
+
const readinessError = getToolSurfaceReadinessError({
|
|
2061
|
+
unitType: gsdPhase,
|
|
2062
|
+
workflowServerName: workflowMcpServerName,
|
|
2063
|
+
observation: { tools: init.tools ?? [], mcpServers: init.mcp_servers ?? [] },
|
|
2064
|
+
});
|
|
2065
|
+
if (readinessError) {
|
|
2066
|
+
controller.abort();
|
|
2067
|
+
stream.push({
|
|
2068
|
+
type: "error",
|
|
2069
|
+
reason: "error",
|
|
2070
|
+
error: makeErrorMessage(modelId, readinessError),
|
|
2071
|
+
});
|
|
2072
|
+
return;
|
|
2073
|
+
}
|
|
2074
|
+
}
|
|
2045
2075
|
break;
|
|
2046
2076
|
}
|
|
2047
2077
|
|
|
@@ -7,12 +7,21 @@ import { atomicWriteSync } from "../atomic-write.js";
|
|
|
7
7
|
import { gsdRoot } from "../paths.js";
|
|
8
8
|
import type { AutoSession } from "./session.js";
|
|
9
9
|
|
|
10
|
-
type RetrySession = Pick<AutoSession, "activeRunDir" | "basePath" | "verificationRetryCount"
|
|
10
|
+
type RetrySession = Pick<AutoSession, "activeRunDir" | "basePath" | "verificationRetryCount"> & {
|
|
11
|
+
exhaustedVerificationUnits?: Set<string>;
|
|
12
|
+
};
|
|
11
13
|
|
|
12
14
|
interface RetryStoreLogDeps {
|
|
13
15
|
logFailure: (err: unknown) => void;
|
|
14
16
|
}
|
|
15
17
|
|
|
18
|
+
function ensureExhaustedVerificationUnits(s: RetrySession): Set<string> {
|
|
19
|
+
if (!s.exhaustedVerificationUnits) {
|
|
20
|
+
s.exhaustedVerificationUnits = new Set<string>();
|
|
21
|
+
}
|
|
22
|
+
return s.exhaustedVerificationUnits;
|
|
23
|
+
}
|
|
24
|
+
|
|
16
25
|
export function customVerifyRetryStateDir(s: Pick<AutoSession, "activeRunDir" | "basePath">): string {
|
|
17
26
|
return s.activeRunDir ? join(s.activeRunDir, "runtime") : join(gsdRoot(s.basePath), "runtime");
|
|
18
27
|
}
|
|
@@ -25,7 +34,8 @@ export function hydrateCustomVerifyRetryCounts(
|
|
|
25
34
|
s: RetrySession,
|
|
26
35
|
deps: RetryStoreLogDeps,
|
|
27
36
|
): Map<string, number> {
|
|
28
|
-
|
|
37
|
+
const exhaustedUnits = ensureExhaustedVerificationUnits(s);
|
|
38
|
+
if (s.verificationRetryCount.size > 0 || exhaustedUnits.size > 0) {
|
|
29
39
|
return s.verificationRetryCount;
|
|
30
40
|
}
|
|
31
41
|
|
|
@@ -39,6 +49,12 @@ export function hydrateCustomVerifyRetryCounts(
|
|
|
39
49
|
s.verificationRetryCount.set(key, Math.floor(value));
|
|
40
50
|
}
|
|
41
51
|
}
|
|
52
|
+
const exhausted = raw && typeof raw === "object" && Array.isArray(raw.exhausted) ? raw.exhausted : [];
|
|
53
|
+
for (const key of exhausted) {
|
|
54
|
+
if (typeof key === "string" && key.length > 0) {
|
|
55
|
+
exhaustedUnits.add(key);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
42
58
|
} catch (err) {
|
|
43
59
|
deps.logFailure(err);
|
|
44
60
|
}
|
|
@@ -51,16 +67,18 @@ export function saveCustomVerifyRetryCounts(
|
|
|
51
67
|
deps: RetryStoreLogDeps,
|
|
52
68
|
): void {
|
|
53
69
|
const retryCounts = s.verificationRetryCount;
|
|
70
|
+
const exhaustedUnits = ensureExhaustedVerificationUnits(s);
|
|
54
71
|
const filePath = customVerifyRetryStatePath(s);
|
|
55
72
|
|
|
56
73
|
try {
|
|
57
|
-
if (!retryCounts || retryCounts.size === 0) {
|
|
74
|
+
if ((!retryCounts || retryCounts.size === 0) && (!exhaustedUnits || exhaustedUnits.size === 0)) {
|
|
58
75
|
unlinkSync(filePath);
|
|
59
76
|
return;
|
|
60
77
|
}
|
|
61
78
|
mkdirSync(customVerifyRetryStateDir(s), { recursive: true });
|
|
62
79
|
atomicWriteSync(filePath, JSON.stringify({
|
|
63
80
|
counts: Object.fromEntries(retryCounts),
|
|
81
|
+
exhausted: [...exhaustedUnits],
|
|
64
82
|
updatedAt: new Date().toISOString(),
|
|
65
83
|
}) + "\n");
|
|
66
84
|
} catch (err) {
|