gsd-pi 2.82.0 → 3.0.0-dev.04f5ccf82
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 +125 -32
- package/dist/cli.js +20 -9
- package/dist/headless-ui.js +13 -6
- package/dist/headless.js +9 -2
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +10 -1
- package/dist/resources/extensions/browser-tools/tools/screenshot.js +1 -0
- package/dist/resources/extensions/browser-tools/tools/zoom.js +1 -0
- package/dist/resources/extensions/claude-code-cli/partial-builder.js +2 -1
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +44 -6
- package/dist/resources/extensions/cmux/index.js +5 -0
- package/dist/resources/extensions/gsd/auto/detect-stuck.js +1 -1
- package/dist/resources/extensions/gsd/auto/infra-errors.js +9 -3
- package/dist/resources/extensions/gsd/auto/loop.js +122 -40
- package/dist/resources/extensions/gsd/auto/orchestrator.js +126 -8
- package/dist/resources/extensions/gsd/auto/phases.js +155 -49
- package/dist/resources/extensions/gsd/auto/session.js +6 -0
- package/dist/resources/extensions/gsd/auto/unit-runner-events.js +7 -1
- package/dist/resources/extensions/gsd/auto/workflow-kernel.js +3 -0
- package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +12 -0
- package/dist/resources/extensions/gsd/auto-budget.js +9 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +72 -5
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +1 -0
- package/dist/resources/extensions/gsd/auto-dispatch.js +185 -30
- package/dist/resources/extensions/gsd/auto-model-selection.js +2 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +329 -137
- package/dist/resources/extensions/gsd/auto-prompts.js +47 -13
- package/dist/resources/extensions/gsd/auto-recovery.js +82 -16
- package/dist/resources/extensions/gsd/auto-start.js +99 -16
- package/dist/resources/extensions/gsd/auto-timers.js +11 -3
- package/dist/resources/extensions/gsd/auto-verification.js +146 -34
- package/dist/resources/extensions/gsd/auto-worktree.js +185 -26
- package/dist/resources/extensions/gsd/auto.js +251 -99
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +65 -10
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +13 -10
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +19 -4
- package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +21 -9
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +55 -12
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +24 -9
- package/dist/resources/extensions/gsd/clean-root-preflight.js +267 -8
- package/dist/resources/extensions/gsd/commands/catalog.js +10 -1
- package/dist/resources/extensions/gsd/commands/handlers/core.js +39 -1
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +20 -0
- package/dist/resources/extensions/gsd/commands-bootstrap.js +5 -0
- package/dist/resources/extensions/gsd/commands-handlers.js +17 -2
- package/dist/resources/extensions/gsd/commands-mcp-status.js +9 -0
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +16 -4
- package/dist/resources/extensions/gsd/commands-verdict.js +139 -0
- package/dist/resources/extensions/gsd/context-store.js +112 -0
- package/dist/resources/extensions/gsd/crash-recovery.js +55 -7
- package/dist/resources/extensions/gsd/db/auto-workers.js +30 -0
- package/dist/resources/extensions/gsd/db/milestone-leases.js +24 -0
- package/dist/resources/extensions/gsd/db/unit-dispatches.js +3 -2
- package/dist/resources/extensions/gsd/db-base-schema.js +2 -0
- package/dist/resources/extensions/gsd/db-migration-steps.js +4 -0
- package/dist/resources/extensions/gsd/db-task-slice-rows.js +2 -0
- package/dist/resources/extensions/gsd/db-writer.js +150 -84
- package/dist/resources/extensions/gsd/dispatch-guard.js +46 -2
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +11 -1
- package/dist/resources/extensions/gsd/doctor-git-checks.js +115 -9
- package/dist/resources/extensions/gsd/doctor-proactive.js +14 -2
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +28 -11
- package/dist/resources/extensions/gsd/doctor.js +2 -28
- package/dist/resources/extensions/gsd/export-html.js +27 -425
- package/dist/resources/extensions/gsd/forensics.js +10 -3
- package/dist/resources/extensions/gsd/git-conflict-state.js +21 -0
- package/dist/resources/extensions/gsd/git-service.js +152 -15
- package/dist/resources/extensions/gsd/gsd-db.js +76 -33
- package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -3
- package/dist/resources/extensions/gsd/guided-flow.js +110 -117
- package/dist/resources/extensions/gsd/guided-unit-context.js +23 -0
- package/dist/resources/extensions/gsd/init-wizard.js +17 -2
- package/dist/resources/extensions/gsd/knowledge-backfill.js +144 -0
- package/dist/resources/extensions/gsd/knowledge-capture.js +136 -0
- package/dist/resources/extensions/gsd/knowledge-parser.js +154 -0
- package/dist/resources/extensions/gsd/knowledge-projection.js +210 -0
- package/dist/resources/extensions/gsd/markdown-renderer.js +20 -12
- package/dist/resources/extensions/gsd/mcp-filter.js +58 -0
- package/dist/resources/extensions/gsd/md-importer.js +1 -1
- package/dist/resources/extensions/gsd/memory-backfill.js +73 -17
- package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +222 -0
- package/dist/resources/extensions/gsd/migrate/command.js +5 -0
- package/dist/resources/extensions/gsd/migrate/parsers.js +121 -2
- package/dist/resources/extensions/gsd/migrate/preview.js +9 -0
- package/dist/resources/extensions/gsd/migrate/transformer.js +51 -4
- package/dist/resources/extensions/gsd/migrate/writer.js +11 -1
- package/dist/resources/extensions/gsd/migration-auto-check.js +12 -17
- package/dist/resources/extensions/gsd/milestone-actions.js +11 -4
- package/dist/resources/extensions/gsd/native-git-bridge.js +57 -14
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -0
- package/dist/resources/extensions/gsd/paths.js +4 -0
- package/dist/resources/extensions/gsd/pending-auto-start.js +52 -0
- package/dist/resources/extensions/gsd/planning-path-scope.js +9 -3
- package/dist/resources/extensions/gsd/post-execution-checks.js +73 -9
- package/dist/resources/extensions/gsd/pre-execution-checks.js +54 -19
- package/dist/resources/extensions/gsd/preferences-mcp.js +19 -0
- package/dist/resources/extensions/gsd/preferences-models.js +6 -4
- package/dist/resources/extensions/gsd/preferences-types.js +3 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +147 -0
- package/dist/resources/extensions/gsd/preferences.js +35 -0
- package/dist/resources/extensions/gsd/prompt-loader.js +1 -1
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
- package/dist/resources/extensions/gsd/prompts/discuss.md +9 -9
- package/dist/resources/extensions/gsd/prompts/forensics.md +3 -3
- package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
- package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -4
- package/dist/resources/extensions/gsd/prompts/queue.md +4 -4
- package/dist/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/dist/resources/extensions/gsd/prompts/system.md +2 -2
- package/dist/resources/extensions/gsd/provider-switch-observer.js +146 -0
- package/dist/resources/extensions/gsd/queue-reorder-ui.js +30 -13
- package/dist/resources/extensions/gsd/repo-identity.js +39 -22
- package/dist/resources/extensions/gsd/repository-registry.js +44 -0
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +2 -0
- package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +42 -18
- package/dist/resources/extensions/gsd/session-lock.js +15 -2
- package/dist/resources/extensions/gsd/slice-parallel-conflict.js +2 -2
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +84 -5
- package/dist/resources/extensions/gsd/smart-entry-routing.js +36 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +6 -1
- package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +9 -14
- package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +19 -24
- package/dist/resources/extensions/gsd/state.js +28 -7
- package/dist/resources/extensions/gsd/status-guards.js +14 -2
- package/dist/resources/extensions/gsd/templates/PREFERENCES.md +1 -0
- package/dist/resources/extensions/gsd/templates/knowledge.md +2 -2
- package/dist/resources/extensions/gsd/templates/plan.md +9 -5
- package/dist/resources/extensions/gsd/templates/task-plan.md +10 -2
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +15 -9
- package/dist/resources/extensions/gsd/tools/complete-slice.js +56 -10
- package/dist/resources/extensions/gsd/tools/exec-tool.js +87 -5
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +7 -1
- package/dist/resources/extensions/gsd/tools/plan-slice.js +151 -15
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +32 -1
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +185 -40
- package/dist/resources/extensions/gsd/tui/render-kit.js +33 -0
- package/dist/resources/extensions/gsd/unit-context-composer.js +2 -0
- package/dist/resources/extensions/gsd/unit-context-manifest.js +69 -17
- package/dist/resources/extensions/gsd/validation.js +23 -1
- package/dist/resources/extensions/gsd/verification-gate.js +142 -7
- package/dist/resources/extensions/gsd/verification-verdict.js +26 -0
- package/dist/resources/extensions/gsd/watch/header-renderer.js +34 -25
- package/dist/resources/extensions/gsd/workflow-manifest.js +2 -0
- package/dist/resources/extensions/gsd/workflow-mcp.js +17 -1
- package/dist/resources/extensions/gsd/workflow-projections.js +6 -8
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +86 -19
- package/dist/resources/extensions/gsd/worktree-manager.js +11 -2
- package/dist/resources/extensions/gsd/worktree-safety.js +43 -4
- package/dist/resources/extensions/gsd/worktree-state-projection.js +31 -0
- package/dist/resources/extensions/gsd/worktree-telemetry.js +32 -0
- package/dist/resources/extensions/shared/html-shell.js +388 -0
- package/dist/resources/extensions/shared/interview-ui.js +6 -4
- package/dist/resources/extensions/shared/next-action-ui.js +13 -5
- package/dist/resources/extensions/subagent/index.js +448 -78
- package/dist/resources/extensions/subagent/launch.js +77 -0
- package/dist/resources/extensions/subagent/run-store.js +148 -0
- package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
- package/dist/resources/extensions/visual-brief/artifact-policy.js +29 -0
- package/dist/resources/extensions/visual-brief/extension-manifest.json +8 -0
- package/dist/resources/extensions/visual-brief/index.js +5 -0
- package/dist/resources/extensions/visual-brief/page-contract.js +124 -0
- package/dist/resources/extensions/visual-brief/prompts.js +140 -0
- package/dist/resources/skills/forensics/SKILL.md +1 -1
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
- package/dist/web/standalone/.next/build-manifest.json +4 -4
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +5 -5
- package/dist/web/standalone/.next/required-server-files.json +4 -4
- package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
- 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.js +2 -2
- package/dist/web/standalone/.next/server/app/_not-found/page.js.nft.json +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 +4 -7
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -7
- 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 +4 -5
- 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 +2 -5
- package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +5 -8
- 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 +5 -8
- 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 +4 -5
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -5
- package/dist/web/standalone/.next/server/app/page.js +2 -2
- package/dist/web/standalone/.next/server/app/page.js.nft.json +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 +10 -10
- package/dist/web/standalone/.next/server/chunks/4266.js +2 -0
- package/dist/web/standalone/.next/server/chunks/63.js +3 -3
- package/dist/web/standalone/.next/server/chunks/6897.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/middleware.js +2 -2
- package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
- package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/2973.33f26573894b6153.js +2 -0
- package/dist/web/standalone/.next/static/chunks/8359.65b24fac92188a6b.js +10 -0
- package/dist/web/standalone/.next/static/chunks/9441.ff70bb53f6835771.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/layout-8c10ec293ae0f1d5.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/page-752f1e2ebdaa3e45.js +1 -0
- package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-de742b64187e13fe.js → webpack-855d616060cb6e59.js} +1 -1
- package/dist/web/standalone/.next/static/css/746ee28c929d1880.css +1 -0
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
- package/dist/web/standalone/server.js +1 -1
- package/dist/welcome-screen.js +7 -8
- package/package.json +6 -5
- package/packages/contracts/dist/rpc.test.js +7 -0
- package/packages/contracts/dist/rpc.test.js.map +1 -1
- package/packages/contracts/dist/workflow.d.ts +21 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js +24 -0
- package/packages/contracts/dist/workflow.js.map +1 -1
- package/packages/contracts/src/rpc.test.ts +8 -0
- package/packages/contracts/src/workflow.ts +24 -0
- package/packages/daemon/package.json +2 -2
- package/packages/mcp-server/README.md +14 -3
- package/packages/mcp-server/dist/workflow-tools.d.ts +0 -3
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +80 -0
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +2 -2
- package/packages/mcp-server/src/workflow-tools-parity.test.ts +244 -0
- package/packages/mcp-server/src/workflow-tools.test.ts +23 -1
- package/packages/mcp-server/src/workflow-tools.ts +168 -0
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/native/package.json +1 -1
- package/packages/native/src/__tests__/stream-process.test.mjs +32 -12
- package/packages/native/tsconfig.json +2 -1
- package/packages/native/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-ai/dist/index.d.ts +2 -2
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +1 -1
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/google-gemini-cli.js +5 -0
- package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
- package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/google-gemini-cli.test.js +41 -0
- package/packages/pi-ai/dist/providers/google-gemini-cli.test.js.map +1 -0
- package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.js +82 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/openai-codex-responses.test.js +52 -0
- package/packages/pi-ai/dist/providers/openai-codex-responses.test.js.map +1 -0
- package/packages/pi-ai/dist/providers/simple-options.d.ts +2 -4
- package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/simple-options.js +5 -6
- package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
- package/packages/pi-ai/dist/providers/simple-options.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/simple-options.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/simple-options.test.js +50 -0
- package/packages/pi-ai/dist/providers/simple-options.test.js.map +1 -0
- package/packages/pi-ai/dist/providers/transform-messages.d.ts +11 -0
- package/packages/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/transform-messages.js +20 -0
- package/packages/pi-ai/dist/providers/transform-messages.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-ai/src/index.ts +7 -2
- package/packages/pi-ai/src/providers/google-gemini-cli.test.ts +49 -0
- package/packages/pi-ai/src/providers/google-gemini-cli.ts +7 -0
- package/packages/pi-ai/src/providers/openai-codex-responses.test.ts +63 -0
- package/packages/pi-ai/src/providers/openai-codex-responses.ts +91 -1
- package/packages/pi-ai/src/providers/simple-options.test.ts +60 -0
- package/packages/pi-ai/src/providers/simple-options.ts +5 -6
- package/packages/pi-ai/src/providers/transform-messages.ts +24 -0
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js +66 -0
- package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session.js +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +44 -3
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +6 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js +7 -2
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +14 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.js +4 -4
- package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +8 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js +3 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js +16 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +24 -6
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +82 -97
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +7 -7
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +11 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +25 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +24 -10
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js +17 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js.map +1 -0
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/agent-session-thinking-level.test.ts +79 -0
- package/packages/pi-coding-agent/src/core/agent-session.ts +1 -1
- package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +53 -3
- package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +23 -1
- package/packages/pi-coding-agent/src/core/compaction/compaction.ts +7 -2
- package/packages/pi-coding-agent/src/core/sdk.ts +1 -1
- package/packages/pi-coding-agent/src/core/system-prompt.ts +4 -4
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +17 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.test.ts +20 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.ts +3 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +23 -7
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +91 -102
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +15 -1
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +9 -9
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +30 -1
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +29 -10
- package/packages/pi-coding-agent/src/tests/system-prompt-file-safety.test.ts +22 -0
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/dist/__tests__/loader.test.d.ts +2 -0
- package/packages/pi-tui/dist/__tests__/loader.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/__tests__/loader.test.js +24 -0
- package/packages/pi-tui/dist/__tests__/loader.test.js.map +1 -0
- package/packages/pi-tui/dist/__tests__/terminal.test.d.ts +2 -0
- package/packages/pi-tui/dist/__tests__/terminal.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/__tests__/terminal.test.js +103 -0
- package/packages/pi-tui/dist/__tests__/terminal.test.js.map +1 -0
- package/packages/pi-tui/dist/__tests__/tui.test.js +72 -4
- package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
- package/packages/pi-tui/dist/components/loader.d.ts.map +1 -1
- package/packages/pi-tui/dist/components/loader.js +3 -0
- package/packages/pi-tui/dist/components/loader.js.map +1 -1
- package/packages/pi-tui/dist/terminal.d.ts +2 -0
- package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal.js +12 -0
- package/packages/pi-tui/dist/terminal.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts +1 -0
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +119 -30
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/package.json +1 -1
- package/packages/pi-tui/src/__tests__/loader.test.ts +30 -0
- package/packages/pi-tui/src/__tests__/terminal.test.ts +121 -0
- package/packages/pi-tui/src/__tests__/tui.test.ts +90 -4
- package/packages/pi-tui/src/components/loader.ts +3 -0
- package/packages/pi-tui/src/terminal.ts +11 -0
- package/packages/pi-tui/src/tui.ts +119 -30
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/packages/rpc-client/package.json +1 -1
- package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +10 -1
- package/src/resources/extensions/browser-tools/tools/screenshot.ts +1 -0
- package/src/resources/extensions/browser-tools/tools/zoom.ts +1 -0
- package/src/resources/extensions/claude-code-cli/partial-builder.ts +2 -1
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +52 -6
- package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +19 -2
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +49 -2
- package/src/resources/extensions/cmux/index.ts +6 -0
- package/src/resources/extensions/gsd/auto/contracts.ts +64 -16
- package/src/resources/extensions/gsd/auto/detect-stuck.ts +1 -0
- package/src/resources/extensions/gsd/auto/infra-errors.ts +9 -3
- package/src/resources/extensions/gsd/auto/loop.ts +123 -40
- package/src/resources/extensions/gsd/auto/orchestrator.ts +131 -8
- package/src/resources/extensions/gsd/auto/phases.ts +186 -60
- package/src/resources/extensions/gsd/auto/session.ts +16 -0
- package/src/resources/extensions/gsd/auto/types.ts +3 -0
- package/src/resources/extensions/gsd/auto/unit-runner-events.ts +6 -2
- package/src/resources/extensions/gsd/auto/workflow-kernel.ts +5 -1
- package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +13 -0
- package/src/resources/extensions/gsd/auto-budget.ts +11 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +78 -5
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +1 -0
- package/src/resources/extensions/gsd/auto-dispatch.ts +208 -29
- package/src/resources/extensions/gsd/auto-model-selection.ts +2 -1
- package/src/resources/extensions/gsd/auto-post-unit.ts +369 -148
- package/src/resources/extensions/gsd/auto-prompts.ts +47 -16
- package/src/resources/extensions/gsd/auto-recovery.ts +86 -13
- package/src/resources/extensions/gsd/auto-start.ts +109 -14
- package/src/resources/extensions/gsd/auto-timers.ts +10 -3
- package/src/resources/extensions/gsd/auto-verification.ts +174 -42
- package/src/resources/extensions/gsd/auto-worktree.ts +202 -30
- package/src/resources/extensions/gsd/auto.ts +296 -107
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +66 -10
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +13 -10
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +19 -4
- package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +19 -7
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +58 -15
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +27 -10
- package/src/resources/extensions/gsd/clean-root-preflight.ts +284 -8
- package/src/resources/extensions/gsd/commands/catalog.ts +10 -1
- package/src/resources/extensions/gsd/commands/handlers/core.ts +42 -1
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +21 -0
- package/src/resources/extensions/gsd/commands-bootstrap.ts +10 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +21 -2
- package/src/resources/extensions/gsd/commands-mcp-status.ts +8 -0
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +17 -4
- package/src/resources/extensions/gsd/commands-verdict.ts +202 -0
- package/src/resources/extensions/gsd/context-store.ts +120 -1
- package/src/resources/extensions/gsd/crash-recovery.ts +55 -6
- package/src/resources/extensions/gsd/db/auto-workers.ts +37 -0
- package/src/resources/extensions/gsd/db/milestone-leases.ts +26 -0
- package/src/resources/extensions/gsd/db/unit-dispatches.ts +4 -3
- package/src/resources/extensions/gsd/db-base-schema.ts +2 -0
- package/src/resources/extensions/gsd/db-migration-steps.ts +5 -0
- package/src/resources/extensions/gsd/db-task-slice-rows.ts +4 -0
- package/src/resources/extensions/gsd/db-writer.ts +167 -84
- package/src/resources/extensions/gsd/dispatch-guard.ts +60 -2
- package/src/resources/extensions/gsd/docs/preferences-reference.md +11 -1
- package/src/resources/extensions/gsd/doctor-git-checks.ts +117 -9
- package/src/resources/extensions/gsd/doctor-proactive.ts +18 -2
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +25 -13
- package/src/resources/extensions/gsd/doctor-types.ts +4 -0
- package/src/resources/extensions/gsd/doctor.ts +2 -27
- package/src/resources/extensions/gsd/export-html.ts +27 -427
- package/src/resources/extensions/gsd/forensics.ts +9 -3
- package/src/resources/extensions/gsd/git-conflict-state.ts +23 -0
- package/src/resources/extensions/gsd/git-service.ts +182 -16
- package/src/resources/extensions/gsd/gsd-db.ts +80 -31
- package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -3
- package/src/resources/extensions/gsd/guided-flow.ts +142 -134
- package/src/resources/extensions/gsd/guided-unit-context.ts +30 -0
- package/src/resources/extensions/gsd/init-wizard.ts +17 -2
- package/src/resources/extensions/gsd/journal.ts +8 -1
- package/src/resources/extensions/gsd/knowledge-backfill.ts +164 -0
- package/src/resources/extensions/gsd/knowledge-capture.ts +160 -0
- package/src/resources/extensions/gsd/knowledge-parser.ts +174 -0
- package/src/resources/extensions/gsd/knowledge-projection.ts +241 -0
- package/src/resources/extensions/gsd/markdown-renderer.ts +20 -12
- package/src/resources/extensions/gsd/mcp-filter.ts +80 -0
- package/src/resources/extensions/gsd/md-importer.ts +1 -1
- package/src/resources/extensions/gsd/memory-backfill.ts +89 -17
- package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +277 -0
- package/src/resources/extensions/gsd/migrate/command.ts +5 -0
- package/src/resources/extensions/gsd/migrate/parsers.ts +139 -2
- package/src/resources/extensions/gsd/migrate/preview.ts +10 -0
- package/src/resources/extensions/gsd/migrate/transformer.ts +58 -4
- package/src/resources/extensions/gsd/migrate/writer.ts +14 -1
- package/src/resources/extensions/gsd/migration-auto-check.ts +15 -23
- package/src/resources/extensions/gsd/milestone-actions.ts +10 -4
- package/src/resources/extensions/gsd/native-git-bridge.ts +63 -14
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +3 -0
- package/src/resources/extensions/gsd/paths.ts +5 -0
- package/src/resources/extensions/gsd/pending-auto-start.ts +79 -0
- package/src/resources/extensions/gsd/planning-path-scope.ts +10 -2
- package/src/resources/extensions/gsd/post-execution-checks.ts +87 -12
- package/src/resources/extensions/gsd/pre-execution-checks.ts +67 -19
- package/src/resources/extensions/gsd/preferences-mcp.ts +27 -0
- package/src/resources/extensions/gsd/preferences-models.ts +6 -4
- package/src/resources/extensions/gsd/preferences-types.ts +35 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +154 -0
- package/src/resources/extensions/gsd/preferences.ts +39 -0
- package/src/resources/extensions/gsd/prompt-loader.ts +1 -1
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
- package/src/resources/extensions/gsd/prompts/discuss.md +9 -9
- package/src/resources/extensions/gsd/prompts/forensics.md +3 -3
- package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
- package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
- package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -4
- package/src/resources/extensions/gsd/prompts/queue.md +4 -4
- package/src/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
- package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/src/resources/extensions/gsd/prompts/system.md +2 -2
- package/src/resources/extensions/gsd/provider-switch-observer.ts +185 -0
- package/src/resources/extensions/gsd/queue-reorder-ui.ts +31 -13
- package/src/resources/extensions/gsd/repo-identity.ts +45 -25
- package/src/resources/extensions/gsd/repository-registry.ts +77 -0
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +2 -0
- package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +54 -19
- package/src/resources/extensions/gsd/session-lock.ts +15 -2
- package/src/resources/extensions/gsd/slice-parallel-conflict.ts +2 -2
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +75 -3
- package/src/resources/extensions/gsd/smart-entry-routing.ts +77 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +8 -1
- package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +12 -15
- package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +17 -25
- package/src/resources/extensions/gsd/state.ts +33 -7
- package/src/resources/extensions/gsd/status-guards.ts +16 -2
- package/src/resources/extensions/gsd/templates/PREFERENCES.md +1 -0
- package/src/resources/extensions/gsd/templates/knowledge.md +2 -2
- package/src/resources/extensions/gsd/templates/plan.md +9 -5
- package/src/resources/extensions/gsd/templates/task-plan.md +10 -2
- package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +10 -1
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +71 -0
- package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +116 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +875 -59
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +637 -16
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +151 -12
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +53 -2
- package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +18 -6
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +136 -13
- package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +64 -0
- package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/auto-stop-notification.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/auto-workers.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +69 -1
- package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/brief-command.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/browser-tools-compatibility-declarations.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +87 -0
- package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +170 -3
- package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +32 -4
- package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +378 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +55 -2
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +60 -9
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/context-store-decisions-from-memories.test.ts +312 -0
- package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +104 -2
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +208 -0
- package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +13 -8
- package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +453 -0
- package/src/resources/extensions/gsd/tests/decisions-stop-table-writes.test.ts +348 -0
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +61 -2
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +139 -1
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +68 -1
- package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +140 -1
- package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/doctor-forensics-db-open-regression.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +97 -0
- package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +99 -1
- package/src/resources/extensions/gsd/tests/execution-entry-missing-context-4671.test.ts +15 -1
- package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +8 -4
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +28 -0
- package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +11 -7
- package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +5 -2
- package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +106 -0
- package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +59 -11
- package/src/resources/extensions/gsd/tests/guided-flow.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/guided-tool-contract.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +7 -7
- package/src/resources/extensions/gsd/tests/hook-model-resolution.test.ts +5 -0
- package/src/resources/extensions/gsd/tests/infra-error.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +80 -1
- package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +33 -1
- package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +226 -2
- package/src/resources/extensions/gsd/tests/integration/integration-lifecycle.test.ts +13 -5
- package/src/resources/extensions/gsd/tests/integration/migrate-command.test.ts +48 -3
- package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +5 -21
- package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/interrupted-session-auto.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +49 -3
- package/src/resources/extensions/gsd/tests/journal.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +323 -0
- package/src/resources/extensions/gsd/tests/knowledge-capture.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -2
- package/src/resources/extensions/gsd/tests/load-knowledge-block-rules-only.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +287 -0
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +11 -0
- package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +316 -0
- package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +179 -0
- package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +21 -40
- package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +5 -1
- package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +59 -1
- package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +26 -18
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +60 -0
- package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +80 -2
- package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +121 -1
- package/src/resources/extensions/gsd/tests/parallel-orchestrator-zombie-cleanup.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +55 -1
- package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +29 -5
- package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/plan-milestone-sketch-render.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +26 -0
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +343 -3
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +18 -1
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
- package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -3
- package/src/resources/extensions/gsd/tests/post-unit-git-failure.test.ts +8 -1
- package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +84 -0
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +147 -0
- package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +54 -0
- package/src/resources/extensions/gsd/tests/preferences-mcp.test.ts +128 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/prefs-missing-models-crash.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +79 -0
- package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +42 -1
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/prompt-loader.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +37 -1
- package/src/resources/extensions/gsd/tests/provider-switch-observer.test.ts +252 -0
- package/src/resources/extensions/gsd/tests/quality-gates.test.ts +6 -0
- package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +54 -0
- package/src/resources/extensions/gsd/tests/remediation-completion-guard.test.ts +89 -2
- package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +28 -1
- package/src/resources/extensions/gsd/tests/repository-registry.test.ts +52 -0
- package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +2 -3
- package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +16 -4
- package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +59 -1
- package/src/resources/extensions/gsd/tests/slice-parallel-conflict.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +112 -1
- package/src/resources/extensions/gsd/tests/smart-entry-routing.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +94 -2
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -0
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +119 -23
- package/src/resources/extensions/gsd/tests/status-guards.test.ts +17 -1
- package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +64 -1
- package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +7 -3
- package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +131 -9
- package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +111 -1
- package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +29 -2
- package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +42 -1
- package/src/resources/extensions/gsd/tests/verification-gate.test.ts +188 -1
- package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +78 -0
- package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +19 -1
- package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +21 -1
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +153 -1
- package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +64 -12
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +73 -2
- package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +90 -0
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +95 -0
- package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +59 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +18 -10
- package/src/resources/extensions/gsd/tools/complete-slice.ts +57 -10
- package/src/resources/extensions/gsd/tools/exec-tool.ts +98 -5
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +5 -1
- package/src/resources/extensions/gsd/tools/plan-slice.ts +172 -12
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +31 -0
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +166 -17
- package/src/resources/extensions/gsd/tui/render-kit.ts +44 -0
- package/src/resources/extensions/gsd/types.ts +1 -1
- package/src/resources/extensions/gsd/unit-context-composer.ts +3 -0
- package/src/resources/extensions/gsd/unit-context-manifest.ts +86 -19
- package/src/resources/extensions/gsd/validation.ts +23 -1
- package/src/resources/extensions/gsd/verification-gate.ts +170 -6
- package/src/resources/extensions/gsd/verification-verdict.ts +47 -0
- package/src/resources/extensions/gsd/watch/header-renderer.ts +35 -24
- package/src/resources/extensions/gsd/workflow-logger.ts +4 -0
- package/src/resources/extensions/gsd/workflow-manifest.ts +2 -0
- package/src/resources/extensions/gsd/workflow-mcp.ts +18 -1
- package/src/resources/extensions/gsd/workflow-projections.ts +6 -8
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +98 -20
- package/src/resources/extensions/gsd/worktree-manager.ts +14 -2
- package/src/resources/extensions/gsd/worktree-safety.ts +57 -10
- package/src/resources/extensions/gsd/worktree-state-projection.ts +43 -0
- package/src/resources/extensions/gsd/worktree-telemetry.ts +39 -0
- package/src/resources/extensions/shared/html-shell.ts +412 -0
- package/src/resources/extensions/shared/interview-ui.ts +6 -4
- package/src/resources/extensions/shared/next-action-ui.ts +11 -5
- package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +15 -0
- package/src/resources/extensions/shared/tests/next-action-ui-hasui.test.ts +32 -0
- package/src/resources/extensions/subagent/index.ts +567 -103
- package/src/resources/extensions/subagent/launch.ts +131 -0
- package/src/resources/extensions/subagent/run-store.ts +218 -0
- package/src/resources/extensions/subagent/tests/launch.test.ts +115 -0
- package/src/resources/extensions/subagent/tests/run-store.test.ts +111 -0
- package/src/resources/extensions/ttsr/ttsr-manager.ts +5 -1
- package/src/resources/extensions/visual-brief/artifact-policy.ts +41 -0
- package/src/resources/extensions/visual-brief/extension-manifest.json +8 -0
- package/src/resources/extensions/visual-brief/index.ts +8 -0
- package/src/resources/extensions/visual-brief/page-contract.ts +136 -0
- package/src/resources/extensions/visual-brief/prompts.ts +183 -0
- package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +212 -0
- package/src/resources/skills/forensics/SKILL.md +1 -1
- package/dist/web/standalone/.next/server/chunks/5822.js +0 -2
- package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +0 -1
- package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +0 -10
- package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/layout-9ecfd95f343793f0.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/page-200592a7f3baf579.js +0 -1
- package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
- package/dist/web/standalone/.next/static/css/54ec2745c1da488b.css +0 -1
- package/dist/web/standalone/.next/static/css/de70bee13400563f.css +0 -1
- package/dist/web/standalone/.next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
- package/dist/web/standalone/.next/static/media/747892c23ea88013-s.woff2 +0 -0
- package/dist/web/standalone/.next/static/media/8d697b304b401681-s.woff2 +0 -0
- package/dist/web/standalone/.next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
- package/dist/web/standalone/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
- package/dist/web/standalone/.next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
- /package/dist/web/standalone/.next/static/{S44UQTFCUdA44dkjfYt6S → w_ikFkx_-OHxisG9xjz4u}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{S44UQTFCUdA44dkjfYt6S → w_ikFkx_-OHxisG9xjz4u}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
// GSD-2 — ADR-005 Phase 3b: surface ProviderSwitchReport from pi-ai.
|
|
2
|
+
//
|
|
3
|
+
// pi-ai builds a ProviderSwitchReport on every cross-provider transform but
|
|
4
|
+
// only logs it to stderr when GSD_VERBOSE=1. This module installs a
|
|
5
|
+
// single-subscriber observer that surfaces non-empty reports through GSD's
|
|
6
|
+
// three usual telemetry surfaces:
|
|
7
|
+
//
|
|
8
|
+
// 1. UOK audit event (category model-policy, type provider-switch) — only
|
|
9
|
+
// when an auto trace is active.
|
|
10
|
+
// 2. Persistent notification (.gsd/notifications.jsonl, severity warning) —
|
|
11
|
+
// whenever the GSD basePath is known, so users see the loss in the
|
|
12
|
+
// dashboard / status surface without GSD_VERBOSE.
|
|
13
|
+
// 3. In-memory counter, exposed via getProviderSwitchStats() so any
|
|
14
|
+
// caller (dashboard, doctor, tests) can read the rollup.
|
|
15
|
+
import { setProviderSwitchObserver } from "@gsd/pi-ai";
|
|
16
|
+
import { autoSession } from "./auto-runtime-state.js";
|
|
17
|
+
import { appendNotification } from "./notification-store.js";
|
|
18
|
+
import { buildAuditEnvelope, emitUokAuditEvent } from "./uok/audit.js";
|
|
19
|
+
const INTERACTIVE_TRACE_KEY = "interactive";
|
|
20
|
+
let installed = false;
|
|
21
|
+
let totalSwitches = 0;
|
|
22
|
+
const totals = {
|
|
23
|
+
thinkingBlocksDropped: 0,
|
|
24
|
+
thinkingBlocksDowngraded: 0,
|
|
25
|
+
toolCallIdsRemapped: 0,
|
|
26
|
+
syntheticToolResultsInserted: 0,
|
|
27
|
+
thoughtSignaturesDropped: 0,
|
|
28
|
+
};
|
|
29
|
+
const byTrace = new Map();
|
|
30
|
+
let lastReport = null;
|
|
31
|
+
let lastAt = null;
|
|
32
|
+
/** Format a one-line summary suitable for a notification message. */
|
|
33
|
+
function summarize(report) {
|
|
34
|
+
const parts = [];
|
|
35
|
+
if (report.thinkingBlocksDropped > 0)
|
|
36
|
+
parts.push(`${report.thinkingBlocksDropped} thinking dropped`);
|
|
37
|
+
if (report.thinkingBlocksDowngraded > 0)
|
|
38
|
+
parts.push(`${report.thinkingBlocksDowngraded} thinking downgraded`);
|
|
39
|
+
if (report.toolCallIdsRemapped > 0)
|
|
40
|
+
parts.push(`${report.toolCallIdsRemapped} tool ids remapped`);
|
|
41
|
+
if (report.syntheticToolResultsInserted > 0)
|
|
42
|
+
parts.push(`${report.syntheticToolResultsInserted} synthetic tool results`);
|
|
43
|
+
if (report.thoughtSignaturesDropped > 0)
|
|
44
|
+
parts.push(`${report.thoughtSignaturesDropped} thought signatures dropped`);
|
|
45
|
+
return `Provider switch ${report.fromApi} → ${report.toApi}: ${parts.join(", ")}`;
|
|
46
|
+
}
|
|
47
|
+
function recordReport(report) {
|
|
48
|
+
const now = new Date().toISOString();
|
|
49
|
+
totalSwitches += 1;
|
|
50
|
+
totals.thinkingBlocksDropped += report.thinkingBlocksDropped;
|
|
51
|
+
totals.thinkingBlocksDowngraded += report.thinkingBlocksDowngraded;
|
|
52
|
+
totals.toolCallIdsRemapped += report.toolCallIdsRemapped;
|
|
53
|
+
totals.syntheticToolResultsInserted += report.syntheticToolResultsInserted;
|
|
54
|
+
totals.thoughtSignaturesDropped += report.thoughtSignaturesDropped;
|
|
55
|
+
lastReport = report;
|
|
56
|
+
lastAt = now;
|
|
57
|
+
const traceKey = autoSession.currentTraceId ?? INTERACTIVE_TRACE_KEY;
|
|
58
|
+
const existing = byTrace.get(traceKey);
|
|
59
|
+
if (existing) {
|
|
60
|
+
existing.switches += 1;
|
|
61
|
+
existing.lastReport = report;
|
|
62
|
+
existing.lastAt = now;
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
byTrace.set(traceKey, { switches: 1, lastReport: report, lastAt: now });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function emitAudit(report) {
|
|
69
|
+
const traceId = autoSession.currentTraceId;
|
|
70
|
+
const basePath = autoSession.basePath;
|
|
71
|
+
if (!traceId || !basePath)
|
|
72
|
+
return;
|
|
73
|
+
try {
|
|
74
|
+
emitUokAuditEvent(basePath, buildAuditEnvelope({
|
|
75
|
+
traceId,
|
|
76
|
+
category: "model-policy",
|
|
77
|
+
type: "provider-switch",
|
|
78
|
+
payload: {
|
|
79
|
+
fromApi: report.fromApi,
|
|
80
|
+
toApi: report.toApi,
|
|
81
|
+
thinkingBlocksDropped: report.thinkingBlocksDropped,
|
|
82
|
+
thinkingBlocksDowngraded: report.thinkingBlocksDowngraded,
|
|
83
|
+
toolCallIdsRemapped: report.toolCallIdsRemapped,
|
|
84
|
+
syntheticToolResultsInserted: report.syntheticToolResultsInserted,
|
|
85
|
+
thoughtSignaturesDropped: report.thoughtSignaturesDropped,
|
|
86
|
+
},
|
|
87
|
+
}));
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
// Audit emission is best-effort. Counter + notification still fire.
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
function emitNotification(report) {
|
|
94
|
+
try {
|
|
95
|
+
appendNotification(summarize(report), "warning", "workflow-logger");
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// Notification persistence is best-effort.
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
function handleReport(report) {
|
|
102
|
+
recordReport(report);
|
|
103
|
+
emitAudit(report);
|
|
104
|
+
emitNotification(report);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Install the pi-ai observer. Idempotent — calling more than once is a no-op
|
|
108
|
+
* after the first install.
|
|
109
|
+
*/
|
|
110
|
+
export function installProviderSwitchObserver() {
|
|
111
|
+
if (installed)
|
|
112
|
+
return;
|
|
113
|
+
setProviderSwitchObserver(handleReport);
|
|
114
|
+
installed = true;
|
|
115
|
+
}
|
|
116
|
+
/** Uninstall the observer. Intended for tests. */
|
|
117
|
+
export function uninstallProviderSwitchObserver() {
|
|
118
|
+
setProviderSwitchObserver(undefined);
|
|
119
|
+
installed = false;
|
|
120
|
+
}
|
|
121
|
+
/** Read-only snapshot of the in-memory rollup. */
|
|
122
|
+
export function getProviderSwitchStats() {
|
|
123
|
+
const trace = {};
|
|
124
|
+
for (const [key, value] of byTrace) {
|
|
125
|
+
trace[key] = { switches: value.switches, lastReport: { ...value.lastReport }, lastAt: value.lastAt };
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
totalSwitches,
|
|
129
|
+
totals: { ...totals },
|
|
130
|
+
byTrace: trace,
|
|
131
|
+
lastReport: lastReport ? { ...lastReport } : null,
|
|
132
|
+
lastAt,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
/** Reset the in-memory rollup. Intended for tests. */
|
|
136
|
+
export function _resetProviderSwitchStats() {
|
|
137
|
+
totalSwitches = 0;
|
|
138
|
+
totals.thinkingBlocksDropped = 0;
|
|
139
|
+
totals.thinkingBlocksDowngraded = 0;
|
|
140
|
+
totals.toolCallIdsRemapped = 0;
|
|
141
|
+
totals.syntheticToolResultsInserted = 0;
|
|
142
|
+
totals.thoughtSignaturesDropped = 0;
|
|
143
|
+
byTrace.clear();
|
|
144
|
+
lastReport = null;
|
|
145
|
+
lastAt = null;
|
|
146
|
+
}
|
|
@@ -24,6 +24,7 @@ export async function showQueueReorder(ctx, completed, pending) {
|
|
|
24
24
|
const items = [...pending];
|
|
25
25
|
let cursor = 0;
|
|
26
26
|
let grabbed = false;
|
|
27
|
+
let scrollOffset = 0;
|
|
27
28
|
let cachedLines;
|
|
28
29
|
let validation;
|
|
29
30
|
// Mutable deps map — tracks removals during this session
|
|
@@ -128,9 +129,11 @@ export async function showQueueReorder(ctx, completed, pending) {
|
|
|
128
129
|
return cachedLines;
|
|
129
130
|
const ui = makeUI(theme, width);
|
|
130
131
|
const lines = [];
|
|
132
|
+
const queueRows = [];
|
|
131
133
|
const push = (...rows) => { for (const r of rows)
|
|
132
134
|
lines.push(...r); };
|
|
133
135
|
const add = (s) => truncateToWidth(s, width);
|
|
136
|
+
let cursorQueueRow = 0;
|
|
134
137
|
const headerText = grabbed ? " Queue Reorder — Moving Item" : " Queue Reorder";
|
|
135
138
|
push(ui.bar(), ui.blank(), ui.header(headerText), ui.blank());
|
|
136
139
|
// Completed milestones (dimmed)
|
|
@@ -153,13 +156,15 @@ export async function showQueueReorder(ctx, completed, pending) {
|
|
|
153
156
|
const num = i + 1;
|
|
154
157
|
const label = item.title && item.title !== item.id ? `${item.id} ${item.title}` : item.id;
|
|
155
158
|
if (isCursor && grabbed) {
|
|
156
|
-
|
|
159
|
+
cursorQueueRow = queueRows.length;
|
|
160
|
+
queueRows.push(add(` ${theme.fg("warning", `▸▸ ${num}. ${label}`)}`));
|
|
157
161
|
}
|
|
158
162
|
else if (isCursor) {
|
|
159
|
-
|
|
163
|
+
cursorQueueRow = queueRows.length;
|
|
164
|
+
queueRows.push(add(` ${theme.fg("accent", `${GLYPH.cursor} ${num}. ${label}`)}`));
|
|
160
165
|
}
|
|
161
166
|
else {
|
|
162
|
-
|
|
167
|
+
queueRows.push(add(` ${theme.fg("text", `${num}. ${label}`)}`));
|
|
163
168
|
}
|
|
164
169
|
// depends_on annotations
|
|
165
170
|
const deps = liveDeps.get(item.id) ?? [];
|
|
@@ -168,34 +173,35 @@ export async function showQueueReorder(ctx, completed, pending) {
|
|
|
168
173
|
continue;
|
|
169
174
|
const pairKey = `${item.id}:${dep}`;
|
|
170
175
|
if (violatedPairs.has(pairKey)) {
|
|
171
|
-
|
|
176
|
+
queueRows.push(add(` ${theme.fg("warning", `${GLYPH.statusWarning} depends_on: ${dep} — auto-removed on confirm`)}`));
|
|
172
177
|
}
|
|
173
178
|
else if (redundantPairs.has(pairKey)) {
|
|
174
|
-
|
|
179
|
+
queueRows.push(add(` ${theme.fg("dim", `↳ depends_on: ${dep} (redundant)`)}`));
|
|
175
180
|
}
|
|
176
181
|
else {
|
|
177
|
-
|
|
182
|
+
queueRows.push(add(` ${theme.fg("dim", `↳ depends_on: ${dep}`)}`));
|
|
178
183
|
}
|
|
179
184
|
}
|
|
180
185
|
// Missing deps
|
|
181
186
|
for (const v of validation.violations.filter(v => v.milestone === item.id && v.type === 'missing_dep')) {
|
|
182
|
-
|
|
187
|
+
queueRows.push(add(` ${theme.fg("error", `${GLYPH.statusWarning} depends_on: ${v.dependsOn} (does not exist)`)}`));
|
|
183
188
|
}
|
|
184
189
|
}
|
|
185
190
|
// Removed deps feedback
|
|
191
|
+
const trailingLines = [];
|
|
186
192
|
if (removedDeps.length > 0) {
|
|
187
|
-
push(ui.blank());
|
|
193
|
+
trailingLines.push(...ui.blank());
|
|
188
194
|
for (const r of removedDeps) {
|
|
189
|
-
|
|
195
|
+
trailingLines.push(add(` ${theme.fg("success", `${GLYPH.statusDone} Removed: ${r.milestone} depends_on ${r.dep}`)}`));
|
|
190
196
|
}
|
|
191
197
|
}
|
|
192
198
|
// Circular warning
|
|
193
199
|
const circ = validation.violations.find(v => v.type === 'circular');
|
|
194
200
|
if (circ) {
|
|
195
|
-
push(ui.blank());
|
|
196
|
-
|
|
201
|
+
trailingLines.push(...ui.blank());
|
|
202
|
+
trailingLines.push(add(` ${theme.fg("error", `${GLYPH.statusWarning} ${circ.message}`)}`));
|
|
197
203
|
}
|
|
198
|
-
push(ui.blank());
|
|
204
|
+
trailingLines.push(...ui.blank());
|
|
199
205
|
// Hints — context-sensitive based on grab state
|
|
200
206
|
const hints = [];
|
|
201
207
|
if (grabbed) {
|
|
@@ -215,7 +221,18 @@ export async function showQueueReorder(ctx, completed, pending) {
|
|
|
215
221
|
hints.push("enter ok");
|
|
216
222
|
}
|
|
217
223
|
hints.push("esc");
|
|
218
|
-
push(ui.hints(hints), ui.bar());
|
|
224
|
+
trailingLines.push(...ui.hints(hints), ...ui.bar());
|
|
225
|
+
const maxOverlayRows = Math.max(10, process.stdout.rows ? Math.floor(process.stdout.rows * 0.8) : 24);
|
|
226
|
+
const availableQueueRows = Math.max(1, maxOverlayRows - lines.length - trailingLines.length);
|
|
227
|
+
const maxScroll = Math.max(0, queueRows.length - availableQueueRows);
|
|
228
|
+
if (cursorQueueRow < scrollOffset) {
|
|
229
|
+
scrollOffset = cursorQueueRow;
|
|
230
|
+
}
|
|
231
|
+
else if (cursorQueueRow >= scrollOffset + availableQueueRows) {
|
|
232
|
+
scrollOffset = cursorQueueRow - availableQueueRows + 1;
|
|
233
|
+
}
|
|
234
|
+
scrollOffset = Math.min(Math.max(scrollOffset, 0), maxScroll);
|
|
235
|
+
lines.push(...queueRows.slice(scrollOffset, scrollOffset + availableQueueRows), ...trailingLines);
|
|
219
236
|
cachedLines = lines;
|
|
220
237
|
return lines;
|
|
221
238
|
}
|
|
@@ -405,19 +405,32 @@ function hasProjectState(externalPath) {
|
|
|
405
405
|
* Returns the resolved external path (may differ from the computed identity).
|
|
406
406
|
*/
|
|
407
407
|
function resolveExternalPathWithRecovery(projectPath) {
|
|
408
|
-
const
|
|
408
|
+
const base = process.env.GSD_STATE_DIR || gsdHome();
|
|
409
409
|
const computedId = repoIdentity(projectPath);
|
|
410
|
+
const computedPath = join(base, "projects", computedId);
|
|
411
|
+
const computedHasState = hasProjectState(computedPath);
|
|
412
|
+
const markerId = readGsdIdMarker(projectPath);
|
|
413
|
+
const markerPath = markerId ? join(base, "projects", markerId) : null;
|
|
414
|
+
const markerHasState = markerPath ? hasProjectState(markerPath) : false;
|
|
415
|
+
// Split-brain guard: when marker and computed identities disagree and both
|
|
416
|
+
// directories contain state, prefer the marker-backed directory. This keeps
|
|
417
|
+
// all writers anchored to a single canonical project identity even if a
|
|
418
|
+
// transient identity computation produced a stale computed hash.
|
|
419
|
+
if (markerId
|
|
420
|
+
&& markerPath
|
|
421
|
+
&& markerId !== computedId
|
|
422
|
+
&& markerHasState
|
|
423
|
+
&& computedHasState) {
|
|
424
|
+
return { path: markerPath, identity: markerId };
|
|
425
|
+
}
|
|
410
426
|
// Check if computed path already has state — fast path, no recovery needed.
|
|
411
|
-
if (
|
|
412
|
-
return computedPath;
|
|
427
|
+
if (computedHasState) {
|
|
428
|
+
return { path: computedPath, identity: computedId };
|
|
413
429
|
}
|
|
414
430
|
// Check for .gsd-id marker from a previous location.
|
|
415
|
-
|
|
416
|
-
if (markerId && markerId !== computedId) {
|
|
431
|
+
if (markerId && markerPath && markerId !== computedId) {
|
|
417
432
|
// The marker points to a different identity — the repo was likely moved.
|
|
418
|
-
|
|
419
|
-
const markerPath = join(base, "projects", markerId);
|
|
420
|
-
if (hasProjectState(markerPath)) {
|
|
433
|
+
if (markerHasState) {
|
|
421
434
|
// Recover: use the old state directory and update the marker to the new identity.
|
|
422
435
|
// Move the state from the old hash dir to the new one so future lookups work
|
|
423
436
|
// without the marker.
|
|
@@ -446,11 +459,11 @@ function resolveExternalPathWithRecovery(projectPath) {
|
|
|
446
459
|
}
|
|
447
460
|
catch {
|
|
448
461
|
// If migration fails, just point at the old directory.
|
|
449
|
-
return markerPath;
|
|
462
|
+
return { path: markerPath, identity: markerId };
|
|
450
463
|
}
|
|
451
464
|
}
|
|
452
465
|
}
|
|
453
|
-
return computedPath;
|
|
466
|
+
return { path: computedPath, identity: computedId };
|
|
454
467
|
}
|
|
455
468
|
// ─── Symlink Management ─────────────────────────────────────────────────────
|
|
456
469
|
/**
|
|
@@ -467,17 +480,18 @@ function resolveExternalPathWithRecovery(projectPath) {
|
|
|
467
480
|
* Returns the resolved external path.
|
|
468
481
|
*/
|
|
469
482
|
export function ensureGsdSymlink(projectPath) {
|
|
470
|
-
const result = ensureGsdSymlinkCore(projectPath);
|
|
483
|
+
const { path: result, identity } = ensureGsdSymlinkCore(projectPath);
|
|
471
484
|
// Write .gsd-id marker so future relocations can recover this state (#2750).
|
|
472
485
|
// Only write for the project root (not subdirectories or worktrees that
|
|
473
486
|
// delegate to a parent .gsd).
|
|
474
487
|
if (!isInsideWorktree(projectPath)) {
|
|
475
|
-
writeGsdIdMarker(projectPath,
|
|
488
|
+
writeGsdIdMarker(projectPath, identity);
|
|
476
489
|
}
|
|
477
490
|
return result;
|
|
478
491
|
}
|
|
479
492
|
function ensureGsdSymlinkCore(projectPath) {
|
|
480
|
-
const
|
|
493
|
+
const resolved = resolveExternalPathWithRecovery(projectPath);
|
|
494
|
+
const externalPath = resolved.path;
|
|
481
495
|
const localGsd = join(projectPath, ".gsd");
|
|
482
496
|
const inWorktree = isInsideWorktree(projectPath);
|
|
483
497
|
// Guard: Never create a symlink at ~/.gsd — that's the user-level GSD home,
|
|
@@ -498,7 +512,7 @@ function ensureGsdSymlinkCore(projectPath) {
|
|
|
498
512
|
const localGsdNormalized = normalizeForGuard(localGsd);
|
|
499
513
|
const gsdHomeNorm = normalizeForGuard(gsdHome());
|
|
500
514
|
if (localGsdNormalized === gsdHomeNorm) {
|
|
501
|
-
return localGsd;
|
|
515
|
+
return { path: localGsd, identity: resolved.identity };
|
|
502
516
|
}
|
|
503
517
|
// Guard: If projectPath is a plain subdirectory (not a worktree) of a git
|
|
504
518
|
// repo that already has a .gsd at the git root, do not create a duplicate
|
|
@@ -516,7 +530,10 @@ function ensureGsdSymlinkCore(projectPath) {
|
|
|
516
530
|
try {
|
|
517
531
|
const rootStat = lstatSync(rootGsd);
|
|
518
532
|
if (rootStat.isSymbolicLink() || rootStat.isDirectory()) {
|
|
519
|
-
return
|
|
533
|
+
return {
|
|
534
|
+
path: rootStat.isSymbolicLink() ? realpathSync(rootGsd) : rootGsd,
|
|
535
|
+
identity: resolved.identity,
|
|
536
|
+
};
|
|
520
537
|
}
|
|
521
538
|
}
|
|
522
539
|
catch {
|
|
@@ -544,7 +561,7 @@ function ensureGsdSymlinkCore(projectPath) {
|
|
|
544
561
|
}
|
|
545
562
|
catch { /* already gone */ }
|
|
546
563
|
symlinkSync(externalPath, localGsd, "junction");
|
|
547
|
-
return
|
|
564
|
+
return resolved;
|
|
548
565
|
};
|
|
549
566
|
// Check for dangling symlinks (e.g. after relocation recovery removed the old
|
|
550
567
|
// state dir). existsSync follows symlinks, so it returns false for dangling ones.
|
|
@@ -567,7 +584,7 @@ function ensureGsdSymlinkCore(projectPath) {
|
|
|
567
584
|
}
|
|
568
585
|
catch { /* nothing to remove */ }
|
|
569
586
|
symlinkSync(externalPath, localGsd, "junction");
|
|
570
|
-
return
|
|
587
|
+
return resolved;
|
|
571
588
|
}
|
|
572
589
|
try {
|
|
573
590
|
const stat = lstatSync(localGsd);
|
|
@@ -575,7 +592,7 @@ function ensureGsdSymlinkCore(projectPath) {
|
|
|
575
592
|
// Already a symlink — verify it points to the right place
|
|
576
593
|
const target = realpathSync(localGsd);
|
|
577
594
|
if (target === externalPath) {
|
|
578
|
-
return
|
|
595
|
+
return resolved; // correct symlink, no-op
|
|
579
596
|
}
|
|
580
597
|
// In a worktree, mismatched symlinks are always stale. Heal them so
|
|
581
598
|
// the worktree points at the same external state dir as the main repo.
|
|
@@ -610,24 +627,24 @@ function ensureGsdSymlinkCore(projectPath) {
|
|
|
610
627
|
}
|
|
611
628
|
catch {
|
|
612
629
|
// Migration failed — preserve old symlink
|
|
613
|
-
return target;
|
|
630
|
+
return { path: target, identity: resolved.identity };
|
|
614
631
|
}
|
|
615
632
|
}
|
|
616
633
|
// Outside worktrees, preserve custom overrides or legacy symlinks.
|
|
617
|
-
return target;
|
|
634
|
+
return { path: target, identity: resolved.identity };
|
|
618
635
|
}
|
|
619
636
|
if (stat.isDirectory()) {
|
|
620
637
|
// Real directory in the main repo — migration will handle this later.
|
|
621
638
|
// In worktrees, keep the directory in place and let syncGsdStateToWorktree
|
|
622
639
|
// refresh its contents. Replacing a git-tracked .gsd directory with a
|
|
623
640
|
// symlink makes git think tracked planning files were deleted.
|
|
624
|
-
return localGsd;
|
|
641
|
+
return { path: localGsd, identity: resolved.identity };
|
|
625
642
|
}
|
|
626
643
|
}
|
|
627
644
|
catch {
|
|
628
645
|
// lstat failed — path exists but we can't stat it
|
|
629
646
|
}
|
|
630
|
-
return localGsd;
|
|
647
|
+
return { path: localGsd, identity: resolved.identity };
|
|
631
648
|
}
|
|
632
649
|
// ─── Worktree Detection ─────────────────────────────────────────────────────
|
|
633
650
|
/**
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// GSD-2 + Repository registry seam for parent workspace multi-repo resolution.
|
|
2
|
+
import { isAbsolute, relative, resolve } from "node:path";
|
|
3
|
+
import { resolveGsdPathContract } from "./paths.js";
|
|
4
|
+
function assertInsideProjectRoot(projectRoot, candidateRoot, repoId) {
|
|
5
|
+
const rel = relative(projectRoot, candidateRoot);
|
|
6
|
+
if (rel === "")
|
|
7
|
+
return;
|
|
8
|
+
if (rel.startsWith("..") || isAbsolute(rel)) {
|
|
9
|
+
throw new Error(`workspace.repositories.${repoId}.path resolves outside project root: ${candidateRoot}`);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
function resolveRepositoryRoot(projectRoot, repoId, repo) {
|
|
13
|
+
const root = resolve(projectRoot, repo.path);
|
|
14
|
+
assertInsideProjectRoot(projectRoot, root, repoId);
|
|
15
|
+
return {
|
|
16
|
+
id: repoId,
|
|
17
|
+
root,
|
|
18
|
+
role: repo.role,
|
|
19
|
+
verification: repo.verification,
|
|
20
|
+
commitPolicy: repo.commit_policy,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export function createRepositoryRegistry(basePath, workspacePrefs) {
|
|
24
|
+
const contract = resolveGsdPathContract(basePath);
|
|
25
|
+
const projectRoot = contract.projectRoot;
|
|
26
|
+
const mode = workspacePrefs?.mode ?? "project";
|
|
27
|
+
const repoMap = new Map();
|
|
28
|
+
// Backward-compatible default for single-repo projects.
|
|
29
|
+
// Explicit workspacePrefs?.repositories entries can override "project"
|
|
30
|
+
// via resolveRepositoryRoot to customize role/verification/commit policy.
|
|
31
|
+
repoMap.set("project", { id: "project", root: projectRoot });
|
|
32
|
+
for (const [repoId, repoConfig] of Object.entries(workspacePrefs?.repositories ?? {})) {
|
|
33
|
+
repoMap.set(repoId, resolveRepositoryRoot(projectRoot, repoId, repoConfig));
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
projectRoot,
|
|
37
|
+
mode,
|
|
38
|
+
repositories: Array.from(repoMap.values()),
|
|
39
|
+
byId: repoMap,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
export function createRepositoryRegistryFromPreferences(basePath, preferences) {
|
|
43
|
+
return createRepositoryRegistry(basePath, preferences?.workspace);
|
|
44
|
+
}
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
export function crossReferenceEvidence(claimedEvidence, actualEvidence) {
|
|
16
16
|
const bashCalls = actualEvidence.filter((e) => e.kind === "bash");
|
|
17
17
|
const mismatches = [];
|
|
18
|
-
for (const claimed of claimedEvidence) {
|
|
18
|
+
for (const claimed of latestClaimBatch(claimedEvidence)) {
|
|
19
19
|
// Skip coerced entries — they're already flagged with exitCode: -1
|
|
20
20
|
// and verdict: "unknown (coerced from string)" by db-tools.ts
|
|
21
21
|
if (claimed.verdict?.includes("coerced from string"))
|
|
@@ -25,9 +25,11 @@ export function crossReferenceEvidence(claimedEvidence, actualEvidence) {
|
|
|
25
25
|
// Skip entries with empty or generic commands
|
|
26
26
|
if (!claimed.command || claimed.command.length < 3)
|
|
27
27
|
continue;
|
|
28
|
-
// Find matching bash
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
// Find matching bash calls by command similarity. A command may be retried
|
|
29
|
+
// after a failed first run; the newest matching execution is the one that
|
|
30
|
+
// supports or rejects a claimed pass.
|
|
31
|
+
const matches = findMatches(claimed.command, bashCalls);
|
|
32
|
+
if (matches.length === 0) {
|
|
31
33
|
mismatches.push({
|
|
32
34
|
severity: "warning",
|
|
33
35
|
claimed,
|
|
@@ -37,6 +39,7 @@ export function crossReferenceEvidence(claimedEvidence, actualEvidence) {
|
|
|
37
39
|
continue;
|
|
38
40
|
}
|
|
39
41
|
// Exit code mismatch: LLM claims success but actual command failed
|
|
42
|
+
const match = latestMatch(matches);
|
|
40
43
|
if (claimed.exitCode === 0 && match.exitCode !== 0) {
|
|
41
44
|
mismatches.push({
|
|
42
45
|
severity: "error",
|
|
@@ -50,34 +53,55 @@ export function crossReferenceEvidence(claimedEvidence, actualEvidence) {
|
|
|
50
53
|
}
|
|
51
54
|
// ─── Internals ──────────────────────────────────────────────────────────────
|
|
52
55
|
/**
|
|
53
|
-
*
|
|
56
|
+
* Verification evidence rows are append-only across retries, but a task
|
|
57
|
+
* completion inserts one batch at a single created_at timestamp. When that
|
|
58
|
+
* timestamp is present, safety should judge the newest completion claim only.
|
|
59
|
+
*/
|
|
60
|
+
function latestClaimBatch(claimedEvidence) {
|
|
61
|
+
const dated = claimedEvidence
|
|
62
|
+
.map((claim) => ({
|
|
63
|
+
claim,
|
|
64
|
+
time: typeof claim.createdAt === "string" ? Date.parse(claim.createdAt) : Number.NaN,
|
|
65
|
+
}))
|
|
66
|
+
.filter((entry) => Number.isFinite(entry.time));
|
|
67
|
+
if (dated.length === 0)
|
|
68
|
+
return claimedEvidence;
|
|
69
|
+
const latestTime = Math.max(...dated.map((entry) => entry.time));
|
|
70
|
+
return claimedEvidence.filter((claim) => (typeof claim.createdAt === "string" && Date.parse(claim.createdAt) === latestTime));
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Find bash evidence entries matching a claimed command.
|
|
54
74
|
* Uses substring matching — the claimed command may be a shortened version
|
|
55
75
|
* of the actual command, or vice versa.
|
|
56
76
|
*/
|
|
57
|
-
function
|
|
77
|
+
function findMatches(claimedCommand, bashCalls) {
|
|
58
78
|
const normalized = claimedCommand.trim();
|
|
59
|
-
// Exact
|
|
60
|
-
const exact = bashCalls.
|
|
61
|
-
if (exact)
|
|
79
|
+
// Exact matches first
|
|
80
|
+
const exact = bashCalls.filter(b => b.command.trim() === normalized);
|
|
81
|
+
if (exact.length > 0)
|
|
62
82
|
return exact;
|
|
63
83
|
// Substring match: claimed is contained in actual or actual in claimed
|
|
64
|
-
const substring = bashCalls.
|
|
65
|
-
if (substring)
|
|
84
|
+
const substring = bashCalls.filter(b => b.command.includes(normalized) || normalized.includes(b.command));
|
|
85
|
+
if (substring.length > 0)
|
|
66
86
|
return substring;
|
|
67
87
|
// Token match: split on whitespace and check significant overlap
|
|
68
88
|
const claimedTokens = normalized.split(/\s+/).filter(t => t.length > 2);
|
|
69
89
|
if (claimedTokens.length === 0)
|
|
70
|
-
return
|
|
71
|
-
|
|
72
|
-
let bestScore = 0;
|
|
90
|
+
return [];
|
|
91
|
+
const scoredMatches = [];
|
|
73
92
|
for (const call of bashCalls) {
|
|
74
93
|
const callTokens = new Set(call.command.split(/\s+/));
|
|
75
94
|
const matchCount = claimedTokens.filter(t => callTokens.has(t)).length;
|
|
76
95
|
const score = matchCount / claimedTokens.length;
|
|
77
|
-
if (score
|
|
78
|
-
|
|
79
|
-
bestMatch = call;
|
|
96
|
+
if (score >= 0.5) {
|
|
97
|
+
scoredMatches.push({ call, score });
|
|
80
98
|
}
|
|
81
99
|
}
|
|
82
|
-
|
|
100
|
+
const bestScore = Math.max(0, ...scoredMatches.map((match) => match.score));
|
|
101
|
+
return scoredMatches
|
|
102
|
+
.filter((match) => match.score === bestScore)
|
|
103
|
+
.map((match) => match.call);
|
|
104
|
+
}
|
|
105
|
+
function latestMatch(matches) {
|
|
106
|
+
return matches.reduce((latest, match) => (match.timestamp > latest.timestamp ? match : latest));
|
|
83
107
|
}
|
|
@@ -18,8 +18,9 @@
|
|
|
18
18
|
import { createRequire } from "node:module";
|
|
19
19
|
import { existsSync, readFileSync, readdirSync, mkdirSync, unlinkSync, rmSync, statSync } from "node:fs";
|
|
20
20
|
import { join, dirname } from "node:path";
|
|
21
|
-
import { gsdRoot } from "./paths.js";
|
|
21
|
+
import { gsdRoot, normalizeRealPath } from "./paths.js";
|
|
22
22
|
import { atomicWriteSync } from "./atomic-write.js";
|
|
23
|
+
import { markWorkerStoppingByPid } from "./db/auto-workers.js";
|
|
23
24
|
const _require = createRequire(import.meta.url);
|
|
24
25
|
// ─── Module State ───────────────────────────────────────────────────────────
|
|
25
26
|
/** Release function from proper-lockfile — calling it releases the OS lock. */
|
|
@@ -225,6 +226,12 @@ export function acquireSessionLock(basePath) {
|
|
|
225
226
|
mkdirSync(dirname(lp), { recursive: true });
|
|
226
227
|
// Clean up numbered lock file variants from cloud sync conflicts (#1315)
|
|
227
228
|
cleanupStrayLockFiles(basePath);
|
|
229
|
+
// If lock metadata points to a dead PID, mark that worker row stopping so
|
|
230
|
+
// crash diagnostics do not keep surfacing it as active.
|
|
231
|
+
const existingPreflight = readExistingLockData(lp);
|
|
232
|
+
if (existingPreflight?.pid && !isPidAlive(existingPreflight.pid)) {
|
|
233
|
+
markWorkerStoppingByPid(normalizeRealPath(basePath), existingPreflight.pid);
|
|
234
|
+
}
|
|
228
235
|
// Write our lock data first (the content is informational; the OS lock is the real guard)
|
|
229
236
|
const lockData = {
|
|
230
237
|
pid: process.pid,
|
|
@@ -250,7 +257,10 @@ export function acquireSessionLock(basePath) {
|
|
|
250
257
|
const lockDir = lockTarget + ".lock";
|
|
251
258
|
if (existsSync(lockDir)) {
|
|
252
259
|
const existingData = readExistingLockData(lp);
|
|
253
|
-
const
|
|
260
|
+
const deadPid = existingData?.pid && !isPidAlive(existingData.pid) ? existingData.pid : null;
|
|
261
|
+
if (deadPid)
|
|
262
|
+
markWorkerStoppingByPid(normalizeRealPath(basePath), deadPid);
|
|
263
|
+
const isOrphan = !existingData || !!deadPid;
|
|
254
264
|
if (isOrphan) {
|
|
255
265
|
try {
|
|
256
266
|
rmSync(lockDir, { recursive: true, force: true });
|
|
@@ -288,6 +298,9 @@ export function acquireSessionLock(basePath) {
|
|
|
288
298
|
// Check: if auto.lock is gone and no process is alive, the lock dir is stale.
|
|
289
299
|
const existingData = readExistingLockData(lp);
|
|
290
300
|
const existingPid = existingData?.pid;
|
|
301
|
+
if (existingPid && !isPidAlive(existingPid)) {
|
|
302
|
+
markWorkerStoppingByPid(normalizeRealPath(basePath), existingPid);
|
|
303
|
+
}
|
|
291
304
|
// If no lock file or no alive process, try to clean up and re-acquire (#1245)
|
|
292
305
|
if (!existingData || (existingPid && !isPidAlive(existingPid))) {
|
|
293
306
|
try {
|
|
@@ -42,8 +42,8 @@ function extractFilePaths(content) {
|
|
|
42
42
|
* @returns true if parallel is unsafe (>5 shared files or missing plan).
|
|
43
43
|
*/
|
|
44
44
|
export function hasFileConflict(basePath, mid, sliceA, sliceB) {
|
|
45
|
-
const planPathA = join(basePath, ".gsd", "milestones", mid, sliceA,
|
|
46
|
-
const planPathB = join(basePath, ".gsd", "milestones", mid, sliceB,
|
|
45
|
+
const planPathA = join(basePath, ".gsd", "milestones", mid, "slices", sliceA, `${sliceA}-PLAN.md`);
|
|
46
|
+
const planPathB = join(basePath, ".gsd", "milestones", mid, "slices", sliceB, `${sliceB}-PLAN.md`);
|
|
47
47
|
// Conservative: missing PLAN = block
|
|
48
48
|
if (!existsSync(planPathA) || !existsSync(planPathB)) {
|
|
49
49
|
return true;
|