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
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
[](https://www.npmjs.com/package/gsd-pi)
|
|
8
8
|
[](https://www.npmjs.com/package/gsd-pi)
|
|
9
9
|
[](https://github.com/gsd-build/GSD-2)
|
|
10
|
-
[](https://discord.
|
|
10
|
+
[](https://discord.com/invite/nKXTsAcmbT)
|
|
11
11
|
[](LICENSE)
|
|
12
12
|
[](https://dexscreener.com/solana/dwudwjvan7bzkw9zwlbyv6kspdlvhwzrqy6ebk8xzxkv)
|
|
13
13
|
|
package/dist/cli.js
CHANGED
|
@@ -5,7 +5,8 @@ import { agentDir, sessionsDir, authFilePath } from './app-paths.js';
|
|
|
5
5
|
import { initResources, buildResourceLoader, getNewerManagedResourceVersion } from './resource-loader.js';
|
|
6
6
|
import { ensureManagedTools } from './tool-bootstrap.js';
|
|
7
7
|
import { loadStoredEnvKeys } from './wizard.js';
|
|
8
|
-
import {
|
|
8
|
+
import { migratePiCredentials } from './pi-migration.js';
|
|
9
|
+
import { validateConfiguredModel } from './startup-model-validation.js';
|
|
9
10
|
import { shouldRunOnboarding, runOnboarding } from './onboarding.js';
|
|
10
11
|
import chalk from 'chalk';
|
|
11
12
|
import { checkForUpdates } from './update-check.js';
|
|
@@ -136,6 +137,7 @@ const hasSubcommand = cliFlags.messages.length > 0;
|
|
|
136
137
|
if (!process.stdin.isTTY && !isPrintMode && !hasSubcommand && !cliFlags.listModels && !cliFlags.web) {
|
|
137
138
|
process.stderr.write('[gsd] Error: Interactive mode requires a terminal (TTY).\n');
|
|
138
139
|
process.stderr.write('[gsd] Non-interactive alternatives:\n');
|
|
140
|
+
process.stderr.write('[gsd] gsd auto Auto-mode (pipeable, no TUI)\n');
|
|
139
141
|
process.stderr.write('[gsd] gsd --print "your message" Single-shot prompt\n');
|
|
140
142
|
process.stderr.write('[gsd] gsd --mode rpc JSON-RPC over stdin/stdout\n');
|
|
141
143
|
process.stderr.write('[gsd] gsd --mode mcp MCP server over stdin/stdout\n');
|
|
@@ -248,6 +250,22 @@ if (cliFlags.messages[0] === 'headless') {
|
|
|
248
250
|
await runHeadless(parseHeadlessArgs(process.argv));
|
|
249
251
|
process.exit(0);
|
|
250
252
|
}
|
|
253
|
+
// `gsd auto [args...]` — shorthand for `gsd headless auto [args...]` (#2732)
|
|
254
|
+
// Without this, `gsd auto` falls through to the interactive TUI which hangs
|
|
255
|
+
// when stdin/stdout are piped (non-TTY environments).
|
|
256
|
+
if (cliFlags.messages[0] === 'auto') {
|
|
257
|
+
await ensureRtkBootstrap();
|
|
258
|
+
const { runHeadless, parseHeadlessArgs } = await import('./headless.js');
|
|
259
|
+
// Rewrite argv so parseHeadlessArgs sees: [node, gsd, headless, auto, ...rest]
|
|
260
|
+
const rewrittenArgv = [
|
|
261
|
+
process.argv[0],
|
|
262
|
+
process.argv[1],
|
|
263
|
+
'headless',
|
|
264
|
+
...cliFlags.messages, // ['auto', ...extra args]
|
|
265
|
+
];
|
|
266
|
+
await runHeadless(parseHeadlessArgs(rewrittenArgv));
|
|
267
|
+
process.exit(0);
|
|
268
|
+
}
|
|
251
269
|
// Pi's tool bootstrap can mis-detect already-installed fd/rg on some systems
|
|
252
270
|
// because spawnSync(..., ["--version"]) returns EPERM despite a zero exit code.
|
|
253
271
|
// Provision local managed binaries first so Pi sees them without probing PATH.
|
|
@@ -328,38 +346,6 @@ if (cliFlags.listModels !== undefined) {
|
|
|
328
346
|
}
|
|
329
347
|
process.exit(0);
|
|
330
348
|
}
|
|
331
|
-
// Validate configured model on startup — catches stale settings from prior installs
|
|
332
|
-
// (e.g. grok-2 which no longer exists) and fresh installs with no settings.
|
|
333
|
-
// Only resets the default when the configured model no longer exists in the registry;
|
|
334
|
-
// never overwrites a valid user choice.
|
|
335
|
-
const configuredProvider = settingsManager.getDefaultProvider();
|
|
336
|
-
const configuredModel = settingsManager.getDefaultModel();
|
|
337
|
-
const allModels = modelRegistry.getAll();
|
|
338
|
-
const availableModels = modelRegistry.getAvailable();
|
|
339
|
-
const configuredExists = configuredProvider && configuredModel &&
|
|
340
|
-
allModels.some((m) => m.provider === configuredProvider && m.id === configuredModel);
|
|
341
|
-
const configuredAvailable = configuredProvider && configuredModel &&
|
|
342
|
-
availableModels.some((m) => m.provider === configuredProvider && m.id === configuredModel);
|
|
343
|
-
if (!configuredModel || !configuredExists) {
|
|
344
|
-
// Model not configured at all, or removed from registry — pick a fallback.
|
|
345
|
-
// Only fires when the model is genuinely unknown (not just temporarily unavailable).
|
|
346
|
-
const piDefault = getPiDefaultModelAndProvider();
|
|
347
|
-
const preferred = (piDefault
|
|
348
|
-
? availableModels.find((m) => m.provider === piDefault.provider && m.id === piDefault.model)
|
|
349
|
-
: undefined) ||
|
|
350
|
-
availableModels.find((m) => m.provider === 'openai' && m.id === 'gpt-5.4') ||
|
|
351
|
-
availableModels.find((m) => m.provider === 'openai') ||
|
|
352
|
-
availableModels.find((m) => m.provider === 'anthropic' && m.id === 'claude-opus-4-6') ||
|
|
353
|
-
availableModels.find((m) => m.provider === 'anthropic' && m.id.includes('opus')) ||
|
|
354
|
-
availableModels.find((m) => m.provider === 'anthropic') ||
|
|
355
|
-
availableModels[0];
|
|
356
|
-
if (preferred) {
|
|
357
|
-
settingsManager.setDefaultModelAndProvider(preferred.provider, preferred.id);
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
if (settingsManager.getDefaultThinkingLevel() !== 'off' && !configuredExists) {
|
|
361
|
-
settingsManager.setDefaultThinkingLevel('off');
|
|
362
|
-
}
|
|
363
349
|
// GSD always uses quiet startup — the gsd extension renders its own branded header
|
|
364
350
|
if (!settingsManager.getQuietStartup()) {
|
|
365
351
|
settingsManager.setQuietStartup(true);
|
|
@@ -405,6 +391,10 @@ if (isPrintMode) {
|
|
|
405
391
|
resourceLoader,
|
|
406
392
|
});
|
|
407
393
|
markStartup('createAgentSession');
|
|
394
|
+
// Validate configured model AFTER extensions have registered their models (#2626).
|
|
395
|
+
// Before this, extension-provided models (e.g. claude-code/*) were not yet in the
|
|
396
|
+
// registry, causing the user's valid choice to be silently overwritten.
|
|
397
|
+
validateConfiguredModel(modelRegistry, settingsManager);
|
|
408
398
|
if (extensionsResult.errors.length > 0) {
|
|
409
399
|
for (const err of extensionsResult.errors) {
|
|
410
400
|
// Downgrade conflicts with built-in tools to warnings (#1347)
|
|
@@ -488,6 +478,19 @@ if (!cliFlags.worktree && !isPrintMode) {
|
|
|
488
478
|
catch { /* non-fatal */ }
|
|
489
479
|
}
|
|
490
480
|
// ---------------------------------------------------------------------------
|
|
481
|
+
// Auto-redirect: `gsd auto` with piped stdout → headless mode (#2732)
|
|
482
|
+
// When stdout is not a TTY (e.g. `gsd auto | cat`, `gsd auto > file`),
|
|
483
|
+
// the TUI cannot render and the process hangs. Redirect to headless mode
|
|
484
|
+
// which handles non-interactive output gracefully.
|
|
485
|
+
// ---------------------------------------------------------------------------
|
|
486
|
+
if (cliFlags.messages[0] === 'auto' && !process.stdout.isTTY) {
|
|
487
|
+
await ensureRtkBootstrap();
|
|
488
|
+
const { runHeadless, parseHeadlessArgs } = await import('./headless.js');
|
|
489
|
+
process.stderr.write('[gsd] stdout is not a terminal — running auto-mode in headless mode.\n');
|
|
490
|
+
await runHeadless(parseHeadlessArgs(['node', 'gsd', 'headless', ...cliFlags.messages.slice(1)]));
|
|
491
|
+
process.exit(0);
|
|
492
|
+
}
|
|
493
|
+
// ---------------------------------------------------------------------------
|
|
491
494
|
// Interactive mode — normal TTY session
|
|
492
495
|
// ---------------------------------------------------------------------------
|
|
493
496
|
await ensureRtkBootstrap();
|
|
@@ -524,6 +527,10 @@ const { session, extensionsResult } = await createAgentSession({
|
|
|
524
527
|
resourceLoader,
|
|
525
528
|
});
|
|
526
529
|
markStartup('createAgentSession');
|
|
530
|
+
// Validate configured model AFTER extensions have registered their models (#2626).
|
|
531
|
+
// Before this, extension-provided models (e.g. claude-code/*) were not yet in the
|
|
532
|
+
// registry, causing the user's valid choice to be silently overwritten.
|
|
533
|
+
validateConfiguredModel(modelRegistry, settingsManager);
|
|
527
534
|
if (extensionsResult.errors.length > 0) {
|
|
528
535
|
for (const err of extensionsResult.errors) {
|
|
529
536
|
const isSuperseded = err.error.includes("supersedes");
|
|
@@ -572,14 +579,21 @@ if (enabledModelPatterns && enabledModelPatterns.length > 0) {
|
|
|
572
579
|
session.setScopedModels(scopedModels);
|
|
573
580
|
}
|
|
574
581
|
}
|
|
575
|
-
if (!process.stdin.isTTY) {
|
|
576
|
-
process.
|
|
582
|
+
if (!process.stdin.isTTY || !process.stdout.isTTY) {
|
|
583
|
+
const missing = !process.stdin.isTTY && !process.stdout.isTTY
|
|
584
|
+
? 'stdin and stdout are'
|
|
585
|
+
: !process.stdin.isTTY
|
|
586
|
+
? 'stdin is'
|
|
587
|
+
: 'stdout is';
|
|
588
|
+
process.stderr.write(`[gsd] Error: Interactive mode requires a terminal (TTY) but ${missing} not a TTY.\n`);
|
|
577
589
|
process.stderr.write('[gsd] Non-interactive alternatives:\n');
|
|
590
|
+
process.stderr.write('[gsd] gsd auto Auto-mode (pipeable, no TUI)\n');
|
|
578
591
|
process.stderr.write('[gsd] gsd --print "your message" Single-shot prompt\n');
|
|
579
592
|
process.stderr.write('[gsd] gsd --web [path] Browser-only web mode\n');
|
|
580
593
|
process.stderr.write('[gsd] gsd --mode rpc JSON-RPC over stdin/stdout\n');
|
|
581
594
|
process.stderr.write('[gsd] gsd --mode mcp MCP server over stdin/stdout\n');
|
|
582
595
|
process.stderr.write('[gsd] gsd --mode text "message" Text output mode\n');
|
|
596
|
+
process.stderr.write('[gsd] gsd headless Auto-mode without TUI\n');
|
|
583
597
|
process.exit(1);
|
|
584
598
|
}
|
|
585
599
|
// Welcome screen — shown on every fresh interactive session before TUI takes over.
|
package/dist/headless-ui.d.ts
CHANGED
|
@@ -40,8 +40,25 @@ export declare function handleExtensionUIRequest(event: ExtensionUIRequest, clie
|
|
|
40
40
|
export declare function formatProgress(event: Record<string, unknown>, ctx: ProgressContext): string | null;
|
|
41
41
|
/**
|
|
42
42
|
* Format a thinking preview line from accumulated LLM text deltas.
|
|
43
|
+
* Used as a fallback when streaming is not enabled — shows a truncated one-liner.
|
|
43
44
|
*/
|
|
44
45
|
export declare function formatThinkingLine(text: string): string;
|
|
46
|
+
/**
|
|
47
|
+
* Format a text_start marker — printed once when the assistant begins a text block.
|
|
48
|
+
*/
|
|
49
|
+
export declare function formatTextStart(): string;
|
|
50
|
+
/**
|
|
51
|
+
* Format a text_end marker — printed after the last text_delta.
|
|
52
|
+
*/
|
|
53
|
+
export declare function formatTextEnd(): string;
|
|
54
|
+
/**
|
|
55
|
+
* Format a thinking_start marker.
|
|
56
|
+
*/
|
|
57
|
+
export declare function formatThinkingStart(): string;
|
|
58
|
+
/**
|
|
59
|
+
* Format a thinking_end marker.
|
|
60
|
+
*/
|
|
61
|
+
export declare function formatThinkingEnd(): string;
|
|
45
62
|
/**
|
|
46
63
|
* Format a cost line (used for periodic cost updates in verbose mode).
|
|
47
64
|
*/
|
package/dist/headless-ui.js
CHANGED
|
@@ -40,24 +40,45 @@ const c = colorsDisabled ? noColor() : _c;
|
|
|
40
40
|
export function summarizeToolArgs(toolName, toolInput) {
|
|
41
41
|
const name = String(toolName ?? '');
|
|
42
42
|
const input = (toolInput && typeof toolInput === 'object') ? toolInput : {};
|
|
43
|
+
// Helper: extract file path from either 'path' or 'file_path' (tools use both)
|
|
44
|
+
const filePath = () => shortPath(input.path ?? input.file_path) || '';
|
|
43
45
|
switch (name) {
|
|
44
46
|
case 'Read':
|
|
45
47
|
case 'read':
|
|
46
|
-
return
|
|
48
|
+
return filePath();
|
|
47
49
|
case 'Write':
|
|
48
50
|
case 'write':
|
|
49
|
-
return
|
|
51
|
+
return filePath();
|
|
50
52
|
case 'Edit':
|
|
51
53
|
case 'edit':
|
|
52
|
-
return
|
|
54
|
+
return filePath();
|
|
55
|
+
case 'hashline_edit':
|
|
56
|
+
return filePath();
|
|
53
57
|
case 'Bash':
|
|
54
58
|
case 'bash': {
|
|
55
59
|
const cmd = String(input.command ?? '');
|
|
56
60
|
return cmd.length > 80 ? cmd.slice(0, 77) + '...' : cmd;
|
|
57
61
|
}
|
|
62
|
+
case 'async_bash': {
|
|
63
|
+
const cmd = String(input.command ?? '');
|
|
64
|
+
return cmd.length > 80 ? cmd.slice(0, 77) + '...' : cmd;
|
|
65
|
+
}
|
|
66
|
+
case 'await_job': {
|
|
67
|
+
const jobs = input.jobs;
|
|
68
|
+
if (Array.isArray(jobs) && jobs.length > 0)
|
|
69
|
+
return jobs.join(', ');
|
|
70
|
+
return '';
|
|
71
|
+
}
|
|
72
|
+
case 'cancel_job':
|
|
73
|
+
return String(input.job_id ?? '');
|
|
58
74
|
case 'Glob':
|
|
59
75
|
case 'glob':
|
|
60
76
|
return String(input.pattern ?? '');
|
|
77
|
+
case 'find': {
|
|
78
|
+
const pat = String(input.pattern ?? '');
|
|
79
|
+
const p = shortPath(input.path);
|
|
80
|
+
return p ? `${pat} in ${p}` : pat;
|
|
81
|
+
}
|
|
61
82
|
case 'Grep':
|
|
62
83
|
case 'grep':
|
|
63
84
|
case 'Search':
|
|
@@ -66,12 +87,32 @@ export function summarizeToolArgs(toolName, toolInput) {
|
|
|
66
87
|
const g = input.glob ? ` ${input.glob}` : '';
|
|
67
88
|
return `${pat}${g}`;
|
|
68
89
|
}
|
|
90
|
+
case 'ls':
|
|
91
|
+
return shortPath(input.path) || '';
|
|
92
|
+
case 'lsp': {
|
|
93
|
+
const action = String(input.action ?? '');
|
|
94
|
+
const file = shortPath(input.file);
|
|
95
|
+
const sym = input.symbol ? ` ${input.symbol}` : '';
|
|
96
|
+
return file ? `${action} ${file}${sym}` : action;
|
|
97
|
+
}
|
|
69
98
|
case 'Task':
|
|
70
99
|
case 'task': {
|
|
71
100
|
const desc = String(input.description ?? input.prompt ?? '');
|
|
72
101
|
return desc.length > 60 ? desc.slice(0, 57) + '...' : desc;
|
|
73
102
|
}
|
|
103
|
+
case 'subagent': {
|
|
104
|
+
const agent = String(input.agent ?? '');
|
|
105
|
+
const t = String(input.task ?? '');
|
|
106
|
+
const summary = t.length > 50 ? t.slice(0, 47) + '...' : t;
|
|
107
|
+
return agent ? `${agent}: ${summary}` : summary;
|
|
108
|
+
}
|
|
109
|
+
case 'browser_navigate':
|
|
110
|
+
return String(input.url ?? '');
|
|
74
111
|
default: {
|
|
112
|
+
// GSD tools: show milestone/slice/task IDs when present
|
|
113
|
+
if (name.startsWith('gsd_')) {
|
|
114
|
+
return summarizeGsdTool(name, input);
|
|
115
|
+
}
|
|
75
116
|
// Fallback: show first string-valued key up to 60 chars
|
|
76
117
|
for (const v of Object.values(input)) {
|
|
77
118
|
if (typeof v === 'string' && v.length > 0) {
|
|
@@ -82,6 +123,31 @@ export function summarizeToolArgs(toolName, toolInput) {
|
|
|
82
123
|
}
|
|
83
124
|
}
|
|
84
125
|
}
|
|
126
|
+
/** Summarize GSD extension tool args into a compact identifier string. */
|
|
127
|
+
function summarizeGsdTool(name, input) {
|
|
128
|
+
const parts = [];
|
|
129
|
+
if (input.milestoneId)
|
|
130
|
+
parts.push(String(input.milestoneId));
|
|
131
|
+
if (input.sliceId)
|
|
132
|
+
parts.push(String(input.sliceId));
|
|
133
|
+
if (input.taskId)
|
|
134
|
+
parts.push(String(input.taskId));
|
|
135
|
+
if (parts.length > 0) {
|
|
136
|
+
const id = parts.join('/');
|
|
137
|
+
// For completion tools, add the one-liner if present
|
|
138
|
+
if (name.includes('complete') && typeof input.oneLiner === 'string') {
|
|
139
|
+
const ol = input.oneLiner.length > 50 ? input.oneLiner.slice(0, 47) + '...' : input.oneLiner;
|
|
140
|
+
return `${id} ${ol}`;
|
|
141
|
+
}
|
|
142
|
+
return id;
|
|
143
|
+
}
|
|
144
|
+
// Fallback for GSD tools without IDs (e.g. gsd_decision_save)
|
|
145
|
+
if (input.decision) {
|
|
146
|
+
const d = String(input.decision);
|
|
147
|
+
return d.length > 60 ? d.slice(0, 57) + '...' : d;
|
|
148
|
+
}
|
|
149
|
+
return '';
|
|
150
|
+
}
|
|
85
151
|
function shortPath(p) {
|
|
86
152
|
if (typeof p !== 'string')
|
|
87
153
|
return '';
|
|
@@ -220,12 +286,40 @@ export function formatProgress(event, ctx) {
|
|
|
220
286
|
}
|
|
221
287
|
/**
|
|
222
288
|
* Format a thinking preview line from accumulated LLM text deltas.
|
|
289
|
+
* Used as a fallback when streaming is not enabled — shows a truncated one-liner.
|
|
223
290
|
*/
|
|
224
291
|
export function formatThinkingLine(text) {
|
|
225
292
|
const trimmed = text.replace(/\s+/g, ' ').trim();
|
|
226
293
|
const truncated = trimmed.length > 120 ? trimmed.slice(0, 117) + '...' : trimmed;
|
|
227
294
|
return `${c.dim}${c.italic}[thinking] ${truncated}${c.reset}`;
|
|
228
295
|
}
|
|
296
|
+
// ---------------------------------------------------------------------------
|
|
297
|
+
// Streaming Text / Thinking Formatters
|
|
298
|
+
// ---------------------------------------------------------------------------
|
|
299
|
+
/**
|
|
300
|
+
* Format a text_start marker — printed once when the assistant begins a text block.
|
|
301
|
+
*/
|
|
302
|
+
export function formatTextStart() {
|
|
303
|
+
return `${c.dim}[text]${c.reset}`;
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Format a text_end marker — printed after the last text_delta.
|
|
307
|
+
*/
|
|
308
|
+
export function formatTextEnd() {
|
|
309
|
+
return ''; // empty — newline handled by caller
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Format a thinking_start marker.
|
|
313
|
+
*/
|
|
314
|
+
export function formatThinkingStart() {
|
|
315
|
+
return `${c.dim}${c.italic}[thinking]${c.reset}`;
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Format a thinking_end marker.
|
|
319
|
+
*/
|
|
320
|
+
export function formatThinkingEnd() {
|
|
321
|
+
return ''; // empty — newline handled by caller
|
|
322
|
+
}
|
|
229
323
|
/**
|
|
230
324
|
* Format a cost line (used for periodic cost updates in verbose mode).
|
|
231
325
|
*/
|
package/dist/headless.js
CHANGED
|
@@ -19,7 +19,7 @@ import { getProjectSessionsDir } from './project-sessions.js';
|
|
|
19
19
|
import { loadAndValidateAnswerFile, AnswerInjector } from './headless-answers.js';
|
|
20
20
|
import { isTerminalNotification, isBlockedNotification, isMilestoneReadyNotification, isQuickCommand, FIRE_AND_FORGET_METHODS, IDLE_TIMEOUT_MS, NEW_MILESTONE_IDLE_TIMEOUT_MS, EXIT_SUCCESS, EXIT_ERROR, EXIT_BLOCKED, EXIT_CANCELLED, mapStatusToExitCode, } from './headless-events.js';
|
|
21
21
|
import { VALID_OUTPUT_FORMATS } from './headless-types.js';
|
|
22
|
-
import { handleExtensionUIRequest, formatProgress, formatThinkingLine, startSupervisedStdinReader, } from './headless-ui.js';
|
|
22
|
+
import { handleExtensionUIRequest, formatProgress, formatThinkingLine, formatTextStart, formatTextEnd, formatThinkingStart, formatThinkingEnd, startSupervisedStdinReader, } from './headless-ui.js';
|
|
23
23
|
import { loadContext, bootstrapGsdProject, } from './headless-context.js';
|
|
24
24
|
/**
|
|
25
25
|
* Resolve a session prefix to a single session.
|
|
@@ -291,6 +291,9 @@ async function runHeadlessOnce(options, restartCount) {
|
|
|
291
291
|
const toolStartTimes = new Map();
|
|
292
292
|
let lastCostData;
|
|
293
293
|
let thinkingBuffer = '';
|
|
294
|
+
// Streaming state: tracks whether we're inside a text or thinking block
|
|
295
|
+
let inTextBlock = false;
|
|
296
|
+
let inThinkingBlock = false;
|
|
294
297
|
// Emit HeadlessJsonResult to stdout for --output-format json batch mode
|
|
295
298
|
function emitBatchJsonResult() {
|
|
296
299
|
if (options.outputFormat !== 'json')
|
|
@@ -430,11 +433,58 @@ async function runHeadlessOnce(options, restartCount) {
|
|
|
430
433
|
};
|
|
431
434
|
}
|
|
432
435
|
}
|
|
433
|
-
//
|
|
436
|
+
// Stream assistant text and thinking deltas in verbose mode
|
|
434
437
|
if (eventType === 'message_update') {
|
|
435
438
|
const ame = eventObj.assistantMessageEvent;
|
|
436
|
-
if (ame
|
|
437
|
-
|
|
439
|
+
if (ame && options.verbose) {
|
|
440
|
+
const ameType = String(ame.type ?? '');
|
|
441
|
+
// --- Text streaming ---
|
|
442
|
+
if (ameType === 'text_start') {
|
|
443
|
+
inTextBlock = true;
|
|
444
|
+
process.stderr.write(formatTextStart());
|
|
445
|
+
}
|
|
446
|
+
else if (ameType === 'text_delta') {
|
|
447
|
+
const delta = String(ame.delta ?? ame.text ?? '');
|
|
448
|
+
if (delta) {
|
|
449
|
+
if (!inTextBlock) {
|
|
450
|
+
// Edge case: delta without start
|
|
451
|
+
inTextBlock = true;
|
|
452
|
+
process.stderr.write(formatTextStart());
|
|
453
|
+
}
|
|
454
|
+
process.stderr.write(delta);
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
else if (ameType === 'text_end') {
|
|
458
|
+
if (inTextBlock) {
|
|
459
|
+
process.stderr.write(formatTextEnd() + '\n');
|
|
460
|
+
inTextBlock = false;
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
// --- Thinking streaming ---
|
|
464
|
+
else if (ameType === 'thinking_start') {
|
|
465
|
+
inThinkingBlock = true;
|
|
466
|
+
process.stderr.write(formatThinkingStart());
|
|
467
|
+
}
|
|
468
|
+
else if (ameType === 'thinking_delta') {
|
|
469
|
+
const delta = String(ame.delta ?? ame.text ?? '');
|
|
470
|
+
if (delta) {
|
|
471
|
+
if (!inThinkingBlock) {
|
|
472
|
+
inThinkingBlock = true;
|
|
473
|
+
process.stderr.write(formatThinkingStart());
|
|
474
|
+
}
|
|
475
|
+
process.stderr.write(delta);
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
else if (ameType === 'thinking_end') {
|
|
479
|
+
if (inThinkingBlock) {
|
|
480
|
+
process.stderr.write(formatThinkingEnd() + '\n');
|
|
481
|
+
inThinkingBlock = false;
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
// Non-verbose: accumulate text_delta for truncated one-liner
|
|
486
|
+
else if (ame?.type === 'text_delta') {
|
|
487
|
+
thinkingBuffer += String(ame.delta ?? ame.text ?? '');
|
|
438
488
|
}
|
|
439
489
|
}
|
|
440
490
|
// Track tool execution start timestamps
|
|
@@ -443,8 +493,19 @@ async function runHeadlessOnce(options, restartCount) {
|
|
|
443
493
|
if (toolCallId)
|
|
444
494
|
toolStartTimes.set(toolCallId, Date.now());
|
|
445
495
|
}
|
|
446
|
-
//
|
|
447
|
-
if (options.verbose &&
|
|
496
|
+
// Close any open streaming blocks before tool calls or message end
|
|
497
|
+
if (options.verbose && (eventType === 'tool_execution_start' || eventType === 'message_end')) {
|
|
498
|
+
if (inTextBlock) {
|
|
499
|
+
process.stderr.write('\n');
|
|
500
|
+
inTextBlock = false;
|
|
501
|
+
}
|
|
502
|
+
if (inThinkingBlock) {
|
|
503
|
+
process.stderr.write('\n');
|
|
504
|
+
inThinkingBlock = false;
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
// Non-verbose: flush accumulated buffer as truncated one-liner
|
|
508
|
+
else if (!options.verbose && thinkingBuffer.trim() &&
|
|
448
509
|
(eventType === 'tool_execution_start' || eventType === 'message_end')) {
|
|
449
510
|
process.stderr.write(formatThinkingLine(thinkingBuffer) + '\n');
|
|
450
511
|
thinkingBuffer = '';
|
package/dist/help-text.js
CHANGED
|
@@ -160,6 +160,7 @@ export function printHelp(version) {
|
|
|
160
160
|
process.stdout.write(' update Update GSD to the latest version\n');
|
|
161
161
|
process.stdout.write(' sessions List and resume a past session\n');
|
|
162
162
|
process.stdout.write(' worktree <cmd> Manage worktrees (list, merge, clean, remove)\n');
|
|
163
|
+
process.stdout.write(' auto [args] Run auto-mode without TUI (pipeable)\n');
|
|
163
164
|
process.stdout.write(' headless [cmd] [args] Run /gsd commands without TUI (default: auto)\n');
|
|
164
165
|
process.stdout.write('\nRun gsd <subcommand> --help for subcommand-specific help.\n');
|
|
165
166
|
}
|
package/dist/onboarding.js
CHANGED
|
@@ -49,6 +49,7 @@ const LLM_PROVIDER_IDS = [
|
|
|
49
49
|
'xai',
|
|
50
50
|
'openrouter',
|
|
51
51
|
'mistral',
|
|
52
|
+
'ollama',
|
|
52
53
|
'ollama-cloud',
|
|
53
54
|
'custom-openai',
|
|
54
55
|
];
|
|
@@ -63,6 +64,7 @@ const OTHER_PROVIDERS = [
|
|
|
63
64
|
{ value: 'xai', label: 'xAI (Grok)' },
|
|
64
65
|
{ value: 'openrouter', label: 'OpenRouter' },
|
|
65
66
|
{ value: 'mistral', label: 'Mistral' },
|
|
67
|
+
{ value: 'ollama', label: 'Ollama (Local)' },
|
|
66
68
|
{ value: 'ollama-cloud', label: 'Ollama Cloud' },
|
|
67
69
|
{ value: 'custom-openai', label: 'Custom (OpenAI-compatible)' },
|
|
68
70
|
];
|
|
@@ -293,6 +295,9 @@ async function runLlmStep(p, pc, authStorage) {
|
|
|
293
295
|
if (provider === 'custom-openai') {
|
|
294
296
|
return await runCustomOpenAIFlow(p, pc, authStorage);
|
|
295
297
|
}
|
|
298
|
+
if (provider === 'ollama') {
|
|
299
|
+
return await runOllamaLocalFlow(p, pc, authStorage);
|
|
300
|
+
}
|
|
296
301
|
const label = provider === 'anthropic' ? 'Anthropic'
|
|
297
302
|
: provider === 'openai' ? 'OpenAI'
|
|
298
303
|
: OTHER_PROVIDERS.find(op => op.value === provider)?.label ?? String(provider);
|
|
@@ -382,6 +387,45 @@ async function runApiKeyFlow(p, pc, authStorage, providerId, providerLabel) {
|
|
|
382
387
|
p.log.success(`API key saved for ${pc.green(providerLabel)}`);
|
|
383
388
|
return true;
|
|
384
389
|
}
|
|
390
|
+
// ─── Ollama Local Flow ───────────────────────────────────────────────────────
|
|
391
|
+
async function runOllamaLocalFlow(p, pc, authStorage) {
|
|
392
|
+
const host = process.env.OLLAMA_HOST || 'http://localhost:11434';
|
|
393
|
+
const s = p.spinner();
|
|
394
|
+
s.start(`Checking Ollama at ${host}...`);
|
|
395
|
+
try {
|
|
396
|
+
const controller = new AbortController();
|
|
397
|
+
const timeout = setTimeout(() => controller.abort(), 3000);
|
|
398
|
+
const response = await fetch(host, { signal: controller.signal });
|
|
399
|
+
clearTimeout(timeout);
|
|
400
|
+
if (response.ok) {
|
|
401
|
+
s.stop(`Ollama is running at ${pc.green(host)}`);
|
|
402
|
+
// Store a placeholder so the provider is recognized as authenticated
|
|
403
|
+
authStorage.set('ollama', { type: 'api_key', key: 'ollama' });
|
|
404
|
+
p.log.success(`${pc.green('Ollama (Local)')} configured — no API key needed`);
|
|
405
|
+
p.log.info(pc.dim('Models are discovered automatically from your local Ollama instance.'));
|
|
406
|
+
return true;
|
|
407
|
+
}
|
|
408
|
+
else {
|
|
409
|
+
s.stop('Ollama check failed');
|
|
410
|
+
p.log.warn(`Ollama responded with status ${response.status} at ${host}`);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
catch {
|
|
414
|
+
s.stop('Ollama not detected');
|
|
415
|
+
p.log.warn(`Could not reach Ollama at ${host}`);
|
|
416
|
+
p.log.info(pc.dim('Install Ollama from https://ollama.com and run "ollama serve"'));
|
|
417
|
+
p.log.info(pc.dim('Set OLLAMA_HOST if using a non-default address.'));
|
|
418
|
+
}
|
|
419
|
+
// Even if not reachable now, save the config — the extension will detect it at runtime
|
|
420
|
+
const proceed = await p.confirm({
|
|
421
|
+
message: 'Save Ollama as your provider anyway? (it will auto-detect when running)',
|
|
422
|
+
});
|
|
423
|
+
if (p.isCancel(proceed) || !proceed)
|
|
424
|
+
return false;
|
|
425
|
+
authStorage.set('ollama', { type: 'api_key', key: 'ollama' });
|
|
426
|
+
p.log.success(`${pc.green('Ollama (Local)')} saved — models will appear when Ollama is running`);
|
|
427
|
+
return true;
|
|
428
|
+
}
|
|
385
429
|
// ─── Custom OpenAI-compatible Flow ────────────────────────────────────────────
|
|
386
430
|
async function runCustomOpenAIFlow(p, pc, authStorage) {
|
|
387
431
|
// Prompt for base URL
|
package/dist/resource-loader.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DefaultResourceLoader } from '@gsd/pi-coding-agent';
|
|
1
|
+
import { DefaultResourceLoader, sortExtensionPaths } from '@gsd/pi-coding-agent';
|
|
2
2
|
import { createHash } from 'node:crypto';
|
|
3
3
|
import { homedir } from 'node:os';
|
|
4
4
|
import { chmodSync, copyFileSync, cpSync, existsSync, lstatSync, mkdirSync, openSync, closeSync, readFileSync, readlinkSync, readdirSync, rmSync, statSync, symlinkSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
@@ -584,5 +584,20 @@ export function buildResourceLoader(agentDir) {
|
|
|
584
584
|
agentDir,
|
|
585
585
|
additionalExtensionPaths: piExtensionPaths,
|
|
586
586
|
bundledExtensionNames: bundledKeys,
|
|
587
|
+
extensionPathsTransform: (paths) => {
|
|
588
|
+
// 1. Filter community extensions through the GSD registry
|
|
589
|
+
const filteredPaths = paths.filter((entryPath) => {
|
|
590
|
+
const manifest = readManifestFromEntryPath(entryPath);
|
|
591
|
+
if (!manifest)
|
|
592
|
+
return true; // no manifest = always load
|
|
593
|
+
return isExtensionEnabled(registry, manifest.id);
|
|
594
|
+
});
|
|
595
|
+
// 2. Sort in topological dependency order
|
|
596
|
+
const { sortedPaths, warnings } = sortExtensionPaths(filteredPaths);
|
|
597
|
+
return {
|
|
598
|
+
paths: sortedPaths,
|
|
599
|
+
diagnostics: warnings.map((w) => w.message),
|
|
600
|
+
};
|
|
601
|
+
},
|
|
587
602
|
});
|
|
588
603
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: researcher
|
|
3
3
|
description: Web researcher that finds and synthesizes current information using Brave Search
|
|
4
|
-
tools:
|
|
4
|
+
tools: search-the-web, bash
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
You are a web researcher. You find current, accurate information using web search and synthesize it into a clear, well-structured report.
|
|
@@ -104,9 +104,22 @@ export default function AskUserQuestions(pi) {
|
|
|
104
104
|
if (selected === undefined) {
|
|
105
105
|
return errorResult("ask_user_questions was cancelled", params.questions);
|
|
106
106
|
}
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
107
|
+
// When the user picks "None of the above" on a single-select
|
|
108
|
+
// question, prompt for a free-text explanation so they are not
|
|
109
|
+
// trapped in a re-asking loop (bug #2715).
|
|
110
|
+
let freeTextNote = "";
|
|
111
|
+
const selectedStr = Array.isArray(selected) ? selected[0] : selected;
|
|
112
|
+
if (!q.allowMultiple && selectedStr === OTHER_OPTION_LABEL) {
|
|
113
|
+
const note = await ctx.ui.input(`${q.header}: Please explain in your own words`, "Type your answer here…");
|
|
114
|
+
if (note) {
|
|
115
|
+
freeTextNote = note;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
const answerList = Array.isArray(selected) ? selected : [selected];
|
|
119
|
+
if (freeTextNote) {
|
|
120
|
+
answerList.push(`user_note: ${freeTextNote}`);
|
|
121
|
+
}
|
|
122
|
+
answers[q.id] = { answers: answerList };
|
|
110
123
|
}
|
|
111
124
|
const roundResult = {
|
|
112
125
|
endInterview: false,
|
|
@@ -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"]
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* Translates the Claude Agent SDK's `BetaRawMessageStreamEvent` sequence
|
|
5
5
|
* into GSD's `AssistantMessageEvent` deltas for incremental TUI rendering.
|
|
6
6
|
*/
|
|
7
|
+
import { repairToolJson } from "@gsd/pi-ai";
|
|
7
8
|
// ---------------------------------------------------------------------------
|
|
8
9
|
// Content-block mapping helpers
|
|
9
10
|
// ---------------------------------------------------------------------------
|
|
@@ -210,12 +211,19 @@ export class PartialMessageBuilder {
|
|
|
210
211
|
block.arguments = JSON.parse(jsonStr);
|
|
211
212
|
}
|
|
212
213
|
catch {
|
|
213
|
-
//
|
|
214
|
-
//
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
214
|
+
// JSON.parse failed — attempt repair for YAML-style bullet
|
|
215
|
+
// lists that LLMs copy from template formatting (#2660).
|
|
216
|
+
try {
|
|
217
|
+
block.arguments = JSON.parse(repairToolJson(jsonStr));
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
// Repair also failed — stream was truncated or garbage.
|
|
221
|
+
// Preserve the raw string for diagnostics but signal the
|
|
222
|
+
// malformation explicitly so downstream consumers can
|
|
223
|
+
// distinguish this from a healthy tool completion (#2574).
|
|
224
|
+
block.arguments = { _raw: jsonStr };
|
|
225
|
+
return { type: "toolcall_end", contentIndex, toolCall: block, partial: this.partial, malformedArguments: true };
|
|
226
|
+
}
|
|
219
227
|
}
|
|
220
228
|
return { type: "toolcall_end", contentIndex, toolCall: block, partial: this.partial };
|
|
221
229
|
}
|