gsd-pi 2.46.1-dev.79664f2 → 2.46.1-dev.eee1457

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 (63) hide show
  1. package/README.md +46 -29
  2. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +31 -15
  3. package/dist/resources/extensions/gsd/auto-start.js +9 -8
  4. package/dist/resources/extensions/gsd/repo-identity.js +5 -2
  5. package/dist/resources/extensions/gsd/state.js +29 -2
  6. package/dist/web/standalone/.next/BUILD_ID +1 -1
  7. package/dist/web/standalone/.next/app-path-routes-manifest.json +16 -16
  8. package/dist/web/standalone/.next/build-manifest.json +2 -2
  9. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  10. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  11. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  12. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  13. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  14. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  15. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  16. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  17. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  18. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  19. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  20. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  21. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  22. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  23. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  24. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  25. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  26. package/dist/web/standalone/.next/server/app/index.html +1 -1
  27. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  28. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  29. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  30. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  31. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  32. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  33. package/dist/web/standalone/.next/server/app-paths-manifest.json +16 -16
  34. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  35. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  36. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  37. package/package.json +2 -1
  38. package/packages/pi-agent-core/dist/agent-loop.js +26 -1
  39. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  40. package/packages/pi-agent-core/dist/agent.d.ts +7 -0
  41. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  42. package/packages/pi-agent-core/dist/agent.js +2 -0
  43. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  44. package/packages/pi-agent-core/dist/types.d.ts +9 -0
  45. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  46. package/packages/pi-agent-core/dist/types.js.map +1 -1
  47. package/packages/pi-agent-core/src/agent-loop.ts +25 -1
  48. package/packages/pi-agent-core/src/agent.ts +10 -0
  49. package/packages/pi-agent-core/src/types.ts +10 -0
  50. package/packages/pi-coding-agent/dist/core/auth-storage.test.js +27 -2
  51. package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
  52. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  53. package/packages/pi-coding-agent/dist/core/sdk.js +1 -0
  54. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  55. package/packages/pi-coding-agent/src/core/auth-storage.test.ts +27 -2
  56. package/packages/pi-coding-agent/src/core/sdk.ts +1 -0
  57. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +31 -16
  58. package/src/resources/extensions/gsd/auto-start.ts +8 -7
  59. package/src/resources/extensions/gsd/repo-identity.ts +5 -2
  60. package/src/resources/extensions/gsd/state.ts +33 -1
  61. package/src/resources/extensions/gsd/tests/inherited-repo-home-dir.test.ts +70 -0
  62. /package/dist/web/standalone/.next/static/{vP6aj-TThZymVNx5Pi2AN → MN4KAhNleSmucaEc-vzTu}/_buildManifest.js +0 -0
  63. /package/dist/web/standalone/.next/static/{vP6aj-TThZymVNx5Pi2AN → MN4KAhNleSmucaEc-vzTu}/_ssgManifest.js +0 -0
package/README.md CHANGED
@@ -25,40 +25,55 @@ One command. Walk away. Come back to a built project with clean git history.
25
25
 
26
26
  ---
27
27
 
28
- ## What's New in v2.44.0
28
+ ## What's New in v2.46.0
29
29
 
30
- ### New Features
30
+ ### Single-Writer State Engine
31
31
 
