gsd-pi 2.67.0-dev.5399650 → 2.67.0-dev.6fc2289

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 (151) hide show
  1. package/README.md +1 -1
  2. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +152 -70
  3. package/dist/resources/extensions/gsd/auto/session.js +4 -0
  4. package/dist/resources/extensions/gsd/auto-dispatch.js +1 -1
  5. package/dist/resources/extensions/gsd/auto-start.js +16 -30
  6. package/dist/resources/extensions/gsd/auto-worktree.js +62 -15
  7. package/dist/resources/extensions/gsd/auto.js +94 -59
  8. package/dist/resources/extensions/gsd/bootstrap/system-context.js +7 -2
  9. package/dist/resources/extensions/gsd/commands/catalog.js +2 -1
  10. package/dist/resources/extensions/gsd/commands/handlers/core.js +1 -1
  11. package/dist/resources/extensions/gsd/commands-mcp-status.js +43 -7
  12. package/dist/resources/extensions/gsd/doctor-git-checks.js +4 -4
  13. package/dist/resources/extensions/gsd/doctor-proactive.js +3 -3
  14. package/dist/resources/extensions/gsd/doctor.js +8 -4
  15. package/dist/resources/extensions/gsd/guided-flow.js +40 -31
  16. package/dist/resources/extensions/gsd/init-wizard.js +15 -12
  17. package/dist/resources/extensions/gsd/interrupted-session.js +146 -0
  18. package/dist/resources/extensions/gsd/mcp-project-config.js +83 -0
  19. package/dist/resources/extensions/gsd/workflow-mcp.js +64 -24
  20. package/dist/web/standalone/.next/BUILD_ID +1 -1
  21. package/dist/web/standalone/.next/app-path-routes-manifest.json +16 -16
  22. package/dist/web/standalone/.next/build-manifest.json +3 -3
  23. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  24. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  25. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  26. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  27. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  28. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  29. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  30. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  31. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  32. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  33. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  34. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +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/index.html +1 -1
  44. package/dist/web/standalone/.next/server/app/index.rsc +2 -2
  45. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  46. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
  47. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  48. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  49. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  50. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  51. package/dist/web/standalone/.next/server/app-paths-manifest.json +16 -16
  52. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  53. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  54. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  55. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  56. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  57. package/dist/web/standalone/.next/static/chunks/2826.821e01b07d92e948.js +9 -0
  58. package/dist/web/standalone/.next/static/chunks/app/{page-0c485498795110d6.js → page-f1e30ab6bb269149.js} +1 -1
  59. package/dist/web/standalone/.next/static/chunks/{webpack-b49b09f97429b5d0.js → webpack-6e4d7e9a4f57bed4.js} +1 -1
  60. package/package.json +1 -1
  61. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  62. package/packages/mcp-server/dist/workflow-tools.js +10 -4
  63. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  64. package/packages/mcp-server/src/workflow-tools.ts +13 -2
  65. package/packages/pi-agent-core/dist/agent-loop.js +14 -6
  66. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  67. package/packages/pi-agent-core/src/agent-loop.test.ts +53 -0
  68. package/packages/pi-agent-core/src/agent-loop.ts +20 -6
  69. package/packages/pi-coding-agent/dist/core/contextual-tips.d.ts +43 -0
  70. package/packages/pi-coding-agent/dist/core/contextual-tips.d.ts.map +1 -0
  71. package/packages/pi-coding-agent/dist/core/contextual-tips.js +208 -0
  72. package/packages/pi-coding-agent/dist/core/contextual-tips.js.map +1 -0
  73. package/packages/pi-coding-agent/dist/core/contextual-tips.test.d.ts +2 -0
  74. package/packages/pi-coding-agent/dist/core/contextual-tips.test.d.ts.map +1 -0
  75. package/packages/pi-coding-agent/dist/core/contextual-tips.test.js +227 -0
  76. package/packages/pi-coding-agent/dist/core/contextual-tips.test.js.map +1 -0
  77. package/packages/pi-coding-agent/dist/core/index.d.ts +1 -0
  78. package/packages/pi-coding-agent/dist/core/index.d.ts.map +1 -1
  79. package/packages/pi-coding-agent/dist/core/index.js +1 -0
  80. package/packages/pi-coding-agent/dist/core/index.js.map +1 -1
  81. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.d.ts +2 -0
  82. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.d.ts.map +1 -0
  83. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +28 -0
  84. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -0
  85. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +1 -0
  86. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  87. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +17 -12
  88. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  89. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  90. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +19 -0
  91. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  92. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.d.ts +4 -0
  93. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  94. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +14 -0
  95. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  96. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +3 -0
  97. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  98. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +15 -12
  99. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  100. package/packages/pi-coding-agent/src/core/contextual-tips.test.ts +259 -0
  101. package/packages/pi-coding-agent/src/core/contextual-tips.ts +232 -0
  102. package/packages/pi-coding-agent/src/core/index.ts +2 -0
  103. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +54 -0
  104. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +18 -12
  105. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +21 -0
  106. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +19 -0
  107. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +19 -15
  108. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +190 -93
  109. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +89 -116
  110. package/src/resources/extensions/gsd/auto/session.ts +4 -0
  111. package/src/resources/extensions/gsd/auto-dispatch.ts +1 -1
  112. package/src/resources/extensions/gsd/auto-start.ts +23 -55
  113. package/src/resources/extensions/gsd/auto-worktree.ts +59 -15
  114. package/src/resources/extensions/gsd/auto.ts +104 -63
  115. package/src/resources/extensions/gsd/bootstrap/system-context.ts +8 -2
  116. package/src/resources/extensions/gsd/commands/catalog.ts +2 -1
  117. package/src/resources/extensions/gsd/commands/handlers/core.ts +1 -1
  118. package/src/resources/extensions/gsd/commands-mcp-status.ts +53 -7
  119. package/src/resources/extensions/gsd/doctor-git-checks.ts +4 -4
  120. package/src/resources/extensions/gsd/doctor-proactive.ts +3 -3
  121. package/src/resources/extensions/gsd/doctor.ts +9 -5
  122. package/src/resources/extensions/gsd/guided-flow.ts +42 -36
  123. package/src/resources/extensions/gsd/init-wizard.ts +17 -11
  124. package/src/resources/extensions/gsd/interrupted-session.ts +224 -0
  125. package/src/resources/extensions/gsd/mcp-project-config.ts +128 -0
  126. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +668 -2
  127. package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +14 -4
  128. package/src/resources/extensions/gsd/tests/copy-planning-artifacts-samepath.test.ts +21 -0
  129. package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +380 -2
  130. package/src/resources/extensions/gsd/tests/forensics-context-persist.test.ts +30 -0
  131. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +2 -2
  132. package/src/resources/extensions/gsd/tests/integration/doctor-fixlevel.test.ts +52 -1
  133. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +2 -9
  134. package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +0 -33
  135. package/src/resources/extensions/gsd/tests/integration/merge-cwd-restore.test.ts +169 -0
  136. package/src/resources/extensions/gsd/tests/interrupted-session-auto.test.ts +146 -0
  137. package/src/resources/extensions/gsd/tests/interrupted-session-ui.test.ts +136 -0
  138. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +85 -0
  139. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +15 -0
  140. package/src/resources/extensions/gsd/tests/verification-operational-gate.test.ts +11 -0
  141. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +178 -17
  142. package/src/resources/extensions/gsd/workflow-mcp.ts +76 -23
  143. package/dist/web/standalone/.next/static/chunks/6502.b804e48b7919f55e.js +0 -9
  144. package/packages/pi-coding-agent/dist/modes/interactive/provider-auth-setup.d.ts +0 -13
  145. package/packages/pi-coding-agent/dist/modes/interactive/provider-auth-setup.d.ts.map +0 -1
  146. package/packages/pi-coding-agent/dist/modes/interactive/provider-auth-setup.js +0 -27
  147. package/packages/pi-coding-agent/dist/modes/interactive/provider-auth-setup.js.map +0 -1
  148. package/packages/pi-coding-agent/src/modes/interactive/provider-auth-setup.ts +0 -40
  149. package/src/resources/extensions/gsd/tests/init-bootstrap-completeness.test.ts +0 -121
  150. /package/dist/web/standalone/.next/static/{6_QPFhgX0DQnDhhquheRc → yh2vT27L1E6PChb_C1N_F}/_buildManifest.js +0 -0
  151. /package/dist/web/standalone/.next/static/{6_QPFhgX0DQnDhhquheRc → yh2vT27L1E6PChb_C1N_F}/_ssgManifest.js +0 -0
