gsd-pi 2.58.0-dev.778d6ac → 2.58.0-dev.d63175c
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 +35 -49
- package/dist/headless-ui.d.ts +0 -17
- package/dist/headless-ui.js +3 -97
- package/dist/headless.js +6 -67
- package/dist/help-text.js +0 -1
- package/dist/onboarding.js +0 -44
- package/dist/resource-loader.js +1 -16
- package/dist/resources/agents/researcher.md +1 -1
- package/dist/resources/extensions/ask-user-questions.js +3 -16
- 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 +6 -14
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +36 -59
- package/dist/resources/extensions/context7/extension-manifest.json +1 -1
- package/dist/resources/extensions/get-secrets-from-user.js +5 -8
- package/dist/resources/extensions/google-search/extension-manifest.json +1 -1
- package/dist/resources/extensions/google-search/index.js +1 -2
- package/dist/resources/extensions/gsd/auto/phases.js +21 -25
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +2 -2
- package/dist/resources/extensions/gsd/auto-dashboard.js +20 -37
- package/dist/resources/extensions/gsd/auto-dispatch.js +2 -17
- package/dist/resources/extensions/gsd/auto-model-selection.js +3 -26
- package/dist/resources/extensions/gsd/auto-post-unit.js +4 -16
- package/dist/resources/extensions/gsd/auto-prompts.js +1 -1
- package/dist/resources/extensions/gsd/auto-recovery.js +5 -13
- package/dist/resources/extensions/gsd/auto-start.js +22 -35
- package/dist/resources/extensions/gsd/auto-worktree.js +12 -196
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +0 -32
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +8 -80
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +1 -32
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +18 -33
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +11 -44
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +0 -67
- package/dist/resources/extensions/gsd/captures.js +4 -56
- package/dist/resources/extensions/gsd/db-writer.js +8 -116
- package/dist/resources/extensions/gsd/doctor-git-checks.js +0 -28
- package/dist/resources/extensions/gsd/doctor-providers.js +1 -2
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +4 -5
- package/dist/resources/extensions/gsd/doctor.js +1 -3
- package/dist/resources/extensions/gsd/error-classifier.js +10 -13
- package/dist/resources/extensions/gsd/extension-manifest.json +1 -16
- package/dist/resources/extensions/gsd/forensics.js +20 -123
- package/dist/resources/extensions/gsd/git-service.js +1 -23
- package/dist/resources/extensions/gsd/gitignore.js +0 -33
- package/dist/resources/extensions/gsd/gsd-db.js +9 -36
- package/dist/resources/extensions/gsd/guided-flow.js +44 -106
- package/dist/resources/extensions/gsd/health-widget-core.js +0 -31
- package/dist/resources/extensions/gsd/health-widget.js +0 -17
- package/dist/resources/extensions/gsd/index.js +1 -1
- package/dist/resources/extensions/gsd/memory-extractor.js +0 -7
- package/dist/resources/extensions/gsd/migrate-external.js +1 -8
- package/dist/resources/extensions/gsd/model-cost-table.js +0 -18
- package/dist/resources/extensions/gsd/model-router.js +1 -35
- package/dist/resources/extensions/gsd/native-git-bridge.js +0 -17
- package/dist/resources/extensions/gsd/notifications.js +1 -16
- package/dist/resources/extensions/gsd/parallel-eligibility.js +2 -13
- package/dist/resources/extensions/gsd/parallel-merge.js +5 -78
- package/dist/resources/extensions/gsd/parsers-legacy.js +3 -20
- package/dist/resources/extensions/gsd/paths.js +0 -43
- package/dist/resources/extensions/gsd/preferences-models.js +1 -14
- package/dist/resources/extensions/gsd/preferences-types.js +1 -2
- package/dist/resources/extensions/gsd/preferences.js +16 -13
- package/dist/resources/extensions/gsd/prompt-loader.js +1 -4
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +2 -4
- 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 +1 -3
- 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 +0 -2
- package/dist/resources/extensions/gsd/prompts/rethink.md +1 -1
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +0 -1
- package/dist/resources/extensions/gsd/repo-identity.js +11 -205
- package/dist/resources/extensions/gsd/rethink.js +0 -5
- package/dist/resources/extensions/gsd/roadmap-slices.js +4 -5
- package/dist/resources/extensions/gsd/state.js +27 -85
- package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +1 -20
- package/dist/resources/extensions/gsd/tools/complete-task.js +71 -34
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +2 -12
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +1 -29
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +3 -14
- package/dist/resources/extensions/gsd/triage-resolution.js +7 -22
- package/dist/resources/extensions/gsd/undo.js +2 -2
- package/dist/resources/extensions/gsd/unit-ownership.js +33 -164
- package/dist/resources/extensions/gsd/verdict-parser.js +8 -20
- package/dist/resources/extensions/gsd/workflow-manifest.js +5 -24
- package/dist/resources/extensions/gsd/workflow-projections.js +63 -95
- package/dist/resources/extensions/gsd/workflow-reconcile.js +5 -35
- package/dist/resources/extensions/gsd/workspace-index.js +0 -24
- package/dist/resources/extensions/gsd/worktree-manager.js +1 -105
- package/dist/resources/extensions/gsd/worktree-resolver.js +3 -20
- package/dist/resources/extensions/mcp-client/index.js +7 -11
- package/dist/resources/extensions/search-the-web/extension-manifest.json +1 -1
- package/dist/resources/extensions/shared/interview-ui.js +1 -11
- package/dist/resources/skills/create-gsd-extension/SKILL.md +3 -5
- package/dist/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +4 -5
- 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 +3 -5
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +17 -17
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
- package/dist/web/standalone/.next/required-server-files.json +1 -1
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +2 -2
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +17 -17
- package/dist/web/standalone/.next/server/chunks/2229.js +2 -2
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +2 -2
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/6502.8b732f67a11b11b4.js +9 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-a1c1e452c6b32d04.js → webpack-61d3afac6d0f0ce7.js} +1 -1
- package/dist/web/standalone/.next/static/css/a58ef8a151aa0493.css +1 -0
- package/dist/web/standalone/server.js +1 -1
- package/dist/web-mode.js +1 -2
- package/package.json +2 -2
- package/packages/native/dist/ast/index.js +5 -9
- package/packages/native/dist/ast/types.js +1 -2
- package/packages/native/dist/clipboard/index.js +7 -12
- package/packages/native/dist/clipboard/types.js +1 -2
- package/packages/native/dist/diff/index.js +7 -12
- package/packages/native/dist/diff/types.js +1 -2
- package/packages/native/dist/fd/index.js +3 -6
- package/packages/native/dist/fd/types.js +1 -2
- package/packages/native/dist/glob/index.js +5 -9
- package/packages/native/dist/glob/types.js +1 -2
- package/packages/native/dist/grep/index.js +5 -9
- package/packages/native/dist/grep/types.js +1 -2
- package/packages/native/dist/gsd-parser/index.js +11 -18
- package/packages/native/dist/gsd-parser/types.js +1 -2
- package/packages/native/dist/highlight/index.js +7 -12
- package/packages/native/dist/highlight/types.js +1 -2
- package/packages/native/dist/html/index.js +3 -6
- package/packages/native/dist/html/types.js +1 -2
- package/packages/native/dist/image/index.js +5 -10
- package/packages/native/dist/image/types.js +4 -7
- package/packages/native/dist/index.js +17 -70
- package/packages/native/dist/json-parse/index.js +8 -13
- package/packages/native/dist/native.js +10 -47
- package/packages/native/dist/ps/index.js +9 -15
- package/packages/native/dist/ps/types.js +1 -2
- package/packages/native/dist/stream-process/index.js +7 -12
- package/packages/native/dist/text/index.js +14 -24
- package/packages/native/dist/text/types.js +2 -5
- package/packages/native/dist/truncate/index.js +7 -12
- package/packages/native/dist/ttsr/index.js +7 -12
- package/packages/native/dist/ttsr/types.js +1 -2
- package/packages/native/dist/xxhash/index.js +5 -9
- package/packages/native/package.json +19 -19
- package/packages/native/src/native.ts +8 -9
- package/packages/pi-agent-core/dist/agent-loop.js +2 -3
- 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.ts +2 -3
- package/packages/pi-agent-core/src/proxy.ts +1 -1
- package/packages/pi-ai/dist/env-api-keys.js +0 -1
- package/packages/pi-ai/dist/env-api-keys.js.map +1 -1
- package/packages/pi-ai/dist/index.d.ts +0 -1
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +0 -1
- 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 +2 -19
- package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
- 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 +0 -3
- package/packages/pi-ai/dist/utils/json-parse.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/json-parse.js +1 -24
- package/packages/pi-ai/dist/utils/json-parse.js.map +1 -1
- package/packages/pi-ai/src/env-api-keys.ts +0 -1
- package/packages/pi-ai/src/index.ts +0 -1
- package/packages/pi-ai/src/providers/anthropic-shared.ts +2 -17
- package/packages/pi-ai/src/types.ts +2 -3
- package/packages/pi-ai/src/utils/json-parse.ts +1 -28
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts +0 -4
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +0 -31
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +1 -17
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js +2 -62
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/exec.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/exec.js +1 -3
- package/packages/pi-coding-agent/dist/core/exec.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +0 -4
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.js +0 -2
- package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +0 -5
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +0 -5
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- 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 +0 -3
- 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 +0 -3
- 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 +2 -31
- package/packages/pi-coding-agent/dist/core/messages.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.js +0 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.d.ts +0 -10
- package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.js +1 -12
- package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.d.ts +0 -6
- package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.js +1 -48
- package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
- 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 +3 -10
- 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 +4 -13
- package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
- 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 +0 -4
- 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 +0 -1
- 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 +0 -5
- package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.js.map +1 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +1 -38
- package/packages/pi-coding-agent/src/core/compaction/compaction.ts +1 -94
- package/packages/pi-coding-agent/src/core/exec.ts +1 -3
- package/packages/pi-coding-agent/src/core/extensions/index.ts +0 -4
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +0 -5
- package/packages/pi-coding-agent/src/core/index.ts +0 -6
- package/packages/pi-coding-agent/src/core/lsp/index.ts +0 -3
- package/packages/pi-coding-agent/src/core/lsp/lspmux.ts +0 -3
- package/packages/pi-coding-agent/src/core/messages.ts +2 -29
- package/packages/pi-coding-agent/src/core/model-resolver.ts +0 -1
- package/packages/pi-coding-agent/src/core/resource-loader.ts +1 -20
- package/packages/pi-coding-agent/src/core/retry-handler.ts +1 -52
- package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +3 -11
- package/packages/pi-coding-agent/src/core/tools/read.ts +4 -14
- package/packages/pi-coding-agent/src/index.ts +0 -6
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +0 -7
- package/packages/pi-coding-agent/src/modes/rpc/remote-terminal.ts +0 -6
- package/packages/pi-tui/dist/terminal.d.ts +0 -2
- package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal.js +0 -9
- 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 +0 -9
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/src/terminal.ts +0 -14
- package/packages/pi-tui/src/tui.ts +0 -8
- package/scripts/ensure-workspace-builds.cjs +14 -45
- package/src/resources/agents/researcher.md +1 -1
- package/src/resources/extensions/ask-user-questions.ts +3 -21
- 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 +6 -13
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +35 -63
- package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +0 -28
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +1 -108
- package/src/resources/extensions/context7/extension-manifest.json +1 -1
- package/src/resources/extensions/get-secrets-from-user.ts +5 -8
- package/src/resources/extensions/google-search/extension-manifest.json +1 -1
- package/src/resources/extensions/google-search/index.ts +1 -2
- package/src/resources/extensions/gsd/auto/loop-deps.ts +0 -1
- package/src/resources/extensions/gsd/auto/phases.ts +34 -43
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +2 -2
- package/src/resources/extensions/gsd/auto-dashboard.ts +19 -37
- package/src/resources/extensions/gsd/auto-dispatch.ts +2 -18
- package/src/resources/extensions/gsd/auto-model-selection.ts +5 -26
- package/src/resources/extensions/gsd/auto-post-unit.ts +4 -18
- package/src/resources/extensions/gsd/auto-prompts.ts +1 -1
- package/src/resources/extensions/gsd/auto-recovery.ts +5 -12
- package/src/resources/extensions/gsd/auto-start.ts +26 -35
- package/src/resources/extensions/gsd/auto-worktree.ts +9 -190
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +0 -31
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +8 -85
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +1 -38
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +19 -31
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +11 -50
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +0 -75
- package/src/resources/extensions/gsd/captures.ts +3 -63
- package/src/resources/extensions/gsd/db-writer.ts +7 -140
- package/src/resources/extensions/gsd/doctor-git-checks.ts +0 -26
- package/src/resources/extensions/gsd/doctor-providers.ts +1 -2
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +4 -5
- package/src/resources/extensions/gsd/doctor.ts +1 -3
- package/src/resources/extensions/gsd/error-classifier.ts +11 -14
- package/src/resources/extensions/gsd/extension-manifest.json +1 -16
- package/src/resources/extensions/gsd/forensics.ts +20 -144
- package/src/resources/extensions/gsd/git-service.ts +3 -26
- package/src/resources/extensions/gsd/gitignore.ts +0 -33
- package/src/resources/extensions/gsd/gsd-db.ts +7 -43
- package/src/resources/extensions/gsd/guided-flow.ts +45 -114
- package/src/resources/extensions/gsd/health-widget-core.ts +0 -34
- package/src/resources/extensions/gsd/health-widget.ts +0 -17
- package/src/resources/extensions/gsd/index.ts +0 -1
- package/src/resources/extensions/gsd/memory-extractor.ts +0 -8
- package/src/resources/extensions/gsd/migrate-external.ts +1 -9
- package/src/resources/extensions/gsd/model-cost-table.ts +0 -19
- package/src/resources/extensions/gsd/model-router.ts +1 -35
- package/src/resources/extensions/gsd/native-git-bridge.ts +0 -17
- package/src/resources/extensions/gsd/notifications.ts +0 -16
- package/src/resources/extensions/gsd/parallel-eligibility.ts +2 -15
- package/src/resources/extensions/gsd/parallel-merge.ts +4 -87
- package/src/resources/extensions/gsd/parsers-legacy.ts +3 -22
- package/src/resources/extensions/gsd/paths.ts +0 -42
- package/src/resources/extensions/gsd/preferences-models.ts +1 -14
- package/src/resources/extensions/gsd/preferences-types.ts +1 -2
- package/src/resources/extensions/gsd/preferences.ts +15 -13
- package/src/resources/extensions/gsd/prompt-loader.ts +1 -4
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/complete-slice.md +2 -4
- 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 +1 -3
- 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 +0 -2
- package/src/resources/extensions/gsd/prompts/rethink.md +1 -1
- package/src/resources/extensions/gsd/prompts/triage-captures.md +0 -1
- package/src/resources/extensions/gsd/repo-identity.ts +11 -186
- package/src/resources/extensions/gsd/rethink.ts +0 -6
- package/src/resources/extensions/gsd/roadmap-slices.ts +4 -5
- package/src/resources/extensions/gsd/state.ts +32 -84
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +0 -29
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +1 -71
- package/src/resources/extensions/gsd/tests/captures.test.ts +0 -103
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +0 -27
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +0 -21
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +12 -7
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +5 -78
- package/src/resources/extensions/gsd/tests/derive-state.test.ts +0 -29
- package/src/resources/extensions/gsd/tests/discuss-queued-milestones.test.ts +0 -40
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +1 -20
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +0 -117
- package/src/resources/extensions/gsd/tests/empty-db-reconciliation.test.ts +79 -0
- package/src/resources/extensions/gsd/tests/forensics-dedup.test.ts +0 -31
- package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +12 -125
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +0 -67
- package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +1 -111
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +0 -101
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +0 -59
- package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +0 -110
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +2 -85
- package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +0 -34
- package/src/resources/extensions/gsd/tests/model-router.test.ts +3 -68
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +0 -28
- package/src/resources/extensions/gsd/tests/notifications.test.ts +0 -45
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +1 -33
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +0 -29
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +0 -38
- package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +0 -117
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +0 -97
- package/src/resources/extensions/gsd/tests/secure-env-collect.test.ts +0 -134
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +1 -2
- package/src/resources/extensions/gsd/tests/triage-resolution.test.ts +0 -8
- package/src/resources/extensions/gsd/tests/unit-ownership.test.ts +17 -100
- package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +1 -4
- package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +0 -48
- package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +0 -92
- package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +2 -4
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +1 -48
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +5 -29
- package/src/resources/extensions/gsd/tools/complete-task.ts +74 -36
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +1 -13
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +0 -36
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +2 -20
- package/src/resources/extensions/gsd/triage-resolution.ts +6 -23
- package/src/resources/extensions/gsd/types.ts +2 -4
- package/src/resources/extensions/gsd/undo.ts +2 -2
- package/src/resources/extensions/gsd/unit-ownership.ts +35 -206
- package/src/resources/extensions/gsd/verdict-parser.ts +6 -21
- package/src/resources/extensions/gsd/workflow-logger.ts +1 -3
- package/src/resources/extensions/gsd/workflow-manifest.ts +5 -22
- package/src/resources/extensions/gsd/workflow-projections.ts +64 -97
- package/src/resources/extensions/gsd/workflow-reconcile.ts +10 -39
- package/src/resources/extensions/gsd/workspace-index.ts +0 -30
- package/src/resources/extensions/gsd/worktree-manager.ts +1 -120
- package/src/resources/extensions/gsd/worktree-resolver.ts +3 -22
- package/src/resources/extensions/mcp-client/index.ts +7 -13
- package/src/resources/extensions/search-the-web/extension-manifest.json +1 -1
- package/src/resources/extensions/shared/interview-ui.ts +1 -12
- package/src/resources/skills/create-gsd-extension/SKILL.md +3 -5
- package/src/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +4 -5
- 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 +3 -5
- package/dist/resources/extensions/gsd/milestone-validation-gates.js +0 -45
- package/dist/resources/extensions/ollama/index.js +0 -112
- package/dist/resources/extensions/ollama/model-capabilities.js +0 -115
- package/dist/resources/extensions/ollama/ollama-client.js +0 -168
- package/dist/resources/extensions/ollama/ollama-commands.js +0 -194
- package/dist/resources/extensions/ollama/ollama-discovery.js +0 -69
- package/dist/resources/extensions/ollama/ollama-tool.js +0 -184
- package/dist/resources/extensions/ollama/types.js +0 -2
- package/dist/startup-model-validation.d.ts +0 -39
- package/dist/startup-model-validation.js +0 -50
- package/dist/web/standalone/.next/static/chunks/6502.7593d7797a4b3999.js +0 -9
- package/dist/web/standalone/.next/static/css/f6e8833d46e738d8.css +0 -1
- package/packages/native/src/__tests__/module-compat.test.mjs +0 -91
- package/packages/pi-agent-core/src/agent-loop.test.ts +0 -45
- package/packages/pi-ai/dist/providers/anthropic-shared.test.d.ts +0 -2
- package/packages/pi-ai/dist/providers/anthropic-shared.test.d.ts.map +0 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.test.js +0 -25
- package/packages/pi-ai/dist/providers/anthropic-shared.test.js.map +0 -1
- package/packages/pi-ai/dist/utils/repair-tool-json.d.ts +0 -37
- package/packages/pi-ai/dist/utils/repair-tool-json.d.ts.map +0 -1
- package/packages/pi-ai/dist/utils/repair-tool-json.js +0 -75
- package/packages/pi-ai/dist/utils/repair-tool-json.js.map +0 -1
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.d.ts +0 -2
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.d.ts.map +0 -1
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js +0 -73
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js.map +0 -1
- package/packages/pi-ai/src/providers/anthropic-shared.test.ts +0 -29
- package/packages/pi-ai/src/utils/repair-tool-json.ts +0 -88
- package/packages/pi-ai/src/utils/tests/repair-tool-json.test.ts +0 -102
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.d.ts +0 -6
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +0 -176
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.d.ts +0 -28
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js +0 -37
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.d.ts +0 -2
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js +0 -63
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.d.ts +0 -19
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js +0 -115
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.d.ts +0 -2
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js +0 -109
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.d.ts +0 -44
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.js +0 -97
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.d.ts +0 -2
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.js +0 -181
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/messages.test.d.ts +0 -9
- package/packages/pi-coding-agent/dist/core/messages.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/messages.test.js +0 -86
- package/packages/pi-coding-agent/dist/core/messages.test.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.test.d.ts +0 -9
- package/packages/pi-coding-agent/dist/core/retry-handler.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.test.js +0 -193
- package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.d.ts +0 -16
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +0 -80
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +0 -1
- package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +0 -236
- package/packages/pi-coding-agent/src/core/extensions/extension-manifest.test.ts +0 -77
- package/packages/pi-coding-agent/src/core/extensions/extension-manifest.ts +0 -62
- package/packages/pi-coding-agent/src/core/extensions/extension-sort.test.ts +0 -134
- package/packages/pi-coding-agent/src/core/extensions/extension-sort.ts +0 -137
- package/packages/pi-coding-agent/src/core/image-overflow-recovery.test.ts +0 -228
- package/packages/pi-coding-agent/src/core/image-overflow-recovery.ts +0 -118
- package/packages/pi-coding-agent/src/core/messages.test.ts +0 -114
- package/packages/pi-coding-agent/src/core/retry-handler.test.ts +0 -255
- package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +0 -92
- package/src/resources/extensions/gsd/milestone-validation-gates.ts +0 -56
- package/src/resources/extensions/gsd/tests/auto-mode-interactive-guard.test.ts +0 -71
- package/src/resources/extensions/gsd/tests/cli-provider-rate-limit.test.ts +0 -47
- package/src/resources/extensions/gsd/tests/completion-hierarchy-guards.test.ts +0 -192
- package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +0 -131
- package/src/resources/extensions/gsd/tests/discord-invite-links.test.ts +0 -47
- package/src/resources/extensions/gsd/tests/discuss-empty-db-fallback.test.ts +0 -127
- package/src/resources/extensions/gsd/tests/dynamic-routing-default.test.ts +0 -20
- package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +0 -74
- package/src/resources/extensions/gsd/tests/event-replay-idempotency.test.ts +0 -140
- package/src/resources/extensions/gsd/tests/forensics-context-persist.test.ts +0 -129
- package/src/resources/extensions/gsd/tests/forensics-db-completion.test.ts +0 -96
- package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +0 -164
- package/src/resources/extensions/gsd/tests/guided-flow-dynamic-routing.test.ts +0 -135
- package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +0 -97
- package/src/resources/extensions/gsd/tests/hook-key-parsing.test.ts +0 -107
- package/src/resources/extensions/gsd/tests/integration/doctor-false-positives.test.ts +0 -243
- package/src/resources/extensions/gsd/tests/integration/gitignore-staging-2570.test.ts +0 -150
- package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +0 -959
- package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +0 -105
- package/src/resources/extensions/gsd/tests/milestone-status-authoritative.test.ts +0 -116
- package/src/resources/extensions/gsd/tests/parallel-commit-scope.test.ts +0 -159
- package/src/resources/extensions/gsd/tests/parallel-eligibility-ghost.test.ts +0 -150
- package/src/resources/extensions/gsd/tests/plan-milestone-title.test.ts +0 -70
- package/src/resources/extensions/gsd/tests/project-relocation-recovery.test.ts +0 -297
- package/src/resources/extensions/gsd/tests/prompt-loader-replacement.test.ts +0 -178
- package/src/resources/extensions/gsd/tests/prompt-tool-names.test.ts +0 -69
- package/src/resources/extensions/gsd/tests/queue-execution-guard.test.ts +0 -157
- package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +0 -90
- package/src/resources/extensions/gsd/tests/reconciliation-edge-cases.test.ts +0 -162
- package/src/resources/extensions/gsd/tests/slice-disk-reconcile.test.ts +0 -233
- package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +0 -305
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +0 -405
- package/src/resources/extensions/gsd/tests/state-derivation-parity.test.ts +0 -257
- package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +0 -1628
- package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +0 -106
- package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +0 -174
- package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +0 -221
- package/src/resources/extensions/gsd/tests/uat-stuck-loop-orphaned-worktree.test.ts +0 -289
- package/src/resources/extensions/gsd/tests/vacuum-recovery.test.ts +0 -154
- package/src/resources/extensions/gsd/tests/verdict-parser.test.ts +0 -156
- package/src/resources/extensions/gsd/tests/verification-operational-gate.test.ts +0 -82
- package/src/resources/extensions/gsd/tests/worktree-db-respawn-truncation.test.ts +0 -140
- package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +0 -101
- package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +0 -95
- package/src/resources/extensions/mcp-client/tests/server-name-spaces.test.ts +0 -55
- package/src/resources/extensions/ollama/index.ts +0 -130
- package/src/resources/extensions/ollama/model-capabilities.ts +0 -145
- package/src/resources/extensions/ollama/ollama-client.ts +0 -196
- package/src/resources/extensions/ollama/ollama-commands.ts +0 -248
- package/src/resources/extensions/ollama/ollama-discovery.ts +0 -106
- package/src/resources/extensions/ollama/ollama-tool.ts +0 -218
- package/src/resources/extensions/ollama/tests/model-capabilities.test.ts +0 -162
- package/src/resources/extensions/ollama/tests/ollama-client.test.ts +0 -38
- package/src/resources/extensions/ollama/tests/ollama-discovery.test.ts +0 -28
- package/src/resources/extensions/ollama/types.ts +0 -130
- package/src/resources/extensions/shared/tests/ask-user-freetext.test.ts +0 -156
- /package/dist/web/standalone/.next/static/{R0D4xaIPl5kg93edN7Oo0 → 5DLsjFHdSB6_a1EDQVjr7}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{R0D4xaIPl5kg93edN7Oo0 → 5DLsjFHdSB6_a1EDQVjr7}/_ssgManifest.js +0 -0
|
@@ -1,140 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* worktree-db-respawn-truncation.test.ts — Regression test for #2815.
|
|
3
|
-
*
|
|
4
|
-
* Verifies that syncProjectRootToWorktree does NOT delete a non-empty
|
|
5
|
-
* worktree gsd.db. On worker respawn, gsd-migrate populates the DB
|
|
6
|
-
* (~1.7MB) before the auto-loop calls syncProjectRootToWorktree. The
|
|
7
|
-
* sync step must preserve the freshly-migrated DB to avoid truncating
|
|
8
|
-
* it to 0 bytes and causing "no such table: slices" failures.
|
|
9
|
-
*
|
|
10
|
-
* Covers:
|
|
11
|
-
* - Non-empty worktree gsd.db preserved after sync (#2815)
|
|
12
|
-
* - Empty (0-byte) worktree gsd.db still deleted (#853 preserved)
|
|
13
|
-
* - WAL/SHM sidecar files cleaned up when empty DB is deleted
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
import { mkdtempSync, mkdirSync, writeFileSync, rmSync, existsSync, readFileSync, statSync } from 'node:fs';
|
|
17
|
-
import { join } from 'node:path';
|
|
18
|
-
import { tmpdir } from 'node:os';
|
|
19
|
-
|
|
20
|
-
import { syncProjectRootToWorktree } from '../auto-worktree.ts';
|
|
21
|
-
import { describe, test } from 'node:test';
|
|
22
|
-
import assert from 'node:assert/strict';
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
function createBase(name: string): string {
|
|
26
|
-
const base = mkdtempSync(join(tmpdir(), `gsd-wt-respawn-${name}-`));
|
|
27
|
-
mkdirSync(join(base, '.gsd', 'milestones'), { recursive: true });
|
|
28
|
-
return base;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
function cleanup(base: string): void {
|
|
32
|
-
rmSync(base, { recursive: true, force: true });
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
describe('worktree-db-respawn-truncation (#2815)', async () => {
|
|
36
|
-
|
|
37
|
-
// ─── 1. Non-empty worktree gsd.db preserved after sync ───────────────
|
|
38
|
-
console.log('\n=== 1. non-empty worktree gsd.db preserved after sync (#2815) ===');
|
|
39
|
-
{
|
|
40
|
-
const mainBase = createBase('main');
|
|
41
|
-
const wtBase = createBase('wt');
|
|
42
|
-
|
|
43
|
-
try {
|
|
44
|
-
// Set up milestone artifacts in main project root
|
|
45
|
-
const m001Dir = join(mainBase, '.gsd', 'milestones', 'M001');
|
|
46
|
-
mkdirSync(m001Dir, { recursive: true });
|
|
47
|
-
writeFileSync(join(m001Dir, 'M001-ROADMAP.md'), '# Roadmap');
|
|
48
|
-
|
|
49
|
-
// Simulate a freshly-migrated worktree DB (non-empty, like after gsd-migrate)
|
|
50
|
-
// Real DBs are ~1.7MB; we use a smaller payload to prove the size check works
|
|
51
|
-
const fakeDbContent = Buffer.alloc(4096, 0x42); // 4KB non-empty DB
|
|
52
|
-
writeFileSync(join(wtBase, '.gsd', 'gsd.db'), fakeDbContent);
|
|
53
|
-
|
|
54
|
-
const sizeBefore = statSync(join(wtBase, '.gsd', 'gsd.db')).size;
|
|
55
|
-
assert.ok(sizeBefore > 0, 'gsd.db is non-empty before sync');
|
|
56
|
-
|
|
57
|
-
syncProjectRootToWorktree(mainBase, wtBase, 'M001');
|
|
58
|
-
|
|
59
|
-
// The non-empty DB must survive the sync
|
|
60
|
-
assert.ok(
|
|
61
|
-
existsSync(join(wtBase, '.gsd', 'gsd.db')),
|
|
62
|
-
'#2815: non-empty gsd.db must not be deleted by sync',
|
|
63
|
-
);
|
|
64
|
-
const sizeAfter = statSync(join(wtBase, '.gsd', 'gsd.db')).size;
|
|
65
|
-
assert.equal(
|
|
66
|
-
sizeAfter,
|
|
67
|
-
sizeBefore,
|
|
68
|
-
'#2815: gsd.db size must be unchanged after sync',
|
|
69
|
-
);
|
|
70
|
-
} finally {
|
|
71
|
-
cleanup(mainBase);
|
|
72
|
-
cleanup(wtBase);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
// ─── 2. Empty (0-byte) worktree gsd.db still deleted ─────────────────
|
|
77
|
-
console.log('\n=== 2. empty (0-byte) worktree gsd.db still deleted (#853) ===');
|
|
78
|
-
{
|
|
79
|
-
const mainBase = createBase('main');
|
|
80
|
-
const wtBase = createBase('wt');
|
|
81
|
-
|
|
82
|
-
try {
|
|
83
|
-
const m001Dir = join(mainBase, '.gsd', 'milestones', 'M001');
|
|
84
|
-
mkdirSync(m001Dir, { recursive: true });
|
|
85
|
-
writeFileSync(join(m001Dir, 'M001-ROADMAP.md'), '# Roadmap');
|
|
86
|
-
|
|
87
|
-
// Create an empty (0-byte) gsd.db — this is stale/corrupt and should be deleted
|
|
88
|
-
writeFileSync(join(wtBase, '.gsd', 'gsd.db'), '');
|
|
89
|
-
assert.ok(existsSync(join(wtBase, '.gsd', 'gsd.db')), 'empty gsd.db exists before sync');
|
|
90
|
-
|
|
91
|
-
syncProjectRootToWorktree(mainBase, wtBase, 'M001');
|
|
92
|
-
|
|
93
|
-
assert.ok(
|
|
94
|
-
!existsSync(join(wtBase, '.gsd', 'gsd.db')),
|
|
95
|
-
'#853: empty gsd.db must still be deleted after sync',
|
|
96
|
-
);
|
|
97
|
-
} finally {
|
|
98
|
-
cleanup(mainBase);
|
|
99
|
-
cleanup(wtBase);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
// ─── 3. Milestone artifacts still synced when DB is preserved ────────
|
|
104
|
-
console.log('\n=== 3. milestone artifacts still synced even when DB preserved ===');
|
|
105
|
-
{
|
|
106
|
-
const mainBase = createBase('main');
|
|
107
|
-
const wtBase = createBase('wt');
|
|
108
|
-
|
|
109
|
-
try {
|
|
110
|
-
const m001Dir = join(mainBase, '.gsd', 'milestones', 'M001');
|
|
111
|
-
mkdirSync(m001Dir, { recursive: true });
|
|
112
|
-
writeFileSync(join(m001Dir, 'M001-ROADMAP.md'), '# Roadmap');
|
|
113
|
-
mkdirSync(join(m001Dir, 'slices', 'S01'), { recursive: true });
|
|
114
|
-
writeFileSync(join(m001Dir, 'slices', 'S01', 'S01-PLAN.md'), '# Plan');
|
|
115
|
-
|
|
116
|
-
// Non-empty DB in worktree
|
|
117
|
-
writeFileSync(join(wtBase, '.gsd', 'gsd.db'), 'populated-db-data');
|
|
118
|
-
|
|
119
|
-
syncProjectRootToWorktree(mainBase, wtBase, 'M001');
|
|
120
|
-
|
|
121
|
-
// Artifacts must still be synced
|
|
122
|
-
assert.ok(
|
|
123
|
-
existsSync(join(wtBase, '.gsd', 'milestones', 'M001', 'M001-ROADMAP.md')),
|
|
124
|
-
'milestone artifacts synced even with preserved DB',
|
|
125
|
-
);
|
|
126
|
-
assert.ok(
|
|
127
|
-
existsSync(join(wtBase, '.gsd', 'milestones', 'M001', 'slices', 'S01', 'S01-PLAN.md')),
|
|
128
|
-
'slice artifacts synced even with preserved DB',
|
|
129
|
-
);
|
|
130
|
-
// DB must still exist
|
|
131
|
-
assert.ok(
|
|
132
|
-
existsSync(join(wtBase, '.gsd', 'gsd.db')),
|
|
133
|
-
'#2815: DB preserved alongside artifact sync',
|
|
134
|
-
);
|
|
135
|
-
} finally {
|
|
136
|
-
cleanup(mainBase);
|
|
137
|
-
cleanup(wtBase);
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
});
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* worktree-nested-git-safety.test.ts — #2616
|
|
3
|
-
*
|
|
4
|
-
* When scaffolding tools (create-next-app, cargo init, etc.) run inside a
|
|
5
|
-
* worktree, they create nested .git directories. Git treats these as gitlinks
|
|
6
|
-
* (mode 160000) without a .gitmodules entry, so the worktree cleanup destroys
|
|
7
|
-
* the only copy of those object databases — causing permanent data loss.
|
|
8
|
-
*
|
|
9
|
-
* This test verifies that removeWorktree detects nested .git directories
|
|
10
|
-
* (orphaned gitlinks) and absorbs or removes them before cleanup so files
|
|
11
|
-
* are tracked as regular content instead of unreachable gitlink pointers.
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
import { readFileSync } from "node:fs";
|
|
15
|
-
import { join } from "node:path";
|
|
16
|
-
import { createTestContext } from "./test-helpers.ts";
|
|
17
|
-
|
|
18
|
-
const { assertTrue, report } = createTestContext();
|
|
19
|
-
|
|
20
|
-
const srcPath = join(import.meta.dirname, "..", "worktree-manager.ts");
|
|
21
|
-
const src = readFileSync(srcPath, "utf-8");
|
|
22
|
-
|
|
23
|
-
console.log("\n=== #2616: Worktree cleanup detects nested .git directories ===");
|
|
24
|
-
|
|
25
|
-
// ── Test 1: removeWorktree scans for nested .git directories ─────────
|
|
26
|
-
|
|
27
|
-
const removeWorktreeIdx = src.indexOf("export function removeWorktree");
|
|
28
|
-
assertTrue(removeWorktreeIdx > 0, "worktree-manager.ts exports removeWorktree");
|
|
29
|
-
|
|
30
|
-
const fnBody = src.slice(removeWorktreeIdx, removeWorktreeIdx + 5000);
|
|
31
|
-
|
|
32
|
-
const detectsNestedGit =
|
|
33
|
-
fnBody.includes("nested") && fnBody.includes(".git") ||
|
|
34
|
-
fnBody.includes("gitlink") ||
|
|
35
|
-
fnBody.includes("160000") ||
|
|
36
|
-
fnBody.includes("findNestedGitDirs") ||
|
|
37
|
-
fnBody.includes("nestedGitDirs");
|
|
38
|
-
|
|
39
|
-
assertTrue(
|
|
40
|
-
detectsNestedGit,
|
|
41
|
-
"removeWorktree detects nested .git directories or gitlinks (#2616)",
|
|
42
|
-
);
|
|
43
|
-
|
|
44
|
-
// ── Test 2: A helper function exists to find nested .git directories ──
|
|
45
|
-
|
|
46
|
-
const hasNestedGitHelper =
|
|
47
|
-
src.includes("findNestedGitDirs") ||
|
|
48
|
-
src.includes("detectNestedGitDirs") ||
|
|
49
|
-
src.includes("scanNestedGit") ||
|
|
50
|
-
src.includes("absorbNestedGit") ||
|
|
51
|
-
src.includes("nestedGitDirs");
|
|
52
|
-
|
|
53
|
-
assertTrue(
|
|
54
|
-
hasNestedGitHelper,
|
|
55
|
-
"worktree-manager has a helper to find nested .git directories (#2616)",
|
|
56
|
-
);
|
|
57
|
-
|
|
58
|
-
// ── Test 3: Nested .git dirs are absorbed or removed before cleanup ───
|
|
59
|
-
|
|
60
|
-
const absorbsOrRemoves =
|
|
61
|
-
fnBody.includes("absorb") ||
|
|
62
|
-
fnBody.includes("rmSync") && fnBody.includes("nested") ||
|
|
63
|
-
(fnBody.includes("nestedGitDirs") || fnBody.includes("findNestedGitDirs")) &&
|
|
64
|
-
(fnBody.includes("rm") || fnBody.includes("absorb") || fnBody.includes("remove"));
|
|
65
|
-
|
|
66
|
-
assertTrue(
|
|
67
|
-
absorbsOrRemoves,
|
|
68
|
-
"removeWorktree absorbs or removes nested .git dirs before cleanup (#2616)",
|
|
69
|
-
);
|
|
70
|
-
|
|
71
|
-
// ── Test 4: A warning is logged when nested .git dirs are found ───────
|
|
72
|
-
|
|
73
|
-
const warnsAboutNestedGit =
|
|
74
|
-
fnBody.includes("nested") && fnBody.includes("logWarning") ||
|
|
75
|
-
fnBody.includes("gitlink") && fnBody.includes("logWarning") ||
|
|
76
|
-
fnBody.includes("scaffold") && fnBody.includes("logWarning");
|
|
77
|
-
|
|
78
|
-
assertTrue(
|
|
79
|
-
warnsAboutNestedGit,
|
|
80
|
-
"removeWorktree warns when nested .git directories are detected (#2616)",
|
|
81
|
-
);
|
|
82
|
-
|
|
83
|
-
// ── Test 5: The findNestedGitDirs helper correctly identifies nested repos ──
|
|
84
|
-
// Verify the helper scans subdirectories but skips .gsd/, node_modules/, .git/
|
|
85
|
-
|
|
86
|
-
const helperBody = src.includes("findNestedGitDirs")
|
|
87
|
-
? src.slice(src.indexOf("findNestedGitDirs"))
|
|
88
|
-
: "";
|
|
89
|
-
|
|
90
|
-
const skipsExcludedDirs =
|
|
91
|
-
helperBody.includes("node_modules") ||
|
|
92
|
-
helperBody.includes(".gsd") ||
|
|
93
|
-
helperBody.includes("skip") ||
|
|
94
|
-
helperBody.includes("exclude");
|
|
95
|
-
|
|
96
|
-
assertTrue(
|
|
97
|
-
skipsExcludedDirs,
|
|
98
|
-
"findNestedGitDirs skips node_modules and other excluded directories (#2616)",
|
|
99
|
-
);
|
|
100
|
-
|
|
101
|
-
report();
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
import { readFileSync } from "node:fs";
|
|
2
|
-
import { join } from "node:path";
|
|
3
|
-
|
|
4
|
-
import { createTestContext } from "./test-helpers.ts";
|
|
5
|
-
|
|
6
|
-
const { assertTrue, assertMatch, assertNoMatch, report } = createTestContext();
|
|
7
|
-
|
|
8
|
-
// ─── #2942: Zombie .gsd state skips init wizard ─────────────────────────────
|
|
9
|
-
//
|
|
10
|
-
// A partially initialized .gsd/ (symlink exists but no PREFERENCES.md or
|
|
11
|
-
// milestones/) causes the init wizard gate in showSmartEntry to be skipped,
|
|
12
|
-
// resulting in an uninitialized project session.
|
|
13
|
-
|
|
14
|
-
console.log("\n=== #2942: zombie .gsd state must not skip init wizard ===");
|
|
15
|
-
|
|
16
|
-
// ── guided-flow.ts — init wizard gate must check bootstrap completeness ──
|
|
17
|
-
|
|
18
|
-
const guidedFlowSrc = readFileSync(
|
|
19
|
-
join(import.meta.dirname, "..", "guided-flow.ts"),
|
|
20
|
-
"utf-8",
|
|
21
|
-
);
|
|
22
|
-
|
|
23
|
-
// Find the showSmartEntry function
|
|
24
|
-
const smartEntryIdx = guidedFlowSrc.indexOf("export async function showSmartEntry(");
|
|
25
|
-
assertTrue(smartEntryIdx >= 0, "guided-flow.ts defines showSmartEntry");
|
|
26
|
-
|
|
27
|
-
// Extract the region between showSmartEntry and the first showProjectInit call
|
|
28
|
-
// This is where the init wizard gate lives.
|
|
29
|
-
const afterSmartEntry = smartEntryIdx >= 0 ? guidedFlowSrc.slice(smartEntryIdx, smartEntryIdx + 3000) : "";
|
|
30
|
-
|
|
31
|
-
// The gate must NOT be a bare `!existsSync(gsdRoot(basePath))` check.
|
|
32
|
-
// It must also verify that bootstrap artifacts (PREFERENCES.md or milestones/) exist.
|
|
33
|
-
assertTrue(
|
|
34
|
-
afterSmartEntry.includes("PREFERENCES.md") || afterSmartEntry.includes("PREFERENCES"),
|
|
35
|
-
"init wizard gate checks for PREFERENCES.md, not just .gsd/ existence (#2942)",
|
|
36
|
-
);
|
|
37
|
-
|
|
38
|
-
assertTrue(
|
|
39
|
-
afterSmartEntry.includes("milestones"),
|
|
40
|
-
"init wizard gate checks for milestones/ directory, not just .gsd/ existence (#2942)",
|
|
41
|
-
);
|
|
42
|
-
|
|
43
|
-
// The init wizard should be shown when .gsd/ exists but has no bootstrap artifacts.
|
|
44
|
-
// The old code was: if (!existsSync(gsdRoot(basePath))) { ... showProjectInit ... }
|
|
45
|
-
// The fix should use a compound check so zombie states trigger the wizard.
|
|
46
|
-
// Verify we no longer have the bare existence check as the sole gate.
|
|
47
|
-
|
|
48
|
-
// Find the specific init wizard gate pattern — the detection preamble block.
|
|
49
|
-
const detectionPreambleIdx = afterSmartEntry.indexOf("Detection preamble");
|
|
50
|
-
const detectionRegion = detectionPreambleIdx >= 0
|
|
51
|
-
? afterSmartEntry.slice(detectionPreambleIdx, detectionPreambleIdx + 600)
|
|
52
|
-
: afterSmartEntry.slice(0, 1500);
|
|
53
|
-
|
|
54
|
-
// The gate condition must reference PREFERENCES.md or milestones (bootstrap artifacts)
|
|
55
|
-
assertMatch(
|
|
56
|
-
detectionRegion,
|
|
57
|
-
/PREFERENCES\.md|milestones/,
|
|
58
|
-
"detection preamble gate references bootstrap artifacts, not just directory existence (#2942)",
|
|
59
|
-
);
|
|
60
|
-
|
|
61
|
-
// ── auto-start.ts — milestones/ dir creation must not be dead code ──────────
|
|
62
|
-
|
|
63
|
-
console.log("\n=== #2942: auto-start milestones/ bootstrap not dead code ===");
|
|
64
|
-
|
|
65
|
-
const autoStartSrc = readFileSync(
|
|
66
|
-
join(import.meta.dirname, "..", "auto-start.ts"),
|
|
67
|
-
"utf-8",
|
|
68
|
-
);
|
|
69
|
-
|
|
70
|
-
// After ensureGsdSymlink, the code that creates milestones/ must check for
|
|
71
|
-
// the milestones directory specifically (not .gsd/ which ensureGsdSymlink already created).
|
|
72
|
-
const symlinkIdx = autoStartSrc.indexOf("ensureGsdSymlink(base)");
|
|
73
|
-
assertTrue(symlinkIdx >= 0, "auto-start.ts calls ensureGsdSymlink(base)");
|
|
74
|
-
|
|
75
|
-
const afterSymlink = symlinkIdx >= 0 ? autoStartSrc.slice(symlinkIdx, symlinkIdx + 800) : "";
|
|
76
|
-
|
|
77
|
-
// The milestones bootstrap must check milestones path, not gsdDir
|
|
78
|
-
// Old (dead) code: if (!existsSync(gsdDir)) { mkdirSync(join(gsdDir, "milestones"), ...) }
|
|
79
|
-
// Fixed code should check: if (!existsSync(milestonesPath)) or similar
|
|
80
|
-
assertTrue(
|
|
81
|
-
afterSymlink.includes("milestones") && afterSymlink.includes("mkdirSync"),
|
|
82
|
-
"auto-start.ts creates milestones/ directory after ensureGsdSymlink (#2942)",
|
|
83
|
-
);
|
|
84
|
-
|
|
85
|
-
// The guard for milestones/ creation should NOT be `!existsSync(gsdDir)` —
|
|
86
|
-
// that's dead code since ensureGsdSymlink already created gsdDir.
|
|
87
|
-
// It should check for the milestones/ dir directly.
|
|
88
|
-
const mkdirRegion = afterSymlink.slice(0, afterSymlink.indexOf("mkdirSync") + 200);
|
|
89
|
-
assertMatch(
|
|
90
|
-
mkdirRegion,
|
|
91
|
-
/existsSync\([^)]*milestones/,
|
|
92
|
-
"milestones bootstrap checks milestones path existence, not .gsd/ (#2942)",
|
|
93
|
-
);
|
|
94
|
-
|
|
95
|
-
report();
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Regression test for #3029 — mcp_discover fails for server names with spaces.
|
|
3
|
-
*
|
|
4
|
-
* The getServerConfig lookup must handle:
|
|
5
|
-
* 1. Exact match (already works)
|
|
6
|
-
* 2. Names with leading/trailing whitespace (trimming)
|
|
7
|
-
* 3. Case-insensitive matching (e.g. "Langgraph code" vs "langgraph Code")
|
|
8
|
-
*
|
|
9
|
-
* We test at the source level since getServerConfig is not exported.
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import test from "node:test";
|
|
13
|
-
import assert from "node:assert/strict";
|
|
14
|
-
import { readFileSync } from "node:fs";
|
|
15
|
-
import { dirname, join } from "node:path";
|
|
16
|
-
import { fileURLToPath } from "node:url";
|
|
17
|
-
|
|
18
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
19
|
-
const __dirname = dirname(__filename);
|
|
20
|
-
|
|
21
|
-
const source = readFileSync(join(__dirname, "..", "index.ts"), "utf-8");
|
|
22
|
-
|
|
23
|
-
test("#3029: getServerConfig trims whitespace from input name", () => {
|
|
24
|
-
assert.ok(
|
|
25
|
-
source.includes(".trim()"),
|
|
26
|
-
"getServerConfig should trim the input name before comparison",
|
|
27
|
-
);
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
test("#3029: getServerConfig performs case-insensitive matching", () => {
|
|
31
|
-
assert.ok(
|
|
32
|
-
source.includes(".toLowerCase()"),
|
|
33
|
-
"getServerConfig should compare names case-insensitively",
|
|
34
|
-
);
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
test("#3029: getOrConnect normalizes name for connection cache lookup", () => {
|
|
38
|
-
// The connections Map key must use the canonical (config) name, not the
|
|
39
|
-
// raw user input, so that subsequent lookups hit the cache even when the
|
|
40
|
-
// user's casing differs.
|
|
41
|
-
const getOrConnectMatch = source.match(
|
|
42
|
-
/async function getOrConnect\(name: string[\s\S]*?const existing = connections\.get\(/,
|
|
43
|
-
);
|
|
44
|
-
assert.ok(
|
|
45
|
-
getOrConnectMatch,
|
|
46
|
-
"getOrConnect function should exist",
|
|
47
|
-
);
|
|
48
|
-
// After the fix, getOrConnect should normalize the name via getServerConfig
|
|
49
|
-
// or use config.name as the canonical cache key.
|
|
50
|
-
assert.ok(
|
|
51
|
-
source.includes("connections.get(config.name") ||
|
|
52
|
-
source.includes("connections.set(config.name"),
|
|
53
|
-
"getOrConnect should use config.name (canonical) as the connections cache key",
|
|
54
|
-
);
|
|
55
|
-
});
|
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
// GSD2 — Ollama Extension: First-class local LLM support
|
|
2
|
-
/**
|
|
3
|
-
* Ollama Extension
|
|
4
|
-
*
|
|
5
|
-
* Auto-detects a running Ollama instance, discovers locally pulled models,
|
|
6
|
-
* and registers them as a first-class provider. No configuration required —
|
|
7
|
-
* if Ollama is running, models appear automatically.
|
|
8
|
-
*
|
|
9
|
-
* Features:
|
|
10
|
-
* - Auto-discovery of local models via /api/tags
|
|
11
|
-
* - Capability detection (vision, reasoning, context window)
|
|
12
|
-
* - /ollama slash commands for model management
|
|
13
|
-
* - ollama_manage tool for LLM-driven model operations
|
|
14
|
-
* - Zero-cost model registration (local inference)
|
|
15
|
-
*
|
|
16
|
-
* Respects OLLAMA_HOST env var for non-default endpoints.
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
import { importExtensionModule, type ExtensionAPI } from "@gsd/pi-coding-agent";
|
|
20
|
-
import type { OpenAICompletionsCompat } from "@gsd/pi-ai";
|
|
21
|
-
import * as client from "./ollama-client.js";
|
|
22
|
-
import { discoverModels, getOllamaOpenAIBaseUrl } from "./ollama-discovery.js";
|
|
23
|
-
import { registerOllamaCommands } from "./ollama-commands.js";
|
|
24
|
-
|
|
25
|
-
/** Default compat settings for Ollama models via OpenAI-compat endpoint */
|
|
26
|
-
const OLLAMA_COMPAT: OpenAICompletionsCompat = {
|
|
27
|
-
supportsDeveloperRole: false,
|
|
28
|
-
supportsReasoningEffort: false,
|
|
29
|
-
supportsUsageInStreaming: false,
|
|
30
|
-
maxTokensField: "max_tokens",
|
|
31
|
-
supportsStore: false,
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
let toolsPromise: Promise<void> | null = null;
|
|
35
|
-
|
|
36
|
-
async function registerOllamaTools(pi: ExtensionAPI): Promise<void> {
|
|
37
|
-
if (!toolsPromise) {
|
|
38
|
-
toolsPromise = (async () => {
|
|
39
|
-
const { registerOllamaTool } = await importExtensionModule<
|
|
40
|
-
typeof import("./ollama-tool.js")
|
|
41
|
-
>(import.meta.url, "./ollama-tool.js");
|
|
42
|
-
registerOllamaTool(pi);
|
|
43
|
-
})().catch((error) => {
|
|
44
|
-
toolsPromise = null;
|
|
45
|
-
throw error;
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
return toolsPromise;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
/** Track whether we've registered models so we can clean up on shutdown */
|
|
52
|
-
let providerRegistered = false;
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Probe Ollama and register discovered models.
|
|
56
|
-
* Safe to call multiple times — re-discovers and re-registers.
|
|
57
|
-
*/
|
|
58
|
-
async function probeAndRegister(pi: ExtensionAPI): Promise<boolean> {
|
|
59
|
-
const running = await client.isRunning();
|
|
60
|
-
if (!running) {
|
|
61
|
-
if (providerRegistered) {
|
|
62
|
-
pi.unregisterProvider("ollama");
|
|
63
|
-
providerRegistered = false;
|
|
64
|
-
}
|
|
65
|
-
return false;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
const models = await discoverModels();
|
|
69
|
-
if (models.length === 0) return true; // Running but no models pulled
|
|
70
|
-
|
|
71
|
-
const baseUrl = getOllamaOpenAIBaseUrl();
|
|
72
|
-
|
|
73
|
-
pi.registerProvider("ollama", {
|
|
74
|
-
authMode: "none",
|
|
75
|
-
baseUrl,
|
|
76
|
-
api: "openai-completions",
|
|
77
|
-
isReady: () => true,
|
|
78
|
-
models: models.map((m) => ({
|
|
79
|
-
id: m.id,
|
|
80
|
-
name: m.name,
|
|
81
|
-
reasoning: m.reasoning,
|
|
82
|
-
input: m.input,
|
|
83
|
-
cost: m.cost,
|
|
84
|
-
contextWindow: m.contextWindow,
|
|
85
|
-
maxTokens: m.maxTokens,
|
|
86
|
-
compat: OLLAMA_COMPAT,
|
|
87
|
-
})),
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
providerRegistered = true;
|
|
91
|
-
return true;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
export default function ollama(pi: ExtensionAPI) {
|
|
95
|
-
// Register slash commands immediately (they check Ollama availability themselves)
|
|
96
|
-
registerOllamaCommands(pi);
|
|
97
|
-
|
|
98
|
-
pi.on("session_start", async (_event, ctx) => {
|
|
99
|
-
// Register tool (deferred to avoid blocking startup)
|
|
100
|
-
if (ctx.hasUI) {
|
|
101
|
-
void registerOllamaTools(pi).catch((error) => {
|
|
102
|
-
ctx.ui.notify(
|
|
103
|
-
`Ollama tool failed to load: ${error instanceof Error ? error.message : String(error)}`,
|
|
104
|
-
"warning",
|
|
105
|
-
);
|
|
106
|
-
});
|
|
107
|
-
} else {
|
|
108
|
-
await registerOllamaTools(pi);
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// Async probe — don't block startup
|
|
112
|
-
probeAndRegister(pi)
|
|
113
|
-
.then((found) => {
|
|
114
|
-
if (found && ctx.hasUI) {
|
|
115
|
-
ctx.ui.setStatus("ollama", "Ollama");
|
|
116
|
-
}
|
|
117
|
-
})
|
|
118
|
-
.catch(() => {
|
|
119
|
-
// Silently ignore probe failures
|
|
120
|
-
});
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
pi.on("session_shutdown", async () => {
|
|
124
|
-
if (providerRegistered) {
|
|
125
|
-
pi.unregisterProvider("ollama");
|
|
126
|
-
providerRegistered = false;
|
|
127
|
-
}
|
|
128
|
-
toolsPromise = null;
|
|
129
|
-
});
|
|
130
|
-
}
|
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
// GSD2 — Known model capability table for Ollama models
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Maps well-known Ollama model families to their capabilities.
|
|
5
|
-
* Used to enrich auto-discovered models with accurate context windows,
|
|
6
|
-
* vision support, and reasoning detection.
|
|
7
|
-
*
|
|
8
|
-
* Fallback: estimate from parameter count if model isn't in the table.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
export interface ModelCapability {
|
|
12
|
-
contextWindow?: number;
|
|
13
|
-
maxTokens?: number;
|
|
14
|
-
input?: ("text" | "image")[];
|
|
15
|
-
reasoning?: boolean;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Known model family capabilities.
|
|
20
|
-
* Keys are matched as prefixes against the model name (before the colon/tag).
|
|
21
|
-
* More specific entries should appear first.
|
|
22
|
-
*/
|
|
23
|
-
const KNOWN_MODELS: Array<[pattern: string, caps: ModelCapability]> = [
|
|
24
|
-
// ─── Reasoning models ───────────────────────────────────────────────
|
|
25
|
-
["deepseek-r1", { contextWindow: 131072, reasoning: true }],
|
|
26
|
-
["qwq", { contextWindow: 131072, reasoning: true }],
|
|
27
|
-
|
|
28
|
-
// ─── Vision models ──────────────────────────────────────────────────
|
|
29
|
-
["llava", { contextWindow: 4096, input: ["text", "image"] }],
|
|
30
|
-
["bakllava", { contextWindow: 4096, input: ["text", "image"] }],
|
|
31
|
-
["moondream", { contextWindow: 8192, input: ["text", "image"] }],
|
|
32
|
-
["llama3.2-vision", { contextWindow: 131072, input: ["text", "image"] }],
|
|
33
|
-
["minicpm-v", { contextWindow: 4096, input: ["text", "image"] }],
|
|
34
|
-
|
|
35
|
-
// ─── Code models ────────────────────────────────────────────────────
|
|
36
|
-
["codestral", { contextWindow: 262144, maxTokens: 32768 }],
|
|
37
|
-
["qwen2.5-coder", { contextWindow: 131072, maxTokens: 32768 }],
|
|
38
|
-
["deepseek-coder-v2", { contextWindow: 131072, maxTokens: 16384 }],
|
|
39
|
-
["starcoder2", { contextWindow: 16384, maxTokens: 8192 }],
|
|
40
|
-
["codegemma", { contextWindow: 8192, maxTokens: 8192 }],
|
|
41
|
-
["codellama", { contextWindow: 16384, maxTokens: 8192 }],
|
|
42
|
-
["devstral", { contextWindow: 131072, maxTokens: 32768 }],
|
|
43
|
-
|
|
44
|
-
// ─── Llama family ───────────────────────────────────────────────────
|
|
45
|
-
["llama3.3", { contextWindow: 131072, maxTokens: 16384 }],
|
|
46
|
-
["llama3.2", { contextWindow: 131072, maxTokens: 16384 }],
|
|
47
|
-
["llama3.1", { contextWindow: 131072, maxTokens: 16384 }],
|
|
48
|
-
["llama3", { contextWindow: 8192, maxTokens: 8192 }],
|
|
49
|
-
["llama2", { contextWindow: 4096, maxTokens: 4096 }],
|
|
50
|
-
|
|
51
|
-
// ─── Qwen family ────────────────────────────────────────────────────
|
|
52
|
-
["qwen3", { contextWindow: 131072, maxTokens: 32768 }],
|
|
53
|
-
["qwen2.5", { contextWindow: 131072, maxTokens: 32768 }],
|
|
54
|
-
["qwen2", { contextWindow: 131072, maxTokens: 32768 }],
|
|
55
|
-
|
|
56
|
-
// ─── Gemma family ───────────────────────────────────────────────────
|
|
57
|
-
["gemma3", { contextWindow: 131072, maxTokens: 16384 }],
|
|
58
|
-
["gemma2", { contextWindow: 8192, maxTokens: 8192 }],
|
|
59
|
-
|
|
60
|
-
// ─── Mistral family ─────────────────────────────────────────────────
|
|
61
|
-
["mistral-large", { contextWindow: 131072, maxTokens: 16384 }],
|
|
62
|
-
["mistral-small", { contextWindow: 131072, maxTokens: 16384 }],
|
|
63
|
-
["mistral-nemo", { contextWindow: 131072, maxTokens: 16384 }],
|
|
64
|
-
["mistral", { contextWindow: 32768, maxTokens: 8192 }],
|
|
65
|
-
["mixtral", { contextWindow: 32768, maxTokens: 8192 }],
|
|
66
|
-
|
|
67
|
-
// ─── Phi family ─────────────────────────────────────────────────────
|
|
68
|
-
["phi4", { contextWindow: 16384, maxTokens: 16384 }],
|
|
69
|
-
["phi3.5", { contextWindow: 131072, maxTokens: 16384 }],
|
|
70
|
-
["phi3", { contextWindow: 131072, maxTokens: 4096 }],
|
|
71
|
-
|
|
72
|
-
// ─── Command R ──────────────────────────────────────────────────────
|
|
73
|
-
["command-r-plus", { contextWindow: 131072, maxTokens: 16384 }],
|
|
74
|
-
["command-r", { contextWindow: 131072, maxTokens: 16384 }],
|
|
75
|
-
];
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* Look up capabilities for a model by name.
|
|
79
|
-
* Matches the longest prefix from the known models table.
|
|
80
|
-
*/
|
|
81
|
-
export function getModelCapabilities(modelName: string): ModelCapability {
|
|
82
|
-
// Strip tag (everything after the colon) for matching
|
|
83
|
-
const baseName = modelName.split(":")[0].toLowerCase();
|
|
84
|
-
|
|
85
|
-
for (const [pattern, caps] of KNOWN_MODELS) {
|
|
86
|
-
if (baseName === pattern || baseName.startsWith(pattern)) {
|
|
87
|
-
return caps;
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
return {};
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* Estimate context window from parameter size string (e.g. "7B", "70B", "1.5B").
|
|
96
|
-
* Used as fallback when model isn't in the known table.
|
|
97
|
-
*/
|
|
98
|
-
export function estimateContextFromParams(parameterSize: string): number {
|
|
99
|
-
const match = parameterSize.match(/([\d.]+)\s*([BbMm])/);
|
|
100
|
-
if (!match) return 8192;
|
|
101
|
-
|
|
102
|
-
const size = parseFloat(match[1]);
|
|
103
|
-
const unit = match[2].toUpperCase();
|
|
104
|
-
|
|
105
|
-
// Convert to billions
|
|
106
|
-
const billions = unit === "M" ? size / 1000 : size;
|
|
107
|
-
|
|
108
|
-
// Rough heuristics: larger models tend to support larger contexts
|
|
109
|
-
if (billions >= 70) return 131072;
|
|
110
|
-
if (billions >= 30) return 65536;
|
|
111
|
-
if (billions >= 13) return 32768;
|
|
112
|
-
if (billions >= 7) return 16384;
|
|
113
|
-
return 8192;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* Humanize a model name for display (e.g. "llama3.1:8b" → "Llama 3.1 8B").
|
|
118
|
-
*/
|
|
119
|
-
export function humanizeModelName(modelName: string): string {
|
|
120
|
-
const [base, tag] = modelName.split(":");
|
|
121
|
-
|
|
122
|
-
// Capitalize first letter, add spaces around version numbers
|
|
123
|
-
let name = base
|
|
124
|
-
.replace(/([a-z])(\d)/g, "$1 $2")
|
|
125
|
-
.replace(/(\d)([a-z])/g, "$1 $2")
|
|
126
|
-
.replace(/^./, (c) => c.toUpperCase());
|
|
127
|
-
|
|
128
|
-
// Clean up common patterns
|
|
129
|
-
name = name.replace(/\s*-\s*/g, " ");
|
|
130
|
-
|
|
131
|
-
if (tag && tag !== "latest") {
|
|
132
|
-
name += ` ${tag.toUpperCase()}`;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
return name;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
/**
|
|
139
|
-
* Format byte size for display (e.g. 4700000000 → "4.7 GB").
|
|
140
|
-
*/
|
|
141
|
-
export function formatModelSize(bytes: number): string {
|
|
142
|
-
if (bytes >= 1e9) return `${(bytes / 1e9).toFixed(1)} GB`;
|
|
143
|
-
if (bytes >= 1e6) return `${(bytes / 1e6).toFixed(1)} MB`;
|
|
144
|
-
return `${(bytes / 1e3).toFixed(0)} KB`;
|
|
145
|
-
}
|