@opengsd/gsd-pi 1.1.1-dev.b2556262 → 1.2.0-dev.0b870afa
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-web-branch.d.ts +2 -0
- package/dist/cli-web-branch.js +9 -2
- package/dist/cli.js +1 -1
- package/dist/headless-events.d.ts +4 -2
- package/dist/headless-events.js +14 -34
- package/dist/help-text.js +5 -0
- package/dist/mcp-server.js +2 -1
- package/dist/models-resolver.d.ts +3 -13
- package/dist/models-resolver.js +3 -22
- package/dist/project-sessions.js +4 -2
- package/dist/resource-loader.js +2 -14
- 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 +78 -23
- 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 +5 -2
- 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/models.js +9 -0
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +139 -243
- package/dist/resources/extensions/claude-code-cli/turn-assembler.js +224 -0
- package/dist/resources/extensions/github-sync/templates.js +3 -3
- package/dist/resources/extensions/gsd/artifact-projection.js +14 -0
- package/dist/resources/extensions/gsd/auto/contracts.js +8 -1
- 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 +77 -56
- package/dist/resources/extensions/gsd/auto/orchestrator.js +860 -96
- package/dist/resources/extensions/gsd/auto/phases.js +81 -8
- package/dist/resources/extensions/gsd/auto/run-unit.js +2 -1
- package/dist/resources/extensions/gsd/auto/session.js +6 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +16 -4
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
- package/dist/resources/extensions/gsd/auto-dispatch.js +56 -63
- package/dist/resources/extensions/gsd/auto-model-selection.js +44 -13
- package/dist/resources/extensions/gsd/auto-post-unit.js +47 -17
- package/dist/resources/extensions/gsd/auto-prompts.js +271 -27
- package/dist/resources/extensions/gsd/auto-recovery.js +48 -49
- package/dist/resources/extensions/gsd/auto-runtime-state.js +17 -0
- package/dist/resources/extensions/gsd/auto-start.js +36 -49
- package/dist/resources/extensions/gsd/auto-timers.js +16 -2
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +55 -0
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +33 -37
- package/dist/resources/extensions/gsd/auto-verification.js +30 -37
- package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +67 -375
- package/dist/resources/extensions/gsd/auto.js +112 -486
- 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/db-tools.js +28 -37
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +43 -49
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +319 -161
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +365 -58
- 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 +5 -15
- package/dist/resources/extensions/gsd/closeout-consistency-gate.js +21 -4
- package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
- package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
- package/dist/resources/extensions/gsd/codebase-generator.js +8 -4
- package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
- package/dist/resources/extensions/gsd/commands/context.js +16 -2
- package/dist/resources/extensions/gsd/commands/handlers/auto.js +3 -0
- package/dist/resources/extensions/gsd/commands-handlers.js +66 -3
- package/dist/resources/extensions/gsd/commands-inspect.js +4 -8
- package/dist/resources/extensions/gsd/commands-maintenance.js +61 -41
- package/dist/resources/extensions/gsd/commands-ship.js +2 -2
- package/dist/resources/extensions/gsd/commands-verdict.js +12 -2
- package/dist/resources/extensions/gsd/consent-question.js +353 -0
- package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
- package/dist/resources/extensions/gsd/constants.js +0 -2
- package/dist/resources/extensions/gsd/crash-recovery.js +12 -15
- package/dist/resources/extensions/gsd/db/engine.js +755 -0
- package/dist/resources/extensions/gsd/db/queries.js +398 -0
- package/dist/resources/extensions/gsd/db/sql-constants.js +11 -0
- package/dist/resources/extensions/gsd/db/writers/cascades.js +194 -0
- package/dist/resources/extensions/gsd/db/writers/import-restore.js +182 -0
- package/dist/resources/extensions/gsd/db/writers/memory.js +149 -0
- package/dist/resources/extensions/gsd/db/writers/reconcile.js +458 -0
- package/dist/resources/extensions/gsd/db/writers/status.js +70 -0
- package/dist/resources/extensions/gsd/db-workspace.js +103 -0
- package/dist/resources/extensions/gsd/debug-logger.js +10 -0
- package/dist/resources/extensions/gsd/delegation-policy.js +2 -10
- package/dist/resources/extensions/gsd/discussion-handoff.js +218 -0
- package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -0
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
- package/dist/resources/extensions/gsd/doctor-environment.js +5 -11
- package/dist/resources/extensions/gsd/doctor-format.js +9 -6
- package/dist/resources/extensions/gsd/doctor-git-checks.js +6 -21
- package/dist/resources/extensions/gsd/doctor-proactive.js +7 -2
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -16
- package/dist/resources/extensions/gsd/doctor.js +16 -9
- package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
- package/dist/resources/extensions/gsd/error-classifier.js +10 -1
- package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
- package/dist/resources/extensions/gsd/files.js +33 -19
- package/dist/resources/extensions/gsd/git-conflict-state.js +16 -1
- package/dist/resources/extensions/gsd/git-service.js +1 -0
- package/dist/resources/extensions/gsd/gitignore.js +3 -0
- package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
- package/dist/resources/extensions/gsd/gsd-db.js +184 -2048
- package/dist/resources/extensions/gsd/guidance.js +158 -0
- package/dist/resources/extensions/gsd/guided-flow.js +91 -476
- package/dist/resources/extensions/gsd/guided-unit-completion.js +225 -0
- package/dist/resources/extensions/gsd/markdown-renderer.js +43 -33
- package/dist/resources/extensions/gsd/mcp-filter.js +10 -20
- package/dist/resources/extensions/gsd/mcp-tool-name.js +18 -0
- package/dist/resources/extensions/gsd/md-importer.js +4 -3
- package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
- package/dist/resources/extensions/gsd/migrate/safety.js +22 -11
- package/dist/resources/extensions/gsd/migration-auto-check.js +27 -5
- package/dist/resources/extensions/gsd/milestone-closeout-proof.js +72 -0
- package/dist/resources/extensions/gsd/milestone-closeout.js +97 -28
- package/dist/resources/extensions/gsd/milestone-merge-transaction.js +10 -0
- package/dist/resources/extensions/gsd/milestone-planning-persistence.js +156 -0
- package/dist/resources/extensions/gsd/milestone-readiness.js +77 -0
- package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
- package/dist/resources/extensions/gsd/milestone-settlement.js +50 -0
- package/dist/resources/extensions/gsd/milestone-validation-evidence.js +73 -0
- package/dist/resources/extensions/gsd/milestone-validation-verdict.js +57 -0
- package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
- package/dist/resources/extensions/gsd/model-router.js +3 -0
- package/dist/resources/extensions/gsd/native-git-bridge.js +45 -0
- package/dist/resources/extensions/gsd/notification-store.js +11 -4
- package/dist/resources/extensions/gsd/parallel-eligibility.js +3 -6
- package/dist/resources/extensions/gsd/parallel-merge.js +14 -11
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +11 -7
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -2
- package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
- package/dist/resources/extensions/gsd/paths.js +37 -24
- package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
- package/dist/resources/extensions/gsd/preferences-diagnostics.js +67 -0
- package/dist/resources/extensions/gsd/preferences-models.js +14 -48
- package/dist/resources/extensions/gsd/preferences.js +161 -29
- package/dist/resources/extensions/gsd/projection-flush.js +7 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +4 -3
- package/dist/resources/extensions/gsd/prompts/discuss.md +6 -7
- package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -1
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +5 -7
- package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +6 -6
- package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +1 -2
- package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +5 -6
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -3
- 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 +3 -2
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/research-milestone.md +3 -3
- 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 +6 -3
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +6 -4
- package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
- package/dist/resources/extensions/gsd/provider-payload-policy.js +83 -0
- 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/pull-request-process.js +13 -0
- package/dist/resources/extensions/gsd/quality-gate-closure.js +109 -0
- package/dist/resources/extensions/gsd/question-transport.js +86 -0
- package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
- package/dist/resources/extensions/gsd/recovery-classification.js +41 -87
- package/dist/resources/extensions/gsd/roadmap-slices.js +33 -5
- package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +37 -4
- package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +7 -2
- package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -0
- package/dist/resources/extensions/gsd/schemas/parsers.js +6 -1
- package/dist/resources/extensions/gsd/session-lock.js +1 -1
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +3 -2
- package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +21 -1
- package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
- package/dist/resources/extensions/gsd/state.js +19 -25
- package/dist/resources/extensions/gsd/status-guards.js +56 -8
- package/dist/resources/extensions/gsd/stop-notice.js +57 -0
- package/dist/resources/extensions/gsd/templates/plan.md +7 -0
- package/dist/resources/extensions/gsd/templates/project.md +1 -0
- package/dist/resources/extensions/gsd/templates/roadmap.md +1 -1
- package/dist/resources/extensions/gsd/templates/uat.md +5 -1
- package/dist/resources/extensions/gsd/tool-contract.js +66 -11
- package/dist/resources/extensions/gsd/tool-presentation-plan.js +17 -36
- package/dist/resources/extensions/gsd/tool-surface-readiness.js +56 -0
- package/dist/resources/extensions/gsd/tool-surface-snapshot.js +17 -0
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
- package/dist/resources/extensions/gsd/tools/complete-slice.js +46 -55
- package/dist/resources/extensions/gsd/tools/complete-task.js +3 -2
- package/dist/resources/extensions/gsd/tools/exec-tool.js +10 -8
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +15 -143
- 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 +41 -2
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +13 -31
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +16 -35
- 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/skip-slice.js +18 -36
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +15 -78
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +236 -22
- package/dist/resources/extensions/gsd/uat-policy.js +57 -25
- package/dist/resources/extensions/gsd/uat-run.js +9 -14
- package/dist/resources/extensions/gsd/undo.js +8 -7
- package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
- package/dist/resources/extensions/gsd/unit-context-composer.js +114 -21
- 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-runtime.js +3 -2
- package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -181
- package/dist/resources/extensions/gsd/validation-block-guard.js +2 -0
- 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 +117 -0
- 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.js +15 -102
- package/dist/resources/extensions/gsd/workflow-reconcile.js +25 -59
- package/dist/resources/extensions/gsd/workflow-tool-surface.js +46 -0
- package/dist/resources/extensions/gsd/workspace-git-guard.js +2 -0
- package/dist/resources/extensions/gsd/worktree-git-recovery.js +293 -0
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +12 -3
- package/dist/resources/extensions/gsd/worktree-manager.js +45 -28
- package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
- package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
- package/dist/resources/extensions/gsd/worktree-root.js +28 -6
- package/dist/resources/extensions/gsd/worktree-safety.js +8 -5
- package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
- package/dist/resources/extensions/gsd/worktree-state-projection.js +33 -4
- package/dist/resources/extensions/gsd/worktree-telemetry.js +12 -0
- 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/extensions/shared/interview-ui.js +2 -2
- package/dist/resources/shared/claude-runtime-floor.js +182 -0
- 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/references/executable-code.md +1 -1
- 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/gsd-browser/SKILL.md +1 -1
- package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
- package/dist/tsconfig.extensions.tsbuildinfo +1 -0
- package/dist/update-check.d.ts +2 -0
- package/dist/update-check.js +24 -1
- package/dist/update-cmd.js +40 -3
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +5 -5
- 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 +8 -8
- 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/boot/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +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/api/visualizer/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 +5 -5
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -0
- package/dist/web/standalone/.next/server/chunks/5942.js +2 -0
- package/dist/web/standalone/.next/server/chunks/8357.js +3 -3
- 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/2659.b7b129ee6a769448.js +1 -0
- package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{3616.4113d484a994e411.js → 3616.3c60753b8ffcbd2e.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/4283.e4873b058df143a1.js +2 -0
- package/dist/web/standalone/.next/static/chunks/5826.a46ecdd1cfe8dabc.js +1 -0
- package/dist/web/standalone/.next/static/chunks/796.e0bdc932325d7e03.js +10 -0
- package/dist/web/standalone/.next/static/chunks/8785.2e5a118797fb2dd2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-dda80a1ef5587410.js → webpack-f0285ce91d4ec9ef.js} +1 -1
- package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
- package/dist/web/standalone/node_modules/postcss/lib/container.js +26 -18
- package/dist/web/standalone/node_modules/postcss/lib/css-syntax-error.js +47 -14
- package/dist/web/standalone/node_modules/postcss/lib/declaration.js +4 -4
- package/dist/web/standalone/node_modules/postcss/lib/fromJSON.js +3 -3
- package/dist/web/standalone/node_modules/postcss/lib/input.js +54 -29
- package/dist/web/standalone/node_modules/postcss/lib/lazy-result.js +47 -37
- package/dist/web/standalone/node_modules/postcss/lib/map-generator.js +26 -9
- package/dist/web/standalone/node_modules/postcss/lib/no-work-result.js +57 -55
- package/dist/web/standalone/node_modules/postcss/lib/node.js +99 -31
- package/dist/web/standalone/node_modules/postcss/lib/parse.js +1 -1
- package/dist/web/standalone/node_modules/postcss/lib/parser.js +10 -9
- package/dist/web/standalone/node_modules/postcss/lib/postcss.js +12 -12
- package/dist/web/standalone/node_modules/postcss/lib/previous-map.js +30 -11
- package/dist/web/standalone/node_modules/postcss/lib/processor.js +7 -7
- package/dist/web/standalone/node_modules/postcss/lib/result.js +5 -5
- package/dist/web/standalone/node_modules/postcss/lib/rule.js +6 -6
- package/dist/web/standalone/node_modules/postcss/lib/stringifier.js +69 -28
- package/dist/web/standalone/node_modules/postcss/lib/tokenize.js +6 -2
- package/dist/web/standalone/node_modules/postcss/package.json +48 -48
- package/dist/web/standalone/package.json +1 -1
- package/dist/web-mode.d.ts +2 -0
- package/dist/web-mode.js +20 -8
- package/dist/worktree-cli.js +3 -6
- package/dist/worktree-status-banner.js +7 -11
- package/package.json +17 -11
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/dist/rpc.d.ts +1 -0
- package/packages/contracts/dist/rpc.d.ts.map +1 -1
- package/packages/contracts/dist/rpc.js.map +1 -1
- package/packages/contracts/dist/workflow.d.ts +4 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js.map +1 -1
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts +2 -0
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.js +14 -0
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.js.map +1 -1
- 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 +8 -0
- 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.js +1 -1
- 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 +113 -40
- 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-extension-widgets.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js +6 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.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 +10 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +12 -0
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +49 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +147 -60
- 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/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 +183 -110
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +205 -158
- 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 +29 -15
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.js +3 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.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/components/input.js +1 -1
- package/packages/pi-tui/dist/components/input.js.map +1 -1
- package/packages/pi-tui/dist/keys.d.ts.map +1 -1
- package/packages/pi-tui/dist/keys.js +39 -30
- package/packages/pi-tui/dist/keys.js.map +1 -1
- package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
- package/packages/pi-tui/dist/stdin-buffer.js +22 -0
- package/packages/pi-tui/dist/stdin-buffer.js.map +1 -1
- 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/scripts/install/deps.js +10 -0
- package/scripts/link-workspace-packages.cjs +7 -40
- package/src/resources/GSD-WORKFLOW.md +5 -4
- package/src/resources/extensions/ask-user-questions.ts +87 -24
- 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 +5 -2
- 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/models.ts +9 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +166 -293
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +270 -2
- package/src/resources/extensions/claude-code-cli/turn-assembler.ts +287 -0
- package/src/resources/extensions/github-sync/templates.ts +3 -3
- package/src/resources/extensions/github-sync/tests/templates.test.ts +2 -2
- package/src/resources/extensions/gsd/artifact-projection.ts +31 -0
- package/src/resources/extensions/gsd/auto/contracts.ts +40 -121
- 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-deps.ts +3 -1
- package/src/resources/extensions/gsd/auto/loop.ts +86 -61
- package/src/resources/extensions/gsd/auto/orchestrator.ts +1023 -98
- package/src/resources/extensions/gsd/auto/phases.ts +108 -28
- package/src/resources/extensions/gsd/auto/run-unit.ts +2 -1
- package/src/resources/extensions/gsd/auto/session.ts +7 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +18 -4
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
- package/src/resources/extensions/gsd/auto-dispatch.ts +68 -68
- package/src/resources/extensions/gsd/auto-model-selection.ts +49 -12
- package/src/resources/extensions/gsd/auto-post-unit.ts +56 -16
- package/src/resources/extensions/gsd/auto-prompts.ts +338 -44
- package/src/resources/extensions/gsd/auto-recovery.ts +50 -50
- package/src/resources/extensions/gsd/auto-runtime-state.ts +30 -0
- package/src/resources/extensions/gsd/auto-start.ts +41 -49
- package/src/resources/extensions/gsd/auto-timers.ts +16 -2
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +59 -0
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +43 -38
- package/src/resources/extensions/gsd/auto-verification.ts +33 -36
- package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
- package/src/resources/extensions/gsd/auto-worktree.ts +83 -391
- package/src/resources/extensions/gsd/auto.ts +151 -524
- 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/db-tools.ts +29 -37
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +43 -49
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +379 -177
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +452 -58
- 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 +5 -16
- package/src/resources/extensions/gsd/closeout-consistency-gate.ts +27 -5
- package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
- package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
- package/src/resources/extensions/gsd/codebase-generator.ts +9 -5
- package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
- package/src/resources/extensions/gsd/commands/context.ts +16 -2
- package/src/resources/extensions/gsd/commands/handlers/auto.ts +3 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +64 -3
- package/src/resources/extensions/gsd/commands-inspect.ts +7 -8
- package/src/resources/extensions/gsd/commands-maintenance.ts +74 -40
- package/src/resources/extensions/gsd/commands-ship.ts +2 -2
- package/src/resources/extensions/gsd/commands-verdict.ts +19 -2
- 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/engine.ts +809 -0
- package/src/resources/extensions/gsd/db/queries.ts +490 -0
- package/src/resources/extensions/gsd/db/sql-constants.ts +12 -0
- package/src/resources/extensions/gsd/db/writers/cascades.ts +237 -0
- package/src/resources/extensions/gsd/db/writers/import-restore.ts +310 -0
- package/src/resources/extensions/gsd/db/writers/memory.ts +220 -0
- package/src/resources/extensions/gsd/db/writers/reconcile.ts +500 -0
- package/src/resources/extensions/gsd/db/writers/status.ts +88 -0
- package/src/resources/extensions/gsd/db-workspace.ts +170 -0
- package/src/resources/extensions/gsd/debug-logger.ts +11 -0
- package/src/resources/extensions/gsd/delegation-policy.ts +3 -11
- package/src/resources/extensions/gsd/discussion-handoff.ts +276 -0
- package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
- package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -0
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
- package/src/resources/extensions/gsd/doctor-environment.ts +5 -13
- package/src/resources/extensions/gsd/doctor-format.ts +12 -7
- package/src/resources/extensions/gsd/doctor-git-checks.ts +5 -22
- package/src/resources/extensions/gsd/doctor-proactive.ts +8 -2
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -17
- package/src/resources/extensions/gsd/doctor.ts +15 -5
- package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
- package/src/resources/extensions/gsd/error-classifier.ts +12 -1
- package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
- package/src/resources/extensions/gsd/files.ts +33 -12
- package/src/resources/extensions/gsd/git-conflict-state.ts +17 -1
- package/src/resources/extensions/gsd/git-service.ts +1 -0
- package/src/resources/extensions/gsd/gitignore.ts +3 -0
- package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
- package/src/resources/extensions/gsd/gsd-db.ts +188 -2375
- package/src/resources/extensions/gsd/guidance.ts +217 -0
- package/src/resources/extensions/gsd/guided-flow.ts +118 -589
- package/src/resources/extensions/gsd/guided-unit-completion.ts +275 -0
- package/src/resources/extensions/gsd/markdown-renderer.ts +51 -20
- package/src/resources/extensions/gsd/mcp-filter.ts +11 -24
- package/src/resources/extensions/gsd/mcp-tool-name.ts +30 -0
- package/src/resources/extensions/gsd/md-importer.ts +3 -3
- package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
- package/src/resources/extensions/gsd/migrate/safety.ts +20 -9
- package/src/resources/extensions/gsd/migration-auto-check.ts +30 -5
- package/src/resources/extensions/gsd/milestone-closeout-proof.ts +131 -0
- package/src/resources/extensions/gsd/milestone-closeout.ts +121 -28
- package/src/resources/extensions/gsd/milestone-merge-transaction.ts +47 -0
- package/src/resources/extensions/gsd/milestone-planning-persistence.ts +224 -0
- package/src/resources/extensions/gsd/milestone-readiness.ts +125 -0
- package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
- package/src/resources/extensions/gsd/milestone-settlement.ts +81 -0
- package/src/resources/extensions/gsd/milestone-validation-evidence.ts +95 -0
- package/src/resources/extensions/gsd/milestone-validation-verdict.ts +80 -0
- package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
- package/src/resources/extensions/gsd/model-router.ts +3 -0
- package/src/resources/extensions/gsd/native-git-bridge.ts +48 -0
- package/src/resources/extensions/gsd/notification-store.ts +26 -3
- package/src/resources/extensions/gsd/parallel-eligibility.ts +4 -5
- package/src/resources/extensions/gsd/parallel-merge.ts +12 -9
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -7
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +6 -2
- package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
- package/src/resources/extensions/gsd/paths.ts +42 -22
- package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
- package/src/resources/extensions/gsd/preferences-diagnostics.ts +98 -0
- package/src/resources/extensions/gsd/preferences-models.ts +12 -47
- package/src/resources/extensions/gsd/preferences-types.ts +16 -0
- package/src/resources/extensions/gsd/preferences.ts +191 -28
- package/src/resources/extensions/gsd/projection-flush.ts +20 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +4 -3
- package/src/resources/extensions/gsd/prompts/discuss.md +6 -7
- package/src/resources/extensions/gsd/prompts/execute-task.md +3 -1
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +5 -7
- package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +6 -6
- package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +1 -2
- package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +5 -6
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -3
- 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 +3 -2
- package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/research-milestone.md +3 -3
- 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 +6 -3
- package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +6 -4
- package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
- package/src/resources/extensions/gsd/provider-payload-policy.ts +140 -0
- 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/pull-request-process.ts +41 -0
- package/src/resources/extensions/gsd/quality-gate-closure.ts +140 -0
- package/src/resources/extensions/gsd/question-transport.ts +138 -0
- package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
- package/src/resources/extensions/gsd/recovery-classification.ts +47 -88
- package/src/resources/extensions/gsd/roadmap-slices.ts +36 -5
- package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +36 -4
- package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +7 -2
- package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -0
- package/src/resources/extensions/gsd/schemas/parsers.ts +6 -1
- package/src/resources/extensions/gsd/session-lock.ts +1 -1
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +6 -2
- package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +31 -10
- package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
- package/src/resources/extensions/gsd/state.ts +24 -26
- package/src/resources/extensions/gsd/status-guards.ts +59 -8
- package/src/resources/extensions/gsd/stop-notice.ts +75 -0
- package/src/resources/extensions/gsd/templates/plan.md +7 -0
- package/src/resources/extensions/gsd/templates/project.md +1 -0
- package/src/resources/extensions/gsd/templates/roadmap.md +1 -1
- package/src/resources/extensions/gsd/templates/uat.md +5 -1
- package/src/resources/extensions/gsd/tests/artifact-db-drift-memo.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/ask-user-questions-render.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +29 -1
- package/src/resources/extensions/gsd/tests/auto-dispatch-baseline-harness.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +444 -5
- package/src/resources/extensions/gsd/tests/auto-milestone-target.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +91 -0
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +894 -858
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +41 -11
- package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
- package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +4 -2
- 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/canonical-milestone-root.test.ts +20 -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 +44 -0
- package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/commands-dispatcher-workspace-git.test.ts +11 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +46 -8
- 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/debug-logger.test.ts +15 -0
- 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/dispatch-complete-milestone-guard.test.ts +34 -3
- 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 +89 -0
- package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +18 -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/evidence-xref-gsd-exec.test.ts +157 -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/execute-summary-save-empty-project.test.ts +64 -1
- package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
- package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +33 -1
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-no-blockers.md +1 -5
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-with-blockers.md +1 -5
- package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +48 -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 +58 -15
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +74 -59
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
- package/src/resources/extensions/gsd/tests/integration/merge-strategy-regular.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +199 -0
- package/src/resources/extensions/gsd/tests/markdown-renderer-parse-cache.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/mcp-tool-name.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +143 -1
- package/src/resources/extensions/gsd/tests/milestone-closeout-proof.test.ts +99 -0
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +120 -4
- package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/milestone-readiness.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/milestone-validation-evidence.test.ts +41 -0
- package/src/resources/extensions/gsd/tests/milestone-validation-verdict.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/native-merge-regular.test.ts +139 -0
- 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/orchestrator-legacy-parity.test.ts +127 -0
- package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/parse-project-milestone-bridge.test.ts +77 -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/plan-milestone.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +6 -2
- package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +45 -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/preferences-diagnostics.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +183 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +75 -2
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
- package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/provider-payload-policy.test.ts +165 -0
- package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/pull-request-process.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/recovery-classification-illegal-transition.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +342 -1
- package/src/resources/extensions/gsd/tests/research-milestone-composer.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +44 -1
- package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +80 -0
- package/src/resources/extensions/gsd/tests/session-switch-clears-pending-autostart.test.ts +108 -0
- package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +144 -7
- package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +21 -6
- package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/status-guards.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +114 -0
- package/src/resources/extensions/gsd/tests/tool-availability-audit.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +35 -42
- 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 -6
- package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +114 -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/validate-milestone-stuck-guard.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +193 -0
- package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +128 -11
- 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/workspace-git-preflight.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +43 -1
- package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/worktree-projection-writers.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +27 -1
- package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +12 -6
- package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +15 -3
- package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +188 -1
- package/src/resources/extensions/gsd/tool-contract.ts +124 -11
- package/src/resources/extensions/gsd/tool-presentation-plan.ts +18 -35
- package/src/resources/extensions/gsd/tool-surface-readiness.ts +76 -0
- package/src/resources/extensions/gsd/tool-surface-snapshot.ts +47 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
- package/src/resources/extensions/gsd/tools/complete-slice.ts +45 -70
- package/src/resources/extensions/gsd/tools/complete-task.ts +3 -2
- package/src/resources/extensions/gsd/tools/exec-tool.ts +9 -8
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +19 -160
- 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 +45 -2
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +13 -40
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +16 -44
- 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/skip-slice.ts +18 -44
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +25 -84
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +264 -23
- package/src/resources/extensions/gsd/uat-policy.ts +80 -25
- package/src/resources/extensions/gsd/uat-run.ts +10 -14
- package/src/resources/extensions/gsd/undo.ts +9 -8
- package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
- package/src/resources/extensions/gsd/unit-context-composer.ts +196 -21
- 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-runtime.ts +3 -2
- package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -191
- package/src/resources/extensions/gsd/validation-block-guard.ts +2 -0
- 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 +144 -0
- 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.ts +22 -110
- package/src/resources/extensions/gsd/workflow-reconcile.ts +32 -65
- package/src/resources/extensions/gsd/workflow-tool-surface.ts +76 -0
- package/src/resources/extensions/gsd/workspace-git-guard.ts +1 -0
- package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -0
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +20 -25
- package/src/resources/extensions/gsd/worktree-manager.ts +47 -28
- package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
- package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
- package/src/resources/extensions/gsd/worktree-root.ts +29 -6
- package/src/resources/extensions/gsd/worktree-safety.ts +8 -5
- package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
- package/src/resources/extensions/gsd/worktree-state-projection.ts +55 -7
- package/src/resources/extensions/gsd/worktree-telemetry.ts +16 -0
- 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/extensions/shared/interview-ui.ts +15 -2
- package/src/resources/shared/claude-runtime-floor.ts +248 -0
- 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/references/executable-code.md +1 -1
- 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/gsd-browser/SKILL.md +1 -1
- package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
- package/dist/resources/extensions/gsd/user-input-boundary.js +0 -157
- package/dist/web/standalone/.next/server/chunks/678.js +0 -2
- package/dist/web/standalone/.next/static/chunks/2659.feb6499ca863ebfc.js +0 -1
- package/dist/web/standalone/.next/static/chunks/2772.151789db0edea835.js +0 -1
- package/dist/web/standalone/.next/static/chunks/4283.10a065467b5340d8.js +0 -2
- package/dist/web/standalone/.next/static/chunks/5826.960dc4634cc9b0d3.js +0 -1
- package/dist/web/standalone/.next/static/chunks/796.46f811c0fac23aab.js +0 -10
- package/dist/web/standalone/.next/static/chunks/8785.d32f7a61f55c1600.js +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts +0 -21
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts.map +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js +0 -213
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js.map +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.d.ts +0 -28
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.d.ts.map +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.js +0 -249
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.js.map +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.d.ts +0 -19
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.d.ts.map +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.js +0 -797
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.js.map +0 -1
- package/scripts/ensure-workspace-builds.cjs +0 -129
- package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -26
- package/src/resources/extensions/gsd/user-input-boundary.ts +0 -166
- /package/dist/web/standalone/.next/static/{tJOKQbQRO-9MiFDO8DIDS → T-LTxEw5wir5Lm5T3qEVd}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{tJOKQbQRO-9MiFDO8DIDS → T-LTxEw5wir5Lm5T3qEVd}/_ssgManifest.js +0 -0
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
* immediately. The LLM can continue working and check results later
|
|
6
6
|
* with await_job.
|
|
7
7
|
*/
|
|
8
|
-
import { getShellConfig, sanitizeCommand, DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, } from "@gsd/pi-coding-agent";
|
|
8
|
+
import { getShellConfig, sanitizeCommand, killProcessTree, SIGKILL_GRACE_MS, HARD_DEADLINE_MS, DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, } from "@gsd/pi-coding-agent";
|
|
9
9
|
import { Type } from "@sinclair/typebox";
|
|
10
|
-
import { spawn
|
|
10
|
+
import { spawn } from "node:child_process";
|
|
11
11
|
import { createWriteStream } from "node:fs";
|
|
12
12
|
import { tmpdir } from "node:os";
|
|
13
13
|
import { join } from "node:path";
|
|
@@ -22,37 +22,6 @@ function getTempFilePath() {
|
|
|
22
22
|
const id = randomBytes(8).toString("hex");
|
|
23
23
|
return join(tmpdir(), `pi-async-bash-${id}.log`);
|
|
24
24
|
}
|
|
25
|
-
/**
|
|
26
|
-
* Kill a process and its children (cross-platform).
|
|
27
|
-
* Uses process group kill on Unix; taskkill /F /T on Windows.
|
|
28
|
-
*/
|
|
29
|
-
function killTree(pid) {
|
|
30
|
-
if (process.platform === "win32") {
|
|
31
|
-
try {
|
|
32
|
-
spawnSync("taskkill", ["/F", "/T", "/PID", String(pid)], {
|
|
33
|
-
timeout: 5_000,
|
|
34
|
-
stdio: "ignore",
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
catch {
|
|
38
|
-
try {
|
|
39
|
-
process.kill(pid, "SIGTERM");
|
|
40
|
-
}
|
|
41
|
-
catch { /* already exited */ }
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
else {
|
|
45
|
-
try {
|
|
46
|
-
process.kill(-pid, "SIGTERM");
|
|
47
|
-
}
|
|
48
|
-
catch {
|
|
49
|
-
try {
|
|
50
|
-
process.kill(pid, "SIGTERM");
|
|
51
|
-
}
|
|
52
|
-
catch { /* already exited */ }
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
25
|
export function createAsyncBashTool(getManager, getCwd) {
|
|
57
26
|
return {
|
|
58
27
|
name: "async_bash",
|
|
@@ -62,7 +31,7 @@ export function createAsyncBashTool(getManager, getCwd) {
|
|
|
62
31
|
`Output is truncated to the last ${DEFAULT_MAX_LINES} lines or ${DEFAULT_MAX_BYTES / 1024}KB.`,
|
|
63
32
|
promptSnippet: "Run a bash command in the background, returning a job ID immediately.",
|
|
64
33
|
promptGuidelines: [
|
|
65
|
-
"Use async_bash for
|
|
34
|
+
"Use async_bash for long-running builds, tests, installs, or operations that should run in the background so you can continue other work (the job ID lets you await_job later). Sync bash is uncapped — use async_bash when you want non-blocking behavior, not because of a timeout concern.",
|
|
66
35
|
"After starting async jobs, continue with other work and use await_job when you need the results.",
|
|
67
36
|
"await_job has a configurable timeout (default 120s) to prevent indefinite blocking — if it times out, jobs keep running and you can check again later.",
|
|
68
37
|
"For long-running processes (SSH, deploys, training) that may take minutes+, prefer async_bash with periodic await_job polling over a single long await.",
|
|
@@ -122,36 +91,25 @@ function executeBashInBackground(command, cwd, signal, timeout) {
|
|
|
122
91
|
});
|
|
123
92
|
let timedOut = false;
|
|
124
93
|
let timeoutHandle;
|
|
125
|
-
let sigkillHandle;
|
|
126
94
|
let hardDeadlineHandle;
|
|
127
|
-
/** Grace period (ms) between SIGTERM and SIGKILL. */
|
|
128
|
-
const SIGKILL_GRACE_MS = 5_000;
|
|
129
|
-
/** Hard deadline (ms) after SIGKILL to force-resolve the promise. */
|
|
130
|
-
const HARD_DEADLINE_MS = 3_000;
|
|
131
95
|
if (timeout !== undefined && timeout > 0) {
|
|
132
96
|
timeoutHandle = setTimeout(() => {
|
|
133
97
|
timedOut = true;
|
|
98
|
+
// killProcessTree owns the SIGTERM -> grace -> SIGKILL escalation, so a
|
|
99
|
+
// SIGTERM-immune child is actually force-killed rather than left running.
|
|
134
100
|
if (child.pid)
|
|
135
|
-
|
|
136
|
-
//
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
? `${output}\n\nCommand timed out after ${timeout} seconds (force-killed)`
|
|
148
|
-
: `Command timed out after ${timeout} seconds (force-killed)`);
|
|
149
|
-
}, HARD_DEADLINE_MS);
|
|
150
|
-
if (typeof hardDeadlineHandle === "object" && "unref" in hardDeadlineHandle)
|
|
151
|
-
hardDeadlineHandle.unref();
|
|
152
|
-
}, SIGKILL_GRACE_MS);
|
|
153
|
-
if (typeof sigkillHandle === "object" && "unref" in sigkillHandle)
|
|
154
|
-
sigkillHandle.unref();
|
|
101
|
+
killProcessTree(child.pid);
|
|
102
|
+
// Hard deadline: a D-state (uninterruptible-I/O) child never emits 'close'
|
|
103
|
+
// even after SIGKILL, so force-resolve the promise rather than hang (#2186).
|
|
104
|
+
// Fires after the full grace window so SIGKILL has had its chance first.
|
|
105
|
+
hardDeadlineHandle = setTimeout(() => {
|
|
106
|
+
const output = Buffer.concat(chunks).toString("utf-8");
|
|
107
|
+
safeResolve(output
|
|
108
|
+
? `${output}\n\nCommand timed out after ${timeout} seconds (force-killed)`
|
|
109
|
+
: `Command timed out after ${timeout} seconds (force-killed)`);
|
|
110
|
+
}, SIGKILL_GRACE_MS + HARD_DEADLINE_MS);
|
|
111
|
+
if (typeof hardDeadlineHandle === "object" && "unref" in hardDeadlineHandle)
|
|
112
|
+
hardDeadlineHandle.unref();
|
|
155
113
|
}, timeout * 1000);
|
|
156
114
|
}
|
|
157
115
|
const chunks = [];
|
|
@@ -182,7 +140,19 @@ function executeBashInBackground(command, cwd, signal, timeout) {
|
|
|
182
140
|
child.stderr.on("data", onData);
|
|
183
141
|
const onAbort = () => {
|
|
184
142
|
if (child.pid)
|
|
185
|
-
|
|
143
|
+
killProcessTree(child.pid);
|
|
144
|
+
// Arm the same hard-deadline force-resolve the timeout path uses, so a
|
|
145
|
+
// cancelled D-state child (never emits 'close' even after SIGKILL) can't
|
|
146
|
+
// hang the job promise forever. safeResolve is idempotent, so the real
|
|
147
|
+
// 'close' still wins if the child does exit.
|
|
148
|
+
if (!hardDeadlineHandle) {
|
|
149
|
+
hardDeadlineHandle = setTimeout(() => {
|
|
150
|
+
const output = Buffer.concat(chunks).toString("utf-8");
|
|
151
|
+
safeResolve(output ? `${output}\n\nCommand aborted (force-killed)` : "Command aborted (force-killed)");
|
|
152
|
+
}, SIGKILL_GRACE_MS + HARD_DEADLINE_MS);
|
|
153
|
+
if (typeof hardDeadlineHandle === "object" && "unref" in hardDeadlineHandle)
|
|
154
|
+
hardDeadlineHandle.unref();
|
|
155
|
+
}
|
|
186
156
|
};
|
|
187
157
|
if (signal.aborted) {
|
|
188
158
|
onAbort();
|
|
@@ -193,8 +163,6 @@ function executeBashInBackground(command, cwd, signal, timeout) {
|
|
|
193
163
|
child.on("error", (err) => {
|
|
194
164
|
if (timeoutHandle)
|
|
195
165
|
clearTimeout(timeoutHandle);
|
|
196
|
-
if (sigkillHandle)
|
|
197
|
-
clearTimeout(sigkillHandle);
|
|
198
166
|
if (hardDeadlineHandle)
|
|
199
167
|
clearTimeout(hardDeadlineHandle);
|
|
200
168
|
signal.removeEventListener("abort", onAbort);
|
|
@@ -203,8 +171,6 @@ function executeBashInBackground(command, cwd, signal, timeout) {
|
|
|
203
171
|
child.on("close", (code) => {
|
|
204
172
|
if (timeoutHandle)
|
|
205
173
|
clearTimeout(timeoutHandle);
|
|
206
|
-
if (sigkillHandle)
|
|
207
|
-
clearTimeout(sigkillHandle);
|
|
208
174
|
if (hardDeadlineHandle)
|
|
209
175
|
clearTimeout(hardDeadlineHandle);
|
|
210
176
|
signal.removeEventListener("abort", onAbort);
|
|
@@ -21,7 +21,7 @@ export function createAwaitTool(getManager) {
|
|
|
21
21
|
label: "Await Background Job",
|
|
22
22
|
description: "Wait for background jobs to complete. Provide specific job IDs or omit to wait for the next job that finishes. Returns results of completed jobs.",
|
|
23
23
|
parameters: schema,
|
|
24
|
-
async execute(_toolCallId, params,
|
|
24
|
+
async execute(_toolCallId, params, signal, _onUpdate, _ctx) {
|
|
25
25
|
const manager = getManager();
|
|
26
26
|
const { jobs: jobIds, timeout } = params;
|
|
27
27
|
const timeoutMs = ((timeout ?? DEFAULT_TIMEOUT_SECONDS) * 1000);
|
|
@@ -54,37 +54,75 @@ export function createAwaitTool(getManager) {
|
|
|
54
54
|
};
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
|
-
//
|
|
57
|
+
// If all watched jobs are already done, suppress follow-up and return immediately.
|
|
58
58
|
// suppressFollowUp() cancels the pending delivery timer (if any), which
|
|
59
59
|
// handles both the within-turn case (job completes while we await) and
|
|
60
60
|
// the cross-turn case (job already completed before await_job was called).
|
|
61
61
|
// Previously this only set j.awaited = true, which missed the cross-turn
|
|
62
62
|
// case because the queueMicrotask had already fired (#3787).
|
|
63
|
-
for (const j of watched)
|
|
64
|
-
manager.suppressFollowUp(j.id);
|
|
65
|
-
// If all watched jobs are already done, return immediately
|
|
66
63
|
const running = watched.filter((j) => j.status === "running");
|
|
67
64
|
if (running.length === 0) {
|
|
68
|
-
const
|
|
69
|
-
|
|
65
|
+
for (const j of watched)
|
|
66
|
+
manager.suppressFollowUp(j.id);
|
|
67
|
+
return { content: [{ type: "text", text: renderCompleted(watched) }], details: undefined };
|
|
70
68
|
}
|
|
71
|
-
// Wait for at least one to complete, or
|
|
69
|
+
// Wait for at least one to complete, timeout, or abort signal
|
|
72
70
|
const TIMEOUT_SENTINEL = Symbol("timeout");
|
|
71
|
+
const ABORT_SENTINEL = Symbol("abort");
|
|
72
|
+
// The race timer and abort listener are explicitly torn down once the race
|
|
73
|
+
// settles (below) so a completion- or timeout-won race never leaks a pending
|
|
74
|
+
// timer or a lingering abort listener — the listener holds a closure over the
|
|
75
|
+
// race resolver, so { once: true } alone (which only detaches on fire) is not
|
|
76
|
+
// enough when ESC never happens.
|
|
77
|
+
let raceTimer;
|
|
78
|
+
let abortListener;
|
|
73
79
|
const timeoutPromise = new Promise((resolve) => {
|
|
74
|
-
|
|
80
|
+
raceTimer = setTimeout(() => resolve(TIMEOUT_SENTINEL), timeoutMs);
|
|
75
81
|
// Allow the process to exit even if the timer is pending
|
|
76
|
-
if (typeof
|
|
77
|
-
|
|
82
|
+
if (typeof raceTimer === "object" && "unref" in raceTimer)
|
|
83
|
+
raceTimer.unref();
|
|
84
|
+
});
|
|
85
|
+
const abortPromise = new Promise((resolve) => {
|
|
86
|
+
if (!signal || signal.aborted) {
|
|
87
|
+
resolve(ABORT_SENTINEL);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
abortListener = () => resolve(ABORT_SENTINEL);
|
|
91
|
+
signal.addEventListener("abort", abortListener, { once: true });
|
|
92
|
+
}
|
|
78
93
|
});
|
|
79
94
|
const raceResult = await Promise.race([
|
|
80
95
|
Promise.race(running.map((j) => j.promise)).then(() => "completed"),
|
|
81
96
|
timeoutPromise,
|
|
97
|
+
abortPromise,
|
|
82
98
|
]);
|
|
99
|
+
// Tear down race resources now that a winner is decided.
|
|
100
|
+
if (raceTimer)
|
|
101
|
+
clearTimeout(raceTimer);
|
|
102
|
+
if (abortListener && signal)
|
|
103
|
+
signal.removeEventListener("abort", abortListener);
|
|
104
|
+
const aborted = raceResult === ABORT_SENTINEL;
|
|
83
105
|
const timedOut = raceResult === TIMEOUT_SENTINEL;
|
|
84
106
|
// Collect all completed results (more may have finished while waiting)
|
|
85
107
|
const completed = watched.filter((j) => j.status !== "running");
|
|
86
108
|
const stillRunning = watched.filter((j) => j.status === "running");
|
|
87
|
-
|
|
109
|
+
// Suppress follow-up ONLY for completed jobs — leave stillRunning unsuppressed
|
|
110
|
+
// so deliverResult/onJobComplete can resurface their results later.
|
|
111
|
+
for (const j of completed)
|
|
112
|
+
manager.suppressFollowUp(j.id);
|
|
113
|
+
if (aborted) {
|
|
114
|
+
// ESC ended the wait, not the jobs: still-running jobs keep going and
|
|
115
|
+
// resurface via onJobComplete (they were deliberately not suppressed above).
|
|
116
|
+
const runningDesc = stillRunning.map((j) => `${j.id} (${j.label})`).join(", ");
|
|
117
|
+
const interrupt = stillRunning.length > 0
|
|
118
|
+
? `Wait interrupted. Still running: ${runningDesc} — results will surface when complete.`
|
|
119
|
+
: "Wait interrupted.";
|
|
120
|
+
const text = completed.length > 0
|
|
121
|
+
? `${renderCompleted(completed)}\n\n${interrupt}`
|
|
122
|
+
: interrupt;
|
|
123
|
+
return { content: [{ type: "text", text }], details: undefined };
|
|
124
|
+
}
|
|
125
|
+
let result = renderCompleted(completed);
|
|
88
126
|
if (stillRunning.length > 0) {
|
|
89
127
|
result += `\n\n**Still running:** ${stillRunning.map((j) => `${j.id} (${j.label})`).join(", ")}`;
|
|
90
128
|
}
|
|
@@ -97,6 +135,36 @@ export function createAwaitTool(getManager) {
|
|
|
97
135
|
},
|
|
98
136
|
};
|
|
99
137
|
}
|
|
138
|
+
/**
|
|
139
|
+
* Render completed jobs for the await_job result, de-duplicating against
|
|
140
|
+
* follow-ups that have already been delivered to context.
|
|
141
|
+
*
|
|
142
|
+
* A job's follow-up fires ~immediately (setTimeout(0)) once it settles, so when
|
|
143
|
+
* await_job runs in a LATER turn the result is already in context. Reprinting it
|
|
144
|
+
* inline produces the same output twice. Jobs already `delivered` are therefore
|
|
145
|
+
* acknowledged on a single line instead of having their full output reprinted;
|
|
146
|
+
* not-yet-delivered jobs (the within-turn case, where suppressFollowUp won the
|
|
147
|
+
* race) are rendered in full as before.
|
|
148
|
+
*/
|
|
149
|
+
function renderCompleted(jobs) {
|
|
150
|
+
if (jobs.length === 0)
|
|
151
|
+
return "No completed jobs.";
|
|
152
|
+
const fresh = jobs.filter((j) => !j.delivered);
|
|
153
|
+
const alreadyDelivered = jobs.filter((j) => j.delivered);
|
|
154
|
+
const sections = [];
|
|
155
|
+
if (fresh.length > 0)
|
|
156
|
+
sections.push(formatResults(fresh));
|
|
157
|
+
if (alreadyDelivered.length > 0) {
|
|
158
|
+
const names = alreadyDelivered
|
|
159
|
+
.map((j) => `${j.id} (${j.label})`)
|
|
160
|
+
.join(", ");
|
|
161
|
+
const sentence = alreadyDelivered.length === 1
|
|
162
|
+
? `This job already finished and its result was shown above when it completed, so there is nothing new to report: ${names}.`
|
|
163
|
+
: `These jobs already finished and their results were shown above when they completed, so there is nothing new to report: ${names}.`;
|
|
164
|
+
sections.push(sentence);
|
|
165
|
+
}
|
|
166
|
+
return sections.join("\n\n");
|
|
167
|
+
}
|
|
100
168
|
function formatResults(jobs) {
|
|
101
169
|
if (jobs.length === 0)
|
|
102
170
|
return "No completed jobs.";
|
|
@@ -98,9 +98,74 @@ export default function AsyncJobs(pi) {
|
|
|
98
98
|
});
|
|
99
99
|
return;
|
|
100
100
|
}
|
|
101
|
+
const ctx = _ctx;
|
|
101
102
|
const running = manager.getRunningJobs();
|
|
102
103
|
const recent = manager.getRecentJobs(10);
|
|
103
104
|
const completed = recent.filter((j) => j.status !== "running");
|
|
105
|
+
// Interactive kill-picker when there are running jobs and a UI is available
|
|
106
|
+
if (running.length > 0 && ctx.hasUI) {
|
|
107
|
+
// Kill-picker loop: each iteration shows live running jobs.
|
|
108
|
+
// Step 1 picks a job (neutral label — selecting does NOT cancel yet);
|
|
109
|
+
// step 2 confirms before the destructive cancel. Labels deliberately
|
|
110
|
+
// omit a live elapsed time: ctx.ui.select renders the option strings
|
|
111
|
+
// once and never refreshes them, so a "(24s)" baked into the label
|
|
112
|
+
// would freeze and mislead. Accurate elapsed times are shown in the
|
|
113
|
+
// post-picker summary (rebuilt fresh) instead.
|
|
114
|
+
const DONE = "Close";
|
|
115
|
+
while (true) {
|
|
116
|
+
const liveJobs = manager.getRunningJobs();
|
|
117
|
+
if (liveJobs.length === 0)
|
|
118
|
+
break;
|
|
119
|
+
// Map display label -> job id so we never parse ids back out of
|
|
120
|
+
// free-form label text.
|
|
121
|
+
const labelToId = new Map();
|
|
122
|
+
for (const j of liveJobs) {
|
|
123
|
+
labelToId.set(`${j.id} — ${j.label} (running)`, j.id);
|
|
124
|
+
}
|
|
125
|
+
const options = [...labelToId.keys(), DONE];
|
|
126
|
+
const choice = await ctx.ui.select("Background jobs — pick one to cancel, Escape to close", options);
|
|
127
|
+
// ESC returns undefined; headless may return string[]; DONE closes
|
|
128
|
+
if (!choice || typeof choice !== "string" || choice === DONE)
|
|
129
|
+
break;
|
|
130
|
+
const id = labelToId.get(choice);
|
|
131
|
+
if (!id)
|
|
132
|
+
break;
|
|
133
|
+
const job = liveJobs.find((j) => j.id === id);
|
|
134
|
+
const confirmed = await ctx.ui.confirm("Cancel background job?", `This will stop ${id}${job ? ` — ${job.label}` : ""}. Other jobs keep running.`);
|
|
135
|
+
if (!confirmed)
|
|
136
|
+
continue;
|
|
137
|
+
const r = manager.cancel(id);
|
|
138
|
+
ctx.ui.notify(r === "cancelled" ? `Job ${id} cancelled.` : `Job ${id}: ${r}`, r === "cancelled" ? "success" : "warning");
|
|
139
|
+
}
|
|
140
|
+
// After picker, send a summary of any still-running jobs
|
|
141
|
+
const stillRunning = manager.getRunningJobs();
|
|
142
|
+
const summaryLines = ["## Background Jobs"];
|
|
143
|
+
if (stillRunning.length > 0) {
|
|
144
|
+
summaryLines.push("", "### Running");
|
|
145
|
+
for (const job of stillRunning) {
|
|
146
|
+
const elapsed = ((Date.now() - job.startTime) / 1000).toFixed(0);
|
|
147
|
+
summaryLines.push(`- **${job.id}** — ${job.label} (${elapsed}s)`);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
const recentCompleted = manager.getRecentJobs(10).filter((j) => j.status !== "running");
|
|
151
|
+
if (recentCompleted.length > 0) {
|
|
152
|
+
summaryLines.push("", "### Recent");
|
|
153
|
+
for (const job of recentCompleted) {
|
|
154
|
+
const elapsed = ((Date.now() - job.startTime) / 1000).toFixed(1);
|
|
155
|
+
summaryLines.push(`- **${job.id}** — ${job.label} (${job.status}, ${elapsed}s)`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
if (stillRunning.length === 0 && recentCompleted.length === 0) {
|
|
159
|
+
summaryLines.push("", "No background jobs.");
|
|
160
|
+
}
|
|
161
|
+
pi.sendMessage({
|
|
162
|
+
customType: "async_jobs_list",
|
|
163
|
+
content: summaryLines.join("\n"),
|
|
164
|
+
display: true,
|
|
165
|
+
});
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
// Text-only display: headless/RPC mode, or no running jobs
|
|
104
169
|
const lines = ["## Background Jobs"];
|
|
105
170
|
if (running.length === 0 && completed.length === 0) {
|
|
106
171
|
lines.push("", "No background jobs.");
|
|
@@ -53,6 +53,15 @@ export class AsyncJobManager {
|
|
|
53
53
|
};
|
|
54
54
|
job.promise = runFn(abortController.signal)
|
|
55
55
|
.then((resultText) => {
|
|
56
|
+
if (job.status === "cancelled") {
|
|
57
|
+
// Already cancelled by cancel(). The runFn resolves (not rejects) even
|
|
58
|
+
// when aborted — async_bash's safeResolve returns "Command aborted"
|
|
59
|
+
// rather than throwing — so without this guard the status would be
|
|
60
|
+
// clobbered back to "completed", mislabeling a user-cancelled job.
|
|
61
|
+
// Mirrors the symmetric guard in the .catch branch below.
|
|
62
|
+
this.scheduleEviction(id);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
56
65
|
job.status = "completed";
|
|
57
66
|
job.resultText = resultText;
|
|
58
67
|
this.scheduleEviction(id);
|
|
@@ -143,8 +152,10 @@ export class AsyncJobManager {
|
|
|
143
152
|
const cb = this.onJobComplete;
|
|
144
153
|
job.deliveryTimer = setTimeout(() => {
|
|
145
154
|
job.deliveryTimer = undefined;
|
|
146
|
-
if (!job.awaited)
|
|
155
|
+
if (!job.awaited) {
|
|
156
|
+
job.delivered = true;
|
|
147
157
|
cb(job);
|
|
158
|
+
}
|
|
148
159
|
}, 0);
|
|
149
160
|
// Allow process to exit even if timer is pending
|
|
150
161
|
if (typeof job.deliveryTimer === "object" && "unref" in job.deliveryTimer) {
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { Key } from "@gsd/pi-tui";
|
|
5
5
|
import { shortcutDesc } from "../shared/terminal.js";
|
|
6
|
-
import { processes,
|
|
6
|
+
import { processes, terminateProcess, getGroupStatus, cleanupAll, } from "./process-manager.js";
|
|
7
7
|
import { generateDigest, getOutput, formatDigestText, } from "./output-formatter.js";
|
|
8
8
|
import { formatUptime } from "./utilities.js";
|
|
9
9
|
import { BgManagerOverlay } from "./overlay.js";
|
|
@@ -119,11 +119,11 @@ export function registerBgShellCommand(pi, state) {
|
|
|
119
119
|
ctx.ui.notify(`No process with id '${id}'`, "error");
|
|
120
120
|
return;
|
|
121
121
|
}
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
await new Promise(r => setTimeout(r,
|
|
122
|
+
// Graceful ladder (SIGTERM → grace → SIGKILL) via killProcessTree.
|
|
123
|
+
terminateProcess(id);
|
|
124
|
+
const deadline = Date.now() + 6_000; // grace (5s) + slack
|
|
125
|
+
while (bg.alive && Date.now() < deadline) {
|
|
126
|
+
await new Promise(r => setTimeout(r, 100));
|
|
127
127
|
}
|
|
128
128
|
if (!bg.alive)
|
|
129
129
|
processes.delete(id);
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
import { StringEnum, Type } from "@gsd/pi-ai";
|
|
5
5
|
import { Text } from "@gsd/pi-tui";
|
|
6
6
|
import { DEFAULT_READY_TIMEOUT } from "./types.js";
|
|
7
|
-
import { processes, startProcess, killProcess, restartProcess, getInfo, getGroupStatus, persistManifest, } from "./process-manager.js";
|
|
7
|
+
import { processes, startProcess, killProcess, terminateProcess, restartProcess, getInfo, getGroupStatus, persistManifest, } from "./process-manager.js";
|
|
8
8
|
import { generateDigest, getHighlights, getOutput, formatDigestText, } from "./output-formatter.js";
|
|
9
9
|
import { waitForReady } from "./readiness-detector.js";
|
|
10
10
|
import { queryShellEnv, sendAndWait, runOnSession } from "./interaction.js";
|
|
@@ -22,7 +22,8 @@ export function registerBgShellTool(pi, state) {
|
|
|
22
22
|
"signal (send OS signal), list (all processes with status), kill (terminate), restart (kill + relaunch), " +
|
|
23
23
|
"group_status (health of a process group), highlights (significant output lines only).",
|
|
24
24
|
promptGuidelines: [
|
|
25
|
-
"Use bg_shell
|
|
25
|
+
"Use bg_shell for processes that STAY ALIVE and you interact with over time: servers, watchers, daemons, REPLs. For a command that runs to completion and exits (terraform apply, migrations, builds, tests, installs), use async_bash or sync bash instead — NOT bg_shell.",
|
|
26
|
+
"'wait_for_ready' is for long-lived processes that signal readiness (open a port / print a pattern). Never use it on a run-to-completion command: that command exits instead of becoming ready, so a clean exit-0 is reported as 'not ready'. If you see that, switch to async_bash.",
|
|
26
27
|
"After starting a server, use 'wait_for_ready' to efficiently block until it's listening — avoids polling loops entirely.",
|
|
27
28
|
"Use 'digest' instead of 'output' when you just need status — it returns a structured ~30-token summary instead of ~2000 tokens of raw output.",
|
|
28
29
|
"Use 'highlights' to see only significant output (errors, URLs, results) — typically 5-15 lines instead of hundreds.",
|
|
@@ -511,11 +512,13 @@ export function registerBgShellTool(pi, state) {
|
|
|
511
512
|
isError: true, details: undefined,
|
|
512
513
|
};
|
|
513
514
|
}
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
515
|
+
// Graceful termination: SIGTERM → grace → SIGKILL via the shared
|
|
516
|
+
// killProcessTree ladder (same path bash/async_bash/exec use), so a
|
|
517
|
+
// stateful process gets a clean-shutdown window instead of a bare kill.
|
|
518
|
+
const killed = terminateProcess(params.id);
|
|
519
|
+
const deadline = Date.now() + 6_000; // grace (5s) + slack
|
|
520
|
+
while (bg.alive && Date.now() < deadline) {
|
|
521
|
+
await new Promise(r => setTimeout(r, 100));
|
|
519
522
|
}
|
|
520
523
|
const info = getInfo(bg);
|
|
521
524
|
if (!bg.alive)
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
import { truncateToWidth, visibleWidth, matchesKey, Key } from "@gsd/pi-tui";
|
|
5
5
|
import { ERROR_PATTERNS, WARNING_PATTERNS } from "./types.js";
|
|
6
6
|
import { formatUptime, formatTimeAgo } from "./utilities.js";
|
|
7
|
-
import { processes,
|
|
7
|
+
import { processes, terminateProcess, cleanupAll, restartProcess, } from "./process-manager.js";
|
|
8
8
|
export class BgManagerOverlay {
|
|
9
9
|
tui;
|
|
10
10
|
theme;
|
|
@@ -110,17 +110,20 @@ export class BgManagerOverlay {
|
|
|
110
110
|
}
|
|
111
111
|
return;
|
|
112
112
|
}
|
|
113
|
-
// x or d = kill selected
|
|
113
|
+
// x or d = kill selected (graceful ladder via killProcessTree).
|
|
114
|
+
// Use a short interactive grace: the user explicitly asked to kill, so give the
|
|
115
|
+
// process a brief clean-shutdown window then force, and re-render AFTER that grace
|
|
116
|
+
// plus slack so the row reflects the SIGKILL escalation (a 300ms re-render against
|
|
117
|
+
// the default 5s grace would show the process still alive).
|
|
114
118
|
if (data === "x" || data === "d") {
|
|
115
119
|
const proc = procs[this.selected];
|
|
116
120
|
if (proc && proc.alive) {
|
|
117
|
-
|
|
121
|
+
const OVERLAY_KILL_GRACE_MS = 500;
|
|
122
|
+
terminateProcess(proc.id, OVERLAY_KILL_GRACE_MS);
|
|
118
123
|
setTimeout(() => {
|
|
119
|
-
if (proc.alive)
|
|
120
|
-
killProcess(proc.id, "SIGKILL");
|
|
121
124
|
this.invalidate();
|
|
122
125
|
this.tui.requestRender();
|
|
123
|
-
},
|
|
126
|
+
}, OVERLAY_KILL_GRACE_MS + 400);
|
|
124
127
|
}
|
|
125
128
|
return;
|
|
126
129
|
}
|
|
@@ -6,7 +6,7 @@ import { spawn, spawnSync } from "node:child_process";
|
|
|
6
6
|
import { randomUUID } from "node:crypto";
|
|
7
7
|
import { writeFileSync, readFileSync, existsSync, mkdirSync } from "node:fs";
|
|
8
8
|
import { join } from "node:path";
|
|
9
|
-
import { getShellConfig, sanitizeCommand } from "@gsd/pi-coding-agent";
|
|
9
|
+
import { getShellConfig, sanitizeCommand, killProcessTree } from "@gsd/pi-coding-agent";
|
|
10
10
|
import { rewriteCommandWithRtk } from "../shared/rtk.js";
|
|
11
11
|
import { MAX_BUFFER_LINES, MAX_EVENTS, DEAD_PROCESS_TTL, } from "./types.js";
|
|
12
12
|
import { restoreWindowsVTInput, formatUptime } from "./utilities.js";
|
|
@@ -221,6 +221,38 @@ export function startProcess(opts) {
|
|
|
221
221
|
return bg;
|
|
222
222
|
}
|
|
223
223
|
// ── Process Kill ───────────────────────────────────────────────────────────
|
|
224
|
+
/**
|
|
225
|
+
* Gracefully terminate a process and its tree using the shared killProcessTree
|
|
226
|
+
* ladder (SIGTERM → grace window → SIGKILL), the same path bash/async_bash/exec
|
|
227
|
+
* use. This is the "I want it dead, cleanly" intent — use it for the `kill`
|
|
228
|
+
* action, `restart`, and session cleanup. For sending a SPECIFIC signal the
|
|
229
|
+
* agent chose on purpose (SIGINT, SIGHUP, …) use killProcess(), which delivers
|
|
230
|
+
* that exact signal once and does not escalate.
|
|
231
|
+
*
|
|
232
|
+
* `graceMs` overrides the SIGTERM→SIGKILL window (default: killProcessTree's 5s);
|
|
233
|
+
* session cleanup passes a shorter grace so it stays snappy between units.
|
|
234
|
+
*
|
|
235
|
+
* Returns false only when the process is unknown/already dead; the actual
|
|
236
|
+
* SIGKILL escalation fires asynchronously after the grace window, so callers
|
|
237
|
+
* should not assume the process is dead the instant this returns.
|
|
238
|
+
*/
|
|
239
|
+
export function terminateProcess(id, graceMs) {
|
|
240
|
+
const bg = processes.get(id);
|
|
241
|
+
if (!bg)
|
|
242
|
+
return false;
|
|
243
|
+
if (!bg.alive)
|
|
244
|
+
return true;
|
|
245
|
+
if (!bg.proc.pid) {
|
|
246
|
+
// No pid to target a tree; fall back to a direct graceful signal.
|
|
247
|
+
try {
|
|
248
|
+
bg.proc.kill("SIGTERM");
|
|
249
|
+
}
|
|
250
|
+
catch { /* already gone */ }
|
|
251
|
+
return true;
|
|
252
|
+
}
|
|
253
|
+
killProcessTree(bg.proc.pid, graceMs !== undefined ? { graceMs } : undefined);
|
|
254
|
+
return true;
|
|
255
|
+
}
|
|
224
256
|
export function killProcess(id, sig = "SIGTERM") {
|
|
225
257
|
const bg = processes.get(id);
|
|
226
258
|
if (!bg)
|
|
@@ -272,13 +304,14 @@ export async function restartProcess(id) {
|
|
|
272
304
|
return null;
|
|
273
305
|
const config = old.startConfig;
|
|
274
306
|
const restartCount = old.restartCount + 1;
|
|
275
|
-
// Kill old process
|
|
307
|
+
// Kill old process via the graceful ladder, then wait for it to actually die.
|
|
308
|
+
// killProcessTree escalates SIGTERM → grace → SIGKILL asynchronously, so poll
|
|
309
|
+
// for death rather than assuming a fixed sleep is enough.
|
|
276
310
|
if (old.alive) {
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
await new Promise(r => setTimeout(r, 200));
|
|
311
|
+
terminateProcess(id);
|
|
312
|
+
const deadline = Date.now() + 6_000; // grace (5s) + slack
|
|
313
|
+
while (old.alive && Date.now() < deadline) {
|
|
314
|
+
await new Promise(r => setTimeout(r, 100));
|
|
282
315
|
}
|
|
283
316
|
}
|
|
284
317
|
processes.delete(id);
|
|
@@ -328,24 +361,16 @@ export function pruneDeadProcesses() {
|
|
|
328
361
|
}
|
|
329
362
|
}
|
|
330
363
|
export function cleanupAll() {
|
|
364
|
+
// Deliberately a bare, synchronous SIGKILL — not the graceful ladder. This runs
|
|
365
|
+
// from process 'exit'/signal handlers where timers no longer fire, so a deferred
|
|
366
|
+
// SIGKILL would never be delivered and children would be orphaned when we vanish.
|
|
367
|
+
// Immediate force-kill is the correct teardown semantics here.
|
|
331
368
|
for (const [id, bg] of processes) {
|
|
332
369
|
if (bg.alive)
|
|
333
370
|
killProcess(id, "SIGKILL");
|
|
334
371
|
}
|
|
335
372
|
processes.clear();
|
|
336
373
|
}
|
|
337
|
-
/**
|
|
338
|
-
* Kill all alive, non-persistent bg processes.
|
|
339
|
-
* Called between auto-mode units to prevent orphaned servers from
|
|
340
|
-
* keeping ports bound across task boundaries (#1209).
|
|
341
|
-
*/
|
|
342
|
-
export function killSessionProcesses() {
|
|
343
|
-
for (const [id, bg] of processes) {
|
|
344
|
-
if (bg.alive && !bg.persistAcrossSessions) {
|
|
345
|
-
killProcess(id, "SIGTERM");
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
}
|
|
349
374
|
async function waitForProcessExit(bg, timeoutMs) {
|
|
350
375
|
if (!bg.alive)
|
|
351
376
|
return true;
|
|
@@ -359,20 +384,24 @@ async function waitForProcessExit(bg, timeoutMs) {
|
|
|
359
384
|
});
|
|
360
385
|
return !bg.alive;
|
|
361
386
|
}
|
|
387
|
+
/**
|
|
388
|
+
* Terminate the alive, non-persistent processes owned by a session, gracefully.
|
|
389
|
+
* Routes through the shared killProcessTree ladder (SIGTERM → grace → SIGKILL)
|
|
390
|
+
* via terminateProcess, with a short grace (default 300ms) so cleanup between
|
|
391
|
+
* units stays snappy; killProcessTree handles the SIGKILL escalation itself, so
|
|
392
|
+
* there is no separate force-kill pass here.
|
|
393
|
+
*/
|
|
362
394
|
export async function cleanupSessionProcesses(sessionFile, options) {
|
|
363
395
|
const graceMs = Math.max(0, options?.graceMs ?? 300);
|
|
364
396
|
const matches = Array.from(processes.values()).filter((bg) => bg.alive && !bg.persistAcrossSessions && bg.ownerSessionFile === sessionFile);
|
|
365
397
|
if (matches.length === 0)
|
|
366
398
|
return [];
|
|
367
399
|
for (const bg of matches) {
|
|
368
|
-
|
|
400
|
+
terminateProcess(bg.id, graceMs);
|
|
369
401
|
}
|
|
370
402
|
if (graceMs > 0) {
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
for (const bg of matches) {
|
|
374
|
-
if (bg.alive)
|
|
375
|
-
killProcess(bg.id, "SIGKILL");
|
|
403
|
+
// Wait past the grace so the SIGKILL escalation has fired and exits are observed.
|
|
404
|
+
await Promise.all(matches.map((bg) => waitForProcessExit(bg, graceMs + 200)));
|
|
376
405
|
}
|
|
377
406
|
return matches.map((bg) => bg.id);
|
|
378
407
|
}
|
|
@@ -72,6 +72,17 @@ export async function waitForReady(bg, timeout, signal) {
|
|
|
72
72
|
return { ready: false, detail: "Cancelled" };
|
|
73
73
|
}
|
|
74
74
|
if (!bg.alive) {
|
|
75
|
+
// A clean exit-0 means the command ran to completion — it was a batch
|
|
76
|
+
// command (e.g. terraform apply, a migration, a build), not a long-lived
|
|
77
|
+
// server. That is success, not a readiness failure; say so plainly and
|
|
78
|
+
// point at the right tool so the agent stops using wait_for_ready here.
|
|
79
|
+
if (bg.exitCode === 0) {
|
|
80
|
+
return {
|
|
81
|
+
ready: false,
|
|
82
|
+
detail: "Process completed (exit 0) before signaling readiness — it ran to completion rather than staying alive. " +
|
|
83
|
+
"wait_for_ready is for long-lived servers/watchers; for a run-to-completion command use async_bash (or bg_shell 'run').",
|
|
84
|
+
};
|
|
85
|
+
}
|
|
75
86
|
const stderrLines = bg.output.filter(l => l.stream === "stderr").slice(-5).map(l => l.line);
|
|
76
87
|
const stderrContext = stderrLines.length > 0 ? `\nstderr:\n${stderrLines.join("\n").slice(0, 500)}` : "";
|
|
77
88
|
return {
|