gsd-pi 2.57.0-dev.f22a903 → 2.58.0-dev.778d6ac
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 +1 -1
- package/dist/cli.js +49 -35
- package/dist/headless-ui.d.ts +17 -0
- package/dist/headless-ui.js +97 -3
- package/dist/headless.js +67 -6
- package/dist/help-text.js +1 -0
- package/dist/onboarding.js +44 -0
- package/dist/resource-loader.js +16 -1
- package/dist/resources/agents/researcher.md +1 -1
- package/dist/resources/extensions/ask-user-questions.js +16 -3
- package/dist/resources/extensions/async-jobs/extension-manifest.json +1 -1
- package/dist/resources/extensions/bg-shell/extension-manifest.json +1 -1
- package/dist/resources/extensions/browser-tools/extension-manifest.json +1 -1
- package/dist/resources/extensions/claude-code-cli/partial-builder.js +14 -6
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +59 -36
- package/dist/resources/extensions/context7/extension-manifest.json +1 -1
- package/dist/resources/extensions/get-secrets-from-user.js +8 -5
- package/dist/resources/extensions/google-search/extension-manifest.json +1 -1
- package/dist/resources/extensions/google-search/index.js +2 -1
- package/dist/resources/extensions/gsd/auto/phases.js +25 -21
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +2 -2
- package/dist/resources/extensions/gsd/auto-dashboard.js +37 -20
- package/dist/resources/extensions/gsd/auto-dispatch.js +17 -2
- package/dist/resources/extensions/gsd/auto-model-selection.js +26 -3
- package/dist/resources/extensions/gsd/auto-post-unit.js +16 -4
- package/dist/resources/extensions/gsd/auto-prompts.js +1 -1
- package/dist/resources/extensions/gsd/auto-recovery.js +13 -5
- package/dist/resources/extensions/gsd/auto-start.js +35 -22
- package/dist/resources/extensions/gsd/auto-worktree.js +196 -12
- package/dist/resources/extensions/gsd/auto.js +4 -0
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +32 -0
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +80 -8
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +32 -1
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +33 -18
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +44 -11
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +67 -0
- package/dist/resources/extensions/gsd/captures.js +56 -4
- package/dist/resources/extensions/gsd/db-writer.js +116 -8
- package/dist/resources/extensions/gsd/doctor-git-checks.js +28 -0
- package/dist/resources/extensions/gsd/doctor-providers.js +2 -1
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +5 -4
- package/dist/resources/extensions/gsd/doctor.js +3 -1
- package/dist/resources/extensions/gsd/error-classifier.js +13 -10
- package/dist/resources/extensions/gsd/extension-manifest.json +16 -1
- package/dist/resources/extensions/gsd/forensics.js +123 -20
- package/dist/resources/extensions/gsd/git-service.js +23 -1
- package/dist/resources/extensions/gsd/gitignore.js +33 -0
- package/dist/resources/extensions/gsd/gsd-db.js +36 -9
- package/dist/resources/extensions/gsd/guided-flow.js +106 -44
- package/dist/resources/extensions/gsd/health-widget-core.js +31 -0
- package/dist/resources/extensions/gsd/health-widget.js +17 -0
- package/dist/resources/extensions/gsd/index.js +1 -1
- package/dist/resources/extensions/gsd/memory-extractor.js +7 -0
- package/dist/resources/extensions/gsd/migrate-external.js +8 -1
- package/dist/resources/extensions/gsd/milestone-validation-gates.js +45 -0
- package/dist/resources/extensions/gsd/model-cost-table.js +18 -0
- package/dist/resources/extensions/gsd/model-router.js +35 -1
- package/dist/resources/extensions/gsd/native-git-bridge.js +17 -0
- package/dist/resources/extensions/gsd/notifications.js +16 -1
- package/dist/resources/extensions/gsd/parallel-eligibility.js +13 -2
- package/dist/resources/extensions/gsd/parallel-merge.js +78 -5
- package/dist/resources/extensions/gsd/parsers-legacy.js +20 -3
- package/dist/resources/extensions/gsd/paths.js +43 -0
- package/dist/resources/extensions/gsd/preferences-models.js +14 -1
- package/dist/resources/extensions/gsd/preferences-types.js +2 -1
- package/dist/resources/extensions/gsd/preferences.js +13 -16
- package/dist/resources/extensions/gsd/prompt-loader.js +4 -1
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +4 -2
- package/dist/resources/extensions/gsd/prompts/discuss-headless.md +1 -1
- package/dist/resources/extensions/gsd/prompts/discuss.md +1 -1
- package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -1
- package/dist/resources/extensions/gsd/prompts/forensics.md +2 -2
- 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/plan-slice.md +2 -0
- package/dist/resources/extensions/gsd/prompts/rethink.md +1 -1
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -0
- package/dist/resources/extensions/gsd/repo-identity.js +205 -11
- package/dist/resources/extensions/gsd/rethink.js +5 -0
- package/dist/resources/extensions/gsd/roadmap-slices.js +5 -4
- package/dist/resources/extensions/gsd/state.js +85 -27
- package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +20 -1
- package/dist/resources/extensions/gsd/tools/complete-task.js +34 -71
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +12 -2
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +29 -1
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +14 -3
- package/dist/resources/extensions/gsd/triage-resolution.js +22 -7
- package/dist/resources/extensions/gsd/undo.js +2 -2
- package/dist/resources/extensions/gsd/unit-ownership.js +164 -33
- package/dist/resources/extensions/gsd/verdict-parser.js +20 -8
- package/dist/resources/extensions/gsd/workflow-manifest.js +24 -5
- package/dist/resources/extensions/gsd/workflow-projections.js +95 -63
- package/dist/resources/extensions/gsd/workflow-reconcile.js +35 -5
- package/dist/resources/extensions/gsd/workspace-index.js +24 -0
- package/dist/resources/extensions/gsd/worktree-manager.js +105 -1
- package/dist/resources/extensions/gsd/worktree-resolver.js +20 -3
- package/dist/resources/extensions/mcp-client/index.js +11 -7
- package/dist/resources/extensions/ollama/index.js +112 -0
- package/dist/resources/extensions/ollama/model-capabilities.js +115 -0
- package/dist/resources/extensions/ollama/ollama-client.js +168 -0
- package/dist/resources/extensions/ollama/ollama-commands.js +194 -0
- package/dist/resources/extensions/ollama/ollama-discovery.js +69 -0
- package/dist/resources/extensions/ollama/ollama-tool.js +184 -0
- package/dist/resources/extensions/ollama/types.js +2 -0
- package/dist/resources/extensions/search-the-web/extension-manifest.json +1 -1
- package/dist/resources/extensions/shared/interview-ui.js +11 -1
- package/dist/resources/skills/create-gsd-extension/SKILL.md +5 -3
- package/dist/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +5 -4
- package/dist/resources/skills/create-gsd-extension/workflows/add-capability.md +2 -2
- package/dist/resources/skills/create-gsd-extension/workflows/create-extension.md +4 -4
- package/dist/resources/skills/create-gsd-extension/workflows/debug-extension.md +5 -3
- package/dist/startup-model-validation.d.ts +39 -0
- package/dist/startup-model-validation.js +50 -0
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +16 -16
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
- 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_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 +2 -2
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- 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 +2 -2
- 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_client-reference-manifest.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_client-reference-manifest.js +1 -1
- 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_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_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/experimental/route_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_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_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_client-reference-manifest.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_client-reference-manifest.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_client-reference-manifest.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_client-reference-manifest.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_client-reference-manifest.js +1 -1
- 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_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_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_client-reference-manifest.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_client-reference-manifest.js +1 -1
- 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_client-reference-manifest.js +1 -1
- 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_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 +2 -2
- 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 +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +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 +16 -16
- package/dist/web/standalone/.next/server/chunks/2229.js +2 -2
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +2 -2
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/6502.7593d7797a4b3999.js +9 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-61d3afac6d0f0ce7.js → webpack-a1c1e452c6b32d04.js} +1 -1
- package/dist/web/standalone/.next/static/css/f6e8833d46e738d8.css +1 -0
- package/dist/web-mode.js +2 -1
- package/package.json +2 -2
- package/packages/daemon/src/cli.ts +49 -0
- package/packages/daemon/src/daemon.test.ts +104 -1
- package/packages/daemon/src/daemon.ts +24 -1
- package/packages/daemon/src/discord-bot.ts +73 -3
- package/packages/daemon/src/event-bridge.ts +15 -9
- package/packages/daemon/src/event-formatter.ts +30 -2
- package/packages/daemon/src/index.ts +9 -0
- package/packages/daemon/src/launchd.test.ts +356 -0
- package/packages/daemon/src/launchd.ts +242 -0
- package/packages/daemon/src/message-batcher.test.ts +2 -2
- package/packages/daemon/src/message-batcher.ts +9 -3
- package/packages/daemon/src/orchestrator.test.ts +1 -0
- package/packages/daemon/src/orchestrator.ts +106 -2
- package/packages/native/dist/ast/index.js +9 -5
- package/packages/native/dist/ast/types.js +2 -1
- package/packages/native/dist/clipboard/index.js +12 -7
- package/packages/native/dist/clipboard/types.js +2 -1
- package/packages/native/dist/diff/index.js +12 -7
- package/packages/native/dist/diff/types.js +2 -1
- package/packages/native/dist/fd/index.js +6 -3
- package/packages/native/dist/fd/types.js +2 -1
- package/packages/native/dist/glob/index.js +9 -5
- package/packages/native/dist/glob/types.js +2 -1
- package/packages/native/dist/grep/index.js +9 -5
- package/packages/native/dist/grep/types.js +2 -1
- package/packages/native/dist/gsd-parser/index.js +18 -11
- package/packages/native/dist/gsd-parser/types.js +2 -1
- package/packages/native/dist/highlight/index.js +12 -7
- package/packages/native/dist/highlight/types.js +2 -1
- package/packages/native/dist/html/index.js +6 -3
- package/packages/native/dist/html/types.js +2 -1
- package/packages/native/dist/image/index.js +10 -5
- package/packages/native/dist/image/types.js +7 -4
- package/packages/native/dist/index.js +70 -17
- package/packages/native/dist/json-parse/index.js +13 -8
- package/packages/native/dist/native.js +47 -10
- package/packages/native/dist/ps/index.js +15 -9
- package/packages/native/dist/ps/types.js +2 -1
- package/packages/native/dist/stream-process/index.js +12 -7
- package/packages/native/dist/text/index.js +24 -14
- package/packages/native/dist/text/types.js +5 -2
- package/packages/native/dist/truncate/index.js +12 -7
- package/packages/native/dist/ttsr/index.js +12 -7
- package/packages/native/dist/ttsr/types.js +2 -1
- package/packages/native/dist/xxhash/index.js +9 -5
- package/packages/native/package.json +19 -19
- package/packages/native/src/__tests__/module-compat.test.mjs +91 -0
- package/packages/native/src/native.ts +9 -8
- package/packages/pi-agent-core/dist/agent-loop.js +3 -2
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/dist/proxy.d.ts +1 -1
- package/packages/pi-agent-core/dist/proxy.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/proxy.js.map +1 -1
- package/packages/pi-agent-core/src/agent-loop.test.ts +45 -0
- package/packages/pi-agent-core/src/agent-loop.ts +3 -2
- package/packages/pi-agent-core/src/proxy.ts +1 -1
- package/packages/pi-ai/dist/env-api-keys.js +1 -0
- package/packages/pi-ai/dist/env-api-keys.js.map +1 -1
- package/packages/pi-ai/dist/index.d.ts +1 -0
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +1 -0
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.js +19 -2
- package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/anthropic-shared.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/anthropic-shared.test.js +25 -0
- package/packages/pi-ai/dist/providers/anthropic-shared.test.js.map +1 -0
- package/packages/pi-ai/dist/types.d.ts +3 -3
- package/packages/pi-ai/dist/types.d.ts.map +1 -1
- package/packages/pi-ai/dist/types.js.map +1 -1
- package/packages/pi-ai/dist/utils/json-parse.d.ts +3 -0
- package/packages/pi-ai/dist/utils/json-parse.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/json-parse.js +24 -1
- package/packages/pi-ai/dist/utils/json-parse.js.map +1 -1
- package/packages/pi-ai/dist/utils/repair-tool-json.d.ts +37 -0
- package/packages/pi-ai/dist/utils/repair-tool-json.d.ts.map +1 -0
- package/packages/pi-ai/dist/utils/repair-tool-json.js +75 -0
- package/packages/pi-ai/dist/utils/repair-tool-json.js.map +1 -0
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.d.ts +2 -0
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js +73 -0
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js.map +1 -0
- package/packages/pi-ai/src/env-api-keys.ts +1 -0
- package/packages/pi-ai/src/index.ts +1 -0
- package/packages/pi-ai/src/providers/anthropic-shared.test.ts +29 -0
- package/packages/pi-ai/src/providers/anthropic-shared.ts +17 -2
- package/packages/pi-ai/src/types.ts +3 -2
- package/packages/pi-ai/src/utils/json-parse.ts +28 -1
- package/packages/pi-ai/src/utils/repair-tool-json.ts +88 -0
- package/packages/pi-ai/src/utils/tests/repair-tool-json.test.ts +102 -0
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts +4 -0
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +31 -0
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +17 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js +62 -2
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.d.ts +6 -0
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +176 -0
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/exec.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/exec.js +3 -1
- package/packages/pi-coding-agent/dist/core/exec.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.d.ts +28 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js +37 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js +63 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.d.ts +19 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js +115 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js +109 -0
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +4 -0
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.js +2 -0
- package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +5 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +5 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.d.ts +44 -0
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.js +97 -0
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.js +181 -0
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/core/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/index.js +1 -1
- package/packages/pi-coding-agent/dist/core/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/index.js +3 -0
- package/packages/pi-coding-agent/dist/core/lsp/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/lspmux.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/lspmux.js +3 -0
- package/packages/pi-coding-agent/dist/core/lsp/lspmux.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/messages.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/messages.js +31 -2
- package/packages/pi-coding-agent/dist/core/messages.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/messages.test.d.ts +9 -0
- package/packages/pi-coding-agent/dist/core/messages.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/messages.test.js +86 -0
- package/packages/pi-coding-agent/dist/core/messages.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.js +1 -0
- package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.d.ts +10 -0
- package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.js +12 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.d.ts +6 -0
- package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.js +48 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.test.d.ts +9 -0
- package/packages/pi-coding-agent/dist/core/retry-handler.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/retry-handler.test.js +193 -0
- package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +10 -3
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/read.js +13 -4
- package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.d.ts +16 -0
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +80 -0
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/index.d.ts +2 -2
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -1
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +4 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.d.ts +1 -0
- package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.js +5 -0
- package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +38 -1
- package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +236 -0
- package/packages/pi-coding-agent/src/core/compaction/compaction.ts +94 -1
- package/packages/pi-coding-agent/src/core/exec.ts +3 -1
- package/packages/pi-coding-agent/src/core/extensions/extension-manifest.test.ts +77 -0
- package/packages/pi-coding-agent/src/core/extensions/extension-manifest.ts +62 -0
- package/packages/pi-coding-agent/src/core/extensions/extension-sort.test.ts +134 -0
- package/packages/pi-coding-agent/src/core/extensions/extension-sort.ts +137 -0
- package/packages/pi-coding-agent/src/core/extensions/index.ts +4 -0
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +5 -0
- package/packages/pi-coding-agent/src/core/image-overflow-recovery.test.ts +228 -0
- package/packages/pi-coding-agent/src/core/image-overflow-recovery.ts +118 -0
- package/packages/pi-coding-agent/src/core/index.ts +6 -0
- package/packages/pi-coding-agent/src/core/lsp/index.ts +3 -0
- package/packages/pi-coding-agent/src/core/lsp/lspmux.ts +3 -0
- package/packages/pi-coding-agent/src/core/messages.test.ts +114 -0
- package/packages/pi-coding-agent/src/core/messages.ts +29 -2
- package/packages/pi-coding-agent/src/core/model-resolver.ts +1 -0
- package/packages/pi-coding-agent/src/core/resource-loader.ts +20 -1
- package/packages/pi-coding-agent/src/core/retry-handler.test.ts +255 -0
- package/packages/pi-coding-agent/src/core/retry-handler.ts +52 -1
- package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +11 -3
- package/packages/pi-coding-agent/src/core/tools/read.ts +14 -4
- package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +92 -0
- package/packages/pi-coding-agent/src/index.ts +6 -0
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +7 -0
- package/packages/pi-coding-agent/src/modes/rpc/remote-terminal.ts +6 -0
- package/packages/pi-tui/dist/terminal.d.ts +2 -0
- package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal.js +9 -0
- package/packages/pi-tui/dist/terminal.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +9 -0
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/src/terminal.ts +14 -0
- package/packages/pi-tui/src/tui.ts +8 -0
- package/pkg/package.json +1 -1
- package/scripts/ensure-workspace-builds.cjs +45 -14
- package/src/resources/agents/researcher.md +1 -1
- package/src/resources/extensions/ask-user-questions.ts +21 -3
- package/src/resources/extensions/async-jobs/extension-manifest.json +1 -1
- package/src/resources/extensions/bg-shell/extension-manifest.json +1 -1
- package/src/resources/extensions/browser-tools/extension-manifest.json +1 -1
- package/src/resources/extensions/claude-code-cli/partial-builder.ts +13 -6
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +63 -35
- package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +28 -0
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +108 -1
- package/src/resources/extensions/context7/extension-manifest.json +1 -1
- package/src/resources/extensions/get-secrets-from-user.ts +8 -5
- package/src/resources/extensions/google-search/extension-manifest.json +1 -1
- package/src/resources/extensions/google-search/index.ts +2 -1
- package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
- package/src/resources/extensions/gsd/auto/phases.ts +43 -34
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +2 -2
- package/src/resources/extensions/gsd/auto-dashboard.ts +37 -19
- package/src/resources/extensions/gsd/auto-dispatch.ts +18 -2
- package/src/resources/extensions/gsd/auto-model-selection.ts +26 -5
- package/src/resources/extensions/gsd/auto-post-unit.ts +18 -4
- package/src/resources/extensions/gsd/auto-prompts.ts +1 -1
- package/src/resources/extensions/gsd/auto-recovery.ts +12 -5
- package/src/resources/extensions/gsd/auto-start.ts +35 -26
- package/src/resources/extensions/gsd/auto-worktree.ts +190 -9
- package/src/resources/extensions/gsd/auto.ts +5 -0
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +31 -0
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +85 -8
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +38 -1
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +31 -19
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +50 -11
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +75 -0
- package/src/resources/extensions/gsd/captures.ts +63 -3
- package/src/resources/extensions/gsd/db-writer.ts +140 -7
- package/src/resources/extensions/gsd/doctor-git-checks.ts +26 -0
- package/src/resources/extensions/gsd/doctor-providers.ts +2 -1
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +5 -4
- package/src/resources/extensions/gsd/doctor.ts +3 -1
- package/src/resources/extensions/gsd/error-classifier.ts +14 -11
- package/src/resources/extensions/gsd/extension-manifest.json +16 -1
- package/src/resources/extensions/gsd/forensics.ts +144 -20
- package/src/resources/extensions/gsd/git-service.ts +26 -3
- package/src/resources/extensions/gsd/gitignore.ts +33 -0
- package/src/resources/extensions/gsd/gsd-db.ts +43 -7
- package/src/resources/extensions/gsd/guided-flow.ts +114 -45
- package/src/resources/extensions/gsd/health-widget-core.ts +34 -0
- package/src/resources/extensions/gsd/health-widget.ts +17 -0
- package/src/resources/extensions/gsd/index.ts +1 -0
- package/src/resources/extensions/gsd/memory-extractor.ts +8 -0
- package/src/resources/extensions/gsd/migrate-external.ts +9 -1
- package/src/resources/extensions/gsd/milestone-validation-gates.ts +56 -0
- package/src/resources/extensions/gsd/model-cost-table.ts +19 -0
- package/src/resources/extensions/gsd/model-router.ts +35 -1
- package/src/resources/extensions/gsd/native-git-bridge.ts +17 -0
- package/src/resources/extensions/gsd/notifications.ts +16 -0
- package/src/resources/extensions/gsd/parallel-eligibility.ts +15 -2
- package/src/resources/extensions/gsd/parallel-merge.ts +87 -4
- package/src/resources/extensions/gsd/parsers-legacy.ts +22 -3
- package/src/resources/extensions/gsd/paths.ts +42 -0
- package/src/resources/extensions/gsd/preferences-models.ts +14 -1
- package/src/resources/extensions/gsd/preferences-types.ts +2 -1
- package/src/resources/extensions/gsd/preferences.ts +13 -15
- package/src/resources/extensions/gsd/prompt-loader.ts +4 -1
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/complete-slice.md +4 -2
- package/src/resources/extensions/gsd/prompts/discuss-headless.md +1 -1
- package/src/resources/extensions/gsd/prompts/discuss.md +1 -1
- package/src/resources/extensions/gsd/prompts/execute-task.md +3 -1
- package/src/resources/extensions/gsd/prompts/forensics.md +2 -2
- 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/plan-slice.md +2 -0
- package/src/resources/extensions/gsd/prompts/rethink.md +1 -1
- package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -0
- package/src/resources/extensions/gsd/repo-identity.ts +186 -11
- package/src/resources/extensions/gsd/rethink.ts +6 -0
- package/src/resources/extensions/gsd/roadmap-slices.ts +5 -4
- package/src/resources/extensions/gsd/state.ts +84 -32
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/auto-mode-interactive-guard.test.ts +71 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +71 -1
- package/src/resources/extensions/gsd/tests/captures.test.ts +103 -0
- package/src/resources/extensions/gsd/tests/cli-provider-rate-limit.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/completion-hierarchy-guards.test.ts +192 -0
- package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +131 -0
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +7 -12
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +78 -5
- package/src/resources/extensions/gsd/tests/derive-state.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/discord-invite-links.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/discuss-empty-db-fallback.test.ts +127 -0
- package/src/resources/extensions/gsd/tests/discuss-queued-milestones.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +20 -1
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +117 -0
- package/src/resources/extensions/gsd/tests/dynamic-routing-default.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +74 -0
- package/src/resources/extensions/gsd/tests/event-replay-idempotency.test.ts +140 -0
- package/src/resources/extensions/gsd/tests/forensics-context-persist.test.ts +129 -0
- package/src/resources/extensions/gsd/tests/forensics-db-completion.test.ts +96 -0
- package/src/resources/extensions/gsd/tests/forensics-dedup.test.ts +31 -0
- package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +125 -12
- package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +164 -0
- package/src/resources/extensions/gsd/tests/guided-flow-dynamic-routing.test.ts +135 -0
- package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +97 -0
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/hook-key-parsing.test.ts +107 -0
- package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +111 -1
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +101 -0
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +59 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-false-positives.test.ts +243 -0
- package/src/resources/extensions/gsd/tests/integration/gitignore-staging-2570.test.ts +150 -0
- package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +110 -0
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +959 -0
- package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +85 -2
- package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +105 -0
- package/src/resources/extensions/gsd/tests/milestone-status-authoritative.test.ts +116 -0
- package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/model-router.test.ts +68 -3
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +28 -0
- package/src/resources/extensions/gsd/tests/notifications.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/parallel-commit-scope.test.ts +159 -0
- package/src/resources/extensions/gsd/tests/parallel-eligibility-ghost.test.ts +150 -0
- package/src/resources/extensions/gsd/tests/plan-milestone-title.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +33 -1
- package/src/resources/extensions/gsd/tests/project-relocation-recovery.test.ts +297 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/prompt-loader-replacement.test.ts +178 -0
- package/src/resources/extensions/gsd/tests/prompt-tool-names.test.ts +69 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/queue-execution-guard.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +90 -0
- package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +117 -0
- package/src/resources/extensions/gsd/tests/reconciliation-edge-cases.test.ts +162 -0
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +97 -0
- package/src/resources/extensions/gsd/tests/secure-env-collect.test.ts +134 -0
- package/src/resources/extensions/gsd/tests/slice-disk-reconcile.test.ts +233 -0
- package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +305 -0
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +405 -0
- package/src/resources/extensions/gsd/tests/state-derivation-parity.test.ts +257 -0
- package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +1628 -0
- package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +106 -0
- package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +174 -0
- package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +221 -0
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/triage-resolution.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/uat-stuck-loop-orphaned-worktree.test.ts +289 -0
- package/src/resources/extensions/gsd/tests/unit-ownership.test.ts +100 -17
- package/src/resources/extensions/gsd/tests/vacuum-recovery.test.ts +154 -0
- package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +4 -1
- package/src/resources/extensions/gsd/tests/verdict-parser.test.ts +156 -0
- package/src/resources/extensions/gsd/tests/verification-operational-gate.test.ts +82 -0
- package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +48 -0
- package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/worktree-db-respawn-truncation.test.ts +140 -0
- package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +101 -0
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +48 -1
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +29 -5
- package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +95 -0
- package/src/resources/extensions/gsd/tools/complete-task.ts +36 -74
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +13 -1
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +36 -0
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +20 -2
- package/src/resources/extensions/gsd/triage-resolution.ts +23 -6
- package/src/resources/extensions/gsd/types.ts +4 -2
- package/src/resources/extensions/gsd/undo.ts +2 -2
- package/src/resources/extensions/gsd/unit-ownership.ts +206 -35
- package/src/resources/extensions/gsd/verdict-parser.ts +21 -6
- package/src/resources/extensions/gsd/workflow-logger.ts +3 -1
- package/src/resources/extensions/gsd/workflow-manifest.ts +22 -5
- package/src/resources/extensions/gsd/workflow-projections.ts +97 -64
- package/src/resources/extensions/gsd/workflow-reconcile.ts +39 -10
- package/src/resources/extensions/gsd/workspace-index.ts +30 -0
- package/src/resources/extensions/gsd/worktree-manager.ts +120 -1
- package/src/resources/extensions/gsd/worktree-resolver.ts +22 -3
- package/src/resources/extensions/mcp-client/index.ts +13 -7
- package/src/resources/extensions/mcp-client/tests/server-name-spaces.test.ts +55 -0
- package/src/resources/extensions/ollama/index.ts +130 -0
- package/src/resources/extensions/ollama/model-capabilities.ts +145 -0
- package/src/resources/extensions/ollama/ollama-client.ts +196 -0
- package/src/resources/extensions/ollama/ollama-commands.ts +248 -0
- package/src/resources/extensions/ollama/ollama-discovery.ts +106 -0
- package/src/resources/extensions/ollama/ollama-tool.ts +218 -0
- package/src/resources/extensions/ollama/tests/model-capabilities.test.ts +162 -0
- package/src/resources/extensions/ollama/tests/ollama-client.test.ts +38 -0
- package/src/resources/extensions/ollama/tests/ollama-discovery.test.ts +28 -0
- package/src/resources/extensions/ollama/types.ts +130 -0
- package/src/resources/extensions/search-the-web/extension-manifest.json +1 -1
- package/src/resources/extensions/shared/interview-ui.ts +12 -1
- package/src/resources/extensions/shared/tests/ask-user-freetext.test.ts +156 -0
- package/src/resources/skills/create-gsd-extension/SKILL.md +5 -3
- package/src/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +5 -4
- package/src/resources/skills/create-gsd-extension/workflows/add-capability.md +2 -2
- package/src/resources/skills/create-gsd-extension/workflows/create-extension.md +4 -4
- package/src/resources/skills/create-gsd-extension/workflows/debug-extension.md +5 -3
- package/dist/web/standalone/.next/static/chunks/6502.8b732f67a11b11b4.js +0 -9
- package/dist/web/standalone/.next/static/css/a58ef8a151aa0493.css +0 -1
- package/src/resources/extensions/gsd/tests/empty-db-reconciliation.test.ts +0 -79
- /package/dist/web/standalone/.next/static/{OS7_z6QaL6uqp8q5pjHSJ → R0D4xaIPl5kg93edN7Oo0}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{OS7_z6QaL6uqp8q5pjHSJ → R0D4xaIPl5kg93edN7Oo0}/_ssgManifest.js +0 -0
|
@@ -48,30 +48,45 @@ function getClaudePath() {
|
|
|
48
48
|
return cachedClaudePath;
|
|
49
49
|
}
|
|
50
50
|
// ---------------------------------------------------------------------------
|
|
51
|
-
// Prompt
|
|
51
|
+
// Prompt construction
|
|
52
52
|
// ---------------------------------------------------------------------------
|
|
53
53
|
/**
|
|
54
|
-
* Extract
|
|
55
|
-
* The SDK manages its own conversation history — we only send
|
|
56
|
-
* the latest user message as the prompt.
|
|
54
|
+
* Extract text content from a single message regardless of content shape.
|
|
57
55
|
*/
|
|
58
|
-
function
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
.map((part) => part.text);
|
|
68
|
-
if (textParts.length > 0)
|
|
69
|
-
return textParts.join("\n");
|
|
70
|
-
}
|
|
71
|
-
}
|
|
56
|
+
function extractMessageText(msg) {
|
|
57
|
+
if (typeof msg.content === "string")
|
|
58
|
+
return msg.content;
|
|
59
|
+
if (Array.isArray(msg.content)) {
|
|
60
|
+
const textParts = msg.content
|
|
61
|
+
.filter((part) => part.type === "text")
|
|
62
|
+
.map((part) => part.text ?? part.thinking ?? "");
|
|
63
|
+
if (textParts.length > 0)
|
|
64
|
+
return textParts.join("\n");
|
|
72
65
|
}
|
|
73
66
|
return "";
|
|
74
67
|
}
|
|
68
|
+
/**
|
|
69
|
+
* Build a full conversational prompt from GSD's context messages.
|
|
70
|
+
*
|
|
71
|
+
* Previous behaviour sent only the last user message, making every SDK
|
|
72
|
+
* call effectively stateless. This version serialises the complete
|
|
73
|
+
* conversation history (system prompt + all user/assistant turns) so
|
|
74
|
+
* Claude Code has full context for multi-turn continuity.
|
|
75
|
+
*/
|
|
76
|
+
export function buildPromptFromContext(context) {
|
|
77
|
+
const parts = [];
|
|
78
|
+
if (context.systemPrompt) {
|
|
79
|
+
parts.push(`[System]\n${context.systemPrompt}`);
|
|
80
|
+
}
|
|
81
|
+
for (const msg of context.messages) {
|
|
82
|
+
const text = extractMessageText(msg);
|
|
83
|
+
if (!text)
|
|
84
|
+
continue;
|
|
85
|
+
const label = msg.role === "user" ? "User" : msg.role === "assistant" ? "Assistant" : "System";
|
|
86
|
+
parts.push(`[${label}]\n${text}`);
|
|
87
|
+
}
|
|
88
|
+
return parts.join("\n\n");
|
|
89
|
+
}
|
|
75
90
|
// ---------------------------------------------------------------------------
|
|
76
91
|
// Error helper
|
|
77
92
|
// ---------------------------------------------------------------------------
|
|
@@ -102,6 +117,29 @@ export function makeStreamExhaustedErrorMessage(model, lastTextContent) {
|
|
|
102
117
|
return message;
|
|
103
118
|
}
|
|
104
119
|
// ---------------------------------------------------------------------------
|
|
120
|
+
// SDK options builder
|
|
121
|
+
// ---------------------------------------------------------------------------
|
|
122
|
+
/**
|
|
123
|
+
* Build the options object passed to the Claude Agent SDK's `query()` call.
|
|
124
|
+
*
|
|
125
|
+
* Extracted for testability — callers can verify session persistence,
|
|
126
|
+
* beta flags, and other configuration without mocking the full SDK.
|
|
127
|
+
*/
|
|
128
|
+
export function buildSdkOptions(modelId, prompt) {
|
|
129
|
+
return {
|
|
130
|
+
pathToClaudeCodeExecutable: getClaudePath(),
|
|
131
|
+
model: modelId,
|
|
132
|
+
includePartialMessages: true,
|
|
133
|
+
persistSession: true,
|
|
134
|
+
cwd: process.cwd(),
|
|
135
|
+
permissionMode: "bypassPermissions",
|
|
136
|
+
allowDangerouslySkipPermissions: true,
|
|
137
|
+
settingSources: ["project"],
|
|
138
|
+
systemPrompt: { type: "preset", preset: "claude_code" },
|
|
139
|
+
betas: modelId.includes("sonnet") ? ["context-1m-2025-08-07"] : [],
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
// ---------------------------------------------------------------------------
|
|
105
143
|
// streamSimple implementation
|
|
106
144
|
// ---------------------------------------------------------------------------
|
|
107
145
|
/**
|
|
@@ -133,21 +171,13 @@ async function pumpSdkMessages(model, context, options, stream) {
|
|
|
133
171
|
if (options?.signal) {
|
|
134
172
|
options.signal.addEventListener("abort", () => controller.abort(), { once: true });
|
|
135
173
|
}
|
|
136
|
-
const prompt =
|
|
174
|
+
const prompt = buildPromptFromContext(context);
|
|
175
|
+
const sdkOpts = buildSdkOptions(modelId, prompt);
|
|
137
176
|
const queryResult = sdk.query({
|
|
138
177
|
prompt,
|
|
139
178
|
options: {
|
|
140
|
-
|
|
141
|
-
model: modelId,
|
|
142
|
-
includePartialMessages: true,
|
|
143
|
-
persistSession: false,
|
|
179
|
+
...sdkOpts,
|
|
144
180
|
abortController: controller,
|
|
145
|
-
cwd: process.cwd(),
|
|
146
|
-
permissionMode: "bypassPermissions",
|
|
147
|
-
allowDangerouslySkipPermissions: true,
|
|
148
|
-
settingSources: ["project"],
|
|
149
|
-
systemPrompt: { type: "preset", preset: "claude_code" },
|
|
150
|
-
betas: modelId.includes("sonnet") ? ["context-1m-2025-08-07"] : [],
|
|
151
181
|
},
|
|
152
182
|
});
|
|
153
183
|
// Emit start with an empty partial
|
|
@@ -174,8 +204,6 @@ async function pumpSdkMessages(model, context, options, stream) {
|
|
|
174
204
|
// -- Streaming partial messages --
|
|
175
205
|
case "stream_event": {
|
|
176
206
|
const partial = msg;
|
|
177
|
-
if (partial.parent_tool_use_id !== null)
|
|
178
|
-
break; // skip subagent
|
|
179
207
|
const event = partial.event;
|
|
180
208
|
// New assistant turn starts with message_start
|
|
181
209
|
if (event.type === "message_start") {
|
|
@@ -200,8 +228,6 @@ async function pumpSdkMessages(model, context, options, stream) {
|
|
|
200
228
|
// -- Complete assistant message (non-streaming fallback) --
|
|
201
229
|
case "assistant": {
|
|
202
230
|
const sdkAssistant = msg;
|
|
203
|
-
if (sdkAssistant.parent_tool_use_id !== null)
|
|
204
|
-
break;
|
|
205
231
|
// Capture text content from complete messages
|
|
206
232
|
for (const block of sdkAssistant.message.content) {
|
|
207
233
|
if (block.type === "text") {
|
|
@@ -215,9 +241,6 @@ async function pumpSdkMessages(model, context, options, stream) {
|
|
|
215
241
|
}
|
|
216
242
|
// -- User message (synthetic tool result — signals turn boundary) --
|
|
217
243
|
case "user": {
|
|
218
|
-
const userMsg = msg;
|
|
219
|
-
if (userMsg.parent_tool_use_id !== null)
|
|
220
|
-
break;
|
|
221
244
|
// Capture content from the completed turn before resetting
|
|
222
245
|
if (builder) {
|
|
223
246
|
for (const block of builder.message.content) {
|
|
@@ -31,6 +31,9 @@ function hydrateProcessEnv(key, value) {
|
|
|
31
31
|
process.env[key] = value;
|
|
32
32
|
}
|
|
33
33
|
async function writeEnvKey(filePath, key, value) {
|
|
34
|
+
if (typeof value !== "string") {
|
|
35
|
+
throw new TypeError(`writeEnvKey expects a string value for key "${key}", got ${typeof value}`);
|
|
36
|
+
}
|
|
34
37
|
let content = "";
|
|
35
38
|
try {
|
|
36
39
|
content = await readFile(filePath, "utf8");
|
|
@@ -334,19 +337,19 @@ export async function collectSecretsFromManifest(base, milestoneId, ctx) {
|
|
|
334
337
|
for (const { key, value } of collected) {
|
|
335
338
|
const entry = manifest.entries.find((e) => e.key === key);
|
|
336
339
|
if (entry) {
|
|
337
|
-
entry.status = value
|
|
340
|
+
entry.status = value != null ? "collected" : "skipped";
|
|
338
341
|
}
|
|
339
342
|
}
|
|
340
343
|
// (i) Write manifest back to disk
|
|
341
344
|
await writeFile(manifestPath, formatSecretsManifest(manifest), "utf8");
|
|
342
345
|
// (j) Apply collected values to destination
|
|
343
|
-
const provided = collected.filter((c) => c.value
|
|
346
|
+
const provided = collected.filter((c) => c.value != null);
|
|
344
347
|
const { applied } = await applySecrets(provided, destination, {
|
|
345
348
|
envFilePath: resolve(ctx.cwd, ".env"),
|
|
346
349
|
});
|
|
347
350
|
const skipped = [
|
|
348
351
|
...alreadySkipped,
|
|
349
|
-
...collected.filter((c) => c.value
|
|
352
|
+
...collected.filter((c) => c.value == null).map((c) => c.key),
|
|
350
353
|
];
|
|
351
354
|
return { applied, skipped, existingSkipped };
|
|
352
355
|
}
|
|
@@ -403,8 +406,8 @@ export default function secureEnv(pi) {
|
|
|
403
406
|
const value = await collectOneSecret(ctx, i, params.keys.length, item.key, item.hint, item.guidance);
|
|
404
407
|
collected.push({ key: item.key, value });
|
|
405
408
|
}
|
|
406
|
-
const provided = collected.filter((c) => c.value
|
|
407
|
-
const skipped = collected.filter((c) => c.value
|
|
409
|
+
const provided = collected.filter((c) => c.value != null);
|
|
410
|
+
const skipped = collected.filter((c) => c.value == null).map((c) => c.key);
|
|
408
411
|
// Apply to destination via shared helper
|
|
409
412
|
const { applied, errors } = await applySecrets(provided, destination, {
|
|
410
413
|
envFilePath: resolve(ctx.cwd, params.envFilePath ?? ".env"),
|
|
@@ -26,7 +26,7 @@ async function getClient() {
|
|
|
26
26
|
*/
|
|
27
27
|
async function searchWithOAuth(query, accessToken, projectId, signal) {
|
|
28
28
|
const model = process.env.GEMINI_SEARCH_MODEL || "gemini-2.5-flash";
|
|
29
|
-
const url = `https://cloudcode-pa.googleapis.com/v1internal:streamGenerateContent`;
|
|
29
|
+
const url = `https://cloudcode-pa.googleapis.com/v1internal:streamGenerateContent?alt=sse`;
|
|
30
30
|
const GEMINI_CLI_HEADERS = {
|
|
31
31
|
ideType: "IDE_UNSPECIFIED",
|
|
32
32
|
platform: "PLATFORM_UNSPECIFIED",
|
|
@@ -49,6 +49,7 @@ async function searchWithOAuth(query, accessToken, projectId, signal) {
|
|
|
49
49
|
contents: [{ parts: [{ text: query }] }],
|
|
50
50
|
tools: [{ googleSearch: {} }],
|
|
51
51
|
},
|
|
52
|
+
userAgent: "pi-coding-agent",
|
|
52
53
|
}),
|
|
53
54
|
signal,
|
|
54
55
|
});
|
|
@@ -13,7 +13,7 @@ import { runUnit } from "./run-unit.js";
|
|
|
13
13
|
import { debugLog } from "../debug-logger.js";
|
|
14
14
|
import { PROJECT_FILES } from "../detection.js";
|
|
15
15
|
import { MergeConflictError } from "../git-service.js";
|
|
16
|
-
import { join } from "node:path";
|
|
16
|
+
import { join, basename } from "node:path";
|
|
17
17
|
import { existsSync, cpSync } from "node:fs";
|
|
18
18
|
import { logWarning, logError } from "../workflow-logger.js";
|
|
19
19
|
import { gsdRoot } from "../paths.js";
|
|
@@ -146,7 +146,7 @@ export async function runPreDispatch(ic, loopState) {
|
|
|
146
146
|
if (mid && s.currentMilestoneId && mid !== s.currentMilestoneId) {
|
|
147
147
|
deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: ic.nextSeq(), eventType: "milestone-transition", data: { from: s.currentMilestoneId, to: mid } });
|
|
148
148
|
ctx.ui.notify(`Milestone ${s.currentMilestoneId} complete. Advancing to ${mid}: ${midTitle}.`, "info");
|
|
149
|
-
deps.sendDesktopNotification("GSD", `Milestone ${s.currentMilestoneId} complete!`, "success", "milestone");
|
|
149
|
+
deps.sendDesktopNotification("GSD", `Milestone ${s.currentMilestoneId} complete!`, "success", "milestone", basename(s.originalBasePath || s.basePath));
|
|
150
150
|
deps.logCmuxEvent(prefs, `Milestone ${s.currentMilestoneId} complete. Advancing to ${mid}.`, "success");
|
|
151
151
|
const vizPrefs = prefs;
|
|
152
152
|
if (vizPrefs?.auto_visualize) {
|
|
@@ -255,7 +255,7 @@ export async function runPreDispatch(ic, loopState) {
|
|
|
255
255
|
}
|
|
256
256
|
// PR creation (auto_pr) is handled inside mergeMilestoneToMain (#2302)
|
|
257
257
|
}
|
|
258
|
-
deps.sendDesktopNotification("GSD", "All milestones complete!", "success", "milestone");
|
|
258
|
+
deps.sendDesktopNotification("GSD", "All milestones complete!", "success", "milestone", basename(s.originalBasePath || s.basePath));
|
|
259
259
|
deps.logCmuxEvent(prefs, "All milestones complete.", "success");
|
|
260
260
|
await deps.stopAuto(ctx, pi, "All milestones complete");
|
|
261
261
|
}
|
|
@@ -269,7 +269,7 @@ export async function runPreDispatch(ic, loopState) {
|
|
|
269
269
|
const blockerMsg = `Blocked: ${state.blockers.join(", ")}`;
|
|
270
270
|
await deps.stopAuto(ctx, pi, blockerMsg);
|
|
271
271
|
ctx.ui.notify(`${blockerMsg}. Fix and run /gsd auto.`, "warning");
|
|
272
|
-
deps.sendDesktopNotification("GSD", blockerMsg, "error", "attention");
|
|
272
|
+
deps.sendDesktopNotification("GSD", blockerMsg, "error", "attention", basename(s.originalBasePath || s.basePath));
|
|
273
273
|
deps.logCmuxEvent(prefs, blockerMsg, "error");
|
|
274
274
|
}
|
|
275
275
|
else {
|
|
@@ -326,7 +326,7 @@ export async function runPreDispatch(ic, loopState) {
|
|
|
326
326
|
}
|
|
327
327
|
// PR creation (auto_pr) is handled inside mergeMilestoneToMain (#2302)
|
|
328
328
|
}
|
|
329
|
-
deps.sendDesktopNotification("GSD", `Milestone ${mid} complete!`, "success", "milestone");
|
|
329
|
+
deps.sendDesktopNotification("GSD", `Milestone ${mid} complete!`, "success", "milestone", basename(s.originalBasePath || s.basePath));
|
|
330
330
|
deps.logCmuxEvent(prefs, `Milestone ${mid} complete.`, "success");
|
|
331
331
|
await closeoutAndStop(ctx, pi, s, deps, `Milestone ${mid} complete`);
|
|
332
332
|
debugLog("autoLoop", { phase: "exit", reason: "milestone-complete" });
|
|
@@ -338,7 +338,7 @@ export async function runPreDispatch(ic, loopState) {
|
|
|
338
338
|
const blockerMsg = `Blocked: ${state.blockers.join(", ")}`;
|
|
339
339
|
await closeoutAndStop(ctx, pi, s, deps, blockerMsg);
|
|
340
340
|
ctx.ui.notify(`${blockerMsg}. Fix and run /gsd auto.`, "warning");
|
|
341
|
-
deps.sendDesktopNotification("GSD", blockerMsg, "error", "attention");
|
|
341
|
+
deps.sendDesktopNotification("GSD", blockerMsg, "error", "attention", basename(s.originalBasePath || s.basePath));
|
|
342
342
|
deps.logCmuxEvent(prefs, blockerMsg, "error");
|
|
343
343
|
debugLog("autoLoop", { phase: "exit", reason: "blocked" });
|
|
344
344
|
deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: ic.nextSeq(), eventType: "terminal", data: { reason: "blocked", blockers: state.blockers } });
|
|
@@ -520,28 +520,28 @@ export async function runGuards(ic, mid) {
|
|
|
520
520
|
// 100% — special enforcement logic (halt/pause/warn)
|
|
521
521
|
const msg = `Budget ceiling ${deps.formatCost(budgetCeiling)} reached (spent ${deps.formatCost(totalCost)}).`;
|
|
522
522
|
if (budgetEnforcementAction === "halt") {
|
|
523
|
-
deps.sendDesktopNotification("GSD", msg, "error", "budget");
|
|
523
|
+
deps.sendDesktopNotification("GSD", msg, "error", "budget", basename(s.originalBasePath || s.basePath));
|
|
524
524
|
await deps.stopAuto(ctx, pi, "Budget ceiling reached");
|
|
525
525
|
debugLog("autoLoop", { phase: "exit", reason: "budget-halt" });
|
|
526
526
|
return { action: "break", reason: "budget-halt" };
|
|
527
527
|
}
|
|
528
528
|
if (budgetEnforcementAction === "pause") {
|
|
529
529
|
ctx.ui.notify(`${msg} Pausing auto-mode — /gsd auto to override and continue.`, "warning");
|
|
530
|
-
deps.sendDesktopNotification("GSD", msg, "warning", "budget");
|
|
530
|
+
deps.sendDesktopNotification("GSD", msg, "warning", "budget", basename(s.originalBasePath || s.basePath));
|
|
531
531
|
deps.logCmuxEvent(prefs, msg, "warning");
|
|
532
532
|
await deps.pauseAuto(ctx, pi);
|
|
533
533
|
debugLog("autoLoop", { phase: "exit", reason: "budget-pause" });
|
|
534
534
|
return { action: "break", reason: "budget-pause" };
|
|
535
535
|
}
|
|
536
536
|
ctx.ui.notify(`${msg} Continuing (enforcement: warn).`, "warning");
|
|
537
|
-
deps.sendDesktopNotification("GSD", msg, "warning", "budget");
|
|
537
|
+
deps.sendDesktopNotification("GSD", msg, "warning", "budget", basename(s.originalBasePath || s.basePath));
|
|
538
538
|
deps.logCmuxEvent(prefs, msg, "warning");
|
|
539
539
|
}
|
|
540
540
|
else if (threshold.pct < 100) {
|
|
541
541
|
// Sub-100% — simple notification
|
|
542
542
|
const msg = `${threshold.label}: ${deps.formatCost(totalCost)} / ${deps.formatCost(budgetCeiling)}`;
|
|
543
543
|
ctx.ui.notify(msg, threshold.notifyLevel);
|
|
544
|
-
deps.sendDesktopNotification("GSD", msg, threshold.notifyLevel, "budget");
|
|
544
|
+
deps.sendDesktopNotification("GSD", msg, threshold.notifyLevel, "budget", basename(s.originalBasePath || s.basePath));
|
|
545
545
|
deps.logCmuxEvent(prefs, msg, threshold.cmuxLevel);
|
|
546
546
|
}
|
|
547
547
|
}
|
|
@@ -561,7 +561,7 @@ export async function runGuards(ic, mid) {
|
|
|
561
561
|
contextUsage.percent >= contextThreshold) {
|
|
562
562
|
const msg = `Context window at ${contextUsage.percent}% (threshold: ${contextThreshold}%). Pausing to prevent truncated output.`;
|
|
563
563
|
ctx.ui.notify(`${msg} Run /gsd auto to continue (will start fresh session).`, "warning");
|
|
564
|
-
deps.sendDesktopNotification("GSD", `Context ${contextUsage.percent}% — paused`, "warning", "attention");
|
|
564
|
+
deps.sendDesktopNotification("GSD", `Context ${contextUsage.percent}% — paused`, "warning", "attention", basename(s.originalBasePath || s.basePath));
|
|
565
565
|
await deps.pauseAuto(ctx, pi);
|
|
566
566
|
debugLog("autoLoop", { phase: "exit", reason: "context-window" });
|
|
567
567
|
return { action: "break", reason: "context-window" };
|
|
@@ -646,6 +646,12 @@ export async function runUnitPhase(ic, iterData, loopState, sidecarItem) {
|
|
|
646
646
|
lastProgressKind: "dispatch",
|
|
647
647
|
recoveryAttempts: 0, // Reset so re-dispatched units get full recovery budget (#2322)
|
|
648
648
|
});
|
|
649
|
+
// Select and apply model (with tier escalation on retry — normal units only)
|
|
650
|
+
const modelResult = await deps.selectAndApplyModel(ctx, pi, unitType, unitId, s.basePath, prefs, s.verbose, s.autoModeStartModel, sidecarItem ? undefined : { isRetry, previousTier });
|
|
651
|
+
s.currentUnitRouting =
|
|
652
|
+
modelResult.routing;
|
|
653
|
+
s.currentUnitModel =
|
|
654
|
+
modelResult.appliedModel;
|
|
649
655
|
// Status bar + progress widget
|
|
650
656
|
ctx.ui.setStatus("gsd-auto", "auto");
|
|
651
657
|
if (mid)
|
|
@@ -709,12 +715,6 @@ export async function runUnitPhase(ic, iterData, loopState, sidecarItem) {
|
|
|
709
715
|
const msg = reorderErr instanceof Error ? reorderErr.message : String(reorderErr);
|
|
710
716
|
logWarning("engine", "Prompt reorder failed", { error: msg });
|
|
711
717
|
}
|
|
712
|
-
// Select and apply model (with tier escalation on retry — normal units only)
|
|
713
|
-
const modelResult = await deps.selectAndApplyModel(ctx, pi, unitType, unitId, s.basePath, prefs, s.verbose, s.autoModeStartModel, sidecarItem ? undefined : { isRetry, previousTier });
|
|
714
|
-
s.currentUnitRouting =
|
|
715
|
-
modelResult.routing;
|
|
716
|
-
s.currentUnitModel =
|
|
717
|
-
modelResult.appliedModel;
|
|
718
718
|
// Apply sidecar/pre-dispatch hook model override (takes priority over standard model selection)
|
|
719
719
|
const hookModelOverride = sidecarItem?.model ?? iterData.hookModelOverride;
|
|
720
720
|
if (hookModelOverride) {
|
|
@@ -806,7 +806,11 @@ export async function runUnitPhase(ic, iterData, loopState, sidecarItem) {
|
|
|
806
806
|
// ── Immediate unit closeout (metrics, activity log, memory) ────────
|
|
807
807
|
// Run right after runUnit() returns so telemetry is never lost to a
|
|
808
808
|
// crash between iterations.
|
|
809
|
-
|
|
809
|
+
// Guard: stopAuto() may have nulled s.currentUnit via s.reset() while
|
|
810
|
+
// this coroutine was suspended at `await runUnit(...)` (#2939).
|
|
811
|
+
if (s.currentUnit) {
|
|
812
|
+
await deps.closeoutUnit(ctx, s.basePath, unitType, unitId, s.currentUnit.startedAt, deps.buildSnapshotOpts(unitType, unitId));
|
|
813
|
+
}
|
|
810
814
|
// ── Zero tool-call guard (#1833) ──────────────────────────────────
|
|
811
815
|
// An execute-task agent that completes with 0 tool calls made no
|
|
812
816
|
// real changes — its summary is hallucinated. Treat as failed so
|
|
@@ -814,7 +818,7 @@ export async function runUnitPhase(ic, iterData, loopState, sidecarItem) {
|
|
|
814
818
|
if (unitType === "execute-task") {
|
|
815
819
|
const currentLedger = deps.getLedger();
|
|
816
820
|
if (currentLedger?.units) {
|
|
817
|
-
const lastUnit = [...currentLedger.units].reverse().find((u) => u.type === unitType && u.id === unitId && u.startedAt === s.currentUnit
|
|
821
|
+
const lastUnit = [...currentLedger.units].reverse().find((u) => u.type === unitType && u.id === unitId && u.startedAt === s.currentUnit?.startedAt);
|
|
818
822
|
if (lastUnit && lastUnit.toolCalls === 0) {
|
|
819
823
|
debugLog("runUnitPhase", {
|
|
820
824
|
phase: "zero-tool-calls",
|
|
@@ -825,7 +829,7 @@ export async function runUnitPhase(ic, iterData, loopState, sidecarItem) {
|
|
|
825
829
|
ctx.ui.notify(`${unitType} ${unitId} completed with 0 tool calls — hallucinated summary, will retry`, "warning");
|
|
826
830
|
// Fall through to next iteration where dispatch will re-derive
|
|
827
831
|
// and re-dispatch this task.
|
|
828
|
-
return { action: "next", data: { unitStartedAt: s.currentUnit
|
|
832
|
+
return { action: "next", data: { unitStartedAt: s.currentUnit?.startedAt } };
|
|
829
833
|
}
|
|
830
834
|
}
|
|
831
835
|
}
|
|
@@ -840,7 +844,7 @@ export async function runUnitPhase(ic, iterData, loopState, sidecarItem) {
|
|
|
840
844
|
s.unitRecoveryCount.delete(`${unitType}/${unitId}`);
|
|
841
845
|
}
|
|
842
846
|
deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: ic.nextSeq(), eventType: "unit-end", data: { unitType, unitId, status: unitResult.status, artifactVerified, ...(unitResult.errorContext ? { errorContext: unitResult.errorContext } : {}) }, causedBy: { flowId: ic.flowId, seq: unitStartSeq } });
|
|
843
|
-
return { action: "next", data: { unitStartedAt: s.currentUnit
|
|
847
|
+
return { action: "next", data: { unitStartedAt: s.currentUnit?.startedAt } };
|
|
844
848
|
}
|
|
845
849
|
// ─── runFinalize ──────────────────────────────────────────────────────────────
|
|
846
850
|
/**
|
|
@@ -42,7 +42,7 @@ export function resolveExpectedArtifactPath(unitType, unitId, base) {
|
|
|
42
42
|
}
|
|
43
43
|
case "run-uat": {
|
|
44
44
|
const dir = resolveSlicePath(base, mid, sid);
|
|
45
|
-
return dir ? join(dir, buildSliceFileName(sid, "
|
|
45
|
+
return dir ? join(dir, buildSliceFileName(sid, "ASSESSMENT")) : null;
|
|
46
46
|
}
|
|
47
47
|
case "execute-task": {
|
|
48
48
|
const dir = resolveSlicePath(base, mid, sid);
|
|
@@ -105,7 +105,7 @@ export function diagnoseExpectedArtifact(unitType, unitId, base) {
|
|
|
105
105
|
case "reassess-roadmap":
|
|
106
106
|
return `${relSliceFile(base, mid, sid, "ASSESSMENT")} (roadmap reassessment)`;
|
|
107
107
|
case "run-uat":
|
|
108
|
-
return `${relSliceFile(base, mid, sid, "
|
|
108
|
+
return `${relSliceFile(base, mid, sid, "ASSESSMENT")} (UAT assessment result)`;
|
|
109
109
|
case "validate-milestone":
|
|
110
110
|
return `${relMilestoneFile(base, mid, "VALIDATION")} (milestone validation report)`;
|
|
111
111
|
case "complete-milestone":
|
|
@@ -458,6 +458,13 @@ export function updateProgressWidget(ctx, unitType, unitId, state, accessors, ti
|
|
|
458
458
|
: theme.fg("dim", elapsed))
|
|
459
459
|
: "";
|
|
460
460
|
lines.push(rightAlign(headerLeft, headerRight, width));
|
|
461
|
+
// Worktree/branch right-aligned below header
|
|
462
|
+
if (worktreeName && cachedBranch) {
|
|
463
|
+
lines.push(rightAlign("", theme.fg("dim", `${worktreeName} (${cachedBranch})`), width));
|
|
464
|
+
}
|
|
465
|
+
else if (cachedBranch) {
|
|
466
|
+
lines.push(rightAlign("", theme.fg("dim", cachedBranch), width));
|
|
467
|
+
}
|
|
461
468
|
// Show health signal details when degraded (yellow/red)
|
|
462
469
|
if (score.level !== "green" && score.signals.length > 0 && widgetMode !== "min") {
|
|
463
470
|
// Show up to 3 most relevant signals in compact form
|
|
@@ -564,10 +571,10 @@ export function updateProgressWidget(ctx, unitType, unitId, state, accessors, ti
|
|
|
564
571
|
const hasContext = !!(mid || (slice && unitType !== "research-milestone" && unitType !== "plan-milestone"));
|
|
565
572
|
if (mid) {
|
|
566
573
|
const modelTag = modelDisplay ? theme.fg("muted", ` ${modelDisplay}`) : "";
|
|
567
|
-
lines.push(truncateToWidth(`${pad}${theme.fg("dim", mid.title)}${modelTag}`, width));
|
|
574
|
+
lines.push(truncateToWidth(`${pad}${theme.fg("dim", mid.title)}${modelTag}`, width, "…"));
|
|
568
575
|
}
|
|
569
576
|
if (slice && unitType !== "research-milestone" && unitType !== "plan-milestone") {
|
|
570
|
-
lines.push(truncateToWidth(`${pad}${theme.fg("text", theme.bold(`${slice.id}: ${slice.title}`))}`, width));
|
|
577
|
+
lines.push(truncateToWidth(`${pad}${theme.fg("text", theme.bold(`${slice.id}: ${slice.title}`))}`, width, "…"));
|
|
571
578
|
}
|
|
572
579
|
if (hasContext)
|
|
573
580
|
lines.push("");
|
|
@@ -605,6 +612,11 @@ export function updateProgressWidget(ctx, unitType, unitId, state, accessors, ti
|
|
|
605
612
|
// Build right column: task checklist
|
|
606
613
|
const rightLines = [];
|
|
607
614
|
const maxVisibleTasks = 8;
|
|
615
|
+
// Max visible chars for task title text (before ANSI theming)
|
|
616
|
+
const maxTaskTitleLen = 45;
|
|
617
|
+
function truncTitle(s) {
|
|
618
|
+
return s.length > maxTaskTitleLen ? s.slice(0, maxTaskTitleLen - 1) + "…" : s;
|
|
619
|
+
}
|
|
608
620
|
function formatTaskLine(t, isCurrent) {
|
|
609
621
|
const glyph = t.done
|
|
610
622
|
? theme.fg("success", "*")
|
|
@@ -616,11 +628,12 @@ export function updateProgressWidget(ctx, unitType, unitId, state, accessors, ti
|
|
|
616
628
|
: t.done
|
|
617
629
|
? theme.fg("muted", t.id)
|
|
618
630
|
: theme.fg("dim", t.id);
|
|
631
|
+
const short = truncTitle(t.title);
|
|
619
632
|
const title = isCurrent
|
|
620
|
-
? theme.fg("text",
|
|
633
|
+
? theme.fg("text", short)
|
|
621
634
|
: t.done
|
|
622
|
-
? theme.fg("muted",
|
|
623
|
-
: theme.fg("text",
|
|
635
|
+
? theme.fg("muted", short)
|
|
636
|
+
: theme.fg("text", short);
|
|
624
637
|
return `${glyph} ${id}: ${title}`;
|
|
625
638
|
}
|
|
626
639
|
if (useTwoCol && taskDetailsCol) {
|
|
@@ -642,7 +655,7 @@ export function updateProgressWidget(ctx, unitType, unitId, state, accessors, ti
|
|
|
642
655
|
if (maxRows > 0) {
|
|
643
656
|
lines.push("");
|
|
644
657
|
for (let i = 0; i < maxRows; i++) {
|
|
645
|
-
const left = padToWidth(truncateToWidth(leftLines[i] ?? "", leftColWidth), leftColWidth);
|
|
658
|
+
const left = padToWidth(truncateToWidth(leftLines[i] ?? "", leftColWidth, "…"), leftColWidth);
|
|
646
659
|
const right = rightLines[i] ?? "";
|
|
647
660
|
lines.push(`${left}${right}`);
|
|
648
661
|
}
|
|
@@ -652,7 +665,7 @@ export function updateProgressWidget(ctx, unitType, unitId, state, accessors, ti
|
|
|
652
665
|
if (leftLines.length > 0) {
|
|
653
666
|
lines.push("");
|
|
654
667
|
for (const l of leftLines)
|
|
655
|
-
lines.push(truncateToWidth(l, width));
|
|
668
|
+
lines.push(truncateToWidth(l, width, "…"));
|
|
656
669
|
}
|
|
657
670
|
}
|
|
658
671
|
// ── Footer: simplified stats + pwd + last commit + hints ────────
|
|
@@ -682,24 +695,28 @@ export function updateProgressWidget(ctx, unitType, unitId, state, accessors, ti
|
|
|
682
695
|
lines.push(rightAlign("", theme.fg("dim", cachedRtkLabel), width));
|
|
683
696
|
}
|
|
684
697
|
}
|
|
685
|
-
//
|
|
698
|
+
// Last commit info
|
|
686
699
|
const lastCommit = getLastCommit(accessors.getBasePath());
|
|
687
|
-
const
|
|
688
|
-
|
|
700
|
+
const maxCommitLen = 65;
|
|
701
|
+
const commitMsg = lastCommit
|
|
702
|
+
? lastCommit.message.length > maxCommitLen
|
|
703
|
+
? lastCommit.message.slice(0, maxCommitLen - 1) + "…"
|
|
704
|
+
: lastCommit.message
|
|
689
705
|
: "";
|
|
690
|
-
const pwdStr = theme.fg("dim", widgetPwd);
|
|
691
|
-
if (commitStr) {
|
|
692
|
-
lines.push(rightAlign(`${pad}${pwdStr}`, truncateToWidth(commitStr, Math.floor(width * 0.45)), width));
|
|
693
|
-
}
|
|
694
|
-
else {
|
|
695
|
-
lines.push(`${pad}${pwdStr}`);
|
|
696
|
-
}
|
|
697
706
|
// Hints line
|
|
698
707
|
const hintParts = [];
|
|
699
708
|
hintParts.push("esc pause");
|
|
700
709
|
hintParts.push(process.platform === "darwin" ? "⌃⌥G dashboard" : "Ctrl+Alt+G dashboard");
|
|
701
710
|
const hintStr = theme.fg("dim", hintParts.join(" | "));
|
|
702
|
-
|
|
711
|
+
const commitStr = lastCommit
|
|
712
|
+
? theme.fg("dim", `${lastCommit.timeAgo} ago: ${commitMsg}`)
|
|
713
|
+
: "";
|
|
714
|
+
if (commitStr) {
|
|
715
|
+
lines.push(rightAlign(`${pad}${commitStr}`, hintStr, width));
|
|
716
|
+
}
|
|
717
|
+
else {
|
|
718
|
+
lines.push(rightAlign("", hintStr, width));
|
|
719
|
+
}
|
|
703
720
|
lines.push(...ui.bar());
|
|
704
721
|
cachedLines = lines;
|
|
705
722
|
cachedWidth = width;
|
|
@@ -723,12 +740,12 @@ function rightAlign(left, right, width) {
|
|
|
723
740
|
const leftVis = visibleWidth(left);
|
|
724
741
|
const rightVis = visibleWidth(right);
|
|
725
742
|
const gap = Math.max(1, width - leftVis - rightVis);
|
|
726
|
-
return truncateToWidth(left + " ".repeat(gap) + right, width);
|
|
743
|
+
return truncateToWidth(left + " ".repeat(gap) + right, width, "…");
|
|
727
744
|
}
|
|
728
745
|
/** Pad a string with trailing spaces to fill exactly `colWidth` (ANSI-aware). */
|
|
729
746
|
function padToWidth(s, colWidth) {
|
|
730
747
|
const vis = visibleWidth(s);
|
|
731
748
|
if (vis >= colWidth)
|
|
732
|
-
return truncateToWidth(s, colWidth);
|
|
749
|
+
return truncateToWidth(s, colWidth, "…");
|
|
733
750
|
return s + " ".repeat(colWidth - vis);
|
|
734
751
|
}
|
|
@@ -13,6 +13,7 @@ import { isDbAvailable, getMilestoneSlices, getPendingGates, markAllGatesOmitted
|
|
|
13
13
|
import { extractVerdict, isAcceptableUatVerdict } from "./verdict-parser.js";
|
|
14
14
|
import { gsdRoot, resolveMilestoneFile, resolveMilestonePath, resolveSliceFile, resolveTaskFile, relSliceFile, buildMilestoneFileName, } from "./paths.js";
|
|
15
15
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
16
|
+
import { logError } from "./workflow-logger.js";
|
|
16
17
|
import { join } from "node:path";
|
|
17
18
|
import { hasImplementationArtifacts } from "./auto-recovery.js";
|
|
18
19
|
import { buildDiscussMilestonePrompt, buildResearchMilestonePrompt, buildPlanMilestonePrompt, buildResearchSlicePrompt, buildPlanSlicePrompt, buildExecuteTaskPrompt, buildCompleteSlicePrompt, buildCompleteMilestonePrompt, buildValidateMilestonePrompt, buildReplanSlicePrompt, buildRunUatPrompt, buildReassessRoadmapPrompt, buildRewriteDocsPrompt, buildReactiveExecutePrompt, buildGateEvaluatePrompt, checkNeedsReassessment, checkNeedsRunUat, } from "./auto-prompts.js";
|
|
@@ -59,6 +60,20 @@ export function setRewriteCount(basePath, count) {
|
|
|
59
60
|
mkdirSync(join(gsdRoot(basePath), "runtime"), { recursive: true });
|
|
60
61
|
writeFileSync(filePath, JSON.stringify({ count, updatedAt: new Date().toISOString() }) + "\n");
|
|
61
62
|
}
|
|
63
|
+
// ─── Helpers ─────────────────────────────────────────────────────────────
|
|
64
|
+
/**
|
|
65
|
+
* Returns true when the verification_operational value indicates that no
|
|
66
|
+
* operational verification is needed. Covers common phrasings the planning
|
|
67
|
+
* agent may use: "None", "None required", "N/A", "Not applicable", etc.
|
|
68
|
+
*
|
|
69
|
+
* @see https://github.com/gsd-build/gsd-2/issues/2931
|
|
70
|
+
*/
|
|
71
|
+
export function isVerificationNotApplicable(value) {
|
|
72
|
+
const v = (value ?? "").toLowerCase().trim();
|
|
73
|
+
if (!v || v === "none")
|
|
74
|
+
return true;
|
|
75
|
+
return /^(?:none[\s._-]*(?:required|needed|planned)?|n\/?a|not[\s._-]+(?:applicable|required|needed)|no[\s._-]+operational[\s\S]*)$/i.test(v);
|
|
76
|
+
}
|
|
62
77
|
// ─── Rules ────────────────────────────────────────────────────────────────
|
|
63
78
|
export const DISPATCH_RULES = [
|
|
64
79
|
{
|
|
@@ -383,7 +398,7 @@ export const DISPATCH_RULES = [
|
|
|
383
398
|
}
|
|
384
399
|
catch (err) {
|
|
385
400
|
// Non-fatal — fall through to sequential execution
|
|
386
|
-
|
|
401
|
+
logError("dispatch", "reactive graph derivation failed", { error: err.message });
|
|
387
402
|
return null;
|
|
388
403
|
}
|
|
389
404
|
},
|
|
@@ -526,7 +541,7 @@ export const DISPATCH_RULES = [
|
|
|
526
541
|
if (isDbAvailable()) {
|
|
527
542
|
const milestone = getMilestone(mid);
|
|
528
543
|
if (milestone?.verification_operational &&
|
|
529
|
-
milestone.verification_operational
|
|
544
|
+
!isVerificationNotApplicable(milestone.verification_operational)) {
|
|
530
545
|
const validationPath = resolveMilestoneFile(basePath, mid, "VALIDATION");
|
|
531
546
|
if (validationPath) {
|
|
532
547
|
const validationContent = await loadFile(validationPath);
|
|
@@ -163,7 +163,30 @@ export function resolveModelId(modelId, availableModels, currentProvider) {
|
|
|
163
163
|
return availableModels.find(m => m.id.toLowerCase() === lower
|
|
164
164
|
|| `${m.provider}/${m.id}`.toLowerCase() === lower);
|
|
165
165
|
}
|
|
166
|
-
// Bare ID —
|
|
167
|
-
|
|
168
|
-
|
|
166
|
+
// Bare ID — resolve with provider precedence to avoid silent misrouting.
|
|
167
|
+
// Extension providers (e.g. claude-code) expose the same model IDs as their
|
|
168
|
+
// upstream API providers but route through a subprocess with different
|
|
169
|
+
// context, tool visibility, and cost characteristics (#2905). Bare IDs in
|
|
170
|
+
// PREFERENCES.md must resolve to the canonical API provider, not to an
|
|
171
|
+
// extension wrapper that happens to be the current session provider.
|
|
172
|
+
const candidates = availableModels.filter(m => m.id === modelId);
|
|
173
|
+
if (candidates.length === 0)
|
|
174
|
+
return undefined;
|
|
175
|
+
if (candidates.length === 1)
|
|
176
|
+
return candidates[0];
|
|
177
|
+
// Extension / CLI-wrapper providers that should never win bare-ID resolution
|
|
178
|
+
// when a first-class API provider also offers the same model.
|
|
179
|
+
const EXTENSION_PROVIDERS = new Set(["claude-code"]);
|
|
180
|
+
// Prefer currentProvider only when it is a first-class API provider
|
|
181
|
+
if (currentProvider && !EXTENSION_PROVIDERS.has(currentProvider)) {
|
|
182
|
+
const providerMatch = candidates.find(m => m.provider === currentProvider);
|
|
183
|
+
if (providerMatch)
|
|
184
|
+
return providerMatch;
|
|
185
|
+
}
|
|
186
|
+
// Prefer "anthropic" as the canonical provider for Anthropic models
|
|
187
|
+
const anthropicMatch = candidates.find(m => m.provider === "anthropic");
|
|
188
|
+
if (anthropicMatch)
|
|
189
|
+
return anthropicMatch;
|
|
190
|
+
// Fall back to first non-extension candidate, or any candidate
|
|
191
|
+
return candidates.find(m => !EXTENSION_PROVIDERS.has(m.provider)) ?? candidates[0];
|
|
169
192
|
}
|