gsd-pi 2.71.0-dev.7a61d89 → 2.71.0-dev.d4d916a

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.
Files changed (101) hide show
  1. package/dist/resources/extensions/gsd/auto/phases.js +1 -1
  2. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  3. package/dist/resources/extensions/gsd/auto-model-selection.js +10 -2
  4. package/dist/resources/extensions/gsd/auto-start.js +30 -6
  5. package/dist/resources/extensions/gsd/auto-worktree.js +1 -1
  6. package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +2 -5
  7. package/dist/resources/extensions/gsd/commands/handlers/core.js +11 -0
  8. package/dist/resources/extensions/gsd/notification-overlay.js +26 -12
  9. package/dist/resources/extensions/gsd/notification-store.js +5 -4
  10. package/dist/resources/extensions/gsd/session-model-override.js +25 -0
  11. package/dist/resources/extensions/gsd/shortcut-defs.js +7 -1
  12. package/dist/resources/extensions/ollama/index.js +13 -5
  13. package/dist/startup-model-validation.d.ts +0 -1
  14. package/dist/startup-model-validation.js +6 -2
  15. package/dist/web/standalone/.next/BUILD_ID +1 -1
  16. package/dist/web/standalone/.next/app-path-routes-manifest.json +14 -14
  17. package/dist/web/standalone/.next/build-manifest.json +2 -2
  18. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  19. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  20. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  21. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  22. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  23. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  24. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  25. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  26. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  27. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  28. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  29. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  30. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  31. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  32. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  33. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  34. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  35. package/dist/web/standalone/.next/server/app/index.html +1 -1
  36. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  37. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  38. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  39. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  40. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  41. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  42. package/dist/web/standalone/.next/server/app-paths-manifest.json +14 -14
  43. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  44. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  45. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  46. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  47. package/package.json +1 -1
  48. package/packages/pi-coding-agent/dist/core/model-resolver-initial-model-auth.test.d.ts +2 -0
  49. package/packages/pi-coding-agent/dist/core/model-resolver-initial-model-auth.test.d.ts.map +1 -0
  50. package/packages/pi-coding-agent/dist/core/model-resolver-initial-model-auth.test.js +64 -0
  51. package/packages/pi-coding-agent/dist/core/model-resolver-initial-model-auth.test.js.map +1 -0
  52. package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
  53. package/packages/pi-coding-agent/dist/core/model-resolver.js +22 -18
  54. package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  55. package/packages/pi-coding-agent/dist/core/model-resolver.test.d.ts +8 -0
  56. package/packages/pi-coding-agent/dist/core/model-resolver.test.d.ts.map +1 -0
  57. package/packages/pi-coding-agent/dist/core/model-resolver.test.js +75 -0
  58. package/packages/pi-coding-agent/dist/core/model-resolver.test.js.map +1 -0
  59. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/login-dialog.test.d.ts +2 -0
  60. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/login-dialog.test.d.ts.map +1 -0
  61. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/login-dialog.test.js +13 -0
  62. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/login-dialog.test.js.map +1 -0
  63. package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.d.ts +4 -0
  64. package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  65. package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.js +24 -2
  66. package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.js.map +1 -1
  67. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  68. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js +9 -2
  69. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js.map +1 -1
  70. package/packages/pi-coding-agent/dist/modes/interactive/controllers/model-controller.d.ts.map +1 -1
  71. package/packages/pi-coding-agent/dist/modes/interactive/controllers/model-controller.js +6 -1
  72. package/packages/pi-coding-agent/dist/modes/interactive/controllers/model-controller.js.map +1 -1
  73. package/packages/pi-coding-agent/src/core/model-resolver-initial-model-auth.test.ts +78 -0
  74. package/packages/pi-coding-agent/src/core/model-resolver.test.ts +85 -0
  75. package/packages/pi-coding-agent/src/core/model-resolver.ts +22 -18
  76. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/login-dialog.test.ts +24 -0
  77. package/packages/pi-coding-agent/src/modes/interactive/components/login-dialog.ts +30 -2
  78. package/packages/pi-coding-agent/src/modes/interactive/components/model-selector.ts +15 -6
  79. package/packages/pi-coding-agent/src/modes/interactive/controllers/model-controller.ts +6 -1
  80. package/src/resources/extensions/gsd/auto/loop-deps.ts +2 -0
  81. package/src/resources/extensions/gsd/auto/phases.ts +2 -0
  82. package/src/resources/extensions/gsd/auto/session.ts +3 -0
  83. package/src/resources/extensions/gsd/auto-model-selection.ts +9 -1
  84. package/src/resources/extensions/gsd/auto-start.ts +37 -6
  85. package/src/resources/extensions/gsd/auto-worktree.ts +1 -1
  86. package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +2 -5
  87. package/src/resources/extensions/gsd/commands/handlers/core.ts +12 -0
  88. package/src/resources/extensions/gsd/notification-overlay.ts +27 -11
  89. package/src/resources/extensions/gsd/notification-store.ts +5 -4
  90. package/src/resources/extensions/gsd/session-model-override.ts +36 -0
  91. package/src/resources/extensions/gsd/shortcut-defs.ts +8 -1
  92. package/src/resources/extensions/gsd/tests/auto-start-model-capture.test.ts +25 -9
  93. package/src/resources/extensions/gsd/tests/format-shortcut.test.ts +16 -0
  94. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +66 -1
  95. package/src/resources/extensions/gsd/tests/model-isolation.test.ts +36 -51
  96. package/src/resources/extensions/gsd/tests/register-shortcuts.test.ts +3 -2
  97. package/src/resources/extensions/gsd/tests/session-model-override.test.ts +35 -0
  98. package/src/resources/extensions/ollama/index.ts +13 -3
  99. package/src/resources/extensions/ollama/ollama-status-indicator.test.ts +28 -0
  100. /package/dist/web/standalone/.next/static/{ug91LJa0m7OdzrTVaz_48 → IRnpNeY-_eO7SxKBIkTbL}/_buildManifest.js +0 -0
  101. /package/dist/web/standalone/.next/static/{ug91LJa0m7OdzrTVaz_48 → IRnpNeY-_eO7SxKBIkTbL}/_ssgManifest.js +0 -0
