gsd-pi 2.78.0 → 2.78.1-dev.84a383f51
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 +59 -23
- package/dist/claude-cli-check.js +91 -32
- package/dist/cli-policy.d.ts +13 -0
- package/dist/cli-policy.js +17 -0
- package/dist/cli.js +95 -55
- package/dist/headless-query.d.ts +22 -0
- package/dist/headless-query.js +24 -4
- package/dist/headless.d.ts +10 -0
- package/dist/headless.js +16 -1
- package/dist/loader.js +7 -10
- package/dist/onboarding.d.ts +10 -0
- package/dist/onboarding.js +2 -2
- package/dist/provider-migrations.d.ts +2 -2
- package/dist/provider-migrations.js +5 -2
- package/dist/resource-loader.d.ts +5 -2
- package/dist/resource-loader.js +28 -5
- package/dist/resources/.managed-resources-content-hash +1 -0
- package/dist/resources/extensions/claude-code-cli/readiness.js +115 -31
- package/dist/resources/extensions/gsd/auto/loop.js +23 -0
- package/dist/resources/extensions/gsd/auto/phases.js +2 -2
- package/dist/resources/extensions/gsd/auto/run-unit.js +3 -1
- package/dist/resources/extensions/gsd/auto/session.js +3 -0
- package/dist/resources/extensions/gsd/auto-recovery.js +43 -4
- package/dist/resources/extensions/gsd/auto-runtime-state.js +31 -0
- package/dist/resources/extensions/gsd/auto-start.js +1 -1
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +2 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +30 -0
- package/dist/resources/extensions/gsd/auto.js +14 -5
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +14 -2
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +7 -5
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +5 -4
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +94 -31
- package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +11 -6
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +34 -8
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +38 -2
- package/dist/resources/extensions/gsd/commands/catalog.js +69 -5
- package/dist/resources/extensions/gsd/commands/handlers/core.js +22 -1
- package/dist/resources/extensions/gsd/commands-mcp-status.js +3 -1
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +10 -1
- package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +4 -0
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +39 -1
- package/dist/resources/extensions/gsd/error-classifier.js +1 -1
- package/dist/resources/extensions/gsd/forensics.js +2 -2
- package/dist/resources/extensions/gsd/git-service.js +12 -5
- package/dist/resources/extensions/gsd/gsd-db.js +11 -2
- package/dist/resources/extensions/gsd/guided-flow.js +23 -23
- package/dist/resources/extensions/gsd/memory-store.js +66 -31
- package/dist/resources/extensions/gsd/milestone-id-reservation.js +36 -0
- package/dist/resources/extensions/gsd/model-router.js +114 -9
- package/dist/resources/extensions/gsd/native-git-bridge.js +7 -1
- package/dist/resources/extensions/gsd/preferences-models.js +91 -15
- package/dist/resources/extensions/gsd/preferences-types.js +2 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +32 -0
- package/dist/resources/extensions/gsd/preferences.js +5 -3
- package/dist/resources/extensions/gsd/prompt-loader.js +23 -12
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +9 -3
- package/dist/resources/extensions/gsd/state.js +42 -0
- package/dist/resources/extensions/gsd/templates/PREFERENCES.md +1 -0
- package/dist/resources/extensions/gsd/tools/memory-tools.js +18 -1
- package/dist/resources/extensions/gsd/visualizer-overlay.js +1 -1
- package/dist/resources/extensions/gsd/watch/header-renderer.js +3 -1
- package/dist/resources/extensions/gsd/worktree-command.js +26 -46
- package/dist/resources/extensions/gsd/worktree-session-state.js +33 -0
- package/dist/resources/extensions/mcp-client/index.js +6 -3
- package/dist/resources/extensions/slash-commands/create-extension.js +36 -22
- package/dist/resources/skills/create-gsd-extension/SKILL.md +9 -5
- package/dist/resources/skills/create-gsd-extension/references/custom-commands.md +1 -1
- package/dist/resources/skills/create-gsd-extension/references/custom-rendering.md +5 -5
- package/dist/resources/skills/create-gsd-extension/references/custom-tools.md +4 -4
- package/dist/resources/skills/create-gsd-extension/references/custom-ui.md +6 -6
- package/dist/resources/skills/create-gsd-extension/references/events-reference.md +3 -3
- package/dist/resources/skills/create-gsd-extension/references/packaging-distribution.md +1 -1
- package/dist/resources/skills/create-gsd-extension/references/remote-execution-overrides.md +3 -3
- package/dist/resources/skills/create-gsd-extension/workflows/create-extension.md +32 -12
- package/dist/rtk-shared.d.ts +3 -0
- package/dist/rtk-shared.js +17 -0
- package/dist/rtk.d.ts +2 -5
- package/dist/rtk.js +3 -20
- package/dist/runtime-checks.d.ts +27 -0
- package/dist/runtime-checks.js +38 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +13 -13
- package/dist/web/standalone/.next/build-manifest.json +4 -4
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +44 -4
- 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 +4 -2
- package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +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 +13 -13
- package/dist/web/standalone/.next/server/chunks/63.js +3 -3
- package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware.js +2 -2
- package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
- package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +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/2556.0527fea66e123b7f.js +1 -0
- package/dist/web/standalone/.next/static/chunks/2824.08296bc2f9654698.js +1 -0
- package/dist/web/standalone/.next/static/chunks/3026.3af53b279375f082.js +1 -0
- package/dist/web/standalone/.next/static/chunks/315.6f68ae79b67d25cf.js +1 -0
- package/dist/web/standalone/.next/static/chunks/3497.4bfc60a3b3dea717.js +1 -0
- package/dist/web/standalone/.next/static/chunks/5516.4a07c872b5c3a663.js +1 -0
- package/dist/web/standalone/.next/static/chunks/8336.31b019697882acfb.js +10 -0
- package/dist/web/standalone/.next/static/chunks/8845.c9702695e8c5a9c5.js +2 -0
- package/dist/web/standalone/.next/static/chunks/9058.01ef3a463bda88f1.js +20 -0
- package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-9bf2e0c50fb2ca05.js +1 -0
- package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
- package/dist/web/standalone/.next/static/chunks/webpack-f9f0dc45e4f3ac10.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/package.json +2 -1
- package/dist/web/standalone/server.js +1 -1
- package/dist/worktree-status-banner.d.ts +1 -0
- package/dist/worktree-status-banner.js +132 -0
- package/package.json +1 -1
- package/packages/daemon/package.json +2 -2
- package/packages/mcp-server/dist/alias-telemetry.d.ts +8 -0
- package/packages/mcp-server/dist/alias-telemetry.d.ts.map +1 -0
- package/packages/mcp-server/dist/alias-telemetry.js +30 -0
- package/packages/mcp-server/dist/alias-telemetry.js.map +1 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +74 -46
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +2 -2
- package/packages/mcp-server/src/alias-telemetry.test.ts +78 -0
- package/packages/mcp-server/src/alias-telemetry.ts +30 -0
- package/packages/mcp-server/src/workflow-tools.test.ts +26 -0
- package/packages/mcp-server/src/workflow-tools.ts +93 -58
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.js +231 -0
- package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.js.map +1 -0
- package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.js +48 -19
- package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
- package/packages/pi-ai/dist/types.d.ts +13 -0
- 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/repair-tool-json.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/repair-tool-json.js +24 -3
- package/packages/pi-ai/dist/utils/repair-tool-json.js.map +1 -1
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js +26 -0
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-ai/src/providers/anthropic-shared.cache-breakpoint.test.ts +289 -0
- package/packages/pi-ai/src/providers/anthropic-shared.ts +52 -20
- package/packages/pi-ai/src/types.ts +13 -0
- package/packages/pi-ai/src/utils/repair-tool-json.ts +24 -3
- package/packages/pi-ai/src/utils/tests/repair-tool-json.test.ts +32 -0
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +6 -0
- package/packages/pi-coding-agent/dist/core/agent-session.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 +4 -0
- package/packages/pi-coding-agent/dist/core/messages.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +19 -2
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts +10 -0
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +18 -0
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +13 -0
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.js +20 -16
- package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/token-telemetry.d.ts +37 -0
- package/packages/pi-coding-agent/dist/core/token-telemetry.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/token-telemetry.js +49 -0
- package/packages/pi-coding-agent/dist/core/token-telemetry.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +133 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +14 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.js +78 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/tests/token-telemetry.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/tests/token-telemetry.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/tests/token-telemetry.test.js +181 -0
- package/packages/pi-coding-agent/dist/tests/token-telemetry.test.js.map +1 -0
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +7 -0
- package/packages/pi-coding-agent/src/core/messages.ts +4 -0
- package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +32 -2
- package/packages/pi-coding-agent/src/core/model-registry.ts +21 -0
- package/packages/pi-coding-agent/src/core/system-prompt.ts +33 -15
- package/packages/pi-coding-agent/src/core/token-telemetry.ts +77 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +212 -0
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +17 -1
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +1 -1
- package/packages/pi-coding-agent/src/tests/system-prompt-cache-stability.test.ts +102 -0
- package/packages/pi-coding-agent/src/tests/token-telemetry.test.ts +200 -0
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/dist/__tests__/autocomplete.test.js +17 -3
- package/packages/pi-tui/dist/__tests__/autocomplete.test.js.map +1 -1
- package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.d.ts +2 -0
- package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.js +161 -0
- package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.js.map +1 -0
- package/packages/pi-tui/package.json +1 -1
- package/packages/pi-tui/src/__tests__/autocomplete.test.ts +20 -3
- package/packages/pi-tui/src/components/__tests__/leak-fixes-runtime.test.ts +219 -0
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/packages/rpc-client/package.json +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/extensions/claude-code-cli/readiness.ts +116 -29
- package/src/resources/extensions/gsd/auto/loop.ts +24 -2
- package/src/resources/extensions/gsd/auto/phases.ts +3 -3
- package/src/resources/extensions/gsd/auto/run-unit.ts +3 -1
- package/src/resources/extensions/gsd/auto/session.ts +3 -0
- package/src/resources/extensions/gsd/auto/types.ts +1 -0
- package/src/resources/extensions/gsd/auto-recovery.ts +46 -8
- package/src/resources/extensions/gsd/auto-runtime-state.ts +51 -0
- package/src/resources/extensions/gsd/auto-start.ts +1 -1
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +2 -4
- package/src/resources/extensions/gsd/auto-worktree.ts +38 -0
- package/src/resources/extensions/gsd/auto.ts +14 -4
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +15 -13
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +8 -7
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +10 -9
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +102 -31
- package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +12 -6
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +39 -8
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +39 -11
- package/src/resources/extensions/gsd/commands/catalog.ts +75 -5
- package/src/resources/extensions/gsd/commands/handlers/core.ts +22 -1
- package/src/resources/extensions/gsd/commands-mcp-status.ts +3 -1
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +15 -1
- package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
- package/src/resources/extensions/gsd/docs/preferences-reference.md +4 -0
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +39 -1
- package/src/resources/extensions/gsd/doctor-types.ts +3 -1
- package/src/resources/extensions/gsd/error-classifier.ts +1 -1
- package/src/resources/extensions/gsd/forensics.ts +2 -2
- package/src/resources/extensions/gsd/git-service.ts +13 -5
- package/src/resources/extensions/gsd/gsd-db.ts +12 -2
- package/src/resources/extensions/gsd/guided-flow.ts +25 -25
- package/src/resources/extensions/gsd/memory-store.ts +81 -28
- package/src/resources/extensions/gsd/milestone-id-reservation.ts +47 -0
- package/src/resources/extensions/gsd/model-router.ts +172 -9
- package/src/resources/extensions/gsd/native-git-bridge.ts +7 -1
- package/src/resources/extensions/gsd/preferences-models.ts +101 -15
- package/src/resources/extensions/gsd/preferences-types.ts +6 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +35 -0
- package/src/resources/extensions/gsd/preferences.ts +16 -2
- package/src/resources/extensions/gsd/prompt-loader.ts +26 -12
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +9 -3
- package/src/resources/extensions/gsd/state.ts +42 -0
- package/src/resources/extensions/gsd/templates/PREFERENCES.md +1 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +178 -1
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +58 -0
- package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +9 -5
- package/src/resources/extensions/gsd/tests/auto-supervisor.test.mjs +21 -4
- package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/budget-prediction.test.ts +138 -211
- package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +142 -59
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +7 -4
- package/src/resources/extensions/gsd/tests/completed-at-reconcile.test.ts +89 -32
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +41 -23
- package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +3 -43
- package/src/resources/extensions/gsd/tests/debug-logger.test.ts +5 -3
- package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +116 -0
- package/src/resources/extensions/gsd/tests/discuss-empty-db-fallback.test.ts +22 -87
- package/src/resources/extensions/gsd/tests/discuss-queued-milestones.test.ts +7 -118
- package/src/resources/extensions/gsd/tests/discuss-tool-scope-leak.test.ts +18 -60
- package/src/resources/extensions/gsd/tests/doctor-orphan-milestone-4996.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +14 -76
- package/src/resources/extensions/gsd/tests/ensure-preconditions-guard-4996.test.ts +93 -0
- package/src/resources/extensions/gsd/tests/false-degraded-mode-warning.test.ts +22 -83
- package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +1 -63
- package/src/resources/extensions/gsd/tests/find-missing-summaries-closed-runtime.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/forensics-stuck-loops.test.ts +26 -1
- package/src/resources/extensions/gsd/tests/gitignore-bg-shell-runtime.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/gsd-no-project-error-runtime.test.ts +81 -0
- package/src/resources/extensions/gsd/tests/headless-answers.test.ts +14 -4
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +22 -12
- package/src/resources/extensions/gsd/tests/help-menu-coverage.test.ts +57 -0
- package/src/resources/extensions/gsd/tests/import-done-milestones-runtime.test.ts +145 -0
- package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +64 -1
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/integration/token-savings.test.ts +0 -23
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +128 -0
- package/src/resources/extensions/gsd/tests/memory-tools.test.ts +33 -1
- package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +124 -0
- package/src/resources/extensions/gsd/tests/milestone-id-gap-reuse-4996.test.ts +152 -0
- package/src/resources/extensions/gsd/tests/model-router.test.ts +169 -8
- package/src/resources/extensions/gsd/tests/native-git-infra-errors.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +32 -43
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +4 -10
- package/src/resources/extensions/gsd/tests/preferences.test.ts +127 -0
- package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +6 -6
- package/src/resources/extensions/gsd/tests/register-hooks-compaction-checkpoint.test.ts +93 -0
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +168 -19
- package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +7 -1
- package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +23 -1
- package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +101 -0
- package/src/resources/extensions/gsd/tests/token-profile.test.ts +51 -4
- package/src/resources/extensions/gsd/tests/turn-epoch.test.ts +7 -16
- package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +5 -7
- package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +15 -1
- package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +6 -6
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +15 -0
- package/src/resources/extensions/gsd/tools/memory-tools.ts +17 -1
- package/src/resources/extensions/gsd/unit-context-manifest.ts +8 -8
- package/src/resources/extensions/gsd/visualizer-overlay.ts +1 -1
- package/src/resources/extensions/gsd/watch/header-renderer.ts +3 -1
- package/src/resources/extensions/gsd/workflow-logger.ts +1 -0
- package/src/resources/extensions/gsd/worktree-command.ts +31 -44
- package/src/resources/extensions/gsd/worktree-session-state.ts +35 -0
- package/src/resources/extensions/mcp-client/index.ts +6 -3
- package/src/resources/extensions/mcp-client/tests/global-config.test.ts +91 -0
- package/src/resources/extensions/slash-commands/create-extension.ts +38 -24
- package/src/resources/skills/create-gsd-extension/SKILL.md +9 -5
- package/src/resources/skills/create-gsd-extension/references/custom-commands.md +1 -1
- package/src/resources/skills/create-gsd-extension/references/custom-rendering.md +5 -5
- package/src/resources/skills/create-gsd-extension/references/custom-tools.md +4 -4
- package/src/resources/skills/create-gsd-extension/references/custom-ui.md +6 -6
- package/src/resources/skills/create-gsd-extension/references/events-reference.md +3 -3
- package/src/resources/skills/create-gsd-extension/references/packaging-distribution.md +1 -1
- package/src/resources/skills/create-gsd-extension/references/remote-execution-overrides.md +3 -3
- package/src/resources/skills/create-gsd-extension/templates/extension-skeleton.ts +2 -2
- package/src/resources/skills/create-gsd-extension/templates/stateful-tool-skeleton.ts +3 -3
- package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +58 -0
- package/src/resources/skills/create-gsd-extension/workflows/create-extension.md +32 -12
- package/dist/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +0 -601
- package/dist/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +0 -651
- package/dist/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +0 -91
- package/dist/resources/extensions/gsd/tests/auto-supervisor.test.mjs +0 -53
- package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +0 -112
- package/dist/resources/extensions/gsd/tests/resolve-ts-hooks.mjs +0 -23
- package/dist/resources/extensions/gsd/tests/resolve-ts.mjs +0 -5
- package/dist/resources/skills/github-workflows/references/gh/tests/__init__.py +0 -0
- package/dist/resources/skills/github-workflows/references/gh/tests/test_github_project_setup.py +0 -608
- package/dist/web/standalone/.next/static/chunks/2826.e9f5195e91f9cad2.js +0 -11
- package/dist/web/standalone/.next/static/chunks/3621.fc7480022c972438.js +0 -20
- package/dist/web/standalone/.next/static/chunks/app/page-151349214571e2b6.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/chunks/webpack-2e68521d7c82f7c2.js +0 -1
- package/src/resources/extensions/gsd/tests/copy-planning-artifacts-samepath.test.ts +0 -22
- package/src/resources/extensions/gsd/tests/discuss-slice-structured-questions.test.ts +0 -47
- package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +0 -75
- /package/dist/web/standalone/.next/static/{C1zT2kEfoLhDdbWPWKrXd → UF5VF4F1tB0miEtJS7LyX}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{C1zT2kEfoLhDdbWPWKrXd → UF5VF4F1tB0miEtJS7LyX}/_ssgManifest.js +0 -0
package/dist/headless-query.js
CHANGED
|
@@ -19,11 +19,31 @@ import { join } from 'node:path';
|
|
|
19
19
|
import { homedir } from 'node:os';
|
|
20
20
|
import { resolveBundledSourceResource } from './bundled-resource-path.js';
|
|
21
21
|
const jiti = createJiti(fileURLToPath(import.meta.url), { interopDefault: true, debug: false });
|
|
22
|
-
// Resolve extensions from the synced agent directory so headless-query
|
|
23
|
-
// loads the same extension copy as interactive/auto modes (#3471).
|
|
24
|
-
// Falls back to bundled source for source-tree dev workflows.
|
|
25
|
-
const agentExtensionsDir = join(process.env.GSD_AGENT_DIR || join(homedir(), '.gsd', 'agent'), 'extensions', 'gsd');
|
|
26
22
|
const { existsSync } = await import('node:fs');
|
|
23
|
+
/**
|
|
24
|
+
* Resolve the GSD extensions root for headless-query. Prefers the synced
|
|
25
|
+
* agent directory (so headless-query loads the same extension copy as
|
|
26
|
+
* interactive/auto modes — #3471) and falls back to the bundled source
|
|
27
|
+
* resource for source-tree dev workflows.
|
|
28
|
+
*
|
|
29
|
+
* Pure on the given inputs (env + fs probe + bundled resolver) so the
|
|
30
|
+
* #3471 contract can be exercised in tests without spawning a subprocess.
|
|
31
|
+
*/
|
|
32
|
+
export function resolveGsdAgentExtensionsDir(env = process.env) {
|
|
33
|
+
return join(env.GSD_AGENT_DIR || join(homedir(), '.gsd', 'agent'), 'extensions', 'gsd');
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Decide whether headless-query should load extensions from the agent
|
|
37
|
+
* sync directory (#3471) or fall back to bundled source. Returns the
|
|
38
|
+
* agent dir alongside the decision so a caller can use it directly.
|
|
39
|
+
*/
|
|
40
|
+
export function shouldUseAgentExtensionsDir(opts) {
|
|
41
|
+
const env = opts.env ?? process.env;
|
|
42
|
+
const fileExists = opts.fileExists ?? existsSync;
|
|
43
|
+
const agentDir = resolveGsdAgentExtensionsDir(env);
|
|
44
|
+
return { agentDir, useAgentDir: fileExists(join(agentDir, 'state.ts')) };
|
|
45
|
+
}
|
|
46
|
+
const agentExtensionsDir = resolveGsdAgentExtensionsDir();
|
|
27
47
|
const useAgentDir = existsSync(join(agentExtensionsDir, 'state.ts'));
|
|
28
48
|
const gsdExtensionPath = (...segments) => useAgentDir
|
|
29
49
|
? join(agentExtensionsDir, ...segments)
|
package/dist/headless.d.ts
CHANGED
|
@@ -32,6 +32,16 @@ export interface HeadlessOptions {
|
|
|
32
32
|
resumeSession?: string;
|
|
33
33
|
bare?: boolean;
|
|
34
34
|
}
|
|
35
|
+
/**
|
|
36
|
+
* Commands classified as multi-turn in headless mode: they involve multiple
|
|
37
|
+
* question rounds, codebase scanning, and artifact writing before the workflow
|
|
38
|
+
* completes (#3547). Multi-turn commands suppress single-execution-complete
|
|
39
|
+
* exit and disable the default 5-minute timeout.
|
|
40
|
+
*
|
|
41
|
+
* Exported so the regression test can exercise the real classifier rather
|
|
42
|
+
* than grepping the source for identifier names.
|
|
43
|
+
*/
|
|
44
|
+
export declare function isMultiTurnHeadlessCommand(command: string): boolean;
|
|
35
45
|
export interface ResumeSessionResult {
|
|
36
46
|
session?: SessionInfo;
|
|
37
47
|
error?: string;
|
package/dist/headless.js
CHANGED
|
@@ -21,6 +21,21 @@ import { isTerminalNotification, isBlockedNotification, isMilestoneReadyNotifica
|
|
|
21
21
|
import { VALID_OUTPUT_FORMATS } from './headless-types.js';
|
|
22
22
|
import { handleExtensionUIRequest, formatProgress, formatThinkingLine, formatTextStart, formatTextEnd, formatThinkingStart, formatThinkingEnd, startSupervisedStdinReader, } from './headless-ui.js';
|
|
23
23
|
import { loadContext, bootstrapGsdProject, } from './headless-context.js';
|
|
24
|
+
/**
|
|
25
|
+
* Commands classified as multi-turn in headless mode: they involve multiple
|
|
26
|
+
* question rounds, codebase scanning, and artifact writing before the workflow
|
|
27
|
+
* completes (#3547). Multi-turn commands suppress single-execution-complete
|
|
28
|
+
* exit and disable the default 5-minute timeout.
|
|
29
|
+
*
|
|
30
|
+
* Exported so the regression test can exercise the real classifier rather
|
|
31
|
+
* than grepping the source for identifier names.
|
|
32
|
+
*/
|
|
33
|
+
export function isMultiTurnHeadlessCommand(command) {
|
|
34
|
+
return (command === 'auto' ||
|
|
35
|
+
command === 'next' ||
|
|
36
|
+
command === 'discuss' ||
|
|
37
|
+
command === 'plan');
|
|
38
|
+
}
|
|
24
39
|
/**
|
|
25
40
|
* Resolve a session prefix to a single session.
|
|
26
41
|
* Exact id match is preferred over prefix match.
|
|
@@ -186,7 +201,7 @@ async function runHeadlessOnce(options, restartCount) {
|
|
|
186
201
|
const isAutoMode = options.command === 'auto';
|
|
187
202
|
// discuss and plan are multi-turn: they involve multiple question rounds,
|
|
188
203
|
// codebase scanning, and artifact writing before the workflow completes (#3547).
|
|
189
|
-
const isMultiTurnCommand = options.command
|
|
204
|
+
const isMultiTurnCommand = isMultiTurnHeadlessCommand(options.command);
|
|
190
205
|
if (isAutoMode && options.timeout === 300_000) {
|
|
191
206
|
options.timeout = 0;
|
|
192
207
|
}
|
package/dist/loader.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
// GSD Startup Loader
|
|
3
|
-
// Copyright (c) 2026 Jeremy McSpadden <jeremy@fluxlabs.net>
|
|
4
3
|
import { fileURLToPath } from 'url';
|
|
5
4
|
import { dirname, resolve, join, relative, delimiter } from 'path';
|
|
6
5
|
import { existsSync, readFileSync, readdirSync, statSync, mkdirSync, symlinkSync, cpSync } from 'fs';
|
|
@@ -32,14 +31,14 @@ if (firstArg === '--help' || firstArg === '-h') {
|
|
|
32
31
|
// package.json (already parsed above) and verifies git is available.
|
|
33
32
|
// ---------------------------------------------------------------------------
|
|
34
33
|
{
|
|
35
|
-
const MIN_NODE_MAJOR =
|
|
34
|
+
const { MIN_NODE_MAJOR, checkNodeVersion, requireGit } = await import('./runtime-checks.js');
|
|
36
35
|
const red = '\x1b[31m';
|
|
37
36
|
const bold = '\x1b[1m';
|
|
38
37
|
const dim = '\x1b[2m';
|
|
39
38
|
const reset = '\x1b[0m';
|
|
40
39
|
// -- Node version --
|
|
41
|
-
const
|
|
42
|
-
if (
|
|
40
|
+
const nodeCheck = checkNodeVersion(process.versions.node, MIN_NODE_MAJOR);
|
|
41
|
+
if (!nodeCheck.ok) {
|
|
43
42
|
process.stderr.write(`\n${red}${bold}Error:${reset} GSD requires Node.js >= ${MIN_NODE_MAJOR}.0.0\n` +
|
|
44
43
|
` You are running Node.js ${process.versions.node}\n\n` +
|
|
45
44
|
`${dim}Install a supported version:${reset}\n` +
|
|
@@ -49,11 +48,9 @@ if (firstArg === '--help' || firstArg === '-h') {
|
|
|
49
48
|
process.exit(1);
|
|
50
49
|
}
|
|
51
50
|
// -- git --
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
}
|
|
56
|
-
catch {
|
|
51
|
+
const { execFileSync } = await import('child_process');
|
|
52
|
+
const gitOk = requireGit((cmd, args) => execFileSync(cmd, args, { stdio: 'ignore' }));
|
|
53
|
+
if (!gitOk) {
|
|
57
54
|
process.stderr.write(`\n${red}${bold}Error:${reset} GSD requires git but it was not found on PATH.\n\n` +
|
|
58
55
|
`${dim}Install git:${reset}\n` +
|
|
59
56
|
` https://git-scm.com/downloads\n\n`);
|
|
@@ -61,7 +58,7 @@ if (firstArg === '--help' || firstArg === '-h') {
|
|
|
61
58
|
}
|
|
62
59
|
}
|
|
63
60
|
import { agentDir, appRoot } from './app-paths.js';
|
|
64
|
-
import { applyRtkProcessEnv } from './rtk.js';
|
|
61
|
+
import { applyRtkProcessEnv } from './rtk-shared.js';
|
|
65
62
|
import { serializeBundledExtensionPaths } from './bundled-extension-paths.js';
|
|
66
63
|
import { discoverExtensionEntryPaths } from './extension-discovery.js';
|
|
67
64
|
import { loadRegistry, readManifestFromEntryPath, isExtensionEnabled } from './extension-registry.js';
|
package/dist/onboarding.d.ts
CHANGED
|
@@ -24,6 +24,16 @@ interface RunOnboardingOptions {
|
|
|
24
24
|
/** Show logo + intro banner. Disable when onboarding is launched inside an active TUI session. */
|
|
25
25
|
showIntro?: boolean;
|
|
26
26
|
}
|
|
27
|
+
export declare const OTHER_PROVIDERS: ({
|
|
28
|
+
value: string;
|
|
29
|
+
label: string;
|
|
30
|
+
hint: string;
|
|
31
|
+
} | {
|
|
32
|
+
value: string;
|
|
33
|
+
label: string;
|
|
34
|
+
hint?: undefined;
|
|
35
|
+
})[];
|
|
36
|
+
export declare function detectNativeProviderFromBaseUrl(baseUrl: string): 'minimax' | 'minimax-cn' | null;
|
|
27
37
|
/**
|
|
28
38
|
* Determine if the onboarding wizard should run.
|
|
29
39
|
*
|
package/dist/onboarding.js
CHANGED
|
@@ -54,7 +54,7 @@ const API_KEY_PREFIXES = {
|
|
|
54
54
|
anthropic: ['sk-ant-'],
|
|
55
55
|
openai: ['sk-'],
|
|
56
56
|
};
|
|
57
|
-
const OTHER_PROVIDERS = [
|
|
57
|
+
export const OTHER_PROVIDERS = [
|
|
58
58
|
{ value: 'google', label: 'Google (Gemini)', hint: 'aistudio.google.com/app/apikey' },
|
|
59
59
|
{ value: 'groq', label: 'Groq', hint: 'console.groq.com/keys' },
|
|
60
60
|
{ value: 'xai', label: 'xAI (Grok)', hint: 'console.x.ai' },
|
|
@@ -148,7 +148,7 @@ function persistDefaultModel(modelId) {
|
|
|
148
148
|
// Non-fatal: startup fallback logic will still run.
|
|
149
149
|
}
|
|
150
150
|
}
|
|
151
|
-
function detectNativeProviderFromBaseUrl(baseUrl) {
|
|
151
|
+
export function detectNativeProviderFromBaseUrl(baseUrl) {
|
|
152
152
|
try {
|
|
153
153
|
const hostname = new URL(baseUrl).hostname.toLowerCase();
|
|
154
154
|
if (hostname === 'api.minimax.io' || hostname.endsWith('.minimax.io')) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { AuthStorage } from "@gsd/pi-coding-agent";
|
|
2
2
|
type AnthropicMigrationDeps = {
|
|
3
3
|
authStorage: Pick<AuthStorage, "getCredentialsForProvider">;
|
|
4
|
-
isClaudeCodeReady: boolean;
|
|
4
|
+
isClaudeCodeReady: boolean | (() => boolean);
|
|
5
5
|
defaultProvider: string | undefined;
|
|
6
6
|
env?: NodeJS.ProcessEnv;
|
|
7
7
|
};
|
|
@@ -11,7 +11,7 @@ type MigrationModel = {
|
|
|
11
11
|
};
|
|
12
12
|
type AnthropicDefaultMigrationDeps = {
|
|
13
13
|
authStorage: Pick<AuthStorage, "getCredentialsForProvider">;
|
|
14
|
-
isClaudeCodeReady: boolean;
|
|
14
|
+
isClaudeCodeReady: boolean | (() => boolean);
|
|
15
15
|
settingsManager: {
|
|
16
16
|
getDefaultProvider(): string | undefined;
|
|
17
17
|
getDefaultModel(): string | undefined;
|
|
@@ -5,10 +5,13 @@ export function hasDirectAnthropicApiKey(authStorage, env = process.env) {
|
|
|
5
5
|
return authStorage.getCredentialsForProvider("anthropic").some((credential) => credential?.type === "api_key" && typeof credential?.key === "string" && credential.key.trim().length > 0);
|
|
6
6
|
}
|
|
7
7
|
export function shouldMigrateAnthropicToClaudeCode({ authStorage, isClaudeCodeReady, defaultProvider, env = process.env, }) {
|
|
8
|
-
if (
|
|
8
|
+
if (defaultProvider !== "anthropic") {
|
|
9
9
|
return false;
|
|
10
10
|
}
|
|
11
|
-
|
|
11
|
+
if (hasDirectAnthropicApiKey(authStorage, env)) {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
return typeof isClaudeCodeReady === "function" ? isClaudeCodeReady() : isClaudeCodeReady;
|
|
12
15
|
}
|
|
13
16
|
export function migrateAnthropicDefaultToClaudeCode({ authStorage, isClaudeCodeReady, settingsManager, modelRegistry, env = process.env, }) {
|
|
14
17
|
const defaultProvider = settingsManager.getDefaultProvider();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DefaultResourceLoader } from '@gsd/pi-coding-agent';
|
|
1
|
+
import type { DefaultResourceLoader as DefaultResourceLoaderType } from '@gsd/pi-coding-agent';
|
|
2
2
|
export { discoverExtensionEntryPaths } from './extension-discovery.js';
|
|
3
3
|
export declare function getExtensionKey(entryPath: string, extensionsDir: string): string;
|
|
4
4
|
export declare function readManagedResourceVersion(agentDir: string): string | null;
|
|
@@ -63,4 +63,7 @@ export declare function mergedFingerprint(hoisted: string, internal: string): st
|
|
|
63
63
|
*/
|
|
64
64
|
export declare function initResources(agentDir: string, skillsDir?: string): void;
|
|
65
65
|
export declare function hasStaleCompiledExtensionSiblings(extensionsDir: string, sourceDir?: string): boolean;
|
|
66
|
-
|
|
66
|
+
interface BuildResourceLoaderOptions {
|
|
67
|
+
additionalExtensionPaths?: string[];
|
|
68
|
+
}
|
|
69
|
+
export declare function buildResourceLoader(agentDir: string, options?: BuildResourceLoaderOptions): Promise<DefaultResourceLoaderType>;
|
package/dist/resource-loader.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { DefaultResourceLoader, sortExtensionPaths } from '@gsd/pi-coding-agent';
|
|
2
1
|
import { createHash } from 'node:crypto';
|
|
3
2
|
import { homedir } from 'node:os';
|
|
4
3
|
import { chmodSync, copyFileSync, cpSync, existsSync, lstatSync, mkdirSync, openSync, closeSync, readFileSync, readlinkSync, readdirSync, rmSync, statSync, symlinkSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
@@ -7,6 +6,10 @@ import { fileURLToPath } from 'node:url';
|
|
|
7
6
|
import { compareSemver } from './update-check.js';
|
|
8
7
|
import { discoverExtensionEntryPaths } from './extension-discovery.js';
|
|
9
8
|
import { loadRegistry, readManifestFromEntryPath, isExtensionEnabled, ensureRegistryEntries } from './extension-registry.js';
|
|
9
|
+
let piCodingAgentModulePromise;
|
|
10
|
+
function loadPiCodingAgentModule() {
|
|
11
|
+
return (piCodingAgentModulePromise ??= import('@gsd/pi-coding-agent'));
|
|
12
|
+
}
|
|
10
13
|
// Resolve resources directory — prefer dist/resources/ (stable, set at build time)
|
|
11
14
|
// over src/resources/ (live working tree, changes with git branch).
|
|
12
15
|
//
|
|
@@ -26,6 +29,7 @@ const resourcesDir = (existsSync(distResources) && existsSync(join(distResources
|
|
|
26
29
|
: srcResources;
|
|
27
30
|
const bundledExtensionsDir = join(resourcesDir, 'extensions');
|
|
28
31
|
const resourceVersionManifestName = 'managed-resources.json';
|
|
32
|
+
const resourceFingerprintFileName = '.managed-resources-content-hash';
|
|
29
33
|
export { discoverExtensionEntryPaths } from './extension-discovery.js';
|
|
30
34
|
export function getExtensionKey(entryPath, extensionsDir) {
|
|
31
35
|
const relPath = relative(extensionsDir, entryPath);
|
|
@@ -77,7 +81,7 @@ function writeManagedResourceManifest(agentDir) {
|
|
|
77
81
|
const manifest = {
|
|
78
82
|
gsdVersion: getBundledGsdVersion(),
|
|
79
83
|
syncedAt: Date.now(),
|
|
80
|
-
contentHash:
|
|
84
|
+
contentHash: getCurrentResourceFingerprint(),
|
|
81
85
|
installedExtensionRootFiles,
|
|
82
86
|
installedExtensionDirs,
|
|
83
87
|
};
|
|
@@ -125,10 +129,24 @@ export function computeResourceFingerprint(rootDir = resourcesDir) {
|
|
|
125
129
|
entries.sort();
|
|
126
130
|
return createHash('sha256').update(entries.join('\n')).digest('hex').slice(0, 16);
|
|
127
131
|
}
|
|
132
|
+
function getCurrentResourceFingerprint() {
|
|
133
|
+
try {
|
|
134
|
+
const precomputed = readFileSync(join(resourcesDir, resourceFingerprintFileName), 'utf-8').trim();
|
|
135
|
+
if (/^[a-f0-9]{16}$/i.test(precomputed)) {
|
|
136
|
+
return precomputed;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
// Source-tree and partial-build workflows may not have a precomputed hash.
|
|
141
|
+
}
|
|
142
|
+
return computeResourceFingerprint();
|
|
143
|
+
}
|
|
128
144
|
function collectFileEntries(dir, root, out) {
|
|
129
145
|
if (!existsSync(dir))
|
|
130
146
|
return;
|
|
131
147
|
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
148
|
+
if (entry.name === resourceFingerprintFileName)
|
|
149
|
+
continue;
|
|
132
150
|
const fullPath = join(dir, entry.name);
|
|
133
151
|
if (entry.isDirectory()) {
|
|
134
152
|
collectFileEntries(fullPath, root, out);
|
|
@@ -548,7 +566,7 @@ export function initResources(agentDir, skillsDir = join(homedir(), '.agents', '
|
|
|
548
566
|
// hotfixes within a release). The content hash catches those at ~1ms cost.
|
|
549
567
|
if (manifest && manifest.gsdVersion === currentVersion) {
|
|
550
568
|
// Version matches — check content fingerprint for same-version staleness.
|
|
551
|
-
const currentHash =
|
|
569
|
+
const currentHash = getCurrentResourceFingerprint();
|
|
552
570
|
const hasStaleExtensionFiles = hasStaleCompiledExtensionSiblings(extensionsDir, bundledExtensionsDir);
|
|
553
571
|
if (manifest.contentHash && manifest.contentHash === currentHash && !hasStaleExtensionFiles) {
|
|
554
572
|
return;
|
|
@@ -736,7 +754,8 @@ function getBundledExtensionKeys() {
|
|
|
736
754
|
}
|
|
737
755
|
return _bundledExtensionKeys;
|
|
738
756
|
}
|
|
739
|
-
export function buildResourceLoader(agentDir) {
|
|
757
|
+
export async function buildResourceLoader(agentDir, options = {}) {
|
|
758
|
+
const { DefaultResourceLoader, sortExtensionPaths } = await loadPiCodingAgentModule();
|
|
740
759
|
const registry = loadRegistry();
|
|
741
760
|
const piAgentDir = join(homedir(), '.pi', 'agent');
|
|
742
761
|
const piExtensionsDir = join(piAgentDir, 'extensions');
|
|
@@ -749,9 +768,13 @@ export function buildResourceLoader(agentDir) {
|
|
|
749
768
|
return true;
|
|
750
769
|
return isExtensionEnabled(registry, manifest.id);
|
|
751
770
|
});
|
|
771
|
+
const additionalExtensionPaths = [
|
|
772
|
+
...piExtensionPaths,
|
|
773
|
+
...(options.additionalExtensionPaths ?? []),
|
|
774
|
+
];
|
|
752
775
|
return new DefaultResourceLoader({
|
|
753
776
|
agentDir,
|
|
754
|
-
additionalExtensionPaths
|
|
777
|
+
additionalExtensionPaths,
|
|
755
778
|
bundledExtensionKeys: bundledKeys,
|
|
756
779
|
extensionPathsTransform: (paths) => {
|
|
757
780
|
// 1. Filter community extensions through the GSD registry
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
afb1073f61989a78
|
|
@@ -5,8 +5,13 @@
|
|
|
5
5
|
* Results are cached for 30 seconds to avoid shelling out on every
|
|
6
6
|
* model-availability check.
|
|
7
7
|
*
|
|
8
|
-
* Auth verification
|
|
9
|
-
*
|
|
8
|
+
* Auth verification runs `claude auth status --json` and inspects the
|
|
9
|
+
* `loggedIn` field, falling back to plain `claude auth status` and a text
|
|
10
|
+
* heuristic when the JSON shape is unavailable (older Claude CLI builds).
|
|
11
|
+
*
|
|
12
|
+
* Set GSD_CLAUDE_DEBUG=1 to print the probe's binary selection and auth
|
|
13
|
+
* outputs to stderr — useful when diagnosing platform-specific detection
|
|
14
|
+
* failures (Issue #4997).
|
|
10
15
|
*/
|
|
11
16
|
import { execFileSync } from "node:child_process";
|
|
12
17
|
/**
|
|
@@ -23,33 +28,117 @@ const CLAUDE_COMMAND = process.platform === "win32" ? "claude.cmd" : "claude";
|
|
|
23
28
|
* installed" results in readiness checks.
|
|
24
29
|
*/
|
|
25
30
|
const CLAUDE_COMMAND_CANDIDATES = process.platform === "win32" ? [CLAUDE_COMMAND, "claude.exe", "claude"] : [CLAUDE_COMMAND];
|
|
26
|
-
|
|
27
|
-
|
|
31
|
+
// Keep the version probe snappy — `claude --version` is a quick path.
|
|
32
|
+
const VERSION_TIMEOUT_MS = 5_000;
|
|
33
|
+
// Auth status can be much slower on Windows because the spawn goes through
|
|
34
|
+
// cmd.exe → claude.cmd → node → Claude CLI. 15s leaves headroom on cold spawns
|
|
35
|
+
// without making startup feel hung when the CLI is genuinely missing.
|
|
36
|
+
const AUTH_TIMEOUT_MS = 15_000;
|
|
37
|
+
function debugLog(...parts) {
|
|
38
|
+
if (process.env.GSD_CLAUDE_DEBUG) {
|
|
39
|
+
process.stderr.write(`[claude-readiness] ${parts.map((p) => (typeof p === "string" ? p : JSON.stringify(p))).join(" ")}\n`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Find the first candidate that responds to `--version`. Returns the
|
|
44
|
+
* candidate name on success, null if none worked.
|
|
45
|
+
*
|
|
46
|
+
* On Windows with `shell: true`, a missing candidate surfaces as a
|
|
47
|
+
* non-zero exit from cmd.exe rather than ENOENT — so we cannot rely on
|
|
48
|
+
* the error code to decide "try next". Treat any failure as "try next"
|
|
49
|
+
* for the version probe; the only thing that matters for binary
|
|
50
|
+
* detection is whether *some* candidate produces a `claude --version`
|
|
51
|
+
* line.
|
|
52
|
+
*/
|
|
53
|
+
function findWorkingCommand() {
|
|
28
54
|
for (const command of CLAUDE_COMMAND_CANDIDATES) {
|
|
29
55
|
try {
|
|
30
|
-
|
|
31
|
-
timeout:
|
|
56
|
+
execFileSync(command, ["--version"], {
|
|
57
|
+
timeout: VERSION_TIMEOUT_MS,
|
|
32
58
|
stdio: "pipe",
|
|
33
59
|
shell: process.platform === "win32",
|
|
34
60
|
});
|
|
61
|
+
debugLog("version probe ok via", command);
|
|
62
|
+
return command;
|
|
35
63
|
}
|
|
36
64
|
catch (error) {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
65
|
+
debugLog("version probe failed for", command, "code=", error?.code);
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Decide auth state from `claude auth status` output.
|
|
73
|
+
*
|
|
74
|
+
* Newer Claude CLI builds emit JSON by default with a `loggedIn` boolean.
|
|
75
|
+
* Older builds emit free-form text. We prefer the structured signal and fall
|
|
76
|
+
* back to a text heuristic. Note: the text heuristic only covers English
|
|
77
|
+
* phrasing — the JSON path is the durable signal.
|
|
78
|
+
*/
|
|
79
|
+
function parseAuthStatus(output) {
|
|
80
|
+
const trimmed = output.trim();
|
|
81
|
+
if (!trimmed)
|
|
82
|
+
return null;
|
|
83
|
+
if (trimmed.startsWith("{")) {
|
|
84
|
+
try {
|
|
85
|
+
const parsed = JSON.parse(trimmed);
|
|
86
|
+
if (typeof parsed.loggedIn === "boolean") {
|
|
87
|
+
return parsed.loggedIn;
|
|
43
88
|
}
|
|
44
|
-
throw error;
|
|
45
89
|
}
|
|
90
|
+
catch {
|
|
91
|
+
// Fall through to text heuristic.
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
const lower = trimmed.toLowerCase();
|
|
95
|
+
if (/not logged in|no credentials|unauthenticated|not authenticated/.test(lower)) {
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
if (/logged in|authenticated|signed in|email|subscription/.test(lower)) {
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
function probeAuth(command) {
|
|
104
|
+
// Try --json first (newer CLIs).
|
|
105
|
+
try {
|
|
106
|
+
const out = execFileSync(command, ["auth", "status", "--json"], {
|
|
107
|
+
timeout: AUTH_TIMEOUT_MS,
|
|
108
|
+
stdio: "pipe",
|
|
109
|
+
shell: process.platform === "win32",
|
|
110
|
+
}).toString();
|
|
111
|
+
debugLog("auth status --json output:", out.slice(0, 200));
|
|
112
|
+
const parsed = parseAuthStatus(out);
|
|
113
|
+
if (parsed !== null)
|
|
114
|
+
return parsed;
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
debugLog("auth status --json threw:", error.message?.slice(0, 200));
|
|
118
|
+
}
|
|
119
|
+
// Fallback: plain `auth status` (older CLIs that don't accept --json).
|
|
120
|
+
try {
|
|
121
|
+
const out = execFileSync(command, ["auth", "status"], {
|
|
122
|
+
timeout: AUTH_TIMEOUT_MS,
|
|
123
|
+
stdio: "pipe",
|
|
124
|
+
shell: process.platform === "win32",
|
|
125
|
+
}).toString();
|
|
126
|
+
debugLog("auth status output:", out.slice(0, 200));
|
|
127
|
+
return parseAuthStatus(out);
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
debugLog("auth status threw:", error.message?.slice(0, 200));
|
|
131
|
+
return null;
|
|
46
132
|
}
|
|
47
|
-
throw lastError ?? new Error(`Claude CLI executable not found (tried: ${CLAUDE_COMMAND_CANDIDATES.join(", ")})`);
|
|
48
133
|
}
|
|
49
134
|
let cachedBinaryPresent = null;
|
|
50
135
|
let cachedAuthed = null;
|
|
51
136
|
let lastCheckMs = 0;
|
|
52
137
|
const CHECK_INTERVAL_MS = 30_000;
|
|
138
|
+
/**
|
|
139
|
+
* Refresh the cached binary/auth state when the cache window has expired.
|
|
140
|
+
* Preserves a known auth state across soft-fail auth probes.
|
|
141
|
+
*/
|
|
53
142
|
function refreshCache() {
|
|
54
143
|
const now = Date.now();
|
|
55
144
|
if (cachedBinaryPresent !== null && now - lastCheckMs < CHECK_INTERVAL_MS) {
|
|
@@ -57,28 +146,23 @@ function refreshCache() {
|
|
|
57
146
|
}
|
|
58
147
|
// Set timestamp first to prevent re-entrant checks during the same window
|
|
59
148
|
lastCheckMs = now;
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
execClaude(["--version"]);
|
|
63
|
-
cachedBinaryPresent = true;
|
|
64
|
-
}
|
|
65
|
-
catch {
|
|
149
|
+
const command = findWorkingCommand();
|
|
150
|
+
if (!command) {
|
|
66
151
|
cachedBinaryPresent = false;
|
|
67
152
|
cachedAuthed = false;
|
|
68
153
|
return;
|
|
69
154
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
//
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
// Non-zero exit code means not authenticated
|
|
80
|
-
cachedAuthed = false;
|
|
155
|
+
cachedBinaryPresent = true;
|
|
156
|
+
const authed = probeAuth(command);
|
|
157
|
+
if (authed === null) {
|
|
158
|
+
// Couldn't determine auth state from CLI output. Don't clobber a
|
|
159
|
+
// previously known-good cache; otherwise default to false so we don't
|
|
160
|
+
// silently route requests to an unauthenticated CLI.
|
|
161
|
+
if (cachedAuthed === null)
|
|
162
|
+
cachedAuthed = false;
|
|
163
|
+
return;
|
|
81
164
|
}
|
|
165
|
+
cachedAuthed = authed;
|
|
82
166
|
}
|
|
83
167
|
/**
|
|
84
168
|
* Whether the `claude` binary is installed (regardless of auth state).
|
|
@@ -163,6 +163,17 @@ function resolveDispatchNodeKind(unitType, sidecarItem) {
|
|
|
163
163
|
}
|
|
164
164
|
return "unit";
|
|
165
165
|
}
|
|
166
|
+
async function enforceMinRequestInterval(s, prefs) {
|
|
167
|
+
const minInterval = prefs?.min_request_interval_ms ?? 0;
|
|
168
|
+
if (minInterval > 0 && s.lastRequestTimestamp > 0) {
|
|
169
|
+
const elapsed = Date.now() - s.lastRequestTimestamp;
|
|
170
|
+
if (elapsed < minInterval) {
|
|
171
|
+
const waitMs = minInterval - elapsed;
|
|
172
|
+
debugLog("autoLoop", { phase: "rate-limit-wait", waitMs });
|
|
173
|
+
await new Promise(r => setTimeout(r, waitMs));
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
166
177
|
async function runUnitPhaseViaContract(dispatchContract, ic, iterData, loopState, sidecarItem) {
|
|
167
178
|
if (dispatchContract === "legacy-direct") {
|
|
168
179
|
return runUnitPhase(ic, iterData, loopState, sidecarItem);
|
|
@@ -392,7 +403,13 @@ export async function autoLoop(ctx, pi, s, deps, options) {
|
|
|
392
403
|
break;
|
|
393
404
|
}
|
|
394
405
|
// ── Unit execution (shared with dev path) ──
|
|
406
|
+
await enforceMinRequestInterval(s, prefs);
|
|
395
407
|
const unitPhaseResult = await runUnitPhaseViaContract(dispatchContract, ic, iterData, loopState);
|
|
408
|
+
if (unitPhaseResult.action === "next") {
|
|
409
|
+
const requestTimestamp = unitPhaseResult.data.requestDispatchedAt ?? unitPhaseResult.data.unitStartedAt;
|
|
410
|
+
if (typeof requestTimestamp === "number")
|
|
411
|
+
s.lastRequestTimestamp = requestTimestamp;
|
|
412
|
+
}
|
|
396
413
|
deps.uokObserver?.onPhaseResult("unit", unitPhaseResult.action, {
|
|
397
414
|
unitType: iterData.unitType,
|
|
398
415
|
unitId: iterData.unitId,
|
|
@@ -555,7 +572,13 @@ export async function autoLoop(ctx, pi, s, deps, options) {
|
|
|
555
572
|
sidecarKind: sidecarItem.kind,
|
|
556
573
|
});
|
|
557
574
|
}
|
|
575
|
+
await enforceMinRequestInterval(s, prefs);
|
|
558
576
|
const unitPhaseResult = await runUnitPhaseViaContract(dispatchContract, ic, iterData, loopState, sidecarItem);
|
|
577
|
+
if (unitPhaseResult.action === "next") {
|
|
578
|
+
const requestTimestamp = unitPhaseResult.data.requestDispatchedAt ?? unitPhaseResult.data.unitStartedAt;
|
|
579
|
+
if (typeof requestTimestamp === "number")
|
|
580
|
+
s.lastRequestTimestamp = requestTimestamp;
|
|
581
|
+
}
|
|
559
582
|
deps.uokObserver?.onPhaseResult("unit", unitPhaseResult.action, {
|
|
560
583
|
unitType: iterData.unitType,
|
|
561
584
|
unitId: iterData.unitId,
|
|
@@ -1365,7 +1365,7 @@ export async function runUnitPhase(ic, iterData, loopState, sidecarItem) {
|
|
|
1365
1365
|
ctx.ui.notify(`${unitType} ${unitId} completed with 0 tool calls — context exhaustion, will retry`, "warning");
|
|
1366
1366
|
// Fall through to next iteration where dispatch will re-derive
|
|
1367
1367
|
// and re-dispatch this unit.
|
|
1368
|
-
return { action: "next", data: { unitStartedAt: s.currentUnit?.startedAt } };
|
|
1368
|
+
return { action: "next", data: { unitStartedAt: s.currentUnit?.startedAt, requestDispatchedAt: unitResult.requestDispatchedAt } };
|
|
1369
1369
|
}
|
|
1370
1370
|
}
|
|
1371
1371
|
}
|
|
@@ -1418,7 +1418,7 @@ export async function runUnitPhase(ic, iterData, loopState, sidecarItem) {
|
|
|
1418
1418
|
}
|
|
1419
1419
|
s.checkpointSha = null;
|
|
1420
1420
|
}
|
|
1421
|
-
return { action: "next", data: { unitStartedAt: s.currentUnit?.startedAt } };
|
|
1421
|
+
return { action: "next", data: { unitStartedAt: s.currentUnit?.startedAt, requestDispatchedAt: unitResult.requestDispatchedAt } };
|
|
1422
1422
|
}
|
|
1423
1423
|
// ─── runFinalize ──────────────────────────────────────────────────────────────
|
|
1424
1424
|
/**
|
|
@@ -138,6 +138,7 @@ export async function runUnit(ctx, pi, s, unitType, unitId, prompt) {
|
|
|
138
138
|
const capturedTurnGen = getCurrentTurnGeneration();
|
|
139
139
|
// ── Send the prompt ──
|
|
140
140
|
debugLog("runUnit", { phase: "send-message", unitType, unitId });
|
|
141
|
+
const requestDispatchedAt = Date.now();
|
|
141
142
|
pi.sendMessage({ customType: "gsd-auto", content: prompt, display: s.verbose }, { triggerTurn: true });
|
|
142
143
|
// ── Await agent_end with absolute timeout (H4 fix) ──
|
|
143
144
|
// If supervision fails to resolve unitPromise within 30s, treat as cancelled.
|
|
@@ -160,6 +161,7 @@ export async function runUnit(ctx, pi, s, unitType, unitId, prompt) {
|
|
|
160
161
|
unitId,
|
|
161
162
|
status: result.status,
|
|
162
163
|
});
|
|
164
|
+
const finalResult = { ...result, requestDispatchedAt };
|
|
163
165
|
// Discard trailing follow-up messages (e.g. async_job_result notifications)
|
|
164
166
|
// from the completed unit. Without this, queued follow-ups trigger wasteful
|
|
165
167
|
// LLM turns before the next session can start (#1642).
|
|
@@ -174,5 +176,5 @@ export async function runUnit(ctx, pi, s, unitType, unitId, prompt) {
|
|
|
174
176
|
catch (e) {
|
|
175
177
|
logWarning("engine", "clearQueue failed after unit completion", { error: String(e) });
|
|
176
178
|
}
|
|
177
|
-
return
|
|
179
|
+
return finalResult;
|
|
178
180
|
}
|
|
@@ -118,6 +118,8 @@ export class AutoSession {
|
|
|
118
118
|
lastPromptCharCount;
|
|
119
119
|
lastBaselineCharCount;
|
|
120
120
|
pendingQuickTasks = [];
|
|
121
|
+
/** Timestamp of the last LLM request dispatch (ms since epoch). Used for proactive rate limiting. */
|
|
122
|
+
lastRequestTimestamp = 0;
|
|
121
123
|
// ── Safety harness ───────────────────────────────────────────────────────
|
|
122
124
|
/** SHA of the pre-unit git checkpoint ref. Cleared on success or rollback. */
|
|
123
125
|
checkpointSha = null;
|
|
@@ -215,6 +217,7 @@ export class AutoSession {
|
|
|
215
217
|
this.lastPromptCharCount = undefined;
|
|
216
218
|
this.lastBaselineCharCount = undefined;
|
|
217
219
|
this.pendingQuickTasks = [];
|
|
220
|
+
this.lastRequestTimestamp = 0;
|
|
218
221
|
this.sidecarQueue = [];
|
|
219
222
|
this.rewriteAttemptCount = 0;
|
|
220
223
|
this.consecutiveCompleteBootstraps = 0;
|