@opengsd/gsd-pi 1.3.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -10
- package/dist/cli.js +32 -4
- package/dist/headless-answers.js +1 -1
- package/dist/headless-context.js +0 -1
- package/dist/headless-ui.d.ts +1 -1
- package/dist/headless-ui.js +1 -1
- package/dist/headless.js +1 -1
- package/dist/help-text.js +29 -0
- package/dist/hermes-integration-install.d.ts +17 -0
- package/dist/hermes-integration-install.js +199 -0
- package/dist/jiti-workspace-aliases.d.ts +11 -2
- package/dist/jiti-workspace-aliases.js +19 -3
- package/dist/read-cli.d.ts +23 -0
- package/dist/read-cli.js +90 -0
- package/dist/resource-loader.d.ts +3 -3
- package/dist/resource-loader.js +4 -13
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +22 -22
- package/dist/resources/extensions/claude-code-cli/index.js +7 -1
- package/dist/resources/extensions/claude-code-cli/models.js +9 -0
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +84 -22
- package/dist/resources/extensions/google-cli/stream-adapter.js +82 -15
- package/dist/resources/extensions/gsd/artifact-verification.js +427 -0
- package/dist/resources/extensions/gsd/auto/dispatch-history.js +6 -1
- package/dist/resources/extensions/gsd/auto/loop.js +67 -2
- package/dist/resources/extensions/gsd/auto/orchestrator.js +28 -10
- package/dist/resources/extensions/gsd/auto/session.js +11 -0
- package/dist/resources/extensions/gsd/auto/verification-retry-policy.js +1 -1
- package/dist/resources/extensions/gsd/auto/workflow-kernel.js +15 -1
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +108 -19
- package/dist/resources/extensions/gsd/auto-budget.js +5 -1
- package/dist/resources/extensions/gsd/auto-dispatch.js +62 -27
- package/dist/resources/extensions/gsd/auto-model-selection.js +8 -5
- package/dist/resources/extensions/gsd/auto-post-unit.js +28 -22
- package/dist/resources/extensions/gsd/auto-prompts.js +68 -43
- package/dist/resources/extensions/gsd/auto-recovery.js +14 -483
- package/dist/resources/extensions/gsd/auto-runtime-state.js +17 -5
- package/dist/resources/extensions/gsd/auto-start.js +56 -30
- package/dist/resources/extensions/gsd/auto-timeout-recovery.js +3 -3
- package/dist/resources/extensions/gsd/auto-verification.js +10 -4
- package/dist/resources/extensions/gsd/auto-worktree.js +117 -91
- package/dist/resources/extensions/gsd/auto.js +40 -15
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +141 -65
- package/dist/resources/extensions/gsd/bootstrap/core-session-tools.js +39 -0
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +11 -5
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -0
- package/dist/resources/extensions/gsd/bootstrap/fallback-continuation.js +25 -0
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +23 -1
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +117 -27
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +190 -43
- package/dist/resources/extensions/gsd/bootstrap/tool-call-loop-guard.js +96 -10
- package/dist/resources/extensions/gsd/bootstrap/tool-search-shim.js +22 -3
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +73 -16
- package/dist/resources/extensions/gsd/closeout-consistency-gate.js +95 -5
- package/dist/resources/extensions/gsd/codebase-generator.js +5 -8
- package/dist/resources/extensions/gsd/commands/catalog.js +6 -0
- package/dist/resources/extensions/gsd/commands/dispatcher.js +3 -0
- package/dist/resources/extensions/gsd/commands/gsd-core-aliases-handler.js +39 -0
- package/dist/resources/extensions/gsd/commands/gsd-core-aliases.js +44 -0
- package/dist/resources/extensions/gsd/commands/handlers/auto.js +1 -1
- package/dist/resources/extensions/gsd/commands/handlers/core.js +30 -0
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +225 -1
- package/dist/resources/extensions/gsd/commands-cmux.js +3 -1
- package/dist/resources/extensions/gsd/commands-context.js +19 -1
- package/dist/resources/extensions/gsd/commands-gsd-core.js +868 -0
- package/dist/resources/extensions/gsd/commands-handlers.js +67 -1
- package/dist/resources/extensions/gsd/commands-maintenance.js +79 -2
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +23 -12
- package/dist/resources/extensions/gsd/commands-usage.js +1 -1
- package/dist/resources/extensions/gsd/commands-verdict.js +17 -11
- package/dist/resources/extensions/gsd/commands-worktree.js +12 -10
- package/dist/resources/extensions/gsd/compat/compat-marker.js +172 -0
- package/dist/resources/extensions/gsd/compat/index.js +3 -0
- package/dist/resources/extensions/gsd/compat/planning-compat.js +142 -0
- package/dist/resources/extensions/gsd/config-overlay.js +2 -2
- package/dist/resources/extensions/gsd/consent-question.js +12 -0
- package/dist/resources/extensions/gsd/consent-verdict.js +10 -0
- package/dist/resources/extensions/gsd/dashboard-overlay.js +71 -6
- package/dist/resources/extensions/gsd/db/engine.js +31 -1
- package/dist/resources/extensions/gsd/db/queries.js +114 -0
- package/dist/resources/extensions/gsd/db/unit-dispatches.js +22 -1
- package/dist/resources/extensions/gsd/db-memory-fts-schema.js +34 -0
- package/dist/resources/extensions/gsd/db-workspace.js +68 -4
- package/dist/resources/extensions/gsd/delegation-policy.js +1 -1
- package/dist/resources/extensions/gsd/discussion-handoff.js +9 -5
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +2 -2
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +192 -4
- package/dist/resources/extensions/gsd/doctor-git-checks.js +25 -3
- package/dist/resources/extensions/gsd/doctor-providers.js +92 -8
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +5 -15
- package/dist/resources/extensions/gsd/doctor.js +28 -7
- package/dist/resources/extensions/gsd/error-classifier.js +13 -1
- package/dist/resources/extensions/gsd/escalation.js +11 -4
- package/dist/resources/extensions/gsd/exec-sandbox.js +53 -11
- package/dist/resources/extensions/gsd/export-html.js +10 -3
- package/dist/resources/extensions/gsd/export.js +73 -0
- package/dist/resources/extensions/gsd/file-lock.js +1 -1
- package/dist/resources/extensions/gsd/flat-phase-migration.js +221 -0
- package/dist/resources/extensions/gsd/forensics.js +4 -33
- package/dist/resources/extensions/gsd/git-service.js +68 -8
- package/dist/resources/extensions/gsd/gitignore.js +10 -3
- package/dist/resources/extensions/gsd/guidance.js +7 -7
- package/dist/resources/extensions/gsd/guided-flow-queue.js +66 -5
- package/dist/resources/extensions/gsd/guided-flow.js +11 -6
- package/dist/resources/extensions/gsd/health-widget.js +55 -29
- package/dist/resources/extensions/gsd/json-persistence.js +20 -0
- package/dist/resources/extensions/gsd/knowledge-backfill.js +18 -11
- package/dist/resources/extensions/gsd/layout-policy.js +77 -0
- package/dist/resources/extensions/gsd/markdown-renderer.js +396 -122
- package/dist/resources/extensions/gsd/mcp-filter.js +44 -10
- package/dist/resources/extensions/gsd/md-importer.js +153 -51
- package/dist/resources/extensions/gsd/memory-backfill.js +28 -21
- package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +44 -21
- package/dist/resources/extensions/gsd/metrics.js +22 -14
- package/dist/resources/extensions/gsd/migrate/layout-detect.js +32 -0
- package/dist/resources/extensions/gsd/migrate/planning-writer.js +203 -0
- package/dist/resources/extensions/gsd/migrate-external.js +62 -8
- package/dist/resources/extensions/gsd/migration-auto-check.js +27 -14
- package/dist/resources/extensions/gsd/milestone-actions.js +5 -3
- package/dist/resources/extensions/gsd/milestone-closeout.js +12 -2
- package/dist/resources/extensions/gsd/milestone-ids.js +79 -18
- package/dist/resources/extensions/gsd/milestone-implementation-evidence.js +26 -20
- package/dist/resources/extensions/gsd/milestone-planning-persistence.js +8 -0
- package/dist/resources/extensions/gsd/milestone-validation-verdict.js +7 -4
- package/dist/resources/extensions/gsd/model-router.js +79 -20
- package/dist/resources/extensions/gsd/notification-store.js +22 -29
- package/dist/resources/extensions/gsd/notifications.js +36 -7
- package/dist/resources/extensions/gsd/observability-validator.js +12 -4
- package/dist/resources/extensions/gsd/orphan-stash-audit.js +92 -16
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +133 -35
- package/dist/resources/extensions/gsd/parsers-legacy.js +40 -14
- package/dist/resources/extensions/gsd/paths.js +356 -44
- package/dist/resources/extensions/gsd/planning-depth.js +2 -1
- package/dist/resources/extensions/gsd/post-execution-checks.js +26 -3
- package/dist/resources/extensions/gsd/preferences-models.js +23 -11
- package/dist/resources/extensions/gsd/preferences.js +62 -13
- package/dist/resources/extensions/gsd/prompts/ai-integration-phase.md +28 -0
- package/dist/resources/extensions/gsd/prompts/audit-fix.md +39 -0
- package/dist/resources/extensions/gsd/prompts/audit-milestone.md +26 -0
- package/dist/resources/extensions/gsd/prompts/audit-uat.md +24 -0
- package/dist/resources/extensions/gsd/prompts/autonomous.md +31 -0
- package/dist/resources/extensions/gsd/prompts/code-review.md +39 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +21 -16
- package/dist/resources/extensions/gsd/prompts/discuss-phase.md +31 -0
- package/dist/resources/extensions/gsd/prompts/docs-update.md +13 -0
- package/dist/resources/extensions/gsd/prompts/execute-phase.md +33 -0
- package/dist/resources/extensions/gsd/prompts/explore.md +58 -0
- package/dist/resources/extensions/gsd/prompts/graphify.md +27 -0
- package/dist/resources/extensions/gsd/prompts/health.md +37 -0
- package/dist/resources/extensions/gsd/prompts/import.md +30 -0
- package/dist/resources/extensions/gsd/prompts/inbox.md +27 -0
- package/dist/resources/extensions/gsd/prompts/ingest-docs.md +30 -0
- package/dist/resources/extensions/gsd/prompts/manager.md +21 -0
- package/dist/resources/extensions/gsd/prompts/map-codebase.md +42 -0
- package/dist/resources/extensions/gsd/prompts/milestone-summary.md +27 -0
- package/dist/resources/extensions/gsd/prompts/mvp-phase.md +23 -0
- package/dist/resources/extensions/gsd/prompts/pause-work.md +24 -0
- package/dist/resources/extensions/gsd/prompts/phase.md +22 -0
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +2 -2
- package/dist/resources/extensions/gsd/prompts/plan-phase.md +34 -0
- package/dist/resources/extensions/gsd/prompts/plan-review-convergence.md +34 -0
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +3 -3
- package/dist/resources/extensions/gsd/prompts/profile-user.md +28 -0
- package/dist/resources/extensions/gsd/prompts/progress.md +30 -0
- package/dist/resources/extensions/gsd/prompts/resume-work.md +20 -0
- package/dist/resources/extensions/gsd/prompts/review-backlog.md +21 -0
- package/dist/resources/extensions/gsd/prompts/review.md +27 -0
- package/dist/resources/extensions/gsd/prompts/secure-phase.md +24 -0
- package/dist/resources/extensions/gsd/prompts/settings.md +24 -0
- package/dist/resources/extensions/gsd/prompts/sketch.md +59 -0
- package/dist/resources/extensions/gsd/prompts/spec-phase.md +29 -0
- package/dist/resources/extensions/gsd/prompts/spike.md +59 -0
- package/dist/resources/extensions/gsd/prompts/stats.md +43 -0
- package/dist/resources/extensions/gsd/prompts/surface.md +25 -0
- package/dist/resources/extensions/gsd/prompts/thread.md +24 -0
- package/dist/resources/extensions/gsd/prompts/ui-phase.md +29 -0
- package/dist/resources/extensions/gsd/prompts/ui-review.md +29 -0
- package/dist/resources/extensions/gsd/prompts/ultraplan-phase.md +24 -0
- package/dist/resources/extensions/gsd/prompts/validate-phase.md +26 -0
- package/dist/resources/extensions/gsd/prompts/verify-work.md +24 -0
- package/dist/resources/extensions/gsd/prompts/workspace.md +22 -0
- package/dist/resources/extensions/gsd/prompts/workstreams.md +24 -0
- package/dist/resources/extensions/gsd/queue-order.js +3 -2
- package/dist/resources/extensions/gsd/quick.js +45 -2
- package/dist/resources/extensions/gsd/recovery-classification.js +8 -0
- package/dist/resources/extensions/gsd/roadmap-slices.js +1 -1
- package/dist/resources/extensions/gsd/root-write-leak-guard.js +7 -1
- package/dist/resources/extensions/gsd/safety/content-validator.js +2 -1
- package/dist/resources/extensions/gsd/safety/destructive-guard.js +8 -1
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +16 -1
- package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +43 -1
- package/dist/resources/extensions/gsd/safety/file-change-validator.js +5 -2
- package/dist/resources/extensions/gsd/service-tier.js +2 -1
- package/dist/resources/extensions/gsd/session-forensics.js +11 -1
- package/dist/resources/extensions/gsd/session-lock.js +7 -6
- package/dist/resources/extensions/gsd/skills/gsd-headless/SKILL.md +3 -0
- package/dist/resources/extensions/gsd/skills/gsd-headless/references/commands.md +51 -0
- package/dist/resources/extensions/gsd/state/derive/cache.js +28 -0
- package/dist/resources/extensions/gsd/state/derive/db-open.js +39 -0
- package/dist/resources/extensions/gsd/state/derive/from-db.js +452 -0
- package/dist/resources/extensions/gsd/state/derive/index.js +75 -0
- package/dist/resources/extensions/gsd/state/derive/interrupted-work.js +21 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +38 -4
- package/dist/resources/extensions/gsd/state-reconciliation/drift/completion.js +24 -3
- package/dist/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.js +82 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.js +142 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +19 -6
- package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +2 -2
- package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-render.js +138 -19
- package/dist/resources/extensions/gsd/state-reconciliation/index.js +84 -26
- package/dist/resources/extensions/gsd/state-reconciliation/registry.js +34 -18
- package/dist/resources/extensions/gsd/state.js +13 -581
- package/dist/resources/extensions/gsd/sync-lock.js +11 -18
- package/dist/resources/extensions/gsd/tool-surface-readiness.js +205 -16
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +8 -4
- package/dist/resources/extensions/gsd/tools/complete-slice.js +14 -4
- package/dist/resources/extensions/gsd/tools/complete-task.js +58 -15
- package/dist/resources/extensions/gsd/tools/exec-tool.js +7 -2
- package/dist/resources/extensions/gsd/tools/plan-slice.js +60 -47
- package/dist/resources/extensions/gsd/tools/plan-task.js +40 -2
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +9 -3
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +8 -3
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +44 -5
- package/dist/resources/extensions/gsd/triage-resolution.js +14 -7
- package/dist/resources/extensions/gsd/undo.js +51 -15
- package/dist/resources/extensions/gsd/unit-context-composer.js +23 -7
- package/dist/resources/extensions/gsd/unit-registry.js +63 -9
- package/dist/resources/extensions/gsd/unmerged-milestone-guard.js +91 -5
- package/dist/resources/extensions/gsd/validation-block-guard.js +54 -4
- package/dist/resources/extensions/gsd/verification-gate.js +7 -0
- package/dist/resources/extensions/gsd/visualizer-data.js +35 -0
- package/dist/resources/extensions/gsd/visualizer-views.js +21 -2
- package/dist/resources/extensions/gsd/workflow-manifest.js +126 -13
- package/dist/resources/extensions/gsd/workflow-mcp.js +9 -1
- package/dist/resources/extensions/gsd/workflow-projections.js +44 -18
- package/dist/resources/extensions/gsd/workspace-git-preflight.js +30 -1
- package/dist/resources/extensions/gsd/worktree-command.js +6 -6
- package/dist/resources/extensions/gsd/worktree-health.js +6 -3
- package/dist/resources/extensions/gsd/worktree-manager.js +59 -17
- package/dist/resources/extensions/gsd/worktree-safety.js +20 -11
- package/dist/resources/extensions/mcp-client/manager.js +3 -3
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/update-check.js +15 -4
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +9 -9
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +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/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
- 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/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +11 -11
- package/dist/web/standalone/.next/server/chunks/1128.js +1 -1
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
- package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/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/static/chunks/{2659.b7b129ee6a769448.js → 2659.58e950899a9bb82f.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/2772.a7c1fcc69a4685ef.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{3616.3c60753b8ffcbd2e.js → 3616.61a2af74bb8833c8.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{4283.e4873b058df143a1.js → 4283.d0d9e0a955e441cb.js} +2 -2
- package/dist/web/standalone/.next/static/chunks/{5826.a46ecdd1cfe8dabc.js → 5826.5421d66c72b9f34e.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/8785.e29b3134cab1d153.js +1 -0
- package/dist/web/standalone/.next/static/chunks/8937.640dc9c2aaa1dfad.js +10 -0
- package/dist/web/standalone/.next/static/chunks/app/{page-a48b7c48333b31c8.js → page-bc4c723c6a19c6f0.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/webpack-9c401904f87ded16.js +1 -0
- package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web-mode.d.ts +3 -1
- package/dist/web-mode.js +7 -5
- package/integrations/hermes/README.md +48 -0
- package/integrations/hermes/docs/setup.md +272 -0
- package/integrations/hermes/docs/upstream-hermes-pr.md +40 -0
- package/integrations/hermes/open_gsd_hermes/__init__.py +105 -0
- package/integrations/hermes/open_gsd_hermes/binding.py +107 -0
- package/integrations/hermes/open_gsd_hermes/commands.py +186 -0
- package/integrations/hermes/open_gsd_hermes/config.py +59 -0
- package/integrations/hermes/open_gsd_hermes/credentials.py +51 -0
- package/integrations/hermes/open_gsd_hermes/cron.py +85 -0
- package/integrations/hermes/open_gsd_hermes/formatting.py +13 -0
- package/integrations/hermes/open_gsd_hermes/gsd_client.py +269 -0
- package/integrations/hermes/open_gsd_hermes/inject.py +31 -0
- package/integrations/hermes/open_gsd_hermes/memory.py +66 -0
- package/integrations/hermes/open_gsd_hermes/notifications.py +71 -0
- package/integrations/hermes/open_gsd_hermes/snapshot.py +42 -0
- package/integrations/hermes/open_gsd_hermes/supervisor.py +180 -0
- package/integrations/hermes/open_gsd_hermes/types.py +100 -0
- package/integrations/hermes/plugin.yaml +38 -0
- package/integrations/hermes/pyproject.toml +32 -0
- package/integrations/hermes/scripts/preflight.sh +92 -0
- package/integrations/hermes/tests/fixtures/minimal-project/.gsd/STATE.md +17 -0
- package/integrations/hermes/tests/golden/memory_prefetch.txt +5 -0
- package/integrations/hermes/tests/golden/snapshot.txt +8 -0
- package/integrations/hermes/tests/test_binding.py +103 -0
- package/integrations/hermes/tests/test_config.py +36 -0
- package/integrations/hermes/tests/test_cron.py +34 -0
- package/integrations/hermes/tests/test_gsd_client_cache.py +120 -0
- package/integrations/hermes/tests/test_memory.py +59 -0
- package/integrations/hermes/tests/test_read_cli_contract.py +50 -0
- package/integrations/hermes/tests/test_register.py +56 -0
- package/integrations/hermes/tests/test_snapshot.py +53 -0
- package/integrations/hermes/tests/test_supervisor_fsm.py +581 -0
- package/package.json +7 -6
- package/packages/cloud-mcp-gateway/dist/runtime-registry.d.ts +8 -0
- package/packages/cloud-mcp-gateway/dist/runtime-registry.d.ts.map +1 -1
- package/packages/cloud-mcp-gateway/dist/runtime-registry.js +19 -2
- package/packages/cloud-mcp-gateway/dist/runtime-registry.js.map +1 -1
- package/packages/cloud-mcp-gateway/dist/runtime-registry.test.js +71 -2
- package/packages/cloud-mcp-gateway/dist/runtime-registry.test.js.map +1 -1
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/dist/workflow.d.ts +1 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js +2 -0
- 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/agent-session.d.ts +1 -0
- package/packages/gsd-agent-core/dist/agent-session.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/agent-session.js +3 -0
- package/packages/gsd-agent-core/dist/agent-session.js.map +1 -1
- package/packages/gsd-agent-core/dist/extension-ui-snapshot.d.ts +41 -0
- package/packages/gsd-agent-core/dist/extension-ui-snapshot.d.ts.map +1 -0
- package/packages/gsd-agent-core/dist/extension-ui-snapshot.js +62 -0
- package/packages/gsd-agent-core/dist/extension-ui-snapshot.js.map +1 -0
- package/packages/gsd-agent-core/dist/index.d.ts +2 -0
- package/packages/gsd-agent-core/dist/index.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/index.js +2 -0
- package/packages/gsd-agent-core/dist/index.js.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-events.js +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-events.js.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts +1 -0
- package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-host.js.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-prompt.d.ts +5 -0
- package/packages/gsd-agent-core/dist/session/agent-session-prompt.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-prompt.js +60 -3
- package/packages/gsd-agent-core/dist/session/agent-session-prompt.js.map +1 -1
- package/packages/gsd-agent-core/dist/transcript-store.d.ts +58 -0
- package/packages/gsd-agent-core/dist/transcript-store.d.ts.map +1 -0
- package/packages/gsd-agent-core/dist/transcript-store.js +132 -0
- package/packages/gsd-agent-core/dist/transcript-store.js.map +1 -0
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +2 -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 +25 -11
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.d.ts +4 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.js +7 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts +3 -24
- 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 +26 -829
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.d.ts +58 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.js +312 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.d.ts +31 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.js +130 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.d.ts +15 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js +258 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.d.ts +13 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.js +118 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts +9 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.d.ts +54 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.js +20 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +4 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +9 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.d.ts +56 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.js +44 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.d.ts +5 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.js +77 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.js +23 -5
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.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 +18 -0
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/README.md +11 -1
- package/packages/mcp-server/dist/cli-errors.d.ts +11 -0
- package/packages/mcp-server/dist/cli-errors.d.ts.map +1 -1
- package/packages/mcp-server/dist/cli-errors.js +12 -0
- package/packages/mcp-server/dist/cli-errors.js.map +1 -1
- package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -1
- package/packages/mcp-server/dist/cli-runner.js +33 -0
- package/packages/mcp-server/dist/cli-runner.js.map +1 -1
- package/packages/mcp-server/dist/cli.d.ts +1 -0
- package/packages/mcp-server/dist/cli.d.ts.map +1 -1
- package/packages/mcp-server/dist/cli.js +1 -0
- package/packages/mcp-server/dist/cli.js.map +1 -1
- package/packages/mcp-server/dist/server.d.ts +30 -1
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +85 -6
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +13 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +35 -21
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +21 -5
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +3 -2
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +46 -0
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +38 -0
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/README.md +3 -2
- package/packages/pi-coding-agent/dist/core/session-manager-context.d.ts +9 -0
- package/packages/pi-coding-agent/dist/core/session-manager-context.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-context.js +94 -0
- package/packages/pi-coding-agent/dist/core/session-manager-context.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-list.d.ts +8 -0
- package/packages/pi-coding-agent/dist/core/session-manager-list.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-list.js +244 -0
- package/packages/pi-coding-agent/dist/core/session-manager-list.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-migration.d.ts +12 -0
- package/packages/pi-coding-agent/dist/core/session-manager-migration.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-migration.js +84 -0
- package/packages/pi-coding-agent/dist/core/session-manager-migration.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts +135 -0
- package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-types.js +2 -0
- package/packages/pi-coding-agent/dist/core/session-manager-types.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager.d.ts +6 -154
- package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.js +22 -459
- package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme-schema.d.ts +75 -75
- package/packages/pi-coding-agent/dist/theme/theme-schema.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme-schema.js +1 -1
- package/packages/pi-coding-agent/dist/theme/theme-schema.js.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.js +11 -7
- package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/dist/theme/theme-schema.d.ts +75 -75
- package/pkg/dist/theme/theme-schema.d.ts.map +1 -1
- package/pkg/dist/theme/theme-schema.js +1 -1
- package/pkg/dist/theme/theme-schema.js.map +1 -1
- package/pkg/dist/theme/theme.d.ts.map +1 -1
- package/pkg/dist/theme/theme.js +11 -7
- package/pkg/dist/theme/theme.js.map +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +22 -22
- package/src/resources/extensions/claude-code-cli/index.ts +8 -1
- package/src/resources/extensions/claude-code-cli/models.ts +9 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +103 -22
- package/src/resources/extensions/claude-code-cli/tests/index.test.ts +61 -0
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +262 -10
- package/src/resources/extensions/google-cli/stream-adapter.ts +106 -19
- package/src/resources/extensions/gsd/artifact-verification.ts +464 -0
- package/src/resources/extensions/gsd/auto/dispatch-history.ts +19 -1
- package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
- package/src/resources/extensions/gsd/auto/loop.ts +69 -2
- package/src/resources/extensions/gsd/auto/orchestrator.ts +38 -13
- package/src/resources/extensions/gsd/auto/session.ts +14 -0
- package/src/resources/extensions/gsd/auto/verification-retry-policy.ts +3 -1
- package/src/resources/extensions/gsd/auto/workflow-kernel.ts +25 -3
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +129 -20
- package/src/resources/extensions/gsd/auto-budget.ts +12 -1
- package/src/resources/extensions/gsd/auto-dispatch.ts +68 -34
- package/src/resources/extensions/gsd/auto-model-selection.ts +8 -1
- package/src/resources/extensions/gsd/auto-post-unit.ts +37 -23
- package/src/resources/extensions/gsd/auto-prompts.ts +81 -44
- package/src/resources/extensions/gsd/auto-recovery.ts +21 -484
- package/src/resources/extensions/gsd/auto-runtime-state.ts +17 -5
- package/src/resources/extensions/gsd/auto-start.ts +63 -34
- package/src/resources/extensions/gsd/auto-timeout-recovery.ts +3 -2
- package/src/resources/extensions/gsd/auto-verification.ts +10 -8
- package/src/resources/extensions/gsd/auto-worktree.ts +48 -15
- package/src/resources/extensions/gsd/auto.ts +46 -11
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +164 -71
- package/src/resources/extensions/gsd/bootstrap/core-session-tools.ts +44 -0
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +11 -5
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -0
- package/src/resources/extensions/gsd/bootstrap/fallback-continuation.ts +31 -0
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +23 -1
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +139 -27
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +219 -46
- package/src/resources/extensions/gsd/bootstrap/tests/write-gate-basepath.test.ts +49 -1
- package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +104 -10
- package/src/resources/extensions/gsd/bootstrap/tool-search-shim.ts +21 -3
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +86 -18
- package/src/resources/extensions/gsd/closeout-consistency-gate.ts +109 -4
- package/src/resources/extensions/gsd/codebase-generator.ts +6 -9
- package/src/resources/extensions/gsd/commands/catalog.ts +6 -0
- package/src/resources/extensions/gsd/commands/dispatcher.ts +3 -0
- package/src/resources/extensions/gsd/commands/gsd-core-aliases-handler.ts +48 -0
- package/src/resources/extensions/gsd/commands/gsd-core-aliases.ts +63 -0
- package/src/resources/extensions/gsd/commands/handlers/auto.ts +1 -1
- package/src/resources/extensions/gsd/commands/handlers/core.ts +31 -0
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +225 -1
- package/src/resources/extensions/gsd/commands-cmux.ts +3 -0
- package/src/resources/extensions/gsd/commands-context.ts +18 -1
- package/src/resources/extensions/gsd/commands-gsd-core.ts +1142 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +76 -1
- package/src/resources/extensions/gsd/commands-maintenance.ts +98 -2
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +21 -10
- package/src/resources/extensions/gsd/commands-usage.ts +1 -1
- package/src/resources/extensions/gsd/commands-verdict.ts +16 -15
- package/src/resources/extensions/gsd/commands-worktree.ts +12 -10
- package/src/resources/extensions/gsd/compat/compat-marker.ts +210 -0
- package/src/resources/extensions/gsd/compat/index.ts +12 -0
- package/src/resources/extensions/gsd/compat/planning-compat.ts +168 -0
- package/src/resources/extensions/gsd/config-overlay.ts +3 -1
- package/src/resources/extensions/gsd/consent-question.ts +11 -1
- package/src/resources/extensions/gsd/consent-verdict.ts +30 -1
- package/src/resources/extensions/gsd/dashboard-overlay.ts +73 -7
- package/src/resources/extensions/gsd/db/engine.ts +34 -1
- package/src/resources/extensions/gsd/db/queries.ts +157 -0
- package/src/resources/extensions/gsd/db/unit-dispatches.ts +24 -0
- package/src/resources/extensions/gsd/db-memory-fts-schema.ts +45 -0
- package/src/resources/extensions/gsd/db-workspace.ts +76 -3
- package/src/resources/extensions/gsd/delegation-policy.ts +1 -1
- package/src/resources/extensions/gsd/discussion-handoff.ts +9 -5
- package/src/resources/extensions/gsd/docs/preferences-reference.md +2 -2
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +233 -5
- package/src/resources/extensions/gsd/doctor-git-checks.ts +24 -2
- package/src/resources/extensions/gsd/doctor-providers.ts +103 -9
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +5 -15
- package/src/resources/extensions/gsd/doctor-types.ts +4 -0
- package/src/resources/extensions/gsd/doctor.ts +30 -7
- package/src/resources/extensions/gsd/error-classifier.ts +14 -1
- package/src/resources/extensions/gsd/escalation.ts +9 -4
- package/src/resources/extensions/gsd/exec-sandbox.ts +56 -11
- package/src/resources/extensions/gsd/export-html.ts +11 -4
- package/src/resources/extensions/gsd/export.ts +88 -1
- package/src/resources/extensions/gsd/file-lock.ts +1 -1
- package/src/resources/extensions/gsd/flat-phase-migration.ts +249 -0
- package/src/resources/extensions/gsd/forensics.ts +4 -34
- package/src/resources/extensions/gsd/git-constants.ts +1 -1
- package/src/resources/extensions/gsd/git-service.ts +76 -7
- package/src/resources/extensions/gsd/gitignore.ts +11 -4
- package/src/resources/extensions/gsd/guidance.ts +7 -7
- package/src/resources/extensions/gsd/guided-flow-queue.ts +89 -4
- package/src/resources/extensions/gsd/guided-flow.ts +11 -6
- package/src/resources/extensions/gsd/health-widget.ts +69 -32
- package/src/resources/extensions/gsd/json-persistence.ts +20 -0
- package/src/resources/extensions/gsd/knowledge-backfill.ts +16 -10
- package/src/resources/extensions/gsd/layout-policy.ts +86 -0
- package/src/resources/extensions/gsd/markdown-renderer.ts +409 -112
- package/src/resources/extensions/gsd/mcp-filter.ts +59 -10
- package/src/resources/extensions/gsd/md-importer.ts +215 -65
- package/src/resources/extensions/gsd/memory-backfill.ts +26 -20
- package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +51 -19
- package/src/resources/extensions/gsd/metrics.ts +26 -13
- package/src/resources/extensions/gsd/migrate/layout-detect.ts +38 -0
- package/src/resources/extensions/gsd/migrate/planning-writer.ts +259 -0
- package/src/resources/extensions/gsd/migrate-external.ts +57 -8
- package/src/resources/extensions/gsd/migration-auto-check.ts +27 -13
- package/src/resources/extensions/gsd/milestone-actions.ts +5 -2
- package/src/resources/extensions/gsd/milestone-closeout.ts +13 -2
- package/src/resources/extensions/gsd/milestone-ids.ts +78 -19
- package/src/resources/extensions/gsd/milestone-implementation-evidence.ts +35 -21
- package/src/resources/extensions/gsd/milestone-planning-persistence.ts +8 -0
- package/src/resources/extensions/gsd/milestone-validation-verdict.ts +7 -9
- package/src/resources/extensions/gsd/model-router.ts +98 -18
- package/src/resources/extensions/gsd/notification-store.ts +17 -28
- package/src/resources/extensions/gsd/notifications.ts +37 -6
- package/src/resources/extensions/gsd/observability-validator.ts +12 -4
- package/src/resources/extensions/gsd/orphan-stash-audit.ts +108 -20
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +151 -31
- package/src/resources/extensions/gsd/parsers-legacy.ts +42 -15
- package/src/resources/extensions/gsd/paths.ts +348 -39
- package/src/resources/extensions/gsd/planning-depth.ts +2 -1
- package/src/resources/extensions/gsd/post-execution-checks.ts +43 -3
- package/src/resources/extensions/gsd/preferences-models.ts +25 -9
- package/src/resources/extensions/gsd/preferences.ts +80 -12
- package/src/resources/extensions/gsd/prompts/ai-integration-phase.md +28 -0
- package/src/resources/extensions/gsd/prompts/audit-fix.md +39 -0
- package/src/resources/extensions/gsd/prompts/audit-milestone.md +26 -0
- package/src/resources/extensions/gsd/prompts/audit-uat.md +24 -0
- package/src/resources/extensions/gsd/prompts/autonomous.md +31 -0
- package/src/resources/extensions/gsd/prompts/code-review.md +39 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +21 -16
- package/src/resources/extensions/gsd/prompts/discuss-phase.md +31 -0
- package/src/resources/extensions/gsd/prompts/docs-update.md +13 -0
- package/src/resources/extensions/gsd/prompts/execute-phase.md +33 -0
- package/src/resources/extensions/gsd/prompts/explore.md +58 -0
- package/src/resources/extensions/gsd/prompts/graphify.md +27 -0
- package/src/resources/extensions/gsd/prompts/health.md +37 -0
- package/src/resources/extensions/gsd/prompts/import.md +30 -0
- package/src/resources/extensions/gsd/prompts/inbox.md +27 -0
- package/src/resources/extensions/gsd/prompts/ingest-docs.md +30 -0
- package/src/resources/extensions/gsd/prompts/manager.md +21 -0
- package/src/resources/extensions/gsd/prompts/map-codebase.md +42 -0
- package/src/resources/extensions/gsd/prompts/milestone-summary.md +27 -0
- package/src/resources/extensions/gsd/prompts/mvp-phase.md +23 -0
- package/src/resources/extensions/gsd/prompts/pause-work.md +24 -0
- package/src/resources/extensions/gsd/prompts/phase.md +22 -0
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +2 -2
- package/src/resources/extensions/gsd/prompts/plan-phase.md +34 -0
- package/src/resources/extensions/gsd/prompts/plan-review-convergence.md +34 -0
- package/src/resources/extensions/gsd/prompts/plan-slice.md +3 -3
- package/src/resources/extensions/gsd/prompts/profile-user.md +28 -0
- package/src/resources/extensions/gsd/prompts/progress.md +30 -0
- package/src/resources/extensions/gsd/prompts/resume-work.md +20 -0
- package/src/resources/extensions/gsd/prompts/review-backlog.md +21 -0
- package/src/resources/extensions/gsd/prompts/review.md +27 -0
- package/src/resources/extensions/gsd/prompts/secure-phase.md +24 -0
- package/src/resources/extensions/gsd/prompts/settings.md +24 -0
- package/src/resources/extensions/gsd/prompts/sketch.md +59 -0
- package/src/resources/extensions/gsd/prompts/spec-phase.md +29 -0
- package/src/resources/extensions/gsd/prompts/spike.md +59 -0
- package/src/resources/extensions/gsd/prompts/stats.md +43 -0
- package/src/resources/extensions/gsd/prompts/surface.md +25 -0
- package/src/resources/extensions/gsd/prompts/thread.md +24 -0
- package/src/resources/extensions/gsd/prompts/ui-phase.md +29 -0
- package/src/resources/extensions/gsd/prompts/ui-review.md +29 -0
- package/src/resources/extensions/gsd/prompts/ultraplan-phase.md +24 -0
- package/src/resources/extensions/gsd/prompts/validate-phase.md +26 -0
- package/src/resources/extensions/gsd/prompts/verify-work.md +24 -0
- package/src/resources/extensions/gsd/prompts/workspace.md +22 -0
- package/src/resources/extensions/gsd/prompts/workstreams.md +24 -0
- package/src/resources/extensions/gsd/queue-order.ts +3 -2
- package/src/resources/extensions/gsd/quick.ts +43 -2
- package/src/resources/extensions/gsd/recovery-classification.ts +7 -0
- package/src/resources/extensions/gsd/roadmap-slices.ts +1 -1
- package/src/resources/extensions/gsd/root-write-leak-guard.ts +13 -1
- package/src/resources/extensions/gsd/safety/content-validator.ts +2 -1
- package/src/resources/extensions/gsd/safety/destructive-guard.ts +9 -1
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +16 -1
- package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +45 -1
- package/src/resources/extensions/gsd/safety/file-change-validator.ts +8 -2
- package/src/resources/extensions/gsd/service-tier.ts +2 -0
- package/src/resources/extensions/gsd/session-forensics.ts +11 -1
- package/src/resources/extensions/gsd/session-lock.ts +7 -6
- package/src/resources/extensions/gsd/skills/gsd-headless/SKILL.md +3 -0
- package/src/resources/extensions/gsd/skills/gsd-headless/references/commands.md +51 -0
- package/src/resources/extensions/gsd/state/derive/cache.ts +46 -0
- package/src/resources/extensions/gsd/state/derive/db-open.ts +45 -0
- package/src/resources/extensions/gsd/state/derive/from-db.ts +561 -0
- package/src/resources/extensions/gsd/state/derive/index.ts +104 -0
- package/src/resources/extensions/gsd/state/derive/interrupted-work.ts +31 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +35 -4
- package/src/resources/extensions/gsd/state-reconciliation/drift/completion.ts +22 -2
- package/src/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.ts +105 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.ts +180 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +19 -6
- package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +2 -2
- package/src/resources/extensions/gsd/state-reconciliation/drift/stale-render.ts +176 -30
- package/src/resources/extensions/gsd/state-reconciliation/index.ts +86 -27
- package/src/resources/extensions/gsd/state-reconciliation/registry.ts +45 -18
- package/src/resources/extensions/gsd/state-reconciliation/types.ts +19 -0
- package/src/resources/extensions/gsd/state.ts +37 -695
- package/src/resources/extensions/gsd/sync-lock.ts +11 -20
- package/src/resources/extensions/gsd/tests/__fixtures__/flat-phase/.gsd/phases/01-foundation/01-01-PLAN.md +13 -0
- package/src/resources/extensions/gsd/tests/__fixtures__/flat-phase/.gsd/phases/01-foundation/01-ROADMAP.md +8 -0
- package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/m001-basic/.gsd/milestones/M001/M001-ROADMAP.md +13 -0
- package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/m001-basic/.gsd/milestones/M001/slices/S01/S01-PLAN.md +5 -0
- package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/planning-flat-phases/.planning/PROJECT.md +1 -0
- package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/planning-flat-phases/.planning/ROADMAP.md +5 -0
- package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/planning-flat-phases/.planning/STATE.md +10 -0
- package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/planning-flat-phases/.planning/phases/01-foundation/01-01-PLAN.md +13 -0
- package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +4 -3
- package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +420 -2
- package/src/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +14 -5
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +104 -0
- package/src/resources/extensions/gsd/tests/auto-migrating-recovery.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +15 -12
- package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +11 -2
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +182 -4
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +146 -1
- package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-auto-resolve.test.ts +17 -0
- package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +15 -11
- package/src/resources/extensions/gsd/tests/commands-context.test.ts +26 -0
- package/src/resources/extensions/gsd/tests/commands-dispatcher-unmerged-milestone.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/commands-dispatcher-validation-block.test.ts +37 -1
- package/src/resources/extensions/gsd/tests/commands-eval-review.test.ts +31 -30
- package/src/resources/extensions/gsd/tests/commands-gsd-core.test.ts +863 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/commands-worktree-clean.test.ts +80 -0
- package/src/resources/extensions/gsd/tests/compat-health-line.test.ts +102 -0
- package/src/resources/extensions/gsd/tests/compat-marker-invalidation.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/compat-marker.test.ts +105 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +28 -0
- package/src/resources/extensions/gsd/tests/complete-slice-reopen-handoff.test.ts +151 -0
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +18 -7
- package/src/resources/extensions/gsd/tests/complete-task-rollback-evidence.test.ts +48 -8
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +82 -7
- package/src/resources/extensions/gsd/tests/consent-question.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/dashboard-overlay.test.ts +90 -0
- package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/db-memory-fts-schema.test.ts +58 -3
- package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +63 -1
- package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +49 -5
- package/src/resources/extensions/gsd/tests/destructive-guard.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/discuss-cold-start-db-open.test.ts +10 -27
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +20 -1
- package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +102 -0
- package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +175 -43
- package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +26 -1
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +7 -0
- package/src/resources/extensions/gsd/tests/doctor-forensics-db-open-regression.test.ts +70 -2
- package/src/resources/extensions/gsd/tests/doctor-git-checks-autoresolve.test.ts +149 -0
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +107 -0
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +239 -2
- package/src/resources/extensions/gsd/tests/ensure-preconditions-guard-4996.test.ts +17 -10
- package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +95 -0
- package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/exec-tool.test.ts +45 -1
- package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/export-memory.test.ts +179 -0
- package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/external-markdown-edit.test.ts +137 -0
- package/src/resources/extensions/gsd/tests/external-planning-edit.test.ts +199 -0
- package/src/resources/extensions/gsd/tests/fallback-continuation.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/file-lock.test.ts +43 -0
- package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +149 -0
- package/src/resources/extensions/gsd/tests/flat-phase-renderer.test.ts +83 -0
- package/src/resources/extensions/gsd/tests/flat-phase-round-trip.test.ts +72 -0
- package/src/resources/extensions/gsd/tests/flat-phase-validation-integration.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/flat-phase-validation-path.test.ts +74 -0
- package/src/resources/extensions/gsd/tests/forensics-error-filter.test.ts +88 -0
- package/src/resources/extensions/gsd/tests/gitignore-bg-shell-runtime.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/gsd-core-parity-routing.test.ts +183 -0
- package/src/resources/extensions/gsd/tests/guidance.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +268 -3
- package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +19 -11
- package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +6 -2
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +130 -3
- package/src/resources/extensions/gsd/tests/integration/gitignore-tracked-gsd.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/integration/idle-recovery.test.ts +4 -3
- package/src/resources/extensions/gsd/tests/integration/integration-proof.test.ts +11 -7
- package/src/resources/extensions/gsd/tests/integration/queue-active-milestone-context-budget.test.ts +93 -0
- package/src/resources/extensions/gsd/tests/integration/quick-branch-lifecycle.test.ts +56 -9
- package/src/resources/extensions/gsd/tests/json-persistence-atomic.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/knowledge-cold-start.test.ts +386 -0
- package/src/resources/extensions/gsd/tests/layout-policy.test.ts +59 -0
- package/src/resources/extensions/gsd/tests/markdown-renderer-parse-cache.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +214 -82
- package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +74 -1
- package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +78 -0
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +48 -0
- package/src/resources/extensions/gsd/tests/merge-closeout-consistency-gate.test.ts +31 -1
- package/src/resources/extensions/gsd/tests/metrics-ledger-cap.test.ts +239 -0
- package/src/resources/extensions/gsd/tests/metrics-prune-cache-invalidation.test.ts +6 -0
- package/src/resources/extensions/gsd/tests/metrics.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +57 -0
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +7 -2
- package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/model-router.test.ts +204 -7
- package/src/resources/extensions/gsd/tests/notification-store.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/notifications.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/observability-validator-boundary.test.ts +194 -0
- package/src/resources/extensions/gsd/tests/orchestrator-logs.test.ts +47 -1
- package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +91 -7
- package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +52 -1
- package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +91 -0
- package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +26 -0
- package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +4 -1
- package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/plan-milestone-boundary-map-preservation.test.ts +7 -2
- package/src/resources/extensions/gsd/tests/plan-milestone-sketch-render.test.ts +7 -2
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +9 -6
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +10 -0
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +161 -27
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +48 -5
- package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/planning-layout-detect.test.ts +84 -0
- package/src/resources/extensions/gsd/tests/planning-marker.test.ts +107 -0
- package/src/resources/extensions/gsd/tests/planning-projection-hook.test.ts +123 -0
- package/src/resources/extensions/gsd/tests/planning-round-trip-property.test.ts +164 -0
- package/src/resources/extensions/gsd/tests/planning-writer.test.ts +82 -0
- package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +48 -1
- package/src/resources/extensions/gsd/tests/post-mutation-hook.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/preferences.test.ts +47 -1
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +54 -1
- package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +50 -14
- package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +58 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +23 -6
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +301 -0
- package/src/resources/extensions/gsd/tests/read-uat-gate-verdict.test.ts +185 -0
- package/src/resources/extensions/gsd/tests/ready-phrase-no-files-4573.test.ts +22 -13
- package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +9 -8
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +166 -4
- package/src/resources/extensions/gsd/tests/register-hooks-loop-guard-auto.test.ts +103 -0
- package/src/resources/extensions/gsd/tests/replan-handler.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/root-write-leak-guard.test.ts +20 -1
- package/src/resources/extensions/gsd/tests/round-trip-property.test.ts +137 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +15 -3
- package/src/resources/extensions/gsd/tests/session-lock-transient-read.test.ts +28 -2
- package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +7 -1
- package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +56 -0
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +329 -57
- package/src/resources/extensions/gsd/tests/stop-backtrack.test.ts +6 -2
- package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +85 -0
- package/src/resources/extensions/gsd/tests/sync-lock.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +29 -1
- package/src/resources/extensions/gsd/tests/terminal-tool-surface-classification.test.ts +80 -0
- package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +208 -0
- package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +32 -3
- package/src/resources/extensions/gsd/tests/tool-schema-model-fallback.test.ts +64 -0
- package/src/resources/extensions/gsd/tests/tool-search-shim.test.ts +71 -0
- package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +26 -7
- package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/undo.test.ts +113 -37
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +212 -11
- package/src/resources/extensions/gsd/tests/unmerged-milestone-guard.test.ts +87 -0
- package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +110 -1
- package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +9 -1
- package/src/resources/extensions/gsd/tests/validation-block-guard.test.ts +130 -0
- package/src/resources/extensions/gsd/tests/validation-gate-patterns.test.ts +34 -6
- package/src/resources/extensions/gsd/tests/verification-retry-policy.test.ts +69 -4
- package/src/resources/extensions/gsd/tests/verify-artifact-tightened.test.ts +156 -0
- package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +87 -0
- package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +96 -15
- package/src/resources/extensions/gsd/tests/workflow-mcp-preflight.test.ts +134 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +42 -12
- package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +3 -4
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +70 -13
- package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +151 -2
- package/src/resources/extensions/gsd/tests/worktree-health.test.ts +43 -3
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +39 -18
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +4 -1
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +103 -0
- package/src/resources/extensions/gsd/tool-surface-readiness.ts +226 -16
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +7 -9
- package/src/resources/extensions/gsd/tools/complete-slice.ts +14 -11
- package/src/resources/extensions/gsd/tools/complete-task.ts +68 -16
- package/src/resources/extensions/gsd/tools/exec-tool.ts +7 -3
- package/src/resources/extensions/gsd/tools/plan-slice.ts +61 -50
- package/src/resources/extensions/gsd/tools/plan-task.ts +43 -2
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +9 -10
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +8 -13
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +43 -4
- package/src/resources/extensions/gsd/triage-resolution.ts +14 -7
- package/src/resources/extensions/gsd/undo.ts +55 -15
- package/src/resources/extensions/gsd/unit-context-composer.ts +33 -7
- package/src/resources/extensions/gsd/unit-registry.ts +63 -9
- package/src/resources/extensions/gsd/unmerged-milestone-guard.ts +101 -6
- package/src/resources/extensions/gsd/validation-block-guard.ts +59 -7
- package/src/resources/extensions/gsd/verification-gate.ts +8 -0
- package/src/resources/extensions/gsd/visualizer-data.ts +55 -0
- package/src/resources/extensions/gsd/visualizer-views.ts +27 -2
- package/src/resources/extensions/gsd/workflow-manifest.ts +141 -7
- package/src/resources/extensions/gsd/workflow-mcp.ts +12 -1
- package/src/resources/extensions/gsd/workflow-projections.ts +44 -18
- package/src/resources/extensions/gsd/workspace-git-preflight.ts +31 -0
- package/src/resources/extensions/gsd/worktree-command.ts +6 -6
- package/src/resources/extensions/gsd/worktree-health.ts +6 -3
- package/src/resources/extensions/gsd/worktree-manager.ts +72 -16
- package/src/resources/extensions/gsd/worktree-safety.ts +31 -11
- package/src/resources/extensions/mcp-client/manager.ts +3 -3
- package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +0 -1
- package/dist/web/standalone/.next/static/chunks/796.e0bdc932325d7e03.js +0 -10
- package/dist/web/standalone/.next/static/chunks/8785.2e5a118797fb2dd2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/webpack-f0285ce91d4ec9ef.js +0 -1
- /package/dist/web/standalone/.next/static/{Mh74c-rhxHjKHKoRwd2ij → zQLcXm0Za8lexoXtgDpMG}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{Mh74c-rhxHjKHKoRwd2ij → zQLcXm0Za8lexoXtgDpMG}/_ssgManifest.js +0 -0
|
@@ -19,7 +19,7 @@ import { setRuntimeKv, deleteRuntimeKv, } from "./db/runtime-kv.js";
|
|
|
19
19
|
import { extractSection, getManifestStatus, splitFrontmatter, parseFrontmatterMap } from "./files.js";
|
|
20
20
|
export { inlinePriorMilestoneSummary } from "./files.js";
|
|
21
21
|
import { collectSecretsFromManifest } from "../get-secrets-from-user.js";
|
|
22
|
-
import { gsdRoot, resolveMilestoneFile, resolveMilestonePath, resolveDir, milestonesDir, } from "./paths.js";
|
|
22
|
+
import { gsdRoot, resolveMilestoneFile, resolveMilestonePath, resolveDir, milestonesDir, legacyMilestonesDir, isLegacyMilestonesLayout, canonicalPhaseDirName, } from "./paths.js";
|
|
23
23
|
import { invalidateAllCaches } from "./cache.js";
|
|
24
24
|
import { clearActivityLogState } from "./activity-log.js";
|
|
25
25
|
import { synthesizeCrashRecovery, getDeepDiagnostic, readActiveMilestoneId, } from "./session-forensics.js";
|
|
@@ -27,7 +27,7 @@ import { writeLock, clearLock, clearStaleWorkerLock, readCrashLock, isLockProces
|
|
|
27
27
|
import { acquireSessionLock, getSessionLockStatus, releaseSessionLock, updateSessionLock, } from "./session-lock.js";
|
|
28
28
|
import { resolveAutoSupervisorConfig, loadEffectiveGSDPreferences, loadEffectiveGSDPreferencesWithRegistry, resolveProfileAnchorProvider, getIsolationMode, resolveEffectiveUnitIsolationMode, } from "./preferences.js";
|
|
29
29
|
import { playNotificationBell, sendDesktopNotification } from "./notifications.js";
|
|
30
|
-
import { getBudgetAlertLevel, getNewBudgetAlertLevel, getBudgetEnforcementAction, resolveCompactionThresholdPercent, shouldRerootStepSessionForContext, } from "./auto-budget.js";
|
|
30
|
+
import { getBudgetAlertLevel, getNewBudgetAlertLevel, getBudgetEnforcementAction, HARD_CONTEXT_REROOT_THRESHOLD_PERCENT, resolveCompactionThresholdPercent, shouldRerootStepSessionForContext, shouldWarnStepSessionForContext, } from "./auto-budget.js";
|
|
31
31
|
import { markToolStart as _markToolStart, markToolEnd as _markToolEnd, getOldestInFlightToolAgeMs as _getOldestInFlightToolAgeMs, clearInFlightTools, isToolInvocationError, isQueuedUserMessageSkip, isDeterministicPolicyError, } from "./auto-tool-tracking.js";
|
|
32
32
|
import { closeoutUnit } from "./auto-unit-closeout.js";
|
|
33
33
|
import { selectAndApplyModel, resolveModelId, clearToolBaseline } from "./auto-model-selection.js";
|
|
@@ -369,7 +369,7 @@ function getEffectiveUnitIsolationMode(basePath) {
|
|
|
369
369
|
* running suspiciously long (e.g., a Bash command hung because `&` kept stdout open).
|
|
370
370
|
*/
|
|
371
371
|
// Re-export budget utilities for external consumers
|
|
372
|
-
export { getBudgetAlertLevel, getNewBudgetAlertLevel, getBudgetEnforcementAction, getContextPauseAction, resolveCompactionThresholdPercent, shouldRerootStepSessionForContext, } from "./auto-budget.js";
|
|
372
|
+
export { getBudgetAlertLevel, getNewBudgetAlertLevel, getBudgetEnforcementAction, getContextPauseAction, resolveCompactionThresholdPercent, shouldRerootStepSessionForContext, shouldWarnStepSessionForContext, } from "./auto-budget.js";
|
|
373
373
|
function closeOutSignalInterruptedUnit(currentBasePath) {
|
|
374
374
|
const currentUnit = s.currentUnit;
|
|
375
375
|
if (!currentUnit)
|
|
@@ -904,9 +904,10 @@ export async function rerootCommandSession(cmdCtx, workspaceRoot) {
|
|
|
904
904
|
}
|
|
905
905
|
}
|
|
906
906
|
/**
|
|
907
|
-
* After a completed step-mode unit,
|
|
908
|
-
*
|
|
909
|
-
* re-
|
|
907
|
+
* After a completed step-mode unit, warn when usage reaches the configurable
|
|
908
|
+
* soft context threshold. At the fixed hard boundary, write a context-mode
|
|
909
|
+
* snapshot and re-root the visible command session while leaving the NEXT
|
|
910
|
+
* progress surface.
|
|
910
911
|
*/
|
|
911
912
|
export async function maybeRerootStepSessionForHighContext(ctx, workspaceRoot, cmdCtx, originalBasePath) {
|
|
912
913
|
if (!cmdCtx)
|
|
@@ -915,18 +916,24 @@ export async function maybeRerootStepSessionForHighContext(ctx, workspaceRoot, c
|
|
|
915
916
|
const { loadEffectiveGSDPreferences } = await import("./preferences.js");
|
|
916
917
|
const prefs = loadEffectiveGSDPreferences(workspaceRoot);
|
|
917
918
|
const compactionThreshold = prefs?.preferences.context_management?.compaction_threshold_percent;
|
|
918
|
-
|
|
919
|
+
const shouldWarn = shouldWarnStepSessionForContext(contextPercent, compactionThreshold);
|
|
920
|
+
const shouldReroot = shouldRerootStepSessionForContext(contextPercent);
|
|
921
|
+
if (!shouldWarn && !shouldReroot) {
|
|
922
|
+
return { rerooted: false };
|
|
923
|
+
}
|
|
924
|
+
const displayPercent = contextPercent.toFixed(1);
|
|
925
|
+
const thresholdDisplay = resolveCompactionThresholdPercent(compactionThreshold).toFixed(0);
|
|
926
|
+
if (!shouldReroot) {
|
|
927
|
+
ctx.ui.notify(`Step complete — context at ${displayPercent}% (soft threshold: ${thresholdDisplay}%). Use /compact when convenient; continuing in this session is still safe.`, "info");
|
|
919
928
|
return { rerooted: false };
|
|
920
929
|
}
|
|
921
930
|
const { resolveWorktreeProjectRoot } = await import("./worktree-root.js");
|
|
922
931
|
const snapshotBase = resolveWorktreeProjectRoot(workspaceRoot, originalBasePath);
|
|
923
932
|
const { writeContextModeCompactionSnapshot } = await import("./context-mode-snapshot.js");
|
|
924
933
|
await writeContextModeCompactionSnapshot(snapshotBase);
|
|
925
|
-
const displayPercent = contextPercent.toFixed(1);
|
|
926
|
-
const thresholdDisplay = resolveCompactionThresholdPercent(compactionThreshold).toFixed(0);
|
|
927
934
|
const result = await rerootCommandSession(cmdCtx, workspaceRoot);
|
|
928
935
|
if (result.status === "ok") {
|
|
929
|
-
ctx.ui.notify(`Step complete — context at ${displayPercent}% (threshold: ${
|
|
936
|
+
ctx.ui.notify(`Step complete — context at ${displayPercent}% (hard threshold: ${HARD_CONTEXT_REROOT_THRESHOLD_PERCENT}%). Fresh session ready for /gsd next.`, "info");
|
|
930
937
|
return { rerooted: true };
|
|
931
938
|
}
|
|
932
939
|
if (result.status === "cancelled") {
|
|
@@ -1545,7 +1552,7 @@ export function _selectStopAutoWorktreeExit(args) {
|
|
|
1545
1552
|
/**
|
|
1546
1553
|
* Pause auto-mode without destroying state. Context is preserved.
|
|
1547
1554
|
* The user can interact with the agent, then `/gsd auto` resumes
|
|
1548
|
-
* from disk state. Called when the user presses Escape
|
|
1555
|
+
* from disk state. Called when the user presses Escape or runs `/gsd pause`.
|
|
1549
1556
|
*/
|
|
1550
1557
|
export async function pauseAuto(ctx, _pi, _errorContext, options = {}) {
|
|
1551
1558
|
if (!s.active)
|
|
@@ -1564,6 +1571,8 @@ export async function pauseAuto(ctx, _pi, _errorContext, options = {}) {
|
|
|
1564
1571
|
].filter((path) => Boolean(path)));
|
|
1565
1572
|
s.active = false;
|
|
1566
1573
|
s.paused = true;
|
|
1574
|
+
if (options.abortActiveTurn && ctx && !ctx.isIdle())
|
|
1575
|
+
ctx.abort();
|
|
1567
1576
|
clearUnitTimeout();
|
|
1568
1577
|
stopAutoCommandPolling();
|
|
1569
1578
|
// Flush queued follow-up messages (#3512).
|
|
@@ -1771,7 +1780,7 @@ function buildLoopDeps(pi, ctx) {
|
|
|
1771
1780
|
invalidateAllCaches,
|
|
1772
1781
|
deriveState,
|
|
1773
1782
|
rebuildState,
|
|
1774
|
-
loadEffectiveGSDPreferences: () => loadEffectiveGSDPreferencesWithRegistry(ctx.modelRegistry, s.basePath || undefined, resolveProfileAnchorProvider(ctx.model?.provider, s.autoModeStartModel?.provider)),
|
|
1783
|
+
loadEffectiveGSDPreferences: () => loadEffectiveGSDPreferencesWithRegistry(ctx.modelRegistry, s.basePath || undefined, resolveProfileAnchorProvider(ctx.model?.provider, s.autoModeStartModel?.provider), s.autoModeStartModel ? `${s.autoModeStartModel.provider}/${s.autoModeStartModel.id}` : undefined),
|
|
1775
1784
|
// Pre-dispatch health gate
|
|
1776
1785
|
preDispatchHealthGate,
|
|
1777
1786
|
// Worktree state projection (ADR-016 — single Module Interface)
|
|
@@ -1899,7 +1908,7 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
|
|
|
1899
1908
|
// resume paths (#4416). The matching call in auto-start.ts covers the
|
|
1900
1909
|
// bootstrap-only path; this call ensures the resume path is also protected.
|
|
1901
1910
|
if (recoverFailedMigration(base)) {
|
|
1902
|
-
ctx.ui.notify("Recovered unfinished
|
|
1911
|
+
ctx.ui.notify("Recovered unfinished external state migration.", "info");
|
|
1903
1912
|
}
|
|
1904
1913
|
const unmergedStartMessage = await getUnmergedMilestoneBlockMessageForBase(base, "auto");
|
|
1905
1914
|
if (unmergedStartMessage) {
|
|
@@ -2292,10 +2301,26 @@ export function ensurePreconditions(unitType, unitId, base, state) {
|
|
|
2292
2301
|
return;
|
|
2293
2302
|
}
|
|
2294
2303
|
}
|
|
2295
|
-
|
|
2296
|
-
|
|
2304
|
+
// Layout-aware: if the legacy milestones/ dir exists, place the new milestone dir
|
|
2305
|
+
// there (preserves the existing project layout). Otherwise use flat-phase phases/.
|
|
2306
|
+
const legacyBase = legacyMilestonesDir(base);
|
|
2307
|
+
const isLegacyLayout = isLegacyMilestonesLayout(base);
|
|
2308
|
+
const targetBase = isLegacyLayout ? legacyBase : milestonesDir(base);
|
|
2309
|
+
// Flat-phase: look up the milestone title to build the canonical NN-slug dir name
|
|
2310
|
+
// (e.g. "01-foundation") that resolveMilestonePath will later find by prefix.
|
|
2311
|
+
// Legacy layout keeps the raw milestone id (e.g. "M001").
|
|
2312
|
+
const dirName = isLegacyLayout
|
|
2313
|
+
? mid
|
|
2314
|
+
: canonicalPhaseDirName(mid, getMilestone(mid)?.title);
|
|
2315
|
+
const newDir = join(targetBase, dirName);
|
|
2316
|
+
// Legacy projects use a slices/ subdir; flat-phase uses top-level plan files (no slices/).
|
|
2317
|
+
mkdirSync(isLegacyLayout ? join(newDir, "slices") : newDir, { recursive: true });
|
|
2297
2318
|
}
|
|
2298
2319
|
if (sid !== undefined) {
|
|
2320
|
+
const isLegacyLayout = isLegacyMilestonesLayout(base);
|
|
2321
|
+
// Flat-phase: tasks are checkboxes in NN-MM-PLAN.md — no slices/ subdir needed.
|
|
2322
|
+
if (!isLegacyLayout)
|
|
2323
|
+
return;
|
|
2299
2324
|
const mDirResolved = resolveMilestonePath(base, mid);
|
|
2300
2325
|
if (mDirResolved) {
|
|
2301
2326
|
const slicesDir = join(mDirResolved, "slices");
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
// gsd-pi + src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts - Handles provider and agent-end recovery for GSD auto-mode.
|
|
2
|
+
import { mkdirSync, readdirSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
2
4
|
import { logWarning } from "../workflow-logger.js";
|
|
3
5
|
import { checkDeepProjectSetupAfterTurn, checkAutoStartAfterDiscuss, maybeHandleReadyPhraseWithoutFiles, maybeHandleEmptyIntentTurn, resetEmptyTurnCounter, } from "../guided-flow.js";
|
|
4
|
-
import { clearPathCache } from "../paths.js";
|
|
6
|
+
import { clearPathCache, gsdRoot } from "../paths.js";
|
|
5
7
|
import { getAutoDashboardData, getAutoModeStartModel, isAutoActive, isAutoCompletionStopInProgress, pauseAuto, setCurrentDispatchedModelId, setCurrentUnitModelForRecovery, } from "../auto.js";
|
|
6
8
|
import { getNextFallbackModel, resolveModelWithFallbacksForUnit } from "../preferences.js";
|
|
7
9
|
import { pauseAutoForProviderError } from "../provider-error-pause.js";
|
|
@@ -10,7 +12,8 @@ import { shouldIgnoreAgentEndForActiveUnit } from "../auto/unit-runner-events.js
|
|
|
10
12
|
import { resolveModelId } from "../auto-model-selection.js";
|
|
11
13
|
import { resolveProjectRoot } from "../worktree.js";
|
|
12
14
|
import { clearDiscussionFlowState } from "./write-gate.js";
|
|
13
|
-
import {
|
|
15
|
+
import { scheduleFallbackContinuation } from "./fallback-continuation.js";
|
|
16
|
+
import { clearGuidedUnitContext, getGuidedUnitContext } from "../guided-unit-context.js";
|
|
14
17
|
import { resumeAutoAfterProviderDelay } from "./provider-error-resume.js";
|
|
15
18
|
import { classifyError, createRetryState, resetRetryState, isTransient, } from "../error-classifier.js";
|
|
16
19
|
import { blockModel, blockModelUntil, isModelBlocked, isModelTemporarilyUnavailable } from "../blocked-models.js";
|
|
@@ -77,10 +80,15 @@ export function isUserInitiatedAbortMessage(message) {
|
|
|
77
80
|
return false;
|
|
78
81
|
return /\b(?:claude code process aborted by user|request aborted by user|process aborted by user)\b/i.test(message);
|
|
79
82
|
}
|
|
80
|
-
export function shouldDeferTransientErrorToCoreRetry(cls, rawErrorMsg) {
|
|
83
|
+
export function shouldDeferTransientErrorToCoreRetry(cls, rawErrorMsg, deferCheckMsg = rawErrorMsg) {
|
|
81
84
|
if (!isTransient(cls) || cls.kind === "rate-limit")
|
|
82
85
|
return false;
|
|
83
|
-
|
|
86
|
+
// Empty rawErrorMsg means the SDK terminated the session without providing an
|
|
87
|
+
// error string — core is done, not mid-retry. GSD must schedule its own
|
|
88
|
+
// retry rather than silently deferring to a core that has already exited.
|
|
89
|
+
if (!rawErrorMsg)
|
|
90
|
+
return false;
|
|
91
|
+
return !/retry failed after \d+ attempts:/i.test(deferCheckMsg);
|
|
84
92
|
}
|
|
85
93
|
/** Try configured fallbacks, then the auto-mode start model. Returns true if switched. */
|
|
86
94
|
async function tryProviderModelFallback(params) {
|
|
@@ -104,7 +112,7 @@ async function tryProviderModelFallback(params) {
|
|
|
104
112
|
setCurrentUnitModelForRecovery(candidate);
|
|
105
113
|
setCurrentDispatchedModelId({ provider: candidate.provider, id: candidate.id });
|
|
106
114
|
switchedNotify(`${candidate.provider}/${candidate.id}`);
|
|
107
|
-
pi
|
|
115
|
+
scheduleFallbackContinuation(pi);
|
|
108
116
|
return true;
|
|
109
117
|
}
|
|
110
118
|
}
|
|
@@ -123,7 +131,7 @@ async function tryProviderModelFallback(params) {
|
|
|
123
131
|
setCurrentUnitModelForRecovery(startModel);
|
|
124
132
|
setCurrentDispatchedModelId({ provider: startModel.provider, id: startModel.id });
|
|
125
133
|
switchedNotify(`${startModel.provider}/${startModel.id}`);
|
|
126
|
-
pi
|
|
134
|
+
scheduleFallbackContinuation(pi);
|
|
127
135
|
return true;
|
|
128
136
|
}
|
|
129
137
|
}
|
|
@@ -276,6 +284,86 @@ export function suppressTerminalDeletedWorktreeMessageEnd(event) {
|
|
|
276
284
|
logWarning("bootstrap", `Suppressing stale deleted-worktree provider error during terminal completion reroot: ${displayMsg || rawErrorMsg}`);
|
|
277
285
|
return true;
|
|
278
286
|
}
|
|
287
|
+
function modelLabel(ctx) {
|
|
288
|
+
const provider = ctx.model?.provider;
|
|
289
|
+
const id = ctx.model?.id;
|
|
290
|
+
return provider && id ? `${provider}/${id}` : "unknown model";
|
|
291
|
+
}
|
|
292
|
+
function isFatalManualGuidedTerminalFailure(lastMsg) {
|
|
293
|
+
if (!isObjectRecord(lastMsg) || !("stopReason" in lastMsg))
|
|
294
|
+
return false;
|
|
295
|
+
if (lastMsg.stopReason === "error") {
|
|
296
|
+
const rawErrorMsg = ("errorMessage" in lastMsg && lastMsg.errorMessage) ? String(lastMsg.errorMessage) : "";
|
|
297
|
+
if (isUserInitiatedAbortMessage(rawErrorMsg))
|
|
298
|
+
return false;
|
|
299
|
+
return true;
|
|
300
|
+
}
|
|
301
|
+
if (lastMsg.stopReason !== "aborted")
|
|
302
|
+
return false;
|
|
303
|
+
const content = "content" in lastMsg ? lastMsg.content : undefined;
|
|
304
|
+
const hasErrorMessage = "errorMessage" in lastMsg && !!lastMsg.errorMessage;
|
|
305
|
+
return hasErrorMessage || !_hasEmptyAgentEndContent(content);
|
|
306
|
+
}
|
|
307
|
+
function terminalFailureDetail(lastMsg) {
|
|
308
|
+
if (!isObjectRecord(lastMsg))
|
|
309
|
+
return "Provider turn ended with an unknown terminal error.";
|
|
310
|
+
const rawErrorMsg = ("errorMessage" in lastMsg && lastMsg.errorMessage) ? String(lastMsg.errorMessage) : "";
|
|
311
|
+
const content = "content" in lastMsg ? lastMsg.content : undefined;
|
|
312
|
+
const displayMsg = resolveAgentEndErrorDisplay(rawErrorMsg, content).replace(/\s+/g, " ").trim();
|
|
313
|
+
if (displayMsg)
|
|
314
|
+
return displayMsg.length > 300 ? `${displayMsg.slice(0, 300)}...` : displayMsg;
|
|
315
|
+
return lastMsg.stopReason === "aborted"
|
|
316
|
+
? "Provider turn aborted with error context."
|
|
317
|
+
: "Provider stream ended with stopReason=error.";
|
|
318
|
+
}
|
|
319
|
+
function nextManualActivitySequence(activityDir) {
|
|
320
|
+
let maxSeq = 0;
|
|
321
|
+
try {
|
|
322
|
+
for (const file of readdirSync(activityDir)) {
|
|
323
|
+
const match = /^(\d+)-/.exec(file);
|
|
324
|
+
if (match)
|
|
325
|
+
maxSeq = Math.max(maxSeq, Number.parseInt(match[1], 10));
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
catch {
|
|
329
|
+
return "001";
|
|
330
|
+
}
|
|
331
|
+
return String(maxSeq + 1).padStart(3, "0");
|
|
332
|
+
}
|
|
333
|
+
function writeManualGuidedTerminalErrorActivity(basePath, unitType, model, detail, stopReason) {
|
|
334
|
+
const activityDir = join(gsdRoot(basePath), "activity");
|
|
335
|
+
mkdirSync(activityDir, { recursive: true });
|
|
336
|
+
const seq = nextManualActivitySequence(activityDir);
|
|
337
|
+
const safeUnitType = unitType.replace(/[^a-z0-9_.-]+/gi, "-");
|
|
338
|
+
const markerPath = join(activityDir, `${seq}-${safeUnitType}-manual-terminal-provider-error.jsonl`);
|
|
339
|
+
const message = `Manual guided ${unitType} turn ended with provider ${String(stopReason)} on ${model}: ${detail}`;
|
|
340
|
+
writeFileSync(markerPath, JSON.stringify({
|
|
341
|
+
type: "message",
|
|
342
|
+
message: {
|
|
343
|
+
role: "toolResult",
|
|
344
|
+
toolCallId: "manual-guided-terminal-provider-error",
|
|
345
|
+
toolName: "provider",
|
|
346
|
+
isError: true,
|
|
347
|
+
content: [{ type: "text", text: message }],
|
|
348
|
+
},
|
|
349
|
+
}) + "\n", "utf-8");
|
|
350
|
+
}
|
|
351
|
+
function observeManualDiscussTerminalError(ctx, lastMsg, guidedUnit) {
|
|
352
|
+
if (!guidedUnit?.unitType.startsWith("discuss-"))
|
|
353
|
+
return;
|
|
354
|
+
if (!isFatalManualGuidedTerminalFailure(lastMsg))
|
|
355
|
+
return;
|
|
356
|
+
const model = modelLabel(ctx);
|
|
357
|
+
const detail = terminalFailureDetail(lastMsg);
|
|
358
|
+
ctx.ui.notify(`Manual /gsd discuss ${guidedUnit.unitType} ended with a provider error on ${model}: ${detail}`, "warning");
|
|
359
|
+
try {
|
|
360
|
+
writeManualGuidedTerminalErrorActivity(guidedUnit.basePath, guidedUnit.unitType, model, detail, isObjectRecord(lastMsg) ? lastMsg.stopReason : "unknown");
|
|
361
|
+
}
|
|
362
|
+
catch (err) {
|
|
363
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
364
|
+
logWarning("bootstrap", `Failed to write manual guided terminal-error activity marker: ${message}`);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
279
367
|
async function pauseTransientWithBackoff(cls, pi, ctx, errorDetail, isRateLimit) {
|
|
280
368
|
retryState.consecutiveTransientCount += 1;
|
|
281
369
|
const baseRetryAfterMs = "retryAfterMs" in cls ? cls.retryAfterMs : 15_000;
|
|
@@ -314,7 +402,9 @@ export async function handleAgentEnd(pi, event, ctx) {
|
|
|
314
402
|
// rejected" loop even though the files are on disk.
|
|
315
403
|
clearPathCache();
|
|
316
404
|
const basePath = resolveAgentEndBasePath();
|
|
317
|
-
|
|
405
|
+
const lastMsg = event.messages[event.messages.length - 1];
|
|
406
|
+
const guidedUnit = basePath ? getGuidedUnitContext(basePath) ?? getGuidedUnitContext() : getGuidedUnitContext();
|
|
407
|
+
clearGuidedUnitContext(guidedUnit?.basePath ?? basePath);
|
|
318
408
|
try {
|
|
319
409
|
if (await checkDeepProjectSetupAfterTurn(event, ctx, basePath)) {
|
|
320
410
|
return;
|
|
@@ -341,12 +431,13 @@ export async function handleAgentEnd(pi, event, ctx) {
|
|
|
341
431
|
// discussions (where isAutoActive may be false) still get recovered.
|
|
342
432
|
if (maybeHandleEmptyIntentTurn(event, isAutoActive(), basePath))
|
|
343
433
|
return;
|
|
344
|
-
if (!isAutoActive())
|
|
434
|
+
if (!isAutoActive()) {
|
|
435
|
+
observeManualDiscussTerminalError(ctx, lastMsg, guidedUnit);
|
|
345
436
|
return;
|
|
437
|
+
}
|
|
346
438
|
if (shouldIgnoreAgentEndForActiveUnit(event)) {
|
|
347
439
|
return;
|
|
348
440
|
}
|
|
349
|
-
const lastMsg = event.messages[event.messages.length - 1];
|
|
350
441
|
if (isSessionSwitchInFlight()) {
|
|
351
442
|
_handleSessionSwitchAgentEnd(lastMsg, resolveAgentEndCancelled);
|
|
352
443
|
return;
|
|
@@ -434,9 +525,9 @@ export async function handleAgentEnd(pi, event, ctx) {
|
|
|
434
525
|
});
|
|
435
526
|
return;
|
|
436
527
|
}
|
|
437
|
-
// #3588: When errorMessage is uninformative, extract the real error
|
|
438
|
-
//
|
|
439
|
-
//
|
|
528
|
+
// #3588/#956: When errorMessage is uninformative, extract the real error
|
|
529
|
+
// from assistant text. Prefer rawErrorMsg for classification to avoid
|
|
530
|
+
// prose false-positives, but use display text when rawErrorMsg is empty.
|
|
440
531
|
const displayMsg = resolveAgentEndErrorDisplay(rawErrorMsg, "content" in lastMsg ? lastMsg.content : undefined);
|
|
441
532
|
if (isAutoCompletionStopInProgress() &&
|
|
442
533
|
isTerminalDeletedWorktreeProviderError(`${rawErrorMsg}\n${displayMsg}`)) {
|
|
@@ -446,8 +537,8 @@ export async function handleAgentEnd(pi, event, ctx) {
|
|
|
446
537
|
}
|
|
447
538
|
const errorDetail = displayMsg ? `: ${displayMsg}` : "";
|
|
448
539
|
const explicitRetryAfterMs = ("retryAfterMs" in lastMsg && typeof lastMsg.retryAfterMs === "number") ? lastMsg.retryAfterMs : undefined;
|
|
449
|
-
// ── 1. Classify
|
|
450
|
-
const cls = classifyError(rawErrorMsg, explicitRetryAfterMs);
|
|
540
|
+
// ── 1. Classify, preserving non-empty errorMessage precedence ──────
|
|
541
|
+
const cls = classifyError(rawErrorMsg || displayMsg, explicitRetryAfterMs);
|
|
451
542
|
// ── 1a. Unsupported-model: provider rejected this model for the current
|
|
452
543
|
// account/plan at request time (#4513). Persist a block so the
|
|
453
544
|
// same dead model isn't reselected on the next /gsd auto restart,
|
|
@@ -516,10 +607,30 @@ export async function handleAgentEnd(pi, event, ctx) {
|
|
|
516
607
|
// Core retries transient failures in-session after this handler.
|
|
517
608
|
// Keep that behavior for non-rate-limit classes to avoid pause/retry races,
|
|
518
609
|
// but let rate-limit continue into model fallback logic below (#4373).
|
|
519
|
-
if (shouldDeferTransientErrorToCoreRetry(cls, rawErrorMsg)) {
|
|
610
|
+
if (shouldDeferTransientErrorToCoreRetry(cls, rawErrorMsg, rawErrorMsg || displayMsg)) {
|
|
520
611
|
return;
|
|
521
612
|
}
|
|
613
|
+
// ── Tool-schema overload: the active model repeatedly emitted tool-call
|
|
614
|
+
// arguments that fail schema validation (e.g. a model whose tool-call
|
|
615
|
+
// grammar can't satisfy GSD's schemas). Before hard-pausing, try the
|
|
616
|
+
// unit's configured fallbacks and the auto-mode start model — the model
|
|
617
|
+
// the user actually selected. This lets auto-mode recover by switching
|
|
618
|
+
// back to a schema-capable model instead of aborting outright (#813).
|
|
619
|
+
// Do not persistently block the model: schema-overload is request-shape
|
|
620
|
+
// specific, mirroring the model-error path above.
|
|
522
621
|
if (cls.kind === "tool-schema") {
|
|
622
|
+
const dash = getAutoDashboardData();
|
|
623
|
+
const switched = await tryProviderModelFallback({
|
|
624
|
+
ctx,
|
|
625
|
+
pi,
|
|
626
|
+
rejectedProvider: ctx.model?.provider,
|
|
627
|
+
rejectedId: ctx.model?.id,
|
|
628
|
+
basePath: dash.basePath,
|
|
629
|
+
unitType: dash.currentUnit?.type,
|
|
630
|
+
switchedNotify: (label) => ctx.ui.notify(`Switched to ${label} after repeated tool schema validation failures.`, "warning"),
|
|
631
|
+
});
|
|
632
|
+
if (switched)
|
|
633
|
+
return;
|
|
523
634
|
await pauseAutoForProviderError(ctx.ui, errorDetail, () => pauseAuto(ctx, pi, {
|
|
524
635
|
message: `Tool schema error${errorDetail}`,
|
|
525
636
|
category: "tool-schema",
|
|
@@ -572,57 +683,22 @@ export async function handleAgentEnd(pi, event, ctx) {
|
|
|
572
683
|
// --- Transient errors: try model fallback first, then pause ---
|
|
573
684
|
// Rate limits are often per-model, so switching models can bypass them.
|
|
574
685
|
if (cls.kind === "rate-limit" || cls.kind === "network" || cls.kind === "server" || cls.kind === "connection" || cls.kind === "stream") {
|
|
575
|
-
// Try model fallback
|
|
576
686
|
const dash = getAutoDashboardData();
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
if (ok) {
|
|
593
|
-
setCurrentUnitModelForRecovery(modelToSet);
|
|
594
|
-
setCurrentDispatchedModelId({ provider: modelToSet.provider, id: modelToSet.id });
|
|
595
|
-
ctx.ui.notify(`Model error${errorDetail}. Switched to fallback: ${nextModelId} and resuming.`, "warning");
|
|
596
|
-
pi.sendMessage({ customType: "gsd-auto-timeout-recovery", content: "Continue execution.", display: false }, { triggerTurn: true });
|
|
597
|
-
return;
|
|
598
|
-
}
|
|
599
|
-
}
|
|
600
|
-
}
|
|
601
|
-
}
|
|
602
|
-
}
|
|
603
|
-
// Try restoring session model
|
|
604
|
-
const sessionModel = getAutoModeStartModel();
|
|
605
|
-
if (sessionModel) {
|
|
606
|
-
const dash = getAutoDashboardData();
|
|
607
|
-
const sessionModelUnavailable = dash.basePath
|
|
608
|
-
? isModelBlocked(dash.basePath, sessionModel.provider, sessionModel.id) ||
|
|
609
|
-
isModelTemporarilyUnavailable(dash.basePath, sessionModel.provider, sessionModel.id)
|
|
610
|
-
: false;
|
|
611
|
-
if (!sessionModelUnavailable && (ctx.model?.id !== sessionModel.id || ctx.model?.provider !== sessionModel.provider)) {
|
|
612
|
-
const startModel = ctx.modelRegistry.getAvailable().find((m) => m.provider === sessionModel.provider && m.id === sessionModel.id);
|
|
613
|
-
if (startModel) {
|
|
614
|
-
const ok = await pi.setModel(startModel, { persist: false });
|
|
615
|
-
if (ok) {
|
|
616
|
-
setCurrentUnitModelForRecovery(startModel);
|
|
617
|
-
setCurrentDispatchedModelId({ provider: startModel.provider, id: startModel.id });
|
|
618
|
-
retryState.networkRetryCount = 0;
|
|
619
|
-
retryState.currentRetryModelId = undefined;
|
|
620
|
-
ctx.ui.notify(`Model error${errorDetail}. Restored session model: ${sessionModel.provider}/${sessionModel.id} and resuming.`, "warning");
|
|
621
|
-
pi.sendMessage({ customType: "gsd-auto-timeout-recovery", content: "Continue execution.", display: false }, { triggerTurn: true });
|
|
622
|
-
return;
|
|
623
|
-
}
|
|
624
|
-
}
|
|
625
|
-
}
|
|
687
|
+
const switched = await tryProviderModelFallback({
|
|
688
|
+
ctx,
|
|
689
|
+
pi,
|
|
690
|
+
rejectedProvider: ctx.model?.provider,
|
|
691
|
+
rejectedId: ctx.model?.id,
|
|
692
|
+
basePath: dash.basePath,
|
|
693
|
+
unitType: dash.currentUnit?.type,
|
|
694
|
+
switchedNotify: (label) => {
|
|
695
|
+
retryState.networkRetryCount = 0;
|
|
696
|
+
retryState.currentRetryModelId = undefined;
|
|
697
|
+
ctx.ui.notify(`Model error${errorDetail}. Switched to fallback: ${label} and resuming.`, "warning");
|
|
698
|
+
},
|
|
699
|
+
});
|
|
700
|
+
if (switched) {
|
|
701
|
+
return;
|
|
626
702
|
}
|
|
627
703
|
}
|
|
628
704
|
// --- Transient fallback: pause with auto-resume ---
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Canonical core session tool surface shared by auto-mode scoping and loop guards.
|
|
3
|
+
/** Base tools available during auto-mode execution before unit-specific GSD tools are added. */
|
|
4
|
+
export const MINIMAL_AUTO_BASE_TOOL_NAMES = [
|
|
5
|
+
"ask_user_questions",
|
|
6
|
+
"bash",
|
|
7
|
+
"bg_shell",
|
|
8
|
+
"edit",
|
|
9
|
+
"find",
|
|
10
|
+
"glob",
|
|
11
|
+
"grep",
|
|
12
|
+
"fetch_page",
|
|
13
|
+
"search-the-web",
|
|
14
|
+
"ls",
|
|
15
|
+
"read",
|
|
16
|
+
"subagent",
|
|
17
|
+
"write",
|
|
18
|
+
"ToolSearch",
|
|
19
|
+
];
|
|
20
|
+
/** Tools excluded from the high per-turn loop-guard cap (strict or orchestration). */
|
|
21
|
+
const NON_REPEATABLE_FROM_MINIMAL_BASE = new Set([
|
|
22
|
+
"ask_user_questions",
|
|
23
|
+
"subagent",
|
|
24
|
+
"ToolSearch",
|
|
25
|
+
]);
|
|
26
|
+
/** Additional core tools not in MINIMAL_AUTO_BASE but routinely multi-called per turn. */
|
|
27
|
+
const EXTRA_INHERENTLY_REPEATABLE = [
|
|
28
|
+
"gsd_exec",
|
|
29
|
+
"multi_edit",
|
|
30
|
+
"todo_write",
|
|
31
|
+
"notebook_edit",
|
|
32
|
+
"search_and_read",
|
|
33
|
+
];
|
|
34
|
+
/** Core session tools that may be invoked many times per agent turn. */
|
|
35
|
+
export const INHERENTLY_REPEATABLE_TOOL_NAMES = [
|
|
36
|
+
...MINIMAL_AUTO_BASE_TOOL_NAMES.filter((name) => !NON_REPEATABLE_FROM_MINIMAL_BASE.has(name)),
|
|
37
|
+
...EXTRA_INHERENTLY_REPEATABLE,
|
|
38
|
+
];
|
|
39
|
+
export const INHERENTLY_REPEATABLE_TOOL_SET = new Set(INHERENTLY_REPEATABLE_TOOL_NAMES);
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
// File Purpose: Registers DB-backed GSD workflow tools and compatibility aliases.
|
|
3
3
|
import { Type, StringEnum } from "@gsd/pi-ai";
|
|
4
4
|
import { Text } from "@gsd/pi-tui";
|
|
5
|
+
import { SUMMARY_SAVE_CONTENT_MAX_LENGTH } from "@opengsd/contracts";
|
|
5
6
|
import { loadEffectiveGSDPreferences } from "../preferences.js";
|
|
6
7
|
import { ensureDbOpen, resolveCtxCwd, resolveWorkflowToolBasePath } from "./dynamic-tools.js";
|
|
7
8
|
import { importWorkflowExecutorsModule } from "../workflow-mcp.js";
|
|
@@ -373,13 +374,17 @@ export function registerDbTools(pi) {
|
|
|
373
374
|
"Root-level artifact paths are PROJECT.md, PROJECT-DRAFT.md, REQUIREMENTS.md, and REQUIREMENTS-DRAFT.md.",
|
|
374
375
|
"artifact_type must be one of: SUMMARY, RESEARCH, CONTEXT, ASSESSMENT, CONTEXT-DRAFT, PROJECT, PROJECT-DRAFT, REQUIREMENTS, REQUIREMENTS-DRAFT.",
|
|
375
376
|
"Use CONTEXT-DRAFT for incremental draft persistence; use CONTEXT for the final milestone context after depth verification.",
|
|
377
|
+
`Keep each content payload under ${SUMMARY_SAVE_CONTENT_MAX_LENGTH} characters; save large context incrementally with CONTEXT-DRAFT/PROJECT-DRAFT/REQUIREMENTS-DRAFT instead of one oversized call.`,
|
|
376
378
|
],
|
|
377
379
|
parameters: Type.Object({
|
|
378
380
|
milestone_id: Type.Optional(Type.String({ description: "Milestone ID (e.g. M001). Omit only for root-level PROJECT/PROJECT-DRAFT/REQUIREMENTS/REQUIREMENTS-DRAFT artifacts." })),
|
|
379
381
|
slice_id: Type.Optional(Type.String({ description: "Slice ID (e.g. S01)" })),
|
|
380
382
|
task_id: Type.Optional(Type.String({ description: "Task ID (e.g. T01)" })),
|
|
381
383
|
artifact_type: StringEnum(["SUMMARY", "RESEARCH", "CONTEXT", "ASSESSMENT", "CONTEXT-DRAFT", "PROJECT", "PROJECT-DRAFT", "REQUIREMENTS", "REQUIREMENTS-DRAFT"], { description: "Artifact type to save" }),
|
|
382
|
-
content: Type.String({
|
|
384
|
+
content: Type.String({
|
|
385
|
+
description: `The full markdown content of the artifact. Maximum ${SUMMARY_SAVE_CONTENT_MAX_LENGTH} characters per save.`,
|
|
386
|
+
maxLength: SUMMARY_SAVE_CONTENT_MAX_LENGTH,
|
|
387
|
+
}),
|
|
383
388
|
}),
|
|
384
389
|
execute: summarySaveExecute,
|
|
385
390
|
renderCall(args, theme) {
|
|
@@ -649,8 +654,9 @@ export function registerDbTools(pi) {
|
|
|
649
654
|
promptSnippet: "Plan a slice via DB write + PLAN render + cache invalidation",
|
|
650
655
|
promptGuidelines: [
|
|
651
656
|
"Use gsd_plan_slice for slice planning instead of writing S##-PLAN.md or task PLAN files directly.",
|
|
652
|
-
"
|
|
653
|
-
"
|
|
657
|
+
"For incremental planning, call gsd_plan_slice with slice metadata only, then call gsd_plan_task once per task.",
|
|
658
|
+
"When tasks is omitted or empty, the tool writes only slice planning metadata and preserves existing tasks.",
|
|
659
|
+
"When tasks is non-empty, the tool validates input, requires an existing parent slice, writes slice/task planning data, renders PLAN.md and task plan files from DB, and clears both state and parse caches after success.",
|
|
654
660
|
"Use the canonical name gsd_plan_slice; gsd_slice_plan is only an alias.",
|
|
655
661
|
],
|
|
656
662
|
parameters: Type.Object({
|
|
@@ -658,7 +664,7 @@ export function registerDbTools(pi) {
|
|
|
658
664
|
milestoneId: Type.String({ description: "Milestone ID (e.g. M001)" }),
|
|
659
665
|
sliceId: Type.String({ description: "Slice ID (e.g. S01)" }),
|
|
660
666
|
goal: Type.String({ description: "Slice goal" }),
|
|
661
|
-
tasks: Type.Array(Type.Object({
|
|
667
|
+
tasks: Type.Optional(Type.Array(Type.Object({
|
|
662
668
|
taskId: Type.String({ description: "Task ID (e.g. T01)" }),
|
|
663
669
|
title: Type.String({ description: "Task title" }),
|
|
664
670
|
description: Type.String({ description: "Task description / steps block" }),
|
|
@@ -668,7 +674,7 @@ export function registerDbTools(pi) {
|
|
|
668
674
|
inputs: Type.Array(Type.String(), { description: "Array<string> of input files or references; pass [\"path\"] or [], never a single string" }),
|
|
669
675
|
expectedOutput: Type.Array(Type.String(), { description: "Array<string> of files this task creates or overwrites; pass [\"path\"] or [], never prose or a single string" }),
|
|
670
676
|
observabilityImpact: Type.Optional(Type.String({ description: "Task observability impact" })),
|
|
671
|
-
}), { description: "
|
|
677
|
+
}), { description: "Optional full task replacement for the slice. Omit for incremental planning, then call gsd_plan_task once per task." })),
|
|
672
678
|
// ── Enrichment metadata (optional — defaults to empty) ────────────
|
|
673
679
|
successCriteria: Type.Optional(Type.String({ description: "Slice success criteria block" })),
|
|
674
680
|
proofLevel: Type.Optional(Type.String({ description: "Slice proof level" })),
|
|
@@ -60,6 +60,7 @@ export function registerExecTools(pi) {
|
|
|
60
60
|
return executeUatExec(params, {
|
|
61
61
|
baseDir,
|
|
62
62
|
preferences: await loadContextModePreferences(baseDir),
|
|
63
|
+
signal: _signal,
|
|
63
64
|
});
|
|
64
65
|
},
|
|
65
66
|
});
|
|
@@ -99,6 +100,7 @@ export function registerExecTools(pi) {
|
|
|
99
100
|
return executeGsdExec(params, {
|
|
100
101
|
baseDir,
|
|
101
102
|
preferences: await loadContextModePreferences(baseDir),
|
|
103
|
+
signal: _signal,
|
|
102
104
|
});
|
|
103
105
|
},
|
|
104
106
|
});
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// gsd-pi + src/resources/extensions/gsd/bootstrap/fallback-continuation.ts - Dispatches the post-fallback-switch continuation on a fresh turn.
|
|
2
|
+
// Copyright (c) 2026 Jeremy McSpadden <jeremy@fluxlabs.net>
|
|
3
|
+
/**
|
|
4
|
+
* Dispatch the post-fallback continuation on a *fresh* turn after the current
|
|
5
|
+
* run settles.
|
|
6
|
+
*
|
|
7
|
+
* #804: At `agent_end` time the agent's run is still tearing down — its
|
|
8
|
+
* `isStreaming` flag stays `true` until `finishRun()` clears it in the `finally`
|
|
9
|
+
* block that fires *after* the awaited `agent_end` listeners return (see
|
|
10
|
+
* pi-agent-core/src/agent.ts processEvents comment). A synchronous
|
|
11
|
+
* `sendMessage({ triggerTurn: true, deliverAs: "steer" })` from inside that
|
|
12
|
+
* listener is therefore routed down the `isStreaming` branch and queued as a
|
|
13
|
+
* steering message against the turn that just errored out — which is never
|
|
14
|
+
* consumed, so the fallback model is selected but no new turn ever starts (the
|
|
15
|
+
* reported symptom: "switched but work stays stopped").
|
|
16
|
+
*
|
|
17
|
+
* Deferring to a macrotask lets `finishRun()` flip `isStreaming` to `false`
|
|
18
|
+
* first; the plain `triggerTurn` (no `deliverAs`) then dispatches a fresh turn
|
|
19
|
+
* on the freshly-selected fallback model, mirroring the network-retry path.
|
|
20
|
+
*/
|
|
21
|
+
export function scheduleFallbackContinuation(pi) {
|
|
22
|
+
setTimeout(() => {
|
|
23
|
+
pi.sendMessage({ customType: "gsd-auto-timeout-recovery", content: "Continue execution.", display: false }, { triggerTurn: true });
|
|
24
|
+
}, 0);
|
|
25
|
+
}
|
|
@@ -14,6 +14,7 @@ import { registerShortcuts } from "./register-shortcuts.js";
|
|
|
14
14
|
import { writeCrashLog } from "./crash-log.js";
|
|
15
15
|
import { logWarning, isGsdExtensionStderrEnabled } from "../workflow-logger.js";
|
|
16
16
|
import { UNIT_TOOL_CONTRACTS } from "../unit-tool-contracts.js";
|
|
17
|
+
import { installManifestFlushOnProcessTeardown } from "../workflow-manifest.js";
|
|
17
18
|
// Static import so cmux event listeners are registered synchronously during
|
|
18
19
|
// extension bootstrap. Prior implementation used `void import().then()` which
|
|
19
20
|
// queued listener registration as a microtask — any CMUX_CHANNELS emit fired
|
|
@@ -127,10 +128,30 @@ export function installEpipeGuard() {
|
|
|
127
128
|
process.on("unhandledRejection", _gsdRejectionGuard);
|
|
128
129
|
}
|
|
129
130
|
}
|
|
131
|
+
/**
|
|
132
|
+
* Assert that critical GSD workflow tools were registered.
|
|
133
|
+
*
|
|
134
|
+
* During extension loading, getAllTools() is a throwing stub
|
|
135
|
+
* ("Extension runtime not initialized") that only becomes real after
|
|
136
|
+
* runner.bindCore(). Calling it here used to throw, propagating to index.ts's
|
|
137
|
+
* catch and firing "Extension setup partially failed" — which, under Claude
|
|
138
|
+
* Code CLI, left the model's tool surface incomplete and trapped units in a
|
|
139
|
+
* finalize-retry loop. Tolerate the pre-bind throw and defer the real check to
|
|
140
|
+
* the first before_agent_start (where applyMinimalGsdToolSurface already
|
|
141
|
+
* re-reads the registered surface post-bind).
|
|
142
|
+
*/
|
|
130
143
|
function assertCriticalGsdWorkflowToolsRegistered(pi) {
|
|
131
144
|
if (typeof pi.getAllTools !== "function")
|
|
132
145
|
return;
|
|
133
|
-
|
|
146
|
+
let registered;
|
|
147
|
+
try {
|
|
148
|
+
registered = new Set(pi.getAllTools().map((tool) => tool.name));
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
// Pre-bind runtime: getAllTools() is not yet wired. The critical-tools
|
|
152
|
+
// invariant is re-checked post-bind during the first before_agent_start.
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
134
155
|
const missing = CRITICAL_GSD_WORKFLOW_TOOL_NAMES.filter((toolName) => !registered.has(toolName));
|
|
135
156
|
if (missing.length === 0)
|
|
136
157
|
return;
|
|
@@ -157,6 +178,7 @@ export function registerGsdExtension(pi) {
|
|
|
157
178
|
process.stderr.write(`[gsd] Failed to bootstrap hook-emitter bridge: ${err instanceof Error ? err.stack ?? err.message : String(err)}\n`);
|
|
158
179
|
});
|
|
159
180
|
installEpipeGuard();
|
|
181
|
+
installManifestFlushOnProcessTeardown();
|
|
160
182
|
// Ecosystem handlers captured by the GSDExtensionAPI wrapper for the
|
|
161
183
|
// GSD-owned `before_agent_start` dispatch step (#3338).
|
|
162
184
|
const ecosystemHandlers = [];
|