gsd-pi 2.79.0-dev.ece5fd8ba → 2.80.0-dev.c5f2443b3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/github-sync/templates.js +55 -70
- package/dist/resources/extensions/gsd/auto/contracts.js +1 -0
- package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +53 -0
- package/dist/resources/extensions/gsd/auto/loop.js +359 -523
- package/dist/resources/extensions/gsd/auto/orchestrator.js +146 -0
- package/dist/resources/extensions/gsd/auto/phases.js +55 -6
- package/dist/resources/extensions/gsd/auto/session.js +8 -0
- package/dist/resources/extensions/gsd/auto/workflow-custom-engine-dispatch-outcome.js +12 -0
- package/dist/resources/extensions/gsd/auto/workflow-custom-engine-iteration.js +24 -0
- package/dist/resources/extensions/gsd/auto/workflow-custom-engine-reconcile-outcome.js +33 -0
- package/dist/resources/extensions/gsd/auto/workflow-custom-engine-reconcile.js +26 -0
- package/dist/resources/extensions/gsd/auto/workflow-custom-engine-retry.js +49 -0
- package/dist/resources/extensions/gsd/auto/workflow-custom-engine-verify-outcome.js +25 -0
- package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +48 -0
- package/dist/resources/extensions/gsd/auto/workflow-dispatch-ledger.js +26 -0
- package/dist/resources/extensions/gsd/auto/workflow-iteration-completion.js +10 -0
- package/dist/resources/extensions/gsd/auto/workflow-journal-reporter.js +16 -0
- package/dist/resources/extensions/gsd/auto/workflow-kernel.js +263 -0
- package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +36 -0
- package/dist/resources/extensions/gsd/auto/workflow-phase-reporter.js +9 -0
- package/dist/resources/extensions/gsd/auto/workflow-session-lock.js +35 -0
- package/dist/resources/extensions/gsd/auto/workflow-sidecar-iteration.js +24 -0
- package/dist/resources/extensions/gsd/auto/workflow-sidecar-queue.js +26 -0
- package/dist/resources/extensions/gsd/auto/workflow-turn-reporter.js +36 -0
- package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +44 -0
- package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +15 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +3 -0
- package/dist/resources/extensions/gsd/auto-prompts.js +168 -3
- package/dist/resources/extensions/gsd/auto-recovery.js +45 -52
- package/dist/resources/extensions/gsd/auto-runtime-state.js +4 -0
- package/dist/resources/extensions/gsd/auto-verification.js +2 -11
- package/dist/resources/extensions/gsd/auto-worktree.js +87 -38
- package/dist/resources/extensions/gsd/auto.js +159 -2
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +9 -1
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +10 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +11 -5
- package/dist/resources/extensions/gsd/commands-ship.js +23 -46
- package/dist/resources/extensions/gsd/commands-workflow-templates.js +12 -7
- package/dist/resources/extensions/gsd/component-loader.js +5 -11
- package/dist/resources/extensions/gsd/custom-workflow-engine.js +4 -0
- package/dist/resources/extensions/gsd/db-adapter.js +47 -0
- package/dist/resources/extensions/gsd/db-base-schema.js +337 -0
- package/dist/resources/extensions/gsd/db-connection-cache.js +31 -0
- package/dist/resources/extensions/gsd/db-coordination-schema.js +104 -0
- package/dist/resources/extensions/gsd/db-decision-requirement-rows.js +71 -0
- package/dist/resources/extensions/gsd/db-gate-rows.js +16 -0
- package/dist/resources/extensions/gsd/db-lightweight-query-rows.js +29 -0
- package/dist/resources/extensions/gsd/db-memory-fts-schema.js +56 -0
- package/dist/resources/extensions/gsd/db-migration-backup.js +22 -0
- package/dist/resources/extensions/gsd/db-migration-steps.js +394 -0
- package/dist/resources/extensions/gsd/db-milestone-artifact-rows.js +35 -0
- package/dist/resources/extensions/gsd/db-open-state.js +32 -0
- package/dist/resources/extensions/gsd/db-provider.js +108 -0
- package/dist/resources/extensions/gsd/db-runtime-kv-schema.js +27 -0
- package/dist/resources/extensions/gsd/db-schema-metadata.js +23 -0
- package/dist/resources/extensions/gsd/db-task-slice-rows.js +86 -0
- package/dist/resources/extensions/gsd/db-transaction.js +63 -0
- package/dist/resources/extensions/gsd/db-verification-evidence-rows.js +3 -0
- package/dist/resources/extensions/gsd/db-verification-evidence-schema.js +19 -0
- package/dist/resources/extensions/gsd/escalation.js +2 -0
- package/dist/resources/extensions/gsd/gsd-db.js +215 -1519
- package/dist/resources/extensions/gsd/legacy-telemetry.js +70 -0
- package/dist/resources/extensions/gsd/markdown-renderer.js +2 -0
- package/dist/resources/extensions/gsd/model-router.js +9 -6
- package/dist/resources/extensions/gsd/notification-widget.js +21 -3
- package/dist/resources/extensions/gsd/post-execution-checks.js +27 -6
- package/dist/resources/extensions/gsd/pr-evidence.js +76 -0
- package/dist/resources/extensions/gsd/pre-execution-checks.js +2 -0
- package/dist/resources/extensions/gsd/process-task-path.js +61 -0
- package/dist/resources/extensions/gsd/prompt-loader.js +9 -5
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +32 -30
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +23 -34
- package/dist/resources/extensions/gsd/prompts/discuss-headless.md +50 -96
- package/dist/resources/extensions/gsd/prompts/discuss.md +81 -181
- package/dist/resources/extensions/gsd/prompts/execute-task.md +40 -67
- package/dist/resources/extensions/gsd/prompts/forensics.md +41 -84
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +29 -39
- package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +30 -65
- package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +25 -52
- package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +36 -36
- package/dist/resources/extensions/gsd/prompts/guided-research-project.md +20 -38
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +45 -59
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +25 -87
- package/dist/resources/extensions/gsd/prompts/queue.md +46 -53
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +23 -23
- package/dist/resources/extensions/gsd/prompts/research-slice.md +23 -23
- package/dist/resources/extensions/gsd/prompts/rethink.md +10 -10
- package/dist/resources/extensions/gsd/prompts/system.md +65 -107
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +15 -15
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +24 -24
- package/dist/resources/extensions/gsd/prompts/worktree-merge.md +35 -35
- package/dist/resources/extensions/gsd/state.js +4 -0
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +14 -9
- package/dist/resources/extensions/gsd/tools/complete-task.js +2 -0
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +6 -1
- package/dist/resources/extensions/gsd/unit-context-composer.js +1 -1
- package/dist/resources/extensions/gsd/uok/kernel.js +8 -3
- package/dist/resources/extensions/gsd/uok/plan-v2.js +2 -0
- package/dist/resources/extensions/gsd/workflow-logger.js +13 -13
- package/dist/resources/extensions/gsd/workflow-manifest.js +2 -0
- package/dist/resources/extensions/gsd/workflow-projections.js +2 -0
- package/dist/resources/extensions/gsd/workflow-templates.js +9 -0
- package/dist/resources/extensions/shared/interview-ui.js +15 -4
- 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 +13 -13
- package/dist/web/standalone/.next/build-manifest.json +2 -2
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/required-server-files.json +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +13 -13
- package/dist/web/standalone/.next/server/chunks/167.js +2 -0
- 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/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/package.json +1 -0
- package/dist/web/standalone/server.js +1 -1
- package/package.json +9 -2
- package/packages/contracts/dist/index.d.ts +3 -0
- package/packages/contracts/dist/index.d.ts.map +1 -0
- package/packages/contracts/dist/index.js +5 -0
- package/packages/contracts/dist/index.js.map +1 -0
- package/packages/contracts/dist/rpc.d.ts +549 -0
- package/packages/contracts/dist/rpc.d.ts.map +1 -0
- package/packages/contracts/dist/rpc.js +53 -0
- package/packages/contracts/dist/rpc.js.map +1 -0
- package/packages/contracts/dist/rpc.test.d.ts +2 -0
- package/packages/contracts/dist/rpc.test.d.ts.map +1 -0
- package/packages/contracts/dist/rpc.test.js +47 -0
- package/packages/contracts/dist/rpc.test.js.map +1 -0
- package/packages/contracts/dist/workflow.d.ts +180 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -0
- package/packages/contracts/dist/workflow.js +201 -0
- package/packages/contracts/dist/workflow.js.map +1 -0
- package/packages/contracts/package.json +39 -0
- package/packages/contracts/src/index.ts +5 -0
- package/packages/contracts/src/rpc.test.ts +72 -0
- package/packages/contracts/src/rpc.ts +286 -0
- package/packages/contracts/src/workflow.ts +213 -0
- package/packages/contracts/tsconfig.json +25 -0
- package/packages/contracts/tsconfig.tsbuildinfo +1 -0
- package/packages/daemon/package.json +3 -2
- package/packages/daemon/src/event-bridge.test.ts +2 -1
- package/packages/daemon/src/event-bridge.ts +1 -1
- package/packages/daemon/src/event-formatter.test.ts +1 -2
- package/packages/daemon/src/event-formatter.ts +1 -2
- package/packages/daemon/src/session-manager.ts +2 -2
- package/packages/daemon/src/types.ts +3 -18
- package/packages/mcp-server/dist/server.d.ts +13 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +77 -0
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/session-manager.js +1 -1
- package/packages/mcp-server/dist/session-manager.js.map +1 -1
- package/packages/mcp-server/dist/types.d.ts +3 -11
- package/packages/mcp-server/dist/types.d.ts.map +1 -1
- package/packages/mcp-server/dist/types.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +2 -40
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +3 -2
- package/packages/mcp-server/src/mcp-server.test.ts +138 -0
- package/packages/mcp-server/src/server.ts +99 -1
- package/packages/mcp-server/src/session-manager.ts +2 -2
- package/packages/mcp-server/src/types.ts +7 -18
- package/packages/mcp-server/src/workflow-tools.ts +2 -40
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +14 -0
- 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/tool-card-cleanup-and-success-runtime.test.js +20 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +6 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +9 -1
- 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 +31 -10
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts +1 -512
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js +3 -7
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js.map +1 -1
- package/packages/pi-coding-agent/package.json +2 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +23 -2
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +31 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +6 -1
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +50 -9
- package/packages/pi-coding-agent/src/modes/rpc/rpc-types.ts +3 -336
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +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 +8 -2
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/package.json +1 -1
- package/packages/pi-tui/src/tui.ts +8 -2
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/packages/rpc-client/README.md +3 -3
- package/packages/rpc-client/dist/index.d.ts +1 -1
- package/packages/rpc-client/dist/index.d.ts.map +1 -1
- package/packages/rpc-client/dist/index.js.map +1 -1
- package/packages/rpc-client/dist/rpc-client.d.ts +2 -6
- package/packages/rpc-client/dist/rpc-client.d.ts.map +1 -1
- package/packages/rpc-client/dist/rpc-client.js.map +1 -1
- package/packages/rpc-client/dist/rpc-types.d.ts +1 -565
- package/packages/rpc-client/dist/rpc-types.d.ts.map +1 -1
- package/packages/rpc-client/dist/rpc-types.js +3 -11
- package/packages/rpc-client/dist/rpc-types.js.map +1 -1
- package/packages/rpc-client/package.json +4 -1
- package/packages/rpc-client/src/index.ts +1 -1
- package/packages/rpc-client/src/rpc-client.ts +3 -6
- package/packages/rpc-client/src/rpc-types.ts +3 -398
- package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/extensions/github-sync/templates.ts +59 -84
- package/src/resources/extensions/github-sync/tests/templates.test.ts +10 -2
- package/src/resources/extensions/gsd/auto/contracts.ts +87 -0
- package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +72 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +10 -3
- package/src/resources/extensions/gsd/auto/loop.ts +411 -598
- package/src/resources/extensions/gsd/auto/orchestrator.ts +161 -0
- package/src/resources/extensions/gsd/auto/phases.ts +82 -8
- package/src/resources/extensions/gsd/auto/session.ts +11 -0
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-dispatch-outcome.ts +28 -0
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-iteration.ts +52 -0
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile-outcome.ts +58 -0
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile.ts +71 -0
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-retry.ts +90 -0
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-verify-outcome.ts +50 -0
- package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +97 -0
- package/src/resources/extensions/gsd/auto/workflow-dispatch-ledger.ts +45 -0
- package/src/resources/extensions/gsd/auto/workflow-iteration-completion.ts +26 -0
- package/src/resources/extensions/gsd/auto/workflow-journal-reporter.ts +33 -0
- package/src/resources/extensions/gsd/auto/workflow-kernel.ts +520 -0
- package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +58 -0
- package/src/resources/extensions/gsd/auto/workflow-phase-reporter.ts +22 -0
- package/src/resources/extensions/gsd/auto/workflow-session-lock.ts +68 -0
- package/src/resources/extensions/gsd/auto/workflow-sidecar-iteration.ts +46 -0
- package/src/resources/extensions/gsd/auto/workflow-sidecar-queue.ts +46 -0
- package/src/resources/extensions/gsd/auto/workflow-turn-reporter.ts +68 -0
- package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +89 -0
- package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +38 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +4 -0
- package/src/resources/extensions/gsd/auto-prompts.ts +170 -3
- package/src/resources/extensions/gsd/auto-recovery.ts +42 -50
- package/src/resources/extensions/gsd/auto-runtime-state.ts +7 -0
- package/src/resources/extensions/gsd/auto-verification.ts +5 -1
- package/src/resources/extensions/gsd/auto-worktree.ts +85 -36
- package/src/resources/extensions/gsd/auto.ts +167 -1
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +14 -1
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +11 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +13 -5
- package/src/resources/extensions/gsd/commands-ship.ts +24 -51
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +13 -0
- package/src/resources/extensions/gsd/component-loader.ts +5 -11
- package/src/resources/extensions/gsd/custom-workflow-engine.ts +6 -0
- package/src/resources/extensions/gsd/db-adapter.ts +75 -0
- package/src/resources/extensions/gsd/db-base-schema.ts +368 -0
- package/src/resources/extensions/gsd/db-connection-cache.ts +45 -0
- package/src/resources/extensions/gsd/db-coordination-schema.ts +109 -0
- package/src/resources/extensions/gsd/db-decision-requirement-rows.ts +77 -0
- package/src/resources/extensions/gsd/db-gate-rows.ts +19 -0
- package/src/resources/extensions/gsd/db-lightweight-query-rows.ts +50 -0
- package/src/resources/extensions/gsd/db-memory-fts-schema.ts +66 -0
- package/src/resources/extensions/gsd/db-migration-backup.ts +34 -0
- package/src/resources/extensions/gsd/db-migration-steps.ts +434 -0
- package/src/resources/extensions/gsd/db-milestone-artifact-rows.ts +70 -0
- package/src/resources/extensions/gsd/db-open-state.ts +47 -0
- package/src/resources/extensions/gsd/db-provider.ts +148 -0
- package/src/resources/extensions/gsd/db-runtime-kv-schema.ts +30 -0
- package/src/resources/extensions/gsd/db-schema-metadata.ts +33 -0
- package/src/resources/extensions/gsd/db-task-slice-rows.ts +146 -0
- package/src/resources/extensions/gsd/db-transaction.ts +76 -0
- package/src/resources/extensions/gsd/db-verification-evidence-rows.ts +14 -0
- package/src/resources/extensions/gsd/db-verification-evidence-schema.ts +22 -0
- package/src/resources/extensions/gsd/escalation.ts +3 -1
- package/src/resources/extensions/gsd/gsd-db.ts +260 -1659
- package/src/resources/extensions/gsd/interrupted-session.ts +1 -0
- package/src/resources/extensions/gsd/legacy-telemetry.ts +99 -0
- package/src/resources/extensions/gsd/markdown-renderer.ts +4 -1
- package/src/resources/extensions/gsd/model-router.ts +10 -6
- package/src/resources/extensions/gsd/notification-widget.ts +25 -4
- package/src/resources/extensions/gsd/post-execution-checks.ts +35 -7
- package/src/resources/extensions/gsd/pr-evidence.ts +124 -0
- package/src/resources/extensions/gsd/pre-execution-checks.ts +4 -1
- package/src/resources/extensions/gsd/process-task-path.ts +81 -0
- package/src/resources/extensions/gsd/prompt-loader.ts +9 -5
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +32 -30
- package/src/resources/extensions/gsd/prompts/complete-slice.md +23 -34
- package/src/resources/extensions/gsd/prompts/discuss-headless.md +50 -96
- package/src/resources/extensions/gsd/prompts/discuss.md +81 -181
- package/src/resources/extensions/gsd/prompts/execute-task.md +40 -67
- package/src/resources/extensions/gsd/prompts/forensics.md +41 -84
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +29 -39
- package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +30 -65
- package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +25 -52
- package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +36 -36
- package/src/resources/extensions/gsd/prompts/guided-research-project.md +20 -38
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +45 -59
- package/src/resources/extensions/gsd/prompts/plan-slice.md +25 -87
- package/src/resources/extensions/gsd/prompts/queue.md +46 -53
- package/src/resources/extensions/gsd/prompts/refine-slice.md +23 -23
- package/src/resources/extensions/gsd/prompts/research-slice.md +23 -23
- package/src/resources/extensions/gsd/prompts/rethink.md +10 -10
- package/src/resources/extensions/gsd/prompts/system.md +65 -107
- package/src/resources/extensions/gsd/prompts/triage-captures.md +15 -15
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +24 -24
- package/src/resources/extensions/gsd/prompts/worktree-merge.md +35 -35
- package/src/resources/extensions/gsd/state.ts +6 -3
- package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +353 -0
- package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/commands-eval-review.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/commands-ship-eval-warn.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/complete-milestone-prompt-rendering.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +19 -5
- package/src/resources/extensions/gsd/tests/component-loader.test.ts +2 -9
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/db-adapter.test.ts +82 -0
- package/src/resources/extensions/gsd/tests/db-base-schema.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/db-connection-cache.test.ts +60 -0
- package/src/resources/extensions/gsd/tests/db-coordination-schema.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/db-decision-requirement-rows.test.ts +135 -0
- package/src/resources/extensions/gsd/tests/db-gate-rows.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/db-lightweight-query-rows.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/db-memory-fts-schema.test.ts +86 -0
- package/src/resources/extensions/gsd/tests/db-migration-backup.test.ts +105 -0
- package/src/resources/extensions/gsd/tests/db-migration-steps.test.ts +159 -0
- package/src/resources/extensions/gsd/tests/db-milestone-artifact-rows.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/db-open-state.test.ts +56 -0
- package/src/resources/extensions/gsd/tests/db-provider.test.ts +105 -0
- package/src/resources/extensions/gsd/tests/db-runtime-kv-schema.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/db-schema-metadata.test.ts +115 -0
- package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +128 -0
- package/src/resources/extensions/gsd/tests/db-transaction.test.ts +110 -0
- package/src/resources/extensions/gsd/tests/db-verification-evidence-schema.test.ts +76 -0
- package/src/resources/extensions/gsd/tests/discuss-headless-rendering.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +59 -0
- package/src/resources/extensions/gsd/tests/forensics-prompt-rendering.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +95 -0
- package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +43 -0
- package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +41 -0
- package/src/resources/extensions/gsd/tests/guided-discuss-requirements-prompt-rendering.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +79 -0
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +5 -3
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +134 -0
- package/src/resources/extensions/gsd/tests/legacy-component-format-telemetry.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/legacy-telemetry.test.ts +144 -0
- package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +40 -16
- package/src/resources/extensions/gsd/tests/model-router.test.ts +33 -12
- package/src/resources/extensions/gsd/tests/notification-store.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/notification-widget.test.ts +40 -1
- package/src/resources/extensions/gsd/tests/paused-session-via-db.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/plan-milestone-rendering.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +65 -16
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/pr-evidence.test.ts +79 -0
- package/src/resources/extensions/gsd/tests/process-task-path.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +16 -1
- package/src/resources/extensions/gsd/tests/queue-prompt-rendering.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +32 -9
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +6 -6
- package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-dispatch-outcome.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-iteration.test.ts +93 -0
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile-outcome.test.ts +108 -0
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile.test.ts +146 -0
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-retry.test.ts +136 -0
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-verify-outcome.test.ts +95 -0
- package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +158 -0
- package/src/resources/extensions/gsd/tests/workflow-dispatch-ledger.test.ts +82 -0
- package/src/resources/extensions/gsd/tests/workflow-iteration-completion.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/workflow-journal-reporter.test.ts +49 -0
- package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +607 -0
- package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +20 -4
- package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +71 -0
- package/src/resources/extensions/gsd/tests/workflow-phase-reporter.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/workflow-session-lock.test.ts +135 -0
- package/src/resources/extensions/gsd/tests/workflow-sidecar-iteration.test.ts +110 -0
- package/src/resources/extensions/gsd/tests/workflow-sidecar-queue.test.ts +116 -0
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/workflow-turn-reporter.test.ts +87 -0
- package/src/resources/extensions/gsd/tests/workflow-unit-dispatch.test.ts +160 -0
- package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +123 -0
- package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +17 -33
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +15 -9
- package/src/resources/extensions/gsd/tools/complete-task.ts +4 -1
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +6 -1
- package/src/resources/extensions/gsd/unit-context-composer.ts +1 -1
- package/src/resources/extensions/gsd/uok/kernel.ts +10 -3
- package/src/resources/extensions/gsd/uok/plan-v2.ts +5 -1
- package/src/resources/extensions/gsd/workflow-logger.ts +13 -13
- package/src/resources/extensions/gsd/workflow-manifest.ts +6 -15
- package/src/resources/extensions/gsd/workflow-projections.ts +5 -1
- package/src/resources/extensions/gsd/workflow-templates.ts +11 -0
- package/src/resources/extensions/shared/interview-ui.ts +18 -5
- package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +41 -0
- package/dist/web/standalone/.next/server/chunks/6336.js +0 -1
- /package/dist/web/standalone/.next/static/{TzEVJ1Lh8vbez4n4Q9TqQ → bQDK5_LtkGVS64AirQgQG}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{TzEVJ1Lh8vbez4n4Q9TqQ → bQDK5_LtkGVS64AirQgQG}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Unit tests for auto-mode unit dispatch contract adapter.
|
|
3
|
+
|
|
4
|
+
import assert from "node:assert/strict";
|
|
5
|
+
import test from "node:test";
|
|
6
|
+
|
|
7
|
+
import type { SidecarItem } from "../auto/session.ts";
|
|
8
|
+
import type { IterationContext, IterationData, LoopState } from "../auto/types.ts";
|
|
9
|
+
import type { UokGraphNode } from "../uok/contracts.ts";
|
|
10
|
+
import {
|
|
11
|
+
runUnitPhaseViaContract,
|
|
12
|
+
type UnitDispatchScheduler,
|
|
13
|
+
type UnitPhaseResult,
|
|
14
|
+
} from "../auto/workflow-unit-dispatch.ts";
|
|
15
|
+
|
|
16
|
+
function makeIterData(overrides?: Partial<IterationData>): IterationData {
|
|
17
|
+
return {
|
|
18
|
+
unitType: "execute-task",
|
|
19
|
+
unitId: "M001/S001/T001",
|
|
20
|
+
prompt: "Run task",
|
|
21
|
+
finalPrompt: "Run task",
|
|
22
|
+
pauseAfterUatDispatch: false,
|
|
23
|
+
state: {} as IterationData["state"],
|
|
24
|
+
mid: "M001",
|
|
25
|
+
midTitle: "Milestone 1",
|
|
26
|
+
isRetry: false,
|
|
27
|
+
previousTier: undefined,
|
|
28
|
+
...overrides,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function makeSidecarItem(kind: SidecarItem["kind"]): SidecarItem {
|
|
33
|
+
return {
|
|
34
|
+
kind,
|
|
35
|
+
unitType: `sidecar/${kind}`,
|
|
36
|
+
unitId: kind,
|
|
37
|
+
prompt: `Run ${kind}`,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
class FakeScheduler implements UnitDispatchScheduler {
|
|
42
|
+
readonly handlers = new Map<UokGraphNode["kind"], (node: UokGraphNode) => Promise<void>>();
|
|
43
|
+
nodes: UokGraphNode[] = [];
|
|
44
|
+
options: unknown;
|
|
45
|
+
runHandler = true;
|
|
46
|
+
|
|
47
|
+
registerHandler(kind: UokGraphNode["kind"], handler: (node: UokGraphNode) => Promise<void>): void {
|
|
48
|
+
this.handlers.set(kind, handler);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
async run(nodes: UokGraphNode[], options: { parallel: false; maxWorkers: 1 }): Promise<void> {
|
|
52
|
+
this.nodes = nodes;
|
|
53
|
+
this.options = options;
|
|
54
|
+
if (this.runHandler) {
|
|
55
|
+
await this.handlers.get(nodes[0]!.kind)?.(nodes[0]!);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
test("runUnitPhaseViaContract calls legacy runner directly", async () => {
|
|
61
|
+
const result: UnitPhaseResult = { action: "next", data: { unitStartedAt: 1 } };
|
|
62
|
+
const calls: unknown[] = [];
|
|
63
|
+
const sidecarItem = makeSidecarItem("hook");
|
|
64
|
+
|
|
65
|
+
const outcome = await runUnitPhaseViaContract(
|
|
66
|
+
"legacy-direct",
|
|
67
|
+
{ iteration: 3 } as IterationContext,
|
|
68
|
+
makeIterData(),
|
|
69
|
+
{} as LoopState,
|
|
70
|
+
sidecarItem,
|
|
71
|
+
{
|
|
72
|
+
runUnitPhase: async (...args) => {
|
|
73
|
+
calls.push(args);
|
|
74
|
+
return result;
|
|
75
|
+
},
|
|
76
|
+
createScheduler: () => assert.fail("createScheduler should not be called"),
|
|
77
|
+
},
|
|
78
|
+
);
|
|
79
|
+
|
|
80
|
+
assert.equal(outcome, result);
|
|
81
|
+
assert.equal(calls.length, 1);
|
|
82
|
+
assert.equal((calls[0] as unknown[])[3], sidecarItem);
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
test("runUnitPhaseViaContract dispatches through scheduler in uok mode", async () => {
|
|
86
|
+
const scheduler = new FakeScheduler();
|
|
87
|
+
const result: UnitPhaseResult = { action: "next", data: { requestDispatchedAt: 2 } };
|
|
88
|
+
|
|
89
|
+
const outcome = await runUnitPhaseViaContract(
|
|
90
|
+
"uok-scheduler",
|
|
91
|
+
{ iteration: 4 } as IterationContext,
|
|
92
|
+
makeIterData(),
|
|
93
|
+
{} as LoopState,
|
|
94
|
+
undefined,
|
|
95
|
+
{
|
|
96
|
+
runUnitPhase: async () => result,
|
|
97
|
+
createScheduler: () => scheduler,
|
|
98
|
+
},
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
assert.equal(outcome, result);
|
|
102
|
+
assert.deepEqual(Array.from(scheduler.handlers.keys()), [
|
|
103
|
+
"unit",
|
|
104
|
+
"hook",
|
|
105
|
+
"subagent",
|
|
106
|
+
"team-worker",
|
|
107
|
+
"verification",
|
|
108
|
+
"reprocess",
|
|
109
|
+
]);
|
|
110
|
+
assert.deepEqual(scheduler.nodes, [{
|
|
111
|
+
id: "dispatch:4:execute-task:M001/S001/T001",
|
|
112
|
+
kind: "unit",
|
|
113
|
+
dependsOn: [],
|
|
114
|
+
metadata: {
|
|
115
|
+
unitType: "execute-task",
|
|
116
|
+
unitId: "M001/S001/T001",
|
|
117
|
+
},
|
|
118
|
+
}]);
|
|
119
|
+
assert.deepEqual(scheduler.options, { parallel: false, maxWorkers: 1 });
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
test("runUnitPhaseViaContract maps sidecar kind to scheduler node kind", async () => {
|
|
123
|
+
const scheduler = new FakeScheduler();
|
|
124
|
+
|
|
125
|
+
await runUnitPhaseViaContract(
|
|
126
|
+
"uok-scheduler",
|
|
127
|
+
{ iteration: 1 } as IterationContext,
|
|
128
|
+
makeIterData({ unitType: "sidecar/triage", unitId: "triage-1" }),
|
|
129
|
+
{} as LoopState,
|
|
130
|
+
makeSidecarItem("triage"),
|
|
131
|
+
{
|
|
132
|
+
runUnitPhase: async () => ({ action: "next", data: {} }),
|
|
133
|
+
createScheduler: () => scheduler,
|
|
134
|
+
},
|
|
135
|
+
);
|
|
136
|
+
|
|
137
|
+
assert.equal(scheduler.nodes[0]?.kind, "verification");
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
test("runUnitPhaseViaContract breaks when scheduler never runs a handler", async () => {
|
|
141
|
+
const scheduler = new FakeScheduler();
|
|
142
|
+
scheduler.runHandler = false;
|
|
143
|
+
|
|
144
|
+
const outcome = await runUnitPhaseViaContract(
|
|
145
|
+
"uok-scheduler",
|
|
146
|
+
{ iteration: 1 } as IterationContext,
|
|
147
|
+
makeIterData(),
|
|
148
|
+
{} as LoopState,
|
|
149
|
+
undefined,
|
|
150
|
+
{
|
|
151
|
+
runUnitPhase: async () => assert.fail("runUnitPhase should not be called"),
|
|
152
|
+
createScheduler: () => scheduler,
|
|
153
|
+
},
|
|
154
|
+
);
|
|
155
|
+
|
|
156
|
+
assert.deepEqual(outcome, {
|
|
157
|
+
action: "break",
|
|
158
|
+
reason: "scheduler-dispatch-missing-result",
|
|
159
|
+
});
|
|
160
|
+
});
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Unit tests for auto-mode worker heartbeat adapter.
|
|
3
|
+
|
|
4
|
+
import assert from "node:assert/strict";
|
|
5
|
+
import test from "node:test";
|
|
6
|
+
|
|
7
|
+
import {
|
|
8
|
+
maintainWorkerHeartbeat,
|
|
9
|
+
type MaintainWorkerHeartbeatDeps,
|
|
10
|
+
type WorkerHeartbeatSession,
|
|
11
|
+
} from "../auto/workflow-worker-heartbeat.ts";
|
|
12
|
+
|
|
13
|
+
function makeDeps(overrides?: Partial<MaintainWorkerHeartbeatDeps>): {
|
|
14
|
+
deps: MaintainWorkerHeartbeatDeps;
|
|
15
|
+
calls: unknown[];
|
|
16
|
+
errors: unknown[];
|
|
17
|
+
} {
|
|
18
|
+
const calls: unknown[] = [];
|
|
19
|
+
const errors: unknown[] = [];
|
|
20
|
+
const deps: MaintainWorkerHeartbeatDeps = {
|
|
21
|
+
heartbeatAutoWorker: workerId => calls.push(["heartbeat", workerId]),
|
|
22
|
+
refreshMilestoneLease: (workerId, milestoneId, token) => {
|
|
23
|
+
calls.push(["refresh", workerId, milestoneId, token]);
|
|
24
|
+
return true;
|
|
25
|
+
},
|
|
26
|
+
logHeartbeatFailure: err => errors.push(err),
|
|
27
|
+
...overrides,
|
|
28
|
+
};
|
|
29
|
+
return { deps, calls, errors };
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
test("maintainWorkerHeartbeat no-ops without a worker id", () => {
|
|
33
|
+
const { deps, calls, errors } = makeDeps();
|
|
34
|
+
|
|
35
|
+
maintainWorkerHeartbeat({}, deps);
|
|
36
|
+
|
|
37
|
+
assert.deepEqual(calls, []);
|
|
38
|
+
assert.deepEqual(errors, []);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
test("maintainWorkerHeartbeat refreshes worker heartbeat without active lease", () => {
|
|
42
|
+
const { deps, calls, errors } = makeDeps();
|
|
43
|
+
|
|
44
|
+
maintainWorkerHeartbeat({ workerId: "worker-1" }, deps);
|
|
45
|
+
|
|
46
|
+
assert.deepEqual(calls, [["heartbeat", "worker-1"]]);
|
|
47
|
+
assert.deepEqual(errors, []);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
test("maintainWorkerHeartbeat refreshes active milestone lease when token exists", () => {
|
|
51
|
+
const { deps, calls, errors } = makeDeps();
|
|
52
|
+
const session: WorkerHeartbeatSession = {
|
|
53
|
+
workerId: "worker-1",
|
|
54
|
+
currentMilestoneId: "M001",
|
|
55
|
+
milestoneLeaseToken: 7,
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
maintainWorkerHeartbeat(session, deps);
|
|
59
|
+
|
|
60
|
+
assert.deepEqual(calls, [
|
|
61
|
+
["heartbeat", "worker-1"],
|
|
62
|
+
["refresh", "worker-1", "M001", 7],
|
|
63
|
+
]);
|
|
64
|
+
assert.deepEqual(errors, []);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
test("maintainWorkerHeartbeat skips lease refresh when token is null", () => {
|
|
68
|
+
const { deps, calls, errors } = makeDeps();
|
|
69
|
+
|
|
70
|
+
maintainWorkerHeartbeat({
|
|
71
|
+
workerId: "worker-1",
|
|
72
|
+
currentMilestoneId: "M001",
|
|
73
|
+
milestoneLeaseToken: null,
|
|
74
|
+
}, deps);
|
|
75
|
+
|
|
76
|
+
assert.deepEqual(calls, [["heartbeat", "worker-1"]]);
|
|
77
|
+
assert.deepEqual(errors, []);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
test("maintainWorkerHeartbeat logs and suppresses heartbeat failures", () => {
|
|
81
|
+
const failure = new Error("db unavailable");
|
|
82
|
+
const { deps, calls, errors } = makeDeps({
|
|
83
|
+
heartbeatAutoWorker: workerId => {
|
|
84
|
+
calls.push(["heartbeat", workerId]);
|
|
85
|
+
throw failure;
|
|
86
|
+
},
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
assert.doesNotThrow(() => {
|
|
90
|
+
maintainWorkerHeartbeat({
|
|
91
|
+
workerId: "worker-1",
|
|
92
|
+
currentMilestoneId: "M001",
|
|
93
|
+
milestoneLeaseToken: 7,
|
|
94
|
+
}, deps);
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
assert.deepEqual(calls, [["heartbeat", "worker-1"]]);
|
|
98
|
+
assert.deepEqual(errors, [failure]);
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
test("maintainWorkerHeartbeat logs and suppresses lease refresh failures", () => {
|
|
102
|
+
const failure = new Error("lease stale");
|
|
103
|
+
const { deps, calls, errors } = makeDeps({
|
|
104
|
+
refreshMilestoneLease: (workerId, milestoneId, token) => {
|
|
105
|
+
calls.push(["refresh", workerId, milestoneId, token]);
|
|
106
|
+
throw failure;
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
assert.doesNotThrow(() => {
|
|
111
|
+
maintainWorkerHeartbeat({
|
|
112
|
+
workerId: "worker-1",
|
|
113
|
+
currentMilestoneId: "M001",
|
|
114
|
+
milestoneLeaseToken: 7,
|
|
115
|
+
}, deps);
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
assert.deepEqual(calls, [
|
|
119
|
+
["heartbeat", "worker-1"],
|
|
120
|
+
["refresh", "worker-1", "M001", 7],
|
|
121
|
+
]);
|
|
122
|
+
assert.deepEqual(errors, [failure]);
|
|
123
|
+
});
|
|
@@ -17,8 +17,8 @@
|
|
|
17
17
|
*
|
|
18
18
|
* This rewrite builds a real git parent repo + local submodule, creates
|
|
19
19
|
* a worktree, dirties a tracked file inside the submodule, then invokes
|
|
20
|
-
* `removeWorktree` and asserts observable behaviour
|
|
21
|
-
*
|
|
20
|
+
* `removeWorktree` and asserts observable behaviour through the workflow log
|
|
21
|
+
* buffer and on the filesystem (the worktree is gone).
|
|
22
22
|
*/
|
|
23
23
|
|
|
24
24
|
import { describe, test, beforeEach, afterEach } from "node:test";
|
|
@@ -35,6 +35,7 @@ import { join } from "node:path";
|
|
|
35
35
|
import { tmpdir } from "node:os";
|
|
36
36
|
|
|
37
37
|
import { createWorktree, removeWorktree } from "../worktree-manager.ts";
|
|
38
|
+
import { _resetLogs, peekLogs } from "../workflow-logger.ts";
|
|
38
39
|
|
|
39
40
|
interface Harness {
|
|
40
41
|
parent: string;
|
|
@@ -112,53 +113,38 @@ function makeHarness(): Harness {
|
|
|
112
113
|
};
|
|
113
114
|
}
|
|
114
115
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
function captureStderr(fn: () => void): string {
|
|
118
|
-
const streamAny = process.stderr as unknown as {
|
|
119
|
-
write: (chunk: string | Uint8Array, ...rest: unknown[]) => boolean;
|
|
120
|
-
};
|
|
121
|
-
const original = streamAny.write.bind(streamAny);
|
|
122
|
-
const chunks: string[] = [];
|
|
123
|
-
streamAny.write = (chunk: string | Uint8Array): boolean => {
|
|
124
|
-
chunks.push(typeof chunk === "string" ? chunk : Buffer.from(chunk).toString("utf-8"));
|
|
125
|
-
return true;
|
|
126
|
-
};
|
|
127
|
-
try {
|
|
128
|
-
fn();
|
|
129
|
-
} finally {
|
|
130
|
-
streamAny.write = original;
|
|
131
|
-
}
|
|
132
|
-
return chunks.join("");
|
|
116
|
+
function workflowLogMessages(): string {
|
|
117
|
+
return peekLogs().map((entry) => entry.message).join("\n");
|
|
133
118
|
}
|
|
134
119
|
|
|
135
120
|
describe("removeWorktree preserves submodule uncommitted state (#2337)", () => {
|
|
136
121
|
let h: Harness;
|
|
137
122
|
|
|
138
123
|
beforeEach(() => {
|
|
124
|
+
_resetLogs();
|
|
139
125
|
h = makeHarness();
|
|
140
126
|
});
|
|
141
127
|
|
|
142
128
|
afterEach(() => {
|
|
143
129
|
h.cleanup();
|
|
130
|
+
_resetLogs();
|
|
144
131
|
});
|
|
145
132
|
|
|
146
133
|
test("clean submodules: worktree removes without stashing or submodule warnings", () => {
|
|
147
134
|
const wt = createWorktree(h.parent, "cleanwt");
|
|
148
135
|
runGit(wt.path, ["submodule", "update", "--init", "--recursive"]);
|
|
149
136
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
});
|
|
137
|
+
removeWorktree(h.parent, "cleanwt");
|
|
138
|
+
const logs = workflowLogMessages();
|
|
153
139
|
|
|
154
140
|
assert.ok(!existsSync(wt.path), "worktree directory should be gone");
|
|
155
141
|
assert.doesNotMatch(
|
|
156
|
-
|
|
142
|
+
logs,
|
|
157
143
|
/Saved uncommitted submodule changes to rescue branch/,
|
|
158
144
|
"clean submodule must not trigger rescue-branch creation",
|
|
159
145
|
);
|
|
160
146
|
assert.doesNotMatch(
|
|
161
|
-
|
|
147
|
+
logs,
|
|
162
148
|
/Submodule rescue branch creation failed/,
|
|
163
149
|
"clean submodule must not trigger rescue-branch failure warning",
|
|
164
150
|
);
|
|
@@ -191,9 +177,8 @@ describe("removeWorktree preserves submodule uncommitted state (#2337)", () => {
|
|
|
191
177
|
`precondition: submodule must be diverged, got: "${subStatus}"`,
|
|
192
178
|
);
|
|
193
179
|
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
});
|
|
180
|
+
removeWorktree(h.parent, "dirtywt");
|
|
181
|
+
const logs = workflowLogMessages();
|
|
197
182
|
|
|
198
183
|
// Worktree is gone: force fallback succeeded.
|
|
199
184
|
assert.ok(!existsSync(wt.path), "worktree directory should be removed");
|
|
@@ -205,7 +190,7 @@ describe("removeWorktree preserves submodule uncommitted state (#2337)", () => {
|
|
|
205
190
|
// removal. This is the assertion that #4823 demanded in place of
|
|
206
191
|
// the tautological `src.includes("submodule") && src.includes("force")`.
|
|
207
192
|
assert.match(
|
|
208
|
-
|
|
193
|
+
logs,
|
|
209
194
|
/Saved uncommitted submodule changes to rescue branch|Submodule rescue branch creation failed|Submodule changes detected/,
|
|
210
195
|
"dirty submodule must trigger detection-and-warning path",
|
|
211
196
|
);
|
|
@@ -231,12 +216,11 @@ describe("removeWorktree preserves submodule uncommitted state (#2337)", () => {
|
|
|
231
216
|
renameSync(modPath, hiddenPath);
|
|
232
217
|
}
|
|
233
218
|
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
});
|
|
219
|
+
removeWorktree(h.parent, "no-gitmodules");
|
|
220
|
+
const logs = workflowLogMessages();
|
|
237
221
|
|
|
238
222
|
assert.doesNotMatch(
|
|
239
|
-
|
|
223
|
+
logs,
|
|
240
224
|
/Saved uncommitted submodule changes to rescue branch/,
|
|
241
225
|
"missing .gitmodules should skip submodule detection entirely",
|
|
242
226
|
);
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
// GSD2 complete-milestone tool handler
|
|
1
2
|
/**
|
|
2
3
|
* complete-milestone handler — the core operation behind gsd_complete_milestone.
|
|
3
4
|
*
|
|
@@ -57,6 +58,7 @@ export interface CompleteMilestoneResult {
|
|
|
57
58
|
milestoneId: string;
|
|
58
59
|
summaryPath: string;
|
|
59
60
|
stale?: boolean;
|
|
61
|
+
alreadyComplete?: boolean;
|
|
60
62
|
}
|
|
61
63
|
|
|
62
64
|
function renderMilestoneSummaryMarkdown(params: CompleteMilestoneParams): string {
|
|
@@ -143,6 +145,7 @@ export async function handleCompleteMilestone(
|
|
|
143
145
|
// ── Guards + DB writes inside a single transaction (prevents TOCTOU) ───
|
|
144
146
|
const completedAt = new Date().toISOString();
|
|
145
147
|
let guardError: string | null = null;
|
|
148
|
+
let alreadyComplete = false;
|
|
146
149
|
|
|
147
150
|
transaction(() => {
|
|
148
151
|
// State machine preconditions (inside txn for atomicity)
|
|
@@ -152,7 +155,7 @@ export async function handleCompleteMilestone(
|
|
|
152
155
|
return;
|
|
153
156
|
}
|
|
154
157
|
if (isClosedStatus(milestone.status)) {
|
|
155
|
-
|
|
158
|
+
alreadyComplete = true;
|
|
156
159
|
return;
|
|
157
160
|
}
|
|
158
161
|
|
|
@@ -238,14 +241,16 @@ export async function handleCompleteMilestone(
|
|
|
238
241
|
logWarning("tool", `complete-milestone manifest warning: ${(mfErr as Error).message}`);
|
|
239
242
|
}
|
|
240
243
|
try {
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
244
|
+
if (!alreadyComplete) {
|
|
245
|
+
appendEvent(basePath, {
|
|
246
|
+
cmd: "complete-milestone",
|
|
247
|
+
params: { milestoneId: params.milestoneId },
|
|
248
|
+
ts: new Date().toISOString(),
|
|
249
|
+
actor: "agent",
|
|
250
|
+
actor_name: params.actorName,
|
|
251
|
+
trigger_reason: params.triggerReason,
|
|
252
|
+
});
|
|
253
|
+
}
|
|
249
254
|
} catch (eventErr) {
|
|
250
255
|
logError("tool", `complete-milestone event log FAILED — completion invisible to reconciliation`, { error: (eventErr as Error).message });
|
|
251
256
|
}
|
|
@@ -254,5 +259,6 @@ export async function handleCompleteMilestone(
|
|
|
254
259
|
milestoneId: params.milestoneId,
|
|
255
260
|
summaryPath,
|
|
256
261
|
...(projectionStale ? { stale: true } : {}),
|
|
262
|
+
...(alreadyComplete ? { alreadyComplete: true } : {}),
|
|
257
263
|
};
|
|
258
264
|
}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Complete-task tool handler for GSD workflow state and summaries.
|
|
3
|
+
|
|
1
4
|
/**
|
|
2
5
|
* complete-task handler — the core operation behind gsd_complete_task.
|
|
3
6
|
*
|
|
@@ -55,7 +58,7 @@ export interface CompleteTaskResult {
|
|
|
55
58
|
stale?: boolean;
|
|
56
59
|
}
|
|
57
60
|
|
|
58
|
-
import type { TaskRow } from "../
|
|
61
|
+
import type { TaskRow } from "../db-task-slice-rows.js";
|
|
59
62
|
|
|
60
63
|
/**
|
|
61
64
|
* Map an execute-task-owned gate id to the CompleteTaskParams field whose
|
|
@@ -477,12 +477,17 @@ export async function executeCompleteMilestone(
|
|
|
477
477
|
isError: true,
|
|
478
478
|
};
|
|
479
479
|
}
|
|
480
|
+
const message = result.alreadyComplete
|
|
481
|
+
? `Milestone ${result.milestoneId} is already complete. Summary available at ${result.summaryPath}`
|
|
482
|
+
: `Completed milestone ${result.milestoneId}. Summary written to ${result.summaryPath}`;
|
|
480
483
|
return {
|
|
481
|
-
content: [{ type: "text", text:
|
|
484
|
+
content: [{ type: "text", text: message }],
|
|
482
485
|
details: {
|
|
483
486
|
operation: "complete_milestone",
|
|
484
487
|
milestoneId: result.milestoneId,
|
|
485
488
|
summaryPath: result.summaryPath,
|
|
489
|
+
...(result.alreadyComplete ? { alreadyComplete: true } : {}),
|
|
490
|
+
...(result.stale ? { stale: true } : {}),
|
|
486
491
|
},
|
|
487
492
|
};
|
|
488
493
|
} catch (err) {
|
|
@@ -113,7 +113,7 @@ const CONTEXT_MODE_LANE_LABELS: Record<Exclude<ContextModePolicy, "none">, strin
|
|
|
113
113
|
};
|
|
114
114
|
|
|
115
115
|
const CONTEXT_MODE_GUIDANCE =
|
|
116
|
-
"Use `gsd_exec` for noisy
|
|
116
|
+
"Use `gsd_exec` for noisy commands, `gsd_exec_search` before reruns, and `gsd_resume` after compaction or resume.";
|
|
117
117
|
|
|
118
118
|
/**
|
|
119
119
|
* Render the Context Mode instruction lane for a unit type. Unknown unit
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Selects the UOK kernel path and records parity diagnostics.
|
|
1
3
|
import type { ExtensionAPI, ExtensionContext } from "@gsd/pi-coding-agent";
|
|
2
4
|
import { appendFileSync, mkdirSync } from "node:fs";
|
|
3
5
|
import { join } from "node:path";
|
|
@@ -9,6 +11,7 @@ import { buildAuditEnvelope, emitUokAuditEvent } from "./audit.js";
|
|
|
9
11
|
import { setUnifiedAuditEnabled } from "./audit-toggle.js";
|
|
10
12
|
import { resolveUokFlags } from "./flags.js";
|
|
11
13
|
import { createTurnObserver } from "./loop-adapter.js";
|
|
14
|
+
import { incrementLegacyTelemetry } from "../legacy-telemetry.js";
|
|
12
15
|
|
|
13
16
|
interface RunAutoLoopWithUokArgs {
|
|
14
17
|
ctx: ExtensionContext;
|
|
@@ -54,10 +57,14 @@ export async function runAutoLoopWithUok(args: RunAutoLoopWithUokArgs): Promise<
|
|
|
54
57
|
const prefs = deps.loadEffectiveGSDPreferences()?.preferences;
|
|
55
58
|
const flags = resolveUokFlags(prefs);
|
|
56
59
|
setUnifiedAuditEnabled(flags.auditUnified);
|
|
60
|
+
const pathLabel = resolveKernelPathLabel(flags);
|
|
61
|
+
if (pathLabel !== "uok-kernel") {
|
|
62
|
+
incrementLegacyTelemetry("legacy.uokFallbackUsed");
|
|
63
|
+
}
|
|
57
64
|
|
|
58
65
|
writeParityEvent(s.basePath, {
|
|
59
66
|
ts: new Date().toISOString(),
|
|
60
|
-
path:
|
|
67
|
+
path: pathLabel,
|
|
61
68
|
flags,
|
|
62
69
|
phase: "enter",
|
|
63
70
|
});
|
|
@@ -98,7 +105,7 @@ export async function runAutoLoopWithUok(args: RunAutoLoopWithUokArgs): Promise<
|
|
|
98
105
|
}
|
|
99
106
|
writeParityEvent(s.basePath, {
|
|
100
107
|
ts: new Date().toISOString(),
|
|
101
|
-
path:
|
|
108
|
+
path: pathLabel,
|
|
102
109
|
flags,
|
|
103
110
|
phase: "exit",
|
|
104
111
|
status: "ok",
|
|
@@ -106,7 +113,7 @@ export async function runAutoLoopWithUok(args: RunAutoLoopWithUokArgs): Promise<
|
|
|
106
113
|
} catch (err) {
|
|
107
114
|
writeParityEvent(s.basePath, {
|
|
108
115
|
ts: new Date().toISOString(),
|
|
109
|
-
path:
|
|
116
|
+
path: pathLabel,
|
|
110
117
|
flags,
|
|
111
118
|
phase: "exit",
|
|
112
119
|
status: "error",
|
|
@@ -1,9 +1,13 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: UOK plan v2 graph compilation from GSD workflow state.
|
|
3
|
+
|
|
1
4
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
5
|
import { join } from "node:path";
|
|
3
6
|
|
|
4
7
|
import type { GSDState, Phase } from "../types.js";
|
|
5
8
|
import { gsdRoot, resolveMilestoneFile, resolveSliceFile } from "../paths.js";
|
|
6
|
-
import { isDbAvailable, getMilestoneSlices, getSliceTasks
|
|
9
|
+
import { isDbAvailable, getMilestoneSlices, getSliceTasks } from "../gsd-db.js";
|
|
10
|
+
import type { SliceRow } from "../db-task-slice-rows.js";
|
|
7
11
|
import type { UokGraphNode } from "./contracts.js";
|
|
8
12
|
|
|
9
13
|
const PLAN_V2_CLARIFY_ROUND_LIMIT = 3;
|
|
@@ -3,13 +3,12 @@
|
|
|
3
3
|
// Captures structured entries that the auto-loop can drain after each unit
|
|
4
4
|
// to surface root causes for stuck loops, silent degradation, and blocked writes.
|
|
5
5
|
// Error-severity entries are persisted to .gsd/audit-log.jsonl (sanitized) for
|
|
6
|
-
// post-mortem analysis. Warnings
|
|
7
|
-
//
|
|
6
|
+
// post-mortem analysis. Warnings persist to notifications and remain available
|
|
7
|
+
// in the in-memory buffer, but are not printed to stderr.
|
|
8
8
|
//
|
|
9
|
-
// Stderr policy:
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
// warnings/errors that should always be visible. There is no disable flag.
|
|
9
|
+
// Stderr policy: logError writes immediately to stderr for terminal visibility.
|
|
10
|
+
// logWarning stays out of the TUI/stdout stream and is surfaced through the
|
|
11
|
+
// notification store plus the auto-loop issue buffer.
|
|
13
12
|
//
|
|
14
13
|
// Singleton safety: _buffer is module-level and shared across all calls within
|
|
15
14
|
// a process. The auto-loop must call _resetLogs() (or drainAndSummarize()) at
|
|
@@ -109,7 +108,8 @@ export function setStderrLoggingEnabled(enabled: boolean): boolean {
|
|
|
109
108
|
// ─── Public API ─────────────────────────────────────────────────────────
|
|
110
109
|
|
|
111
110
|
/**
|
|
112
|
-
* Record a warning.
|
|
111
|
+
* Record a warning. Warnings are persisted to notifications and buffered for
|
|
112
|
+
* auto-loop issue summaries, but they are intentionally not written to stderr.
|
|
113
113
|
*/
|
|
114
114
|
export function logWarning(
|
|
115
115
|
component: LogComponent,
|
|
@@ -271,10 +271,10 @@ function _push(
|
|
|
271
271
|
...(context ? { context } : {}),
|
|
272
272
|
};
|
|
273
273
|
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
274
|
+
if (severity === "error") {
|
|
275
|
+
const ctxStr = context ? ` ${JSON.stringify(context)}` : "";
|
|
276
|
+
_writeStderr(`[gsd:${component}] ERROR: ${message}${ctxStr}\n`);
|
|
277
|
+
}
|
|
278
278
|
|
|
279
279
|
// Persist to notification store (both warnings and errors)
|
|
280
280
|
try {
|
|
@@ -317,8 +317,8 @@ function _push(
|
|
|
317
317
|
}
|
|
318
318
|
|
|
319
319
|
// Persist errors to .gsd/audit-log.jsonl so they survive context resets.
|
|
320
|
-
//
|
|
321
|
-
//
|
|
320
|
+
// Warnings are already persisted to notifications and buffered for the
|
|
321
|
+
// current auto-loop unit.
|
|
322
322
|
if (_auditBasePath && severity === "error") {
|
|
323
323
|
try {
|
|
324
324
|
const auditDir = join(_auditBasePath, ".gsd");
|
|
@@ -1,11 +1,14 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: State manifest snapshot and restore orchestration for GSD workflow data.
|
|
3
|
+
|
|
1
4
|
import {
|
|
2
5
|
_getAdapter,
|
|
3
6
|
readTransaction,
|
|
4
7
|
restoreManifest,
|
|
5
|
-
type MilestoneRow,
|
|
6
|
-
type SliceRow,
|
|
7
|
-
type TaskRow,
|
|
8
8
|
} from "./gsd-db.js";
|
|
9
|
+
import type { MilestoneRow } from "./db-milestone-artifact-rows.js";
|
|
10
|
+
import type { SliceRow, TaskRow } from "./db-task-slice-rows.js";
|
|
11
|
+
import type { VerificationEvidenceRow } from "./db-verification-evidence-rows.js";
|
|
9
12
|
import type { Decision } from "./types.js";
|
|
10
13
|
import { atomicWriteSync } from "./atomic-write.js";
|
|
11
14
|
import { readFileSync, existsSync, mkdirSync } from "node:fs";
|
|
@@ -13,18 +16,6 @@ import { join } from "node:path";
|
|
|
13
16
|
|
|
14
17
|
// ─── Manifest Types ──────────────────────────────────────────────────────
|
|
15
18
|
|
|
16
|
-
export interface VerificationEvidenceRow {
|
|
17
|
-
id: number;
|
|
18
|
-
task_id: string;
|
|
19
|
-
slice_id: string;
|
|
20
|
-
milestone_id: string;
|
|
21
|
-
command: string;
|
|
22
|
-
exit_code: number | null;
|
|
23
|
-
verdict: string;
|
|
24
|
-
duration_ms: number | null;
|
|
25
|
-
created_at: string;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
19
|
export interface StateManifest {
|
|
29
20
|
version: 1;
|
|
30
21
|
exported_at: string; // ISO 8601
|