@opengsd/gsd-pi 1.2.0-dev.5457a158 → 1.2.0-dev.6ccd27b3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli-model-override.d.ts +15 -0
- package/dist/cli-model-override.js +21 -0
- package/dist/cli.js +1 -18
- package/dist/headless-events.js +7 -5
- package/dist/loader.js +6 -4
- package/dist/mcp-server.js +2 -1
- package/dist/register-agent-bundles.d.ts +11 -2
- package/dist/register-agent-bundles.js +18 -4
- package/dist/resource-loader.d.ts +10 -5
- package/dist/resource-loader.js +121 -6
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/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/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 +450 -217
- 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 +30 -12
- package/dist/resources/extensions/gsd/auto-prompts.js +78 -19
- package/dist/resources/extensions/gsd/auto-start.js +35 -15
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +5 -4
- package/dist/resources/extensions/gsd/auto-verification.js +23 -30
- package/dist/resources/extensions/gsd/auto-worktree.js +15 -2
- package/dist/resources/extensions/gsd/auto.js +41 -2
- package/dist/resources/extensions/gsd/blocked-models.js +28 -0
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +26 -6
- 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 +172 -59
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +302 -80
- 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/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 +8 -3
- 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 +256 -125
- package/dist/resources/extensions/gsd/doctor-git-checks.js +2 -18
- package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -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 +60 -0
- package/dist/resources/extensions/gsd/guided-flow.js +93 -4
- 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/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/notifications.js +12 -7
- package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
- package/dist/resources/extensions/gsd/preferences-models.js +2 -2
- 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 +1 -1
- 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 +1 -1
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- 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/reactive-graph.js +8 -1
- 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 +11 -2
- 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 +83 -31
- 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 +5 -0
- package/dist/resources/extensions/gsd/tools/plan-slice.js +2 -2
- 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-context-composer.js +65 -0
- package/dist/resources/extensions/gsd/unit-registry.js +41 -24
- 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/worktree-lifecycle.js +3 -2
- package/dist/resources/extensions/gsd/worktree-manager.js +7 -1
- package/dist/resources/extensions/gsd/worktree-safety.js +28 -26
- 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 +12 -12
- 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 +12 -12
- 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/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/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 -53
- 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 +18 -18
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +161 -81
- 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 +239 -153
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +256 -145
- 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/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 +534 -228
- 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 +33 -12
- package/src/resources/extensions/gsd/auto-prompts.ts +115 -35
- package/src/resources/extensions/gsd/auto-start.ts +36 -18
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +4 -4
- package/src/resources/extensions/gsd/auto-verification.ts +26 -28
- package/src/resources/extensions/gsd/auto-worktree.ts +15 -2
- package/src/resources/extensions/gsd/auto.ts +49 -2
- package/src/resources/extensions/gsd/blocked-models.ts +49 -0
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +34 -5
- 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 +211 -59
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +350 -86
- 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/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 +10 -2
- 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 +267 -142
- package/src/resources/extensions/gsd/doctor-git-checks.ts +2 -19
- package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -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 +78 -0
- package/src/resources/extensions/gsd/guided-flow.ts +145 -24
- 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/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/notifications.ts +13 -6
- package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
- package/src/resources/extensions/gsd/preferences-models.ts +2 -1
- 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 +1 -1
- 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 +1 -1
- package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- 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/reactive-graph.ts +11 -1
- 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 +12 -1
- package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +206 -22
- package/src/resources/extensions/gsd/tests/auto-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 +51 -0
- 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/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 +23 -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 +7 -11
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +35 -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/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/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-errors.test.ts +2 -4
- package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +26 -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/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-surface-readiness.test.ts +184 -10
- 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-context-composer.test.ts +44 -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 +65 -2
- 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 +273 -38
- 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 +126 -19
- 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 +4 -0
- package/src/resources/extensions/gsd/tools/plan-slice.ts +2 -2
- 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-context-composer.ts +99 -0
- package/src/resources/extensions/gsd/unit-registry.ts +41 -24
- 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/worktree-lifecycle.ts +3 -8
- package/src/resources/extensions/gsd/worktree-manager.ts +6 -1
- package/src/resources/extensions/gsd/worktree-safety.ts +41 -39
- 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/{2p9Rv9pQflAxCBbGVI2vb → avEtvPrImYTq2gGe-hVNp}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{2p9Rv9pQflAxCBbGVI2vb → avEtvPrImYTq2gGe-hVNp}/_ssgManifest.js +0 -0
|
@@ -21,7 +21,7 @@ import { getPendingGatesForTurn } from "./gsd-db.js";
|
|
|
21
21
|
import { assertGateCoverage, getGatesForTurn, } from "./gate-registry.js";
|
|
22
22
|
import { formatDecisionsCompact, formatRequirementsCompact } from "./structured-data-formatter.js";
|
|
23
23
|
import { readPhaseAnchor, formatAnchorForPrompt } from "./phase-anchor.js";
|
|
24
|
-
import { composeContextModeInstructions, composeContractedUnitContext, composeInlinedContext, composeUnitContext, } from "./unit-context-composer.js";
|
|
24
|
+
import { composeContextModeInstructions, composeContractedUnitContext, composeInlinedContext, composeToolSurfaceInstructions, composeUnitContext, } from "./unit-context-composer.js";
|
|
25
25
|
import { resolveManifest } from "./unit-context-manifest.js";
|
|
26
26
|
import { compileUnitContextContract } from "./tool-contract.js";
|
|
27
27
|
import { readCompactionSnapshot } from "./compaction-snapshot.js";
|
|
@@ -33,7 +33,7 @@ import { debugLog } from "./debug-logger.js";
|
|
|
33
33
|
import { buildSkillActivationBlock, buildSkillDiscoveryVars } from "./skill-activation.js";
|
|
34
34
|
import { findMilestoneIds } from "./milestone-ids.js";
|
|
35
35
|
import { buildRunUatPresentationForType, RUN_UAT_TOOL_PRESENTATION_PLAN_ID } from "./tool-presentation-plan.js";
|
|
36
|
-
import {
|
|
36
|
+
import { classifyUatContentForRun, shouldDispatchUatForContent, } from "./uat-policy.js";
|
|
37
37
|
import { buildWebAppUatGuidanceBlock } from "./web-app-uat.js";
|
|
38
38
|
export { buildSkillActivationBlock, buildSkillDiscoveryVars };
|
|
39
39
|
// ─── Preamble Cap ─────────────────────────────────────────────────────────────
|
|
@@ -224,12 +224,14 @@ function renderContextModeBlockForPrompt(unitType, base, renderMode = "standalon
|
|
|
224
224
|
return `${contextMode}\n\n## Context Snapshot\nSource: \`.gsd/last-snapshot.md\`\n\n${snapshot.trimEnd()}`;
|
|
225
225
|
}
|
|
226
226
|
function prependContextModeToBlock(unitType, base, block, renderMode = "standalone") {
|
|
227
|
+
const toolSurface = composeToolSurfaceInstructions(unitType, { renderMode });
|
|
227
228
|
const contextMode = renderContextModeBlockForPrompt(unitType, base, renderMode);
|
|
228
|
-
|
|
229
|
+
const guidance = [toolSurface, contextMode].filter(Boolean).join("\n\n");
|
|
230
|
+
if (!guidance)
|
|
229
231
|
return block;
|
|
230
232
|
if (!block.trim())
|
|
231
|
-
return
|
|
232
|
-
return `${
|
|
233
|
+
return guidance;
|
|
234
|
+
return `${guidance}\n\n${block}`;
|
|
233
235
|
}
|
|
234
236
|
function requireUnitPromptContextContract(unitType) {
|
|
235
237
|
const result = compileUnitContextContract(unitType);
|
|
@@ -841,7 +843,7 @@ export async function inlineDecisionsFromDb(base, milestoneId, scope, level) {
|
|
|
841
843
|
}
|
|
842
844
|
/**
|
|
843
845
|
* Inline requirements with optional milestone and slice scoping from the DB.
|
|
844
|
-
* Falls back to filesystem via inlineGsdRootFile when DB unavailable
|
|
846
|
+
* Falls back to filesystem via inlineGsdRootFile only when DB is unavailable.
|
|
845
847
|
*/
|
|
846
848
|
export async function inlineRequirementsFromDb(base, milestoneId, sliceId, level) {
|
|
847
849
|
const inlineLevel = level ?? resolveInlineLevel();
|
|
@@ -849,14 +851,28 @@ export async function inlineRequirementsFromDb(base, milestoneId, sliceId, level
|
|
|
849
851
|
const { isDbAvailable } = await import("./gsd-db.js");
|
|
850
852
|
if (isDbAvailable()) {
|
|
851
853
|
const { queryRequirements, formatRequirementsForPrompt } = await import("./context-store.js");
|
|
852
|
-
|
|
854
|
+
let requirements = queryRequirements({ milestoneId, sliceId });
|
|
855
|
+
let broadenedScope = false;
|
|
856
|
+
if (requirements.length === 0 && sliceId) {
|
|
857
|
+
requirements = queryRequirements({ milestoneId });
|
|
858
|
+
broadenedScope = true;
|
|
859
|
+
}
|
|
860
|
+
if (requirements.length === 0 && milestoneId) {
|
|
861
|
+
requirements = queryRequirements({ status: "active" });
|
|
862
|
+
broadenedScope = true;
|
|
863
|
+
}
|
|
853
864
|
if (requirements.length > 0) {
|
|
854
|
-
// Use compact format for non-full levels
|
|
855
|
-
|
|
865
|
+
// Use compact format for non-full levels, milestone-scoped calls, and
|
|
866
|
+
// any cascade stage that broadened past the originally requested scope —
|
|
867
|
+
// a slice-scoped "full" call that fell through to the project-wide
|
|
868
|
+
// active fallback must not format those rows as full requirements.
|
|
869
|
+
const useCompact = inlineLevel !== "full" || !sliceId || broadenedScope;
|
|
870
|
+
const formatted = useCompact
|
|
856
871
|
? formatRequirementsCompact(requirements)
|
|
857
872
|
: formatRequirementsForPrompt(requirements);
|
|
858
873
|
return `### Requirements\nSource: \`.gsd/REQUIREMENTS.md\`\n\n${formatted}`;
|
|
859
874
|
}
|
|
875
|
+
return null;
|
|
860
876
|
}
|
|
861
877
|
}
|
|
862
878
|
catch (err) {
|
|
@@ -1265,6 +1281,32 @@ export async function checkNeedsReassessment(base, mid, state) {
|
|
|
1265
1281
|
* - No UAT file exists for the slice
|
|
1266
1282
|
* - UAT result file already exists (idempotent — already ran)
|
|
1267
1283
|
*/
|
|
1284
|
+
/**
|
|
1285
|
+
* Resolve the effective UAT mode for the dispatch gate the same way
|
|
1286
|
+
* `buildRunUatPrompt` does: classify the UAT body with the slice's SUMMARY as
|
|
1287
|
+
* supplemental context, so a `browser-executable` UAT whose slice references a
|
|
1288
|
+
* self-contained harness (`npm run test:uat`, `search-uat.mjs`, `npx
|
|
1289
|
+
* playwright test`) is promoted to `runtime-executable` for the gate too.
|
|
1290
|
+
*
|
|
1291
|
+
* Without this, `checkNeedsRunUat` returns `browser-executable` while the
|
|
1292
|
+
* prompt instructs runtime-only execution, causing the dispatch gate to
|
|
1293
|
+
* require browser tools / warm up the browser daemon (or stop dispatch when
|
|
1294
|
+
* browser MCP is unavailable) for UAT runs that never touch the browser. See
|
|
1295
|
+
* cursor[bot] review on PR #696 for the M007/S01 regression.
|
|
1296
|
+
*/
|
|
1297
|
+
async function resolveRunUatEffectiveType(base, mid, sliceId, uatContent) {
|
|
1298
|
+
let summaryContent = "";
|
|
1299
|
+
try {
|
|
1300
|
+
const summaryPath = resolveSliceFile(base, mid, sliceId, "SUMMARY");
|
|
1301
|
+
if (summaryPath) {
|
|
1302
|
+
summaryContent = (await loadFile(summaryPath)) ?? "";
|
|
1303
|
+
}
|
|
1304
|
+
}
|
|
1305
|
+
catch (err) {
|
|
1306
|
+
logWarning("prompt", `resolveRunUatEffectiveType SUMMARY load failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1307
|
+
}
|
|
1308
|
+
return classifyUatContentForRun(uatContent, summaryContent).effectiveType;
|
|
1309
|
+
}
|
|
1268
1310
|
export async function checkNeedsRunUat(base, mid, state, prefs) {
|
|
1269
1311
|
// DB primary path — fall through to file-based when DB has no data for this milestone
|
|
1270
1312
|
try {
|
|
@@ -1297,7 +1339,8 @@ export async function checkNeedsRunUat(base, mid, state, prefs) {
|
|
|
1297
1339
|
}
|
|
1298
1340
|
if (!shouldDispatchUatForContent(uatContent, prefs))
|
|
1299
1341
|
continue;
|
|
1300
|
-
|
|
1342
|
+
const uatType = await resolveRunUatEffectiveType(base, mid, sid, uatContent);
|
|
1343
|
+
return { sliceId: sid, uatType };
|
|
1301
1344
|
}
|
|
1302
1345
|
return null;
|
|
1303
1346
|
}
|
|
@@ -1338,7 +1381,8 @@ export async function checkNeedsRunUat(base, mid, state, prefs) {
|
|
|
1338
1381
|
}
|
|
1339
1382
|
if (!shouldDispatchUatForContent(uatContentFb, prefs))
|
|
1340
1383
|
continue;
|
|
1341
|
-
|
|
1384
|
+
const uatType = await resolveRunUatEffectiveType(base, mid, uatSid, uatContentFb);
|
|
1385
|
+
return { sliceId: uatSid, uatType };
|
|
1342
1386
|
}
|
|
1343
1387
|
return null;
|
|
1344
1388
|
}
|
|
@@ -3097,10 +3141,25 @@ export async function buildRunUatPrompt(mid, sliceId, uatPath, uatContent, base)
|
|
|
3097
3141
|
const rawInlinedContext = `## Inlined Context (preloaded — do not re-read these files)\n\n${composedBody}`;
|
|
3098
3142
|
const cappedInlinedContext = capPreamble(rawInlinedContext);
|
|
3099
3143
|
trackPromptContext(contextTelemetry, "cap", cappedInlinedContext.length < rawInlinedContext.length ? "skipped" : "inline", null, cappedInlinedContext.length < rawInlinedContext.length ? `dropped ${rawInlinedContext.length - cappedInlinedContext.length} chars` : "within budget");
|
|
3100
|
-
const
|
|
3144
|
+
const uatPolicy = classifyUatContentForRun(uatContent, cappedInlinedContext);
|
|
3145
|
+
const uatType = uatPolicy.effectiveType;
|
|
3146
|
+
const runtimeHarnessOverride = uatPolicy.declaredType === "browser-executable" && uatType === "runtime-executable"
|
|
3147
|
+
? [
|
|
3148
|
+
"## Runtime harness override",
|
|
3149
|
+
"",
|
|
3150
|
+
"This UAT declares `browser-executable` but the slice references a self-contained verification command (`npm run test:uat`, `search-uat.mjs`, or similar).",
|
|
3151
|
+
"Run **only** that command via `gsd_uat_exec` with `uat-runtime-check` intent.",
|
|
3152
|
+
"Do **not** call `uat-service-start`, do **not** run `npm run start`, `npm run test:server`, or any separate server command.",
|
|
3153
|
+
"Do **not** use `browser_navigate` or other `browser_*` tools — the harness already exercises the browser.",
|
|
3154
|
+
"When the harness exits 0, save **PASS** with `uatType: \"runtime-executable\"` (the effective mode above, not the UAT file header) and **runtime** check modes only.",
|
|
3155
|
+
"",
|
|
3156
|
+
].join("\n")
|
|
3157
|
+
: "";
|
|
3158
|
+
const inlinedContext = prependContextModeToBlock("run-uat", base, runtimeHarnessOverride
|
|
3159
|
+
? `${runtimeHarnessOverride}\n${cappedInlinedContext}`
|
|
3160
|
+
: cappedInlinedContext);
|
|
3101
3161
|
emitPromptContextTelemetry("run-uat", contextTelemetry, inlinedContext);
|
|
3102
3162
|
const uatResultPath = join(base, relSliceFile(base, mid, sliceId, "ASSESSMENT"));
|
|
3103
|
-
const uatType = resolveEffectiveUatType(uatContent);
|
|
3104
3163
|
const canonicalPresentation = JSON.stringify(buildRunUatPresentationForType(uatType), null, 2);
|
|
3105
3164
|
return loadPrompt("run-uat", {
|
|
3106
3165
|
workingDirectory: base,
|
|
@@ -3341,18 +3400,18 @@ opts) {
|
|
|
3341
3400
|
}
|
|
3342
3401
|
const inlinedTemplates = inlineTemplate("task-summary", "Task Summary");
|
|
3343
3402
|
trackPromptContext(contextTelemetry, "templates", "inline", inlinedTemplates);
|
|
3344
|
-
const prompt = loadPrompt("reactive-execute", {
|
|
3403
|
+
const prompt = prependContextModeToBlock("reactive-execute", base, loadPrompt("reactive-execute", {
|
|
3345
3404
|
workingDirectory: base,
|
|
3346
3405
|
milestoneId: mid,
|
|
3347
3406
|
milestoneTitle: midTitle,
|
|
3348
3407
|
sliceId: sid,
|
|
3349
3408
|
sliceTitle: sTitle,
|
|
3350
|
-
graphContext
|
|
3409
|
+
graphContext,
|
|
3351
3410
|
readyTaskCount: String(readyTaskIds.length),
|
|
3352
3411
|
readyTaskList: readyTaskListLines.join("\n"),
|
|
3353
3412
|
subagentPrompts: subagentSections.join("\n\n---\n\n"),
|
|
3354
3413
|
inlinedTemplates,
|
|
3355
|
-
});
|
|
3414
|
+
}));
|
|
3356
3415
|
emitPromptContextTelemetry("reactive-execute", contextTelemetry, prompt);
|
|
3357
3416
|
return prompt;
|
|
3358
3417
|
}
|
|
@@ -3492,17 +3551,17 @@ export async function buildGateEvaluatePrompt(mid, midTitle, sid, sTitle, base,
|
|
|
3492
3551
|
"```",
|
|
3493
3552
|
].join("\n"));
|
|
3494
3553
|
}
|
|
3495
|
-
return loadPrompt("gate-evaluate", {
|
|
3554
|
+
return prependContextModeToBlock("gate-evaluate", base, loadPrompt("gate-evaluate", {
|
|
3496
3555
|
workingDirectory: base,
|
|
3497
3556
|
milestoneId: mid,
|
|
3498
3557
|
milestoneTitle: midTitle,
|
|
3499
3558
|
sliceId: sid,
|
|
3500
3559
|
sliceTitle: sTitle,
|
|
3501
|
-
slicePlanContent:
|
|
3560
|
+
slicePlanContent: planContent,
|
|
3502
3561
|
gateCount: String(pending.length),
|
|
3503
3562
|
gateList: gateListLines.join("\n"),
|
|
3504
3563
|
subagentPrompts: subagentSections.join("\n\n---\n\n"),
|
|
3505
|
-
});
|
|
3564
|
+
}));
|
|
3506
3565
|
}
|
|
3507
3566
|
export async function buildRewriteDocsPrompt(mid, midTitle, activeSlice, base, overrides) {
|
|
3508
3567
|
const sid = activeSlice?.id;
|
|
@@ -18,6 +18,7 @@ import { ensureGsdSymlink, isInheritedRepo, validateProjectId } from "./repo-ide
|
|
|
18
18
|
import { migrateToExternalState, recoverFailedMigration } from "./migrate-external.js";
|
|
19
19
|
import { collectSecretsFromManifest } from "../get-secrets-from-user.js";
|
|
20
20
|
import { gsdRoot, resolveMilestoneFile } from "./paths.js";
|
|
21
|
+
import { milestoneEntryBlockedGuidance } from "./guidance.js";
|
|
21
22
|
import { invalidateAllCaches } from "./cache.js";
|
|
22
23
|
import { writeLock, clearLock, readCrashLock, isLockProcessAlive } from "./crash-recovery.js";
|
|
23
24
|
import { acquireSessionLock, releaseSessionLock, updateSessionLock, } from "./session-lock.js";
|
|
@@ -741,12 +742,14 @@ export async function bootstrapAutoSession(s, ctx, pi, base, verboseMode, reques
|
|
|
741
742
|
// phase-specific planning model for a discuss turn (#2829).
|
|
742
743
|
//
|
|
743
744
|
// Precedence:
|
|
744
|
-
// 1) Explicit session override via /gsd model (this session)
|
|
745
|
-
// 2)
|
|
746
|
-
// 3)
|
|
745
|
+
// 1) Explicit session override via /gsd model or /gsd auto --model (this session)
|
|
746
|
+
// 2) GSD model preferences from PREFERENCES.md (validated against live auth)
|
|
747
|
+
// 3) Current session model from settings/session restore (if provider ready)
|
|
747
748
|
//
|
|
748
|
-
//
|
|
749
|
-
//
|
|
749
|
+
// PREFERENCES.md wins over the ambient session default (#3517) so /gsd auto
|
|
750
|
+
// does not stick on claude-code/claude-sonnet-4-6 when the user configured
|
|
751
|
+
// models via /gsd workflow-preferences or PREFERENCES.md. Custom providers
|
|
752
|
+
// still skip PREFERENCES.md entirely (#4122).
|
|
750
753
|
//
|
|
751
754
|
// Exception (#4122): when the session provider is a custom provider declared
|
|
752
755
|
// in ~/.gsd/agent/models.json (Ollama, vLLM, OpenAI-compatible proxy, etc.),
|
|
@@ -758,7 +761,7 @@ export async function bootstrapAutoSession(s, ctx, pi, base, verboseMode, reques
|
|
|
758
761
|
const sessionProviderIsCustom = isCustomProvider(ctx.model?.provider);
|
|
759
762
|
const preferredModel = sessionProviderIsCustom
|
|
760
763
|
? null
|
|
761
|
-
: resolveDefaultSessionModel(ctx.model?.provider);
|
|
764
|
+
: resolveDefaultSessionModel(ctx.model?.provider, base);
|
|
762
765
|
// Validate the preferred model against the live registry + provider auth so
|
|
763
766
|
// an unconfigured PREFERENCES.md entry (no API key / OAuth) can't become the
|
|
764
767
|
// start-model snapshot. Without this, every subsequent unit would try to
|
|
@@ -781,8 +784,8 @@ export async function bootstrapAutoSession(s, ctx, pi, base, verboseMode, reques
|
|
|
781
784
|
: null;
|
|
782
785
|
const startThinkingSnapshot = pi.getThinkingLevel();
|
|
783
786
|
const startModelSnapshot = manualSessionOverride
|
|
784
|
-
?? currentSessionModel
|
|
785
787
|
?? validatedPreferredModel
|
|
788
|
+
?? currentSessionModel
|
|
786
789
|
?? null;
|
|
787
790
|
try {
|
|
788
791
|
// Validate GSD_PROJECT_ID early so the user gets immediate feedback
|
|
@@ -973,9 +976,26 @@ export async function bootstrapAutoSession(s, ctx, pi, base, verboseMode, reques
|
|
|
973
976
|
state = await deriveState(wtPath);
|
|
974
977
|
}
|
|
975
978
|
}
|
|
976
|
-
const
|
|
977
|
-
|
|
978
|
-
|
|
979
|
+
const requestedMilestoneLock = process.env.GSD_MILESTONE_LOCK?.trim() || null;
|
|
980
|
+
const lockedActiveMilestone = requestedMilestoneLock && state.activeMilestone?.id === requestedMilestoneLock;
|
|
981
|
+
let blockingStrandedRecoveryAction;
|
|
982
|
+
if (lockedActiveMilestone) {
|
|
983
|
+
// Parallel worker or explicit `/gsd auto Mxxx`: sibling milestones'
|
|
984
|
+
// stranded work must not block this milestone's resumption, and the
|
|
985
|
+
// downstream `strandedRecoveryAction` (used for currentMilestoneId,
|
|
986
|
+
// setActiveMilestoneId, and adoptStrandedMilestone) must be scoped to
|
|
987
|
+
// the locked milestone only. Falling back to the first sibling action
|
|
988
|
+
// would mis-target adoption (#742).
|
|
989
|
+
const lockMatch = strandedRecoveryActions.find((action) => action.milestoneId === requestedMilestoneLock) ?? null;
|
|
990
|
+
blockingStrandedRecoveryAction = lockMatch;
|
|
991
|
+
strandedRecoveryAction = lockMatch;
|
|
992
|
+
}
|
|
993
|
+
else if (state.activeMilestone) {
|
|
994
|
+
blockingStrandedRecoveryAction = strandedRecoveryActions.find((action) => action.milestoneId !== state.activeMilestone?.id) ?? strandedRecoveryAction;
|
|
995
|
+
}
|
|
996
|
+
else {
|
|
997
|
+
blockingStrandedRecoveryAction = strandedRecoveryAction;
|
|
998
|
+
}
|
|
979
999
|
if (blockingStrandedRecoveryAction) {
|
|
980
1000
|
if (!state.activeMilestone) {
|
|
981
1001
|
ctx.ui.notify(formatStrandedWorkBlockerMessage(blockingStrandedRecoveryAction, null), "error");
|
|
@@ -988,6 +1008,9 @@ export async function bootstrapAutoSession(s, ctx, pi, base, verboseMode, reques
|
|
|
988
1008
|
strandedRecoveryAction = blockingStrandedRecoveryAction;
|
|
989
1009
|
ctx.ui.notify(formatStrandedWorkRecoveryMessage(strandedRecoveryAction), "info");
|
|
990
1010
|
}
|
|
1011
|
+
else if (lockedActiveMilestone) {
|
|
1012
|
+
strandedRecoveryAction = null;
|
|
1013
|
+
}
|
|
991
1014
|
if (process.env.GSD_HEADLESS === "1" &&
|
|
992
1015
|
orphanAuditRecovered &&
|
|
993
1016
|
!state.activeMilestone &&
|
|
@@ -1270,11 +1293,8 @@ export async function bootstrapAutoSession(s, ctx, pi, base, verboseMode, reques
|
|
|
1270
1293
|
if (enterResult.reason === "lease-conflict") {
|
|
1271
1294
|
ctx.ui.notify(`Cannot enter milestone ${s.currentMilestoneId}: lease is held by another worker.`, "error");
|
|
1272
1295
|
}
|
|
1273
|
-
else if (enterResult.reason === "creation-failed") {
|
|
1274
|
-
ctx.ui.notify(
|
|
1275
|
-
}
|
|
1276
|
-
else if (enterResult.reason === "isolation-degraded") {
|
|
1277
|
-
ctx.ui.notify(`Cannot enter milestone ${s.currentMilestoneId}: isolation is degraded from a prior worktree failure. Close processes locking the worktree and retry, or run /gsd doctor fix.`, "error");
|
|
1296
|
+
else if (enterResult.reason === "creation-failed" || enterResult.reason === "isolation-degraded") {
|
|
1297
|
+
ctx.ui.notify(milestoneEntryBlockedGuidance(s.currentMilestoneId, enterResult.reason), "error");
|
|
1278
1298
|
}
|
|
1279
1299
|
else if (enterResult.reason === "invalid-milestone-id") {
|
|
1280
1300
|
ctx.ui.notify(`Cannot enter milestone ${s.currentMilestoneId}: milestone id is invalid.`, "error");
|
|
@@ -36,17 +36,17 @@ export function isSuspiciousGhostCompletion(ctx, startedAt, maxElapsedMs = GHOST
|
|
|
36
36
|
activity.assistantMessages === 0);
|
|
37
37
|
}
|
|
38
38
|
/**
|
|
39
|
-
* Snapshot metrics, save activity log,
|
|
40
|
-
* for a completed unit.
|
|
39
|
+
* Snapshot metrics, save activity log, extract memories, and record the git
|
|
40
|
+
* transaction for a completed auto-mode unit.
|
|
41
41
|
*/
|
|
42
|
-
export async function
|
|
43
|
-
const modelId = ctx.model?.id ?? "unknown";
|
|
44
|
-
snapshotUnitMetrics(ctx, unitType, unitId, startedAt, modelId, opts);
|
|
45
|
-
const activityFile = saveActivityLog(ctx, basePath, unitType, unitId);
|
|
42
|
+
export async function closeoutAutoUnit(request) {
|
|
43
|
+
const modelId = request.ctx.model?.id ?? "unknown";
|
|
44
|
+
snapshotUnitMetrics(request.ctx, request.unitType, request.unitId, request.startedAt, modelId, request.opts);
|
|
45
|
+
const activityFile = saveActivityLog(request.ctx, request.basePath, request.unitType, request.unitId);
|
|
46
46
|
if (activityFile) {
|
|
47
47
|
try {
|
|
48
|
-
const { buildMemoryLLMCall, extractMemoriesFromUnit } = await import(
|
|
49
|
-
const llmCallFn = buildMemoryLLMCall(ctx);
|
|
48
|
+
const { buildMemoryLLMCall, extractMemoriesFromUnit } = await import("./memory-extractor.js");
|
|
49
|
+
const llmCallFn = buildMemoryLLMCall(request.ctx);
|
|
50
50
|
if (llmCallFn) {
|
|
51
51
|
// Awaited: a fire-and-forget here lets memory-extractor writes land in
|
|
52
52
|
// .gsd/ after closeoutUnit returns but before the milestone merge
|
|
@@ -55,10 +55,10 @@ export async function closeoutUnit(ctx, basePath, unitType, unitId, startedAt, o
|
|
|
55
55
|
// bounded by the extractor's LLM call, which is the acceptable price
|
|
56
56
|
// for not racing the merge boundary.
|
|
57
57
|
try {
|
|
58
|
-
await extractMemoriesFromUnit(activityFile, unitType, unitId, llmCallFn);
|
|
58
|
+
await extractMemoriesFromUnit(activityFile, request.unitType, request.unitId, llmCallFn);
|
|
59
59
|
}
|
|
60
60
|
catch (err) {
|
|
61
|
-
logWarning("engine", `memory extraction failed for ${unitType}/${unitId}: ${err.message}`);
|
|
61
|
+
logWarning("engine", `memory extraction failed for ${request.unitType}/${request.unitId}: ${err.message}`);
|
|
62
62
|
}
|
|
63
63
|
}
|
|
64
64
|
}
|
|
@@ -66,22 +66,46 @@ export async function closeoutUnit(ctx, basePath, unitType, unitId, startedAt, o
|
|
|
66
66
|
logWarning("engine", `operation failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
67
67
|
}
|
|
68
68
|
}
|
|
69
|
-
|
|
69
|
+
const gitTransaction = resolveGitTransactionOptions(request.opts);
|
|
70
|
+
if (gitTransaction) {
|
|
70
71
|
writeTurnGitTransaction({
|
|
71
|
-
basePath,
|
|
72
|
-
traceId:
|
|
73
|
-
turnId:
|
|
74
|
-
unitType,
|
|
75
|
-
unitId,
|
|
72
|
+
basePath: request.basePath,
|
|
73
|
+
traceId: gitTransaction.traceId,
|
|
74
|
+
turnId: gitTransaction.turnId,
|
|
75
|
+
unitType: request.unitType,
|
|
76
|
+
unitId: request.unitId,
|
|
76
77
|
stage: "record",
|
|
77
|
-
action:
|
|
78
|
-
push:
|
|
79
|
-
status:
|
|
80
|
-
error:
|
|
78
|
+
action: gitTransaction.gitAction,
|
|
79
|
+
push: gitTransaction.gitPush === true,
|
|
80
|
+
status: gitTransaction.gitStatus,
|
|
81
|
+
error: gitTransaction.gitError,
|
|
81
82
|
metadata: {
|
|
82
83
|
activityFile,
|
|
83
84
|
},
|
|
84
85
|
});
|
|
85
86
|
}
|
|
86
|
-
return
|
|
87
|
+
return {
|
|
88
|
+
...(activityFile ? { activityFile } : {}),
|
|
89
|
+
gitTransactionRecorded: Boolean(gitTransaction),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
function resolveGitTransactionOptions(opts) {
|
|
93
|
+
if (!opts?.traceId || !opts.turnId || !opts.gitAction || !opts.gitStatus)
|
|
94
|
+
return null;
|
|
95
|
+
return {
|
|
96
|
+
traceId: opts.traceId,
|
|
97
|
+
turnId: opts.turnId,
|
|
98
|
+
gitAction: opts.gitAction,
|
|
99
|
+
gitStatus: opts.gitStatus,
|
|
100
|
+
gitPush: opts.gitPush,
|
|
101
|
+
gitError: opts.gitError,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Compatibility wrapper for existing auto-loop callers. New code should prefer
|
|
106
|
+
* closeoutAutoUnit so the closeout request and result stay explicit.
|
|
107
|
+
*/
|
|
108
|
+
export async function closeoutUnit(ctx, basePath, unitType, unitId, startedAt, opts) {
|
|
109
|
+
const result = await closeoutAutoUnit({ ctx, basePath, unitType, unitId, startedAt, opts });
|
|
110
|
+
return result.activityFile;
|
|
87
111
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { parseUnitId } from "./unit-id.js";
|
|
2
2
|
import { AUTO_UNIT_SCOPED_TOOLS, getForbiddenGsdToolReason, } from "./unit-tool-contracts.js";
|
|
3
|
-
import { WORKFLOW_TOOL_ALIAS_PAIRS,
|
|
3
|
+
import { WORKFLOW_TOOL_ALIAS_PAIRS, isWorkflowSurfaceAliasTool, stripMcpToolPrefix, } from "./workflow-tool-surface.js";
|
|
4
|
+
import { canonicalWorkflowToolName } from "./engine-hook-contract.js";
|
|
4
5
|
export { AUTO_UNIT_SCOPED_TOOLS, RUN_UAT_BROWSER_TOOL_NAMES, } from "./unit-tool-contracts.js";
|
|
5
6
|
// Scope-class membership is declared per unit in the Unit Registry (ADR-033).
|
|
6
7
|
// EXECUTE_TASK_UNIT_TYPES = scopeClass "execute-task"; the section-close gate
|
|
@@ -22,9 +23,9 @@ const SCOPED_GSD_LIFECYCLE_TOOLS = new Set([
|
|
|
22
23
|
.map(canonicalWorkflowToolName));
|
|
23
24
|
export const GSD_PHASE_SCOPE_DISPLAY_REASON = "This GSD phase only allows its scoped workflow tools.";
|
|
24
25
|
export const GSD_SECTION_CLOSE_GATE_DISPLAY_REASON = "Gates here close by writing summary sections — gsd_save_gate_result isn't needed.";
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
}
|
|
26
|
+
// Normalizer seam lives in engine-hook-contract.ts; re-exported here for
|
|
27
|
+
// existing scope importers.
|
|
28
|
+
export { canonicalWorkflowToolName };
|
|
28
29
|
export function isWorkflowAliasTool(toolName) {
|
|
29
30
|
return isWorkflowSurfaceAliasTool(toolName);
|
|
30
31
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Project/App: gsd-pi
|
|
2
2
|
// File Purpose: Post-unit verification gate for GSD auto-mode units.
|
|
3
3
|
import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from "node:fs";
|
|
4
|
-
import { gsdProjectionRoot, resolveSlicePath
|
|
4
|
+
import { gsdProjectionRoot, resolveSlicePath } from "./paths.js";
|
|
5
5
|
import { resolveMilestoneValidationVerdict } from "./milestone-validation-verdict.js";
|
|
6
6
|
import { resolveCanonicalMilestoneRoot } from "./worktree-manager.js";
|
|
7
7
|
import { parseUnitId } from "./unit-id.js";
|
|
@@ -9,8 +9,6 @@ import { isDbAvailable, getTask, getSliceTasks, getMilestoneSlices } from "./gsd
|
|
|
9
9
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
10
10
|
import { isClosedStatus } from "./status-guards.js";
|
|
11
11
|
import { loadFile } from "./files.js";
|
|
12
|
-
import { parseRoadmap } from "./parsers-legacy.js";
|
|
13
|
-
import { isMilestoneComplete } from "./state.js";
|
|
14
12
|
import { runVerificationGate, runVerificationGateForTargets, formatFailureContext, captureRuntimeErrors, runDependencyAudit, } from "./verification-gate.js";
|
|
15
13
|
import { writeVerificationJSON } from "./verification-evidence.js";
|
|
16
14
|
import { logWarning } from "./workflow-logger.js";
|
|
@@ -25,6 +23,7 @@ import { getSlice } from "./gsd-db.js";
|
|
|
25
23
|
import { getLedger } from "./metrics.js";
|
|
26
24
|
import { getUnitCostSpikeAction, resolveUnitCostSpikeMultiplier } from "./auto-budget.js";
|
|
27
25
|
import { formatPostUnitStatusCard } from "./auto-status-message.js";
|
|
26
|
+
import { detectWebApp } from "./web-app-uat.js";
|
|
28
27
|
function getCurrentUnitCostStats(unitId) {
|
|
29
28
|
const ledger = getLedger();
|
|
30
29
|
if (!ledger || !Array.isArray(ledger.units) || ledger.units.length === 0) {
|
|
@@ -274,32 +273,15 @@ async function runValidateMilestonePostCheck(vctx, pauseAuto) {
|
|
|
274
273
|
* DB-backed projects are authoritative (#4094 peer review); falls back to
|
|
275
274
|
* roadmap parsing only when the DB is unavailable.
|
|
276
275
|
*/
|
|
277
|
-
async function countIncompleteSlices(
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
// No DB rows — treat as "unknown", do not pause.
|
|
282
|
-
return 1;
|
|
283
|
-
}
|
|
284
|
-
return slices.filter((slice) => !isClosedStatus(slice.status)).length;
|
|
285
|
-
}
|
|
286
|
-
// Filesystem fallback: parse the roadmap markdown.
|
|
287
|
-
try {
|
|
288
|
-
const roadmapFile = resolveMilestoneFile(basePath, milestoneId, "ROADMAP");
|
|
289
|
-
if (!roadmapFile)
|
|
290
|
-
return 1;
|
|
291
|
-
const roadmapContent = await loadFile(roadmapFile);
|
|
292
|
-
if (!roadmapContent)
|
|
293
|
-
return 1;
|
|
294
|
-
const roadmap = parseRoadmap(roadmapContent);
|
|
295
|
-
if (roadmap.slices.length === 0)
|
|
296
|
-
return 1;
|
|
297
|
-
return isMilestoneComplete(roadmap) ? 0 : 1;
|
|
298
|
-
}
|
|
299
|
-
catch {
|
|
300
|
-
// Parsing failures should not cause false-positive pauses.
|
|
276
|
+
async function countIncompleteSlices(_basePath, milestoneId) {
|
|
277
|
+
// DB-authoritative (ADR-017): no markdown fallback. DB unavailable or no
|
|
278
|
+
// rows means "unknown" — do not pause.
|
|
279
|
+
if (!isDbAvailable())
|
|
301
280
|
return 1;
|
|
302
|
-
|
|
281
|
+
const slices = getMilestoneSlices(milestoneId);
|
|
282
|
+
if (slices.length === 0)
|
|
283
|
+
return 1;
|
|
284
|
+
return slices.filter((slice) => !isClosedStatus(slice.status)).length;
|
|
303
285
|
}
|
|
304
286
|
/**
|
|
305
287
|
* Run the verification gate for the current execute-task unit.
|
|
@@ -636,14 +618,25 @@ export async function runPostUnitVerification(vctx, pauseAuto) {
|
|
|
636
618
|
s.pendingVerificationRetry = null;
|
|
637
619
|
return "continue";
|
|
638
620
|
}
|
|
621
|
+
else if (verdict.reason === "no-host-checks" &&
|
|
622
|
+
taskAlreadyComplete &&
|
|
623
|
+
detectWebApp(s.basePath) &&
|
|
624
|
+
!result.runtimeErrors?.some((e) => e.blocking)) {
|
|
625
|
+
s.verificationRetryCount.delete(retryKey);
|
|
626
|
+
s.verificationRetryFailureHashes.delete(retryKey);
|
|
627
|
+
s.pendingVerificationRetry = null;
|
|
628
|
+
ctx.ui.notify("No task-level host verification command was found for a completed browser-facing task; continuing so slice UAT can verify the UI with browser tools.", "warning");
|
|
629
|
+
return "continue";
|
|
630
|
+
}
|
|
639
631
|
else if (verdict.reason === "no-host-checks") {
|
|
640
632
|
s.verificationRetryCount.delete(retryKey);
|
|
641
633
|
s.verificationRetryFailureHashes.delete(retryKey);
|
|
642
634
|
s.pendingVerificationRetry = null;
|
|
643
|
-
|
|
635
|
+
const pauseMessage = `Verification failed: ${verdict.failureContext}`;
|
|
636
|
+
ctx.ui.notify(`Verification gate FAILED — ${verdict.failureContext}`, "error");
|
|
644
637
|
process.stderr.write(`verification-gate: ${verdict.failureContext}\n`);
|
|
645
638
|
await pauseAuto(ctx, pi, {
|
|
646
|
-
message:
|
|
639
|
+
message: pauseMessage,
|
|
647
640
|
category: "unknown",
|
|
648
641
|
});
|
|
649
642
|
return "pause";
|
|
@@ -800,6 +800,14 @@ function _resolveIntegrationBranchForReuse(basePath, milestoneId) {
|
|
|
800
800
|
return null;
|
|
801
801
|
}
|
|
802
802
|
}
|
|
803
|
+
function safeCwd(fallback) {
|
|
804
|
+
try {
|
|
805
|
+
return process.cwd();
|
|
806
|
+
}
|
|
807
|
+
catch {
|
|
808
|
+
return fallback;
|
|
809
|
+
}
|
|
810
|
+
}
|
|
803
811
|
/**
|
|
804
812
|
* When reusing an existing milestone branch, fast-forward it onto the
|
|
805
813
|
* integration branch when that's safe (branch is a strict ancestor of
|
|
@@ -949,7 +957,7 @@ export function teardownAutoWorktree(originalBasePath, milestoneId, opts = {}) {
|
|
|
949
957
|
originalBasePath = resolveWorktreeProjectRoot(originalBasePath);
|
|
950
958
|
const branch = autoWorktreeBranch(milestoneId);
|
|
951
959
|
const { preserveBranch = false, preserveWorktree = false } = opts;
|
|
952
|
-
const previousCwd =
|
|
960
|
+
const previousCwd = safeCwd(originalBasePath);
|
|
953
961
|
// Wrap the entire teardown body in a single try/finally so activeWorkspace
|
|
954
962
|
// is ALWAYS cleared — even if process.chdir throws (e.g. originalBasePath
|
|
955
963
|
// was deleted before teardown ran). Previously the finally only covered
|
|
@@ -1033,7 +1041,7 @@ export function teardownAutoWorktree(originalBasePath, milestoneId, opts = {}) {
|
|
|
1033
1041
|
* still works after process restart when module state has been reset.
|
|
1034
1042
|
*/
|
|
1035
1043
|
export function isInAutoWorktree(basePath) {
|
|
1036
|
-
const targetPath = isGsdWorktreePath(basePath) ? basePath :
|
|
1044
|
+
const targetPath = isGsdWorktreePath(basePath) ? basePath : safeCwd("");
|
|
1037
1045
|
if (!isGsdWorktreePath(targetPath))
|
|
1038
1046
|
return false;
|
|
1039
1047
|
const storedBase = getAutoWorktreeOriginalBase();
|
|
@@ -1901,6 +1909,11 @@ export function mergeMilestoneToMain(originalBasePath_, milestoneId, roadmapCont
|
|
|
1901
1909
|
}
|
|
1902
1910
|
catch (err) {
|
|
1903
1911
|
logWarning("worktree", `chdir to project root after merge failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1912
|
+
debugLog("mergeMilestoneToMain", {
|
|
1913
|
+
phase: "post-merge-chdir-failed",
|
|
1914
|
+
target: originalBasePath_,
|
|
1915
|
+
error: err instanceof Error ? err.message : String(err),
|
|
1916
|
+
});
|
|
1904
1917
|
}
|
|
1905
1918
|
};
|
|
1906
1919
|
let shouldCleanup = false;
|
|
@@ -557,6 +557,13 @@ export function getAutoModeStartModel() {
|
|
|
557
557
|
export function setCurrentDispatchedModelId(model) {
|
|
558
558
|
s.currentDispatchedModelId = model ? `${model.provider}/${model.id}` : null;
|
|
559
559
|
}
|
|
560
|
+
/**
|
|
561
|
+
* Update the active unit model after runtime recovery switches models mid-unit.
|
|
562
|
+
* The next session restore path reads this field before dispatching again.
|
|
563
|
+
*/
|
|
564
|
+
export function setCurrentUnitModelForRecovery(model) {
|
|
565
|
+
s.currentUnitModel = model;
|
|
566
|
+
}
|
|
560
567
|
// Tool tracking — delegates to auto-tool-tracking.ts
|
|
561
568
|
export function markToolStart(toolCallId, toolName) {
|
|
562
569
|
_markToolStart(toolCallId, s.active, toolName);
|
|
@@ -623,6 +630,35 @@ export function stopAutoRemote(projectRoot) {
|
|
|
623
630
|
return { found: false, error: err.message };
|
|
624
631
|
}
|
|
625
632
|
}
|
|
633
|
+
/**
|
|
634
|
+
* Force-stop a remote auto-mode session before stealing its lock.
|
|
635
|
+
* The normal stop path stays SIGTERM-only so cooperative sessions can clean up;
|
|
636
|
+
* this path is only for the explicit "Force start" action.
|
|
637
|
+
*/
|
|
638
|
+
export function forceStopAutoRemote(projectRoot) {
|
|
639
|
+
const lock = readCrashLock(projectRoot);
|
|
640
|
+
if (!lock)
|
|
641
|
+
return { found: false };
|
|
642
|
+
if (lock.pid === process.pid) {
|
|
643
|
+
clearLock(projectRoot);
|
|
644
|
+
return { found: false };
|
|
645
|
+
}
|
|
646
|
+
if (!isLockProcessAlive(lock)) {
|
|
647
|
+
clearLock(projectRoot);
|
|
648
|
+
return { found: false };
|
|
649
|
+
}
|
|
650
|
+
try {
|
|
651
|
+
process.kill(lock.pid, "SIGTERM");
|
|
652
|
+
if (isLockProcessAlive(lock)) {
|
|
653
|
+
process.kill(lock.pid, "SIGKILL");
|
|
654
|
+
}
|
|
655
|
+
clearLock(projectRoot);
|
|
656
|
+
return { found: true, pid: lock.pid };
|
|
657
|
+
}
|
|
658
|
+
catch (err) {
|
|
659
|
+
return { found: false, error: err.message };
|
|
660
|
+
}
|
|
661
|
+
}
|
|
626
662
|
/**
|
|
627
663
|
* Check if a remote auto-mode session is running (from a different process).
|
|
628
664
|
* Reads the crash lock, checks PID liveness, and returns session details.
|
|
@@ -715,6 +751,9 @@ function pauseAutoUnitIdentityMatches(expected) {
|
|
|
715
751
|
s.currentUnit.id === expected.id &&
|
|
716
752
|
s.currentUnit.startedAt === expected.startedAt;
|
|
717
753
|
}
|
|
754
|
+
function shouldPreserveCoordinationForPause(errorContext) {
|
|
755
|
+
return errorContext?.category === "provider" && errorContext.isTransient === true;
|
|
756
|
+
}
|
|
718
757
|
function setLifecycleOutcome(ctx, input) {
|
|
719
758
|
if (!ctx?.hasUI)
|
|
720
759
|
return;
|
|
@@ -1549,7 +1588,7 @@ export async function pauseAuto(ctx, _pi, _errorContext, options = {}) {
|
|
|
1549
1588
|
releaseSessionLock(lockBase());
|
|
1550
1589
|
clearLock(lockBase());
|
|
1551
1590
|
}
|
|
1552
|
-
if (s.workerId) {
|
|
1591
|
+
if (s.workerId && !shouldPreserveCoordinationForPause(_errorContext)) {
|
|
1553
1592
|
try {
|
|
1554
1593
|
if (s.currentMilestoneId && s.milestoneLeaseToken) {
|
|
1555
1594
|
releaseMilestoneLease(s.workerId, s.currentMilestoneId, s.milestoneLeaseToken);
|
|
@@ -1824,7 +1863,7 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
|
|
|
1824
1863
|
if (freshStartAssessment.classification === "running") {
|
|
1825
1864
|
const pid = freshStartAssessment.lock?.pid;
|
|
1826
1865
|
ctx.ui.notify(pid
|
|
1827
|
-
? `Another auto-mode session (PID ${pid}) appears to be running.\
|
|
1866
|
+
? `Another auto-mode session (PID ${pid}) appears to be running.\nRun \`/gsd stop\` for graceful shutdown, or choose "Force start" from \`/gsd auto\` to terminate it.`
|
|
1828
1867
|
: "Another auto-mode session appears to be running.", "error");
|
|
1829
1868
|
return;
|
|
1830
1869
|
}
|