@@ -190,16 +190,12 @@ export async function showProjectInit(ctx, pi, basePath, detection) {
190
190
  // Initialize SQLite database so GSD starts in full-capability mode (#3880).
191
191
  // Without this, isDbAvailable() returns false and GSD enters degraded
192
192
  // markdown-only mode until a tool handler happens to call ensureDbOpen().
193
- let dbReady = false;
194
193
  try {
195
194
  const { ensureDbOpen } = await import("./bootstrap/dynamic-tools.js");
196
- dbReady = await ensureDbOpen(basePath);
195
+ await ensureDbOpen(basePath);
197
196
  }
198
197
  catch {
199
- // Swallowedwarning surfaced below
200
- }
201
- if (!dbReady) {
202
- ctx.ui.notify("Warning: database initialization failed — GSD will run in degraded mode until the next /gsd invocation.", "warning");
198
+ // Non-fatalDB creation failure should not block project init
203
199
  }
204
200
  // Ensure .gitignore
205
201
  ensureGitignore(basePath);
@@ -218,7 +214,6 @@ export async function showProjectInit(ctx, pi, basePath, detection) {
218
214
  // Write initial STATE.md so it exists before the first /gsd invocation.
219
215
  // The explicit /gsd init path (ops.ts) returns without entering showSmartEntry(),
220
216
  // which would otherwise generate STATE.md at guided-flow.ts:1358.
221
- let stateReady = false;
222
217
  try {
223
218
  const { deriveState } = await import("./state.js");
224
219
  const { buildStateMarkdown } = await import("./doctor.js");
@@ -226,13 +221,21 @@ export async function showProjectInit(ctx, pi, basePath, detection) {
226
221
  const { resolveGsdRootFile } = await import("./paths.js");
227
222
  const state = await deriveState(basePath);
228
223
  await saveFile(resolveGsdRootFile(basePath, "STATE"), buildStateMarkdown(state));
229
- stateReady = true;
230
224
  }
231
225
  catch {
232
- // Swallowedwarning surfaced below
233
- }
234
- if (!stateReady) {
235
- ctx.ui.notify("Warning: initial STATE.md generation failed — it will be created on the next /gsd invocation.", "warning");
226
+ // Non-fatalSTATE.md will be regenerated on next /gsd invocation
227
+ }
228
+ if (ctx.model?.provider === "claude-code") {
229
+ try {
230
+ const { ensureProjectWorkflowMcpConfig } = await import("./mcp-project-config.js");
231
+ const result = ensureProjectWorkflowMcpConfig(basePath);
232
+ if (result.status !== "unchanged") {
233
+ ctx.ui.notify(`Claude Code MCP prepared at ${result.configPath}`, "info");
234
+ }
235
+ }
236
+ catch (err) {
237
+ ctx.ui.notify(`Claude Code MCP prep failed: ${err instanceof Error ? err.message : String(err)}`, "warning");
238
+ }
236
239
  }
237
240
  ctx.ui.notify("GSD initialized. Starting your first milestone...", "info");
238
241
  return { completed: true, bootstrapped: true };
@@ -0,0 +1,146 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { verifyExpectedArtifact } from "./auto-recovery.js";
4
+ import { formatCrashInfo, isLockProcessAlive, readCrashLock, } from "./crash-recovery.js";
5
+ import { gsdRoot } from "./paths.js";
6
+ import { synthesizeCrashRecovery, } from "./session-forensics.js";
7
+ import { deriveState } from "./state.js";
8
+ export function readPausedSessionMetadata(basePath) {
9
+ const pausedPath = join(gsdRoot(basePath), "runtime", "paused-session.json");
10
+ if (!existsSync(pausedPath))
11
+ return null;
12
+ try {
13
+ return JSON.parse(readFileSync(pausedPath, "utf-8"));
14
+ }
15
+ catch {
16
+ return null;
17
+ }
18
+ }
19
+ export function isBootstrapCrashLock(lock) {
20
+ return !!(lock &&
21
+ lock.unitType === "starting" &&
22
+ lock.unitId === "bootstrap");
23
+ }
24
+ export function hasResumableDerivedState(state) {
25
+ return !!(state?.activeMilestone && state.phase !== "complete");
26
+ }
27
+ export async function assessInterruptedSession(basePath) {
28
+ const pausedSession = readPausedSessionMetadata(basePath);
29
+ const worktreeExists = pausedSession?.worktreePath
30
+ ? existsSync(pausedSession.worktreePath)
31
+ : false;
32
+ const assessmentBasePath = worktreeExists ? pausedSession.worktreePath : basePath;
33
+ const rawLock = readCrashLock(basePath);
34
+ const lock = rawLock && rawLock.pid !== process.pid ? rawLock : null;
35
+ if (!lock && !pausedSession) {
36
+ return {
37
+ classification: "none",
38
+ lock: null,
39
+ pausedSession: null,
40
+ state: null,
41
+ recovery: null,
42
+ recoveryPrompt: null,
43
+ recoveryToolCallCount: 0,
44
+ artifactSatisfied: false,
45
+ hasResumableDiskState: false,
46
+ isBootstrapCrash: false,
47
+ };
48
+ }
49
+ if (lock && isLockProcessAlive(lock)) {
50
+ return {
51
+ classification: "running",
52
+ lock,
53
+ pausedSession,
54
+ state: null,
55
+ recovery: null,
56
+ recoveryPrompt: null,
57
+ recoveryToolCallCount: 0,
58
+ artifactSatisfied: false,
59
+ hasResumableDiskState: false,
60
+ isBootstrapCrash: false,
61
+ };
62
+ }
63
+ const isBootstrapCrash = isBootstrapCrashLock(lock);
64
+ const state = await deriveState(assessmentBasePath);
65
+ const hasResumableDiskState = hasResumableDerivedState(state);
66
+ const artifactSatisfied = !!(lock &&
67
+ !isBootstrapCrash &&
68
+ verifyExpectedArtifact(lock.unitType, lock.unitId, assessmentBasePath));
69
+ let recovery = null;
70
+ if (lock && !isBootstrapCrash && !artifactSatisfied) {
71
+ recovery = synthesizeCrashRecovery(assessmentBasePath, lock.unitType, lock.unitId, lock.sessionFile, join(gsdRoot(assessmentBasePath), "activity"));
72
+ }
73
+ const recoveryToolCallCount = recovery?.trace.toolCallCount ?? 0;
74
+ const recoveryPrompt = recoveryToolCallCount > 0 ? recovery.prompt : null;
75
+ if (isBootstrapCrash) {
76
+ return {
77
+ classification: pausedSession ? "recoverable" : "stale",
78
+ lock,
79
+ pausedSession,
80
+ state,
81
+ recovery,
82
+ recoveryPrompt,
83
+ recoveryToolCallCount,
84
+ artifactSatisfied,
85
+ hasResumableDiskState,
86
+ isBootstrapCrash: true,
87
+ };
88
+ }
89
+ if (!hasResumableDiskState && pausedSession && !lock && recoveryToolCallCount === 0) {
90
+ return {
91
+ classification: "stale",
92
+ lock,
93
+ pausedSession,
94
+ state,
95
+ recovery,
96
+ recoveryPrompt,
97
+ recoveryToolCallCount,
98
+ artifactSatisfied,
99
+ hasResumableDiskState,
100
+ isBootstrapCrash: false,
101
+ };
102
+ }
103
+ if (lock && artifactSatisfied && !hasResumableDiskState && recoveryToolCallCount === 0) {
104
+ return {
105
+ classification: "stale",
106
+ lock,
107
+ pausedSession,
108
+ state,
109
+ recovery,
110
+ recoveryPrompt,
111
+ recoveryToolCallCount,
112
+ artifactSatisfied,
113
+ hasResumableDiskState,
114
+ isBootstrapCrash: false,
115
+ };
116
+ }
117
+ const hasStrongRecoverySignal = hasResumableDiskState || recoveryToolCallCount > 0;
118
+ return {
119
+ classification: hasStrongRecoverySignal ? "recoverable" : "stale",
120
+ lock,
121
+ pausedSession,
122
+ state,
123
+ recovery,
124
+ recoveryPrompt,
125
+ recoveryToolCallCount,
126
+ artifactSatisfied,
127
+ hasResumableDiskState,
128
+ isBootstrapCrash: false,
129
+ };
130
+ }
131
+ export function formatInterruptedSessionSummary(assessment) {
132
+ if (assessment.lock)
133
+ return [formatCrashInfo(assessment.lock)];
134
+ if (assessment.pausedSession?.milestoneId) {
135
+ return [
136
+ `Paused auto-mode session detected for ${assessment.pausedSession.milestoneId}.`,
137
+ ];
138
+ }
139
+ return ["Paused auto-mode session detected."];
140
+ }
141
+ export function formatInterruptedSessionRunningMessage(assessment) {
142
+ const pid = assessment.lock?.pid;
143
+ return pid
144
+ ? `Another auto-mode session (PID ${pid}) appears to be running.\nStop it with \`kill ${pid}\` before starting a new session.`
145
+ : "Another auto-mode session appears to be running.";
146
+ }
@@ -0,0 +1,83 @@
1
+ import { existsSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { resolve } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { assertSafeDirectory } from "./validate-directory.js";
5
+ import { detectWorkflowMcpLaunchConfig } from "./workflow-mcp.js";
6
+ export const GSD_WORKFLOW_MCP_SERVER_NAME = "gsd-workflow";
7
+ export function resolveBundledGsdCliPath(env = process.env) {
8
+ const explicit = env.GSD_CLI_PATH?.trim() || env.GSD_BIN_PATH?.trim();
9
+ if (explicit)
10
+ return explicit;
11
+ const candidates = [
12
+ resolve(fileURLToPath(new URL("../../../../scripts/dev-cli.js", import.meta.url))),
13
+ resolve(fileURLToPath(new URL("../../../../dist/loader.js", import.meta.url))),
14
+ resolve(fileURLToPath(new URL("../../../loader.js", import.meta.url))),
15
+ ];
16
+ for (const candidate of candidates) {
17
+ if (existsSync(candidate))
18
+ return candidate;
19
+ }
20
+ return null;
21
+ }
22
+ export function buildProjectWorkflowMcpServerConfig(projectRoot, env = process.env) {
23
+ const resolvedProjectRoot = resolve(projectRoot);
24
+ const gsdCliPath = resolveBundledGsdCliPath(env);
25
+ const launch = detectWorkflowMcpLaunchConfig(resolvedProjectRoot, {
26
+ ...env,
27
+ ...(gsdCliPath ? { GSD_CLI_PATH: gsdCliPath, GSD_BIN_PATH: gsdCliPath } : {}),
28
+ });
29
+ if (!launch) {
30
+ throw new Error("Unable to resolve the GSD workflow MCP server. Build this checkout or install gsd-mcp-server on PATH.");
31
+ }
32
+ return {
33
+ command: launch.command,
34
+ ...(launch.args && launch.args.length > 0 ? { args: launch.args } : {}),
35
+ ...(launch.cwd ? { cwd: launch.cwd } : {}),
36
+ ...(launch.env ? { env: launch.env } : {}),
37
+ };
38
+ }
39
+ function readExistingConfig(configPath) {
40
+ if (!existsSync(configPath))
41
+ return {};
42
+ const raw = readFileSync(configPath, "utf-8");
43
+ try {
44
+ const parsed = JSON.parse(raw);
45
+ return parsed && typeof parsed === "object" ? parsed : {};
46
+ }
47
+ catch (err) {
48
+ throw new Error(`Failed to parse ${configPath}: ${err instanceof Error ? err.message : String(err)}`);
49
+ }
50
+ }
51
+ export function ensureProjectWorkflowMcpConfig(projectRoot, env = process.env) {
52
+ const resolvedProjectRoot = resolve(projectRoot);
53
+ assertSafeDirectory(resolvedProjectRoot);
54
+ const configPath = resolve(resolvedProjectRoot, ".mcp.json");
55
+ const existing = readExistingConfig(configPath);
56
+ const desiredServer = buildProjectWorkflowMcpServerConfig(resolvedProjectRoot, env);
57
+ const previousServers = existing.mcpServers ?? {};
58
+ const nextServers = {
59
+ ...previousServers,
60
+ [GSD_WORKFLOW_MCP_SERVER_NAME]: desiredServer,
61
+ };
62
+ const alreadyPresent = existsSync(configPath);
63
+ const unchanged = JSON.stringify(previousServers[GSD_WORKFLOW_MCP_SERVER_NAME] ?? null)
64
+ === JSON.stringify(desiredServer)
65
+ && existing.mcpServers !== undefined;
66
+ if (unchanged) {
67
+ return {
68
+ configPath,
69
+ serverName: GSD_WORKFLOW_MCP_SERVER_NAME,
70
+ status: "unchanged",
71
+ };
72
+ }
73
+ const nextConfig = {
74
+ ...existing,
75
+ mcpServers: nextServers,
76
+ };
77
+ writeFileSync(configPath, `${JSON.stringify(nextConfig, null, 2)}\n`, "utf-8");
78
+ return {
79
+ configPath,
80
+ serverName: GSD_WORKFLOW_MCP_SERVER_NAME,
81
+ status: alreadyPresent ? "updated" : "created",
82
+ };
83
+ }
@@ -1,6 +1,6 @@
1
1
  import { execSync } from "node:child_process";
2
2
  import { existsSync } from "node:fs";
3
- import { resolve } from "node:path";
3
+ import { dirname, resolve } from "node:path";
4
4
  import { fileURLToPath } from "node:url";
5
5
  const MCP_WORKFLOW_TOOL_SURFACE = new Set([
6
6
  "gsd_complete_milestone",
@@ -48,9 +48,30 @@ function lookupCommand(command, platform = process.platform) {
48
48
  return null;
49
49
  }
50
50
  }
51
+ function findWorkflowCliFromAncestorPath(startPath) {
52
+ let current = resolve(startPath);
53
+ while (true) {
54
+ const candidate = resolve(current, "packages", "mcp-server", "dist", "cli.js");
55
+ if (existsSync(candidate))
56
+ return candidate;
57
+ const parent = dirname(current);
58
+ if (parent === current)
59
+ break;
60
+ current = parent;
61
+ }
62
+ return null;
63
+ }
51
64
  function getBundledWorkflowMcpCliPath(env) {
52
- if (!env.GSD_BIN_PATH?.trim() && !env.GSD_CLI_PATH?.trim())
53
- return null;
65
+ const envAnchors = [
66
+ env.GSD_BIN_PATH?.trim(),
67
+ env.GSD_CLI_PATH?.trim(),
68
+ env.GSD_WORKFLOW_PATH?.trim(),
69
+ ].filter((value) => typeof value === "string" && value.length > 0);
70
+ for (const anchor of envAnchors) {
71
+ const candidate = findWorkflowCliFromAncestorPath(anchor);
72
+ if (candidate)
73
+ return candidate;
74
+ }
54
75
  const candidates = [
55
76
  resolve(fileURLToPath(new URL("../../../../packages/mcp-server/dist/cli.js", import.meta.url))),
56
77
  resolve(fileURLToPath(new URL("../../../../../packages/mcp-server/dist/cli.js", import.meta.url))),
@@ -61,6 +82,42 @@ function getBundledWorkflowMcpCliPath(env) {
61
82
  }
62
83
  return null;
63
84
  }
85
+ function getBundledWorkflowExecutorModulePath() {
86
+ const candidates = [
87
+ resolve(fileURLToPath(new URL("../../../../dist/resources/extensions/gsd/tools/workflow-tool-executors.js", import.meta.url))),
88
+ resolve(fileURLToPath(new URL("./tools/workflow-tool-executors.js", import.meta.url))),
89
+ resolve(fileURLToPath(new URL("./tools/workflow-tool-executors.ts", import.meta.url))),
90
+ ];
91
+ for (const candidate of candidates) {
92
+ if (existsSync(candidate))
93
+ return candidate;
94
+ }
95
+ return null;
96
+ }
97
+ function getBundledWorkflowWriteGateModulePath() {
98
+ const candidates = [
99
+ resolve(fileURLToPath(new URL("../../../../dist/resources/extensions/gsd/bootstrap/write-gate.js", import.meta.url))),
100
+ resolve(fileURLToPath(new URL("./bootstrap/write-gate.js", import.meta.url))),
101
+ resolve(fileURLToPath(new URL("./bootstrap/write-gate.ts", import.meta.url))),
102
+ ];
103
+ for (const candidate of candidates) {
104
+ if (existsSync(candidate))
105
+ return candidate;
106
+ }
107
+ return null;
108
+ }
109
+ function buildWorkflowLaunchEnv(projectRoot, gsdCliPath, explicitEnv) {
110
+ const executorModulePath = getBundledWorkflowExecutorModulePath();
111
+ const writeGateModulePath = getBundledWorkflowWriteGateModulePath();
112
+ return {
113
+ ...(explicitEnv ?? {}),
114
+ ...(gsdCliPath ? { GSD_CLI_PATH: gsdCliPath } : {}),
115
+ ...(executorModulePath ? { GSD_WORKFLOW_EXECUTORS_MODULE: executorModulePath } : {}),
116
+ ...(writeGateModulePath ? { GSD_WORKFLOW_WRITE_GATE_MODULE: writeGateModulePath } : {}),
117
+ GSD_PERSIST_WRITE_GATE_STATE: "1",
118
+ GSD_WORKFLOW_PROJECT_ROOT: projectRoot,
119
+ };
120
+ }
64
121
  export function detectWorkflowMcpLaunchConfig(projectRoot = process.cwd(), env = process.env) {
65
122
  const name = env.GSD_WORKFLOW_MCP_NAME?.trim() || "gsd-workflow";
66
123
  const explicitCommand = env.GSD_WORKFLOW_MCP_COMMAND?.trim();
@@ -75,12 +132,7 @@ export function detectWorkflowMcpLaunchConfig(projectRoot = process.cwd(), env =
75
132
  projectRoot;
76
133
  const resolvedWorkflowProjectRoot = resolve(workflowProjectRoot);
77
134
  if (explicitCommand) {
78
- const launchEnv = {
79
- ...(explicitEnv ?? {}),
80
- ...(gsdCliPath ? { GSD_CLI_PATH: gsdCliPath } : {}),
81
- GSD_PERSIST_WRITE_GATE_STATE: "1",
82
- GSD_WORKFLOW_PROJECT_ROOT: resolve(workflowProjectRoot),
83
- };
135
+ const launchEnv = buildWorkflowLaunchEnv(resolve(workflowProjectRoot), gsdCliPath, explicitEnv);
84
136
  return {
85
137
  name,
86
138
  command: explicitCommand,
@@ -96,11 +148,7 @@ export function detectWorkflowMcpLaunchConfig(projectRoot = process.cwd(), env =
96
148
  command: process.execPath,
97
149
  args: [distCli],
98
150
  cwd: resolvedWorkflowProjectRoot,
99
- env: {
100
- ...(gsdCliPath ? { GSD_CLI_PATH: gsdCliPath } : {}),
101
- GSD_PERSIST_WRITE_GATE_STATE: "1",
102
- GSD_WORKFLOW_PROJECT_ROOT: resolvedWorkflowProjectRoot,
103
- },
151
+ env: buildWorkflowLaunchEnv(resolvedWorkflowProjectRoot, gsdCliPath),
104
152
  };
105
153
  }
106
154
  const bundledCli = getBundledWorkflowMcpCliPath(env);
@@ -110,11 +158,7 @@ export function detectWorkflowMcpLaunchConfig(projectRoot = process.cwd(), env =
110
158
  command: process.execPath,
111
159
  args: [bundledCli],
112
160
  cwd: resolvedWorkflowProjectRoot,
113
- env: {
114
- ...(gsdCliPath ? { GSD_CLI_PATH: gsdCliPath } : {}),
115
- GSD_PERSIST_WRITE_GATE_STATE: "1",
116
- GSD_WORKFLOW_PROJECT_ROOT: resolvedWorkflowProjectRoot,
117
- },
161
+ env: buildWorkflowLaunchEnv(resolvedWorkflowProjectRoot, gsdCliPath),
118
162
  };
119
163
  }
120
164
  const binPath = lookupCommand("gsd-mcp-server");
@@ -122,11 +166,7 @@ export function detectWorkflowMcpLaunchConfig(projectRoot = process.cwd(), env =
122
166
  return {
123
167
  name,
124
168
  command: binPath,
125
- env: {
126
- ...(gsdCliPath ? { GSD_CLI_PATH: gsdCliPath } : {}),
127
- GSD_PERSIST_WRITE_GATE_STATE: "1",
128
- GSD_WORKFLOW_PROJECT_ROOT: resolvedWorkflowProjectRoot,
129
- },
169
+ env: buildWorkflowLaunchEnv(resolvedWorkflowProjectRoot, gsdCliPath),
130
170
  };
131
171
  }
132
172
  return null;
@@ -1 +1 @@
1
- 6_QPFhgX0DQnDhhquheRc
1
+ yh2vT27L1E6PChb_C1N_F
@@ -1,47 +1,47 @@
1
1
  {
2
2
  "/_not-found/page": "/_not-found",
3
3
  "/_global-error/page": "/_global-error",
4
- "/api/bridge-terminal/resize/route": "/api/bridge-terminal/resize",
5
4
  "/api/boot/route": "/api/boot",
6
5
  "/api/bridge-terminal/input/route": "/api/bridge-terminal/input",
7
- "/api/bridge-terminal/stream/route": "/api/bridge-terminal/stream",
8
- "/api/dev-mode/route": "/api/dev-mode",
6
+ "/api/bridge-terminal/resize/route": "/api/bridge-terminal/resize",
9
7
  "/api/cleanup/route": "/api/cleanup",
10
- "/api/doctor/route": "/api/doctor",
11
8
  "/api/captures/route": "/api/captures",
9
+ "/api/dev-mode/route": "/api/dev-mode",
10
+ "/api/browse-directories/route": "/api/browse-directories",
11
+ "/api/doctor/route": "/api/doctor",
12
12
  "/api/export-data/route": "/api/export-data",
13
13
  "/api/forensics/route": "/api/forensics",
14
+ "/api/experimental/route": "/api/experimental",
14
15
  "/api/git/route": "/api/git",
15
16
  "/api/history/route": "/api/history",
16
17
  "/api/hooks/route": "/api/hooks",
17
- "/api/experimental/route": "/api/experimental",
18
18
  "/api/inspect/route": "/api/inspect",
19
+ "/api/bridge-terminal/stream/route": "/api/bridge-terminal/stream",
19
20
  "/api/knowledge/route": "/api/knowledge",
20
21
  "/api/live-state/route": "/api/live-state",
21
22
  "/api/notifications/route": "/api/notifications",
22
- "/api/browse-directories/route": "/api/browse-directories",
23
23
  "/api/preferences/route": "/api/preferences",
24
- "/api/recovery/route": "/api/recovery",
24
+ "/api/files/route": "/api/files",
25
25
  "/api/onboarding/route": "/api/onboarding",
26
- "/api/session/browser/route": "/api/session/browser",
26
+ "/api/recovery/route": "/api/recovery",
27
27
  "/api/projects/route": "/api/projects",
28
- "/api/files/route": "/api/files",
29
- "/api/session/command/route": "/api/session/command",
28
+ "/api/session/browser/route": "/api/session/browser",
29
+ "/api/session/events/route": "/api/session/events",
30
30
  "/api/settings-data/route": "/api/settings-data",
31
+ "/api/session/command/route": "/api/session/command",
31
32
  "/api/shutdown/route": "/api/shutdown",
32
33
  "/api/session/manage/route": "/api/session/manage",
33
34
  "/api/skill-health/route": "/api/skill-health",
34
- "/api/session/events/route": "/api/session/events",
35
35
  "/api/steer/route": "/api/steer",
36
- "/api/terminal/input/route": "/api/terminal/input",
37
36
  "/api/switch-root/route": "/api/switch-root",
38
- "/api/terminal/resize/route": "/api/terminal/resize",
39
- "/api/terminal/stream/route": "/api/terminal/stream",
37
+ "/api/terminal/input/route": "/api/terminal/input",
40
38
  "/api/terminal/sessions/route": "/api/terminal/sessions",
41
- "/api/undo/route": "/api/undo",
42
- "/api/terminal/upload/route": "/api/terminal/upload",
39
+ "/api/terminal/resize/route": "/api/terminal/resize",
43
40
  "/api/remote-questions/route": "/api/remote-questions",
41
+ "/api/terminal/upload/route": "/api/terminal/upload",
44
42
  "/api/visualizer/route": "/api/visualizer",
43
+ "/api/undo/route": "/api/undo",
45
44
  "/api/update/route": "/api/update",
45
+ "/api/terminal/stream/route": "/api/terminal/stream",
46
46
  "/page": "/"
47
47
  }
@@ -4,11 +4,11 @@
4
4
  ],
5
5
  "devFiles": [],
6
6
  "lowPriorityFiles": [
7
- "static/6_QPFhgX0DQnDhhquheRc/_buildManifest.js",
8
- "static/6_QPFhgX0DQnDhhquheRc/_ssgManifest.js"
7
+ "static/yh2vT27L1E6PChb_C1N_F/_buildManifest.js",
8
+ "static/yh2vT27L1E6PChb_C1N_F/_ssgManifest.js"
9
9
  ],
10
10
  "rootMainFiles": [
11
- "static/chunks/webpack-b49b09f97429b5d0.js",
11
+ "static/chunks/webpack-6e4d7e9a4f57bed4.js",
12
12
  "static/chunks/4bd1b696-e356ca5ba0218e27.js",
13
13
  "static/chunks/3794-42fdce068d44fa4f.js",
14
14
  "static/chunks/main-app-fdab67f7802d7832.js"
@@ -78,8 +78,8 @@
78
78
  "dynamicRoutes": {},
79
79
  "notFoundRoutes": [],
80
80
  "preview": {
81
- "previewModeId": "9c536f8266b01265b1ebee217e0efc1b",
82
- "previewModeSigningKey": "5b60db0abf8d057ddba2380fb60834195822203cb82af6183262d849ca0e1102",
83
- "previewModeEncryptionKey": "142968ff1bfe3a146c20f8b98e6f25b79ab34b623145f4b12223271b1625cdc6"
81
+ "previewModeId": "2d37a349be50ac937c61a539f8a27f2e",
82
+ "previewModeSigningKey": "7cbe27818262dc45964f3e579507b977175f4587a2991eb4af84d469ca44b520",
83
+ "previewModeEncryptionKey": "bf90146580294c958fc137e154442ee89e64e08c1bc2dc318f88db074f4eca45"
84
84
  }
85
85
  }
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "app/page.tsx -> @/components/gsd/app-shell": {
3
- "id": 46502,
3
+ "id": 62826,
4
4
  "files": [
5
5
  "static/css/659eccb5db697b76.css",
6
6
  "static/chunks/363642f4.cf8b455e0d94b478.js",
7
7
  "static/chunks/4986-c2fc8845ce785303.js",
8
8
  "static/chunks/2008.71ee9230ad78df21.js",
9
- "static/chunks/6502.b804e48b7919f55e.js"
9
+ "static/chunks/2826.821e01b07d92e948.js"
10
10
  ]
11
11
  },
12
12
  "components/gsd/chat-mode.tsx -> react-markdown": {
@@ -1 +1 @@
1
- globalThis.__RSC_MANIFEST=(globalThis.__RSC_MANIFEST||{});globalThis.__RSC_MANIFEST["/_global-error/page"]={"moduleLoading":{"prefix":"/_next/"},"ssrModuleMapping":{"21942":{"*":{"id":"18550","name":"*","chunks":[],"async":false}},"27123":{"*":{"id":"81921","name":"*","chunks":[],"async":false}},"57121":{"*":{"id":"35421","name":"*","chunks":[],"async":false}},"61304":{"*":{"id":"60440","name":"*","chunks":[],"async":false}},"61549":{"*":{"id":"99703","name":"*","chunks":[],"async":false}},"64777":{"*":{"id":"82265","name":"*","chunks":[],"async":false}},"66919":{"*":{"id":"65720","name":"*","chunks":[],"async":false}},"74581":{"*":{"id":"61335","name":"*","chunks":[],"async":false}},"78616":{"*":{"id":"84342","name":"*","chunks":[],"async":false}},"86869":{"*":{"id":"74661","name":"*","chunks":[],"async":false}},"90484":{"*":{"id":"70664","name":"*","chunks":[],"async":false}}},"edgeSSRModuleMapping":{},"clientModules":{"/__w/gsd-2/gsd-2/web/node_modules/next/dist/client/components/builtin/global-error.js":{"id":27123,"name":"*","chunks":[],"async":false},"/__w/gsd-2/gsd-2/web/node_modules/next/dist/esm/client/components/builtin/global-error.js":{"id":27123,"name":"*","chunks":[],"async":false},"/__w/gsd-2/gsd-2/web/node_modules/next/dist/client/components/client-page.js":{"id":61304,"name":"*","chunks":[],"async":false},"/__w/gsd-2/gsd-2/web/node_modules/next/dist/esm/client/components/client-page.js":{"id":61304,"name":"*","chunks":[],"async":false},"/__w/gsd-2/gsd-2/web/node_modules/next/dist/client/components/client-segment.js":{"id":78616,"name":"*","chunks":[],"async":false},"/__w/gsd-2/gsd-2/web/node_modules/next/dist/esm/client/components/client-segment.js":{"id":78616,"name":"*","chunks":[],"async":false},"/__w/gsd-2/gsd-2/web/node_modules/next/dist/client/components/http-access-fallback/error-boundary.js":{"id":64777,"name":"*","chunks":[],"async":false},"/__w/gsd-2/gsd-2/web/node_modules/next/dist/esm/client/components/http-access-fallback/error-boundary.js":{"id":64777,"name":"*","chunks":[],"async":false},"/__w/gsd-2/gsd-2/web/node_modules/next/dist/client/components/layout-router.js":{"id":57121,"name":"*","chunks":[],"async":false},"/__w/gsd-2/gsd-2/web/node_modules/next/dist/esm/client/components/layout-router.js":{"id":57121,"name":"*","chunks":[],"async":false},"/__w/gsd-2/gsd-2/web/node_modules/next/dist/client/components/render-from-template-context.js":{"id":74581,"name":"*","chunks":[],"async":false},"/__w/gsd-2/gsd-2/web/node_modules/next/dist/esm/client/components/render-from-template-context.js":{"id":74581,"name":"*","chunks":[],"async":false},"/__w/gsd-2/gsd-2/web/node_modules/next/dist/lib/framework/boundary-components.js":{"id":90484,"name":"*","chunks":[],"async":false},"/__w/gsd-2/gsd-2/web/node_modules/next/dist/esm/lib/framework/boundary-components.js":{"id":90484,"name":"*","chunks":[],"async":false},"/__w/gsd-2/gsd-2/web/node_modules/next/dist/lib/metadata/generate/icon-mark.js":{"id":86869,"name":"*","chunks":[],"async":false},"/__w/gsd-2/gsd-2/web/node_modules/next/dist/esm/lib/metadata/generate/icon-mark.js":{"id":86869,"name":"*","chunks":[],"async":false},"/__w/gsd-2/gsd-2/web/components/theme-provider.tsx":{"id":21942,"name":"*","chunks":["4986","static/chunks/4986-c2fc8845ce785303.js","7177","static/chunks/app/layout-a16c7a7ecdf0c2cf.js"],"async":false},"/__w/gsd-2/gsd-2/web/components/ui/sonner.tsx":{"id":61549,"name":"*","chunks":["4986","static/chunks/4986-c2fc8845ce785303.js","7177","static/chunks/app/layout-a16c7a7ecdf0c2cf.js"],"async":false},"/__w/gsd-2/gsd-2/web/node_modules/next/font/google/target.css?{\"path\":\"app/layout.tsx\",\"import\":\"Geist\",\"arguments\":[{\"subsets\":[\"latin\"],\"variable\":\"--font-geist-sans\"}],\"variableName\":\"geistSans\"}":{"id":85048,"name":"*","chunks":["4986","static/chunks/4986-c2fc8845ce785303.js","7177","static/chunks/app/layout-a16c7a7ecdf0c2cf.js"],"async":false},"/__w/gsd-2/gsd-2/web/node_modules/next/font/google/target.css?{\"path\":\"app/layout.tsx\",\"import\":\"Geist_Mono\",\"arguments\":[{\"subsets\":[\"latin\"],\"variable\":\"--font-geist-mono\"}],\"variableName\":\"geistMono\"}":{"id":35696,"name":"*","chunks":["4986","static/chunks/4986-c2fc8845ce785303.js","7177","static/chunks/app/layout-a16c7a7ecdf0c2cf.js"],"async":false},"/__w/gsd-2/gsd-2/web/app/globals.css":{"id":66872,"name":"*","chunks":["4986","static/chunks/4986-c2fc8845ce785303.js","7177","static/chunks/app/layout-a16c7a7ecdf0c2cf.js"],"async":false},"/__w/gsd-2/gsd-2/web/app/page.tsx":{"id":66919,"name":"*","chunks":["8974","static/chunks/app/page-0c485498795110d6.js"],"async":false}},"entryCSSFiles":{"/__w/gsd-2/gsd-2/web/":[],"/__w/gsd-2/gsd-2/web/app/layout":[{"inlined":false,"path":"static/css/de70bee13400563f.css"},{"inlined":false,"path":"static/css/f6e8833d46e738d8.css"}],"/__w/gsd-2/gsd-2/web/app/page":[],"/__w/gsd-2/gsd-2/web/app/_global-error/page":[]},"rscModuleMapping":{"21942":{"*":{"id":"9796","name":"*","chunks":[],"async":false}},"27123":{"*":{"id":"95547","name":"*","chunks":[],"async":false}},"57121":{"*":{"id":"98099","name":"*","chunks":[],"async":false}},"61304":{"*":{"id":"15098","name":"*","chunks":[],"async":false}},"61549":{"*":{"id":"85561","name":"*","chunks":[],"async":false}},"64777":{"*":{"id":"33859","name":"*","chunks":[],"async":false}},"66872":{"*":{"id":"82704","name":"*","chunks":[],"async":false}},"66919":{"*":{"id":"99647","name":"*","chunks":[],"async":false}},"74581":{"*":{"id":"16237","name":"*","chunks":[],"async":false}},"78616":{"*":{"id":"47644","name":"*","chunks":[],"async":false}},"86869":{"*":{"id":"36675","name":"*","chunks":[],"async":false}},"90484":{"*":{"id":"98562","name":"*","chunks":[],"async":false}}},"edgeRscModuleMapping":{}};
1
+ globalThis.__RSC_MANIFEST=(globalThis.__RSC_MANIFEST||{});globalThis.__RSC_MANIFEST["/_global-error/page"]={"moduleLoading":{"prefix":"/_next/"},"ssrModuleMapping":{"21942":{"*":{"id":"18550","name":"*","chunks":[],"async":false}},"27123":{"*":{"id":"81921","name":"*","chunks":[],"async":false}},"57121":{"*":{"id":"35421","name":"*","chunks":[],"async":false}},"61304":{"*":{"id":"60440","name":"*","chunks":[],"async":false}},"61549":{"*":{"id":"99703","name":"*","chunks":[],"async":false}},"64777":{"*":{"id":"82265","name":"*","chunks":[],"async":false}},"66919":{"*":{"id":"65720","name":"*","chunks":[],"async":false}},"74581":{"*":{"id":"61335","name":"*","chunks":[],"async":false}},"78616":{"*":{"id":"84342","name":"*","chunks":[],"async":false}},"86869":{"*":{"id":"74661","name":"*","chunks":[],"async":false}},"90484":{"*":{"id":"70664","name":"*","chunks":[],"async":false}}},"edgeSSRModuleMapping":{},"clientModules":{"/__w/gsd-2/gsd-2/web/node_modules/next/dist/client/components/builtin/global-error.js":{"id":27123,"name":"*","chunks":[],"async":false},"/__w/gsd-2/gsd-2/web/node_modules/next/dist/esm/client/components/builtin/global-error.js":{"id":27123,"name":"*","chunks":[],"async":false},"/__w/gsd-2/gsd-2/web/node_modules/next/dist/client/components/client-page.js":{"id":61304,"name":"*","chunks":[],"async":false},"/__w/gsd-2/gsd-2/web/node_modules/next/dist/esm/client/components/client-page.js":{"id":61304,"name":"*","chunks":[],"async":false},"/__w/gsd-2/gsd-2/web/node_modules/next/dist/client/components/client-segment.js":{"id":78616,"name":"*","chunks":[],"async":false},"/__w/gsd-2/gsd-2/web/node_modules/next/dist/esm/client/components/client-segment.js":{"id":78616,"name":"*","chunks":[],"async":false},"/__w/gsd-2/gsd-2/web/node_modules/next/dist/client/components/http-access-fallback/error-boundary.js":{"id":64777,"name":"*","chunks":[],"async":false},"/__w/gsd-2/gsd-2/web/node_modules/next/dist/esm/client/components/http-access-fallback/error-boundary.js":{"id":64777,"name":"*","chunks":[],"async":false},"/__w/gsd-2/gsd-2/web/node_modules/next/dist/client/components/layout-router.js":{"id":57121,"name":"*","chunks":[],"async":false},"/__w/gsd-2/gsd-2/web/node_modules/next/dist/esm/client/components/layout-router.js":{"id":57121,"name":"*","chunks":[],"async":false},"/__w/gsd-2/gsd-2/web/node_modules/next/dist/client/components/render-from-template-context.js":{"id":74581,"name":"*","chunks":[],"async":false},"/__w/gsd-2/gsd-2/web/node_modules/next/dist/esm/client/components/render-from-template-context.js":{"id":74581,"name":"*","chunks":[],"async":false},"/__w/gsd-2/gsd-2/web/node_modules/next/dist/lib/framework/boundary-components.js":{"id":90484,"name":"*","chunks":[],"async":false},"/__w/gsd-2/gsd-2/web/node_modules/next/dist/esm/lib/framework/boundary-components.js":{"id":90484,"name":"*","chunks":[],"async":false},"/__w/gsd-2/gsd-2/web/node_modules/next/dist/lib/metadata/generate/icon-mark.js":{"id":86869,"name":"*","chunks":[],"async":false},"/__w/gsd-2/gsd-2/web/node_modules/next/dist/esm/lib/metadata/generate/icon-mark.js":{"id":86869,"name":"*","chunks":[],"async":false},"/__w/gsd-2/gsd-2/web/components/theme-provider.tsx":{"id":21942,"name":"*","chunks":["4986","static/chunks/4986-c2fc8845ce785303.js","7177","static/chunks/app/layout-a16c7a7ecdf0c2cf.js"],"async":false},"/__w/gsd-2/gsd-2/web/components/ui/sonner.tsx":{"id":61549,"name":"*","chunks":["4986","static/chunks/4986-c2fc8845ce785303.js","7177","static/chunks/app/layout-a16c7a7ecdf0c2cf.js"],"async":false},"/__w/gsd-2/gsd-2/web/node_modules/next/font/google/target.css?{\"path\":\"app/layout.tsx\",\"import\":\"Geist\",\"arguments\":[{\"subsets\":[\"latin\"],\"variable\":\"--font-geist-sans\"}],\"variableName\":\"geistSans\"}":{"id":85048,"name":"*","chunks":["4986","static/chunks/4986-c2fc8845ce785303.js","7177","static/chunks/app/layout-a16c7a7ecdf0c2cf.js"],"async":false},"/__w/gsd-2/gsd-2/web/node_modules/next/font/google/target.css?{\"path\":\"app/layout.tsx\",\"import\":\"Geist_Mono\",\"arguments\":[{\"subsets\":[\"latin\"],\"variable\":\"--font-geist-mono\"}],\"variableName\":\"geistMono\"}":{"id":35696,"name":"*","chunks":["4986","static/chunks/4986-c2fc8845ce785303.js","7177","static/chunks/app/layout-a16c7a7ecdf0c2cf.js"],"async":false},"/__w/gsd-2/gsd-2/web/app/globals.css":{"id":66872,"name":"*","chunks":["4986","static/chunks/4986-c2fc8845ce785303.js","7177","static/chunks/app/layout-a16c7a7ecdf0c2cf.js"],"async":false},"/__w/gsd-2/gsd-2/web/app/page.tsx":{"id":66919,"name":"*","chunks":["8974","static/chunks/app/page-f1e30ab6bb269149.js"],"async":false}},"entryCSSFiles":{"/__w/gsd-2/gsd-2/web/":[],"/__w/gsd-2/gsd-2/web/app/layout":[{"inlined":false,"path":"static/css/de70bee13400563f.css"},{"inlined":false,"path":"static/css/f6e8833d46e738d8.css"}],"/__w/gsd-2/gsd-2/web/app/page":[],"/__w/gsd-2/gsd-2/web/app/_global-error/page":[]},"rscModuleMapping":{"21942":{"*":{"id":"9796","name":"*","chunks":[],"async":false}},"27123":{"*":{"id":"95547","name":"*","chunks":[],"async":false}},"57121":{"*":{"id":"98099","name":"*","chunks":[],"async":false}},"61304":{"*":{"id":"15098","name":"*","chunks":[],"async":false}},"61549":{"*":{"id":"85561","name":"*","chunks":[],"async":false}},"64777":{"*":{"id":"33859","name":"*","chunks":[],"async":false}},"66872":{"*":{"id":"82704","name":"*","chunks":[],"async":false}},"66919":{"*":{"id":"99647","name":"*","chunks":[],"async":false}},"74581":{"*":{"id":"16237","name":"*","chunks":[],"async":false}},"78616":{"*":{"id":"47644","name":"*","chunks":[],"async":false}},"86869":{"*":{"id":"36675","name":"*","chunks":[],"async":false}},"90484":{"*":{"id":"98562","name":"*","chunks":[],"async":false}}},"edgeRscModuleMapping":{}};
@@ -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-b49b09f97429b5d0.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-b49b09f97429b5d0.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\":\"6_QPFhgX0DQnDhhquheRc\"}\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-6e4d7e9a4f57bed4.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-6e4d7e9a4f57bed4.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\":\"yh2vT27L1E6PChb_C1N_F\"}\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>