gsd-pi 2.42.0-dev.97e9e30 → 2.42.0-dev.eedc83f

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 (167) hide show
  1. package/README.md +23 -0
  2. package/dist/cli.js +15 -1
  3. package/dist/resource-loader.js +39 -6
  4. package/dist/resources/extensions/async-jobs/async-bash-tool.js +52 -4
  5. package/dist/resources/extensions/gsd/auto-prompts.js +1 -1
  6. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +11 -5
  7. package/dist/resources/extensions/gsd/detection.js +19 -0
  8. package/dist/resources/extensions/gsd/doctor-checks.js +31 -1
  9. package/dist/resources/extensions/gsd/doctor-providers.js +10 -0
  10. package/dist/resources/extensions/gsd/forensics.js +84 -0
  11. package/dist/resources/extensions/gsd/git-constants.js +1 -0
  12. package/dist/resources/extensions/gsd/git-service.js +68 -2
  13. package/dist/resources/extensions/gsd/native-git-bridge.js +1 -0
  14. package/dist/resources/extensions/gsd/preferences-types.js +1 -0
  15. package/dist/resources/extensions/gsd/preferences.js +59 -8
  16. package/dist/resources/extensions/gsd/prompts/forensics.md +12 -5
  17. package/dist/resources/extensions/gsd/repo-identity.js +46 -5
  18. package/dist/resources/extensions/gsd/service-tier.js +13 -4
  19. package/dist/resources/extensions/gsd/session-lock.js +2 -2
  20. package/dist/resources/extensions/gsd/worktree-resolver.js +2 -2
  21. package/dist/resources/extensions/mcp-client/index.js +2 -1
  22. package/dist/resources/extensions/search-the-web/tool-search.js +3 -3
  23. package/dist/web/standalone/.next/BUILD_ID +1 -1
  24. package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
  25. package/dist/web/standalone/.next/build-manifest.json +2 -2
  26. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  27. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  28. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  29. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  30. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  31. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  32. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  33. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  34. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  35. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  36. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  37. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  38. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  39. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  40. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  41. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  42. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  43. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  44. package/dist/web/standalone/.next/server/app/index.html +1 -1
  45. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  46. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  47. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  48. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  49. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  50. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  51. package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
  52. package/dist/web/standalone/.next/server/chunks/229.js +2 -2
  53. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  54. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  55. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  56. package/dist/web-mode.d.ts +2 -0
  57. package/dist/web-mode.js +40 -4
  58. package/package.json +1 -1
  59. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  60. package/packages/pi-agent-core/dist/agent.js +2 -0
  61. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  62. package/packages/pi-agent-core/dist/types.d.ts +6 -0
  63. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  64. package/packages/pi-agent-core/dist/types.js.map +1 -1
  65. package/packages/pi-agent-core/src/agent.test.ts +53 -0
  66. package/packages/pi-agent-core/src/agent.ts +3 -0
  67. package/packages/pi-agent-core/src/types.ts +6 -0
  68. package/packages/pi-agent-core/tsconfig.json +1 -1
  69. package/packages/pi-ai/dist/models.d.ts +5 -3
  70. package/packages/pi-ai/dist/models.d.ts.map +1 -1
  71. package/packages/pi-ai/dist/models.generated.d.ts +801 -1468
  72. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  73. package/packages/pi-ai/dist/models.generated.js +1135 -1588
  74. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  75. package/packages/pi-ai/dist/models.js.map +1 -1
  76. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  77. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +60 -2
  78. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  79. package/packages/pi-ai/scripts/generate-models.ts +1543 -0
  80. package/packages/pi-ai/src/models.generated.ts +1140 -1593
  81. package/packages/pi-ai/src/models.ts +7 -4
  82. package/packages/pi-ai/src/utils/oauth/github-copilot.ts +74 -2
  83. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  84. package/packages/pi-coding-agent/dist/core/agent-session.js +8 -1
  85. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  86. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +7 -0
  87. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  88. package/packages/pi-coding-agent/dist/core/auth-storage.js +29 -2
  89. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  90. package/packages/pi-coding-agent/dist/core/auth-storage.test.js +60 -0
  91. package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
  92. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  93. package/packages/pi-coding-agent/dist/core/extensions/loader.js +18 -0
  94. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  95. package/packages/pi-coding-agent/dist/core/lsp/client.d.ts.map +1 -1
  96. package/packages/pi-coding-agent/dist/core/lsp/client.js +23 -0
  97. package/packages/pi-coding-agent/dist/core/lsp/client.js.map +1 -1
  98. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  99. package/packages/pi-coding-agent/dist/core/model-registry.js +2 -0
  100. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  101. package/packages/pi-coding-agent/dist/core/package-manager.d.ts +6 -0
  102. package/packages/pi-coding-agent/dist/core/package-manager.d.ts.map +1 -1
  103. package/packages/pi-coding-agent/dist/core/package-manager.js +63 -11
  104. package/packages/pi-coding-agent/dist/core/package-manager.js.map +1 -1
  105. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts +9 -0
  106. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
  107. package/packages/pi-coding-agent/dist/core/resource-loader.js +20 -6
  108. package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
  109. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  110. package/packages/pi-coding-agent/dist/core/system-prompt.js +6 -5
  111. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  112. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  113. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-editor.js +3 -0
  114. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-editor.js.map +1 -1
  115. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  116. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +9 -6
  117. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  118. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  119. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +30 -10
  120. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  121. package/packages/pi-coding-agent/src/core/agent-session.ts +7 -1
  122. package/packages/pi-coding-agent/src/core/auth-storage.test.ts +68 -0
  123. package/packages/pi-coding-agent/src/core/auth-storage.ts +30 -2
  124. package/packages/pi-coding-agent/src/core/extensions/loader.ts +18 -0
  125. package/packages/pi-coding-agent/src/core/lsp/client.ts +29 -0
  126. package/packages/pi-coding-agent/src/core/model-registry.ts +3 -0
  127. package/packages/pi-coding-agent/src/core/package-manager.ts +99 -58
  128. package/packages/pi-coding-agent/src/core/resource-loader.ts +24 -6
  129. package/packages/pi-coding-agent/src/core/system-prompt.ts +6 -5
  130. package/packages/pi-coding-agent/src/modes/interactive/components/extension-editor.ts +3 -0
  131. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +10 -6
  132. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +31 -11
  133. package/src/resources/extensions/async-jobs/async-bash-timeout.test.ts +122 -0
  134. package/src/resources/extensions/async-jobs/async-bash-tool.ts +40 -4
  135. package/src/resources/extensions/gsd/auto-prompts.ts +1 -1
  136. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +13 -5
  137. package/src/resources/extensions/gsd/detection.ts +19 -0
  138. package/src/resources/extensions/gsd/doctor-checks.ts +32 -1
  139. package/src/resources/extensions/gsd/doctor-providers.ts +13 -0
  140. package/src/resources/extensions/gsd/doctor-types.ts +1 -0
  141. package/src/resources/extensions/gsd/forensics.ts +92 -0
  142. package/src/resources/extensions/gsd/git-constants.ts +1 -0
  143. package/src/resources/extensions/gsd/git-service.ts +71 -2
  144. package/src/resources/extensions/gsd/native-git-bridge.ts +1 -0
  145. package/src/resources/extensions/gsd/preferences-types.ts +3 -0
  146. package/src/resources/extensions/gsd/preferences.ts +62 -6
  147. package/src/resources/extensions/gsd/prompts/forensics.md +12 -5
  148. package/src/resources/extensions/gsd/repo-identity.ts +48 -5
  149. package/src/resources/extensions/gsd/service-tier.ts +17 -4
  150. package/src/resources/extensions/gsd/session-lock.ts +2 -2
  151. package/src/resources/extensions/gsd/tests/activity-log.test.ts +31 -69
  152. package/src/resources/extensions/gsd/tests/forensics-dedup.test.ts +48 -0
  153. package/src/resources/extensions/gsd/tests/forensics-issue-routing.test.ts +43 -0
  154. package/src/resources/extensions/gsd/tests/git-locale.test.ts +133 -0
  155. package/src/resources/extensions/gsd/tests/git-service.test.ts +49 -0
  156. package/src/resources/extensions/gsd/tests/journal.test.ts +82 -127
  157. package/src/resources/extensions/gsd/tests/manifest-status.test.ts +73 -82
  158. package/src/resources/extensions/gsd/tests/service-tier.test.ts +30 -1
  159. package/src/resources/extensions/gsd/tests/symlink-numbered-variants.test.ts +151 -0
  160. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +156 -263
  161. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +35 -78
  162. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +81 -74
  163. package/src/resources/extensions/gsd/worktree-resolver.ts +2 -2
  164. package/src/resources/extensions/mcp-client/index.ts +5 -1
  165. package/src/resources/extensions/search-the-web/tool-search.ts +3 -3
  166. /package/dist/web/standalone/.next/static/{PXrI5DoWsm7rwAVnEU2rD → JUBX5FUR73jiViQU5a-Cx}/_buildManifest.js +0 -0
  167. /package/dist/web/standalone/.next/static/{PXrI5DoWsm7rwAVnEU2rD → JUBX5FUR73jiViQU5a-Cx}/_ssgManifest.js +0 -0