32
- - **Non-API-key provider extensions** support for provider extensions like Claude Code CLI that don't require traditional API keys. (#2382)
33
- - **Docker sandbox template** — official Docker template for running GSD auto mode in an isolated container. (#2360)
34
- - **Per-prompt token cost display** — opt-in `show_token_cost` preference shows per-prompt and cumulative session cost in the footer. (#2357)
35
- - **"Change project root" in web UI** — switch project directories from the web interface without restarting. (#2355)
36
- - **DB-backed planning tools** — write-side state transitions now use atomic SQLite tool calls instead of markdown mutation, improving reliability and enabling structured queries. (#2141)
32
+ The biggest architectural change since DB-backed planning tools. The single-writer engine enforces disciplined state transitions through three iterations:
37
33
 
38
- ### Key Fixes
34
+ - **v2 — discipline layer** — adds a write-side discipline layer on top of the DB architecture, ensuring all state mutations flow through controlled tool calls.
35
+ - **v3 — state machine guards, actor identity, reversibility** — introduces formal state machine guards, tracks which actor (human vs agent) initiated each transition, and makes transitions reversible.
36
+ - **Hardened** — closes TOCTOU race conditions, intercepts bypass attempts, and resolves status inconsistencies.
37
+
38
+ All prompts are now aligned with the single-writer tool API, and a new **workflow-logger** is wired into the engine, tool, manifest, and reconcile paths for full observability. (#2494)
39
39
 
40
- - **Post-migration cleanup** pragmas, rollbacks, tool gaps, and stale code cleaned up after DB migration. (#2410)
41
- - **Planning data loss prevention** — destructive upsert and post-unit re-import no longer overwrite planning data. (#2370)
42
- - **Memory and resource leaks** — fixes across TUI, LSP, DB, and automation subsystems. (#2314)
43
- - **DECISIONS.md preservation** — freeform content in DECISIONS.md is no longer overwritten on decision save. (#2319)
44
- - **Auto-stash before squash merge** — dirty files are automatically stashed before merge, with filenames surfaced in errors. (#2298)
45
- - **Extension TypeScript detection** — `.js` extension files containing TypeScript syntax are detected with a suggestion to rename. (#2386)
40
+ ### v2.45.0New Commands and Capabilities
46
41
 
47
- ### v2.43.0 Highlights
42
+ - **`/gsd rethink`** — conversational project reorganization. Rethink your milestone structure, slice decomposition, or overall approach through guided discussion. (#2459)
43
+ - **`/gsd mcp`** — MCP server status and connectivity. Check which MCP servers are configured, connected, and healthy. (#2362)
44
+ - **Complete offline mode** — GSD now works fully offline with local models. (#2429)
45
+ - **Global KNOWLEDGE.md injection** — `~/.gsd/agent/KNOWLEDGE.md` is injected into the system prompt, so cross-project knowledge persists globally. (#2331)
46
+ - **Mobile-responsive web UI** — the browser interface now works on phones and tablets. (#2354)
47
+ - **DB tool previews** — `renderCall`/`renderResult` previews on DB tools show what each tool call does before and after execution. (#2273)
48
+ - **Message timestamps** — user and assistant messages now include timestamps. (#2368)
48
49
 
49
- - **Forensics dedup** — opt-in duplicate detection before issue creation. (#2105)
50
- - **Fast service tier outside auto-mode** — `/gsd fast` now applies in interactive sessions too. (#2126)
51
- - **Startup optimizations** — pre-compiled extensions, compile cache, and batch discovery for faster boot. (#2125)
52
- - **Stale process cleanup** — web server kills stale process before launch to prevent EADDRINUSE. (#2034)
50
+ ### Key Changes
53
51
 
54
- ### v2.42.0 Highlights
52
+ - **Default isolation mode changed to `none`** — `git.isolation` now defaults to `none` instead of `worktree`. Projects that rely on worktree isolation should set `git.isolation: worktree` explicitly in preferences. (#2481)
53
+ - **Startup checks** — GSD now validates Node.js version and git availability at startup, with clear error messages. (#2463)
54
+ - **Worktree lifecycle journaling** — worktree create, switch, merge, and remove events are recorded in the event journal. (#2486)
55
+ - **Milestone verification gate** — milestone completion is blocked when verification fails, preventing premature closure. (#2500)
56
+
57
+ ### Key Fixes
55
58
 
56
- - **Declarative workflow engine** — define YAML workflows that execute through auto-loop, enabling repeatable multi-step automations without code. (#2024)
57
- - **Unified rule registry & event journal** — centralized rule registry, event journal with query tool, and standardized tool naming convention. (#1928)
58
- - **PR risk checker** — CI classifies changed files by system area and surfaces risk level on pull requests. (#1930)
59
- - **`/gsd fast`** toggle service tier for supported models, enabling prioritized API routing for faster responses. (#1862)
60
- - **Web mode CLI flags** — `--host`, `--port`, and `--allowed-origins` flags give full control over the web server bind address and CORS policy. (#1873)
61
- - **ADR attribution** — architecture decision records now distinguish human, agent, and collaborative authorship. (#1830)
59
+ - **Auto-mode stability** — recovery attempts reset on unit re-dispatch (#2424), survivor branch recovery handles `phase=complete` (#2427), and auto mode stops on real merge conflicts (#2428).
60
+ - **Supervision timeouts** — now respect task `est:` annotations, so complex tasks get proportionally longer timeouts. (#2434)
61
+ - **`auto_pr: true` fixed** — three interacting bugs prevented auto-PR creation; all three are resolved. (#2433)
62
+ - **Rich task plan preservation** plans survive DB roundtrip without losing structured content. (#2453)
63
+ - **Artifact truncation prevention** — `saveArtifactToDb` no longer overwrites larger files with truncated content. (#2447)
64
+ - **Worktree teardown** — submodule state is detected and preserved during teardown (#2425), and worktree merge back to main works after `stopAuto` on milestone completion (#2430).
65
+ - **Windows portability** — `retentionDays=0` handling and CRLF fixes on Windows. (#2460)
66
+ - **Voice on Linux** — misleading portaudio error on PEP 668 systems replaced with actionable guidance. (#2407)
67
+
68
+ ### Previous highlights (v2.42–v2.44)
69
+
70
+ - **Non-API-key provider extensions** — support for Claude Code CLI and similar providers. (#2382)
71
+ - **Docker sandbox template** — official Docker template for isolated auto mode. (#2360)
72
+ - **DB-backed planning tools** — write-side state transitions use atomic SQLite tool calls. (#2141)
73
+ - **Declarative workflow engine** — YAML workflows through auto-loop. (#2024)
74
+ - **`/gsd fast`** — toggle service tier for prioritized API routing. (#1862)
75
+ - **Forensics dedup** — duplicate detection before issue creation. (#2105)
76
+ - **Startup optimizations** — pre-compiled extensions, compile cache, batch discovery. (#2125)
62
77
 
63
78
  ---
64
79
 
@@ -138,7 +153,7 @@ See the full [Changelog](./CHANGELOG.md) for all 70+ fixes in this release.
138
153
 
139
154
  ## Documentation
140
155
 
141
- Full documentation is available in the [`docs/`](./docs/) directory:
156
+ Full documentation is available at **[gsd.build](https://gsd.build)** (powered by Mintlify) and in the [`docs/`](./docs/) directory:
142
157
 
143
158
  - **[Getting Started](./docs/getting-started.md)** — install, first run, basic usage
144
159
  - **[Auto Mode](./docs/auto-mode.md)** — autonomous execution deep-dive
@@ -260,7 +275,7 @@ Auto mode is a state machine driven by files on disk. It reads `.gsd/STATE.md`,
260
275
 
261
276
  2. **Context pre-loading** — The dispatch prompt includes inlined task plans, slice plans, prior task summaries, dependency summaries, roadmap excerpts, and decisions register. The LLM starts with everything it needs instead of spending tool calls reading files.
262
277
 
263
- 3. **Git worktree isolation** — Each milestone runs in its own git worktree with a `milestone/<MID>` branch. All slice work commits sequentially — no branch switching, no merge conflicts. When the milestone completes, it's squash-merged to main as one clean commit.
278
+ 3. **Git isolation** — When `git.isolation` is set to `worktree` or `branch`, each milestone runs on its own `milestone/<MID>` branch (in a worktree or in-place). All slice work commits sequentially — no branch switching, no merge conflicts. When the milestone completes, it's squash-merged to main as one clean commit. The default is `none` (work on the current branch), configurable via preferences.
264
279
 
265
280
  4. **Crash recovery** — A lock file tracks the current unit. If the session dies, the next `/gsd auto` reads the surviving session file, synthesizes a recovery briefing from every tool call that made it to disk, and resumes with full context. Parallel orchestrator state is persisted to disk with PID liveness detection, so multi-worker sessions survive crashes too. In headless mode, crashes trigger automatic restart with exponential backoff (default 3 attempts).
266
281
 
@@ -396,6 +411,8 @@ On first run, GSD launches a branded setup wizard that walks you through LLM pro
396
411
  | `/gsd stop` | Stop auto mode gracefully |
397
412
  | `/gsd steer` | Hard-steer plan documents during execution |
398
413
  | `/gsd discuss` | Discuss architecture and decisions (works alongside auto mode) |
414
+ | `/gsd rethink` | Conversational project reorganization |
415
+ | `/gsd mcp` | MCP server status and connectivity |
399
416
  | `/gsd status` | Progress dashboard |
400
417
  | `/gsd queue` | Queue future milestones (safe during auto mode) |
401
418
  | `/gsd prefs` | Model selection, timeouts, budget ceiling |
@@ -543,7 +560,7 @@ auto_report: true
543
560
  | `skill_rules` | Situational rules for skill routing |
544
561
  | `skill_staleness_days` | Skills unused for N days get deprioritized (default: 60, 0 = disabled) |
545
562
  | `unique_milestone_ids` | Uses unique milestone names to avoid clashes when working in teams of people |
546
- | `git.isolation` | `worktree` (default), `branch`, or `none` — disable worktree isolation for projects that don't need it |
563
+ | `git.isolation` | `none` (default), `worktree`, or `branch` — enable worktree or branch isolation for milestone work |
547
564
  | `git.manage_gitignore` | Set `false` to prevent GSD from modifying `.gitignore` |
548
565
  | `verification_commands`| Array of shell commands to run after task execution (e.g., `["npm run lint", "npm run test"]`) |
549
566
  | `verification_auto_fix`| Auto-retry on verification failures (default: true) |
@@ -109,6 +109,8 @@ async function pumpSdkMessages(model, context, options, stream) {
109
109
  /** Track the last text content seen across all assistant turns for the final message. */
110
110
  let lastTextContent = "";
111
111
  let lastThinkingContent = "";
112
+ /** Collect tool calls from intermediate SDK turns for tool_execution events. */
113
+ const intermediateToolCalls = [];
112
114
  try {
113
115
  // Dynamic import — the SDK is an optional dependency.
114
116
  const sdkModule = "@anthropic-ai/claude-agent-sdk";
@@ -171,7 +173,14 @@ async function pumpSdkMessages(model, context, options, stream) {
171
173
  break;
172
174
  const assistantEvent = builder.handleEvent(event);
173
175
  if (assistantEvent) {
174
- stream.push(assistantEvent);
176
+ // Skip toolcall events — the agent loop's externalToolExecution
177
+ // path emits tool_execution_start/end events after streamSimple
178
+ // returns. Streaming toolcall events would render tool calls
179
+ // out of order in the TUI's accumulated message content.
180
+ const t = assistantEvent.type;
181
+ if (t !== "toolcall_start" && t !== "toolcall_delta" && t !== "toolcall_end") {
182
+ stream.push(assistantEvent);
183
+ }
175
184
  }
176
185
  break;
177
186
  }
@@ -196,7 +205,7 @@ async function pumpSdkMessages(model, context, options, stream) {
196
205
  const userMsg = msg;
197
206
  if (userMsg.parent_tool_use_id !== null)
198
207
  break;
199
- // Capture accumulated text from the builder before resetting
208
+ // Capture content from the completed turn before resetting
200
209
  if (builder) {
201
210
  for (const block of builder.message.content) {
202
211
  if (block.type === "text" && block.text) {
@@ -205,6 +214,10 @@ async function pumpSdkMessages(model, context, options, stream) {
205
214
  else if (block.type === "thinking" && block.thinking) {
206
215
  lastThinkingContent = block.thinking;
207
216
  }
217
+ else if (block.type === "toolCall") {
218
+ // Collect tool calls for externalToolExecution rendering
219
+ intermediateToolCalls.push(block);
220
+ }
208
221
  }
209
222
  }
210
223
  builder = null;
@@ -213,24 +226,27 @@ async function pumpSdkMessages(model, context, options, stream) {
213
226
  // -- Result (terminal) --
214
227
  case "result": {
215
228
  const result = msg;
216
- // Build final message with text/thinking only (strip tool calls)
229
+ // Build final message. Include intermediate tool calls so the
230
+ // agent loop's externalToolExecution path emits tool_execution
231
+ // events for proper TUI rendering, followed by the text response.
217
232
  const finalContent = [];
218
- // Use builder's accumulated content if available, falling back to captured text
219
- if (builder) {
233
+ // Add tool calls from intermediate turns first (renders above text)
234
+ finalContent.push(...intermediateToolCalls);
235
+ // Add text/thinking from the last turn
236
+ if (builder && builder.message.content.length > 0) {
220
237
  for (const block of builder.message.content) {
221
- if (block.type === "text" && block.text) {
222
- lastTextContent = block.text;
223
- }
224
- else if (block.type === "thinking" && block.thinking) {
225
- lastThinkingContent = block.thinking;
238
+ if (block.type === "text" || block.type === "thinking") {
239
+ finalContent.push(block);
226
240
  }
227
241
  }
228
242
  }
229
- if (lastThinkingContent) {
230
- finalContent.push({ type: "thinking", thinking: lastThinkingContent });
231
- }
232
- if (lastTextContent) {
233
- finalContent.push({ type: "text", text: lastTextContent });
243
+ else {
244
+ if (lastThinkingContent) {
245
+ finalContent.push({ type: "thinking", thinking: lastThinkingContent });
246
+ }
247
+ if (lastTextContent) {
248
+ finalContent.push({ type: "text", text: lastTextContent });
249
+ }
234
250
  }
235
251
  // Fallback: use the SDK's result text if we have no content
236
252
  if (finalContent.length === 0 && result.subtype === "success" && result.result) {
@@ -20,7 +20,7 @@ import { synthesizeCrashRecovery } from "./session-forensics.js";
20
20
  import { writeLock, clearLock, readCrashLock, formatCrashInfo, isLockProcessAlive, } from "./crash-recovery.js";
21
21
  import { acquireSessionLock, releaseSessionLock, updateSessionLock, } from "./session-lock.js";
22
22
  import { ensureGitignore, untrackRuntimeFiles } from "./gitignore.js";
23
- import { nativeIsRepo, nativeInit, nativeAddAll, nativeCommit, } from "./native-git-bridge.js";
23
+ import { nativeInit, nativeAddAll, nativeCommit, } from "./native-git-bridge.js";
24
24
  import { GitServiceImpl } from "./git-service.js";
25
25
  import { captureIntegrationBranch, detectWorktreeName, setActiveMilestoneId, } from "./worktree.js";
26
26
  import { getAutoWorktreePath } from "./auto-worktree.js";
@@ -69,13 +69,14 @@ export async function bootstrapAutoSession(s, ctx, pi, base, verboseMode, reques
69
69
  ctx.ui.notify(`GSD_PROJECT_ID must contain only alphanumeric characters, hyphens, and underscores. Got: "${customProjectId}"`, "error");
70
70
  return releaseLockAndReturn();
71
71
  }
72
- // Ensure git repo exists.
73
- // Guard against inherited repos: if `base` is a subdirectory of another
74
- // git repo that has no .gsd (i.e. the parent project was never initialised
75
- // with GSD), create a fresh git repo at `base` so it gets its own identity
76
- // hash. Without this, repoIdentity() resolves to the parent repo's hash
77
- // and loads milestones from an unrelated project (#1639).
78
- if (!nativeIsRepo(base) || isInheritedRepo(base)) {
72
+ // Ensure git repo exists *locally* at base.
73
+ // nativeIsRepo() uses `git rev-parse` which traverses up to parent dirs,
74
+ // so a parent repo can make it return true even when base has no .git of
75
+ // its own. Check for a local .git instead (defense-in-depth for the case
76
+ // where isInheritedRepo() returns a false negative, e.g. stale .gsd at
77
+ // the parent git root). See #2393 and related issue.
78
+ const hasLocalGit = existsSync(join(base, ".git"));
79
+ if (!hasLocalGit || isInheritedRepo(base)) {
79
80
  const mainBranch = loadEffectiveGSDPreferences()?.preferences?.git?.main_branch || "main";
80
81
  nativeInit(base, mainBranch);
81
82
  }
@@ -112,8 +112,11 @@ export function isInheritedRepo(basePath) {
112
112
  // (i.e. the parent project was initialised with GSD).
113
113
  if (isProjectGsd(join(root, ".gsd")))
114
114
  return false;
115
- // Also walk up from basePath to the git root checking for .gsd
116
- let dir = normalizedBase;
115
+ // Walk up from basePath's parent to the git root checking for .gsd.
116
+ // Start at dirname(normalizedBase), NOT normalizedBase itself — finding
117
+ // .gsd at basePath means GSD state is set up for THIS project, which
118
+ // says nothing about whether the git repo is inherited from an ancestor.
119
+ let dir = dirname(normalizedBase);
117
120
  while (dir !== normalizedRoot && dir !== dirname(dir)) {
118
121
  if (isProjectGsd(join(dir, ".gsd")))
119
122
  return false;
@@ -9,7 +9,7 @@ import { nativeBatchParseGsdFiles } from './native-parser-bridge.js';
9
9
  import { join, resolve } from 'path';
10
10
  import { existsSync, readdirSync } from 'node:fs';
11
11
  import { debugCount, debugTime } from './debug-logger.js';
12
- import { isDbAvailable, getAllMilestones, getMilestoneSlices, getSliceTasks, getReplanHistory, getSlice, insertMilestone, } from './gsd-db.js';
12
+ import { isDbAvailable, getAllMilestones, getMilestoneSlices, getSliceTasks, getReplanHistory, getSlice, insertMilestone, updateTaskStatus, } from './gsd-db.js';
13
13
  /**
14
14
  * A "ghost" milestone directory contains only META.json (and no substantive
15
15
  * files like CONTEXT, CONTEXT-DRAFT, ROADMAP, or SUMMARY). These appear when
@@ -524,7 +524,34 @@ export async function deriveStateFromDb(basePath) {
524
524
  };
525
525
  }
526
526
  // ── Get tasks from DB ────────────────────────────────────────────────
527
- const tasks = getSliceTasks(activeMilestone.id, activeSlice.id);
527
+ let tasks = getSliceTasks(activeMilestone.id, activeSlice.id);
528
+ // ── Reconcile stale task status (#2514) ──────────────────────────────
529
+ // When a session disconnects after the agent writes SUMMARY + VERIFY
530
+ // artifacts but before postUnitPostVerification updates the DB, tasks
531
+ // remain "pending" in the DB despite being complete on disk. Without
532
+ // reconciliation, deriveState keeps returning the stale task as active,
533
+ // causing the dispatcher to re-dispatch the same completed task forever.
534
+ let reconciled = false;
535
+ for (const t of tasks) {
536
+ if (isStatusDone(t.status))
537
+ continue;
538
+ const summaryPath = resolveTaskFile(basePath, activeMilestone.id, activeSlice.id, t.id, "SUMMARY");
539
+ if (summaryPath && existsSync(summaryPath)) {
540
+ try {
541
+ updateTaskStatus(activeMilestone.id, activeSlice.id, t.id, "complete");
542
+ process.stderr.write(`gsd-reconcile: task ${activeMilestone.id}/${activeSlice.id}/${t.id} had SUMMARY on disk but DB status was "${t.status}" — updated to "complete" (#2514)\n`);
543
+ reconciled = true;
544
+ }
545
+ catch (e) {
546
+ // DB write failed — continue with stale status rather than crash
547
+ process.stderr.write(`gsd-reconcile: failed to update task ${t.id}: ${e.message}\n`);
548
+ }
549
+ }
550
+ }
551
+ // Re-fetch tasks if any were reconciled so downstream logic sees fresh status
552
+ if (reconciled) {
553
+ tasks = getSliceTasks(activeMilestone.id, activeSlice.id);
554
+ }
528
555
  const taskProgress = {
529
556
  done: tasks.filter(t => isStatusDone(t.status)).length,
530
557
  total: tasks.length,
@@ -1 +1 @@
1
- vP6aj-TThZymVNx5Pi2AN
1
+ MN4KAhNleSmucaEc-vzTu
@@ -1,45 +1,45 @@
1
1
  {
2
- "/_not-found/page": "/_not-found",
3
2
  "/_global-error/page": "/_global-error",
3
+ "/_not-found/page": "/_not-found",
4
4
  "/api/boot/route": "/api/boot",
5
- "/api/bridge-terminal/resize/route": "/api/bridge-terminal/resize",
6
5
  "/api/bridge-terminal/input/route": "/api/bridge-terminal/input",
7
6
  "/api/bridge-terminal/stream/route": "/api/bridge-terminal/stream",
8
- "/api/cleanup/route": "/api/cleanup",
7
+ "/api/captures/route": "/api/captures",
8
+ "/api/bridge-terminal/resize/route": "/api/bridge-terminal/resize",
9
9
  "/api/dev-mode/route": "/api/dev-mode",
10
- "/api/export-data/route": "/api/export-data",
11
- "/api/doctor/route": "/api/doctor",
12
10
  "/api/browse-directories/route": "/api/browse-directories",
13
- "/api/captures/route": "/api/captures",
11
+ "/api/cleanup/route": "/api/cleanup",
14
12
  "/api/history/route": "/api/history",
13
+ "/api/forensics/route": "/api/forensics",
14
+ "/api/doctor/route": "/api/doctor",
15
15
  "/api/git/route": "/api/git",
16
16
  "/api/hooks/route": "/api/hooks",
17
- "/api/forensics/route": "/api/forensics",
18
- "/api/inspect/route": "/api/inspect",
17
+ "/api/export-data/route": "/api/export-data",
19
18
  "/api/knowledge/route": "/api/knowledge",
19
+ "/api/inspect/route": "/api/inspect",
20
20
  "/api/live-state/route": "/api/live-state",
21
21
  "/api/preferences/route": "/api/preferences",
22
+ "/api/session/browser/route": "/api/session/browser",
22
23
  "/api/recovery/route": "/api/recovery",
23
- "/api/onboarding/route": "/api/onboarding",
24
24
  "/api/projects/route": "/api/projects",
25
- "/api/session/browser/route": "/api/session/browser",
25
+ "/api/onboarding/route": "/api/onboarding",
26
26
  "/api/session/command/route": "/api/session/command",
27
27
  "/api/settings-data/route": "/api/settings-data",
28
28
  "/api/session/events/route": "/api/session/events",
29
+ "/api/skill-health/route": "/api/skill-health",
29
30
  "/api/shutdown/route": "/api/shutdown",
30
31
  "/api/session/manage/route": "/api/session/manage",
31
32
  "/api/steer/route": "/api/steer",
32
- "/api/skill-health/route": "/api/skill-health",
33
- "/api/switch-root/route": "/api/switch-root",
34
33
  "/api/terminal/input/route": "/api/terminal/input",
35
- "/api/terminal/sessions/route": "/api/terminal/sessions",
36
34
  "/api/terminal/resize/route": "/api/terminal/resize",
37
- "/api/terminal/stream/route": "/api/terminal/stream",
35
+ "/api/switch-root/route": "/api/switch-root",
38
36
  "/api/files/route": "/api/files",
39
- "/api/update/route": "/api/update",
37
+ "/api/terminal/sessions/route": "/api/terminal/sessions",
40
38
  "/api/terminal/upload/route": "/api/terminal/upload",
41
- "/api/undo/route": "/api/undo",
42
39
  "/api/visualizer/route": "/api/visualizer",
40
+ "/api/terminal/stream/route": "/api/terminal/stream",
43
41
  "/api/remote-questions/route": "/api/remote-questions",
42
+ "/api/undo/route": "/api/undo",
43
+ "/api/update/route": "/api/update",
44
44
  "/page": "/"
45
45
  }
@@ -4,8 +4,8 @@
4
4
  ],
5
5
  "devFiles": [],
6
6
  "lowPriorityFiles": [
7
- "static/vP6aj-TThZymVNx5Pi2AN/_buildManifest.js",
8
- "static/vP6aj-TThZymVNx5Pi2AN/_ssgManifest.js"
7
+ "static/MN4KAhNleSmucaEc-vzTu/_buildManifest.js",
8
+ "static/MN4KAhNleSmucaEc-vzTu/_ssgManifest.js"
9
9
  ],
10
10
  "rootMainFiles": [
11
11
  "static/chunks/webpack-0a4cd455ec4197d2.js",
@@ -78,8 +78,8 @@
78
78
  "dynamicRoutes": {},
79
79
  "notFoundRoutes": [],
80
80
  "preview": {
81
- "previewModeId": "4e508ef7629381215a8931ab7dc5718b",
82
- "previewModeSigningKey": "556bcab7151bb31a2e517eb7552a997ab5e742660d32a79ee66eaf9365728804",
83
- "previewModeEncryptionKey": "515d4cb58fa760927a3a823c7b6dfbea87b16fe09efd7c5ad406b56d53a2ae8e"
81
+ "previewModeId": "16bfdcfde427b44c5d2f59473c1e5db6",
82
+ "previewModeSigningKey": "66836cc409fa14caa37897cdfeef5ba348cf850a914bc08c86d488e2febe0f10",
83
+ "previewModeEncryptionKey": "ce49a4e771ba2135578f8a4cdb33f8991248b516385fb95bf1fb446079bb1254"
84
84
  }
85
85
  }
@@ -1,2 +1,2 @@
1
- <!DOCTYPE html><!--vP6aj_TThZymVNx5Pi2AN--><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-0a4cd455ec4197d2.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-0a4cd455ec4197d2.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\":\"vP6aj-TThZymVNx5Pi2AN\",\"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><!--MN4KAhNleSmucaEc_vzTu--><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-0a4cd455ec4197d2.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-0a4cd455ec4197d2.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\":\"MN4KAhNleSmucaEc-vzTu\",\"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":"vP6aj-TThZymVNx5Pi2AN","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":"MN4KAhNleSmucaEc-vzTu","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":"vP6aj-TThZymVNx5Pi2AN","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":"MN4KAhNleSmucaEc-vzTu","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":"vP6aj-TThZymVNx5Pi2AN","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":"MN4KAhNleSmucaEc-vzTu","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":"vP6aj-TThZymVNx5Pi2AN","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
4
+ 0:{"buildId":"MN4KAhNleSmucaEc-vzTu","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":"vP6aj-TThZymVNx5Pi2AN","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":"MN4KAhNleSmucaEc-vzTu","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":"vP6aj-TThZymVNx5Pi2AN","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
4
+ 0:{"buildId":"MN4KAhNleSmucaEc-vzTu","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
@@ -1 +1 @@
1
- 0:{"buildId":"vP6aj-TThZymVNx5Pi2AN","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":"MN4KAhNleSmucaEc-vzTu","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}