gsd-pi 2.44.0 → 2.45.0-dev.1afbdaa
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 +30 -12
- package/dist/help-text.js +1 -1
- package/dist/loader.js +34 -0
- package/dist/resources/extensions/gsd/activity-log.js +7 -0
- package/dist/resources/extensions/gsd/auto/infra-errors.js +3 -0
- package/dist/resources/extensions/gsd/auto/phases.js +63 -77
- package/dist/resources/extensions/gsd/auto/run-unit.js +6 -3
- package/dist/resources/extensions/gsd/auto/session.js +0 -11
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +112 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +25 -96
- package/dist/resources/extensions/gsd/auto-prompts.js +24 -1
- package/dist/resources/extensions/gsd/auto-start.js +33 -5
- package/dist/resources/extensions/gsd/auto-timers.js +57 -3
- package/dist/resources/extensions/gsd/auto-worktree-sync.js +4 -0
- package/dist/resources/extensions/gsd/auto-worktree.js +14 -10
- package/dist/resources/extensions/gsd/auto.js +42 -60
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +170 -11
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +18 -0
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +46 -12
- package/dist/resources/extensions/gsd/commands/catalog.js +7 -1
- package/dist/resources/extensions/gsd/commands/context.js +0 -4
- package/dist/resources/extensions/gsd/commands/handlers/core.js +2 -0
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +10 -0
- package/dist/resources/extensions/gsd/commands/handlers/parallel.js +1 -1
- package/dist/resources/extensions/gsd/commands/handlers/workflow.js +5 -0
- package/dist/resources/extensions/gsd/commands-mcp-status.js +187 -0
- package/dist/resources/extensions/gsd/crash-recovery.js +2 -4
- package/dist/resources/extensions/gsd/dashboard-overlay.js +0 -44
- package/dist/resources/extensions/gsd/db-writer.js +40 -22
- package/dist/resources/extensions/gsd/doctor-checks.js +167 -2
- package/dist/resources/extensions/gsd/doctor.js +13 -3
- package/dist/resources/extensions/gsd/git-service.js +8 -3
- package/dist/resources/extensions/gsd/gsd-db.js +28 -4
- package/dist/resources/extensions/gsd/guided-flow.js +1 -2
- package/dist/resources/extensions/gsd/markdown-renderer.js +1 -1
- package/dist/resources/extensions/gsd/parallel-merge.js +1 -1
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +5 -18
- package/dist/resources/extensions/gsd/preferences-types.js +2 -2
- package/dist/resources/extensions/gsd/preferences.js +17 -5
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +21 -10
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +10 -23
- package/dist/resources/extensions/gsd/prompts/discuss.md +2 -2
- package/dist/resources/extensions/gsd/prompts/execute-task.md +5 -15
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-research-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +5 -3
- package/dist/resources/extensions/gsd/prompts/queue.md +2 -2
- package/dist/resources/extensions/gsd/prompts/quick-task.md +2 -0
- package/dist/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
- package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -6
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +3 -14
- package/dist/resources/extensions/gsd/prompts/research-slice.md +3 -3
- package/dist/resources/extensions/gsd/prompts/rethink.md +83 -0
- package/dist/resources/extensions/gsd/prompts/system.md +1 -1
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +7 -37
- package/dist/resources/extensions/gsd/provider-error-pause.js +7 -0
- package/dist/resources/extensions/gsd/repo-identity.js +45 -7
- package/dist/resources/extensions/gsd/rethink.js +115 -0
- package/dist/resources/extensions/gsd/session-lock.js +1 -3
- package/dist/resources/extensions/gsd/state.js +48 -3
- package/dist/resources/extensions/gsd/sync-lock.js +89 -0
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +61 -11
- package/dist/resources/extensions/gsd/tools/complete-slice.js +56 -11
- package/dist/resources/extensions/gsd/tools/complete-task.js +50 -2
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +37 -1
- package/dist/resources/extensions/gsd/tools/plan-slice.js +31 -1
- package/dist/resources/extensions/gsd/tools/plan-task.js +28 -1
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +32 -2
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +86 -0
- package/dist/resources/extensions/gsd/tools/reopen-task.js +90 -0
- package/dist/resources/extensions/gsd/tools/replan-slice.js +34 -2
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +88 -0
- package/dist/resources/extensions/gsd/unit-ownership.js +85 -0
- package/dist/resources/extensions/gsd/workflow-events.js +102 -0
- package/dist/resources/extensions/gsd/workflow-logger.js +193 -0
- package/dist/resources/extensions/gsd/workflow-manifest.js +244 -0
- package/dist/resources/extensions/gsd/workflow-migration.js +280 -0
- package/dist/resources/extensions/gsd/workflow-projections.js +373 -0
- package/dist/resources/extensions/gsd/workflow-reconcile.js +411 -0
- package/dist/resources/extensions/gsd/worktree-manager.js +34 -3
- package/dist/resources/extensions/gsd/worktree-resolver.js +43 -0
- package/dist/resources/extensions/gsd/write-intercept.js +84 -0
- package/dist/resources/extensions/mcp-client/index.js +14 -0
- package/dist/resources/extensions/voice/index.js +11 -16
- package/dist/resources/extensions/voice/linux-ready.js +67 -0
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
- package/dist/web/standalone/.next/build-manifest.json +4 -4
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
- package/dist/web/standalone/.next/required-server-files.json +3 -3
- 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 +2 -2
- 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_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 +5 -5
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +5 -5
- 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 -4
- 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 -2
- 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/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/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 +5 -5
- 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 +2 -2
- 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 +2 -2
- 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 +4 -4
- 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 +6 -6
- 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 +6 -6
- 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 -4
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/page.js +2 -2
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
- package/dist/web/standalone/.next/server/chunks/229.js +1 -1
- package/dist/web/standalone/.next/server/chunks/471.js +3 -3
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/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 +2 -2
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/4024.11ca5c01938e5948.js +9 -0
- package/dist/web/standalone/.next/static/chunks/{3721.bf31263de6d5fa46.js → 485.243af25f0cdf50d6.js} +2 -2
- 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-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-6654a8cca61a3d1c.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-0a4cd455ec4197d2.js +1 -0
- package/dist/web/standalone/.next/static/css/dd4ae3f58ac9b600.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/package.json +2 -1
- package/packages/native/dist/stream-process/index.js +2 -2
- package/packages/native/src/__tests__/stream-process.test.mjs +34 -0
- package/packages/native/src/stream-process/index.ts +2 -2
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +3 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +15 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js +6 -8
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +2 -0
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +24 -26
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +2 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/fs-utils.test.js +29 -48
- package/packages/pi-coding-agent/dist/core/fs-utils.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts +4 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js +10 -5
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.js +185 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/local-model-check.d.ts +15 -0
- package/packages/pi-coding-agent/dist/core/local-model-check.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/local-model-check.js +41 -0
- package/packages/pi-coding-agent/dist/core/local-model-check.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +239 -10
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts +13 -1
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +40 -3
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/package-commands.test.js +206 -195
- package/packages/pi-coding-agent/dist/core/package-commands.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js +34 -44
- package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.test.js +30 -34
- package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +6 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js +10 -12
- package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/main.js +17 -0
- package/packages/pi-coding-agent/dist/main.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.js +32 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts +3 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +8 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +12 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.d.ts +15 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.js +40 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.js.map +1 -0
- 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 +4 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts +5 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +13 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.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 +17 -8
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -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 +7 -3
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js +43 -47
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/auth-storage.test.ts +7 -7
- package/packages/pi-coding-agent/src/core/auth-storage.ts +15 -1
- package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +2 -0
- package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +26 -26
- package/packages/pi-coding-agent/src/core/extensions/types.ts +2 -1
- package/packages/pi-coding-agent/src/core/fs-utils.test.ts +31 -43
- package/packages/pi-coding-agent/src/core/lifecycle-hooks.test.ts +227 -0
- package/packages/pi-coding-agent/src/core/lifecycle-hooks.ts +11 -5
- package/packages/pi-coding-agent/src/core/local-model-check.ts +45 -0
- package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +297 -11
- package/packages/pi-coding-agent/src/core/model-registry.ts +51 -4
- package/packages/pi-coding-agent/src/core/package-commands.test.ts +227 -205
- package/packages/pi-coding-agent/src/core/resolve-config-value.test.ts +40 -45
- package/packages/pi-coding-agent/src/core/session-manager.test.ts +33 -33
- package/packages/pi-coding-agent/src/core/settings-manager.ts +9 -0
- package/packages/pi-coding-agent/src/core/tools/edit-diff.test.ts +17 -17
- package/packages/pi-coding-agent/src/main.ts +19 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/timestamp.test.ts +38 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +10 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +15 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/timestamp.ts +48 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +3 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +18 -3
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +16 -7
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +8 -1
- package/packages/pi-coding-agent/src/resources/extensions/memory/storage.test.ts +74 -74
- package/pkg/package.json +1 -1
- package/src/resources/extensions/gsd/activity-log.ts +1 -0
- package/src/resources/extensions/gsd/auto/infra-errors.ts +3 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +0 -19
- package/src/resources/extensions/gsd/auto/phases.ts +69 -91
- package/src/resources/extensions/gsd/auto/run-unit.ts +6 -3
- package/src/resources/extensions/gsd/auto/session.ts +0 -18
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +131 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +0 -1
- package/src/resources/extensions/gsd/auto-post-unit.ts +25 -106
- package/src/resources/extensions/gsd/auto-prompts.ts +24 -1
- package/src/resources/extensions/gsd/auto-start.ts +40 -5
- package/src/resources/extensions/gsd/auto-timers.ts +64 -3
- package/src/resources/extensions/gsd/auto-worktree-sync.ts +5 -0
- package/src/resources/extensions/gsd/auto-worktree.ts +17 -11
- package/src/resources/extensions/gsd/auto.ts +44 -86
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +162 -11
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +22 -0
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +48 -11
- package/src/resources/extensions/gsd/commands/catalog.ts +7 -1
- package/src/resources/extensions/gsd/commands/context.ts +0 -5
- package/src/resources/extensions/gsd/commands/handlers/core.ts +2 -0
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +10 -0
- package/src/resources/extensions/gsd/commands/handlers/parallel.ts +1 -1
- package/src/resources/extensions/gsd/commands/handlers/workflow.ts +8 -0
- package/src/resources/extensions/gsd/commands-mcp-status.ts +247 -0
- package/src/resources/extensions/gsd/crash-recovery.ts +1 -5
- package/src/resources/extensions/gsd/dashboard-overlay.ts +0 -50
- package/src/resources/extensions/gsd/db-writer.ts +41 -27
- package/src/resources/extensions/gsd/doctor-checks.ts +180 -2
- package/src/resources/extensions/gsd/doctor-types.ts +7 -1
- package/src/resources/extensions/gsd/doctor.ts +13 -4
- package/src/resources/extensions/gsd/git-service.ts +6 -2
- package/src/resources/extensions/gsd/gsd-db.ts +32 -4
- package/src/resources/extensions/gsd/guided-flow.ts +1 -2
- package/src/resources/extensions/gsd/journal.ts +6 -1
- package/src/resources/extensions/gsd/markdown-renderer.ts +1 -1
- package/src/resources/extensions/gsd/parallel-merge.ts +1 -1
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +5 -21
- package/src/resources/extensions/gsd/preferences-types.ts +2 -2
- package/src/resources/extensions/gsd/preferences.ts +18 -4
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +21 -10
- package/src/resources/extensions/gsd/prompts/complete-slice.md +10 -23
- package/src/resources/extensions/gsd/prompts/discuss.md +2 -2
- package/src/resources/extensions/gsd/prompts/execute-task.md +5 -15
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-research-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +5 -3
- package/src/resources/extensions/gsd/prompts/queue.md +2 -2
- package/src/resources/extensions/gsd/prompts/quick-task.md +2 -0
- package/src/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
- package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -6
- package/src/resources/extensions/gsd/prompts/replan-slice.md +3 -14
- package/src/resources/extensions/gsd/prompts/research-slice.md +3 -3
- package/src/resources/extensions/gsd/prompts/rethink.md +83 -0
- package/src/resources/extensions/gsd/prompts/system.md +1 -1
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +7 -37
- package/src/resources/extensions/gsd/provider-error-pause.ts +9 -0
- package/src/resources/extensions/gsd/repo-identity.ts +46 -7
- package/src/resources/extensions/gsd/rethink.ts +154 -0
- package/src/resources/extensions/gsd/session-lock.ts +0 -4
- package/src/resources/extensions/gsd/state.ts +49 -1
- package/src/resources/extensions/gsd/sync-lock.ts +94 -0
- package/src/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +99 -99
- package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +19 -29
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +6 -10
- package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +43 -57
- package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +88 -0
- package/src/resources/extensions/gsd/tests/auto-preflight.test.ts +11 -13
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +465 -523
- package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +73 -75
- package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +34 -56
- package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +533 -656
- package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +165 -143
- package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +29 -52
- package/src/resources/extensions/gsd/tests/captures.test.ts +148 -176
- package/src/resources/extensions/gsd/tests/claude-import-tui.test.ts +32 -33
- package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +141 -143
- package/src/resources/extensions/gsd/tests/commands-inspect-open-db.test.ts +25 -25
- package/src/resources/extensions/gsd/tests/commands-logs.test.ts +81 -81
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +134 -59
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +15 -14
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +27 -12
- package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +114 -0
- package/src/resources/extensions/gsd/tests/context-store.test.ts +354 -367
- package/src/resources/extensions/gsd/tests/continue-here.test.ts +68 -72
- package/src/resources/extensions/gsd/tests/cost-projection.test.ts +92 -106
- package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +26 -40
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +0 -3
- package/src/resources/extensions/gsd/tests/dashboard-budget.test.ts +220 -237
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +465 -416
- package/src/resources/extensions/gsd/tests/definition-loader.test.ts +76 -92
- package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +68 -83
- package/src/resources/extensions/gsd/tests/derive-state-db-disk-reconcile.test.ts +121 -0
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +210 -181
- package/src/resources/extensions/gsd/tests/derive-state-deps.test.ts +78 -101
- package/src/resources/extensions/gsd/tests/derive-state.test.ts +192 -227
- package/src/resources/extensions/gsd/tests/detection.test.ts +232 -278
- package/src/resources/extensions/gsd/tests/dev-engine-wrapper.test.ts +30 -34
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +164 -180
- package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +43 -49
- package/src/resources/extensions/gsd/tests/dispatch-uat-last-completed.test.ts +28 -32
- package/src/resources/extensions/gsd/tests/doctor-completion-deferral.test.ts +27 -29
- package/src/resources/extensions/gsd/tests/doctor-delimiter-fix.test.ts +34 -38
- package/src/resources/extensions/gsd/tests/doctor-enhancements.test.ts +54 -75
- package/src/resources/extensions/gsd/tests/doctor-environment-worktree.test.ts +21 -32
- package/src/resources/extensions/gsd/tests/doctor-environment.test.ts +72 -97
- package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +38 -44
- package/src/resources/extensions/gsd/tests/doctor-git.test.ts +104 -145
- package/src/resources/extensions/gsd/tests/doctor-proactive.test.ts +84 -106
- package/src/resources/extensions/gsd/tests/doctor-roadmap-summary-atomicity.test.ts +54 -60
- package/src/resources/extensions/gsd/tests/doctor-runtime.test.ts +72 -93
- package/src/resources/extensions/gsd/tests/doctor.test.ts +104 -134
- package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +123 -131
- package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/exit-command.test.ts +20 -24
- package/src/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +48 -57
- package/src/resources/extensions/gsd/tests/files-loadfile-eisdir.test.ts +5 -7
- package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +30 -42
- package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +198 -206
- package/src/resources/extensions/gsd/tests/git-locale.test.ts +13 -27
- package/src/resources/extensions/gsd/tests/git-service.test.ts +285 -388
- package/src/resources/extensions/gsd/tests/gitignore-tracked-gsd.test.ts +31 -39
- package/src/resources/extensions/gsd/tests/graph-operations.test.ts +63 -69
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +255 -264
- package/src/resources/extensions/gsd/tests/gsd-inspect.test.ts +108 -119
- package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +81 -103
- package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +229 -262
- package/src/resources/extensions/gsd/tests/headless-answers.test.ts +13 -13
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +29 -37
- package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +82 -103
- package/src/resources/extensions/gsd/tests/infra-error.test.ts +20 -2
- package/src/resources/extensions/gsd/tests/inherited-repo-home-dir.test.ts +121 -0
- package/src/resources/extensions/gsd/tests/init-wizard.test.ts +16 -18
- package/src/resources/extensions/gsd/tests/integration-edge.test.ts +41 -46
- package/src/resources/extensions/gsd/tests/integration-lifecycle.test.ts +42 -53
- package/src/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +75 -91
- package/src/resources/extensions/gsd/tests/integration-proof.test.ts +33 -42
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +0 -3
- package/src/resources/extensions/gsd/tests/knowledge.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +150 -194
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +103 -0
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +101 -125
- package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +45 -54
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +81 -94
- package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/migrate-command.test.ts +57 -66
- package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +83 -93
- package/src/resources/extensions/gsd/tests/migrate-parser.test.ts +161 -170
- package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +125 -141
- package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +107 -131
- package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +87 -96
- package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +125 -164
- package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +8 -9
- package/src/resources/extensions/gsd/tests/must-have-parser.test.ts +81 -94
- package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +75 -37
- package/src/resources/extensions/gsd/tests/overrides.test.ts +99 -106
- package/src/resources/extensions/gsd/tests/parallel-budget-atomicity.test.ts +0 -1
- package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +39 -53
- package/src/resources/extensions/gsd/tests/parallel-merge.test.ts +7 -8
- package/src/resources/extensions/gsd/tests/parallel-orchestration.test.ts +20 -24
- package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +24 -29
- package/src/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +66 -83
- package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +54 -77
- package/src/resources/extensions/gsd/tests/park-milestone.test.ts +68 -115
- package/src/resources/extensions/gsd/tests/parsers.test.ts +546 -611
- package/src/resources/extensions/gsd/tests/paths.test.ts +72 -87
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +9 -6
- package/src/resources/extensions/gsd/tests/post-mutation-hook.test.ts +171 -0
- package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +77 -117
- package/src/resources/extensions/gsd/tests/preferences.test.ts +34 -9
- package/src/resources/extensions/gsd/tests/projection-regression.test.ts +174 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +26 -21
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +56 -56
- package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +93 -119
- package/src/resources/extensions/gsd/tests/queue-order.test.ts +70 -82
- package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +42 -55
- package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/quick-branch-lifecycle.test.ts +45 -73
- package/src/resources/extensions/gsd/tests/reassess-prompt.test.ts +28 -38
- package/src/resources/extensions/gsd/tests/recovery-attempts-reset.test.ts +176 -0
- package/src/resources/extensions/gsd/tests/reopen-slice.test.ts +155 -0
- package/src/resources/extensions/gsd/tests/reopen-task.test.ts +165 -0
- package/src/resources/extensions/gsd/tests/replan-slice.test.ts +73 -80
- package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +71 -74
- package/src/resources/extensions/gsd/tests/requirements.test.ts +70 -75
- package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +44 -66
- package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +114 -181
- package/src/resources/extensions/gsd/tests/rule-registry.test.ts +63 -65
- package/src/resources/extensions/gsd/tests/run-uat.test.ts +66 -128
- package/src/resources/extensions/gsd/tests/session-lock-multipath.test.ts +18 -25
- package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +37 -47
- package/src/resources/extensions/gsd/tests/shared-wal.test.ts +19 -26
- package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +6 -8
- package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/stop-auto-remote.test.ts +2 -3
- package/src/resources/extensions/gsd/tests/survivor-branch-complete.test.ts +108 -0
- package/src/resources/extensions/gsd/tests/symlink-numbered-variants.test.ts +22 -28
- package/src/resources/extensions/gsd/tests/sync-lock.test.ts +122 -0
- package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +49 -0
- package/src/resources/extensions/gsd/tests/token-savings.test.ts +54 -56
- package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +23 -25
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +10 -11
- package/src/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +66 -82
- package/src/resources/extensions/gsd/tests/unit-ownership.test.ts +175 -0
- package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +46 -47
- package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +20 -22
- package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -86
- package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +41 -43
- package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +94 -96
- package/src/resources/extensions/gsd/tests/windows-path-normalization.test.ts +11 -13
- package/src/resources/extensions/gsd/tests/worker-registry.test.ts +27 -29
- package/src/resources/extensions/gsd/tests/workflow-events.test.ts +205 -0
- package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +275 -0
- package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +186 -0
- package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +171 -0
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +50 -52
- package/src/resources/extensions/gsd/tests/worktree-bugfix.test.ts +10 -13
- package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +14 -18
- package/src/resources/extensions/gsd/tests/worktree-db.test.ts +38 -39
- package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +17 -21
- package/src/resources/extensions/gsd/tests/worktree-health.test.ts +25 -30
- package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +30 -37
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +220 -0
- package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +15 -22
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +59 -66
- package/src/resources/extensions/gsd/tests/worktree.test.ts +44 -50
- package/src/resources/extensions/gsd/tests/write-intercept.test.ts +76 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +74 -11
- package/src/resources/extensions/gsd/tools/complete-slice.ts +68 -11
- package/src/resources/extensions/gsd/tools/complete-task.ts +63 -1
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +45 -0
- package/src/resources/extensions/gsd/tools/plan-slice.ts +40 -0
- package/src/resources/extensions/gsd/tools/plan-task.ts +37 -1
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +39 -1
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +125 -0
- package/src/resources/extensions/gsd/tools/reopen-task.ts +129 -0
- package/src/resources/extensions/gsd/tools/replan-slice.ts +41 -1
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +127 -0
- package/src/resources/extensions/gsd/types.ts +8 -0
- package/src/resources/extensions/gsd/unit-ownership.ts +104 -0
- package/src/resources/extensions/gsd/workflow-events.ts +154 -0
- package/src/resources/extensions/gsd/workflow-logger.ts +243 -0
- package/src/resources/extensions/gsd/workflow-manifest.ts +334 -0
- package/src/resources/extensions/gsd/workflow-migration.ts +345 -0
- package/src/resources/extensions/gsd/workflow-projections.ts +425 -0
- package/src/resources/extensions/gsd/workflow-reconcile.ts +503 -0
- package/src/resources/extensions/gsd/worktree-manager.ts +41 -5
- package/src/resources/extensions/gsd/worktree-resolver.ts +44 -0
- package/src/resources/extensions/gsd/write-intercept.ts +90 -0
- package/src/resources/extensions/mcp-client/index.ts +20 -0
- package/src/resources/extensions/voice/index.ts +11 -21
- package/src/resources/extensions/voice/linux-ready.ts +87 -0
- package/src/resources/extensions/voice/tests/linux-ready.test.ts +124 -0
- package/dist/web/standalone/.next/static/chunks/4024.0de81b543b28b9fe.js +0 -9
- package/dist/web/standalone/.next/static/chunks/app/page-7e9530a7122506c5.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/chunks/webpack-9014b5adb127a98a.js +0 -1
- package/dist/web/standalone/.next/static/css/8a727f372cf53002.css +0 -1
- /package/dist/web/standalone/.next/static/{mgkxN0mGP6gSUmGPEzbk_ → j-BskPs0nxxPeYY-bSrab}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{mgkxN0mGP6gSUmGPEzbk_ → j-BskPs0nxxPeYY-bSrab}/_ssgManifest.js +0 -0
|
@@ -10,12 +10,11 @@
|
|
|
10
10
|
* 6. completedUnits counter increments on assistant message_end
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
+
import assert from 'node:assert/strict';
|
|
13
14
|
import { describe, it, after } from "node:test";
|
|
14
15
|
import { mkdtempSync, rmSync, writeFileSync, mkdirSync } from "node:fs";
|
|
15
16
|
import { join } from "node:path";
|
|
16
17
|
import { tmpdir } from "node:os";
|
|
17
|
-
import { createTestContext } from "./test-helpers.ts";
|
|
18
|
-
|
|
19
18
|
// We test processWorkerLine indirectly via the module's exported state.
|
|
20
19
|
// To test the internal function, we use the exported accessors.
|
|
21
20
|
import {
|
|
@@ -27,8 +26,6 @@ import {
|
|
|
27
26
|
refreshWorkerStatuses,
|
|
28
27
|
} from "../parallel-orchestrator.ts";
|
|
29
28
|
|
|
30
|
-
const { assertEq, assertTrue, report } = createTestContext();
|
|
31
|
-
|
|
32
29
|
// ─── Helpers ──────────────────────────────────────────────────────────────
|
|
33
30
|
|
|
34
31
|
/** Create a minimal message_end NDJSON line with cost data. */
|
|
@@ -52,7 +49,7 @@ function makeMessageEndLine(cost: number, role = "assistant"): string {
|
|
|
52
49
|
describe("parallel-worker-monitoring", () => {
|
|
53
50
|
after(() => {
|
|
54
51
|
resetOrchestrator();
|
|
55
|
-
|
|
52
|
+
|
|
56
53
|
});
|
|
57
54
|
|
|
58
55
|
// Note: processWorkerLine is not exported, so we test the observable effects
|
|
@@ -61,39 +58,39 @@ describe("parallel-worker-monitoring", () => {
|
|
|
61
58
|
|
|
62
59
|
it("isBudgetExceeded returns false when no state exists", () => {
|
|
63
60
|
resetOrchestrator();
|
|
64
|
-
|
|
61
|
+
assert.ok(!isBudgetExceeded(), "no state = not exceeded");
|
|
65
62
|
});
|
|
66
63
|
|
|
67
64
|
it("isBudgetExceeded returns false when no ceiling configured", () => {
|
|
68
65
|
resetOrchestrator();
|
|
69
66
|
// Can't directly set state without startParallel, so test the accessor
|
|
70
|
-
|
|
67
|
+
assert.ok(!isBudgetExceeded(), "no ceiling = not exceeded");
|
|
71
68
|
});
|
|
72
69
|
|
|
73
70
|
it("getAggregateCost returns 0 when no state exists", () => {
|
|
74
71
|
resetOrchestrator();
|
|
75
|
-
|
|
72
|
+
assert.deepStrictEqual(getAggregateCost(), 0, "no state = zero cost");
|
|
76
73
|
});
|
|
77
74
|
|
|
78
75
|
it("isParallelActive returns false after reset", () => {
|
|
79
76
|
resetOrchestrator();
|
|
80
|
-
|
|
77
|
+
assert.ok(!isParallelActive(), "reset = not active");
|
|
81
78
|
});
|
|
82
79
|
|
|
83
80
|
it("getWorkerStatuses returns empty array when no state", () => {
|
|
84
81
|
resetOrchestrator();
|
|
85
|
-
|
|
82
|
+
assert.deepStrictEqual(getWorkerStatuses().length, 0, "no state = empty workers");
|
|
86
83
|
});
|
|
87
84
|
|
|
88
85
|
it("NDJSON message_end format matches expected structure", () => {
|
|
89
86
|
// Verify the NDJSON line format we expect from workers
|
|
90
87
|
const line = makeMessageEndLine(0.05);
|
|
91
88
|
const parsed = JSON.parse(line);
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
89
|
+
assert.deepStrictEqual(parsed.type, "message_end", "type is message_end");
|
|
90
|
+
assert.deepStrictEqual(parsed.message.role, "assistant", "role is assistant");
|
|
91
|
+
assert.deepStrictEqual(parsed.message.usage.cost.total, 0.05, "cost.total is 0.05");
|
|
92
|
+
assert.ok(typeof parsed.message.usage.input === "number", "input is number");
|
|
93
|
+
assert.ok(typeof parsed.message.usage.output === "number", "output is number");
|
|
97
94
|
});
|
|
98
95
|
|
|
99
96
|
it("malformed JSON does not throw (tested via parse safety)", () => {
|
|
@@ -111,7 +108,7 @@ describe("parallel-worker-monitoring", () => {
|
|
|
111
108
|
JSON.parse(line);
|
|
112
109
|
} catch {
|
|
113
110
|
// Expected — processWorkerLine catches this silently
|
|
114
|
-
|
|
111
|
+
assert.ok(true, `malformed line "${line.slice(0, 20)}" handled`);
|
|
115
112
|
}
|
|
116
113
|
}
|
|
117
114
|
});
|
|
@@ -122,25 +119,25 @@ describe("parallel-worker-monitoring", () => {
|
|
|
122
119
|
let total = 0;
|
|
123
120
|
for (const c of costs) total += c;
|
|
124
121
|
// Floating point: round to 2 decimal places for comparison
|
|
125
|
-
|
|
122
|
+
assert.deepStrictEqual(Math.round(total * 100) / 100, 0.28, "cost sum is correct");
|
|
126
123
|
});
|
|
127
124
|
|
|
128
125
|
it("budget ceiling comparison works with typical values", () => {
|
|
129
126
|
// Test the ceiling check pattern
|
|
130
127
|
const ceiling = 5.0;
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
128
|
+
assert.ok(0 < ceiling, "0 is under ceiling");
|
|
129
|
+
assert.ok(4.99 < ceiling, "4.99 is under ceiling");
|
|
130
|
+
assert.ok(!(5.0 < ceiling), "5.0 is at ceiling");
|
|
131
|
+
assert.ok(!(5.01 < ceiling), "5.01 is over ceiling");
|
|
135
132
|
});
|
|
136
133
|
|
|
137
134
|
it("worker spawn args include --mode json", () => {
|
|
138
135
|
// Verify the spawn command includes JSON mode for NDJSON output.
|
|
139
136
|
// We can't easily test the actual spawn, but we verify the args pattern.
|
|
140
137
|
const expectedArgs = ["--mode", "json", "--print", "/gsd auto"];
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
138
|
+
assert.ok(expectedArgs.includes("--mode"), "args include --mode");
|
|
139
|
+
assert.ok(expectedArgs.includes("json"), "args include json");
|
|
140
|
+
assert.ok(expectedArgs.indexOf("--mode") < expectedArgs.indexOf("json"),
|
|
144
141
|
"--mode comes before json");
|
|
145
142
|
});
|
|
146
143
|
|
|
@@ -158,7 +155,6 @@ describe("parallel-worker-monitoring", () => {
|
|
|
158
155
|
worktreePath: "/tmp/wt-M001",
|
|
159
156
|
startedAt: Date.now(),
|
|
160
157
|
state: "running",
|
|
161
|
-
completedUnits: 1,
|
|
162
158
|
cost: 0.1,
|
|
163
159
|
},
|
|
164
160
|
],
|
|
@@ -168,8 +164,8 @@ describe("parallel-worker-monitoring", () => {
|
|
|
168
164
|
}, null, 2));
|
|
169
165
|
refreshWorkerStatuses(base, { restoreIfNeeded: true });
|
|
170
166
|
const workers = getWorkerStatuses();
|
|
171
|
-
|
|
172
|
-
|
|
167
|
+
assert.deepStrictEqual(workers.length, 1, "restored one worker");
|
|
168
|
+
assert.deepStrictEqual(workers[0].milestoneId, "M001", "worker restored from persisted state");
|
|
173
169
|
} finally {
|
|
174
170
|
resetOrchestrator();
|
|
175
171
|
rmSync(base, { recursive: true, force: true });
|
|
@@ -193,8 +189,7 @@ describe("parallel-worker-monitoring", () => {
|
|
|
193
189
|
}, null, 2));
|
|
194
190
|
refreshWorkerStatuses(base, { restoreIfNeeded: true });
|
|
195
191
|
const workers = getWorkerStatuses();
|
|
196
|
-
|
|
197
|
-
assertEq(workers[0].completedUnits, 3, "completed units restored from status file");
|
|
192
|
+
assert.deepStrictEqual(workers[0].state, "running", "live session status restored");
|
|
198
193
|
} finally {
|
|
199
194
|
resetOrchestrator();
|
|
200
195
|
rmSync(base, { recursive: true, force: true });
|
|
@@ -13,11 +13,12 @@
|
|
|
13
13
|
* - Cost projection with budget ceiling awareness
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
|
+
import { describe, test } from 'node:test';
|
|
17
|
+
import assert from 'node:assert/strict';
|
|
16
18
|
import { mkdtempSync, mkdirSync, rmSync, writeFileSync, readFileSync } from 'node:fs';
|
|
17
19
|
import { join } from 'node:path';
|
|
18
20
|
import { tmpdir } from 'node:os';
|
|
19
21
|
|
|
20
|
-
import { createTestContext } from './test-helpers.ts';
|
|
21
22
|
import {
|
|
22
23
|
registerWorker,
|
|
23
24
|
updateWorker,
|
|
@@ -43,8 +44,6 @@ import {
|
|
|
43
44
|
predictRemainingCost,
|
|
44
45
|
} from '../metrics.ts';
|
|
45
46
|
|
|
46
|
-
const { assertEq, assertTrue, assertMatch, report } = createTestContext();
|
|
47
|
-
|
|
48
47
|
// ─── Fixture helpers ──────────────────────────────────────────────────────────
|
|
49
48
|
|
|
50
49
|
function createFixtureBase(): string {
|
|
@@ -83,9 +82,9 @@ function cleanup(base: string): void {
|
|
|
83
82
|
|
|
84
83
|
// ─── E2E: Parallel workers across M001 and M002 ──────────────────────────────
|
|
85
84
|
|
|
86
|
-
console.log("\n=== E2E: Parallel workers across milestones ===");
|
|
87
85
|
|
|
88
|
-
{
|
|
86
|
+
describe('parallel-workers-multi-milestone-e2e', () => {
|
|
87
|
+
test('E2E: Parallel workers across milestones', () => {
|
|
89
88
|
resetWorkerRegistry();
|
|
90
89
|
const base = createFixtureBase();
|
|
91
90
|
|
|
@@ -99,52 +98,49 @@ console.log("\n=== E2E: Parallel workers across milestones ===");
|
|
|
99
98
|
const w2 = registerWorker("researcher", "Research M001 APIs", 1, 3, batch1Id);
|
|
100
99
|
const w3 = registerWorker("worker", "Implement M001 feature", 2, 3, batch1Id);
|
|
101
100
|
|
|
102
|
-
|
|
103
|
-
|
|
101
|
+
assert.deepStrictEqual(getActiveWorkers().length, 3, "M001: 3 parallel workers registered");
|
|
102
|
+
assert.ok(hasActiveWorkers(), "M001: has active workers");
|
|
104
103
|
|
|
105
104
|
const batches1 = getWorkerBatches();
|
|
106
|
-
|
|
107
|
-
|
|
105
|
+
assert.deepStrictEqual(batches1.size, 1, "M001: single batch");
|
|
106
|
+
assert.deepStrictEqual(batches1.get(batch1Id)!.length, 3, "M001: batch has 3 workers");
|
|
108
107
|
|
|
109
108
|
// Complete M001 workers
|
|
110
109
|
updateWorker(w1, "completed");
|
|
111
110
|
updateWorker(w2, "completed");
|
|
112
111
|
updateWorker(w3, "completed");
|
|
113
|
-
|
|
112
|
+
assert.ok(!hasActiveWorkers(), "M001: no active workers after completion");
|
|
114
113
|
|
|
115
114
|
// Simulate M002 parallel workers (batch 2) — overlapping with M001 cleanup
|
|
116
115
|
const batch2Id = "batch-m002";
|
|
117
116
|
const w4 = registerWorker("scout", "Explore M002 codebase", 0, 2, batch2Id);
|
|
118
117
|
const w5 = registerWorker("worker", "Implement M002 feature", 1, 2, batch2Id);
|
|
119
118
|
|
|
120
|
-
|
|
119
|
+
assert.ok(hasActiveWorkers(), "M002: has active workers");
|
|
121
120
|
const batches2 = getWorkerBatches();
|
|
122
121
|
// M001 workers may still be in cleanup window (5s timeout), M002 workers are active
|
|
123
|
-
|
|
124
|
-
|
|
122
|
+
assert.ok(batches2.has(batch2Id), "M002: batch exists");
|
|
123
|
+
assert.deepStrictEqual(batches2.get(batch2Id)!.length, 2, "M002: batch has 2 workers");
|
|
125
124
|
|
|
126
125
|
// One worker fails in M002
|
|
127
126
|
updateWorker(w4, "completed");
|
|
128
127
|
updateWorker(w5, "failed");
|
|
129
|
-
|
|
128
|
+
assert.ok(!hasActiveWorkers(), "M002: no active workers after all finish");
|
|
130
129
|
|
|
131
130
|
// Verify worker statuses reflect correctly
|
|
132
131
|
const allWorkers = getActiveWorkers();
|
|
133
132
|
const m002Workers = allWorkers.filter(w => w.batchId === batch2Id);
|
|
134
133
|
if (m002Workers.length > 0) {
|
|
135
134
|
const failedWorker = m002Workers.find(w => w.status === "failed");
|
|
136
|
-
|
|
137
|
-
|
|
135
|
+
assert.ok(failedWorker !== undefined, "M002: failed worker tracked");
|
|
136
|
+
assert.deepStrictEqual(failedWorker?.agent, "worker", "M002: failed worker is 'worker'");
|
|
138
137
|
}
|
|
139
138
|
|
|
140
139
|
cleanup(base);
|
|
141
|
-
}
|
|
140
|
+
});
|
|
142
141
|
|
|
143
142
|
// ─── E2E: Metrics accumulation across milestones ──────────────────────────────
|
|
144
|
-
|
|
145
|
-
console.log("\n=== E2E: Metrics across milestones ===");
|
|
146
|
-
|
|
147
|
-
{
|
|
143
|
+
test('E2E: Metrics across milestones', () => {
|
|
148
144
|
const base = createFixtureBase();
|
|
149
145
|
|
|
150
146
|
// Build a ledger spanning two milestones
|
|
@@ -175,90 +171,84 @@ console.log("\n=== E2E: Metrics across milestones ===");
|
|
|
175
171
|
|
|
176
172
|
// Verify totals
|
|
177
173
|
const totals = getProjectTotals(loaded.units);
|
|
178
|
-
|
|
174
|
+
assert.deepStrictEqual(totals.units, 13, "metrics: 13 total units across M001+M002");
|
|
179
175
|
const totalCost = loaded.units.reduce((sum, u) => sum + u.cost, 0);
|
|
180
|
-
|
|
176
|
+
assert.ok(Math.abs(totals.cost - totalCost) < 0.001, "metrics: total cost matches sum");
|
|
181
177
|
|
|
182
178
|
// Verify phase aggregation
|
|
183
179
|
const phases = aggregateByPhase(loaded.units);
|
|
184
180
|
const research = phases.find(p => p.phase === "research");
|
|
185
|
-
|
|
186
|
-
|
|
181
|
+
assert.ok(research !== undefined, "metrics: research phase exists");
|
|
182
|
+
assert.deepStrictEqual(research!.units, 2, "metrics: 2 research units (M001 + M002)");
|
|
187
183
|
|
|
188
184
|
const execution = phases.find(p => p.phase === "execution");
|
|
189
|
-
|
|
190
|
-
|
|
185
|
+
assert.ok(execution !== undefined, "metrics: execution phase exists");
|
|
186
|
+
assert.deepStrictEqual(execution!.units, 4, "metrics: 4 execution units across both milestones");
|
|
191
187
|
|
|
192
188
|
// Verify slice aggregation
|
|
193
189
|
const slices = aggregateBySlice(loaded.units);
|
|
194
|
-
|
|
190
|
+
assert.ok(slices.length >= 4, "metrics: at least 4 slice aggregates (M001/S01, M001/S02, M002/S01, milestone-level)");
|
|
195
191
|
|
|
196
192
|
const m001s01 = slices.find(s => s.sliceId === "M001/S01");
|
|
197
|
-
|
|
193
|
+
assert.ok(m001s01 !== undefined, "metrics: M001/S01 slice aggregate exists");
|
|
198
194
|
// M001/S01 has: plan-slice + T01 + T02 + complete-slice = 4 units
|
|
199
|
-
|
|
195
|
+
assert.deepStrictEqual(m001s01!.units, 4, "metrics: M001/S01 has 4 units");
|
|
200
196
|
|
|
201
197
|
// Cost projection
|
|
202
198
|
const projLines = formatCostProjection(slices, 3, 2.0);
|
|
203
|
-
|
|
204
|
-
|
|
199
|
+
assert.ok(projLines.length >= 1, "metrics: cost projection generated");
|
|
200
|
+
assert.match(projLines[0], /Projected remaining/, "metrics: projection line text");
|
|
205
201
|
|
|
206
202
|
cleanup(base);
|
|
207
|
-
}
|
|
203
|
+
});
|
|
208
204
|
|
|
209
205
|
// ─── E2E: Budget alert progression through all thresholds ─────────────────────
|
|
210
|
-
|
|
211
|
-
console.log("\n=== E2E: Budget alert progression 0→75→80→90→100 ===");
|
|
212
|
-
|
|
213
|
-
{
|
|
206
|
+
test('E2E: Budget alert progression 0→75→80→90→100', () => {
|
|
214
207
|
// Simulate spending progression against a $10 budget ceiling
|
|
215
208
|
const ceiling = 10.0;
|
|
216
209
|
|
|
217
210
|
// Start: 50% spent
|
|
218
211
|
let lastLevel = getBudgetAlertLevel(5.0 / ceiling);
|
|
219
|
-
|
|
220
|
-
|
|
212
|
+
assert.deepStrictEqual(lastLevel, 0, "budget: 50% → level 0");
|
|
213
|
+
assert.deepStrictEqual(getNewBudgetAlertLevel(0, 5.0 / ceiling), null, "budget: no alert at 50%");
|
|
221
214
|
|
|
222
215
|
// Spend to 75%
|
|
223
216
|
let newLevel = getNewBudgetAlertLevel(lastLevel, 7.5 / ceiling);
|
|
224
|
-
|
|
217
|
+
assert.deepStrictEqual(newLevel, 75, "budget: alert fires at 75%");
|
|
225
218
|
lastLevel = newLevel!;
|
|
226
219
|
|
|
227
220
|
// Spend to 78% — no alert (between 75 and 80)
|
|
228
|
-
|
|
221
|
+
assert.deepStrictEqual(getNewBudgetAlertLevel(lastLevel, 7.8 / ceiling), null, "budget: no alert at 78%");
|
|
229
222
|
|
|
230
223
|
// Spend to 80% — 80% approach alert
|
|
231
224
|
newLevel = getNewBudgetAlertLevel(lastLevel, 8.0 / ceiling);
|
|
232
|
-
|
|
225
|
+
assert.deepStrictEqual(newLevel, 80, "budget: approach alert fires at 80%");
|
|
233
226
|
lastLevel = newLevel!;
|
|
234
227
|
|
|
235
228
|
// Spend to 85% — no alert (still at 80 level)
|
|
236
|
-
|
|
229
|
+
assert.deepStrictEqual(getNewBudgetAlertLevel(lastLevel, 8.5 / ceiling), null, "budget: no alert at 85%");
|
|
237
230
|
|
|
238
231
|
// Spend to 90%
|
|
239
232
|
newLevel = getNewBudgetAlertLevel(lastLevel, 9.0 / ceiling);
|
|
240
|
-
|
|
233
|
+
assert.deepStrictEqual(newLevel, 90, "budget: alert fires at 90%");
|
|
241
234
|
lastLevel = newLevel!;
|
|
242
235
|
|
|
243
236
|
// Spend to 100%
|
|
244
237
|
newLevel = getNewBudgetAlertLevel(lastLevel, 10.0 / ceiling);
|
|
245
|
-
|
|
238
|
+
assert.deepStrictEqual(newLevel, 100, "budget: alert fires at 100%");
|
|
246
239
|
lastLevel = newLevel!;
|
|
247
240
|
|
|
248
241
|
// Over budget — no re-emission
|
|
249
|
-
|
|
242
|
+
assert.deepStrictEqual(getNewBudgetAlertLevel(lastLevel, 12.0 / ceiling), null, "budget: no re-alert over 100%");
|
|
250
243
|
|
|
251
244
|
// Enforcement at 80% — still "none" (enforcement only at 100%)
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
}
|
|
245
|
+
assert.deepStrictEqual(getBudgetEnforcementAction("pause", 0.80), "none", "budget: no enforcement at 80%");
|
|
246
|
+
assert.deepStrictEqual(getBudgetEnforcementAction("halt", 0.80), "none", "budget: no enforcement at 80%");
|
|
247
|
+
assert.deepStrictEqual(getBudgetEnforcementAction("warn", 0.80), "none", "budget: no enforcement at 80%");
|
|
248
|
+
});
|
|
256
249
|
|
|
257
250
|
// ─── E2E: Budget prediction with multi-milestone cost data ────────────────────
|
|
258
|
-
|
|
259
|
-
console.log("\n=== E2E: Budget prediction across milestones ===");
|
|
260
|
-
|
|
261
|
-
{
|
|
251
|
+
test('E2E: Budget prediction across milestones', () => {
|
|
262
252
|
const units: UnitMetrics[] = [
|
|
263
253
|
makeUnit({ type: "execute-task", id: "M001/S01/T01", cost: 0.10 }),
|
|
264
254
|
makeUnit({ type: "execute-task", id: "M001/S01/T02", cost: 0.15 }),
|
|
@@ -268,30 +258,27 @@ console.log("\n=== E2E: Budget prediction across milestones ===");
|
|
|
268
258
|
];
|
|
269
259
|
|
|
270
260
|
const avgCosts = getAverageCostPerUnitType(units);
|
|
271
|
-
|
|
272
|
-
|
|
261
|
+
assert.ok(avgCosts.has("execute-task"), "prediction: has execute-task average");
|
|
262
|
+
assert.ok(avgCosts.has("plan-slice"), "prediction: has plan-slice average");
|
|
273
263
|
|
|
274
264
|
// Average execute-task cost: (0.10 + 0.15 + 0.20) / 3 = 0.15
|
|
275
265
|
const execAvg = avgCosts.get("execute-task")!;
|
|
276
|
-
|
|
266
|
+
assert.ok(Math.abs(execAvg - 0.15) < 0.001, `prediction: execute-task avg is $0.15 (got ${execAvg})`);
|
|
277
267
|
|
|
278
268
|
// Average plan-slice cost: (0.05 + 0.08) / 2 = 0.065
|
|
279
269
|
const planAvg = avgCosts.get("plan-slice")!;
|
|
280
|
-
|
|
270
|
+
assert.ok(Math.abs(planAvg - 0.065) < 0.001, `prediction: plan-slice avg is $0.065 (got ${planAvg})`);
|
|
281
271
|
|
|
282
272
|
// Predict remaining cost for 3 more execute-tasks and 1 plan-slice
|
|
283
273
|
const remaining = predictRemainingCost(avgCosts, [
|
|
284
274
|
"execute-task", "execute-task", "execute-task", "plan-slice",
|
|
285
275
|
]);
|
|
286
276
|
// Expected: 3 * 0.15 + 1 * 0.065 = 0.515
|
|
287
|
-
|
|
288
|
-
}
|
|
277
|
+
assert.ok(Math.abs(remaining - 0.515) < 0.001, `prediction: remaining cost ~$0.515 (got ${remaining})`);
|
|
278
|
+
});
|
|
289
279
|
|
|
290
280
|
// ─── E2E: Parallel workers + budget alerts combined scenario ──────────────────
|
|
291
|
-
|
|
292
|
-
console.log("\n=== E2E: Combined parallel workers + budget monitoring ===");
|
|
293
|
-
|
|
294
|
-
{
|
|
281
|
+
test('E2E: Combined parallel workers + budget monitoring', () => {
|
|
295
282
|
resetWorkerRegistry();
|
|
296
283
|
|
|
297
284
|
// Simulate a scenario: 3 parallel workers running while budget is at 78%
|
|
@@ -303,34 +290,31 @@ console.log("\n=== E2E: Combined parallel workers + budget monitoring ===");
|
|
|
303
290
|
// Budget is at 78% — no alert yet (between 75 and 80)
|
|
304
291
|
const ceiling = 10.0;
|
|
305
292
|
let lastLevel: ReturnType<typeof getBudgetAlertLevel> = 75; // already got 75% alert
|
|
306
|
-
|
|
307
|
-
|
|
293
|
+
assert.deepStrictEqual(getNewBudgetAlertLevel(lastLevel, 7.8 / ceiling), null, "combined: no alert at 78% with workers running");
|
|
294
|
+
assert.ok(hasActiveWorkers(), "combined: workers running during budget check");
|
|
308
295
|
|
|
309
296
|
// First worker completes, cost rises to 80%
|
|
310
297
|
updateWorker(w1, "completed");
|
|
311
298
|
const level80 = getNewBudgetAlertLevel(lastLevel, 8.0 / ceiling);
|
|
312
|
-
|
|
299
|
+
assert.deepStrictEqual(level80, 80, "combined: 80% approach alert fires after worker completes");
|
|
313
300
|
lastLevel = level80!;
|
|
314
301
|
|
|
315
302
|
// Second worker completes, cost rises to 88%
|
|
316
303
|
updateWorker(w2, "completed");
|
|
317
|
-
|
|
304
|
+
assert.deepStrictEqual(getNewBudgetAlertLevel(lastLevel, 8.8 / ceiling), null, "combined: no alert at 88%");
|
|
318
305
|
|
|
319
306
|
// Third worker completes, cost reaches 90%
|
|
320
307
|
updateWorker(w3, "completed");
|
|
321
308
|
const level90 = getNewBudgetAlertLevel(lastLevel, 9.0 / ceiling);
|
|
322
|
-
|
|
309
|
+
assert.deepStrictEqual(level90, 90, "combined: 90% alert fires after all workers complete");
|
|
323
310
|
|
|
324
|
-
|
|
311
|
+
assert.ok(!hasActiveWorkers(), "combined: no active workers at end");
|
|
325
312
|
|
|
326
313
|
resetWorkerRegistry();
|
|
327
|
-
}
|
|
314
|
+
});
|
|
328
315
|
|
|
329
316
|
// ─── E2E: formatCostProjection with budget ceiling warnings ───────────────────
|
|
330
|
-
|
|
331
|
-
console.log("\n=== E2E: Cost projection ceiling warnings ===");
|
|
332
|
-
|
|
333
|
-
{
|
|
317
|
+
test('E2E: Cost projection ceiling warnings', () => {
|
|
334
318
|
const slices = [
|
|
335
319
|
{ sliceId: "M001/S01", units: 4, tokens: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 }, cost: 3.0, duration: 10000 },
|
|
336
320
|
{ sliceId: "M001/S02", units: 3, tokens: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 }, cost: 4.0, duration: 8000 },
|
|
@@ -339,16 +323,15 @@ console.log("\n=== E2E: Cost projection ceiling warnings ===");
|
|
|
339
323
|
|
|
340
324
|
// With ceiling NOT yet reached
|
|
341
325
|
const proj1 = formatCostProjection(slices, 2, 20.0);
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
326
|
+
assert.ok(proj1.length >= 1, "projection: has projection line");
|
|
327
|
+
assert.match(proj1[0], /Projected remaining/, "projection: shows projection");
|
|
328
|
+
assert.ok(proj1.length === 1, "projection: no ceiling warning when under budget");
|
|
345
329
|
|
|
346
330
|
// With ceiling reached (spent 12.0 >= ceiling 10.0)
|
|
347
331
|
const proj2 = formatCostProjection(slices, 2, 10.0);
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
}
|
|
332
|
+
assert.ok(proj2.length >= 2, "projection: has ceiling warning when over budget");
|
|
333
|
+
assert.match(proj2[1], /ceiling/, "projection: ceiling warning text");
|
|
334
|
+
});
|
|
351
335
|
|
|
352
336
|
// ─── Summary ──────────────────────────────────────────────────────────────────
|
|
353
|
-
|
|
354
|
-
report();
|
|
337
|
+
});
|