@@ -129,14 +129,21 @@ function loadPreferencesFile(path, scope) {
129
129
  export function parsePreferencesMarkdown(content) {
130
130
  // Use indexOf instead of [\s\S]*? regex to avoid backtracking (#468)
131
131
  const startMarker = content.startsWith('---\r\n') ? '---\r\n' : '---\n';
132
- if (!content.startsWith(startMarker))
133
- return null;
134
- const searchStart = startMarker.length;
135
- const endIdx = content.indexOf('\n---', searchStart);
136
- if (endIdx === -1)
137
- return null;
138
- const block = content.slice(searchStart, endIdx);
139
- return parseFrontmatterBlock(block.replace(/\r/g, ''));
132
+ if (content.startsWith(startMarker)) {
133
+ const searchStart = startMarker.length;
134
+ const endIdx = content.indexOf('\n---', searchStart);
135
+ if (endIdx === -1)
136
+ return null;
137
+ const block = content.slice(searchStart, endIdx);
138
+ return parseFrontmatterBlock(block.replace(/\r/g, ''));
139
+ }
140
+ // Fallback: heading+list format (e.g. "## Git\n- isolation: none") (#2036)
141
+ // GSD agents may write preferences files without frontmatter delimiters.
142
+ if (/^##\s+\w/m.test(content)) {
143
+ return parseHeadingListFormat(content);
144
+ }
145
+ console.warn("[parsePreferencesMarkdown] preferences.md exists but uses an unrecognized format — skipping.");
146
+ return null;
140
147
  }
141
148
  function parseFrontmatterBlock(frontmatter) {
142
149
  try {
@@ -151,6 +158,49 @@ function parseFrontmatterBlock(frontmatter) {
151
158
  return {};
152
159
  }
153
160
  }
161
+ /**
162
+ * Parse heading+list format into a nested object, then cast to GSDPreferences.
163
+ * Handles markdown like:
164
+ * ## Git
165
+ * - isolation: none
166
+ * - commit_docs: true
167
+ * ## Models
168
+ * - planner: sonnet
169
+ */
170
+ function parseHeadingListFormat(content) {
171
+ const result = {};
172
+ let currentSection = null;
173
+ for (const rawLine of content.split('\n')) {
174
+ const line = rawLine.replace(/\r$/, '');
175
+ const headingMatch = line.match(/^##\s+(.+)$/);
176
+ if (headingMatch) {
177
+ currentSection = headingMatch[1].trim().toLowerCase().replace(/\s+/g, '_');
178
+ continue;
179
+ }
180
+ if (currentSection) {
181
+ const itemMatch = line.match(/^-\s+([^:]+):\s*(.*)$/);
182
+ if (itemMatch) {
183
+ if (!result[currentSection])
184
+ result[currentSection] = {};
185
+ const value = itemMatch[2].trim();
186
+ // Coerce "true"/"false" strings and numbers
187
+ result[currentSection][itemMatch[1].trim()] = value;
188
+ }
189
+ }
190
+ }
191
+ // Convert string values to appropriate types via YAML parser for each section
192
+ const typed = {};
193
+ for (const [section, entries] of Object.entries(result)) {
194
+ const yamlLines = Object.entries(entries).map(([k, v]) => `${k}: ${v}`).join('\n');
195
+ try {
196
+ typed[section] = parseYaml(yamlLines);
197
+ }
198
+ catch {
199
+ typed[section] = entries;
200
+ }
201
+ }
202
+ return typed;
203
+ }
154
204
  // ─── Merging ────────────────────────────────────────────────────────────────
155
205
  /**
156
206
  * Apply mode defaults as the lowest-priority layer.
@@ -215,6 +265,7 @@ function mergePreferences(base, override) {
215
265
  ? { ...(base.github ?? {}), ...(override.github ?? {}) }
216
266
  : undefined,
217
267
  service_tier: override.service_tier ?? base.service_tier,
268
+ forensics_dedup: override.forensics_dedup ?? base.forensics_dedup,
218
269
  };
219
270
  }
220
271
  function mergeStringLists(base, override) {
@@ -101,11 +101,19 @@ Explain your findings:
101
101
  - **Code snippet** — the problematic code and what it should do instead
102
102
  - **Recovery** — what the user can do right now to get unstuck
103
103
 
104
+ {{dedupSection}}
105
+
104
106
  Then **offer GitHub issue creation**: "Would you like me to create a GitHub issue for this on gsd-build/gsd-2?"
105
107
 
106
- If yes, create using `gh issue create` with this format:
108
+ **CRITICAL: The `github_issues` tool ONLY targets the current user's repository — it has no `repo` parameter. You MUST use `gh issue create --repo gsd-build/gsd-2` via the `bash` tool to file on the correct repo. Do NOT use the `github_issues` tool for this.**
107
109
 
108
- ```
110
+ If yes, create using the `bash` tool:
111
+
112
+ ```bash
113
+ gh issue create --repo gsd-build/gsd-2 \
114
+ --title "..." \
115
+ --label "bug" --label "auto-generated" \
116
+ --body "$(cat <<'EOF'
109
117
  ## Problem
110
118
  [1-2 sentence summary]
111
119
 
@@ -128,11 +136,10 @@ If yes, create using `gh issue create` with this format:
128
136
 
129
137
  ---
130
138
  *Auto-generated by `/gsd forensics`*
139
+ EOF
140
+ )"
131
141
  ```
132
142
 
133
- **Repository:** gsd-build/gsd-2
134
- **Labels:** bug, auto-generated
135
-
136
143
  ### Redaction Rules (CRITICAL)
137
144
 
138
145
  Before creating the issue, you MUST:
@@ -7,7 +7,7 @@
7
7
  */
8
8
  import { createHash } from "node:crypto";
9
9
  import { execFileSync } from "node:child_process";
10
- import { existsSync, lstatSync, mkdirSync, readFileSync, realpathSync, rmSync, symlinkSync, writeFileSync } from "node:fs";
10
+ import { existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, realpathSync, rmSync, symlinkSync, writeFileSync } from "node:fs";
11
11
  import { homedir } from "node:os";
12
12
  import { basename, dirname, join, resolve } from "node:path";
13
13
  const gsdHome = process.env.GSD_HOME || join(homedir(), ".gsd");
@@ -247,14 +247,52 @@ export function externalProjectsRoot() {
247
247
  const base = process.env.GSD_STATE_DIR || gsdHome;
248
248
  return join(base, "projects");
249
249
  }
250
+ // ─── Numbered Variant Cleanup ────────────────────────────────────────────────
251
+ /**
252
+ * macOS collision pattern: `.gsd 2`, `.gsd 3`, `.gsd 4`, etc.
253
+ *
254
+ * When `symlinkSync` (or Finder) tries to create `.gsd` but a real directory
255
+ * already exists at that path, macOS APFS silently renames the new entry to
256
+ * `.gsd 2`, then `.gsd 3`, and so on. These numbered variants confuse GSD
257
+ * because the canonical `.gsd` path no longer resolves to the external state
258
+ * directory, making tracked planning files appear deleted.
259
+ *
260
+ * This helper scans the project root for entries matching `.gsd <digits>` and
261
+ * removes them. It is called early in `ensureGsdSymlink()` so that the
262
+ * canonical `.gsd` path is always the one in use.
263
+ */
264
+ const GSD_NUMBERED_VARIANT_RE = /^\.gsd \d+$/;
265
+ export function cleanNumberedGsdVariants(projectPath) {
266
+ const removed = [];
267
+ try {
268
+ const entries = readdirSync(projectPath);
269
+ for (const entry of entries) {
270
+ if (GSD_NUMBERED_VARIANT_RE.test(entry)) {
271
+ const fullPath = join(projectPath, entry);
272
+ try {
273
+ rmSync(fullPath, { recursive: true, force: true });
274
+ removed.push(entry);
275
+ }
276
+ catch {
277
+ // Best-effort: if removal fails (e.g. permissions), continue with next
278
+ }
279
+ }
280
+ }
281
+ }
282
+ catch {
283
+ // Non-fatal: readdir failure should not block symlink creation
284
+ }
285
+ return removed;
286
+ }
250
287
  // ─── Symlink Management ─────────────────────────────────────────────────────
251
288
  /**
252
289
  * Ensure the `<project>/.gsd` symlink points to the external state directory.
253
290
  *
254
- * 1. mkdir -p the external dir
255
- * 2. If `<project>/.gsd` doesn't exist → create symlink
256
- * 3. If `<project>/.gsd` is already the correct symlink → no-op
257
- * 4. If `<project>/.gsd` is a real directoryreturn as-is (migration handles later)
291
+ * 1. Clean up any macOS numbered collision variants (`.gsd 2`, `.gsd 3`, etc.)
292
+ * 2. mkdir -p the external dir
293
+ * 3. If `<project>/.gsd` doesn't exist create symlink
294
+ * 4. If `<project>/.gsd` is already the correct symlink no-op
295
+ * 5. If `<project>/.gsd` is a real directory → return as-is (migration handles later)
258
296
  *
259
297
  * Returns the resolved external path.
260
298
  */
@@ -270,6 +308,9 @@ export function ensureGsdSymlink(projectPath) {
270
308
  if (localGsdNormalized === gsdHomePath) {
271
309
  return localGsd;
272
310
  }
311
+ // Clean up macOS numbered collision variants (.gsd 2, .gsd 3, etc.) before
312
+ // any existence checks — otherwise they accumulate and confuse state (#2205).
313
+ cleanNumberedGsdVariants(projectPath);
273
314
  // Ensure external directory exists
274
315
  mkdirSync(externalPath, { recursive: true });
275
316
  // Write repo metadata once so cleanup commands can identify this directory later.
@@ -11,6 +11,7 @@ import { existsSync, readFileSync } from "node:fs";
11
11
  import { saveFile } from "./files.js";
12
12
  import { getGlobalGSDPreferencesPath, loadEffectiveGSDPreferences, loadGlobalGSDPreferences, } from "./preferences.js";
13
13
  import { ensurePreferencesFile, serializePreferencesToFrontmatter } from "./commands-prefs-wizard.js";
14
+ const SERVICE_TIER_SCOPE_NOTE = "Only affects gpt-5.4 models, regardless of provider.";
14
15
  // ─── Gating ──────────────────────────────────────────────────────────────────
15
16
  /**
16
17
  * Returns true when the given model ID supports OpenAI service tiers.
@@ -37,7 +38,7 @@ export function formatServiceTierStatus(tier) {
37
38
  " /gsd fast flex Set to flex (0.5x cost, slower)",
38
39
  " /gsd fast off Disable service tier",
39
40
  "",
40
- "Only affects gpt-5.4 models.",
41
+ SERVICE_TIER_SCOPE_NOTE,
41
42
  ].join("\n");
42
43
  }
43
44
  const label = tier === "priority" ? "priority (2x cost, faster)" : "flex (0.5x cost, slower)";
@@ -49,9 +50,14 @@ export function formatServiceTierStatus(tier) {
49
50
  " /gsd fast flex Set to flex (0.5x cost, slower)",
50
51
  " /gsd fast off Disable service tier",
51
52
  "",
52
- "Only affects gpt-5.4 models.",
53
+ SERVICE_TIER_SCOPE_NOTE,
53
54
  ].join("\n");
54
55
  }
56
+ export function formatServiceTierFooterStatus(tier, modelId) {
57
+ if (!tier || !modelId || !supportsServiceTier(modelId))
58
+ return undefined;
59
+ return tier === "priority" ? "fast: ⚡ priority" : "fast: 💰 flex";
60
+ }
55
61
  // ─── Icon Resolution ─────────────────────────────────────────────────────────
56
62
  /**
57
63
  * Returns the appropriate icon for the active service tier and model.
@@ -121,17 +127,20 @@ export async function handleFast(args, ctx) {
121
127
  }
122
128
  if (trimmed === "on") {
123
129
  await writeGlobalServiceTier(ctx, "priority");
124
- ctx.ui.notify("Service tier set to priority (2x cost, faster responses). Only affects gpt-5.4 models.", "info");
130
+ ctx.ui.setStatus("gsd-fast", formatServiceTierFooterStatus("priority", ctx.model?.id));
131
+ ctx.ui.notify("Service tier set to priority (2x cost, faster responses). Only affects gpt-5.4 models, regardless of provider.", "info");
125
132
  return;
126
133
  }
127
134
  if (trimmed === "off") {
128
135
  await writeGlobalServiceTier(ctx, undefined);
136
+ ctx.ui.setStatus("gsd-fast", undefined);
129
137
  ctx.ui.notify("Service tier disabled.", "info");
130
138
  return;
131
139
  }
132
140
  if (trimmed === "flex") {
133
141
  await writeGlobalServiceTier(ctx, "flex");
134
- ctx.ui.notify("Service tier set to flex (0.5x cost, slower responses). Only affects gpt-5.4 models.", "info");
142
+ ctx.ui.setStatus("gsd-fast", formatServiceTierFooterStatus("flex", ctx.model?.id));
143
+ ctx.ui.notify("Service tier set to flex (0.5x cost, slower responses). Only affects gpt-5.4 models, regardless of provider.", "info");
135
144
  return;
136
145
  }
137
146
  ctx.ui.notify("Usage: /gsd fast [on|off|flex|status]\n\n on Priority tier (2x cost, faster)\n off Disable service tier\n flex Flex tier (0.5x cost, slower)\n status Show current setting", "warning");
@@ -199,7 +199,7 @@ export function acquireSessionLock(basePath) {
199
199
  // during a long LLM call — not a real takeover. Log and continue.
200
200
  const elapsed = Date.now() - _lockAcquiredAt;
201
201
  if (elapsed < 1_800_000) {
202
- process.stderr.write(`[gsd] Lock heartbeat mismatch after ${Math.round(elapsed / 1000)}s — event loop stall, continuing.\n`);
202
+ process.stderr.write(`[gsd] Lock heartbeat caught up after ${Math.round(elapsed / 1000)}s — long LLM call, no action needed.\n`);
203
203
  return; // Suppress false positive
204
204
  }
205
205
  // Past the stale window — check if the lock file still belongs to us before
@@ -252,7 +252,7 @@ export function acquireSessionLock(basePath) {
252
252
  // on benign mtime drift (laptop sleep, heavy LLM event loop stalls).
253
253
  const elapsed = Date.now() - _lockAcquiredAt;
254
254
  if (elapsed < 1_800_000) {
255
- process.stderr.write(`[gsd] Lock heartbeat mismatch after ${Math.round(elapsed / 1000)}s — event loop stall, continuing.\n`);
255
+ process.stderr.write(`[gsd] Lock heartbeat caught up after ${Math.round(elapsed / 1000)}s — long LLM call, no action needed.\n`);
256
256
  return;
257
257
  }
258
258
  // Check PID ownership before declaring compromise (#1578)
@@ -286,9 +286,9 @@ export class WorktreeResolver {
286
286
  });
287
287
  // Surface a clear, actionable error. The worktree and milestone branch are
288
288
  // intentionally preserved — nothing has been deleted. The user can retry
289
- // /complete-milestone or merge manually once the underlying issue is fixed
289
+ // /gsd dispatch complete-milestone or merge manually once the underlying issue is fixed
290
290
  // (e.g. checkout to wrong branch, unresolved conflicts). (#1668)
291
- ctx.notify(`Milestone merge failed: ${msg}. Your worktree and milestone branch are preserved — retry /complete-milestone or merge manually.`, "warning");
291
+ ctx.notify(`Milestone merge failed: ${msg}. Your worktree and milestone branch are preserved — retry /gsd dispatch complete-milestone or merge manually.`, "warning");
292
292
  // Clean up stale merge state left by failed squash-merge (#1389)
293
293
  try {
294
294
  const gitDir = join(originalBase || this.s.basePath, ".git");
@@ -108,7 +108,8 @@ async function getOrConnect(name, signal) {
108
108
  });
109
109
  }
110
110
  else if (config.transport === "http" && config.url) {
111
- transport = new StreamableHTTPClientTransport(new URL(config.url));
111
+ const resolvedUrl = config.url.replace(/\$\{([^}]+)\}/g, (_, name) => process.env[name] ?? "");
112
+ transport = new StreamableHTTPClientTransport(new URL(resolvedUrl));
112
113
  }
113
114
  else {
114
115
  throw new Error(`Server "${name}" has unsupported transport: ${config.transport}`);
@@ -259,9 +259,9 @@ export function registerSearchTool(pi) {
259
259
  // with brief interruptions every MAX_CONSECUTIVE_DUPES+1 calls.
260
260
  if (cacheKey === lastSearchKey) {
261
261
  consecutiveDupeCount++;
262
- if (consecutiveDupeCount >= MAX_CONSECUTIVE_DUPES) {
262
+ if (consecutiveDupeCount > MAX_CONSECUTIVE_DUPES) {
263
263
  return {
264
- content: [{ type: "text", text: `⚠️ Search loop detected: the query "${params.query}" has been searched ${consecutiveDupeCount + 1} times consecutively with identical results. The information you need is already in the previous search results above. Stop searching and use those results to proceed with your task.` }],
264
+ content: [{ type: "text", text: `⚠️ Search loop detected: the query "${params.query}" has been searched ${consecutiveDupeCount} times consecutively with identical results. The information you need is already in the previous search results above. Stop searching and use those results to proceed with your task.` }],
265
265
  isError: true,
266
266
  details: { errorKind: "search_loop", error: "Consecutive duplicate search detected" },
267
267
  };
@@ -269,7 +269,7 @@ export function registerSearchTool(pi) {
269
269
  }
270
270
  else {
271
271
  lastSearchKey = cacheKey;
272
- consecutiveDupeCount = 0;
272
+ consecutiveDupeCount = 1;
273
273
  }
274
274
  const cached = searchCache.get(cacheKey);
275
275
  if (cached) {
@@ -1 +1 @@
1
- PXrI5DoWsm7rwAVnEU2rD
1
+ JUBX5FUR73jiViQU5a-Cx
@@ -1,18 +1,19 @@
1
1
  {
2
2
  "/_not-found/page": "/_not-found",
3
3
  "/_global-error/page": "/_global-error",
4
- "/api/bridge-terminal/input/route": "/api/bridge-terminal/input",
5
4
  "/api/boot/route": "/api/boot",
6
5
  "/api/bridge-terminal/resize/route": "/api/bridge-terminal/resize",
7
- "/api/dev-mode/route": "/api/dev-mode",
8
- "/api/doctor/route": "/api/doctor",
9
- "/api/browse-directories/route": "/api/browse-directories",
6
+ "/api/bridge-terminal/input/route": "/api/bridge-terminal/input",
10
7
  "/api/cleanup/route": "/api/cleanup",
8
+ "/api/captures/route": "/api/captures",
9
+ "/api/browse-directories/route": "/api/browse-directories",
10
+ "/api/bridge-terminal/stream/route": "/api/bridge-terminal/stream",
11
+ "/api/doctor/route": "/api/doctor",
12
+ "/api/dev-mode/route": "/api/dev-mode",
11
13
  "/api/export-data/route": "/api/export-data",
12
14
  "/api/forensics/route": "/api/forensics",
13
15
  "/api/git/route": "/api/git",
14
16
  "/api/history/route": "/api/history",
15
- "/api/captures/route": "/api/captures",
16
17
  "/api/hooks/route": "/api/hooks",
17
18
  "/api/inspect/route": "/api/inspect",
18
19
  "/api/knowledge/route": "/api/knowledge",
@@ -20,25 +21,24 @@
20
21
  "/api/onboarding/route": "/api/onboarding",
21
22
  "/api/preferences/route": "/api/preferences",
22
23
  "/api/recovery/route": "/api/recovery",
24
+ "/api/session/browser/route": "/api/session/browser",
23
25
  "/api/projects/route": "/api/projects",
24
- "/api/bridge-terminal/stream/route": "/api/bridge-terminal/stream",
25
- "/api/session/command/route": "/api/session/command",
26
26
  "/api/session/events/route": "/api/session/events",
27
27
  "/api/session/manage/route": "/api/session/manage",
28
- "/api/shutdown/route": "/api/shutdown",
29
28
  "/api/settings-data/route": "/api/settings-data",
30
- "/api/session/browser/route": "/api/session/browser",
29
+ "/api/shutdown/route": "/api/shutdown",
30
+ "/api/session/command/route": "/api/session/command",
31
31
  "/api/skill-health/route": "/api/skill-health",
32
32
  "/api/steer/route": "/api/steer",
33
- "/api/terminal/input/route": "/api/terminal/input",
34
33
  "/api/terminal/resize/route": "/api/terminal/resize",
34
+ "/api/terminal/input/route": "/api/terminal/input",
35
35
  "/api/terminal/sessions/route": "/api/terminal/sessions",
36
- "/api/undo/route": "/api/undo",
37
36
  "/api/terminal/stream/route": "/api/terminal/stream",
38
- "/api/remote-questions/route": "/api/remote-questions",
39
37
  "/api/terminal/upload/route": "/api/terminal/upload",
38
+ "/api/undo/route": "/api/undo",
40
39
  "/api/update/route": "/api/update",
41
40
  "/api/visualizer/route": "/api/visualizer",
41
+ "/api/remote-questions/route": "/api/remote-questions",
42
42
  "/api/files/route": "/api/files",
43
43
  "/page": "/"
44
44
  }
@@ -4,8 +4,8 @@
4
4
  ],
5
5
  "devFiles": [],
6
6
  "lowPriorityFiles": [
7
- "static/PXrI5DoWsm7rwAVnEU2rD/_buildManifest.js",
8
- "static/PXrI5DoWsm7rwAVnEU2rD/_ssgManifest.js"
7
+ "static/JUBX5FUR73jiViQU5a-Cx/_buildManifest.js",
8
+ "static/JUBX5FUR73jiViQU5a-Cx/_ssgManifest.js"
9
9
  ],
10
10
  "rootMainFiles": [
11
11
  "static/chunks/webpack-fa307370fcf9fb2c.js",
@@ -78,8 +78,8 @@
78
78
  "dynamicRoutes": {},
79
79
  "notFoundRoutes": [],
80
80
  "preview": {
81
- "previewModeId": "efec123656d187a6bcfc3b0746fb3d7f",
82
- "previewModeSigningKey": "64f6d1a0857c1d9ec796e62a2a84b7ac5daeef3b19ef55905152edabd47fef88",
83
- "previewModeEncryptionKey": "e255f01de29efac3537091e427ca13b07dce2a04fa6456b23f4bd005c881226f"
81
+ "previewModeId": "aa931b3054a117e6e3c0ce1b420926ae",
82
+ "previewModeSigningKey": "06ef66b13a30b390666f5b46ed0172a79c6428a31935d74e46135dfeb86df96e",
83
+ "previewModeEncryptionKey": "c518ad9054015901502acc7300cfb776858ec72098ebd3f079638cab2fc6bd7c"
84
84
  }
85
85
  }
@@ -1,2 +1,2 @@
1
- <!DOCTYPE html><!--PXrI5DoWsm7rwAVnEU2rD--><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-fa307370fcf9fb2c.js"/><script src="/_next/static/chunks/4bd1b696-e5d7c65570c947b7.js" async=""></script><script src="/_next/static/chunks/3794-337d1ca25ad99a89.js" async=""></script><script src="/_next/static/chunks/main-app-fdab67f7802d7832.js" async=""></script><meta name="next-size-adjust" content=""/><title>500: Internal Server Error.</title><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;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}
2
- @media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-fa307370fcf9fb2c.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\"\n7:I[90484,[],\"ViewportBoundary\"]\n9:I[90484,[],\"MetadataBoundary\"]\nb:I[27123,[],\"\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"PXrI5DoWsm7rwAVnEU2rD\",\"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: Internal Server Error.\"}]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"lineHeight\":\"48px\"},\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}\\n@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"paddingRight\":23,\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\"},\"children\":\"500\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"28px\"},\"children\":\"Internal Server Error.\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L7\",null,{\"children\":\"$L8\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L9\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$La\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$b\",[]],\"S\":true}\n"])</script><script>self.__next_f.push([1,"8:[[\"$\",\"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\na:[]\n"])</script></body></html>
1
+ <!DOCTYPE html><!--JUBX5FUR73jiViQU5a_Cx--><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-fa307370fcf9fb2c.js"/><script src="/_next/static/chunks/4bd1b696-e5d7c65570c947b7.js" async=""></script><script src="/_next/static/chunks/3794-337d1ca25ad99a89.js" async=""></script><script src="/_next/static/chunks/main-app-fdab67f7802d7832.js" async=""></script><meta name="next-size-adjust" content=""/><title>500: Internal Server Error.</title><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;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}
2
+ @media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-fa307370fcf9fb2c.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\"\n7:I[90484,[],\"ViewportBoundary\"]\n9:I[90484,[],\"MetadataBoundary\"]\nb:I[27123,[],\"\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"JUBX5FUR73jiViQU5a-Cx\",\"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: Internal Server Error.\"}]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"lineHeight\":\"48px\"},\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}\\n@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"paddingRight\":23,\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\"},\"children\":\"500\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"28px\"},\"children\":\"Internal Server Error.\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L7\",null,{\"children\":\"$L8\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L9\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$La\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$b\",[]],\"S\":true}\n"])</script><script>self.__next_f.push([1,"8:[[\"$\",\"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\na:[]\n"])</script></body></html>
@@ -6,7 +6,7 @@
6
6
  7:I[90484,[],"ViewportBoundary"]
7
7
  9:I[90484,[],"MetadataBoundary"]
8
8
  b:I[27123,[],""]
9
- 0:{"P":null,"b":"PXrI5DoWsm7rwAVnEU2rD","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: Internal Server Error."}]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"lineHeight":"48px"},"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}\n@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","paddingRight":23,"fontSize":24,"fontWeight":500,"verticalAlign":"top"},"children":"500"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"28px"},"children":"Internal Server Error."}]}]]}]}]}]]}],null,["$","$L4",null,{"children":["$","$5",null,{"name":"Next.MetadataOutlet","children":"$@6"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],["$","$1","h",{"children":[null,["$","$L7",null,{"children":"$L8"}],["$","div",null,{"hidden":true,"children":["$","$L9",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$La"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],false]],"m":"$undefined","G":["$b",[]],"S":true}
9
+ 0:{"P":null,"b":"JUBX5FUR73jiViQU5a-Cx","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: Internal Server Error."}]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"lineHeight":"48px"},"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}\n@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","paddingRight":23,"fontSize":24,"fontWeight":500,"verticalAlign":"top"},"children":"500"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"28px"},"children":"Internal Server Error."}]}]]}]}]}]]}],null,["$","$L4",null,{"children":["$","$5",null,{"name":"Next.MetadataOutlet","children":"$@6"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],["$","$1","h",{"children":[null,["$","$L7",null,{"children":"$L8"}],["$","div",null,{"hidden":true,"children":["$","$L9",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$La"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],false]],"m":"$undefined","G":["$b",[]],"S":true}
10
10
  8:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
11
11
  6:null
12
12
  a:[]
@@ -6,7 +6,7 @@
6
6
  7:I[90484,[],"ViewportBoundary"]
7
7
  9:I[90484,[],"MetadataBoundary"]
8
8
  b:I[27123,[],""]
9
- 0:{"P":null,"b":"PXrI5DoWsm7rwAVnEU2rD","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: Internal Server Error."}]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"lineHeight":"48px"},"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}\n@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","paddingRight":23,"fontSize":24,"fontWeight":500,"verticalAlign":"top"},"children":"500"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"28px"},"children":"Internal Server Error."}]}]]}]}]}]]}],null,["$","$L4",null,{"children":["$","$5",null,{"name":"Next.MetadataOutlet","children":"$@6"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],["$","$1","h",{"children":[null,["$","$L7",null,{"children":"$L8"}],["$","div",null,{"hidden":true,"children":["$","$L9",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$La"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],false]],"m":"$undefined","G":["$b",[]],"S":true}
9
+ 0:{"P":null,"b":"JUBX5FUR73jiViQU5a-Cx","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: Internal Server Error."}]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"lineHeight":"48px"},"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}\n@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","paddingRight":23,"fontSize":24,"fontWeight":500,"verticalAlign":"top"},"children":"500"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"28px"},"children":"Internal Server Error."}]}]]}]}]}]]}],null,["$","$L4",null,{"children":["$","$5",null,{"name":"Next.MetadataOutlet","children":"$@6"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],["$","$1","h",{"children":[null,["$","$L7",null,{"children":"$L8"}],["$","div",null,{"hidden":true,"children":["$","$L9",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$La"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],false]],"m":"$undefined","G":["$b",[]],"S":true}
10
10
  8:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
11
11
  6:null
12
12
  a:[]
@@ -1,5 +1,5 @@
1
1
  1:"$Sreact.fragment"
2
2
  2:I[90484,[],"OutletBoundary"]
3
3
  3:"$Sreact.suspense"
4
- 0:{"buildId":"PXrI5DoWsm7rwAVnEU2rD","rsc":["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":["$","title",null,{"children":"500: Internal Server Error."}]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"lineHeight":"48px"},"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}\n@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","paddingRight":23,"fontSize":24,"fontWeight":500,"verticalAlign":"top"},"children":"500"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"28px"},"children":"Internal Server Error."}]}]]}]}]}]]}],null,["$","$L2",null,{"children":["$","$3",null,{"name":"Next.MetadataOutlet","children":"$@4"}]}]]}],"loading":null,"isPartial":false}
4
+ 0:{"buildId":"JUBX5FUR73jiViQU5a-Cx","rsc":["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":["$","title",null,{"children":"500: Internal Server Error."}]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"lineHeight":"48px"},"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}\n@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","paddingRight":23,"fontSize":24,"fontWeight":500,"verticalAlign":"top"},"children":"500"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"28px"},"children":"Internal Server Error."}]}]]}]}]}]]}],null,["$","$L2",null,{"children":["$","$3",null,{"name":"Next.MetadataOutlet","children":"$@4"}]}]]}],"loading":null,"isPartial":false}
5
5
  4:null
@@ -1,4 +1,4 @@
1
1
  1:"$Sreact.fragment"
2
2
  2:I[57121,[],""]
3
3
  3:I[74581,[],""]
4
- 0:{"buildId":"PXrI5DoWsm7rwAVnEU2rD","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
4
+ 0:{"buildId":"JUBX5FUR73jiViQU5a-Cx","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
@@ -2,4 +2,4 @@
2
2
  2:I[90484,[],"ViewportBoundary"]
3
3
  3:I[90484,[],"MetadataBoundary"]
4
4
  4:"$Sreact.suspense"
5
- 0:{"buildId":"PXrI5DoWsm7rwAVnEU2rD","rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[]}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],"loading":null,"isPartial":false}
5
+ 0:{"buildId":"JUBX5FUR73jiViQU5a-Cx","rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[]}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],"loading":null,"isPartial":false}
@@ -1,4 +1,4 @@
1
1
  1:"$Sreact.fragment"
2
2
  2:I[57121,[],""]
3
3
  3:I[74581,[],""]
4
- 0:{"buildId":"PXrI5DoWsm7rwAVnEU2rD","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
4
+ 0:{"buildId":"JUBX5FUR73jiViQU5a-Cx","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
@@ -1 +1 @@
1
- 0:{"buildId":"PXrI5DoWsm7rwAVnEU2rD","tree":{"name":"","paramType":null,"paramKey":"","hasRuntimePrefetch":false,"slots":{"children":{"name":"_global-error","paramType":null,"paramKey":"_global-error","hasRuntimePrefetch":false,"slots":{"children":{"name":"__PAGE__","paramType":null,"paramKey":"__PAGE__","hasRuntimePrefetch":false,"slots":null,"isRootLayout":false}},"isRootLayout":false}},"isRootLayout":false},"staleTime":300}
1
+ 0:{"buildId":"JUBX5FUR73jiViQU5a-Cx","tree":{"name":"","paramType":null,"paramKey":"","hasRuntimePrefetch":false,"slots":{"children":{"name":"_global-error","paramType":null,"paramKey":"_global-error","hasRuntimePrefetch":false,"slots":{"children":{"name":"__PAGE__","paramType":null,"paramKey":"__PAGE__","hasRuntimePrefetch":false,"slots":null,"isRootLayout":false}},"isRootLayout":false}},"isRootLayout":false},"staleTime":300}