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
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* globals or AutoContext dependency.
|
|
8
8
|
*/
|
|
9
9
|
import { parseUnitId } from "./unit-id.js";
|
|
10
|
+
import { MILESTONE_ID_RE } from "./milestone-ids.js";
|
|
10
11
|
import { appendEvent } from "./workflow-events.js";
|
|
11
12
|
import { atomicWriteSync } from "./atomic-write.js";
|
|
12
13
|
import { clearParseCache } from "./files.js";
|
|
@@ -168,8 +169,35 @@ function getChangedFilesSinceBranch(basePath, targetBranch) {
|
|
|
168
169
|
}
|
|
169
170
|
}
|
|
170
171
|
function getChangedFilesFromMilestoneTaggedCommits(basePath, milestoneId) {
|
|
172
|
+
// Primary: path-scoped log against .gsd/milestones/<id>. Fast and unbounded
|
|
173
|
+
// by depth when .gsd/ is tracked in git.
|
|
174
|
+
const scoped = scanGsdTaggedCommits(basePath, milestoneId, [
|
|
175
|
+
"log", "--format=%H%x1f%B%x1e", "HEAD", "--", `.gsd/milestones/${milestoneId}`,
|
|
176
|
+
]);
|
|
177
|
+
if (!scoped.ok)
|
|
178
|
+
return scoped;
|
|
179
|
+
if (scoped.matched)
|
|
180
|
+
return scoped;
|
|
181
|
+
// Fallback (#5033): when .gsd/ is gitignored / external / untracked, the
|
|
182
|
+
// path-scoped scan matches no commits even though GSD-tagged commits
|
|
183
|
+
// referencing the milestone exist on the integration branch. Re-scan all
|
|
184
|
+
// of HEAD's history and rely on commitMatchesMilestone to bind by
|
|
185
|
+
// explicit milestone mention in the message body.
|
|
186
|
+
//
|
|
187
|
+
// Intentionally unbounded — symmetric with the primary scan, and avoids
|
|
188
|
+
// reintroducing the rolling-depth failure class removed in #4699 where
|
|
189
|
+
// milestone evidence aged out behind unrelated activity.
|
|
190
|
+
return scanGsdTaggedCommits(basePath, milestoneId, [
|
|
191
|
+
"log", "--format=%H%x1f%B%x1e", "HEAD",
|
|
192
|
+
]);
|
|
193
|
+
}
|
|
194
|
+
function scanGsdTaggedCommits(basePath, milestoneId, gitArgs) {
|
|
171
195
|
try {
|
|
172
|
-
const logOutput = execFileSync("git", [
|
|
196
|
+
const logOutput = execFileSync("git", [...gitArgs], {
|
|
197
|
+
cwd: basePath,
|
|
198
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
199
|
+
encoding: "utf-8",
|
|
200
|
+
});
|
|
173
201
|
const records = logOutput
|
|
174
202
|
.split("\x1e")
|
|
175
203
|
.map((record) => record.trim())
|
|
@@ -213,13 +241,24 @@ function commitMatchesMilestone(message, milestoneId, files) {
|
|
|
213
241
|
if (commitTrailerStartsWithMilestone(message, milestoneId))
|
|
214
242
|
return true;
|
|
215
243
|
// Meaningful execute-task commits currently store task scope as Sxx/Tyy
|
|
216
|
-
// rather than Mxx/Sxx/Tyy. Bind those commits back to the milestone
|
|
217
|
-
//
|
|
244
|
+
// rather than Mxx/Sxx/Tyy. Bind those commits back to the milestone when
|
|
245
|
+
// either the commit touched this milestone's artifacts, or — for projects
|
|
246
|
+
// where .gsd/ is gitignored/external (#5033) — the message explicitly
|
|
247
|
+
// names the milestone.
|
|
218
248
|
if (/^GSD-Task:\s*S[^/\s]+\/T\S+/m.test(message)) {
|
|
219
|
-
|
|
249
|
+
if (files.some((file) => isMilestoneArtifactPath(file, milestoneId)))
|
|
250
|
+
return true;
|
|
251
|
+
if (commitMessageMentionsMilestone(message, milestoneId))
|
|
252
|
+
return true;
|
|
220
253
|
}
|
|
221
254
|
return false;
|
|
222
255
|
}
|
|
256
|
+
function commitMessageMentionsMilestone(message, milestoneId) {
|
|
257
|
+
if (!MILESTONE_ID_RE.test(milestoneId))
|
|
258
|
+
return false;
|
|
259
|
+
const escapedMilestone = milestoneId.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
260
|
+
return new RegExp(`\\b${escapedMilestone}\\b`).test(message);
|
|
261
|
+
}
|
|
223
262
|
function commitTrailerStartsWithMilestone(message, milestoneId) {
|
|
224
263
|
const escapedMilestone = milestoneId.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
225
264
|
const trailerPattern = new RegExp(`^GSD-(?:Task|Unit):\\s*${escapedMilestone}(?:$|[\\s/])`, "m");
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// GSD auto-mode runtime state
|
|
2
|
+
import { AutoSession } from "./auto/session.js";
|
|
3
|
+
import { isDeterministicPolicyError, isQueuedUserMessageSkip, isToolInvocationError, markToolEnd as markTrackedToolEnd, markToolStart as markTrackedToolStart, } from "./auto-tool-tracking.js";
|
|
4
|
+
export const autoSession = new AutoSession();
|
|
5
|
+
export function getAutoRuntimeSnapshot() {
|
|
6
|
+
return {
|
|
7
|
+
active: autoSession.active,
|
|
8
|
+
paused: autoSession.paused,
|
|
9
|
+
currentUnit: autoSession.currentUnit ? { ...autoSession.currentUnit } : null,
|
|
10
|
+
basePath: autoSession.basePath,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export function isAutoActive() {
|
|
14
|
+
return autoSession.active;
|
|
15
|
+
}
|
|
16
|
+
export function isAutoPaused() {
|
|
17
|
+
return autoSession.paused;
|
|
18
|
+
}
|
|
19
|
+
export function markToolStart(toolCallId, toolName) {
|
|
20
|
+
markTrackedToolStart(toolCallId, autoSession.active, toolName);
|
|
21
|
+
}
|
|
22
|
+
export function markToolEnd(toolCallId) {
|
|
23
|
+
markTrackedToolEnd(toolCallId);
|
|
24
|
+
}
|
|
25
|
+
export function recordToolInvocationError(toolName, errorMsg) {
|
|
26
|
+
if (!autoSession.active)
|
|
27
|
+
return;
|
|
28
|
+
if (isToolInvocationError(errorMsg) || isQueuedUserMessageSkip(errorMsg) || isDeterministicPolicyError(errorMsg)) {
|
|
29
|
+
autoSession.lastToolInvocationError = `${toolName}: ${errorMsg}`;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -208,7 +208,7 @@ export function auditOrphanedMilestoneBranches(basePath, isolationMode) {
|
|
|
208
208
|
else {
|
|
209
209
|
// Branch is NOT merged — preserve for safety, warn the user
|
|
210
210
|
warnings.push(`Branch ${branch} exists for completed milestone ${milestoneId} but is NOT merged into ${mainBranch}. ` +
|
|
211
|
-
`This may contain unmerged work. Merge manually or run \`/gsd
|
|
211
|
+
`This may contain unmerged work. Merge manually or run \`/gsd doctor fix\` to resolve.`);
|
|
212
212
|
// #4764 telemetry
|
|
213
213
|
try {
|
|
214
214
|
emitWorktreeOrphaned(basePath, milestoneId, {
|
|
@@ -139,6 +139,6 @@ export const DETERMINISTIC_POLICY_ERROR_STRINGS = [
|
|
|
139
139
|
export function isDeterministicPolicyError(errorMsg) {
|
|
140
140
|
if (!errorMsg)
|
|
141
141
|
return false;
|
|
142
|
-
return
|
|
143
|
-
DETERMINISTIC_POLICY_ERROR_STRINGS.some(s => errorMsg.includes(s))
|
|
142
|
+
return DETERMINISTIC_POLICY_ERROR_RE.test(errorMsg)
|
|
143
|
+
|| DETERMINISTIC_POLICY_ERROR_STRINGS.some(s => errorMsg.includes(s));
|
|
144
144
|
}
|
|
@@ -857,6 +857,11 @@ export function runWorktreePostCreateHook(sourceDir, worktreeDir, hookPath) {
|
|
|
857
857
|
export function autoWorktreeBranch(milestoneId) {
|
|
858
858
|
return `milestone/${milestoneId}`;
|
|
859
859
|
}
|
|
860
|
+
function normalizeLocalBranchRef(branch) {
|
|
861
|
+
return branch.startsWith("refs/heads/")
|
|
862
|
+
? branch.slice("refs/heads/".length)
|
|
863
|
+
: branch;
|
|
864
|
+
}
|
|
860
865
|
// ─── Branch-mode Entry ─────────────────────────────────────────────────────
|
|
861
866
|
/**
|
|
862
867
|
* Enter branch isolation mode for a milestone.
|
|
@@ -1033,6 +1038,13 @@ function reconcilePlanCheckboxes(projectRoot, wtPath, milestoneId) {
|
|
|
1033
1038
|
}
|
|
1034
1039
|
}
|
|
1035
1040
|
export function createAutoWorktree(basePath, milestoneId) {
|
|
1041
|
+
// Check if repo has commits — git worktree requires a valid HEAD
|
|
1042
|
+
try {
|
|
1043
|
+
execFileSync("git", ["rev-parse", "--verify", "HEAD"], { cwd: basePath, stdio: "pipe" });
|
|
1044
|
+
}
|
|
1045
|
+
catch {
|
|
1046
|
+
throw new GSDError(GSD_GIT_ERROR, `Cannot create worktree: repository has no commits yet. Worktree isolation requires at least one commit.`);
|
|
1047
|
+
}
|
|
1036
1048
|
const branch = autoWorktreeBranch(milestoneId);
|
|
1037
1049
|
// Check if the milestone branch already exists — it survives auto-mode
|
|
1038
1050
|
// stop/pause and contains committed work from prior sessions. If it exists,
|
|
@@ -1408,6 +1420,10 @@ export function mergeMilestoneToMain(originalBasePath_, milestoneId, roadmapCont
|
|
|
1408
1420
|
}
|
|
1409
1421
|
}
|
|
1410
1422
|
// 3. chdir to original base
|
|
1423
|
+
// Note: previousCwd captures the cwd at this point — i.e. the worktree cwd
|
|
1424
|
+
// entering the function. Subsequent throws restore to previousCwd, leaving
|
|
1425
|
+
// the caller in worktree-cwd; callers (worktree-resolver) are responsible
|
|
1426
|
+
// for any further cwd movement on the error path.
|
|
1411
1427
|
const previousCwd = process.cwd();
|
|
1412
1428
|
process.chdir(originalBasePath_);
|
|
1413
1429
|
// 4. Resolve integration branch — prefer milestone metadata, then preferences,
|
|
@@ -1422,6 +1438,20 @@ export function mergeMilestoneToMain(originalBasePath_, milestoneId, roadmapCont
|
|
|
1422
1438
|
? prefs.main_branch
|
|
1423
1439
|
: undefined;
|
|
1424
1440
|
const mainBranch = integrationBranch ?? validatedPrefBranch ?? nativeDetectMainBranch(originalBasePath_);
|
|
1441
|
+
// Fail closed when the resolved integration branch is the milestone branch
|
|
1442
|
+
// itself (#5024). Stale or corrupt metadata (e.g. integrationBranch recorded
|
|
1443
|
+
// as "milestone/<MID>") would otherwise let the squash merge resolve to a
|
|
1444
|
+
// self-merge: nothing-to-commit + empty self-diff in the post-merge safety
|
|
1445
|
+
// check (#1792) collapse to a false success, and the worktree-resolver
|
|
1446
|
+
// emits worktree-merged for work that never landed on a distinct
|
|
1447
|
+
// integration branch.
|
|
1448
|
+
if (normalizeLocalBranchRef(mainBranch) === milestoneBranch) {
|
|
1449
|
+
process.chdir(previousCwd);
|
|
1450
|
+
throw new GSDError(GSD_GIT_ERROR, `Resolved integration branch "${mainBranch}" is the same ref as milestone branch ` +
|
|
1451
|
+
`"${milestoneBranch}" — refusing to self-merge. Integration branch metadata is invalid; ` +
|
|
1452
|
+
`set a distinct main_branch in GSD preferences or repair the milestone integration record ` +
|
|
1453
|
+
`before retrying milestone completion.`);
|
|
1454
|
+
}
|
|
1425
1455
|
// Remove transient project-root state files before any branch or merge
|
|
1426
1456
|
// operation. Untracked milestone metadata can otherwise block squash merges.
|
|
1427
1457
|
clearProjectRootStateFiles(originalBasePath_, milestoneId);
|
|
@@ -80,13 +80,12 @@ import { runAutoLoopWithUok } from "./uok/kernel.js";
|
|
|
80
80
|
import { resolveUokFlags } from "./uok/flags.js";
|
|
81
81
|
import { WorktreeResolver, } from "./worktree-resolver.js";
|
|
82
82
|
import { reorderForCaching } from "./prompt-ordering.js";
|
|
83
|
-
// ─── Session State ─────────────────────────────────────────────────────────
|
|
84
|
-
import { AutoSession, } from "./auto/session.js";
|
|
85
83
|
export { STUB_RECOVERY_THRESHOLD, NEW_SESSION_TIMEOUT_MS, } from "./auto/session.js";
|
|
84
|
+
import { autoSession as s } from "./auto-runtime-state.js";
|
|
86
85
|
// ── ENCAPSULATION INVARIANT ─────────────────────────────────────────────────
|
|
87
86
|
// ALL mutable auto-mode state lives in the AutoSession class (auto/session.ts).
|
|
88
87
|
// This file must NOT declare module-level `let` or `var` variables for state.
|
|
89
|
-
// The single `s` instance below is the only mutable
|
|
88
|
+
// The single shared `s` instance below is the only mutable AutoSession binding.
|
|
90
89
|
//
|
|
91
90
|
// When adding features or fixing bugs:
|
|
92
91
|
// - New mutable state → add a property to AutoSession, not a module-level variable
|
|
@@ -95,7 +94,6 @@ export { STUB_RECOVERY_THRESHOLD, NEW_SESSION_TIMEOUT_MS, } from "./auto/session
|
|
|
95
94
|
//
|
|
96
95
|
// Tests in auto-session-encapsulation.test.ts enforce this invariant.
|
|
97
96
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
98
|
-
const s = new AutoSession();
|
|
99
97
|
/** Throttle STATE.md rebuilds — at most once per 30 seconds */
|
|
100
98
|
const STATE_REBUILD_MIN_INTERVAL_MS = 30_000;
|
|
101
99
|
function captureProjectRootEnv(projectRoot) {
|
|
@@ -1408,10 +1406,21 @@ const widgetStateAccessors = {
|
|
|
1408
1406
|
* Ensure directories, branches, and other prerequisites exist before
|
|
1409
1407
|
* dispatching a unit. The LLM should never need to mkdir or git checkout.
|
|
1410
1408
|
*/
|
|
1411
|
-
function ensurePreconditions(unitType, unitId, base, state) {
|
|
1409
|
+
export function ensurePreconditions(unitType, unitId, base, state) {
|
|
1412
1410
|
const { milestone: mid, slice: sid } = parseUnitId(unitId);
|
|
1413
1411
|
const mDir = resolveMilestonePath(base, mid);
|
|
1414
1412
|
if (!mDir) {
|
|
1413
|
+
// Fix #4996: When dispatching a slice unit against an unrecognised milestone,
|
|
1414
|
+
// only create the directory if the milestone has a DB row.
|
|
1415
|
+
// Without this guard, forward-referenced unit IDs (e.g. from REQUIREMENTS.md)
|
|
1416
|
+
// silently scaffold empty stub directories that later skew nextMilestoneId.
|
|
1417
|
+
if (sid !== undefined) {
|
|
1418
|
+
const hasDbRow = isDbAvailable() && getMilestone(mid) != null;
|
|
1419
|
+
if (!hasDbRow) {
|
|
1420
|
+
logWarning("engine", `ensurePreconditions: skipping mkdir for unrecognised milestone ${mid} referenced by slice unit ${unitId} — no DB row exists`, { file: "auto.ts" });
|
|
1421
|
+
return;
|
|
1422
|
+
}
|
|
1423
|
+
}
|
|
1415
1424
|
const newDir = join(milestonesDir(base), mid);
|
|
1416
1425
|
mkdirSync(join(newDir, "slices"), { recursive: true });
|
|
1417
1426
|
}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { Type } from "@sinclair/typebox";
|
|
2
2
|
import { Text } from "@gsd/pi-tui";
|
|
3
|
-
import { findMilestoneIds, nextMilestoneId, claimReservedId, getReservedMilestoneIds } from "../guided-flow.js";
|
|
4
3
|
import { loadEffectiveGSDPreferences } from "../preferences.js";
|
|
5
4
|
import { ensureDbOpen } from "./dynamic-tools.js";
|
|
6
5
|
import { StringEnum } from "@gsd/pi-ai";
|
|
7
6
|
import { logError } from "../workflow-logger.js";
|
|
8
|
-
|
|
7
|
+
async function loadWorkflowExecutors() {
|
|
8
|
+
return import("../tools/workflow-tool-executors.js");
|
|
9
|
+
}
|
|
9
10
|
/**
|
|
10
11
|
* Register an alias tool that shares the same execute function as its canonical counterpart.
|
|
11
12
|
* The alias description and promptGuidelines direct the LLM to prefer the canonical name.
|
|
@@ -280,6 +281,7 @@ export function registerDbTools(pi) {
|
|
|
280
281
|
registerAlias(pi, requirementSaveTool, "gsd_save_requirement", "gsd_requirement_save");
|
|
281
282
|
// ─── gsd_summary_save (formerly gsd_save_summary) ──────────────────────
|
|
282
283
|
const summarySaveExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
|
|
284
|
+
const { executeSummarySave } = await loadWorkflowExecutors();
|
|
283
285
|
return executeSummarySave(params, process.cwd());
|
|
284
286
|
};
|
|
285
287
|
const summarySaveTool = {
|
|
@@ -330,6 +332,7 @@ export function registerDbTools(pi) {
|
|
|
330
332
|
try {
|
|
331
333
|
// Claim a reserved ID if the guided-flow already previewed one to the user.
|
|
332
334
|
// This guarantees the ID shown in the UI matches the one materialised on disk.
|
|
335
|
+
const { claimReservedId, findMilestoneIds, getReservedMilestoneIds, nextMilestoneId } = await import("../guided-flow.js");
|
|
333
336
|
const reserved = claimReservedId();
|
|
334
337
|
if (reserved) {
|
|
335
338
|
await ensureMilestoneDbRow(reserved);
|
|
@@ -408,6 +411,7 @@ export function registerDbTools(pi) {
|
|
|
408
411
|
registerAlias(pi, milestoneGenerateIdTool, "gsd_generate_milestone_id", "gsd_milestone_generate_id");
|
|
409
412
|
// ─── gsd_plan_milestone (gsd_milestone_plan alias) ─────────────────────
|
|
410
413
|
const planMilestoneExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
|
|
414
|
+
const { executePlanMilestone } = await loadWorkflowExecutors();
|
|
411
415
|
return executePlanMilestone(params, process.cwd());
|
|
412
416
|
};
|
|
413
417
|
const planMilestoneTool = {
|
|
@@ -472,6 +476,7 @@ export function registerDbTools(pi) {
|
|
|
472
476
|
registerAlias(pi, planMilestoneTool, "gsd_milestone_plan", "gsd_plan_milestone");
|
|
473
477
|
// ─── gsd_plan_slice (gsd_slice_plan alias) ─────────────────────────────
|
|
474
478
|
const planSliceExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
|
|
479
|
+
const { executePlanSlice } = await loadWorkflowExecutors();
|
|
475
480
|
return executePlanSlice(params, process.cwd());
|
|
476
481
|
};
|
|
477
482
|
const planSliceTool = {
|
|
@@ -585,6 +590,7 @@ export function registerDbTools(pi) {
|
|
|
585
590
|
registerAlias(pi, planTaskTool, "gsd_task_plan", "gsd_plan_task");
|
|
586
591
|
// ─── gsd_task_complete (gsd_complete_task alias) ────────────────────────
|
|
587
592
|
const taskCompleteExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
|
|
593
|
+
const { executeTaskComplete } = await loadWorkflowExecutors();
|
|
588
594
|
return executeTaskComplete(params, process.cwd());
|
|
589
595
|
};
|
|
590
596
|
const taskCompleteTool = {
|
|
@@ -647,6 +653,7 @@ export function registerDbTools(pi) {
|
|
|
647
653
|
registerAlias(pi, taskCompleteTool, "gsd_complete_task", "gsd_task_complete");
|
|
648
654
|
// ─── gsd_slice_complete (gsd_complete_slice alias) ─────────────────────
|
|
649
655
|
const sliceCompleteExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
|
|
656
|
+
const { executeSliceComplete } = await loadWorkflowExecutors();
|
|
650
657
|
return executeSliceComplete(params, process.cwd());
|
|
651
658
|
};
|
|
652
659
|
const sliceCompleteTool = {
|
|
@@ -811,6 +818,7 @@ export function registerDbTools(pi) {
|
|
|
811
818
|
});
|
|
812
819
|
// ─── gsd_complete_milestone ────────────────────────────────────────────
|
|
813
820
|
const milestoneCompleteExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
|
|
821
|
+
const { executeCompleteMilestone } = await loadWorkflowExecutors();
|
|
814
822
|
return executeCompleteMilestone(params, process.cwd());
|
|
815
823
|
};
|
|
816
824
|
const milestoneCompleteTool = {
|
|
@@ -851,6 +859,7 @@ export function registerDbTools(pi) {
|
|
|
851
859
|
registerAlias(pi, milestoneCompleteTool, "gsd_milestone_complete", "gsd_complete_milestone");
|
|
852
860
|
// ─── gsd_validate_milestone (gsd_milestone_validate alias) ─────────────
|
|
853
861
|
const milestoneValidateExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
|
|
862
|
+
const { executeValidateMilestone } = await loadWorkflowExecutors();
|
|
854
863
|
return executeValidateMilestone(params, process.cwd());
|
|
855
864
|
};
|
|
856
865
|
const milestoneValidateTool = {
|
|
@@ -883,6 +892,7 @@ export function registerDbTools(pi) {
|
|
|
883
892
|
registerAlias(pi, milestoneValidateTool, "gsd_milestone_validate", "gsd_validate_milestone");
|
|
884
893
|
// ─── gsd_replan_slice (gsd_slice_replan alias) ─────────────────────────
|
|
885
894
|
const replanSliceExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
|
|
895
|
+
const { executeReplanSlice } = await loadWorkflowExecutors();
|
|
886
896
|
return executeReplanSlice(params, process.cwd());
|
|
887
897
|
};
|
|
888
898
|
const replanSliceTool = {
|
|
@@ -925,6 +935,7 @@ export function registerDbTools(pi) {
|
|
|
925
935
|
registerAlias(pi, replanSliceTool, "gsd_slice_replan", "gsd_replan_slice");
|
|
926
936
|
// ─── gsd_reassess_roadmap (gsd_roadmap_reassess alias) ─────────────────
|
|
927
937
|
const reassessRoadmapExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
|
|
938
|
+
const { executeReassessRoadmap } = await loadWorkflowExecutors();
|
|
928
939
|
return executeReassessRoadmap(params, process.cwd());
|
|
929
940
|
};
|
|
930
941
|
const reassessRoadmapTool = {
|
|
@@ -1157,6 +1168,7 @@ export function registerDbTools(pi) {
|
|
|
1157
1168
|
registerAlias(pi, reopenMilestoneTool, "gsd_reopen_milestone", "gsd_milestone_reopen");
|
|
1158
1169
|
// ─── gsd_save_gate_result ──────────────────────────────────────────────
|
|
1159
1170
|
const saveGateResultExecute = async (_toolCallId, params, _signal, _onUpdate, _ctx) => {
|
|
1171
|
+
const { executeSaveGateResult } = await loadWorkflowExecutors();
|
|
1160
1172
|
return executeSaveGateResult(params, process.cwd());
|
|
1161
1173
|
};
|
|
1162
1174
|
const saveGateResultTool = {
|
|
@@ -3,11 +3,6 @@
|
|
|
3
3
|
// Exposes the `gsd_exec` tool over MCP. Opt-in: disabled unless
|
|
4
4
|
// `context_mode.enabled: true` is set in preferences.
|
|
5
5
|
import { Type } from "@sinclair/typebox";
|
|
6
|
-
import { executeGsdExec } from "../tools/exec-tool.js";
|
|
7
|
-
import { executeExecSearch } from "../tools/exec-search-tool.js";
|
|
8
|
-
import { executeResume } from "../tools/resume-tool.js";
|
|
9
|
-
import { loadEffectiveGSDPreferences } from "../preferences.js";
|
|
10
|
-
import { logWarning } from "../workflow-logger.js";
|
|
11
6
|
export function registerExecTools(pi) {
|
|
12
7
|
pi.registerTool({
|
|
13
8
|
name: "gsd_exec",
|
|
@@ -35,6 +30,11 @@ export function registerExecTools(pi) {
|
|
|
35
30
|
})),
|
|
36
31
|
}),
|
|
37
32
|
async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
|
|
33
|
+
const [{ executeGsdExec }, { loadEffectiveGSDPreferences }, { logWarning }] = await Promise.all([
|
|
34
|
+
import("../tools/exec-tool.js"),
|
|
35
|
+
import("../preferences.js"),
|
|
36
|
+
import("../workflow-logger.js"),
|
|
37
|
+
]);
|
|
38
38
|
let prefs = null;
|
|
39
39
|
try {
|
|
40
40
|
prefs = loadEffectiveGSDPreferences();
|
|
@@ -67,6 +67,7 @@ export function registerExecTools(pi) {
|
|
|
67
67
|
limit: Type.Optional(Type.Number({ description: "Max results (default 20, cap 200)", minimum: 1, maximum: 200 })),
|
|
68
68
|
}),
|
|
69
69
|
async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
|
|
70
|
+
const { executeExecSearch } = await import("../tools/exec-search-tool.js");
|
|
70
71
|
return executeExecSearch(params, {
|
|
71
72
|
baseDir: process.cwd(),
|
|
72
73
|
});
|
|
@@ -85,6 +86,7 @@ export function registerExecTools(pi) {
|
|
|
85
86
|
],
|
|
86
87
|
parameters: Type.Object({}),
|
|
87
88
|
async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
|
|
89
|
+
const { executeResume } = await import("../tools/resume-tool.js");
|
|
88
90
|
return executeResume(params, {
|
|
89
91
|
baseDir: process.cwd(),
|
|
90
92
|
});
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
// GSD2 — Read-only query tools exposing DB state to the LLM via the WAL connection
|
|
2
2
|
import { Type } from "@sinclair/typebox";
|
|
3
3
|
import { ensureDbOpen } from "./dynamic-tools.js";
|
|
4
|
-
import { executeMilestoneStatus } from "../tools/workflow-tool-executors.js";
|
|
5
|
-
import { checkpointDatabase } from "../gsd-db.js";
|
|
6
4
|
export function registerQueryTools(pi) {
|
|
7
5
|
pi.registerTool({
|
|
8
6
|
name: "gsd_milestone_status",
|
|
@@ -25,6 +23,7 @@ export function registerQueryTools(pi) {
|
|
|
25
23
|
details: { operation: "milestone_status", error: "db_unavailable" },
|
|
26
24
|
};
|
|
27
25
|
}
|
|
26
|
+
const { executeMilestoneStatus } = await import("../tools/workflow-tool-executors.js");
|
|
28
27
|
return executeMilestoneStatus(params);
|
|
29
28
|
},
|
|
30
29
|
});
|
|
@@ -49,6 +48,7 @@ export function registerQueryTools(pi) {
|
|
|
49
48
|
details: { operation: "checkpoint_db", error: "db_unavailable" },
|
|
50
49
|
};
|
|
51
50
|
}
|
|
51
|
+
const { checkpointDatabase } = await import("../gsd-db.js");
|
|
52
52
|
checkpointDatabase();
|
|
53
53
|
return {
|
|
54
54
|
content: [{ type: "text", text: "WAL checkpoint complete. gsd.db is now up to date and safe to stage with git add." }],
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
// GSD2 — Extension registration: wires all GSD tools, commands, and hooks into pi
|
|
2
2
|
import { registerExitCommand } from "../exit-command.js";
|
|
3
|
-
import {
|
|
4
|
-
import { loadEcosystemExtensions } from "../ecosystem/loader.js";
|
|
3
|
+
import { registerLazyWorktreeCommands } from "../worktree-command-bootstrap.js";
|
|
5
4
|
import { registerDbTools } from "./db-tools.js";
|
|
6
5
|
import { registerDynamicTools } from "./dynamic-tools.js";
|
|
7
6
|
import { registerExecTools } from "./exec-tools.js";
|
|
@@ -64,7 +63,7 @@ function installEpipeGuard() {
|
|
|
64
63
|
export function registerGsdExtension(pi) {
|
|
65
64
|
// Note: registerGSDCommand is called by index.ts before this function,
|
|
66
65
|
// so we intentionally skip it here to avoid double-registration.
|
|
67
|
-
|
|
66
|
+
registerLazyWorktreeCommands(pi);
|
|
68
67
|
registerExitCommand(pi);
|
|
69
68
|
// Wire the Layer 2 event emitter bridge so deeply-nested GSD code can emit
|
|
70
69
|
// extension events (git lifecycle, verify, budget, milestone, unit) without
|
|
@@ -102,7 +101,9 @@ export function registerGsdExtension(pi) {
|
|
|
102
101
|
["cmux-events", () => initCmuxEventListeners(pi.events)],
|
|
103
102
|
["hooks", () => registerHooks(pi, ecosystemHandlers)],
|
|
104
103
|
["ecosystem", () => {
|
|
105
|
-
void
|
|
104
|
+
void import("../ecosystem/loader.js")
|
|
105
|
+
.then(({ loadEcosystemExtensions }) => loadEcosystemExtensions(pi, ecosystemHandlers))
|
|
106
|
+
.catch((err) => {
|
|
106
107
|
logWarning("ecosystem", `loader failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
107
108
|
});
|
|
108
109
|
}],
|