gsd-pi 2.73.1 → 2.74.0-dev.2b524c3
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/dist/cli-web-branch.d.ts +4 -3
- package/dist/cli-web-branch.js +10 -7
- package/dist/cli.js +99 -206
- package/dist/logo.d.ts +1 -1
- package/dist/logo.js +1 -1
- package/dist/onboarding.js +59 -53
- package/dist/resource-loader.js +2 -2
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +68 -4
- package/dist/resources/extensions/gsd/auto/phases.js +15 -9
- package/dist/resources/extensions/gsd/auto-dispatch.js +11 -3
- package/dist/resources/extensions/gsd/auto-model-selection.js +54 -11
- package/dist/resources/extensions/gsd/auto-post-unit.js +41 -1
- package/dist/resources/extensions/gsd/auto-start.js +23 -6
- package/dist/resources/extensions/gsd/auto-timeout-recovery.js +13 -0
- package/dist/resources/extensions/gsd/auto-verification.js +88 -3
- package/dist/resources/extensions/gsd/auto.js +29 -8
- package/dist/resources/extensions/gsd/commands-handlers.js +8 -2
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +1 -1
- package/dist/resources/extensions/gsd/notification-widget.js +2 -2
- package/dist/resources/extensions/gsd/preferences-models.js +43 -0
- package/dist/resources/extensions/gsd/preferences-types.js +1 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +22 -0
- package/dist/resources/extensions/gsd/state.js +61 -14
- package/dist/update-check.d.ts +1 -0
- package/dist/update-check.js +13 -5
- package/dist/update-cmd.js +4 -3
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/required-server-files.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
- package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +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 +11 -11
- 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.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/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-f1e30ab6bb269149.js +1 -0
- package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
- package/dist/web/standalone/server.js +1 -1
- package/package.json +1 -2
- package/packages/pi-ai/dist/index.d.ts +1 -0
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +1 -0
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/utils/overflow.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/overflow.js +12 -0
- package/packages/pi-ai/dist/utils/overflow.js.map +1 -1
- package/packages/pi-ai/dist/utils/tests/overflow.test.d.ts +2 -0
- package/packages/pi-ai/dist/utils/tests/overflow.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/utils/tests/overflow.test.js +50 -0
- package/packages/pi-ai/dist/utils/tests/overflow.test.js.map +1 -0
- package/packages/pi-ai/src/index.ts +4 -0
- package/packages/pi-ai/src/utils/overflow.ts +14 -1
- package/packages/pi-ai/src/utils/tests/overflow.test.ts +58 -0
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +313 -8
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/utils.js +5 -5
- package/packages/pi-coding-agent/dist/core/compaction/utils.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction-utils.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/compaction-utils.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/compaction-utils.test.js +45 -0
- package/packages/pi-coding-agent/dist/core/compaction-utils.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts +12 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +61 -28
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.d.ts +2 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js +9 -3
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js +52 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +94 -16
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +11 -3
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +355 -8
- package/packages/pi-coding-agent/src/core/compaction/utils.ts +5 -5
- package/packages/pi-coding-agent/src/core/compaction-utils.test.ts +50 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +74 -32
- package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.test.ts +73 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.ts +9 -3
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +113 -21
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +11 -3
- package/packages/pi-tui/dist/__tests__/tui.test.js +60 -1
- package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts +8 -0
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +32 -3
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/src/__tests__/tui.test.ts +76 -1
- package/packages/pi-tui/src/tui.ts +31 -3
- package/pkg/package.json +1 -1
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +107 -5
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +111 -2
- package/src/resources/extensions/gsd/auto/phases.ts +22 -9
- package/src/resources/extensions/gsd/auto-dispatch.ts +10 -4
- package/src/resources/extensions/gsd/auto-model-selection.ts +85 -11
- package/src/resources/extensions/gsd/auto-post-unit.ts +47 -1
- package/src/resources/extensions/gsd/auto-start.ts +30 -6
- package/src/resources/extensions/gsd/auto-timeout-recovery.ts +17 -0
- package/src/resources/extensions/gsd/auto-verification.ts +98 -3
- package/src/resources/extensions/gsd/auto.ts +31 -14
- package/src/resources/extensions/gsd/commands-handlers.ts +8 -2
- package/src/resources/extensions/gsd/docs/preferences-reference.md +1 -1
- package/src/resources/extensions/gsd/notification-widget.ts +2 -2
- package/src/resources/extensions/gsd/preferences-models.ts +41 -0
- package/src/resources/extensions/gsd/preferences-types.ts +12 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +23 -0
- package/src/resources/extensions/gsd/state.ts +71 -15
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/auto-start-model-capture.test.ts +51 -2
- package/src/resources/extensions/gsd/tests/complete-milestone-false-merge.test.ts +142 -0
- package/src/resources/extensions/gsd/tests/completed-at-reconcile.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +68 -8
- package/src/resources/extensions/gsd/tests/derive-state.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +137 -1
- package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/model-isolation.test.ts +91 -2
- package/src/resources/extensions/gsd/tests/preferences.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +5 -7
- package/src/resources/extensions/gsd/tests/token-profile.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +179 -0
- package/dist/web/standalone/.next/static/chunks/app/page-7115e62689b5fd84.js +0 -1
- package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
- /package/dist/web/standalone/.next/static/{Qr27MOHx0lxRGnJvlhxxu → YzIEI9sxJy4t5xgClF08g}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{Qr27MOHx0lxRGnJvlhxxu → YzIEI9sxJy4t5xgClF08g}/_ssgManifest.js +0 -0
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Tests for model config isolation between concurrent instances (#650, #1065)
|
|
3
|
-
*
|
|
2
|
+
* Tests for model config isolation between concurrent instances (#650, #1065),
|
|
3
|
+
* session-scoped model precedence behavior including manual session override,
|
|
4
|
+
* GSD preferences override of settings.json defaults (#3517), and custom
|
|
5
|
+
* provider precedence over PREFERENCES.md when set via `/gsd model` (#4122).
|
|
4
6
|
*/
|
|
5
7
|
|
|
6
8
|
import { describe, it, beforeEach, afterEach } from "node:test";
|
|
@@ -214,3 +216,90 @@ describe("manual session model override precedence", () => {
|
|
|
214
216
|
"should be null when no model source is available");
|
|
215
217
|
});
|
|
216
218
|
});
|
|
219
|
+
|
|
220
|
+
// ─── Custom provider session model wins over PREFERENCES.md (#4122) ─────────
|
|
221
|
+
|
|
222
|
+
describe("custom provider session model overrides PREFERENCES.md (#4122)", () => {
|
|
223
|
+
// Mirrors the auto-start.ts logic:
|
|
224
|
+
// sessionProviderIsCustom && ctx.model
|
|
225
|
+
// ? ctx.model
|
|
226
|
+
// : (preferredModel ?? ctx.model ?? null)
|
|
227
|
+
function selectStartModel(args: {
|
|
228
|
+
ctxModel: { provider: string; id: string } | null;
|
|
229
|
+
preferredModel: { provider: string; id: string } | undefined;
|
|
230
|
+
sessionProviderIsCustom: boolean;
|
|
231
|
+
}): { provider: string; id: string } | null {
|
|
232
|
+
const { ctxModel, preferredModel, sessionProviderIsCustom } = args;
|
|
233
|
+
if (sessionProviderIsCustom && ctxModel) {
|
|
234
|
+
return { provider: ctxModel.provider, id: ctxModel.id };
|
|
235
|
+
}
|
|
236
|
+
return preferredModel
|
|
237
|
+
?? (ctxModel ? { provider: ctxModel.provider, id: ctxModel.id } : null);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
it("custom provider from /gsd model wins over PREFERENCES.md built-in default", () => {
|
|
241
|
+
// User runs `/gsd model ollama/llama3.1:8b`, then `/gsd auto`.
|
|
242
|
+
// PREFERENCES.md still has the project-template claude-code default.
|
|
243
|
+
const ctxModel = { provider: "ollama", id: "llama3.1:8b" };
|
|
244
|
+
const preferredModel = { provider: "claude-code", id: "claude-sonnet-4-6" };
|
|
245
|
+
|
|
246
|
+
const snapshot = selectStartModel({
|
|
247
|
+
ctxModel,
|
|
248
|
+
preferredModel,
|
|
249
|
+
sessionProviderIsCustom: true,
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
assert.equal(snapshot?.provider, "ollama",
|
|
253
|
+
"custom-provider session model must win over PREFERENCES.md");
|
|
254
|
+
assert.equal(snapshot?.id, "llama3.1:8b",
|
|
255
|
+
"custom-provider session model id must be preserved");
|
|
256
|
+
assert.notEqual(snapshot?.provider, "claude-code",
|
|
257
|
+
"claude-code from PREFERENCES.md must NOT be selected when session is custom");
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
it("built-in session provider still defers to PREFERENCES.md (#3517 preserved)", () => {
|
|
261
|
+
// ctx.model is a built-in provider (claude-code) but PREFERENCES.md has
|
|
262
|
+
// an explicit openai-codex preference. PREFERENCES.md should still win.
|
|
263
|
+
const ctxModel = { provider: "claude-code", id: "claude-sonnet-4-6" };
|
|
264
|
+
const preferredModel = { provider: "openai-codex", id: "gpt-5.4" };
|
|
265
|
+
|
|
266
|
+
const snapshot = selectStartModel({
|
|
267
|
+
ctxModel,
|
|
268
|
+
preferredModel,
|
|
269
|
+
sessionProviderIsCustom: false,
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
assert.equal(snapshot?.provider, "openai-codex",
|
|
273
|
+
"PREFERENCES.md must still win when session provider is built-in");
|
|
274
|
+
assert.equal(snapshot?.id, "gpt-5.4");
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
it("custom provider with no PREFERENCES.md still uses ctx.model", () => {
|
|
278
|
+
const ctxModel = { provider: "vllm", id: "qwen2.5-coder:32b" };
|
|
279
|
+
|
|
280
|
+
const snapshot = selectStartModel({
|
|
281
|
+
ctxModel,
|
|
282
|
+
preferredModel: undefined,
|
|
283
|
+
sessionProviderIsCustom: true,
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
assert.equal(snapshot?.provider, "vllm");
|
|
287
|
+
assert.equal(snapshot?.id, "qwen2.5-coder:32b");
|
|
288
|
+
});
|
|
289
|
+
|
|
290
|
+
it("null ctx.model with custom flag falls through to preferredModel", () => {
|
|
291
|
+
// Defensive: sessionProviderIsCustom can only be true if ctx.model exists,
|
|
292
|
+
// but verify the guard works if that invariant is ever broken.
|
|
293
|
+
const preferredModel = { provider: "claude-code", id: "claude-sonnet-4-6" };
|
|
294
|
+
|
|
295
|
+
const snapshot = selectStartModel({
|
|
296
|
+
ctxModel: null,
|
|
297
|
+
preferredModel,
|
|
298
|
+
sessionProviderIsCustom: true,
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
assert.equal(snapshot?.provider, "claude-code",
|
|
302
|
+
"should fall back to preferredModel when ctx.model is null");
|
|
303
|
+
});
|
|
304
|
+
});
|
|
305
|
+
|
|
@@ -134,6 +134,53 @@ test("invalid value types produce errors and fall back to undefined", () => {
|
|
|
134
134
|
}
|
|
135
135
|
});
|
|
136
136
|
|
|
137
|
+
test("flat_rate_providers: accepts string array", () => {
|
|
138
|
+
const { errors, preferences } = validatePreferences({
|
|
139
|
+
flat_rate_providers: ["my-proxy", "private-cli"],
|
|
140
|
+
});
|
|
141
|
+
assert.equal(errors.length, 0);
|
|
142
|
+
assert.deepEqual(preferences.flat_rate_providers, ["my-proxy", "private-cli"]);
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
test("flat_rate_providers: trims whitespace and drops empty entries", () => {
|
|
146
|
+
const { errors, preferences } = validatePreferences({
|
|
147
|
+
flat_rate_providers: [" my-proxy ", "", " ", "private-cli"],
|
|
148
|
+
});
|
|
149
|
+
assert.equal(errors.length, 0);
|
|
150
|
+
assert.deepEqual(preferences.flat_rate_providers, ["my-proxy", "private-cli"]);
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
test("flat_rate_providers: non-array rejected", () => {
|
|
154
|
+
const { errors } = validatePreferences({
|
|
155
|
+
flat_rate_providers: "my-proxy" as any,
|
|
156
|
+
});
|
|
157
|
+
assert.ok(
|
|
158
|
+
errors.some(e => e.includes("flat_rate_providers")),
|
|
159
|
+
"should error on non-array value",
|
|
160
|
+
);
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
test("flat_rate_providers: non-string elements rejected", () => {
|
|
164
|
+
const { errors } = validatePreferences({
|
|
165
|
+
flat_rate_providers: ["ok", 123 as any, "also-ok"],
|
|
166
|
+
});
|
|
167
|
+
assert.ok(
|
|
168
|
+
errors.some(e => e.includes("flat_rate_providers")),
|
|
169
|
+
"should error when array contains non-strings",
|
|
170
|
+
);
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
test("flat_rate_providers is a recognized preference key (no warning)", () => {
|
|
174
|
+
const { warnings } = validatePreferences({
|
|
175
|
+
flat_rate_providers: ["my-proxy"],
|
|
176
|
+
});
|
|
177
|
+
assert.equal(
|
|
178
|
+
warnings.filter(w => w.includes("flat_rate_providers")).length,
|
|
179
|
+
0,
|
|
180
|
+
"flat_rate_providers must be in KNOWN_PREFERENCE_KEYS",
|
|
181
|
+
);
|
|
182
|
+
});
|
|
183
|
+
|
|
137
184
|
test("valid values pass through correctly", () => {
|
|
138
185
|
const { preferences: p1 } = validatePreferences({ budget_enforcement: "halt" });
|
|
139
186
|
assert.equal(p1.budget_enforcement, "halt");
|
|
@@ -811,9 +811,9 @@ describe("state-machine-full-walkthrough", () => {
|
|
|
811
811
|
assert.ok(state.blockers.length > 0, "should have blockers");
|
|
812
812
|
});
|
|
813
813
|
|
|
814
|
-
test("no eligible slice (all deps unmet) →
|
|
814
|
+
test("no eligible slice (all deps unmet) → fallback picks slice with most deps satisfied", async () => {
|
|
815
815
|
const base = createFixtureBase();
|
|
816
|
-
// S01 depends on S00 which doesn't exist
|
|
816
|
+
// S01 depends on S00 which doesn't exist — fallback picks S01 anyway
|
|
817
817
|
writeRoadmap(base, "M001", [
|
|
818
818
|
"# M001: Test Milestone",
|
|
819
819
|
"",
|
|
@@ -827,11 +827,9 @@ describe("state-machine-full-walkthrough", () => {
|
|
|
827
827
|
invalidateStateCache();
|
|
828
828
|
const state = await deriveState(base);
|
|
829
829
|
|
|
830
|
-
|
|
831
|
-
assert.
|
|
832
|
-
|
|
833
|
-
"blockers should mention dependency or eligibility",
|
|
834
|
-
);
|
|
830
|
+
// With partial-dep fallback, S01 is picked despite unmet dep on S00
|
|
831
|
+
assert.equal(state.phase, "planning");
|
|
832
|
+
assert.equal(state.activeSlice?.id, "S01");
|
|
835
833
|
});
|
|
836
834
|
});
|
|
837
835
|
|
|
@@ -263,6 +263,6 @@ test("dispatch: phase skip guards return null (not stop)", () => {
|
|
|
263
263
|
const researchGuard = dispatchSrc.match(/skip_research\).*?return null/s);
|
|
264
264
|
assert.ok(researchGuard, "skip_research guard should return null (fall-through)");
|
|
265
265
|
|
|
266
|
-
const reassessGuard = dispatchSrc.match(/reassess_after_slice
|
|
266
|
+
const reassessGuard = dispatchSrc.match(/reassess_after_slice.*?return null/s);
|
|
267
267
|
assert.ok(reassessGuard, "reassess_after_slice guard should return null (fall-through)");
|
|
268
268
|
});
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
// gsd-pi — Regression tests for the validate-milestone stuck-loop guard (#4094)
|
|
2
|
+
|
|
3
|
+
import { describe, test, mock, beforeEach, afterEach } from "node:test";
|
|
4
|
+
import assert from "node:assert/strict";
|
|
5
|
+
import { tmpdir } from "node:os";
|
|
6
|
+
import { mkdirSync, writeFileSync, rmSync } from "node:fs";
|
|
7
|
+
import { join } from "node:path";
|
|
8
|
+
|
|
9
|
+
import { runPostUnitVerification, type VerificationContext } from "../auto-verification.ts";
|
|
10
|
+
import { AutoSession } from "../auto/session.ts";
|
|
11
|
+
import {
|
|
12
|
+
openDatabase,
|
|
13
|
+
closeDatabase,
|
|
14
|
+
insertMilestone,
|
|
15
|
+
insertSlice,
|
|
16
|
+
} from "../gsd-db.ts";
|
|
17
|
+
import { invalidateAllCaches } from "../cache.ts";
|
|
18
|
+
import { _clearGsdRootCache } from "../paths.ts";
|
|
19
|
+
|
|
20
|
+
let tempDir: string;
|
|
21
|
+
let dbPath: string;
|
|
22
|
+
let originalCwd: string;
|
|
23
|
+
|
|
24
|
+
function makeMockCtx() {
|
|
25
|
+
return {
|
|
26
|
+
ui: {
|
|
27
|
+
notify: mock.fn(),
|
|
28
|
+
setStatus: () => {},
|
|
29
|
+
setWidget: () => {},
|
|
30
|
+
setFooter: () => {},
|
|
31
|
+
},
|
|
32
|
+
model: { id: "test-model" },
|
|
33
|
+
} as any;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function makeMockPi() {
|
|
37
|
+
return {
|
|
38
|
+
sendMessage: mock.fn(),
|
|
39
|
+
setModel: mock.fn(async () => true),
|
|
40
|
+
} as any;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function makeMockSession(basePath: string, unitType: string, unitId: string): AutoSession {
|
|
44
|
+
const s = new AutoSession();
|
|
45
|
+
s.basePath = basePath;
|
|
46
|
+
s.active = true;
|
|
47
|
+
s.pendingVerificationRetry = null;
|
|
48
|
+
s.currentUnit = { type: unitType, id: unitId, startedAt: Date.now() };
|
|
49
|
+
return s;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function setupTestEnvironment(): void {
|
|
53
|
+
originalCwd = process.cwd();
|
|
54
|
+
tempDir = join(tmpdir(), `validate-milestone-guard-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
55
|
+
mkdirSync(tempDir, { recursive: true });
|
|
56
|
+
|
|
57
|
+
const milestoneDir = join(tempDir, ".gsd", "milestones", "M001");
|
|
58
|
+
mkdirSync(milestoneDir, { recursive: true });
|
|
59
|
+
|
|
60
|
+
process.chdir(tempDir);
|
|
61
|
+
_clearGsdRootCache();
|
|
62
|
+
|
|
63
|
+
dbPath = join(tempDir, ".gsd", "gsd.db");
|
|
64
|
+
openDatabase(dbPath);
|
|
65
|
+
invalidateAllCaches();
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function cleanupTestEnvironment(): void {
|
|
69
|
+
try { process.chdir(originalCwd); } catch { /* ignore */ }
|
|
70
|
+
try { closeDatabase(); } catch { /* ignore */ }
|
|
71
|
+
try { rmSync(tempDir, { recursive: true, force: true }); } catch { /* ignore */ }
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function writeValidationFile(verdict: string): void {
|
|
75
|
+
const path = join(tempDir, ".gsd", "milestones", "M001", "M001-VALIDATION.md");
|
|
76
|
+
const content = `---
|
|
77
|
+
verdict: ${verdict}
|
|
78
|
+
remediation_round: 1
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
# Milestone Validation: M001
|
|
82
|
+
|
|
83
|
+
## Verdict Rationale
|
|
84
|
+
Test fixture
|
|
85
|
+
`;
|
|
86
|
+
writeFileSync(path, content, "utf-8");
|
|
87
|
+
invalidateAllCaches();
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
describe("validate-milestone stuck-loop guard (#4094)", () => {
|
|
91
|
+
beforeEach(() => setupTestEnvironment());
|
|
92
|
+
afterEach(() => cleanupTestEnvironment());
|
|
93
|
+
|
|
94
|
+
test("pauses when verdict=needs-remediation and all slices are closed", async () => {
|
|
95
|
+
insertMilestone({ id: "M001" });
|
|
96
|
+
insertSlice({ id: "S01", milestoneId: "M001", title: "Slice 1", status: "complete" });
|
|
97
|
+
insertSlice({ id: "S02", milestoneId: "M001", title: "Slice 2", status: "done" });
|
|
98
|
+
writeValidationFile("needs-remediation");
|
|
99
|
+
|
|
100
|
+
const ctx = makeMockCtx();
|
|
101
|
+
const pi = makeMockPi();
|
|
102
|
+
const pauseAutoMock = mock.fn(async () => {});
|
|
103
|
+
const s = makeMockSession(tempDir, "validate-milestone", "M001");
|
|
104
|
+
|
|
105
|
+
const result = await runPostUnitVerification({ s, ctx, pi } as VerificationContext, pauseAutoMock);
|
|
106
|
+
|
|
107
|
+
assert.equal(result, "pause");
|
|
108
|
+
assert.equal(pauseAutoMock.mock.callCount(), 1);
|
|
109
|
+
assert.equal(ctx.ui.notify.mock.callCount(), 1);
|
|
110
|
+
const notifyArgs = ctx.ui.notify.mock.calls[0].arguments;
|
|
111
|
+
assert.match(notifyArgs[0], /needs-remediation/);
|
|
112
|
+
assert.equal(notifyArgs[1], "error");
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
test("treats skipped slices as closed", async () => {
|
|
116
|
+
insertMilestone({ id: "M001" });
|
|
117
|
+
insertSlice({ id: "S01", milestoneId: "M001", title: "Slice 1", status: "complete" });
|
|
118
|
+
insertSlice({ id: "S02", milestoneId: "M001", title: "Slice 2", status: "skipped" });
|
|
119
|
+
writeValidationFile("needs-remediation");
|
|
120
|
+
|
|
121
|
+
const ctx = makeMockCtx();
|
|
122
|
+
const pi = makeMockPi();
|
|
123
|
+
const pauseAutoMock = mock.fn(async () => {});
|
|
124
|
+
const s = makeMockSession(tempDir, "validate-milestone", "M001");
|
|
125
|
+
|
|
126
|
+
const result = await runPostUnitVerification({ s, ctx, pi } as VerificationContext, pauseAutoMock);
|
|
127
|
+
|
|
128
|
+
assert.equal(result, "pause");
|
|
129
|
+
assert.equal(pauseAutoMock.mock.callCount(), 1);
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
test("continues when verdict=needs-remediation but a queued remediation slice exists", async () => {
|
|
133
|
+
insertMilestone({ id: "M001" });
|
|
134
|
+
insertSlice({ id: "S01", milestoneId: "M001", title: "Slice 1", status: "complete" });
|
|
135
|
+
insertSlice({ id: "S02", milestoneId: "M001", title: "Remediation", status: "queued" });
|
|
136
|
+
writeValidationFile("needs-remediation");
|
|
137
|
+
|
|
138
|
+
const ctx = makeMockCtx();
|
|
139
|
+
const pi = makeMockPi();
|
|
140
|
+
const pauseAutoMock = mock.fn(async () => {});
|
|
141
|
+
const s = makeMockSession(tempDir, "validate-milestone", "M001");
|
|
142
|
+
|
|
143
|
+
const result = await runPostUnitVerification({ s, ctx, pi } as VerificationContext, pauseAutoMock);
|
|
144
|
+
|
|
145
|
+
assert.equal(result, "continue");
|
|
146
|
+
assert.equal(pauseAutoMock.mock.callCount(), 0);
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
test("continues when verdict is pass", async () => {
|
|
150
|
+
insertMilestone({ id: "M001" });
|
|
151
|
+
insertSlice({ id: "S01", milestoneId: "M001", title: "Slice 1", status: "complete" });
|
|
152
|
+
writeValidationFile("pass");
|
|
153
|
+
|
|
154
|
+
const ctx = makeMockCtx();
|
|
155
|
+
const pi = makeMockPi();
|
|
156
|
+
const pauseAutoMock = mock.fn(async () => {});
|
|
157
|
+
const s = makeMockSession(tempDir, "validate-milestone", "M001");
|
|
158
|
+
|
|
159
|
+
const result = await runPostUnitVerification({ s, ctx, pi } as VerificationContext, pauseAutoMock);
|
|
160
|
+
|
|
161
|
+
assert.equal(result, "continue");
|
|
162
|
+
assert.equal(pauseAutoMock.mock.callCount(), 0);
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
test("continues when no VALIDATION file exists yet", async () => {
|
|
166
|
+
insertMilestone({ id: "M001" });
|
|
167
|
+
insertSlice({ id: "S01", milestoneId: "M001", title: "Slice 1", status: "complete" });
|
|
168
|
+
|
|
169
|
+
const ctx = makeMockCtx();
|
|
170
|
+
const pi = makeMockPi();
|
|
171
|
+
const pauseAutoMock = mock.fn(async () => {});
|
|
172
|
+
const s = makeMockSession(tempDir, "validate-milestone", "M001");
|
|
173
|
+
|
|
174
|
+
const result = await runPostUnitVerification({ s, ctx, pi } as VerificationContext, pauseAutoMock);
|
|
175
|
+
|
|
176
|
+
assert.equal(result, "continue");
|
|
177
|
+
assert.equal(pauseAutoMock.mock.callCount(), 0);
|
|
178
|
+
});
|
|
179
|
+
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8974],{5214:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"workAsyncStorage",{enumerable:!0,get:function(){return r.workAsyncStorageInstance}});let r=n(17828)},15726:(e,t,n)=>{Promise.resolve().then(n.bind(n,66919))},17828:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"workAsyncStorageInstance",{enumerable:!0,get:function(){return r}});let r=(0,n(64054).createAsyncLocalStorage)()},21957:(e,t,n)=>{"use strict";function r({moduleIds:e}){return null}Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"PreloadChunks",{enumerable:!0,get:function(){return r}}),n(95155),n(47650),n(5214),n(2451),n(53887)},37206:(e,t,n)=>{"use strict";n.d(t,{default:()=>u.a});var r=n(75707),u=n.n(r)},41112:(e,t,n)=>{"use strict";function r({reason:e,children:t}){return t}Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"BailoutToCSR",{enumerable:!0,get:function(){return r}}),n(1980)},64054:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n={bindSnapshot:function(){return s},createAsyncLocalStorage:function(){return a},createSnapshot:function(){return i}};for(var r in n)Object.defineProperty(t,r,{enumerable:!0,get:n[r]});let u=Object.defineProperty(Error("Invariant: AsyncLocalStorage accessed in runtime where it is not available"),"__NEXT_ERROR_CODE",{value:"E504",enumerable:!1,configurable:!0});class l{disable(){throw u}getStore(){}run(){throw u}exit(){throw u}enterWith(){throw u}static bind(e){return e}}let o="u">typeof globalThis&&globalThis.AsyncLocalStorage;function a(){return o?new o:new l}function s(e){return o?o.bind(e):l.bind(e)}function i(){return o?o.snapshot():function(e,...t){return e(...t)}}},66919:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>l});var r=n(95155);let u=(0,n(37206).default)(()=>Promise.all([n.e(1838),n.e(6079),n.e(4986),n.e(2008),n.e(2826)]).then(n.bind(n,62826)).then(e=>e.GSDAppShell),{loadableGenerated:{webpack:()=>[62826]},ssr:!1,loading:()=>(0,r.jsx)("div",{className:"flex h-screen items-center justify-center bg-background text-sm text-muted-foreground",children:"Loading workspace…"})});function l(){return(0,r.jsx)(u,{})}},68635:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return s}});let r=n(95155),u=n(12115),l=n(41112);function o(e){return{default:e&&"default"in e?e.default:e}}n(21957);let a={loader:()=>Promise.resolve(o(()=>null)),loading:null,ssr:!0},s=function(e){let t={...a,...e},n=(0,u.lazy)(()=>t.loader().then(o)),s=t.loading;function i(e){let o=s?(0,r.jsx)(s,{isLoading:!0,pastDelay:!0,error:null}):null,a=!t.ssr||!!t.loading,i=a?u.Suspense:u.Fragment,c=t.ssr?(0,r.jsxs)(r.Fragment,{children:[null,(0,r.jsx)(n,{...e})]}):(0,r.jsx)(l.BailoutToCSR,{reason:"next/dynamic",children:(0,r.jsx)(n,{...e})});return(0,r.jsx)(i,{...a?{fallback:o}:{},children:c})}return i.displayName="LoadableComponent",i}},75707:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return u}});let r=n(73623)._(n(68635));function u(e,t){let n={};"function"==typeof e&&(n.loader=e);let u={...n,...t};return(0,r.default)({...u,modules:u.loadableGenerated?.modules})}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)}},e=>{e.O(0,[8441,3794,7358],()=>e(e.s=15726)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7358],{2852:(e,s,n)=>{Promise.resolve().then(n.t.bind(n,27123,23)),Promise.resolve().then(n.t.bind(n,61304,23)),Promise.resolve().then(n.t.bind(n,78616,23)),Promise.resolve().then(n.t.bind(n,64777,23)),Promise.resolve().then(n.t.bind(n,57121,23)),Promise.resolve().then(n.t.bind(n,74581,23)),Promise.resolve().then(n.t.bind(n,90484,23)),Promise.resolve().then(n.bind(n,86869))},19393:()=>{}},e=>{var s=s=>e(e.s=s);e.O(0,[8441,3794],()=>(s(83861),s(2852))),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9337],{52560:(e,s,_)=>{Promise.resolve().then(_.t.bind(_,27123,23))}},e=>{e.O(0,[8441,3794,7358],()=>e(e.s=52560)),_N_E=e.O()}]);
|
|
File without changes
|
|
File without changes
|