gsd-pi 2.62.0-dev.f6ad485 → 2.62.1-dev.1ae2b74
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/dist/resources/extensions/ask-user-questions.js +47 -3
- package/dist/resources/extensions/gsd/auto/loop.js +8 -1
- package/dist/resources/extensions/gsd/auto/phases.js +10 -3
- package/dist/resources/extensions/gsd/auto-post-unit.js +6 -4
- package/dist/resources/extensions/gsd/auto-start.js +11 -6
- package/dist/resources/extensions/gsd/auto-timers.js +8 -2
- package/dist/resources/extensions/gsd/auto-verification.js +14 -3
- package/dist/resources/extensions/gsd/auto-worktree.js +19 -0
- package/dist/resources/extensions/gsd/auto.js +24 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +4 -0
- package/dist/resources/extensions/gsd/bootstrap/tool-call-loop-guard.js +11 -1
- package/dist/resources/extensions/gsd/db-writer.js +64 -28
- package/dist/resources/extensions/gsd/preferences-models.js +74 -0
- package/dist/resources/extensions/gsd/preferences-skills.js +6 -1
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
- package/dist/resources/extensions/gsd/skill-catalog.js +6 -4
- package/dist/resources/extensions/gsd/skill-discovery.js +24 -6
- package/dist/resources/extensions/gsd/skill-health.js +7 -3
- package/dist/resources/extensions/gsd/skill-telemetry.js +5 -2
- package/dist/resources/extensions/gsd/state.js +1 -0
- package/dist/resources/extensions/gsd/tools/complete-slice.js +3 -3
- package/dist/resources/extensions/gsd/workflow-logger.js +13 -8
- package/dist/resources/extensions/gsd/workflow-reconcile.js +3 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +20 -20
- 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 +20 -20
- 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 +1 -1
- package/packages/mcp-server/src/cli.ts +1 -1
- package/packages/mcp-server/src/index.ts +15 -1
- package/packages/mcp-server/src/readers/captures.ts +119 -0
- package/packages/mcp-server/src/readers/doctor-lite.ts +225 -0
- package/packages/mcp-server/src/readers/index.ts +16 -0
- package/packages/mcp-server/src/readers/knowledge.ts +111 -0
- package/packages/mcp-server/src/readers/metrics.ts +118 -0
- package/packages/mcp-server/src/readers/paths.ts +217 -0
- package/packages/mcp-server/src/readers/readers.test.ts +509 -0
- package/packages/mcp-server/src/readers/roadmap.ts +263 -0
- package/packages/mcp-server/src/readers/state.ts +223 -0
- package/packages/mcp-server/src/server.ts +134 -3
- package/packages/pi-ai/dist/utils/repair-tool-json.d.ts +26 -6
- package/packages/pi-ai/dist/utils/repair-tool-json.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/repair-tool-json.js +67 -9
- package/packages/pi-ai/dist/utils/repair-tool-json.js.map +1 -1
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js +73 -1
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js.map +1 -1
- package/packages/pi-ai/src/utils/repair-tool-json.ts +74 -10
- package/packages/pi-ai/src/utils/tests/repair-tool-json.test.ts +94 -1
- package/packages/pi-coding-agent/dist/core/agent-session-model-switch.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/agent-session-model-switch.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session-model-switch.test.js +16 -0
- package/packages/pi-coding-agent/dist/core/agent-session-model-switch.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +4 -0
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.js +48 -16
- package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.test.js +20 -3
- package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/agent-session-model-switch.test.ts +21 -0
- package/packages/pi-coding-agent/src/core/agent-session.ts +4 -0
- package/packages/pi-coding-agent/src/core/retry-handler.test.ts +30 -3
- package/packages/pi-coding-agent/src/core/retry-handler.ts +49 -16
- package/pkg/package.json +1 -1
- package/src/resources/extensions/ask-user-questions.ts +60 -4
- package/src/resources/extensions/gsd/auto/loop.ts +8 -1
- package/src/resources/extensions/gsd/auto/phases.ts +8 -6
- package/src/resources/extensions/gsd/auto-post-unit.ts +6 -3
- package/src/resources/extensions/gsd/auto-start.ts +11 -6
- package/src/resources/extensions/gsd/auto-timers.ts +8 -2
- package/src/resources/extensions/gsd/auto-verification.ts +14 -3
- package/src/resources/extensions/gsd/auto-worktree.ts +18 -0
- package/src/resources/extensions/gsd/auto.ts +25 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +4 -0
- package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +13 -1
- package/src/resources/extensions/gsd/db-writer.ts +67 -30
- package/src/resources/extensions/gsd/preferences-models.ts +78 -0
- package/src/resources/extensions/gsd/preferences-skills.ts +6 -1
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
- package/src/resources/extensions/gsd/skill-catalog.ts +6 -3
- package/src/resources/extensions/gsd/skill-discovery.ts +23 -6
- package/src/resources/extensions/gsd/skill-health.ts +7 -3
- package/src/resources/extensions/gsd/skill-telemetry.ts +5 -2
- package/src/resources/extensions/gsd/state.ts +1 -0
- package/src/resources/extensions/gsd/tests/ask-user-questions-dedup.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/auto-start-model-capture.test.ts +22 -2
- package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +107 -0
- package/src/resources/extensions/gsd/tests/claude-skill-dirs.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +41 -0
- package/src/resources/extensions/gsd/tests/model-isolation.test.ts +75 -1
- package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +17 -4
- package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +17 -41
- package/src/resources/extensions/gsd/tests/worktree-db-respawn-truncation.test.ts +81 -2
- package/src/resources/extensions/gsd/tools/complete-slice.ts +3 -5
- package/src/resources/extensions/gsd/workflow-logger.ts +13 -8
- package/src/resources/extensions/gsd/workflow-reconcile.ts +3 -1
- package/src/resources/extensions/shared/tests/ask-user-freetext.test.ts +6 -1
- /package/dist/web/standalone/.next/static/{fbkSIi4k8fmB8mi0Sq9sF → erQZ_8_1lkclnPJLJnCxG}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{fbkSIi4k8fmB8mi0Sq9sF → erQZ_8_1lkclnPJLJnCxG}/_ssgManifest.js +0 -0
|
@@ -87,6 +87,80 @@ export function resolveModelWithFallbacksForUnit(unitType) {
|
|
|
87
87
|
fallbacks: phaseConfig.fallbacks ?? [],
|
|
88
88
|
};
|
|
89
89
|
}
|
|
90
|
+
/**
|
|
91
|
+
* Resolve the default session model from GSD preferences.
|
|
92
|
+
*
|
|
93
|
+
* Used at auto-mode bootstrap to override the session model that was
|
|
94
|
+
* determined by settings.json (defaultProvider/defaultModel). When
|
|
95
|
+
* PREFERENCES.md (or project preferences) configures an `execution` model
|
|
96
|
+
* we treat that as the session default. Falls back through execution →
|
|
97
|
+
* planning → first configured model.
|
|
98
|
+
*
|
|
99
|
+
* Accepts an optional `sessionProvider` for bare model IDs that don't
|
|
100
|
+
* include an explicit provider prefix (e.g. `gpt-5.4` instead of
|
|
101
|
+
* `openai-codex/gpt-5.4`). When a bare ID is found and sessionProvider
|
|
102
|
+
* is available, the session provider is used. Without sessionProvider,
|
|
103
|
+
* bare IDs are still returned with provider set to the bare ID itself
|
|
104
|
+
* so downstream resolution (resolveModelId) can match it.
|
|
105
|
+
*
|
|
106
|
+
* Returns `{ provider, id }` or `undefined` if no model preference is
|
|
107
|
+
* configured.
|
|
108
|
+
*/
|
|
109
|
+
export function resolveDefaultSessionModel(sessionProvider) {
|
|
110
|
+
const prefs = loadEffectiveGSDPreferences();
|
|
111
|
+
if (!prefs?.preferences.models)
|
|
112
|
+
return undefined;
|
|
113
|
+
const m = prefs.preferences.models;
|
|
114
|
+
// Priority: execution → planning → first configured value
|
|
115
|
+
const candidates = [
|
|
116
|
+
m.execution,
|
|
117
|
+
m.planning,
|
|
118
|
+
m.research,
|
|
119
|
+
m.discuss,
|
|
120
|
+
m.completion,
|
|
121
|
+
m.validation,
|
|
122
|
+
m.subagent,
|
|
123
|
+
];
|
|
124
|
+
for (const cfg of candidates) {
|
|
125
|
+
if (!cfg)
|
|
126
|
+
continue;
|
|
127
|
+
// Normalize to provider + id from the various config shapes
|
|
128
|
+
let provider;
|
|
129
|
+
let id;
|
|
130
|
+
if (typeof cfg === "string") {
|
|
131
|
+
const slashIdx = cfg.indexOf("/");
|
|
132
|
+
if (slashIdx !== -1) {
|
|
133
|
+
provider = cfg.slice(0, slashIdx);
|
|
134
|
+
id = cfg.slice(slashIdx + 1);
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
// Bare model ID (e.g. "gpt-5.4") — use session provider as context
|
|
138
|
+
provider = sessionProvider;
|
|
139
|
+
id = cfg;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
// Object config: { model, provider?, fallbacks? }
|
|
144
|
+
if (cfg.provider) {
|
|
145
|
+
provider = cfg.provider;
|
|
146
|
+
}
|
|
147
|
+
else if (cfg.model.includes("/")) {
|
|
148
|
+
const slashIdx = cfg.model.indexOf("/");
|
|
149
|
+
provider = cfg.model.slice(0, slashIdx);
|
|
150
|
+
id = cfg.model.slice(slashIdx + 1);
|
|
151
|
+
return { provider, id };
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
provider = sessionProvider;
|
|
155
|
+
}
|
|
156
|
+
id = cfg.model;
|
|
157
|
+
}
|
|
158
|
+
if (provider && id) {
|
|
159
|
+
return { provider, id };
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return undefined;
|
|
163
|
+
}
|
|
90
164
|
/**
|
|
91
165
|
* Determines the next fallback model to try when the current model fails.
|
|
92
166
|
* If the current model is not in the configured list, returns the primary model.
|
|
@@ -12,13 +12,18 @@ import { validatePreferences } from "./preferences-validation.js";
|
|
|
12
12
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
13
13
|
/**
|
|
14
14
|
* Known skill directories, in priority order.
|
|
15
|
-
*
|
|
15
|
+
* Searches both the skills.sh ecosystem directory (~/.agents/skills/) and
|
|
16
|
+
* Claude Code's official directory (~/.claude/skills/). Project-level
|
|
17
|
+
* directories for both conventions are included as well.
|
|
16
18
|
* Legacy ~/.gsd/agent/skills/ is included as a fallback for pre-migration installs.
|
|
17
19
|
*/
|
|
18
20
|
export function getSkillSearchDirs(cwd) {
|
|
19
21
|
const dirs = [
|
|
20
22
|
{ dir: join(homedir(), ".agents", "skills"), method: "user-skill" },
|
|
21
23
|
{ dir: join(cwd, ".agents", "skills"), method: "project-skill" },
|
|
24
|
+
// Claude Code official skill directories
|
|
25
|
+
{ dir: join(homedir(), ".claude", "skills"), method: "user-skill" },
|
|
26
|
+
{ dir: join(cwd, ".claude", "skills"), method: "project-skill" },
|
|
22
27
|
];
|
|
23
28
|
// Legacy fallback — read skills from old GSD directory only if migration hasn't completed
|
|
24
29
|
const legacyDir = join(homedir(), ".gsd", "agent", "skills");
|
|
@@ -30,7 +30,7 @@ Ask **1–3 questions per round**. Keep each question focused on one of:
|
|
|
30
30
|
- **The biggest technical unknowns / risks** — what could fail, what hasn't been proven
|
|
31
31
|
- **What external systems/services this touches** — APIs, databases, third-party services
|
|
32
32
|
|
|
33
|
-
**If `{{structuredQuestionsAvailable}}` is `true`:** use `ask_user_questions` for each round. 1–3 questions per call, each as a separate question object. Keep option labels short (3–5 words). Always include a freeform "Other / let me explain" option. When the user picks that option or writes a long freeform answer, switch to plain text follow-up for that thread before resuming structured questions.
|
|
33
|
+
**If `{{structuredQuestionsAvailable}}` is `true`:** use `ask_user_questions` for each round. 1–3 questions per call, each as a separate question object. Keep option labels short (3–5 words). Always include a freeform "Other / let me explain" option. When the user picks that option or writes a long freeform answer, switch to plain text follow-up for that thread before resuming structured questions. **IMPORTANT: Call `ask_user_questions` exactly once per turn. Never make multiple calls with the same or overlapping questions — wait for the user's response before asking the next round.**
|
|
34
34
|
|
|
35
35
|
**If `{{structuredQuestionsAvailable}}` is `false`:** ask questions in plain text. Keep each round to 1–3 focused questions. Wait for answers before asking the next round.
|
|
36
36
|
|
|
@@ -22,7 +22,7 @@ Do **not** go deep — just enough that your questions reflect what's actually t
|
|
|
22
22
|
|
|
23
23
|
### Question rounds
|
|
24
24
|
|
|
25
|
-
Ask **1–3 questions per round** using `ask_user_questions`. Keep each question focused on one of:
|
|
25
|
+
Ask **1–3 questions per round** using `ask_user_questions`. **Call `ask_user_questions` exactly once per turn — never make multiple calls with the same or overlapping questions. Wait for the user's response before asking the next round.** Keep each question focused on one of:
|
|
26
26
|
- **UX and user-facing behaviour** — what does the user see, click, trigger, or experience?
|
|
27
27
|
- **Edge cases and failure states** — what happens when things go wrong or are in unusual states?
|
|
28
28
|
- **Scope boundaries** — what is explicitly in vs out for this slice? What deferred to later?
|
|
@@ -887,12 +887,14 @@ export async function installPacksBatched(packs, onProgress) {
|
|
|
887
887
|
}
|
|
888
888
|
/**
|
|
889
889
|
* Check if any skills from a pack are already installed.
|
|
890
|
+
* Searches both the skills.sh ecosystem directory and Claude Code's official directory.
|
|
890
891
|
*/
|
|
891
892
|
export function isPackInstalled(pack) {
|
|
892
|
-
const
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
893
|
+
const skillsDirs = [
|
|
894
|
+
join(homedir(), ".agents", "skills"),
|
|
895
|
+
join(homedir(), ".claude", "skills"),
|
|
896
|
+
];
|
|
897
|
+
return pack.skills.every((name) => skillsDirs.some((dir) => existsSync(join(dir, name, "SKILL.md"))));
|
|
896
898
|
}
|
|
897
899
|
// ─── Init Wizard Integration ──────────────────────────────────────────────────
|
|
898
900
|
/**
|
|
@@ -10,8 +10,9 @@
|
|
|
10
10
|
import { existsSync, readdirSync, readFileSync } from "node:fs";
|
|
11
11
|
import { join } from "node:path";
|
|
12
12
|
import { homedir } from "node:os";
|
|
13
|
-
/**
|
|
13
|
+
/** Skills directories — skills.sh ecosystem + Claude Code official */
|
|
14
14
|
const SKILLS_DIR = join(homedir(), ".agents", "skills");
|
|
15
|
+
const CLAUDE_SKILLS_DIR = join(homedir(), ".claude", "skills");
|
|
15
16
|
/** Snapshot of skill names at auto-mode start */
|
|
16
17
|
let baselineSkills = null;
|
|
17
18
|
/**
|
|
@@ -44,8 +45,9 @@ export function detectNewSkills() {
|
|
|
44
45
|
for (const dir of current) {
|
|
45
46
|
if (baselineSkills.has(dir))
|
|
46
47
|
continue;
|
|
47
|
-
|
|
48
|
-
|
|
48
|
+
// Check both skill directories for the SKILL.md file
|
|
49
|
+
const skillMdPath = resolveSkillMdPath(dir);
|
|
50
|
+
if (!skillMdPath)
|
|
49
51
|
continue;
|
|
50
52
|
const meta = parseSkillFrontmatter(skillMdPath);
|
|
51
53
|
if (meta) {
|
|
@@ -78,11 +80,11 @@ ${entries}
|
|
|
78
80
|
</newly_discovered_skills>`;
|
|
79
81
|
}
|
|
80
82
|
// ─── Internals ────────────────────────────────────────────────────────────────
|
|
81
|
-
function
|
|
82
|
-
if (!existsSync(
|
|
83
|
+
function listSkillDirsFrom(dir) {
|
|
84
|
+
if (!existsSync(dir))
|
|
83
85
|
return [];
|
|
84
86
|
try {
|
|
85
|
-
return readdirSync(
|
|
87
|
+
return readdirSync(dir, { withFileTypes: true })
|
|
86
88
|
.filter(d => d.isDirectory())
|
|
87
89
|
.map(d => d.name);
|
|
88
90
|
}
|
|
@@ -90,6 +92,14 @@ function listSkillDirs() {
|
|
|
90
92
|
return [];
|
|
91
93
|
}
|
|
92
94
|
}
|
|
95
|
+
function listSkillDirs() {
|
|
96
|
+
const names = new Set();
|
|
97
|
+
for (const name of listSkillDirsFrom(SKILLS_DIR))
|
|
98
|
+
names.add(name);
|
|
99
|
+
for (const name of listSkillDirsFrom(CLAUDE_SKILLS_DIR))
|
|
100
|
+
names.add(name);
|
|
101
|
+
return [...names];
|
|
102
|
+
}
|
|
93
103
|
function parseSkillFrontmatter(path) {
|
|
94
104
|
try {
|
|
95
105
|
const content = readFileSync(path, "utf-8");
|
|
@@ -113,6 +123,14 @@ function parseSkillFrontmatter(path) {
|
|
|
113
123
|
return null;
|
|
114
124
|
}
|
|
115
125
|
}
|
|
126
|
+
function resolveSkillMdPath(skillName) {
|
|
127
|
+
for (const dir of [SKILLS_DIR, CLAUDE_SKILLS_DIR]) {
|
|
128
|
+
const candidate = join(dir, skillName, "SKILL.md");
|
|
129
|
+
if (existsSync(candidate))
|
|
130
|
+
return candidate;
|
|
131
|
+
}
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
116
134
|
function escapeXml(text) {
|
|
117
135
|
return text
|
|
118
136
|
.replace(/&/g, "&")
|
|
@@ -140,9 +140,13 @@ export function formatSkillDetail(basePath, skillName) {
|
|
|
140
140
|
const date = new Date(u.finishedAt).toISOString().slice(0, 10);
|
|
141
141
|
lines.push(` ${date} ${u.id.padEnd(20)} ${formatTokenCount(u.tokens.total).padStart(8)} tokens ${formatCost(u.cost)}`);
|
|
142
142
|
}
|
|
143
|
-
// Check for SKILL.md existence
|
|
144
|
-
const
|
|
145
|
-
|
|
143
|
+
// Check for SKILL.md existence — search both ecosystem and Claude Code directories
|
|
144
|
+
const candidatePaths = [
|
|
145
|
+
join(homedir(), ".agents", "skills", skillName, "SKILL.md"),
|
|
146
|
+
join(homedir(), ".claude", "skills", skillName, "SKILL.md"),
|
|
147
|
+
];
|
|
148
|
+
const skillPath = candidatePaths.find(p => existsSync(p));
|
|
149
|
+
if (skillPath) {
|
|
146
150
|
const stat = statSync(skillPath);
|
|
147
151
|
lines.push("");
|
|
148
152
|
lines.push(`SKILL.md: ${skillPath}`);
|
|
@@ -25,12 +25,14 @@ const activelyLoadedSkills = new Set();
|
|
|
25
25
|
*/
|
|
26
26
|
export function captureAvailableSkills() {
|
|
27
27
|
const skillsDir = join(homedir(), ".agents", "skills");
|
|
28
|
+
const claudeSkillsDir = join(homedir(), ".claude", "skills");
|
|
28
29
|
const legacyDir = join(homedir(), ".gsd", "agent", "skills");
|
|
29
30
|
const names = listSkillNames(skillsDir);
|
|
31
|
+
const claudeNames = listSkillNames(claudeSkillsDir);
|
|
30
32
|
// Include skills still in the legacy directory only if migration hasn't completed
|
|
31
33
|
const legacyMigrated = existsSync(join(legacyDir, ".migrated-to-agents"));
|
|
32
34
|
const legacyNames = legacyMigrated ? [] : listSkillNames(legacyDir);
|
|
33
|
-
const all = new Set([...names, ...legacyNames]);
|
|
35
|
+
const all = new Set([...names, ...claudeNames, ...legacyNames]);
|
|
34
36
|
availableSkills = [...all];
|
|
35
37
|
activelyLoadedSkills.clear();
|
|
36
38
|
}
|
|
@@ -92,10 +94,11 @@ export function detectStaleSkills(units, thresholdDays) {
|
|
|
92
94
|
const stale = [];
|
|
93
95
|
// Check all installed skills, not just those with usage data
|
|
94
96
|
const skillsDir = join(homedir(), ".agents", "skills");
|
|
97
|
+
const claudeSkillsDir = join(homedir(), ".claude", "skills");
|
|
95
98
|
const legacyDir = join(homedir(), ".gsd", "agent", "skills");
|
|
96
99
|
const legacyMigrated = existsSync(join(legacyDir, ".migrated-to-agents"));
|
|
97
100
|
const legacyNames = legacyMigrated ? [] : listSkillNames(legacyDir);
|
|
98
|
-
const installedSet = new Set([...listSkillNames(skillsDir), ...legacyNames]);
|
|
101
|
+
const installedSet = new Set([...listSkillNames(skillsDir), ...listSkillNames(claudeSkillsDir), ...legacyNames]);
|
|
99
102
|
const installed = [...installedSet];
|
|
100
103
|
for (const skill of installed) {
|
|
101
104
|
const lastTs = lastUsed.get(skill);
|
|
@@ -190,6 +190,7 @@ export async function deriveState(basePath) {
|
|
|
190
190
|
}
|
|
191
191
|
}
|
|
192
192
|
else {
|
|
193
|
+
logWarning("state", "DB unavailable — using filesystem state derivation (degraded mode)");
|
|
193
194
|
result = await _deriveStateImpl(basePath);
|
|
194
195
|
_telemetry.markdownDeriveCount++;
|
|
195
196
|
}
|
|
@@ -236,12 +236,12 @@ export async function handleCompleteSlice(params, basePath) {
|
|
|
236
236
|
// Toggle roadmap checkbox via renderer module
|
|
237
237
|
const roadmapToggled = await renderRoadmapCheckboxes(basePath, params.milestoneId);
|
|
238
238
|
if (!roadmapToggled) {
|
|
239
|
-
|
|
239
|
+
logWarning("tool", `complete_slice — could not find roadmap for ${params.milestoneId}, skipping checkbox toggle`);
|
|
240
240
|
}
|
|
241
241
|
}
|
|
242
242
|
catch (renderErr) {
|
|
243
243
|
// Disk render failed — roll back DB status so state stays consistent
|
|
244
|
-
logWarning("tool", `complete_slice — disk render failed, rolling back DB status:
|
|
244
|
+
logWarning("tool", `complete_slice — disk render failed for ${params.milestoneId}/${params.sliceId}, rolling back DB status`, { error: renderErr.message });
|
|
245
245
|
updateSliceStatus(params.milestoneId, params.sliceId, 'pending');
|
|
246
246
|
invalidateStateCache();
|
|
247
247
|
return { error: `disk render failed: ${renderErr.message}` };
|
|
@@ -266,7 +266,7 @@ export async function handleCompleteSlice(params, basePath) {
|
|
|
266
266
|
});
|
|
267
267
|
}
|
|
268
268
|
catch (hookErr) {
|
|
269
|
-
logWarning("tool", `complete-slice post-mutation hook
|
|
269
|
+
logWarning("tool", `complete-slice post-mutation hook failed for ${params.milestoneId}/${params.sliceId}`, { error: hookErr.message });
|
|
270
270
|
}
|
|
271
271
|
return {
|
|
272
272
|
sliceId: params.sliceId,
|
|
@@ -111,18 +111,23 @@ export function summarizeLogs() {
|
|
|
111
111
|
}
|
|
112
112
|
/**
|
|
113
113
|
* Format entries for display (used by auto-loop post-unit notification).
|
|
114
|
-
*
|
|
114
|
+
* Includes key context fields (file paths, commands) when present.
|
|
115
115
|
*/
|
|
116
116
|
export function formatForNotification(entries) {
|
|
117
117
|
if (entries.length === 0)
|
|
118
118
|
return "";
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
119
|
+
return entries.map((e) => {
|
|
120
|
+
let line = `[${e.component}] ${e.message}`;
|
|
121
|
+
if (e.context) {
|
|
122
|
+
const ctxParts = Object.entries(e.context)
|
|
123
|
+
.filter(([k]) => k !== "error") // error is redundant with message
|
|
124
|
+
.map(([k, v]) => v.includes(",") ? `${k}: "${v}"` : `${k}: ${v}`);
|
|
125
|
+
if (ctxParts.length > 0) {
|
|
126
|
+
line += ` (${ctxParts.join(", ")})`;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return line;
|
|
130
|
+
}).join("\n");
|
|
126
131
|
}
|
|
127
132
|
/**
|
|
128
133
|
* Read all entries from the persistent audit log.
|
|
@@ -281,7 +281,9 @@ function _reconcileWorktreeLogsInner(mainBasePath, worktreeBasePath) {
|
|
|
281
281
|
if (conflicts.length > 0) {
|
|
282
282
|
// D-04: atomic all-or-nothing — block entire merge
|
|
283
283
|
writeConflictsFile(mainBasePath, conflicts, worktreeBasePath);
|
|
284
|
-
|
|
284
|
+
const conflictSummary = conflicts.slice(0, 3).map(c => `${c.entityType}:${c.entityId}`).join(", ");
|
|
285
|
+
const truncated = conflicts.length > 3 ? `... and ${conflicts.length - 3} more` : "";
|
|
286
|
+
logError("reconcile", `${conflicts.length} conflict(s) detected on ${conflictSummary}${truncated}. Details: .gsd/CONFLICTS.md`, { count: String(conflicts.length), path: join(mainBasePath, ".gsd", "CONFLICTS.md") });
|
|
285
287
|
return { autoMerged: 0, conflicts };
|
|
286
288
|
}
|
|
287
289
|
// Step 6: Clean merge — stable sort by timestamp (index-based tiebreaker)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
erQZ_8_1lkclnPJLJnCxG
|
|
@@ -1,46 +1,46 @@
|
|
|
1
1
|
{
|
|
2
|
-
"/_global-error/page": "/_global-error",
|
|
3
2
|
"/_not-found/page": "/_not-found",
|
|
3
|
+
"/_global-error/page": "/_global-error",
|
|
4
4
|
"/api/bridge-terminal/input/route": "/api/bridge-terminal/input",
|
|
5
|
+
"/api/boot/route": "/api/boot",
|
|
5
6
|
"/api/bridge-terminal/resize/route": "/api/bridge-terminal/resize",
|
|
6
|
-
"/api/bridge-terminal/stream/route": "/api/bridge-terminal/stream",
|
|
7
|
-
"/api/browse-directories/route": "/api/browse-directories",
|
|
8
|
-
"/api/dev-mode/route": "/api/dev-mode",
|
|
9
7
|
"/api/cleanup/route": "/api/cleanup",
|
|
10
8
|
"/api/captures/route": "/api/captures",
|
|
11
|
-
"/api/export-data/route": "/api/export-data",
|
|
12
9
|
"/api/doctor/route": "/api/doctor",
|
|
10
|
+
"/api/dev-mode/route": "/api/dev-mode",
|
|
11
|
+
"/api/browse-directories/route": "/api/browse-directories",
|
|
12
|
+
"/api/export-data/route": "/api/export-data",
|
|
13
13
|
"/api/forensics/route": "/api/forensics",
|
|
14
|
+
"/api/bridge-terminal/stream/route": "/api/bridge-terminal/stream",
|
|
14
15
|
"/api/git/route": "/api/git",
|
|
15
|
-
"/api/experimental/route": "/api/experimental",
|
|
16
|
-
"/api/history/route": "/api/history",
|
|
17
|
-
"/api/boot/route": "/api/boot",
|
|
18
16
|
"/api/hooks/route": "/api/hooks",
|
|
17
|
+
"/api/history/route": "/api/history",
|
|
19
18
|
"/api/inspect/route": "/api/inspect",
|
|
19
|
+
"/api/experimental/route": "/api/experimental",
|
|
20
20
|
"/api/knowledge/route": "/api/knowledge",
|
|
21
21
|
"/api/live-state/route": "/api/live-state",
|
|
22
|
-
"/api/
|
|
22
|
+
"/api/projects/route": "/api/projects",
|
|
23
23
|
"/api/onboarding/route": "/api/onboarding",
|
|
24
|
-
"/api/session/browser/route": "/api/session/browser",
|
|
25
|
-
"/api/session/command/route": "/api/session/command",
|
|
26
24
|
"/api/recovery/route": "/api/recovery",
|
|
27
|
-
"/api/
|
|
28
|
-
"/api/
|
|
25
|
+
"/api/preferences/route": "/api/preferences",
|
|
26
|
+
"/api/session/browser/route": "/api/session/browser",
|
|
29
27
|
"/api/session/manage/route": "/api/session/manage",
|
|
28
|
+
"/api/session/events/route": "/api/session/events",
|
|
29
|
+
"/api/settings-data/route": "/api/settings-data",
|
|
30
|
+
"/api/shutdown/route": "/api/shutdown",
|
|
30
31
|
"/api/files/route": "/api/files",
|
|
31
|
-
"/api/
|
|
32
|
+
"/api/session/command/route": "/api/session/command",
|
|
32
33
|
"/api/skill-health/route": "/api/skill-health",
|
|
33
|
-
"/api/shutdown/route": "/api/shutdown",
|
|
34
|
-
"/api/switch-root/route": "/api/switch-root",
|
|
35
34
|
"/api/terminal/input/route": "/api/terminal/input",
|
|
36
|
-
"/api/
|
|
35
|
+
"/api/steer/route": "/api/steer",
|
|
37
36
|
"/api/terminal/resize/route": "/api/terminal/resize",
|
|
38
|
-
"/api/
|
|
37
|
+
"/api/terminal/sessions/route": "/api/terminal/sessions",
|
|
38
|
+
"/api/switch-root/route": "/api/switch-root",
|
|
39
39
|
"/api/terminal/upload/route": "/api/terminal/upload",
|
|
40
|
+
"/api/terminal/stream/route": "/api/terminal/stream",
|
|
41
|
+
"/api/remote-questions/route": "/api/remote-questions",
|
|
40
42
|
"/api/visualizer/route": "/api/visualizer",
|
|
41
|
-
"/api/terminal/sessions/route": "/api/terminal/sessions",
|
|
42
43
|
"/api/update/route": "/api/update",
|
|
43
|
-
"/api/remote-questions/route": "/api/remote-questions",
|
|
44
44
|
"/api/undo/route": "/api/undo",
|
|
45
45
|
"/page": "/"
|
|
46
46
|
}
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
],
|
|
5
5
|
"devFiles": [],
|
|
6
6
|
"lowPriorityFiles": [
|
|
7
|
-
"static/
|
|
8
|
-
"static/
|
|
7
|
+
"static/erQZ_8_1lkclnPJLJnCxG/_buildManifest.js",
|
|
8
|
+
"static/erQZ_8_1lkclnPJLJnCxG/_ssgManifest.js"
|
|
9
9
|
],
|
|
10
10
|
"rootMainFiles": [
|
|
11
11
|
"static/chunks/webpack-a1c1e452c6b32d04.js",
|
|
@@ -78,8 +78,8 @@
|
|
|
78
78
|
"dynamicRoutes": {},
|
|
79
79
|
"notFoundRoutes": [],
|
|
80
80
|
"preview": {
|
|
81
|
-
"previewModeId": "
|
|
82
|
-
"previewModeSigningKey": "
|
|
83
|
-
"previewModeEncryptionKey": "
|
|
81
|
+
"previewModeId": "a1e059cda3af117becdf5686492e7825",
|
|
82
|
+
"previewModeSigningKey": "4fea5dd011f3cb2528bd4a9454fb199a9cb083eee6f1c4b35379121565edd131",
|
|
83
|
+
"previewModeEncryptionKey": "674622b9b55cff55d6d9b04514d7880401c4cd965eaeb00b97061ddf7b722912"
|
|
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-a1c1e452c6b32d04.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><!--erQZ_8_1lkclnPJLJnCxG--><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-a1c1e452c6b32d04.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-a1c1e452c6b32d04.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\":\"erQZ_8_1lkclnPJLJnCxG\",\"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":"erQZ_8_1lkclnPJLJnCxG","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":"erQZ_8_1lkclnPJLJnCxG","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":"erQZ_8_1lkclnPJLJnCxG","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":"erQZ_8_1lkclnPJLJnCxG","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":"erQZ_8_1lkclnPJLJnCxG","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":"erQZ_8_1lkclnPJLJnCxG","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
0:{"buildId":"
|
|
1
|
+
0:{"buildId":"erQZ_8_1lkclnPJLJnCxG","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}
|