gsd-pi 2.71.0 → 2.72.0-dev.3118184
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 +69 -19
- package/dist/cli.js +88 -6
- package/dist/headless-events.d.ts +2 -0
- package/dist/headless-events.js +7 -0
- package/dist/headless.js +16 -3
- package/dist/mcp-server.js +40 -17
- package/dist/onboarding.js +10 -0
- package/dist/provider-migrations.d.ts +10 -0
- package/dist/provider-migrations.js +12 -0
- package/dist/resource-loader.js +139 -13
- package/dist/resources/GSD-WORKFLOW.md +1 -1
- package/dist/resources/agents/debugger.md +58 -0
- package/dist/resources/agents/doc-writer.md +43 -0
- package/dist/resources/agents/git-ops.md +56 -0
- package/dist/resources/agents/javascript-pro.md +46 -271
- package/dist/resources/agents/planner.md +55 -0
- package/dist/resources/agents/refactorer.md +47 -0
- package/dist/resources/agents/reviewer.md +48 -0
- package/dist/resources/agents/security.md +59 -0
- package/dist/resources/agents/tester.md +50 -0
- package/dist/resources/agents/typescript-pro.md +41 -235
- package/dist/resources/extensions/async-jobs/await-tool.js +7 -4
- package/dist/resources/extensions/async-jobs/job-manager.js +28 -3
- package/dist/resources/extensions/claude-code-cli/partial-builder.js +40 -12
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +142 -14
- package/dist/resources/extensions/gsd/auto/infra-errors.js +34 -0
- package/dist/resources/extensions/gsd/auto/loop.js +116 -2
- package/dist/resources/extensions/gsd/auto/phases.js +5 -1
- package/dist/resources/extensions/gsd/auto/session.js +11 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +22 -16
- package/dist/resources/extensions/gsd/auto-model-selection.js +10 -2
- package/dist/resources/extensions/gsd/auto-post-unit.js +6 -0
- package/dist/resources/extensions/gsd/auto-prompts.js +88 -33
- package/dist/resources/extensions/gsd/auto-recovery.js +11 -0
- package/dist/resources/extensions/gsd/auto-start.js +34 -7
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +1 -1
- package/dist/resources/extensions/gsd/auto-worktree.js +1 -1
- package/dist/resources/extensions/gsd/auto.js +81 -19
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +3 -3
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +11 -11
- package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +63 -51
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +6 -0
- package/dist/resources/extensions/gsd/commands/context.js +15 -6
- package/dist/resources/extensions/gsd/commands/dispatcher.js +12 -2
- package/dist/resources/extensions/gsd/commands/handlers/auto.js +10 -33
- package/dist/resources/extensions/gsd/commands/handlers/core.js +56 -11
- package/dist/resources/extensions/gsd/commands/handlers/notifications-handler.js +15 -6
- package/dist/resources/extensions/gsd/commands/handlers/workflow.js +4 -10
- package/dist/resources/extensions/gsd/commands-handlers.js +4 -1
- package/dist/resources/extensions/gsd/context-injector.js +1 -1
- package/dist/resources/extensions/gsd/custom-workflow-engine.js +3 -7
- package/dist/resources/extensions/gsd/dashboard-overlay.js +8 -3
- package/dist/resources/extensions/gsd/definition-io.js +15 -0
- package/dist/resources/extensions/gsd/dispatch-guard.js +22 -1
- package/dist/resources/extensions/gsd/doctor-providers.js +23 -0
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +6 -3
- package/dist/resources/extensions/gsd/error-classifier.js +5 -2
- package/dist/resources/extensions/gsd/forensics.js +19 -6
- package/dist/resources/extensions/gsd/gate-registry.js +208 -0
- package/dist/resources/extensions/gsd/git-service.js +11 -8
- package/dist/resources/extensions/gsd/gitignore.js +12 -6
- package/dist/resources/extensions/gsd/gsd-db.js +90 -6
- package/dist/resources/extensions/gsd/guided-flow.js +5 -10
- package/dist/resources/extensions/gsd/key-manager.js +2 -0
- package/dist/resources/extensions/gsd/metrics.js +1 -0
- package/dist/resources/extensions/gsd/milestone-actions.js +10 -4
- package/dist/resources/extensions/gsd/milestone-validation-gates.js +11 -12
- package/dist/resources/extensions/gsd/notification-overlay.js +42 -13
- package/dist/resources/extensions/gsd/notification-store.js +56 -5
- package/dist/resources/extensions/gsd/notification-widget.js +5 -13
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +8 -3
- package/dist/resources/extensions/gsd/pre-execution-checks.js +35 -2
- package/dist/resources/extensions/gsd/preferences-skills.js +2 -34
- package/dist/resources/extensions/gsd/preferences-types.js +15 -0
- package/dist/resources/extensions/gsd/preferences.js +16 -3
- package/dist/resources/extensions/gsd/prompt-loader.js +4 -1
- package/dist/resources/extensions/gsd/prompt-validation.js +126 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +5 -3
- package/dist/resources/extensions/gsd/prompts/discuss.md +123 -12
- package/dist/resources/extensions/gsd/prompts/execute-task.md +22 -19
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +2 -0
- package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +2 -0
- package/dist/resources/extensions/gsd/prompts/guided-resume-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/queue.md +3 -2
- package/dist/resources/extensions/gsd/prompts/system.md +1 -0
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +4 -1
- package/dist/resources/extensions/gsd/session-model-override.js +25 -0
- package/dist/resources/extensions/gsd/shortcut-defs.js +40 -0
- package/dist/resources/extensions/gsd/state.js +29 -2
- package/dist/resources/extensions/gsd/tools/complete-slice.js +52 -1
- package/dist/resources/extensions/gsd/tools/complete-task.js +51 -1
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +4 -1
- package/dist/resources/extensions/gsd/workflow-projections.js +7 -0
- package/dist/resources/extensions/gsd/worktree-manager.js +30 -3
- package/dist/resources/extensions/gsd/write-intercept.js +10 -1
- package/dist/resources/extensions/ollama/index.js +17 -10
- package/dist/resources/extensions/ollama/ollama-client.js +35 -6
- package/dist/resources/extensions/ollama/ollama-discovery.js +32 -6
- package/dist/resources/extensions/shared/gsd-phase-state.js +35 -0
- package/dist/resources/extensions/subagent/agents.js +8 -0
- package/dist/resources/extensions/subagent/index.js +17 -0
- package/dist/resources/skills/create-skill/SKILL.md +2 -0
- package/dist/startup-model-validation.d.ts +0 -1
- package/dist/startup-model-validation.js +6 -2
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +15 -15
- 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/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 +1 -1
- 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 +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- 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 +3 -3
- 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 +1 -1
- 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/notifications/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/notifications/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 +3 -3
- 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 +4 -4
- 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 +4 -4
- 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 +3 -3
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- 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 +15 -15
- package/dist/web/standalone/.next/server/chunks/2331.js +16 -16
- package/dist/web/standalone/.next/server/chunks/4741.js +12 -12
- package/dist/web/standalone/.next/server/chunks/5822.js +2 -2
- package/dist/web/standalone/.next/server/chunks/63.js +8 -8
- package/dist/web/standalone/.next/server/chunks/6897.js +3 -3
- package/dist/web/standalone/.next/server/edge-runtime-webpack.js +2 -0
- package/dist/web/standalone/.next/server/functions-config-manifest.json +0 -9
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-manifest.json +29 -2
- package/dist/web/standalone/.next/server/middleware.js +4 -12
- 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 +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/server/webpack-runtime.js +1 -1
- 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-f1e30ab6bb269149.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/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
- package/dist/web/standalone/server.js +1 -1
- package/package.json +1 -1
- package/packages/mcp-server/dist/server.d.ts +12 -1
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +90 -42
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +22 -12
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/src/server.ts +110 -38
- package/packages/mcp-server/src/workflow-tools.test.ts +110 -0
- package/packages/mcp-server/src/workflow-tools.ts +32 -12
- 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/models.custom.d.ts +105 -0
- package/packages/pi-ai/dist/models.custom.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.custom.js +97 -0
- package/packages/pi-ai/dist/models.custom.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +648 -140
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +867 -370
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.test.d.ts +2 -0
- package/packages/pi-ai/dist/models.generated.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/models.generated.test.js +334 -0
- package/packages/pi-ai/dist/models.generated.test.js.map +1 -0
- package/packages/pi-ai/dist/models.test.js +105 -0
- package/packages/pi-ai/dist/models.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/amazon-bedrock.js +11 -2
- package/packages/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-auth.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/anthropic-auth.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/anthropic-auth.test.js +20 -0
- package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -0
- package/packages/pi-ai/dist/providers/anthropic-shared.d.ts +4 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.js +8 -3
- package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.test.js +44 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts +2 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +7 -4
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.js +11 -0
- package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
- package/packages/pi-ai/dist/types.d.ts +1 -1
- 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/oauth/github-copilot.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/github-copilot.js +5 -1
- package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/github-copilot.test.d.ts +2 -0
- package/packages/pi-ai/dist/utils/oauth/github-copilot.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js +57 -0
- package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js.map +1 -0
- package/packages/pi-ai/src/env-api-keys.ts +1 -0
- package/packages/pi-ai/src/models.custom.ts +98 -0
- package/packages/pi-ai/src/models.generated.test.ts +373 -0
- package/packages/pi-ai/src/models.generated.ts +867 -370
- package/packages/pi-ai/src/models.test.ts +135 -0
- package/packages/pi-ai/src/providers/amazon-bedrock.ts +13 -1
- package/packages/pi-ai/src/providers/anthropic-auth.test.ts +32 -0
- package/packages/pi-ai/src/providers/anthropic-shared.test.ts +55 -1
- package/packages/pi-ai/src/providers/anthropic-shared.ts +14 -3
- package/packages/pi-ai/src/providers/anthropic.ts +8 -4
- package/packages/pi-ai/src/providers/openai-completions.ts +14 -0
- package/packages/pi-ai/src/types.ts +1 -0
- package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +71 -0
- package/packages/pi-ai/src/utils/oauth/github-copilot.ts +4 -1
- package/packages/pi-coding-agent/dist/core/agent-session-renderable-tools.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/agent-session-renderable-tools.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session-renderable-tools.test.js +61 -0
- package/packages/pi-coding-agent/dist/core/agent-session-renderable-tools.test.js.map +1 -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 +2 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +10 -0
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +27 -0
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js +85 -0
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver-initial-model-auth.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/model-resolver-initial-model-auth.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-resolver-initial-model-auth.test.js +64 -0
- package/packages/pi-coding-agent/dist/core/model-resolver-initial-model-auth.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 +23 -18
- package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.test.d.ts +8 -0
- package/packages/pi-coding-agent/dist/core/model-resolver.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-resolver.test.js +75 -0
- package/packages/pi-coding-agent/dist/core/model-resolver.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/retry-handler.d.ts +5 -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 +55 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.test.js +57 -0
- package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.d.ts +11 -0
- package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +47 -5
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/sdk.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/sdk.test.js +71 -0
- package/packages/pi-coding-agent/dist/core/sdk.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/index.d.ts +1 -1
- 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/components/__tests__/login-dialog.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/login-dialog.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/login-dialog.test.js +13 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/login-dialog.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +36 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.d.ts +4 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.js +24 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js +9 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +4 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +130 -12
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.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 +7 -2
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/model-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/model-controller.js +6 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/model-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +4 -3
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +4 -2
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/agent-session-renderable-tools.test.ts +70 -0
- package/packages/pi-coding-agent/src/core/agent-session.ts +2 -1
- package/packages/pi-coding-agent/src/core/auth-storage.test.ts +108 -0
- package/packages/pi-coding-agent/src/core/auth-storage.ts +30 -0
- package/packages/pi-coding-agent/src/core/model-resolver-initial-model-auth.test.ts +78 -0
- package/packages/pi-coding-agent/src/core/model-resolver.test.ts +85 -0
- package/packages/pi-coding-agent/src/core/model-resolver.ts +23 -18
- package/packages/pi-coding-agent/src/core/retry-handler.test.ts +83 -0
- package/packages/pi-coding-agent/src/core/retry-handler.ts +60 -1
- package/packages/pi-coding-agent/src/core/sdk.test.ts +89 -0
- package/packages/pi-coding-agent/src/core/sdk.ts +55 -9
- package/packages/pi-coding-agent/src/index.ts +1 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/login-dialog.test.ts +24 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +72 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/login-dialog.ts +30 -2
- package/packages/pi-coding-agent/src/modes/interactive/components/model-selector.ts +15 -6
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +131 -12
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +7 -2
- package/packages/pi-coding-agent/src/modes/interactive/controllers/model-controller.ts +6 -1
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +4 -3
- package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +4 -2
- package/packages/pi-tui/dist/components/__tests__/editor.test.js +12 -0
- package/packages/pi-tui/dist/components/__tests__/editor.test.js.map +1 -1
- package/packages/pi-tui/dist/components/__tests__/input.test.js +12 -0
- package/packages/pi-tui/dist/components/__tests__/input.test.js.map +1 -1
- package/packages/pi-tui/dist/keys.d.ts.map +1 -1
- package/packages/pi-tui/dist/keys.js +27 -0
- package/packages/pi-tui/dist/keys.js.map +1 -1
- package/packages/pi-tui/src/components/__tests__/editor.test.ts +18 -0
- package/packages/pi-tui/src/components/__tests__/input.test.ts +18 -0
- package/packages/pi-tui/src/keys.ts +32 -0
- package/pkg/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +1 -1
- package/src/resources/agents/debugger.md +58 -0
- package/src/resources/agents/doc-writer.md +43 -0
- package/src/resources/agents/git-ops.md +56 -0
- package/src/resources/agents/javascript-pro.md +46 -271
- package/src/resources/agents/planner.md +55 -0
- package/src/resources/agents/refactorer.md +47 -0
- package/src/resources/agents/reviewer.md +48 -0
- package/src/resources/agents/security.md +59 -0
- package/src/resources/agents/tester.md +50 -0
- package/src/resources/agents/typescript-pro.md +41 -235
- package/src/resources/extensions/async-jobs/await-tool.test.ts +40 -7
- package/src/resources/extensions/async-jobs/await-tool.ts +7 -4
- package/src/resources/extensions/async-jobs/job-manager.ts +33 -3
- package/src/resources/extensions/claude-code-cli/partial-builder.ts +45 -12
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +152 -13
- package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +91 -2
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +301 -6
- package/src/resources/extensions/gsd/auto/infra-errors.ts +38 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +2 -0
- package/src/resources/extensions/gsd/auto/loop.ts +134 -2
- package/src/resources/extensions/gsd/auto/phases.ts +6 -0
- package/src/resources/extensions/gsd/auto/session.ts +11 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +29 -18
- package/src/resources/extensions/gsd/auto-model-selection.ts +9 -1
- package/src/resources/extensions/gsd/auto-post-unit.ts +7 -0
- package/src/resources/extensions/gsd/auto-prompts.ts +111 -33
- package/src/resources/extensions/gsd/auto-recovery.ts +10 -0
- package/src/resources/extensions/gsd/auto-start.ts +41 -7
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +1 -1
- package/src/resources/extensions/gsd/auto-worktree.ts +1 -1
- package/src/resources/extensions/gsd/auto.ts +97 -20
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +3 -3
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +10 -10
- package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +79 -60
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +7 -0
- package/src/resources/extensions/gsd/commands/context.ts +16 -5
- package/src/resources/extensions/gsd/commands/dispatcher.ts +14 -2
- package/src/resources/extensions/gsd/commands/handlers/auto.ts +10 -36
- package/src/resources/extensions/gsd/commands/handlers/core.ts +58 -11
- package/src/resources/extensions/gsd/commands/handlers/notifications-handler.ts +17 -7
- package/src/resources/extensions/gsd/commands/handlers/workflow.ts +4 -10
- package/src/resources/extensions/gsd/commands-handlers.ts +5 -1
- package/src/resources/extensions/gsd/context-injector.ts +1 -1
- package/src/resources/extensions/gsd/custom-workflow-engine.ts +4 -8
- package/src/resources/extensions/gsd/dashboard-overlay.ts +10 -3
- package/src/resources/extensions/gsd/definition-io.ts +18 -0
- package/src/resources/extensions/gsd/dispatch-guard.ts +23 -1
- package/src/resources/extensions/gsd/doctor-providers.ts +24 -0
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +6 -3
- package/src/resources/extensions/gsd/error-classifier.ts +5 -2
- package/src/resources/extensions/gsd/forensics.ts +23 -7
- package/src/resources/extensions/gsd/gate-registry.ts +251 -0
- package/src/resources/extensions/gsd/git-service.ts +11 -8
- package/src/resources/extensions/gsd/gitignore.ts +12 -6
- package/src/resources/extensions/gsd/gsd-db.ts +105 -6
- package/src/resources/extensions/gsd/guided-flow.ts +5 -10
- package/src/resources/extensions/gsd/interrupted-session.ts +1 -0
- package/src/resources/extensions/gsd/key-manager.ts +2 -0
- package/src/resources/extensions/gsd/metrics.ts +12 -1
- package/src/resources/extensions/gsd/milestone-actions.ts +10 -3
- package/src/resources/extensions/gsd/milestone-validation-gates.ts +11 -13
- package/src/resources/extensions/gsd/notification-overlay.ts +47 -14
- package/src/resources/extensions/gsd/notification-store.ts +54 -5
- package/src/resources/extensions/gsd/notification-widget.ts +5 -14
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -3
- package/src/resources/extensions/gsd/pre-execution-checks.ts +39 -2
- package/src/resources/extensions/gsd/preferences-skills.ts +2 -36
- package/src/resources/extensions/gsd/preferences-types.ts +16 -0
- package/src/resources/extensions/gsd/preferences.ts +19 -6
- package/src/resources/extensions/gsd/prompt-loader.ts +6 -1
- package/src/resources/extensions/gsd/prompt-validation.ts +157 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +5 -3
- package/src/resources/extensions/gsd/prompts/discuss.md +123 -12
- package/src/resources/extensions/gsd/prompts/execute-task.md +22 -19
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +2 -0
- package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +2 -0
- package/src/resources/extensions/gsd/prompts/guided-resume-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/queue.md +3 -2
- package/src/resources/extensions/gsd/prompts/system.md +1 -0
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +4 -1
- package/src/resources/extensions/gsd/session-model-override.ts +36 -0
- package/src/resources/extensions/gsd/shortcut-defs.ts +56 -0
- package/src/resources/extensions/gsd/state.ts +33 -2
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/auto-start-model-capture.test.ts +25 -9
- package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +28 -0
- package/src/resources/extensions/gsd/tests/block-db-writes.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/complete-slice-gate-closure.test.ts +167 -0
- package/src/resources/extensions/gsd/tests/complete-slice-prompt-task-summary-layout.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/definition-io.test.ts +57 -0
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/doctor-heal-fixable-warnings.test.ts +14 -0
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/execute-task-prompt-existing-artifact-guard.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/false-degraded-mode-warning.test.ts +104 -0
- package/src/resources/extensions/gsd/tests/forensics-stuck-loops.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/format-shortcut.test.ts +31 -0
- package/src/resources/extensions/gsd/tests/gate-dispatch.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/gate-registry.test.ts +140 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +107 -5
- package/src/resources/extensions/gsd/tests/gsd-no-project-error.test.ts +73 -0
- package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +180 -0
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +66 -1
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +8 -6
- package/src/resources/extensions/gsd/tests/key-manager.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +54 -0
- package/src/resources/extensions/gsd/tests/model-isolation.test.ts +36 -51
- package/src/resources/extensions/gsd/tests/notification-store.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/notification-widget.test.ts +26 -0
- package/src/resources/extensions/gsd/tests/notifications-handler.test.ts +90 -0
- package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/plan-milestone-artifact-verification.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +49 -0
- package/src/resources/extensions/gsd/tests/preferences-formatting.test.ts +87 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/projection-regression.test.ts +96 -1
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/prompt-loader-working-directory.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/prompt-system-gate-coverage.test.ts +208 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +97 -0
- package/src/resources/extensions/gsd/tests/register-shortcuts.test.ts +63 -5
- package/src/resources/extensions/gsd/tests/session-model-override.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/stale-slice-rows.test.ts +41 -0
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +90 -0
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/validate-milestone-prompt-verification-classes.test.ts +18 -0
- package/src/resources/extensions/gsd/tools/complete-slice.ts +63 -0
- package/src/resources/extensions/gsd/tools/complete-task.ts +63 -0
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +4 -1
- package/src/resources/extensions/gsd/types.ts +26 -0
- package/src/resources/extensions/gsd/workflow-projections.ts +8 -0
- package/src/resources/extensions/gsd/worktree-manager.ts +29 -3
- package/src/resources/extensions/gsd/write-intercept.ts +10 -1
- package/src/resources/extensions/ollama/index.ts +17 -8
- package/src/resources/extensions/ollama/ollama-client.ts +35 -6
- package/src/resources/extensions/ollama/ollama-discovery.ts +37 -6
- package/src/resources/extensions/ollama/ollama-status-indicator.test.ts +28 -0
- package/src/resources/extensions/ollama/tests/ollama-discovery.test.ts +54 -0
- package/src/resources/extensions/shared/gsd-phase-state.ts +42 -0
- package/src/resources/extensions/shared/tests/gsd-phase-state.test.ts +48 -0
- package/src/resources/extensions/subagent/agents.ts +10 -0
- package/src/resources/extensions/subagent/index.ts +18 -0
- package/src/resources/extensions/subagent/tests/agents-conflicts.test.ts +33 -0
- package/src/resources/skills/create-skill/SKILL.md +2 -0
- package/dist/web/standalone/.next/static/chunks/app/page-7115e62689b5fd84.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/{nPky_WQC28aBD77eZsRAB → NzO79SOz9jHX-VY5-0t2O}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{nPky_WQC28aBD77eZsRAB → NzO79SOz9jHX-VY5-0t2O}/_ssgManifest.js +0 -0
|
@@ -21,7 +21,10 @@ import {
|
|
|
21
21
|
getMilestone,
|
|
22
22
|
updateSliceStatus,
|
|
23
23
|
setSliceSummaryMd,
|
|
24
|
+
saveGateResult,
|
|
25
|
+
getPendingGatesForTurn,
|
|
24
26
|
} from "../gsd-db.js";
|
|
27
|
+
import { getGatesForTurn } from "../gate-registry.js";
|
|
25
28
|
import { resolveSliceFile, resolveSlicePath, clearPathCache } from "../paths.js";
|
|
26
29
|
import { checkOwnership, sliceUnitKey } from "../unit-ownership.js";
|
|
27
30
|
import { saveFile, clearParseCache } from "../files.js";
|
|
@@ -39,6 +42,23 @@ export interface CompleteSliceResult {
|
|
|
39
42
|
uatPath: string;
|
|
40
43
|
}
|
|
41
44
|
|
|
45
|
+
/**
|
|
46
|
+
* Map a complete-slice-owned gate id to the CompleteSliceParams field
|
|
47
|
+
* whose presence drives `pass` vs. `omitted`. Keep this in lockstep with
|
|
48
|
+
* the gates declared in gate-registry.ts under ownerTurn "complete-slice".
|
|
49
|
+
*/
|
|
50
|
+
function sliceGateFieldForId(
|
|
51
|
+
id: string,
|
|
52
|
+
params: CompleteSliceParams,
|
|
53
|
+
): string | undefined {
|
|
54
|
+
switch (id) {
|
|
55
|
+
case "Q8":
|
|
56
|
+
return params.operationalReadiness;
|
|
57
|
+
default:
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
42
62
|
/**
|
|
43
63
|
* Render slice summary markdown matching the template format.
|
|
44
64
|
* YAML frontmatter uses snake_case keys for parseSummary() compatibility.
|
|
@@ -169,6 +189,10 @@ ${reqSurfaced}
|
|
|
169
189
|
|
|
170
190
|
${reqInvalidated}
|
|
171
191
|
|
|
192
|
+
## Operational Readiness
|
|
193
|
+
|
|
194
|
+
${params.operationalReadiness?.trim() || "None."}
|
|
195
|
+
|
|
172
196
|
## Deviations
|
|
173
197
|
|
|
174
198
|
${params.deviations || "None."}
|
|
@@ -330,6 +354,45 @@ export async function handleCompleteSlice(
|
|
|
330
354
|
// Store rendered markdown in DB for D004 recovery
|
|
331
355
|
setSliceSummaryMd(params.milestoneId, params.sliceId, summaryMd, uatMd);
|
|
332
356
|
|
|
357
|
+
// ── Close gates owned by complete-slice (Q8) ───────────────────────────
|
|
358
|
+
// Each owned gate maps to a specific summary section via the registry.
|
|
359
|
+
// If the caller populated the corresponding field, record `pass`; if the
|
|
360
|
+
// field is empty, record `omitted`. Without this loop, Q8 would stay
|
|
361
|
+
// pending forever and block future state derivation (see gate-registry).
|
|
362
|
+
try {
|
|
363
|
+
const pendingGates = getPendingGatesForTurn(
|
|
364
|
+
params.milestoneId,
|
|
365
|
+
params.sliceId,
|
|
366
|
+
"complete-slice",
|
|
367
|
+
);
|
|
368
|
+
if (pendingGates.length > 0) {
|
|
369
|
+
const ownedDefs = new Map(getGatesForTurn("complete-slice").map((g) => [g.id, g] as const));
|
|
370
|
+
for (const row of pendingGates) {
|
|
371
|
+
const def = ownedDefs.get(row.gate_id);
|
|
372
|
+
if (!def) continue;
|
|
373
|
+
// Map gate id → param field it maps to. Keep the map local so
|
|
374
|
+
// adding a new complete-slice gate is a single place change.
|
|
375
|
+
const field = sliceGateFieldForId(def.id, params);
|
|
376
|
+
const hasContent = typeof field === "string" && field.trim().length > 0;
|
|
377
|
+
saveGateResult({
|
|
378
|
+
milestoneId: params.milestoneId,
|
|
379
|
+
sliceId: params.sliceId,
|
|
380
|
+
gateId: def.id,
|
|
381
|
+
verdict: hasContent ? "pass" : "omitted",
|
|
382
|
+
rationale: hasContent
|
|
383
|
+
? `${def.promptSection} section populated in slice summary`
|
|
384
|
+
: `${def.promptSection} section left empty — recorded as omitted`,
|
|
385
|
+
findings: hasContent ? (field as string).trim() : "",
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
} catch (gateErr) {
|
|
390
|
+
logWarning(
|
|
391
|
+
"tool",
|
|
392
|
+
`complete-slice gate close warning for ${params.milestoneId}/${params.sliceId}: ${(gateErr as Error).message}`,
|
|
393
|
+
);
|
|
394
|
+
}
|
|
395
|
+
|
|
333
396
|
// Invalidate all caches
|
|
334
397
|
invalidateStateCache();
|
|
335
398
|
clearPathCache();
|
|
@@ -24,7 +24,10 @@ import {
|
|
|
24
24
|
updateTaskStatus,
|
|
25
25
|
setTaskSummaryMd,
|
|
26
26
|
deleteVerificationEvidence,
|
|
27
|
+
saveGateResult,
|
|
28
|
+
getPendingGatesForTurn,
|
|
27
29
|
} from "../gsd-db.js";
|
|
30
|
+
import { getGatesForTurn } from "../gate-registry.js";
|
|
28
31
|
import { resolveSliceFile, resolveTasksDir, clearPathCache } from "../paths.js";
|
|
29
32
|
import { checkOwnership, taskUnitKey } from "../unit-ownership.js";
|
|
30
33
|
import { saveFile, clearParseCache } from "../files.js";
|
|
@@ -44,6 +47,27 @@ export interface CompleteTaskResult {
|
|
|
44
47
|
|
|
45
48
|
import type { TaskRow } from "../gsd-db.js";
|
|
46
49
|
|
|
50
|
+
/**
|
|
51
|
+
* Map an execute-task-owned gate id to the CompleteTaskParams field whose
|
|
52
|
+
* presence drives `pass` vs. `omitted`. Keep in lockstep with the gates
|
|
53
|
+
* declared in gate-registry.ts under ownerTurn "execute-task".
|
|
54
|
+
*/
|
|
55
|
+
function taskGateFieldForId(
|
|
56
|
+
id: string,
|
|
57
|
+
params: CompleteTaskParams,
|
|
58
|
+
): string | undefined {
|
|
59
|
+
switch (id) {
|
|
60
|
+
case "Q5":
|
|
61
|
+
return params.failureModes;
|
|
62
|
+
case "Q6":
|
|
63
|
+
return params.loadProfile;
|
|
64
|
+
case "Q7":
|
|
65
|
+
return params.negativeTests;
|
|
66
|
+
default:
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
47
71
|
/**
|
|
48
72
|
* Normalize a list parameter that may arrive as a string (newline-delimited
|
|
49
73
|
* bullet list from the LLM) into a string array (#3361).
|
|
@@ -236,6 +260,45 @@ export async function handleCompleteTask(
|
|
|
236
260
|
// Store rendered markdown in DB for D004 recovery
|
|
237
261
|
setTaskSummaryMd(params.milestoneId, params.sliceId, params.taskId, summaryMd);
|
|
238
262
|
|
|
263
|
+
// ── Close gates owned by execute-task (Q5/Q6/Q7) for this task ────────
|
|
264
|
+
// Each gate id maps to a specific params field via taskGateFieldForId.
|
|
265
|
+
// When the model populates the field, record `pass`; when it's empty,
|
|
266
|
+
// record `omitted`. Task-scoped rows are filtered by taskId so a single
|
|
267
|
+
// task's completion doesn't touch sibling tasks' gate rows.
|
|
268
|
+
try {
|
|
269
|
+
const pendingGates = getPendingGatesForTurn(
|
|
270
|
+
params.milestoneId,
|
|
271
|
+
params.sliceId,
|
|
272
|
+
"execute-task",
|
|
273
|
+
params.taskId,
|
|
274
|
+
);
|
|
275
|
+
if (pendingGates.length > 0) {
|
|
276
|
+
const ownedDefs = new Map(getGatesForTurn("execute-task").map((g) => [g.id, g] as const));
|
|
277
|
+
for (const row of pendingGates) {
|
|
278
|
+
const def = ownedDefs.get(row.gate_id);
|
|
279
|
+
if (!def) continue;
|
|
280
|
+
const field = taskGateFieldForId(def.id, params);
|
|
281
|
+
const hasContent = typeof field === "string" && field.trim().length > 0;
|
|
282
|
+
saveGateResult({
|
|
283
|
+
milestoneId: params.milestoneId,
|
|
284
|
+
sliceId: params.sliceId,
|
|
285
|
+
taskId: params.taskId,
|
|
286
|
+
gateId: def.id,
|
|
287
|
+
verdict: hasContent ? "pass" : "omitted",
|
|
288
|
+
rationale: hasContent
|
|
289
|
+
? `${def.promptSection} section populated in task summary`
|
|
290
|
+
: `${def.promptSection} section left empty — recorded as omitted`,
|
|
291
|
+
findings: hasContent ? (field as string).trim() : "",
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
} catch (gateErr) {
|
|
296
|
+
logWarning(
|
|
297
|
+
"tool",
|
|
298
|
+
`complete-task gate close warning for ${params.milestoneId}/${params.sliceId}/${params.taskId}: ${(gateErr as Error).message}`,
|
|
299
|
+
);
|
|
300
|
+
}
|
|
301
|
+
|
|
239
302
|
// Invalidate all caches
|
|
240
303
|
invalidateStateCache();
|
|
241
304
|
clearPathCache();
|
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
_getAdapter,
|
|
9
9
|
saveGateResult,
|
|
10
10
|
} from "../gsd-db.js";
|
|
11
|
+
import { GATE_REGISTRY } from "../gate-registry.js";
|
|
11
12
|
import { saveArtifactToDb } from "../db-writer.js";
|
|
12
13
|
import type { CompleteMilestoneParams } from "./complete-milestone.js";
|
|
13
14
|
import { handleCompleteMilestone } from "./complete-milestone.js";
|
|
@@ -427,7 +428,9 @@ export async function executeSaveGateResult(
|
|
|
427
428
|
};
|
|
428
429
|
}
|
|
429
430
|
|
|
430
|
-
|
|
431
|
+
// Source of truth: gate-registry.ts. Every declared GateId is accepted,
|
|
432
|
+
// so adding a new gate in one place automatically flows through here.
|
|
433
|
+
const validGates = Object.keys(GATE_REGISTRY);
|
|
431
434
|
if (!validGates.includes(params.gateId)) {
|
|
432
435
|
return {
|
|
433
436
|
content: [{ type: "text", text: `Error: Invalid gateId "${params.gateId}". Must be one of: ${validGates.join(", ")}` }],
|
|
@@ -536,6 +536,24 @@ export interface CompleteTaskParams {
|
|
|
536
536
|
verdict: string;
|
|
537
537
|
durationMs: number;
|
|
538
538
|
}>;
|
|
539
|
+
/**
|
|
540
|
+
* Q5 failure-modes section content (what breaks when dependencies fail).
|
|
541
|
+
* Populated → `pass`; omitted/empty → `omitted`.
|
|
542
|
+
* @optional
|
|
543
|
+
*/
|
|
544
|
+
failureModes?: string;
|
|
545
|
+
/**
|
|
546
|
+
* Q6 load-profile section content (10x breakpoint + protection).
|
|
547
|
+
* Populated → `pass`; omitted/empty → `omitted`.
|
|
548
|
+
* @optional
|
|
549
|
+
*/
|
|
550
|
+
loadProfile?: string;
|
|
551
|
+
/**
|
|
552
|
+
* Q7 negative-tests section content (malformed inputs, error paths,
|
|
553
|
+
* boundaries). Populated → `pass`; omitted/empty → `omitted`.
|
|
554
|
+
* @optional
|
|
555
|
+
*/
|
|
556
|
+
negativeTests?: string;
|
|
539
557
|
/** Optional caller-provided identity for audit trail */
|
|
540
558
|
actorName?: string;
|
|
541
559
|
/** Optional caller-provided reason this action was triggered */
|
|
@@ -584,6 +602,14 @@ export interface CompleteSliceParams {
|
|
|
584
602
|
affects?: string[];
|
|
585
603
|
/** @optional — defaults to [] when omitted */
|
|
586
604
|
drillDownPaths?: string[];
|
|
605
|
+
/**
|
|
606
|
+
* Q8 operational readiness section content (health signal, failure signal,
|
|
607
|
+
* recovery, monitoring gaps). When populated, the complete-slice handler
|
|
608
|
+
* records Q8 as `pass`; when omitted or empty, Q8 is recorded as `omitted`.
|
|
609
|
+
* See gate-registry.ts.
|
|
610
|
+
* @optional
|
|
611
|
+
*/
|
|
612
|
+
operationalReadiness?: string;
|
|
587
613
|
/** Optional caller-provided identity for audit trail */
|
|
588
614
|
actorName?: string;
|
|
589
615
|
/** Optional caller-provided reason this action was triggered */
|
|
@@ -180,6 +180,14 @@ export function renderSummaryContent(
|
|
|
180
180
|
milestoneId: string,
|
|
181
181
|
evidence?: Array<{ command: string; exitCode?: number; exit_code?: number; verdict: string; durationMs?: number; duration_ms?: number }>,
|
|
182
182
|
): string {
|
|
183
|
+
// If the task already has a fully rendered summary (written by handleCompleteTask's
|
|
184
|
+
// renderSummaryMarkdown), use it as-is. That content already includes frontmatter,
|
|
185
|
+
// heading, and all sections. Re-wrapping it inside a second frontmatter/heading
|
|
186
|
+
// envelope produces double frontmatter and duplicate sections.
|
|
187
|
+
if (taskRow.full_summary_md && taskRow.full_summary_md.trimStart().startsWith("---")) {
|
|
188
|
+
return taskRow.full_summary_md;
|
|
189
|
+
}
|
|
190
|
+
|
|
183
191
|
// ── Frontmatter (YAML list format, matches parseSummary() expectations) ──
|
|
184
192
|
const keyFilesYaml = taskRow.key_files && taskRow.key_files.length > 0
|
|
185
193
|
? taskRow.key_files.map(f => ` - ${f}`).join("\n")
|
|
@@ -548,13 +548,39 @@ export function removeWorktree(
|
|
|
548
548
|
}
|
|
549
549
|
}
|
|
550
550
|
|
|
551
|
-
/**
|
|
552
|
-
|
|
553
|
-
|
|
551
|
+
/**
|
|
552
|
+
* Paths to skip in all worktree diffs (internal/runtime artifacts).
|
|
553
|
+
*
|
|
554
|
+
* NOTE: These arrays must stay synchronized with GSD_RUNTIME_PATTERNS in gitignore.ts.
|
|
555
|
+
* That file is the canonical source of truth for runtime ignore patterns.
|
|
556
|
+
* This module uses a split representation (paths/exact/prefixes) for efficient matching.
|
|
557
|
+
*/
|
|
558
|
+
const SKIP_PATHS = [
|
|
559
|
+
".gsd/worktrees/",
|
|
560
|
+
".gsd/runtime/",
|
|
561
|
+
".gsd/activity/",
|
|
562
|
+
".gsd/forensics/",
|
|
563
|
+
".gsd/parallel/",
|
|
564
|
+
".gsd/journal/",
|
|
565
|
+
];
|
|
566
|
+
const SKIP_EXACT = [
|
|
567
|
+
".gsd/STATE.md",
|
|
568
|
+
".gsd/auto.lock",
|
|
569
|
+
".gsd/metrics.json",
|
|
570
|
+
".gsd/state-manifest.json",
|
|
571
|
+
".gsd/doctor-history.jsonl",
|
|
572
|
+
".gsd/event-log.jsonl",
|
|
573
|
+
];
|
|
574
|
+
/** File prefixes to skip (for wildcard patterns like completed-units*.json, gsd.db*). */
|
|
575
|
+
const SKIP_PREFIXES = [
|
|
576
|
+
".gsd/completed-units",
|
|
577
|
+
".gsd/gsd.db",
|
|
578
|
+
];
|
|
554
579
|
|
|
555
580
|
function shouldSkipPath(filePath: string): boolean {
|
|
556
581
|
if (SKIP_PATHS.some(p => filePath.startsWith(p))) return true;
|
|
557
582
|
if (SKIP_EXACT.includes(filePath)) return true;
|
|
583
|
+
if (SKIP_PREFIXES.some(p => filePath.startsWith(p))) return true;
|
|
558
584
|
return false;
|
|
559
585
|
}
|
|
560
586
|
|
|
@@ -24,6 +24,9 @@ const BLOCKED_PATTERNS: RegExp[] = [
|
|
|
24
24
|
/(^|[/\\])\.gsd[/\\]STATE\.md$/i,
|
|
25
25
|
// Also match resolved symlink paths under ~/.gsd/projects/ (Pitfall #6)
|
|
26
26
|
/(^|[/\\])\.gsd[/\\]projects[/\\][^/\\]+[/\\]STATE\.md$/i,
|
|
27
|
+
// gsd.db and WAL/SHM files — single-writer WAL connection managed by engine (#3625)
|
|
28
|
+
/(^|[/\\])\.gsd[/\\]gsd\.db(-wal|-shm)?$/i,
|
|
29
|
+
/(^|[/\\])\.gsd[/\\]projects[/\\][^/\\]+[/\\]gsd\.db(-wal|-shm)?$/i,
|
|
27
30
|
];
|
|
28
31
|
|
|
29
32
|
/**
|
|
@@ -41,6 +44,12 @@ const BASH_STATE_PATTERNS: RegExp[] = [
|
|
|
41
44
|
/\bsed\b.*-i.*STATE\.md/i,
|
|
42
45
|
// dd output to STATE.md
|
|
43
46
|
/\bdd\b.*of=\S*STATE\.md/i,
|
|
47
|
+
// Direct DB access via sqlite3/sql.js/better-sqlite3 targeting gsd.db (#3625)
|
|
48
|
+
/\b(sqlite3|sql\.js|better-sqlite3|node:sqlite)\b.*gsd\.db/i,
|
|
49
|
+
/\bgsd\.db\b.*\b(sqlite3|sql\.js|better-sqlite3)\b/i,
|
|
50
|
+
// Shell writes targeting gsd.db files
|
|
51
|
+
/[>|]+\s*\S*gsd\.db/i,
|
|
52
|
+
/\b(cp|mv|dd)\b.*gsd\.db/i,
|
|
44
53
|
];
|
|
45
54
|
|
|
46
55
|
/**
|
|
@@ -81,7 +90,7 @@ function matchesBlockedPattern(path: string): boolean {
|
|
|
81
90
|
* Error message returned when an agent attempts to directly write an authoritative .gsd/ state file.
|
|
82
91
|
* Directs the agent to use engine tool calls instead.
|
|
83
92
|
*/
|
|
84
|
-
export const BLOCKED_WRITE_ERROR = `Direct writes to .gsd/STATE.md are blocked. Use engine tool calls instead:
|
|
93
|
+
export const BLOCKED_WRITE_ERROR = `Direct writes to .gsd/STATE.md and .gsd/gsd.db are blocked. Use engine tool calls instead:
|
|
85
94
|
- To complete a task: call gsd_complete_task(milestone_id, slice_id, task_id, summary)
|
|
86
95
|
- To complete a slice: call gsd_complete_slice(milestone_id, slice_id, summary, uat_result)
|
|
87
96
|
- To save a decision: call gsd_save_decision(scope, decision, choice, rationale)
|
|
@@ -57,17 +57,24 @@ async function probeAndRegister(pi: ExtensionAPI): Promise<boolean> {
|
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
const models = await discoverModels();
|
|
60
|
-
if (models.length === 0)
|
|
60
|
+
if (models.length === 0) {
|
|
61
|
+
// No local models means there's nothing usable to register in GSD.
|
|
62
|
+
// Keep the footer/status clean instead of advertising Ollama availability.
|
|
63
|
+
if (providerRegistered) {
|
|
64
|
+
pi.unregisterProvider("ollama");
|
|
65
|
+
providerRegistered = false;
|
|
66
|
+
}
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
61
69
|
|
|
62
70
|
const baseUrl = client.getOllamaHost();
|
|
63
71
|
|
|
64
|
-
// Use authMode "apiKey"
|
|
65
|
-
//
|
|
66
|
-
//
|
|
67
|
-
// Authorization header so the dummy key is harmless.
|
|
72
|
+
// Use authMode "apiKey" (#3440). Local Ollama ignores the Authorization header,
|
|
73
|
+
// so the "ollama" fallback is harmless. For cloud endpoints (OLLAMA_HOST pointing
|
|
74
|
+
// to ollama.com or a remote instance), OLLAMA_API_KEY is picked up here.
|
|
68
75
|
pi.registerProvider("ollama", {
|
|
69
76
|
authMode: "apiKey",
|
|
70
|
-
apiKey: "ollama",
|
|
77
|
+
apiKey: process.env.OLLAMA_API_KEY ?? "ollama",
|
|
71
78
|
baseUrl,
|
|
72
79
|
api: "ollama-chat",
|
|
73
80
|
streamSimple: streamOllamaChat,
|
|
@@ -115,9 +122,11 @@ export default function ollama(pi: ExtensionAPI) {
|
|
|
115
122
|
} else {
|
|
116
123
|
probeAndRegister(pi)
|
|
117
124
|
.then((found) => {
|
|
118
|
-
|
|
125
|
+
ctx.ui.setStatus("ollama", found ? "Ollama" : undefined);
|
|
119
126
|
})
|
|
120
|
-
.catch(() => {
|
|
127
|
+
.catch(() => {
|
|
128
|
+
ctx.ui.setStatus("ollama", undefined);
|
|
129
|
+
});
|
|
121
130
|
}
|
|
122
131
|
});
|
|
123
132
|
|
|
@@ -34,11 +34,34 @@ export function getOllamaHost(): string {
|
|
|
34
34
|
return `http://${host}`;
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
+
/**
|
|
38
|
+
* Get auth headers for Ollama API requests.
|
|
39
|
+
* For cloud endpoints (OLLAMA_HOST pointing to ollama.com or remote instances),
|
|
40
|
+
* OLLAMA_API_KEY is used as a Bearer token. Local Ollama ignores the header.
|
|
41
|
+
*/
|
|
42
|
+
function getAuthHeaders(): Record<string, string> {
|
|
43
|
+
const apiKey = process.env.OLLAMA_API_KEY;
|
|
44
|
+
if (!apiKey) return {};
|
|
45
|
+
return { Authorization: `Bearer ${apiKey}` };
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Merge auth headers into request options.
|
|
50
|
+
*/
|
|
51
|
+
function withAuth(options: RequestInit = {}): RequestInit {
|
|
52
|
+
const authHeaders = getAuthHeaders();
|
|
53
|
+
if (Object.keys(authHeaders).length === 0) return options;
|
|
54
|
+
return {
|
|
55
|
+
...options,
|
|
56
|
+
headers: { ...authHeaders, ...(options.headers as Record<string, string> || {}) },
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
37
60
|
async function fetchWithTimeout(url: string, options: RequestInit = {}, timeoutMs = REQUEST_TIMEOUT_MS): Promise<Response> {
|
|
38
61
|
const controller = new AbortController();
|
|
39
62
|
const timeout = setTimeout(() => controller.abort(), timeoutMs);
|
|
40
63
|
try {
|
|
41
|
-
return await fetch(url, { ...options, signal: controller.signal });
|
|
64
|
+
return await fetch(url, withAuth({ ...options, signal: controller.signal }));
|
|
42
65
|
} finally {
|
|
43
66
|
clearTimeout(timeout);
|
|
44
67
|
}
|
|
@@ -46,10 +69,16 @@ async function fetchWithTimeout(url: string, options: RequestInit = {}, timeoutM
|
|
|
46
69
|
|
|
47
70
|
/**
|
|
48
71
|
* Check if Ollama is running and reachable.
|
|
72
|
+
* For cloud endpoints (OLLAMA_HOST pointing to ollama.com), uses /api/tags
|
|
73
|
+
* as the probe since the root endpoint may not be available.
|
|
49
74
|
*/
|
|
50
75
|
export async function isRunning(): Promise<boolean> {
|
|
51
76
|
try {
|
|
52
|
-
const
|
|
77
|
+
const host = getOllamaHost();
|
|
78
|
+
const isCloud = host.includes("ollama.com") || host.includes("cloud");
|
|
79
|
+
const probeUrl = isCloud ? `${host}/api/tags` : `${host}/`;
|
|
80
|
+
const timeout = isCloud ? REQUEST_TIMEOUT_MS : PROBE_TIMEOUT_MS;
|
|
81
|
+
const response = await fetchWithTimeout(probeUrl, isCloud ? { method: "GET" } : {}, timeout);
|
|
53
82
|
return response.ok;
|
|
54
83
|
} catch {
|
|
55
84
|
return false;
|
|
@@ -117,12 +146,12 @@ export async function pullModel(
|
|
|
117
146
|
onProgress?: (progress: OllamaPullProgress) => void,
|
|
118
147
|
signal?: AbortSignal,
|
|
119
148
|
): Promise<void> {
|
|
120
|
-
const response = await fetch(`${getOllamaHost()}/api/pull`, {
|
|
149
|
+
const response = await fetch(`${getOllamaHost()}/api/pull`, withAuth({
|
|
121
150
|
method: "POST",
|
|
122
151
|
headers: { "Content-Type": "application/json" },
|
|
123
152
|
body: JSON.stringify({ name, stream: true }),
|
|
124
153
|
signal,
|
|
125
|
-
});
|
|
154
|
+
}));
|
|
126
155
|
|
|
127
156
|
if (!response.ok) {
|
|
128
157
|
const text = await response.text();
|
|
@@ -146,12 +175,12 @@ export async function* chat(
|
|
|
146
175
|
request: OllamaChatRequest,
|
|
147
176
|
signal?: AbortSignal,
|
|
148
177
|
): AsyncGenerator<OllamaChatResponse> {
|
|
149
|
-
const response = await fetch(`${getOllamaHost()}/api/chat`, {
|
|
178
|
+
const response = await fetch(`${getOllamaHost()}/api/chat`, withAuth({
|
|
150
179
|
method: "POST",
|
|
151
180
|
headers: { "Content-Type": "application/json" },
|
|
152
181
|
body: JSON.stringify(request),
|
|
153
182
|
signal,
|
|
154
|
-
});
|
|
183
|
+
}));
|
|
155
184
|
|
|
156
185
|
if (!response.ok) {
|
|
157
186
|
const text = await response.text();
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* Returns models in the format expected by pi.registerProvider().
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
-
import { listModels } from "./ollama-client.js";
|
|
11
|
+
import { listModels, showModel } from "./ollama-client.js";
|
|
12
12
|
import {
|
|
13
13
|
estimateContextFromParams,
|
|
14
14
|
formatModelSize,
|
|
@@ -17,6 +17,24 @@ import {
|
|
|
17
17
|
} from "./model-capabilities.js";
|
|
18
18
|
import type { OllamaChatOptions, OllamaModelInfo } from "./types.js";
|
|
19
19
|
|
|
20
|
+
/**
|
|
21
|
+
* Extract context window from /api/show model_info.
|
|
22
|
+
* Keys follow the pattern "{architecture}.context_length" (e.g. "llama.context_length").
|
|
23
|
+
*/
|
|
24
|
+
function extractContextFromModelInfo(modelInfo: Record<string, unknown>): number | undefined {
|
|
25
|
+
for (const [key, value] of Object.entries(modelInfo)) {
|
|
26
|
+
if (key.endsWith(".context_length") && typeof value === "number" && value > 0) {
|
|
27
|
+
return value;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
type ClientDeps = {
|
|
34
|
+
listModels: typeof listModels;
|
|
35
|
+
showModel: typeof showModel;
|
|
36
|
+
};
|
|
37
|
+
|
|
20
38
|
export interface DiscoveredOllamaModel {
|
|
21
39
|
id: string;
|
|
22
40
|
name: string;
|
|
@@ -35,13 +53,26 @@ export interface DiscoveredOllamaModel {
|
|
|
35
53
|
|
|
36
54
|
const ZERO_COST = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };
|
|
37
55
|
|
|
38
|
-
function enrichModel(info: OllamaModelInfo): DiscoveredOllamaModel {
|
|
56
|
+
async function enrichModel(info: OllamaModelInfo, deps: ClientDeps): Promise<DiscoveredOllamaModel> {
|
|
39
57
|
const caps = getModelCapabilities(info.name);
|
|
40
58
|
const parameterSize = info.details?.parameter_size ?? "";
|
|
41
59
|
|
|
42
|
-
//
|
|
60
|
+
// /api/tags doesn't include context length; /api/show does via "{arch}.context_length" in model_info.
|
|
61
|
+
let showContextWindow: number | undefined;
|
|
62
|
+
if (caps.contextWindow === undefined) {
|
|
63
|
+
try {
|
|
64
|
+
const showData = await deps.showModel(info.name);
|
|
65
|
+
showContextWindow = extractContextFromModelInfo(showData.model_info);
|
|
66
|
+
} catch (err) {
|
|
67
|
+
// non-fatal: fall through to estimate
|
|
68
|
+
if (process.env.GSD_DEBUG) console.warn(`[ollama] /api/show failed for ${info.name}:`, err instanceof Error ? err.message : String(err));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Determine context window: known table > /api/show > estimate from param size > default
|
|
43
73
|
const contextWindow =
|
|
44
74
|
caps.contextWindow ??
|
|
75
|
+
showContextWindow ??
|
|
45
76
|
(parameterSize ? estimateContextFromParams(parameterSize) : 8192);
|
|
46
77
|
|
|
47
78
|
// Determine max tokens: known table > fraction of context > default
|
|
@@ -73,11 +104,11 @@ function enrichModel(info: OllamaModelInfo): DiscoveredOllamaModel {
|
|
|
73
104
|
/**
|
|
74
105
|
* Discover all locally available Ollama models with enriched capabilities.
|
|
75
106
|
*/
|
|
76
|
-
export async function discoverModels(): Promise<DiscoveredOllamaModel[]> {
|
|
77
|
-
const tags = await listModels();
|
|
107
|
+
export async function discoverModels(deps: ClientDeps = { listModels, showModel }): Promise<DiscoveredOllamaModel[]> {
|
|
108
|
+
const tags = await deps.listModels();
|
|
78
109
|
if (!tags.models || tags.models.length === 0) return [];
|
|
79
110
|
|
|
80
|
-
return tags.models.map(enrichModel);
|
|
111
|
+
return Promise.all(tags.models.map((m) => enrichModel(m, deps)));
|
|
81
112
|
}
|
|
82
113
|
|
|
83
114
|
/**
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Regression test: don't show an Ollama footer status unless Ollama is
|
|
3
|
+
* actually usable (running with at least one discovered model).
|
|
4
|
+
*/
|
|
5
|
+
import { test } from "node:test";
|
|
6
|
+
import assert from "node:assert/strict";
|
|
7
|
+
import { readFileSync } from "node:fs";
|
|
8
|
+
import { join, dirname } from "node:path";
|
|
9
|
+
import { fileURLToPath } from "node:url";
|
|
10
|
+
|
|
11
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
12
|
+
const src = readFileSync(join(__dirname, "index.ts"), "utf-8");
|
|
13
|
+
|
|
14
|
+
test("probeAndRegister returns false when no Ollama models are discovered", () => {
|
|
15
|
+
assert.match(
|
|
16
|
+
src,
|
|
17
|
+
/if \(models\.length === 0\)[\s\S]*return false;/,
|
|
18
|
+
"running-without-models should not be treated as available",
|
|
19
|
+
);
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
test("interactive session clears ollama footer status when unavailable", () => {
|
|
23
|
+
assert.match(
|
|
24
|
+
src,
|
|
25
|
+
/ctx\.ui\.setStatus\("ollama", found \? "Ollama" : undefined\)/,
|
|
26
|
+
"status should be cleared when probeAndRegister reports unavailable",
|
|
27
|
+
);
|
|
28
|
+
});
|
|
@@ -1 +1,55 @@
|
|
|
1
1
|
// GSD2 — Tests for Ollama model discovery and enrichment
|
|
2
|
+
import { describe, it } from "node:test";
|
|
3
|
+
import assert from "node:assert/strict";
|
|
4
|
+
import { discoverModels } from "../ollama-discovery.js";
|
|
5
|
+
import type { OllamaTagsResponse, OllamaShowResponse } from "../types.js";
|
|
6
|
+
|
|
7
|
+
const EMPTY_DETAILS = { parent_model: "", format: "", family: "", families: null, parameter_size: "", quantization_level: "" };
|
|
8
|
+
|
|
9
|
+
function modelStub(name: string, parameterSize = "") {
|
|
10
|
+
return { name, model: name, modified_at: "", size: 0, digest: "", details: { ...EMPTY_DETAILS, parameter_size: parameterSize } };
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function tagsStub(name: string, parameterSize = ""): OllamaTagsResponse {
|
|
14
|
+
return { models: [modelStub(name, parameterSize)] };
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function showStub(modelInfo: Record<string, unknown>): OllamaShowResponse {
|
|
18
|
+
return { modelfile: "", parameters: "", template: "", details: EMPTY_DETAILS, model_info: modelInfo };
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
describe("discoverModels — context window resolution", () => {
|
|
22
|
+
it("uses known table context window without calling /api/show", async () => {
|
|
23
|
+
let showCalled = false;
|
|
24
|
+
const models = await discoverModels({
|
|
25
|
+
listModels: async () => tagsStub("llama3.2:latest", "3B"),
|
|
26
|
+
showModel: async () => { showCalled = true; throw new Error("should not be called"); },
|
|
27
|
+
});
|
|
28
|
+
assert.equal(models[0].contextWindow, 131072);
|
|
29
|
+
assert.equal(showCalled, false);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it("uses context_length from /api/show model_info for unknown model", async () => {
|
|
33
|
+
const models = await discoverModels({
|
|
34
|
+
listModels: async () => tagsStub("gemini-3-flash-preview:latest"),
|
|
35
|
+
showModel: async () => showStub({ "gemini.context_length": 1048576 }),
|
|
36
|
+
});
|
|
37
|
+
assert.equal(models[0].contextWindow, 1048576);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it("falls back to 8192 when /api/show model_info has no context_length key", async () => {
|
|
41
|
+
const models = await discoverModels({
|
|
42
|
+
listModels: async () => tagsStub("unknown-model:latest"),
|
|
43
|
+
showModel: async () => showStub({}),
|
|
44
|
+
});
|
|
45
|
+
assert.equal(models[0].contextWindow, 8192);
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it("falls back to 8192 when /api/show throws", async () => {
|
|
49
|
+
const models = await discoverModels({
|
|
50
|
+
listModels: async () => tagsStub("unknown-model:latest"),
|
|
51
|
+
showModel: async () => { throw new Error("network error"); },
|
|
52
|
+
});
|
|
53
|
+
assert.equal(models[0].contextWindow, 8192);
|
|
54
|
+
});
|
|
55
|
+
});
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GSD Phase State — cross-extension coordination
|
|
3
|
+
* Copyright (c) 2026 Jeremy McSpadden <jeremy@fluxlabs.net>
|
|
4
|
+
*
|
|
5
|
+
* Lightweight module-level state that GSD auto-mode writes to and the
|
|
6
|
+
* subagent tool reads from. Both extensions run in the same process so
|
|
7
|
+
* a module variable is sufficient — no file I/O needed.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
let _active = false;
|
|
11
|
+
let _currentPhase: string | null = null;
|
|
12
|
+
|
|
13
|
+
/** Mark GSD auto-mode as active. */
|
|
14
|
+
export function activateGSD(): void {
|
|
15
|
+
_active = true;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/** Mark GSD auto-mode as inactive and clear the current phase. */
|
|
19
|
+
export function deactivateGSD(): void {
|
|
20
|
+
_active = false;
|
|
21
|
+
_currentPhase = null;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** Set the currently dispatched GSD phase (e.g. "plan-milestone"). */
|
|
25
|
+
export function setCurrentPhase(phase: string): void {
|
|
26
|
+
_currentPhase = phase;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** Clear the current phase (unit completed or aborted). */
|
|
30
|
+
export function clearCurrentPhase(): void {
|
|
31
|
+
_currentPhase = null;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** Returns true if GSD auto-mode is currently active. */
|
|
35
|
+
export function isGSDActive(): boolean {
|
|
36
|
+
return _active;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** Returns the current GSD phase, or null if none is active. */
|
|
40
|
+
export function getCurrentPhase(): string | null {
|
|
41
|
+
return _active ? _currentPhase : null;
|
|
42
|
+
}
|