@@ -857,7 +857,7 @@ export async function runUnitPhase(ic, iterData, loopState, sidecarItem) {
857
857
  logWarning("engine", "Prompt reorder failed", { error: msg });
858
858
  }
859
859
  // Select and apply model (with tier escalation on retry — normal units only)
860
- const modelResult = await deps.selectAndApplyModel(ctx, pi, unitType, unitId, s.basePath, prefs, s.verbose, s.autoModeStartModel, sidecarItem ? undefined : { isRetry, previousTier });
860
+ const modelResult = await deps.selectAndApplyModel(ctx, pi, unitType, unitId, s.basePath, prefs, s.verbose, s.autoModeStartModel, sidecarItem ? undefined : { isRetry, previousTier }, undefined, s.manualSessionModelOverride);
861
861
  s.currentUnitRouting =
862
862
  modelResult.routing;
863
863
  s.currentUnitModel =
@@ -56,6 +56,8 @@ export class AutoSession {
56
56
  currentMilestoneId = null;
57
57
  // ── Model state ──────────────────────────────────────────────────────────
58
58
  autoModeStartModel = null;
59
+ /** Explicit /gsd model pin captured at bootstrap (session-scoped policy override). */
60
+ manualSessionModelOverride = null;
59
61
  currentUnitModel = null;
60
62
  /** Fully-qualified model ID (provider/id) set after selectAndApplyModel + hook overrides (#2899). */
61
63
  currentDispatchedModelId = null;
@@ -159,6 +161,7 @@ export class AutoSession {
159
161
  this.currentMilestoneId = null;
160
162
  // Model
161
163
  this.autoModeStartModel = null;
164
+ this.manualSessionModelOverride = null;
162
165
  this.currentUnitModel = null;
163
166
  this.currentDispatchedModelId = null;
164
167
  this.originalModelId = null;
@@ -8,6 +8,7 @@ import { classifyUnitComplexity, tierLabel } from "./complexity-classifier.js";
8
8
  import { resolveModelForComplexity, escalateTier, getEligibleModels, loadCapabilityOverrides, adjustToolSet } from "./model-router.js";
9
9
  import { getLedger, getProjectTotals } from "./metrics.js";
10
10
  import { unitPhaseLabel } from "./auto-dashboard.js";
11
+ import { getSessionModelOverride } from "./session-model-override.js";
11
12
  export function resolvePreferredModelConfig(unitType, autoModeStartModel,
12
13
  /** When false, only return explicit per-phase model configs — do not
13
14
  * synthesize a routing ceiling from dynamic_routing.tier_models (#3962). */
@@ -44,8 +45,15 @@ isAutoMode = true) {
44
45
  export async function selectAndApplyModel(ctx, pi, unitType, unitId, basePath, prefs, verbose, autoModeStartModel, retryContext,
45
46
  /** When false (interactive/guided-flow), skip dynamic routing and use the session model.
46
47
  * Dynamic routing only applies in auto-mode where cost optimization is expected. (#3962) */
47
- isAutoMode = true) {
48
- const modelConfig = resolvePreferredModelConfig(unitType, autoModeStartModel, isAutoMode);
48
+ isAutoMode = true,
49
+ /** Explicit /gsd model pin captured at bootstrap for long-running auto loops. */
50
+ sessionModelOverride) {
51
+ const effectiveSessionModelOverride = sessionModelOverride === undefined
52
+ ? getSessionModelOverride(ctx.sessionManager.getSessionId())
53
+ : (sessionModelOverride ?? undefined);
54
+ const modelConfig = effectiveSessionModelOverride
55
+ ? undefined
56
+ : resolvePreferredModelConfig(unitType, autoModeStartModel, isAutoMode);
49
57
  let routing = null;
50
58
  let appliedModel = null;
51
59
  if (modelConfig) {
@@ -39,6 +39,7 @@ import { join } from "node:path";
39
39
  import { sep as pathSep } from "node:path";
40
40
  import { resolveProjectRootDbPath } from "./bootstrap/dynamic-tools.js";
41
41
  import { resolveDefaultSessionModel, resolveDynamicRoutingConfig } from "./preferences-models.js";
42
+ import { getSessionModelOverride } from "./session-model-override.js";
42
43
  /**
43
44
  * Bootstrap a fresh auto-mode session. Handles everything from git init
44
45
  * through secrets collection, returning when ready for the first
@@ -187,13 +188,35 @@ export async function bootstrapAutoSession(s, ctx, pi, base, verboseMode, reques
187
188
  // Capture the user's session model before guided-flow dispatch can apply a
188
189
  // phase-specific planning model for a discuss turn (#2829).
189
190
  //
190
- // GSD PREFERENCES.md takes priority over the session model from settings.json
191
- // (#3517). The session model (ctx.model) comes from findInitialModel() which
192
- // reads defaultProvider/defaultModel from ~/.gsd/agent/settings.json. When
193
- // the user has explicit model preferences in PREFERENCES.md, those should win.
191
+ // Precedence:
192
+ // 1) Explicit session override via /gsd model (this session)
193
+ // 2) GSD model preferences from PREFERENCES.md (validated against live auth)
194
+ // 3) Current session model from settings/session restore (if provider ready)
195
+ //
196
+ // This preserves #3517 defaults while honoring explicit runtime model
197
+ // selection for subsequent /gsd runs in the same session.
198
+ const manualSessionOverride = getSessionModelOverride(ctx.sessionManager.getSessionId());
194
199
  const preferredModel = resolveDefaultSessionModel(ctx.model?.provider);
195
- const startModelSnapshot = preferredModel
196
- ?? (ctx.model
200
+ // Validate the preferred model against the live registry + provider auth so
201
+ // an unconfigured PREFERENCES.md entry (no API key / OAuth) can't become the
202
+ // start-model snapshot. Without this, every subsequent unit would try to
203
+ // fall back to an unusable model.
204
+ let validatedPreferredModel;
205
+ if (preferredModel) {
206
+ const { resolveModelId } = await import("./auto-model-selection.js");
207
+ const available = ctx.modelRegistry.getAvailable();
208
+ const match = resolveModelId(`${preferredModel.provider}/${preferredModel.id}`, available, ctx.model?.provider);
209
+ if (match) {
210
+ validatedPreferredModel = { provider: match.provider, id: match.id };
211
+ }
212
+ else {
213
+ ctx.ui.notify(`Preferred model ${preferredModel.provider}/${preferredModel.id} from PREFERENCES.md is not configured; falling back to session default.`, "warning");
214
+ }
215
+ }
216
+ const sessionModelReady = ctx.model && ctx.modelRegistry.isProviderRequestReady(ctx.model.provider);
217
+ const startModelSnapshot = manualSessionOverride
218
+ ?? validatedPreferredModel
219
+ ?? (sessionModelReady && ctx.model
197
220
  ? { provider: ctx.model.provider, id: ctx.model.id }
198
221
  : null);
199
222
  try {
@@ -571,6 +594,7 @@ export async function bootstrapAutoSession(s, ctx, pi, base, verboseMode, reques
571
594
  id: startModelSnapshot.id,
572
595
  };
573
596
  }
597
+ s.manualSessionModelOverride = manualSessionOverride ?? null;
574
598
  // Apply worker model override from parallel orchestrator (#worker-model).
575
599
  // GSD_WORKER_MODEL is injected by the coordinator when parallel.worker_model
576
600
  // is configured, so parallel milestone workers use a cheaper model than the
@@ -1795,7 +1795,7 @@ export function mergeMilestoneToMain(originalBasePath_, milestoneId, roadmapCont
1795
1795
  // 12. Remove worktree directory first (must happen before branch deletion)
1796
1796
  try {
1797
1797
  removeWorktree(originalBasePath_, milestoneId, {
1798
- branch: null,
1798
+ branch: milestoneBranch,
1799
1799
  deleteBranch: false,
1800
1800
  });
1801
1801
  }
@@ -71,9 +71,6 @@ export function registerShortcuts(pi) {
71
71
  description: shortcutDesc(GSD_SHORTCUTS.parallel.action, GSD_SHORTCUTS.parallel.command),
72
72
  handler: openParallelOverlay,
73
73
  });
74
- // Fallback for terminals where Ctrl+Alt letter chords are not forwarded reliably.
75
- pi.registerShortcut(Key.ctrlShift(GSD_SHORTCUTS.parallel.key), {
76
- description: shortcutDesc(`${GSD_SHORTCUTS.parallel.action} (fallback)`, GSD_SHORTCUTS.parallel.command),
77
- handler: openParallelOverlay,
78
- });
74
+ // No Ctrl+Shift+P fallback conflicts with cycleModelBackward (shift+ctrl+p).
75
+ // Use Ctrl+Alt+P or /gsd parallel watch instead.
79
76
  }
@@ -4,6 +4,7 @@ import { ensurePreferencesFile, handlePrefs, handlePrefsMode, handlePrefsWizard
4
4
  import { runEnvironmentChecks } from "../../doctor-environment.js";
5
5
  import { deriveState } from "../../state.js";
6
6
  import { handleCmux } from "../../commands-cmux.js";
7
+ import { setSessionModelOverride } from "../../session-model-override.js";
7
8
  import { projectRoot } from "../context.js";
8
9
  import { formattedShortcutPair } from "../../shortcut-defs.js";
9
10
  export function showHelp(ctx, args = "") {
@@ -285,6 +286,16 @@ async function handleModel(trimmedArgs, ctx, pi) {
285
286
  ctx.ui.notify(`No API key for ${targetModel.provider}/${targetModel.id}`, "warning");
286
287
  return;
287
288
  }
289
+ // /gsd model is an explicit per-session pin for GSD dispatches.
290
+ // This is captured at auto bootstrap so it survives internal session
291
+ // switches during /gsd auto and /gsd next runs.
292
+ const sessionId = ctx.sessionManager?.getSessionId?.();
293
+ if (sessionId) {
294
+ setSessionModelOverride(sessionId, {
295
+ provider: targetModel.provider,
296
+ id: targetModel.id,
297
+ });
298
+ }
288
299
  ctx.ui.notify(`Model: ${targetModel.provider}/${targetModel.id}`, "info");
289
300
  }
290
301
  export async function handleCoreCommand(trimmed, ctx, pi) {
@@ -2,7 +2,7 @@
2
2
  // Scrollable panel showing all persisted notifications with severity filtering.
3
3
  // Toggled with Ctrl+Alt+N (⌃⌥N on macOS), Ctrl+Shift+N fallback, or /gsd notifications.
4
4
  import { truncateToWidth, visibleWidth, matchesKey, Key } from "@gsd/pi-tui";
5
- import { readNotifications, markAllRead, clearNotifications, } from "./notification-store.js";
5
+ import { readNotifications, markAllRead, clearNotifications, onNotificationStoreChange, } from "./notification-store.js";
6
6
  import { formattedShortcutPair } from "./shortcut-defs.js";
7
7
  import { padRight, joinColumns } from "../shared/mod.js";
8
8
  const FILTER_CYCLE = ["all", "error", "warning", "info"];
@@ -74,6 +74,7 @@ export class GSDNotificationOverlay {
74
74
  refreshTimer;
75
75
  disposed = false;
76
76
  resizeHandler = null;
77
+ unsubscribeStore = null;
77
78
  constructor(tui, theme, onClose) {
78
79
  this.tui = tui;
79
80
  this.theme = theme;
@@ -90,20 +91,18 @@ export class GSDNotificationOverlay {
90
91
  this.tui.requestRender();
91
92
  };
92
93
  process.stdout.on("resize", this.resizeHandler);
93
- // Refresh every 3s for new notifications
94
+ // Subscribe to store mutations for immediate updates
95
+ this.unsubscribeStore = onNotificationStoreChange(() => {
96
+ if (this.disposed)
97
+ return;
98
+ this._refreshFromDisk();
99
+ });
100
+ // 30s safety-net for cross-process edits (web subprocess, parallel workers)
94
101
  this.refreshTimer = setInterval(() => {
95
102
  if (this.disposed)
96
103
  return;
97
- const fresh = readNotifications();
98
- const signature = notificationSignature(fresh);
99
- if (signature !== this.entriesSignature) {
100
- markAllRead();
101
- this.entries = readNotifications();
102
- this.entriesSignature = notificationSignature(this.entries);
103
- this.invalidate();
104
- this.tui.requestRender();
105
- }
106
- }, 3000);
104
+ this._refreshFromDisk();
105
+ }, 30_000);
107
106
  }
108
107
  get filter() {
109
108
  return FILTER_CYCLE[this.filterIndex];
@@ -188,11 +187,26 @@ export class GSDNotificationOverlay {
188
187
  dispose() {
189
188
  this.disposed = true;
190
189
  clearInterval(this.refreshTimer);
190
+ if (this.unsubscribeStore) {
191
+ this.unsubscribeStore();
192
+ this.unsubscribeStore = null;
193
+ }
191
194
  if (this.resizeHandler) {
192
195
  process.stdout.removeListener("resize", this.resizeHandler);
193
196
  this.resizeHandler = null;
194
197
  }
195
198
  }
199
+ _refreshFromDisk() {
200
+ const fresh = readNotifications();
201
+ const signature = notificationSignature(fresh);
202
+ if (signature !== this.entriesSignature) {
203
+ markAllRead();
204
+ this.entries = readNotifications();
205
+ this.entriesSignature = notificationSignature(this.entries);
206
+ this.invalidate();
207
+ this.tui.requestRender();
208
+ }
209
+ }
196
210
  wrapInBox(inner, width) {
197
211
  const th = this.theme;
198
212
  const border = (s) => th.fg("borderAccent", s);
@@ -301,10 +301,11 @@ function _withLock(basePath, fn) {
301
301
  break;
302
302
  }
303
303
  }
304
- // Only run the mutation if we actually own the lock
305
- const ownsLock = fd !== null;
304
+ // Best-effort: mutation runs regardless of lock status (idempotent overwrites).
305
+ // createdLock gates cleanup only — never skip fn() on lock failure.
306
+ const createdLock = fd !== null;
306
307
  try {
307
- if (ownsLock && fd !== null) {
308
+ if (createdLock && fd !== null) {
308
309
  // Write our PID timestamp into the lock for stale detection
309
310
  writeFileSync(lockPath, String(Date.now()), "utf-8");
310
311
  closeSync(fd);
@@ -313,7 +314,7 @@ function _withLock(basePath, fn) {
313
314
  }
314
315
  finally {
315
316
  // Only delete the lock if we created it — never remove another process's lock
316
- if (ownsLock) {
317
+ if (createdLock) {
317
318
  try {
318
319
  unlinkSync(lockPath);
319
320
  }
@@ -0,0 +1,25 @@
1
+ const sessionOverrides = new Map();
2
+ function normalizeSessionId(sessionId) {
3
+ return typeof sessionId === "string" ? sessionId.trim() : "";
4
+ }
5
+ export function setSessionModelOverride(sessionId, override) {
6
+ const key = normalizeSessionId(sessionId);
7
+ if (!key)
8
+ return;
9
+ sessionOverrides.set(key, {
10
+ provider: override.provider,
11
+ id: override.id,
12
+ });
13
+ }
14
+ export function getSessionModelOverride(sessionId) {
15
+ const key = normalizeSessionId(sessionId);
16
+ if (!key)
17
+ return undefined;
18
+ return sessionOverrides.get(key);
19
+ }
20
+ export function clearSessionModelOverride(sessionId) {
21
+ const key = normalizeSessionId(sessionId);
22
+ if (!key)
23
+ return;
24
+ sessionOverrides.delete(key);
25
+ }
@@ -5,16 +5,19 @@ export const GSD_SHORTCUTS = {
5
5
  key: "g",
6
6
  action: "Open GSD dashboard",
7
7
  command: "/gsd status",
8
+ hasFallback: true,
8
9
  },
9
10
  notifications: {
10
11
  key: "n",
11
12
  action: "Open notification history",
12
13
  command: "/gsd notifications",
14
+ hasFallback: true,
13
15
  },
14
16
  parallel: {
15
17
  key: "p",
16
18
  action: "Open parallel worker monitor",
17
19
  command: "/gsd parallel watch",
20
+ hasFallback: false, // Ctrl+Shift+P conflicts with cycleModelBackward
18
21
  },
19
22
  };
20
23
  function combo(prefix, key) {
@@ -27,7 +30,10 @@ export function fallbackShortcutCombo(id) {
27
30
  return combo("Ctrl+Shift+", GSD_SHORTCUTS[id].key);
28
31
  }
29
32
  export function shortcutPair(id, formatter = (combo) => combo) {
30
- return `${formatter(primaryShortcutCombo(id))} / ${formatter(fallbackShortcutCombo(id))}`;
33
+ const primary = formatter(primaryShortcutCombo(id));
34
+ if (!GSD_SHORTCUTS[id].hasFallback)
35
+ return primary;
36
+ return `${primary} / ${formatter(fallbackShortcutCombo(id))}`;
31
37
  }
32
38
  export function formattedShortcutPair(id) {
33
39
  return shortcutPair(id, formatShortcut);
@@ -49,8 +49,15 @@ async function probeAndRegister(pi) {
49
49
  return false;
50
50
  }
51
51
  const models = await discoverModels();
52
- if (models.length === 0)
53
- return true; // Running but no models pulled
52
+ if (models.length === 0) {
53
+ // No local models means there's nothing usable to register in GSD.
54
+ // Keep the footer/status clean instead of advertising Ollama availability.
55
+ if (providerRegistered) {
56
+ pi.unregisterProvider("ollama");
57
+ providerRegistered = false;
58
+ }
59
+ return false;
60
+ }
54
61
  const baseUrl = client.getOllamaHost();
55
62
  // Use authMode "apiKey" with a dummy key (#3440).
56
63
  // authMode "none" requires a custom streamSimple handler, but Ollama uses
@@ -102,10 +109,11 @@ export default function ollama(pi) {
102
109
  else {
103
110
  probeAndRegister(pi)
104
111
  .then((found) => {
105
- if (found)
106
- ctx.ui.setStatus("ollama", "Ollama");
112
+ ctx.ui.setStatus("ollama", found ? "Ollama" : undefined);
107
113
  })
108
- .catch(() => { });
114
+ .catch(() => {
115
+ ctx.ui.setStatus("ollama", undefined);
116
+ });
109
117
  }
110
118
  });
111
119
  pi.on("session_shutdown", async () => {
@@ -13,7 +13,6 @@ interface MinimalModel {
13
13
  id: string;
14
14
  }
15
15
  interface MinimalModelRegistry {
16
- getAll(): MinimalModel[];
17
16
  getAvailable(): MinimalModel[];
18
17
  }
19
18
  type ThinkingLevel = 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh';
@@ -23,10 +23,14 @@ import { getPiDefaultModelAndProvider } from './pi-migration.js';
23
23
  export function validateConfiguredModel(modelRegistry, settingsManager) {
24
24
  const configuredProvider = settingsManager.getDefaultProvider();
25
25
  const configuredModel = settingsManager.getDefaultModel();
26
- const allModels = modelRegistry.getAll();
27
26
  const availableModels = modelRegistry.getAvailable();
27
+ // Check against availableModels (configured + auth'd) rather than getAll()
28
+ // so a stale default pointing at an unconfigured provider triggers the
29
+ // fallback. Previously a model present in the registry but missing API
30
+ // key / OAuth would satisfy configuredExists and survive startup, ending
31
+ // up as ctx.model even though it couldn't actually be used.
28
32
  const configuredExists = configuredProvider && configuredModel &&
29
- allModels.some((m) => m.provider === configuredProvider && m.id === configuredModel);
33
+ availableModels.some((m) => m.provider === configuredProvider && m.id === configuredModel);
30
34
  if (!configuredModel || !configuredExists) {
31
35
  // Model not configured at all, or removed from registry — pick a fallback.
32
36
  // Only fires when the model is genuinely unknown (not just temporarily unavailable).
@@ -1 +1 @@
1
- ug91LJa0m7OdzrTVaz_48
1
+ IRnpNeY-_eO7SxKBIkTbL
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "/_not-found/page": "/_not-found",
3
3
  "/_global-error/page": "/_global-error",
4
- "/api/boot/route": "/api/boot",
5
- "/api/bridge-terminal/input/route": "/api/bridge-terminal/input",
6
4
  "/api/bridge-terminal/resize/route": "/api/bridge-terminal/resize",
7
- "/api/cleanup/route": "/api/cleanup",
8
- "/api/dev-mode/route": "/api/dev-mode",
5
+ "/api/bridge-terminal/input/route": "/api/bridge-terminal/input",
6
+ "/api/boot/route": "/api/boot",
9
7
  "/api/bridge-terminal/stream/route": "/api/bridge-terminal/stream",
10
- "/api/captures/route": "/api/captures",
8
+ "/api/dev-mode/route": "/api/dev-mode",
9
+ "/api/cleanup/route": "/api/cleanup",
11
10
  "/api/doctor/route": "/api/doctor",
11
+ "/api/captures/route": "/api/captures",
12
12
  "/api/export-data/route": "/api/export-data",
13
13
  "/api/forensics/route": "/api/forensics",
14
14
  "/api/browse-directories/route": "/api/browse-directories",
@@ -16,32 +16,32 @@
16
16
  "/api/history/route": "/api/history",
17
17
  "/api/hooks/route": "/api/hooks",
18
18
  "/api/inspect/route": "/api/inspect",
19
- "/api/experimental/route": "/api/experimental",
20
19
  "/api/knowledge/route": "/api/knowledge",
20
+ "/api/experimental/route": "/api/experimental",
21
21
  "/api/live-state/route": "/api/live-state",
22
22
  "/api/notifications/route": "/api/notifications",
23
- "/api/preferences/route": "/api/preferences",
23
+ "/api/onboarding/route": "/api/onboarding",
24
24
  "/api/recovery/route": "/api/recovery",
25
+ "/api/preferences/route": "/api/preferences",
25
26
  "/api/projects/route": "/api/projects",
26
- "/api/onboarding/route": "/api/onboarding",
27
+ "/api/files/route": "/api/files",
27
28
  "/api/session/browser/route": "/api/session/browser",
28
- "/api/session/command/route": "/api/session/command",
29
29
  "/api/session/events/route": "/api/session/events",
30
- "/api/settings-data/route": "/api/settings-data",
30
+ "/api/session/command/route": "/api/session/command",
31
31
  "/api/shutdown/route": "/api/shutdown",
32
- "/api/session/manage/route": "/api/session/manage",
32
+ "/api/settings-data/route": "/api/settings-data",
33
33
  "/api/skill-health/route": "/api/skill-health",
34
34
  "/api/steer/route": "/api/steer",
35
- "/api/files/route": "/api/files",
35
+ "/api/session/manage/route": "/api/session/manage",
36
36
  "/api/terminal/input/route": "/api/terminal/input",
37
37
  "/api/terminal/resize/route": "/api/terminal/resize",
38
38
  "/api/switch-root/route": "/api/switch-root",
39
39
  "/api/terminal/sessions/route": "/api/terminal/sessions",
40
+ "/api/remote-questions/route": "/api/remote-questions",
40
41
  "/api/terminal/stream/route": "/api/terminal/stream",
41
42
  "/api/undo/route": "/api/undo",
42
- "/api/terminal/upload/route": "/api/terminal/upload",
43
43
  "/api/visualizer/route": "/api/visualizer",
44
44
  "/api/update/route": "/api/update",
45
- "/api/remote-questions/route": "/api/remote-questions",
45
+ "/api/terminal/upload/route": "/api/terminal/upload",
46
46
  "/page": "/"
47
47
  }
@@ -4,8 +4,8 @@
4
4
  ],
5
5
  "devFiles": [],
6
6
  "lowPriorityFiles": [
7
- "static/ug91LJa0m7OdzrTVaz_48/_buildManifest.js",
8
- "static/ug91LJa0m7OdzrTVaz_48/_ssgManifest.js"
7
+ "static/IRnpNeY-_eO7SxKBIkTbL/_buildManifest.js",
8
+ "static/IRnpNeY-_eO7SxKBIkTbL/_ssgManifest.js"
9
9
  ],
10
10
  "rootMainFiles": [
11
11
  "static/chunks/webpack-b868033a5834586d.js",
@@ -78,8 +78,8 @@
78
78
  "dynamicRoutes": {},
79
79
  "notFoundRoutes": [],
80
80
  "preview": {
81
- "previewModeId": "a72157ae6d52e9f3acc73348d37e7979",
82
- "previewModeSigningKey": "31a8d4ba557466229207f5300dda91f234f20b6effe6f5e23b2330a7a4b7a321",
83
- "previewModeEncryptionKey": "6e1edbccda2134655d4acaef47e304f4cf0365f4e6b58150f0d8ff52f9a13862"
81
+ "previewModeId": "d77563b7320afea49a4a85f864710f24",
82
+ "previewModeSigningKey": "b16802978de9bb610c01021ac68cb47c678b5a4f74e9519df05459582f8908b0",
83
+ "previewModeEncryptionKey": "6eccbd737bd64c7a081fb2afd254efd7a56a533d5774a1ddf20a30de0918d19d"
84
84
  }
85
85
  }
@@ -1 +1 @@
1
- <!DOCTYPE html><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-b868033a5834586d.js"/><script src="/_next/static/chunks/4bd1b696-e356ca5ba0218e27.js" async=""></script><script src="/_next/static/chunks/3794-42fdce068d44fa4f.js" async=""></script><script src="/_next/static/chunks/main-app-fdab67f7802d7832.js" async=""></script><meta name="next-size-adjust" content=""/><title>500: This page couldn’t load</title><style>:root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }</style><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;display:flex;align-items:center;justify-content:center"><div style="margin-top:-32px;max-width:325px;padding:32px 28px;text-align:left"><svg width="32" height="32" viewBox="-0.2 -1.5 32 32" fill="none" style="margin-bottom:24px"><path d="M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z" fill="var(--next-error-title)"></path></svg><h1 style="font-size:24px;font-weight:500;letter-spacing:-0.02em;line-height:32px;margin:0 0 12px 0;color:var(--next-error-title)">This page couldn’t load</h1><p style="font-size:14px;font-weight:400;line-height:21px;margin:0 0 20px 0;color:var(--next-error-message)">A server error occurred. Reload to try again.</p><form style="margin:0"><button type="submit" style="display:inline-flex;align-items:center;justify-content:center;height:32px;padding:0 12px;font-size:14px;font-weight:500;line-height:20px;border-radius:6px;cursor:pointer;color:var(--next-error-btn-text);background:var(--next-error-btn-bg);border:var(--next-error-btn-border)">Reload</button></form></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-b868033a5834586d.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[57121,[],\"\"]\n3:I[74581,[],\"\"]\n4:I[90484,[],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n8:I[90484,[],\"ViewportBoundary\"]\na:I[90484,[],\"MetadataBoundary\"]\nc:I[27123,[],\"default\",1]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"_global-error\",{\"children\":[\"__PAGE__\",{}]}]}],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"title\",null,{\"children\":\"500: This page couldn’t load\"}],[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }\"}}]]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"display\":\"flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"marginTop\":\"-32px\",\"maxWidth\":\"325px\",\"padding\":\"32px 28px\",\"textAlign\":\"left\"},\"children\":[[\"$\",\"svg\",null,{\"width\":\"32\",\"height\":\"32\",\"viewBox\":\"-0.2 -1.5 32 32\",\"fill\":\"none\",\"style\":{\"marginBottom\":\"24px\"},\"children\":[\"$\",\"path\",null,{\"d\":\"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z\",\"fill\":\"var(--next-error-title)\"}]}],[\"$\",\"h1\",null,{\"style\":{\"fontSize\":\"24px\",\"fontWeight\":500,\"letterSpacing\":\"-0.02em\",\"lineHeight\":\"32px\",\"margin\":\"0 0 12px 0\",\"color\":\"var(--next-error-title)\"},\"children\":\"This page couldn’t load\"}],[\"$\",\"p\",null,{\"style\":{\"fontSize\":\"14px\",\"fontWeight\":400,\"lineHeight\":\"21px\",\"margin\":\"0 0 20px 0\",\"color\":\"var(--next-error-message)\"},\"children\":\"A server error occurred. Reload to try again.\"}],[\"$\",\"form\",null,{\"style\":{\"margin\":0},\"children\":[\"$\",\"button\",null,{\"type\":\"submit\",\"style\":{\"display\":\"inline-flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\",\"height\":\"32px\",\"padding\":\"0 12px\",\"fontSize\":\"14px\",\"fontWeight\":500,\"lineHeight\":\"20px\",\"borderRadius\":\"6px\",\"cursor\":\"pointer\",\"color\":\"var(--next-error-btn-text)\",\"background\":\"var(--next-error-btn-bg)\",\"border\":\"var(--next-error-btn-border)\"},\"children\":\"Reload\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,null]},null,false,\"$@7\"]},null,false,\"$@7\"],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",[]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"ug91LJa0m7OdzrTVaz_48\"}\n"])</script><script>self.__next_f.push([1,"d:[]\n7:\"$Wd\"\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"6:null\nb:[]\n"])</script></body></html>
1
+ <!DOCTYPE html><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-b868033a5834586d.js"/><script src="/_next/static/chunks/4bd1b696-e356ca5ba0218e27.js" async=""></script><script src="/_next/static/chunks/3794-42fdce068d44fa4f.js" async=""></script><script src="/_next/static/chunks/main-app-fdab67f7802d7832.js" async=""></script><meta name="next-size-adjust" content=""/><title>500: This page couldn’t load</title><style>:root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }</style><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;display:flex;align-items:center;justify-content:center"><div style="margin-top:-32px;max-width:325px;padding:32px 28px;text-align:left"><svg width="32" height="32" viewBox="-0.2 -1.5 32 32" fill="none" style="margin-bottom:24px"><path d="M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z" fill="var(--next-error-title)"></path></svg><h1 style="font-size:24px;font-weight:500;letter-spacing:-0.02em;line-height:32px;margin:0 0 12px 0;color:var(--next-error-title)">This page couldn’t load</h1><p style="font-size:14px;font-weight:400;line-height:21px;margin:0 0 20px 0;color:var(--next-error-message)">A server error occurred. Reload to try again.</p><form style="margin:0"><button type="submit" style="display:inline-flex;align-items:center;justify-content:center;height:32px;padding:0 12px;font-size:14px;font-weight:500;line-height:20px;border-radius:6px;cursor:pointer;color:var(--next-error-btn-text);background:var(--next-error-btn-bg);border:var(--next-error-btn-border)">Reload</button></form></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-b868033a5834586d.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[57121,[],\"\"]\n3:I[74581,[],\"\"]\n4:I[90484,[],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n8:I[90484,[],\"ViewportBoundary\"]\na:I[90484,[],\"MetadataBoundary\"]\nc:I[27123,[],\"default\",1]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"_global-error\",{\"children\":[\"__PAGE__\",{}]}]}],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"title\",null,{\"children\":\"500: This page couldn’t load\"}],[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }\"}}]]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"display\":\"flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"marginTop\":\"-32px\",\"maxWidth\":\"325px\",\"padding\":\"32px 28px\",\"textAlign\":\"left\"},\"children\":[[\"$\",\"svg\",null,{\"width\":\"32\",\"height\":\"32\",\"viewBox\":\"-0.2 -1.5 32 32\",\"fill\":\"none\",\"style\":{\"marginBottom\":\"24px\"},\"children\":[\"$\",\"path\",null,{\"d\":\"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z\",\"fill\":\"var(--next-error-title)\"}]}],[\"$\",\"h1\",null,{\"style\":{\"fontSize\":\"24px\",\"fontWeight\":500,\"letterSpacing\":\"-0.02em\",\"lineHeight\":\"32px\",\"margin\":\"0 0 12px 0\",\"color\":\"var(--next-error-title)\"},\"children\":\"This page couldn’t load\"}],[\"$\",\"p\",null,{\"style\":{\"fontSize\":\"14px\",\"fontWeight\":400,\"lineHeight\":\"21px\",\"margin\":\"0 0 20px 0\",\"color\":\"var(--next-error-message)\"},\"children\":\"A server error occurred. Reload to try again.\"}],[\"$\",\"form\",null,{\"style\":{\"margin\":0},\"children\":[\"$\",\"button\",null,{\"type\":\"submit\",\"style\":{\"display\":\"inline-flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\",\"height\":\"32px\",\"padding\":\"0 12px\",\"fontSize\":\"14px\",\"fontWeight\":500,\"lineHeight\":\"20px\",\"borderRadius\":\"6px\",\"cursor\":\"pointer\",\"color\":\"var(--next-error-btn-text)\",\"background\":\"var(--next-error-btn-bg)\",\"border\":\"var(--next-error-btn-border)\"},\"children\":\"Reload\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,null]},null,false,\"$@7\"]},null,false,\"$@7\"],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",[]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"IRnpNeY-_eO7SxKBIkTbL\"}\n"])</script><script>self.__next_f.push([1,"d:[]\n7:\"$Wd\"\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"6:null\nb:[]\n"])</script></body></html>
@@ -6,7 +6,7 @@
6
6
  8:I[90484,[],"ViewportBoundary"]
7
7
  a:I[90484,[],"MetadataBoundary"]
8
8
  c:I[27123,[],"default",1]
9
- 0:{"P":null,"c":["","_global-error"],"q":"","i":false,"f":[[["",{"children":["_global-error",{"children":["__PAGE__",{}]}]}],[["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":[["$","title",null,{"children":"500: This page couldn’t load"}],["$","style",null,{"dangerouslySetInnerHTML":{"__html":":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }"}}]]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","display":"flex","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"marginTop":"-32px","maxWidth":"325px","padding":"32px 28px","textAlign":"left"},"children":[["$","svg",null,{"width":"32","height":"32","viewBox":"-0.2 -1.5 32 32","fill":"none","style":{"marginBottom":"24px"},"children":["$","path",null,{"d":"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z","fill":"var(--next-error-title)"}]}],["$","h1",null,{"style":{"fontSize":"24px","fontWeight":500,"letterSpacing":"-0.02em","lineHeight":"32px","margin":"0 0 12px 0","color":"var(--next-error-title)"},"children":"This page couldn’t load"}],["$","p",null,{"style":{"fontSize":"14px","fontWeight":400,"lineHeight":"21px","margin":"0 0 20px 0","color":"var(--next-error-message)"},"children":"A server error occurred. Reload to try again."}],["$","form",null,{"style":{"margin":0},"children":["$","button",null,{"type":"submit","style":{"display":"inline-flex","alignItems":"center","justifyContent":"center","height":"32px","padding":"0 12px","fontSize":"14px","fontWeight":500,"lineHeight":"20px","borderRadius":"6px","cursor":"pointer","color":"var(--next-error-btn-text)","background":"var(--next-error-btn-bg)","border":"var(--next-error-btn-border)"},"children":"Reload"}]}]]}]}]}]]}],null,["$","$L4",null,{"children":["$","$5",null,{"name":"Next.MetadataOutlet","children":"$@6"}]}]]}],{},null,false,null]},null,false,"$@7"]},null,false,"$@7"],["$","$1","h",{"children":[null,["$","$L8",null,{"children":"$L9"}],["$","div",null,{"hidden":true,"children":["$","$La",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$Lb"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],false]],"m":"$undefined","G":["$c",[]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"ug91LJa0m7OdzrTVaz_48"}
9
+ 0:{"P":null,"c":["","_global-error"],"q":"","i":false,"f":[[["",{"children":["_global-error",{"children":["__PAGE__",{}]}]}],[["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":[["$","title",null,{"children":"500: This page couldn’t load"}],["$","style",null,{"dangerouslySetInnerHTML":{"__html":":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }"}}]]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","display":"flex","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"marginTop":"-32px","maxWidth":"325px","padding":"32px 28px","textAlign":"left"},"children":[["$","svg",null,{"width":"32","height":"32","viewBox":"-0.2 -1.5 32 32","fill":"none","style":{"marginBottom":"24px"},"children":["$","path",null,{"d":"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z","fill":"var(--next-error-title)"}]}],["$","h1",null,{"style":{"fontSize":"24px","fontWeight":500,"letterSpacing":"-0.02em","lineHeight":"32px","margin":"0 0 12px 0","color":"var(--next-error-title)"},"children":"This page couldn’t load"}],["$","p",null,{"style":{"fontSize":"14px","fontWeight":400,"lineHeight":"21px","margin":"0 0 20px 0","color":"var(--next-error-message)"},"children":"A server error occurred. Reload to try again."}],["$","form",null,{"style":{"margin":0},"children":["$","button",null,{"type":"submit","style":{"display":"inline-flex","alignItems":"center","justifyContent":"center","height":"32px","padding":"0 12px","fontSize":"14px","fontWeight":500,"lineHeight":"20px","borderRadius":"6px","cursor":"pointer","color":"var(--next-error-btn-text)","background":"var(--next-error-btn-bg)","border":"var(--next-error-btn-border)"},"children":"Reload"}]}]]}]}]}]]}],null,["$","$L4",null,{"children":["$","$5",null,{"name":"Next.MetadataOutlet","children":"$@6"}]}]]}],{},null,false,null]},null,false,"$@7"]},null,false,"$@7"],["$","$1","h",{"children":[null,["$","$L8",null,{"children":"$L9"}],["$","div",null,{"hidden":true,"children":["$","$La",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$Lb"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],false]],"m":"$undefined","G":["$c",[]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"IRnpNeY-_eO7SxKBIkTbL"}
10
10
  d:[]
11
11
  7:"$Wd"
12
12
  9:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
@@ -6,7 +6,7 @@
6
6
  8:I[90484,[],"ViewportBoundary"]
7
7
  a:I[90484,[],"MetadataBoundary"]
8
8
  c:I[27123,[],"default",1]
9
- 0:{"P":null,"c":["","_global-error"],"q":"","i":false,"f":[[["",{"children":["_global-error",{"children":["__PAGE__",{}]}]}],[["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":[["$","title",null,{"children":"500: This page couldn’t load"}],["$","style",null,{"dangerouslySetInnerHTML":{"__html":":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }"}}]]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","display":"flex","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"marginTop":"-32px","maxWidth":"325px","padding":"32px 28px","textAlign":"left"},"children":[["$","svg",null,{"width":"32","height":"32","viewBox":"-0.2 -1.5 32 32","fill":"none","style":{"marginBottom":"24px"},"children":["$","path",null,{"d":"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z","fill":"var(--next-error-title)"}]}],["$","h1",null,{"style":{"fontSize":"24px","fontWeight":500,"letterSpacing":"-0.02em","lineHeight":"32px","margin":"0 0 12px 0","color":"var(--next-error-title)"},"children":"This page couldn’t load"}],["$","p",null,{"style":{"fontSize":"14px","fontWeight":400,"lineHeight":"21px","margin":"0 0 20px 0","color":"var(--next-error-message)"},"children":"A server error occurred. Reload to try again."}],["$","form",null,{"style":{"margin":0},"children":["$","button",null,{"type":"submit","style":{"display":"inline-flex","alignItems":"center","justifyContent":"center","height":"32px","padding":"0 12px","fontSize":"14px","fontWeight":500,"lineHeight":"20px","borderRadius":"6px","cursor":"pointer","color":"var(--next-error-btn-text)","background":"var(--next-error-btn-bg)","border":"var(--next-error-btn-border)"},"children":"Reload"}]}]]}]}]}]]}],null,["$","$L4",null,{"children":["$","$5",null,{"name":"Next.MetadataOutlet","children":"$@6"}]}]]}],{},null,false,null]},null,false,"$@7"]},null,false,"$@7"],["$","$1","h",{"children":[null,["$","$L8",null,{"children":"$L9"}],["$","div",null,{"hidden":true,"children":["$","$La",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$Lb"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],false]],"m":"$undefined","G":["$c",[]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"ug91LJa0m7OdzrTVaz_48"}
9
+ 0:{"P":null,"c":["","_global-error"],"q":"","i":false,"f":[[["",{"children":["_global-error",{"children":["__PAGE__",{}]}]}],[["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":[["$","title",null,{"children":"500: This page couldn’t load"}],["$","style",null,{"dangerouslySetInnerHTML":{"__html":":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }"}}]]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","display":"flex","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"marginTop":"-32px","maxWidth":"325px","padding":"32px 28px","textAlign":"left"},"children":[["$","svg",null,{"width":"32","height":"32","viewBox":"-0.2 -1.5 32 32","fill":"none","style":{"marginBottom":"24px"},"children":["$","path",null,{"d":"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z","fill":"var(--next-error-title)"}]}],["$","h1",null,{"style":{"fontSize":"24px","fontWeight":500,"letterSpacing":"-0.02em","lineHeight":"32px","margin":"0 0 12px 0","color":"var(--next-error-title)"},"children":"This page couldn’t load"}],["$","p",null,{"style":{"fontSize":"14px","fontWeight":400,"lineHeight":"21px","margin":"0 0 20px 0","color":"var(--next-error-message)"},"children":"A server error occurred. Reload to try again."}],["$","form",null,{"style":{"margin":0},"children":["$","button",null,{"type":"submit","style":{"display":"inline-flex","alignItems":"center","justifyContent":"center","height":"32px","padding":"0 12px","fontSize":"14px","fontWeight":500,"lineHeight":"20px","borderRadius":"6px","cursor":"pointer","color":"var(--next-error-btn-text)","background":"var(--next-error-btn-bg)","border":"var(--next-error-btn-border)"},"children":"Reload"}]}]]}]}]}]]}],null,["$","$L4",null,{"children":["$","$5",null,{"name":"Next.MetadataOutlet","children":"$@6"}]}]]}],{},null,false,null]},null,false,"$@7"]},null,false,"$@7"],["$","$1","h",{"children":[null,["$","$L8",null,{"children":"$L9"}],["$","div",null,{"hidden":true,"children":["$","$La",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$Lb"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],false]],"m":"$undefined","G":["$c",[]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"IRnpNeY-_eO7SxKBIkTbL"}
10
10
  d:[]
11
11
  7:"$Wd"
12
12
  9:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]