gsd-pi 2.57.0 → 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/infra-errors.js +4 -0
- 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 +20 -5
- 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 +203 -14
- 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 +82 -9
- 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/dispatch-guard.js +11 -1
- 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 +44 -10
- 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/parallel-orchestrator.js +23 -6
- 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 +42 -31
- 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/prompts/validate-milestone.md +2 -2
- 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 +18 -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 +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 +1 -1
- 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 +4 -4
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
- 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/experimental/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +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 +5 -5
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -5
- 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/2229.js +2 -2
- package/dist/web/standalone/.next/server/chunks/7471.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/6502.7593d7797a4b3999.js +9 -0
- package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-0c485498795110d6.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-4332cbd5dd1be584.js → webpack-a1c1e452c6b32d04.js} +1 -1
- package/dist/web/standalone/.next/static/css/f6e8833d46e738d8.css +1 -0
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
- package/dist/web/standalone/server.js +1 -1
- package/dist/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/infra-errors.ts +3 -0
- 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 +21 -5
- 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 +197 -11
- 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 +87 -9
- 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/dispatch-guard.ts +12 -1
- 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 +49 -8
- 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/parallel-orchestrator.ts +23 -6
- 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 +45 -29
- 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/prompts/validate-milestone.md +2 -2
- 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/dispatch-guard.test.ts +47 -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/parallel-worker-monitoring.test.ts +9 -8
- 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/preferences.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/project-relocation-recovery.test.ts +297 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +36 -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 +27 -2
- package/src/resources/extensions/gsd/tests/validation-gate-patterns.test.ts +44 -2
- 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-db-same-file.test.ts +175 -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 +25 -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.2305d0afd2385711.js +0 -9
- package/dist/web/standalone/.next/static/chunks/app/page-62be3b5fa91e4c8f.js +0 -1
- package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
- package/dist/web/standalone/.next/static/css/a58ef8a151aa0493.css +0 -1
- package/src/resources/extensions/gsd/tests/empty-db-reconciliation.test.ts +0 -79
- /package/dist/web/standalone/.next/static/{yowc5qPtuKxjOr22KmOAy → R0D4xaIPl5kg93edN7Oo0}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{yowc5qPtuKxjOr22KmOAy → R0D4xaIPl5kg93edN7Oo0}/_ssgManifest.js +0 -0
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"provides": {
|
|
9
9
|
"tools": ["bg_shell"],
|
|
10
10
|
"commands": ["bg"],
|
|
11
|
-
"hooks": ["session_shutdown"],
|
|
11
|
+
"hooks": ["session_shutdown", "session_compact", "session_tree", "session_switch", "before_agent_start", "session_start", "turn_end", "agent_end", "tool_execution_end"],
|
|
12
12
|
"shortcuts": ["Ctrl+Alt+B"]
|
|
13
13
|
}
|
|
14
14
|
}
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
"browser_visual_diff", "browser_zoom_region",
|
|
30
30
|
"browser_generate_test", "browser_action_cache", "browser_check_injection"
|
|
31
31
|
],
|
|
32
|
-
"hooks": ["session_shutdown"]
|
|
32
|
+
"hooks": ["session_start", "session_shutdown"]
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
35
|
"runtime": ["playwright"]
|
|
@@ -16,6 +16,7 @@ import type {
|
|
|
16
16
|
Usage,
|
|
17
17
|
WebSearchResultContent,
|
|
18
18
|
} from "@gsd/pi-ai";
|
|
19
|
+
import { repairToolJson } from "@gsd/pi-ai";
|
|
19
20
|
import type { BetaContentBlock, BetaRawMessageStreamEvent, NonNullableUsage } from "./sdk-types.js";
|
|
20
21
|
|
|
21
22
|
// ---------------------------------------------------------------------------
|
|
@@ -244,12 +245,18 @@ export class PartialMessageBuilder {
|
|
|
244
245
|
try {
|
|
245
246
|
block.arguments = JSON.parse(jsonStr);
|
|
246
247
|
} catch {
|
|
247
|
-
//
|
|
248
|
-
//
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
248
|
+
// JSON.parse failed — attempt repair for YAML-style bullet
|
|
249
|
+
// lists that LLMs copy from template formatting (#2660).
|
|
250
|
+
try {
|
|
251
|
+
block.arguments = JSON.parse(repairToolJson(jsonStr));
|
|
252
|
+
} catch {
|
|
253
|
+
// Repair also failed — stream was truncated or garbage.
|
|
254
|
+
// Preserve the raw string for diagnostics but signal the
|
|
255
|
+
// malformation explicitly so downstream consumers can
|
|
256
|
+
// distinguish this from a healthy tool completion (#2574).
|
|
257
|
+
block.arguments = { _raw: jsonStr };
|
|
258
|
+
return { type: "toolcall_end", contentIndex, toolCall: block, partial: this.partial, malformedArguments: true };
|
|
259
|
+
}
|
|
253
260
|
}
|
|
254
261
|
return { type: "toolcall_end", contentIndex, toolCall: block, partial: this.partial };
|
|
255
262
|
}
|
|
@@ -23,9 +23,6 @@ import type {
|
|
|
23
23
|
SDKMessage,
|
|
24
24
|
SDKPartialAssistantMessage,
|
|
25
25
|
SDKResultMessage,
|
|
26
|
-
SDKSystemMessage,
|
|
27
|
-
SDKStatusMessage,
|
|
28
|
-
SDKUserMessage,
|
|
29
26
|
} from "./sdk-types.js";
|
|
30
27
|
|
|
31
28
|
// ---------------------------------------------------------------------------
|
|
@@ -71,30 +68,49 @@ function getClaudePath(): string {
|
|
|
71
68
|
}
|
|
72
69
|
|
|
73
70
|
// ---------------------------------------------------------------------------
|
|
74
|
-
// Prompt
|
|
71
|
+
// Prompt construction
|
|
75
72
|
// ---------------------------------------------------------------------------
|
|
76
73
|
|
|
77
74
|
/**
|
|
78
|
-
* Extract
|
|
79
|
-
* The SDK manages its own conversation history — we only send
|
|
80
|
-
* the latest user message as the prompt.
|
|
75
|
+
* Extract text content from a single message regardless of content shape.
|
|
81
76
|
*/
|
|
82
|
-
function
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
.filter((part: any) => part.type === "text")
|
|
90
|
-
.map((part: any) => part.text);
|
|
91
|
-
if (textParts.length > 0) return textParts.join("\n");
|
|
92
|
-
}
|
|
93
|
-
}
|
|
77
|
+
function extractMessageText(msg: { role: string; content: unknown }): string {
|
|
78
|
+
if (typeof msg.content === "string") return msg.content;
|
|
79
|
+
if (Array.isArray(msg.content)) {
|
|
80
|
+
const textParts = msg.content
|
|
81
|
+
.filter((part: any) => part.type === "text")
|
|
82
|
+
.map((part: any) => part.text ?? part.thinking ?? "");
|
|
83
|
+
if (textParts.length > 0) return textParts.join("\n");
|
|
94
84
|
}
|
|
95
85
|
return "";
|
|
96
86
|
}
|
|
97
87
|
|
|
88
|
+
/**
|
|
89
|
+
* Build a full conversational prompt from GSD's context messages.
|
|
90
|
+
*
|
|
91
|
+
* Previous behaviour sent only the last user message, making every SDK
|
|
92
|
+
* call effectively stateless. This version serialises the complete
|
|
93
|
+
* conversation history (system prompt + all user/assistant turns) so
|
|
94
|
+
* Claude Code has full context for multi-turn continuity.
|
|
95
|
+
*/
|
|
96
|
+
export function buildPromptFromContext(context: Context): string {
|
|
97
|
+
const parts: string[] = [];
|
|
98
|
+
|
|
99
|
+
if (context.systemPrompt) {
|
|
100
|
+
parts.push(`[System]\n${context.systemPrompt}`);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
for (const msg of context.messages) {
|
|
104
|
+
const text = extractMessageText(msg);
|
|
105
|
+
if (!text) continue;
|
|
106
|
+
|
|
107
|
+
const label = msg.role === "user" ? "User" : msg.role === "assistant" ? "Assistant" : "System";
|
|
108
|
+
parts.push(`[${label}]\n${text}`);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
return parts.join("\n\n");
|
|
112
|
+
}
|
|
113
|
+
|
|
98
114
|
// ---------------------------------------------------------------------------
|
|
99
115
|
// Error helper
|
|
100
116
|
// ---------------------------------------------------------------------------
|
|
@@ -127,6 +143,31 @@ export function makeStreamExhaustedErrorMessage(model: string, lastTextContent:
|
|
|
127
143
|
return message;
|
|
128
144
|
}
|
|
129
145
|
|
|
146
|
+
// ---------------------------------------------------------------------------
|
|
147
|
+
// SDK options builder
|
|
148
|
+
// ---------------------------------------------------------------------------
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Build the options object passed to the Claude Agent SDK's `query()` call.
|
|
152
|
+
*
|
|
153
|
+
* Extracted for testability — callers can verify session persistence,
|
|
154
|
+
* beta flags, and other configuration without mocking the full SDK.
|
|
155
|
+
*/
|
|
156
|
+
export function buildSdkOptions(modelId: string, prompt: string): Record<string, unknown> {
|
|
157
|
+
return {
|
|
158
|
+
pathToClaudeCodeExecutable: getClaudePath(),
|
|
159
|
+
model: modelId,
|
|
160
|
+
includePartialMessages: true,
|
|
161
|
+
persistSession: true,
|
|
162
|
+
cwd: process.cwd(),
|
|
163
|
+
permissionMode: "bypassPermissions",
|
|
164
|
+
allowDangerouslySkipPermissions: true,
|
|
165
|
+
settingSources: ["project"],
|
|
166
|
+
systemPrompt: { type: "preset", preset: "claude_code" },
|
|
167
|
+
betas: modelId.includes("sonnet") ? ["context-1m-2025-08-07"] : [],
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
|
|
130
171
|
// ---------------------------------------------------------------------------
|
|
131
172
|
// streamSimple implementation
|
|
132
173
|
// ---------------------------------------------------------------------------
|
|
@@ -180,22 +221,14 @@ async function pumpSdkMessages(
|
|
|
180
221
|
options.signal.addEventListener("abort", () => controller.abort(), { once: true });
|
|
181
222
|
}
|
|
182
223
|
|
|
183
|
-
const prompt =
|
|
224
|
+
const prompt = buildPromptFromContext(context);
|
|
225
|
+
const sdkOpts = buildSdkOptions(modelId, prompt);
|
|
184
226
|
|
|
185
227
|
const queryResult = sdk.query({
|
|
186
228
|
prompt,
|
|
187
229
|
options: {
|
|
188
|
-
|
|
189
|
-
model: modelId,
|
|
190
|
-
includePartialMessages: true,
|
|
191
|
-
persistSession: false,
|
|
230
|
+
...sdkOpts,
|
|
192
231
|
abortController: controller,
|
|
193
|
-
cwd: process.cwd(),
|
|
194
|
-
permissionMode: "bypassPermissions",
|
|
195
|
-
allowDangerouslySkipPermissions: true,
|
|
196
|
-
settingSources: ["project"],
|
|
197
|
-
systemPrompt: { type: "preset", preset: "claude_code" },
|
|
198
|
-
betas: modelId.includes("sonnet") ? ["context-1m-2025-08-07"] : [],
|
|
199
232
|
},
|
|
200
233
|
});
|
|
201
234
|
|
|
@@ -225,7 +258,6 @@ async function pumpSdkMessages(
|
|
|
225
258
|
// -- Streaming partial messages --
|
|
226
259
|
case "stream_event": {
|
|
227
260
|
const partial = msg as SDKPartialAssistantMessage;
|
|
228
|
-
if (partial.parent_tool_use_id !== null) break; // skip subagent
|
|
229
261
|
|
|
230
262
|
const event = partial.event;
|
|
231
263
|
|
|
@@ -256,7 +288,6 @@ async function pumpSdkMessages(
|
|
|
256
288
|
// -- Complete assistant message (non-streaming fallback) --
|
|
257
289
|
case "assistant": {
|
|
258
290
|
const sdkAssistant = msg as SDKAssistantMessage;
|
|
259
|
-
if (sdkAssistant.parent_tool_use_id !== null) break;
|
|
260
291
|
|
|
261
292
|
// Capture text content from complete messages
|
|
262
293
|
for (const block of sdkAssistant.message.content) {
|
|
@@ -271,9 +302,6 @@ async function pumpSdkMessages(
|
|
|
271
302
|
|
|
272
303
|
// -- User message (synthetic tool result — signals turn boundary) --
|
|
273
304
|
case "user": {
|
|
274
|
-
const userMsg = msg as SDKUserMessage;
|
|
275
|
-
if (userMsg.parent_tool_use_id !== null) break;
|
|
276
|
-
|
|
277
305
|
// Capture content from the completed turn before resetting
|
|
278
306
|
if (builder) {
|
|
279
307
|
for (const block of builder.message.content) {
|
|
@@ -102,4 +102,32 @@ describe("PartialMessageBuilder — malformed tool arguments (#2574)", () => {
|
|
|
102
102
|
"non-JSON content should set malformedArguments: true",
|
|
103
103
|
);
|
|
104
104
|
});
|
|
105
|
+
|
|
106
|
+
test("YAML bullet lists repaired to JSON arrays (#2660)", () => {
|
|
107
|
+
const builder = new PartialMessageBuilder("claude-sonnet-4-20250514");
|
|
108
|
+
const malformedJson =
|
|
109
|
+
'{"milestoneId": "M005", "keyDecisions": - Used Web Notification API, "keyFiles": - src/lib.rs, "title": "done"}';
|
|
110
|
+
const event = feedToolCall(builder, [malformedJson]);
|
|
111
|
+
|
|
112
|
+
assert.ok(event, "event should not be null");
|
|
113
|
+
assert.equal(event!.type, "toolcall_end");
|
|
114
|
+
// Repaired YAML bullets should NOT set malformedArguments
|
|
115
|
+
assert.equal(
|
|
116
|
+
(event as any).malformedArguments,
|
|
117
|
+
undefined,
|
|
118
|
+
"repaired YAML bullets should not set malformedArguments",
|
|
119
|
+
);
|
|
120
|
+
if (event!.type === "toolcall_end") {
|
|
121
|
+
assert.equal(event!.toolCall.arguments.milestoneId, "M005");
|
|
122
|
+
assert.ok(
|
|
123
|
+
Array.isArray(event!.toolCall.arguments.keyDecisions),
|
|
124
|
+
"keyDecisions should be repaired to an array",
|
|
125
|
+
);
|
|
126
|
+
assert.ok(
|
|
127
|
+
Array.isArray(event!.toolCall.arguments.keyFiles),
|
|
128
|
+
"keyFiles should be repaired to an array",
|
|
129
|
+
);
|
|
130
|
+
assert.equal(event!.toolCall.arguments.title, "done");
|
|
131
|
+
}
|
|
132
|
+
});
|
|
105
133
|
});
|
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
import { describe, test } from "node:test";
|
|
2
2
|
import assert from "node:assert/strict";
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
makeStreamExhaustedErrorMessage,
|
|
5
|
+
buildPromptFromContext,
|
|
6
|
+
buildSdkOptions,
|
|
7
|
+
} from "../stream-adapter.ts";
|
|
8
|
+
import type { Context, Message } from "@gsd/pi-ai";
|
|
9
|
+
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
// Existing tests — exhausted stream fallback (#2575)
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
4
13
|
|
|
5
14
|
describe("stream-adapter — exhausted stream fallback (#2575)", () => {
|
|
6
15
|
test("generator exhaustion becomes an error message instead of clean completion", () => {
|
|
@@ -19,3 +28,101 @@ describe("stream-adapter — exhausted stream fallback (#2575)", () => {
|
|
|
19
28
|
assert.match(String((message.content[0] as any)?.text ?? ""), /Claude Code error: stream_exhausted_without_result/);
|
|
20
29
|
});
|
|
21
30
|
});
|
|
31
|
+
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
// Bug #2859 — stateless provider regression tests
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
|
|
36
|
+
describe("stream-adapter — full context prompt (#2859)", () => {
|
|
37
|
+
test("buildPromptFromContext includes all user and assistant messages, not just the last user message", () => {
|
|
38
|
+
const context: Context = {
|
|
39
|
+
systemPrompt: "You are a helpful assistant.",
|
|
40
|
+
messages: [
|
|
41
|
+
{ role: "user", content: "What is 2+2?" } as Message,
|
|
42
|
+
{
|
|
43
|
+
role: "assistant",
|
|
44
|
+
content: [{ type: "text", text: "4" }],
|
|
45
|
+
api: "anthropic-messages",
|
|
46
|
+
provider: "claude-code",
|
|
47
|
+
model: "claude-sonnet-4-20250514",
|
|
48
|
+
usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, totalTokens: 0, cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 } },
|
|
49
|
+
stopReason: "stop",
|
|
50
|
+
timestamp: Date.now(),
|
|
51
|
+
} as Message,
|
|
52
|
+
{ role: "user", content: "Now multiply that by 3" } as Message,
|
|
53
|
+
],
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
const prompt = buildPromptFromContext(context);
|
|
57
|
+
|
|
58
|
+
// Must contain content from BOTH user messages, not just the last
|
|
59
|
+
assert.ok(prompt.includes("2+2"), "prompt must include first user message");
|
|
60
|
+
assert.ok(prompt.includes("multiply"), "prompt must include second user message");
|
|
61
|
+
// Must contain assistant response for continuity
|
|
62
|
+
assert.ok(prompt.includes("4"), "prompt must include assistant reply for context");
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
test("buildPromptFromContext includes system prompt when present", () => {
|
|
66
|
+
const context: Context = {
|
|
67
|
+
systemPrompt: "You are a coding assistant.",
|
|
68
|
+
messages: [
|
|
69
|
+
{ role: "user", content: "Write a function" } as Message,
|
|
70
|
+
],
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
const prompt = buildPromptFromContext(context);
|
|
74
|
+
assert.ok(prompt.includes("coding assistant"), "prompt must include system prompt");
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
test("buildPromptFromContext handles array content parts in user messages", () => {
|
|
78
|
+
const context: Context = {
|
|
79
|
+
messages: [
|
|
80
|
+
{
|
|
81
|
+
role: "user",
|
|
82
|
+
content: [
|
|
83
|
+
{ type: "text", text: "First part" },
|
|
84
|
+
{ type: "text", text: "Second part" },
|
|
85
|
+
],
|
|
86
|
+
} as Message,
|
|
87
|
+
{ role: "user", content: "Follow-up" } as Message,
|
|
88
|
+
],
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
const prompt = buildPromptFromContext(context);
|
|
92
|
+
assert.ok(prompt.includes("First part"), "prompt must include array content parts");
|
|
93
|
+
assert.ok(prompt.includes("Second part"), "prompt must include all text parts");
|
|
94
|
+
assert.ok(prompt.includes("Follow-up"), "prompt must include follow-up message");
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
test("buildPromptFromContext returns empty string for empty messages", () => {
|
|
98
|
+
const context: Context = { messages: [] };
|
|
99
|
+
const prompt = buildPromptFromContext(context);
|
|
100
|
+
assert.equal(prompt, "");
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
describe("stream-adapter — session persistence (#2859)", () => {
|
|
105
|
+
test("buildSdkOptions enables persistSession by default", () => {
|
|
106
|
+
const options = buildSdkOptions("claude-sonnet-4-20250514", "test prompt");
|
|
107
|
+
assert.equal(options.persistSession, true, "persistSession must default to true");
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
test("buildSdkOptions sets model and prompt correctly", () => {
|
|
111
|
+
const options = buildSdkOptions("claude-sonnet-4-20250514", "hello world");
|
|
112
|
+
assert.equal(options.model, "claude-sonnet-4-20250514");
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
test("buildSdkOptions enables betas for sonnet models", () => {
|
|
116
|
+
const sonnetOpts = buildSdkOptions("claude-sonnet-4-20250514", "test");
|
|
117
|
+
assert.ok(
|
|
118
|
+
Array.isArray(sonnetOpts.betas) && sonnetOpts.betas.length > 0,
|
|
119
|
+
"sonnet models should have betas enabled",
|
|
120
|
+
);
|
|
121
|
+
|
|
122
|
+
const opusOpts = buildSdkOptions("claude-opus-4-20250514", "test");
|
|
123
|
+
assert.ok(
|
|
124
|
+
Array.isArray(opusOpts.betas) && opusOpts.betas.length === 0,
|
|
125
|
+
"non-sonnet models should have empty betas",
|
|
126
|
+
);
|
|
127
|
+
});
|
|
128
|
+
});
|
|
@@ -54,6 +54,9 @@ function hydrateProcessEnv(key: string, value: string): void {
|
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
async function writeEnvKey(filePath: string, key: string, value: string): Promise<void> {
|
|
57
|
+
if (typeof value !== "string") {
|
|
58
|
+
throw new TypeError(`writeEnvKey expects a string value for key "${key}", got ${typeof value}`);
|
|
59
|
+
}
|
|
57
60
|
let content = "";
|
|
58
61
|
try {
|
|
59
62
|
content = await readFile(filePath, "utf8");
|
|
@@ -419,7 +422,7 @@ export async function collectSecretsFromManifest(
|
|
|
419
422
|
for (const { key, value } of collected) {
|
|
420
423
|
const entry = manifest.entries.find((e) => e.key === key);
|
|
421
424
|
if (entry) {
|
|
422
|
-
entry.status = value
|
|
425
|
+
entry.status = value != null ? "collected" : "skipped";
|
|
423
426
|
}
|
|
424
427
|
}
|
|
425
428
|
|
|
@@ -427,14 +430,14 @@ export async function collectSecretsFromManifest(
|
|
|
427
430
|
await writeFile(manifestPath, formatSecretsManifest(manifest), "utf8");
|
|
428
431
|
|
|
429
432
|
// (j) Apply collected values to destination
|
|
430
|
-
const provided = collected.filter((c) => c.value
|
|
433
|
+
const provided = collected.filter((c) => c.value != null) as Array<{ key: string; value: string }>;
|
|
431
434
|
const { applied } = await applySecrets(provided, destination, {
|
|
432
435
|
envFilePath: resolve(ctx.cwd, ".env"),
|
|
433
436
|
});
|
|
434
437
|
|
|
435
438
|
const skipped = [
|
|
436
439
|
...alreadySkipped,
|
|
437
|
-
...collected.filter((c) => c.value
|
|
440
|
+
...collected.filter((c) => c.value == null).map((c) => c.key),
|
|
438
441
|
];
|
|
439
442
|
|
|
440
443
|
return { applied, skipped, existingSkipped };
|
|
@@ -505,8 +508,8 @@ export default function secureEnv(pi: ExtensionAPI) {
|
|
|
505
508
|
collected.push({ key: item.key, value });
|
|
506
509
|
}
|
|
507
510
|
|
|
508
|
-
const provided = collected.filter((c) => c.value
|
|
509
|
-
const skipped = collected.filter((c) => c.value
|
|
511
|
+
const provided = collected.filter((c) => c.value != null) as Array<{ key: string; value: string }>;
|
|
512
|
+
const skipped = collected.filter((c) => c.value == null).map((c) => c.key);
|
|
510
513
|
|
|
511
514
|
// Apply to destination via shared helper
|
|
512
515
|
const { applied, errors } = await applySecrets(provided, destination, {
|
|
@@ -79,7 +79,7 @@ async function searchWithOAuth(
|
|
|
79
79
|
signal?: AbortSignal,
|
|
80
80
|
): Promise<SearchResult> {
|
|
81
81
|
const model = process.env.GEMINI_SEARCH_MODEL || "gemini-2.5-flash";
|
|
82
|
-
const url = `https://cloudcode-pa.googleapis.com/v1internal:streamGenerateContent`;
|
|
82
|
+
const url = `https://cloudcode-pa.googleapis.com/v1internal:streamGenerateContent?alt=sse`;
|
|
83
83
|
|
|
84
84
|
const GEMINI_CLI_HEADERS = {
|
|
85
85
|
ideType: "IDE_UNSPECIFIED",
|
|
@@ -104,6 +104,7 @@ async function searchWithOAuth(
|
|
|
104
104
|
contents: [{ parts: [{ text: query }] }],
|
|
105
105
|
tools: [{ googleSearch: {} }],
|
|
106
106
|
},
|
|
107
|
+
userAgent: "pi-coding-agent",
|
|
107
108
|
}),
|
|
108
109
|
signal,
|
|
109
110
|
});
|
|
@@ -41,5 +41,8 @@ export function isInfrastructureError(err: unknown): string | null {
|
|
|
41
41
|
for (const code of INFRA_ERROR_CODES) {
|
|
42
42
|
if (msg.includes(code)) return code;
|
|
43
43
|
}
|
|
44
|
+
// SQLite WAL corruption is not transient — retrying burns LLM budget
|
|
45
|
+
// for guaranteed failures (#2823).
|
|
46
|
+
if (msg.includes("database disk image is malformed")) return "SQLITE_CORRUPT";
|
|
44
47
|
return null;
|
|
45
48
|
}
|
|
@@ -26,7 +26,7 @@ import { runUnit } from "./run-unit.js";
|
|
|
26
26
|
import { debugLog } from "../debug-logger.js";
|
|
27
27
|
import { PROJECT_FILES } from "../detection.js";
|
|
28
28
|
import { MergeConflictError } from "../git-service.js";
|
|
29
|
-
import { join } from "node:path";
|
|
29
|
+
import { join, basename } from "node:path";
|
|
30
30
|
import { existsSync, cpSync } from "node:fs";
|
|
31
31
|
import { logWarning, logError } from "../workflow-logger.js";
|
|
32
32
|
import { gsdRoot } from "../paths.js";
|
|
@@ -230,6 +230,7 @@ export async function runPreDispatch(
|
|
|
230
230
|
`Milestone ${s.currentMilestoneId} complete!`,
|
|
231
231
|
"success",
|
|
232
232
|
"milestone",
|
|
233
|
+
basename(s.originalBasePath || s.basePath),
|
|
233
234
|
);
|
|
234
235
|
deps.logCmuxEvent(
|
|
235
236
|
prefs,
|
|
@@ -388,6 +389,7 @@ export async function runPreDispatch(
|
|
|
388
389
|
"All milestones complete!",
|
|
389
390
|
"success",
|
|
390
391
|
"milestone",
|
|
392
|
+
basename(s.originalBasePath || s.basePath),
|
|
391
393
|
);
|
|
392
394
|
deps.logCmuxEvent(
|
|
393
395
|
prefs,
|
|
@@ -411,7 +413,7 @@ export async function runPreDispatch(
|
|
|
411
413
|
const blockerMsg = `Blocked: ${state.blockers.join(", ")}`;
|
|
412
414
|
await deps.stopAuto(ctx, pi, blockerMsg);
|
|
413
415
|
ctx.ui.notify(`${blockerMsg}. Fix and run /gsd auto.`, "warning");
|
|
414
|
-
deps.sendDesktopNotification("GSD", blockerMsg, "error", "attention");
|
|
416
|
+
deps.sendDesktopNotification("GSD", blockerMsg, "error", "attention", basename(s.originalBasePath || s.basePath));
|
|
415
417
|
deps.logCmuxEvent(prefs, blockerMsg, "error");
|
|
416
418
|
} else {
|
|
417
419
|
const ids = incomplete.map((m: { id: string }) => m.id).join(", ");
|
|
@@ -492,6 +494,7 @@ export async function runPreDispatch(
|
|
|
492
494
|
`Milestone ${mid} complete!`,
|
|
493
495
|
"success",
|
|
494
496
|
"milestone",
|
|
497
|
+
basename(s.originalBasePath || s.basePath),
|
|
495
498
|
);
|
|
496
499
|
deps.logCmuxEvent(
|
|
497
500
|
prefs,
|
|
@@ -509,7 +512,7 @@ export async function runPreDispatch(
|
|
|
509
512
|
const blockerMsg = `Blocked: ${state.blockers.join(", ")}`;
|
|
510
513
|
await closeoutAndStop(ctx, pi, s, deps, blockerMsg);
|
|
511
514
|
ctx.ui.notify(`${blockerMsg}. Fix and run /gsd auto.`, "warning");
|
|
512
|
-
deps.sendDesktopNotification("GSD", blockerMsg, "error", "attention");
|
|
515
|
+
deps.sendDesktopNotification("GSD", blockerMsg, "error", "attention", basename(s.originalBasePath || s.basePath));
|
|
513
516
|
deps.logCmuxEvent(prefs, blockerMsg, "error");
|
|
514
517
|
debugLog("autoLoop", { phase: "exit", reason: "blocked" });
|
|
515
518
|
deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: ic.nextSeq(), eventType: "terminal", data: { reason: "blocked", blockers: state.blockers } });
|
|
@@ -755,7 +758,7 @@ export async function runGuards(
|
|
|
755
758
|
// 100% — special enforcement logic (halt/pause/warn)
|
|
756
759
|
const msg = `Budget ceiling ${deps.formatCost(budgetCeiling)} reached (spent ${deps.formatCost(totalCost)}).`;
|
|
757
760
|
if (budgetEnforcementAction === "halt") {
|
|
758
|
-
deps.sendDesktopNotification("GSD", msg, "error", "budget");
|
|
761
|
+
deps.sendDesktopNotification("GSD", msg, "error", "budget", basename(s.originalBasePath || s.basePath));
|
|
759
762
|
await deps.stopAuto(ctx, pi, "Budget ceiling reached");
|
|
760
763
|
debugLog("autoLoop", { phase: "exit", reason: "budget-halt" });
|
|
761
764
|
return { action: "break", reason: "budget-halt" };
|
|
@@ -765,14 +768,14 @@ export async function runGuards(
|
|
|
765
768
|
`${msg} Pausing auto-mode — /gsd auto to override and continue.`,
|
|
766
769
|
"warning",
|
|
767
770
|
);
|
|
768
|
-
deps.sendDesktopNotification("GSD", msg, "warning", "budget");
|
|
771
|
+
deps.sendDesktopNotification("GSD", msg, "warning", "budget", basename(s.originalBasePath || s.basePath));
|
|
769
772
|
deps.logCmuxEvent(prefs, msg, "warning");
|
|
770
773
|
await deps.pauseAuto(ctx, pi);
|
|
771
774
|
debugLog("autoLoop", { phase: "exit", reason: "budget-pause" });
|
|
772
775
|
return { action: "break", reason: "budget-pause" };
|
|
773
776
|
}
|
|
774
777
|
ctx.ui.notify(`${msg} Continuing (enforcement: warn).`, "warning");
|
|
775
|
-
deps.sendDesktopNotification("GSD", msg, "warning", "budget");
|
|
778
|
+
deps.sendDesktopNotification("GSD", msg, "warning", "budget", basename(s.originalBasePath || s.basePath));
|
|
776
779
|
deps.logCmuxEvent(prefs, msg, "warning");
|
|
777
780
|
} else if (threshold.pct < 100) {
|
|
778
781
|
// Sub-100% — simple notification
|
|
@@ -783,6 +786,7 @@ export async function runGuards(
|
|
|
783
786
|
msg,
|
|
784
787
|
threshold.notifyLevel,
|
|
785
788
|
"budget",
|
|
789
|
+
basename(s.originalBasePath || s.basePath),
|
|
786
790
|
);
|
|
787
791
|
deps.logCmuxEvent(prefs, msg, threshold.cmuxLevel);
|
|
788
792
|
}
|
|
@@ -812,6 +816,7 @@ export async function runGuards(
|
|
|
812
816
|
`Context ${contextUsage.percent}% — paused`,
|
|
813
817
|
"warning",
|
|
814
818
|
"attention",
|
|
819
|
+
basename(s.originalBasePath || s.basePath),
|
|
815
820
|
);
|
|
816
821
|
await deps.pauseAuto(ctx, pi);
|
|
817
822
|
debugLog("autoLoop", { phase: "exit", reason: "context-window" });
|
|
@@ -929,6 +934,23 @@ export async function runUnitPhase(
|
|
|
929
934
|
},
|
|
930
935
|
);
|
|
931
936
|
|
|
937
|
+
// Select and apply model (with tier escalation on retry — normal units only)
|
|
938
|
+
const modelResult = await deps.selectAndApplyModel(
|
|
939
|
+
ctx,
|
|
940
|
+
pi,
|
|
941
|
+
unitType,
|
|
942
|
+
unitId,
|
|
943
|
+
s.basePath,
|
|
944
|
+
prefs,
|
|
945
|
+
s.verbose,
|
|
946
|
+
s.autoModeStartModel,
|
|
947
|
+
sidecarItem ? undefined : { isRetry, previousTier },
|
|
948
|
+
);
|
|
949
|
+
s.currentUnitRouting =
|
|
950
|
+
modelResult.routing as AutoSession["currentUnitRouting"];
|
|
951
|
+
s.currentUnitModel =
|
|
952
|
+
modelResult.appliedModel as AutoSession["currentUnitModel"];
|
|
953
|
+
|
|
932
954
|
// Status bar + progress widget
|
|
933
955
|
ctx.ui.setStatus("gsd-auto", "auto");
|
|
934
956
|
if (mid)
|
|
@@ -1001,23 +1023,6 @@ export async function runUnitPhase(
|
|
|
1001
1023
|
logWarning("engine", "Prompt reorder failed", { error: msg });
|
|
1002
1024
|
}
|
|
1003
1025
|
|
|
1004
|
-
// Select and apply model (with tier escalation on retry — normal units only)
|
|
1005
|
-
const modelResult = await deps.selectAndApplyModel(
|
|
1006
|
-
ctx,
|
|
1007
|
-
pi,
|
|
1008
|
-
unitType,
|
|
1009
|
-
unitId,
|
|
1010
|
-
s.basePath,
|
|
1011
|
-
prefs,
|
|
1012
|
-
s.verbose,
|
|
1013
|
-
s.autoModeStartModel,
|
|
1014
|
-
sidecarItem ? undefined : { isRetry, previousTier },
|
|
1015
|
-
);
|
|
1016
|
-
s.currentUnitRouting =
|
|
1017
|
-
modelResult.routing as AutoSession["currentUnitRouting"];
|
|
1018
|
-
s.currentUnitModel =
|
|
1019
|
-
modelResult.appliedModel as AutoSession["currentUnitModel"];
|
|
1020
|
-
|
|
1021
1026
|
// Apply sidecar/pre-dispatch hook model override (takes priority over standard model selection)
|
|
1022
1027
|
const hookModelOverride = sidecarItem?.model ?? iterData.hookModelOverride;
|
|
1023
1028
|
if (hookModelOverride) {
|
|
@@ -1142,14 +1147,18 @@ export async function runUnitPhase(
|
|
|
1142
1147
|
// ── Immediate unit closeout (metrics, activity log, memory) ────────
|
|
1143
1148
|
// Run right after runUnit() returns so telemetry is never lost to a
|
|
1144
1149
|
// crash between iterations.
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1150
|
+
// Guard: stopAuto() may have nulled s.currentUnit via s.reset() while
|
|
1151
|
+
// this coroutine was suspended at `await runUnit(...)` (#2939).
|
|
1152
|
+
if (s.currentUnit) {
|
|
1153
|
+
await deps.closeoutUnit(
|
|
1154
|
+
ctx,
|
|
1155
|
+
s.basePath,
|
|
1156
|
+
unitType,
|
|
1157
|
+
unitId,
|
|
1158
|
+
s.currentUnit.startedAt,
|
|
1159
|
+
deps.buildSnapshotOpts(unitType, unitId),
|
|
1160
|
+
);
|
|
1161
|
+
}
|
|
1153
1162
|
|
|
1154
1163
|
// ── Zero tool-call guard (#1833) ──────────────────────────────────
|
|
1155
1164
|
// An execute-task agent that completes with 0 tool calls made no
|
|
@@ -1159,7 +1168,7 @@ export async function runUnitPhase(
|
|
|
1159
1168
|
const currentLedger = deps.getLedger() as { units: Array<{ type: string; id: string; startedAt: number; toolCalls: number }> } | null;
|
|
1160
1169
|
if (currentLedger?.units) {
|
|
1161
1170
|
const lastUnit = [...currentLedger.units].reverse().find(
|
|
1162
|
-
(u: { type: string; id: string; startedAt: number; toolCalls: number }) => u.type === unitType && u.id === unitId && u.startedAt === s.currentUnit
|
|
1171
|
+
(u: { type: string; id: string; startedAt: number; toolCalls: number }) => u.type === unitType && u.id === unitId && u.startedAt === s.currentUnit?.startedAt,
|
|
1163
1172
|
);
|
|
1164
1173
|
if (lastUnit && lastUnit.toolCalls === 0) {
|
|
1165
1174
|
debugLog("runUnitPhase", {
|
|
@@ -1174,7 +1183,7 @@ export async function runUnitPhase(
|
|
|
1174
1183
|
);
|
|
1175
1184
|
// Fall through to next iteration where dispatch will re-derive
|
|
1176
1185
|
// and re-dispatch this task.
|
|
1177
|
-
return { action: "next", data: { unitStartedAt: s.currentUnit
|
|
1186
|
+
return { action: "next", data: { unitStartedAt: s.currentUnit?.startedAt } };
|
|
1178
1187
|
}
|
|
1179
1188
|
}
|
|
1180
1189
|
}
|
|
@@ -1198,7 +1207,7 @@ export async function runUnitPhase(
|
|
|
1198
1207
|
|
|
1199
1208
|
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 } });
|
|
1200
1209
|
|
|
1201
|
-
return { action: "next", data: { unitStartedAt: s.currentUnit
|
|
1210
|
+
return { action: "next", data: { unitStartedAt: s.currentUnit?.startedAt } };
|
|
1202
1211
|
}
|
|
1203
1212
|
|
|
1204
1213
|
// ─── runFinalize ──────────────────────────────────────────────────────────────
|