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.
- package/README.md +46 -29
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +31 -15
- package/dist/resources/extensions/gsd/auto-start.js +9 -8
- package/dist/resources/extensions/gsd/repo-identity.js +5 -2
- package/dist/resources/extensions/gsd/state.js +29 -2
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +16 -16
- package/dist/web/standalone/.next/build-manifest.json +2 -2
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +16 -16
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +2 -2
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/package.json +2 -1
- package/packages/pi-agent-core/dist/agent-loop.js +26 -1
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/dist/agent.d.ts +7 -0
- package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent.js +2 -0
- package/packages/pi-agent-core/dist/agent.js.map +1 -1
- package/packages/pi-agent-core/dist/types.d.ts +9 -0
- package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/types.js.map +1 -1
- package/packages/pi-agent-core/src/agent-loop.ts +25 -1
- package/packages/pi-agent-core/src/agent.ts +10 -0
- package/packages/pi-agent-core/src/types.ts +10 -0
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js +27 -2
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +1 -0
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/src/core/auth-storage.test.ts +27 -2
- package/packages/pi-coding-agent/src/core/sdk.ts +1 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +31 -16
- package/src/resources/extensions/gsd/auto-start.ts +8 -7
- package/src/resources/extensions/gsd/repo-identity.ts +5 -2
- package/src/resources/extensions/gsd/state.ts +33 -1
- package/src/resources/extensions/gsd/tests/inherited-repo-home-dir.test.ts +70 -0
- /package/dist/web/standalone/.next/static/{vP6aj-TThZymVNx5Pi2AN → MN4KAhNleSmucaEc-vzTu}/_buildManifest.js +0 -0
- /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.
|
|
28
|
+
## What's New in v2.46.0
|
|
29
29
|
|
|
30
|
-
###
|
|
30
|
+
### Single-Writer State Engine
|
|
31
31
|
|
|
32
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.0 — New Commands and Capabilities
|
|
46
41
|
|
|
47
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
- **
|
|
57
|
-
- **
|
|
58
|
-
-
|
|
59
|
-
-
|
|
60
|
-
- **
|
|
61
|
-
- **
|
|
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
|
|
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` | `
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
//
|
|
219
|
-
|
|
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"
|
|
222
|
-
|
|
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
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
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 {
|
|
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
|
-
//
|
|
74
|
-
//
|
|
75
|
-
//
|
|
76
|
-
//
|
|
77
|
-
//
|
|
78
|
-
|
|
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
|
-
//
|
|
116
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
35
|
+
"/api/switch-root/route": "/api/switch-root",
|
|
38
36
|
"/api/files/route": "/api/files",
|
|
39
|
-
"/api/
|
|
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/
|
|
8
|
-
"static/
|
|
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": "
|
|
82
|
-
"previewModeSigningKey": "
|
|
83
|
-
"previewModeEncryptionKey": "
|
|
81
|
+
"previewModeId": "16bfdcfde427b44c5d2f59473c1e5db6",
|
|
82
|
+
"previewModeSigningKey": "66836cc409fa14caa37897cdfeef5ba348cf850a914bc08c86d488e2febe0f10",
|
|
83
|
+
"previewModeEncryptionKey": "ce49a4e771ba2135578f8a4cdb33f8991248b516385fb95bf1fb446079bb1254"
|
|
84
84
|
}
|
|
85
85
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
<!DOCTYPE html><!--
|
|
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\":\"
|
|
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,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";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":"
|
|
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":"
|
|
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":"
|
|
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
|
package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
1:"$Sreact.fragment"
|
|
2
2
|
2:I[57121,[],""]
|
|
3
3
|
3:I[74581,[],""]
|
|
4
|
-
0:{"buildId":"
|
|
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":"
|
|
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":"
|
|
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":"
|
|
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}
|