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.
Files changed (131) hide show
  1. package/dist/resources/extensions/ask-user-questions.js +47 -3
  2. package/dist/resources/extensions/gsd/auto/loop.js +8 -1
  3. package/dist/resources/extensions/gsd/auto/phases.js +10 -3
  4. package/dist/resources/extensions/gsd/auto-post-unit.js +6 -4
  5. package/dist/resources/extensions/gsd/auto-start.js +11 -6
  6. package/dist/resources/extensions/gsd/auto-timers.js +8 -2
  7. package/dist/resources/extensions/gsd/auto-verification.js +14 -3
  8. package/dist/resources/extensions/gsd/auto-worktree.js +19 -0
  9. package/dist/resources/extensions/gsd/auto.js +24 -0
  10. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +4 -0
  11. package/dist/resources/extensions/gsd/bootstrap/tool-call-loop-guard.js +11 -1
  12. package/dist/resources/extensions/gsd/db-writer.js +64 -28
  13. package/dist/resources/extensions/gsd/preferences-models.js +74 -0
  14. package/dist/resources/extensions/gsd/preferences-skills.js +6 -1
  15. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
  16. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
  17. package/dist/resources/extensions/gsd/skill-catalog.js +6 -4
  18. package/dist/resources/extensions/gsd/skill-discovery.js +24 -6
  19. package/dist/resources/extensions/gsd/skill-health.js +7 -3
  20. package/dist/resources/extensions/gsd/skill-telemetry.js +5 -2
  21. package/dist/resources/extensions/gsd/state.js +1 -0
  22. package/dist/resources/extensions/gsd/tools/complete-slice.js +3 -3
  23. package/dist/resources/extensions/gsd/workflow-logger.js +13 -8
  24. package/dist/resources/extensions/gsd/workflow-reconcile.js +3 -1
  25. package/dist/web/standalone/.next/BUILD_ID +1 -1
  26. package/dist/web/standalone/.next/app-path-routes-manifest.json +20 -20
  27. package/dist/web/standalone/.next/build-manifest.json +2 -2
  28. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  29. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  30. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  31. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  32. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  33. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  34. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  35. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  36. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  37. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  38. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  39. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  40. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  41. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  42. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  43. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  44. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  45. package/dist/web/standalone/.next/server/app/index.html +1 -1
  46. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  47. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  48. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  49. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  50. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  51. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  52. package/dist/web/standalone/.next/server/app-paths-manifest.json +20 -20
  53. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  54. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  55. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  56. package/package.json +1 -1
  57. package/packages/mcp-server/src/cli.ts +1 -1
  58. package/packages/mcp-server/src/index.ts +15 -1
  59. package/packages/mcp-server/src/readers/captures.ts +119 -0
  60. package/packages/mcp-server/src/readers/doctor-lite.ts +225 -0
  61. package/packages/mcp-server/src/readers/index.ts +16 -0
  62. package/packages/mcp-server/src/readers/knowledge.ts +111 -0
  63. package/packages/mcp-server/src/readers/metrics.ts +118 -0
  64. package/packages/mcp-server/src/readers/paths.ts +217 -0
  65. package/packages/mcp-server/src/readers/readers.test.ts +509 -0
  66. package/packages/mcp-server/src/readers/roadmap.ts +263 -0
  67. package/packages/mcp-server/src/readers/state.ts +223 -0
  68. package/packages/mcp-server/src/server.ts +134 -3
  69. package/packages/pi-ai/dist/utils/repair-tool-json.d.ts +26 -6
  70. package/packages/pi-ai/dist/utils/repair-tool-json.d.ts.map +1 -1
  71. package/packages/pi-ai/dist/utils/repair-tool-json.js +67 -9
  72. package/packages/pi-ai/dist/utils/repair-tool-json.js.map +1 -1
  73. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js +73 -1
  74. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js.map +1 -1
  75. package/packages/pi-ai/src/utils/repair-tool-json.ts +74 -10
  76. package/packages/pi-ai/src/utils/tests/repair-tool-json.test.ts +94 -1
  77. package/packages/pi-coding-agent/dist/core/agent-session-model-switch.test.d.ts +2 -0
  78. package/packages/pi-coding-agent/dist/core/agent-session-model-switch.test.d.ts.map +1 -0
  79. package/packages/pi-coding-agent/dist/core/agent-session-model-switch.test.js +16 -0
  80. package/packages/pi-coding-agent/dist/core/agent-session-model-switch.test.js.map +1 -0
  81. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  82. package/packages/pi-coding-agent/dist/core/agent-session.js +4 -0
  83. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  84. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts +3 -0
  85. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
  86. package/packages/pi-coding-agent/dist/core/retry-handler.js +48 -16
  87. package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
  88. package/packages/pi-coding-agent/dist/core/retry-handler.test.js +20 -3
  89. package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +1 -1
  90. package/packages/pi-coding-agent/package.json +1 -1
  91. package/packages/pi-coding-agent/src/core/agent-session-model-switch.test.ts +21 -0
  92. package/packages/pi-coding-agent/src/core/agent-session.ts +4 -0
  93. package/packages/pi-coding-agent/src/core/retry-handler.test.ts +30 -3
  94. package/packages/pi-coding-agent/src/core/retry-handler.ts +49 -16
  95. package/pkg/package.json +1 -1
  96. package/src/resources/extensions/ask-user-questions.ts +60 -4
  97. package/src/resources/extensions/gsd/auto/loop.ts +8 -1
  98. package/src/resources/extensions/gsd/auto/phases.ts +8 -6
  99. package/src/resources/extensions/gsd/auto-post-unit.ts +6 -3
  100. package/src/resources/extensions/gsd/auto-start.ts +11 -6
  101. package/src/resources/extensions/gsd/auto-timers.ts +8 -2
  102. package/src/resources/extensions/gsd/auto-verification.ts +14 -3
  103. package/src/resources/extensions/gsd/auto-worktree.ts +18 -0
  104. package/src/resources/extensions/gsd/auto.ts +25 -0
  105. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +4 -0
  106. package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +13 -1
  107. package/src/resources/extensions/gsd/db-writer.ts +67 -30
  108. package/src/resources/extensions/gsd/preferences-models.ts +78 -0
  109. package/src/resources/extensions/gsd/preferences-skills.ts +6 -1
  110. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
  111. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
  112. package/src/resources/extensions/gsd/skill-catalog.ts +6 -3
  113. package/src/resources/extensions/gsd/skill-discovery.ts +23 -6
  114. package/src/resources/extensions/gsd/skill-health.ts +7 -3
  115. package/src/resources/extensions/gsd/skill-telemetry.ts +5 -2
  116. package/src/resources/extensions/gsd/state.ts +1 -0
  117. package/src/resources/extensions/gsd/tests/ask-user-questions-dedup.test.ts +120 -0
  118. package/src/resources/extensions/gsd/tests/auto-start-model-capture.test.ts +22 -2
  119. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +107 -0
  120. package/src/resources/extensions/gsd/tests/claude-skill-dirs.test.ts +51 -0
  121. package/src/resources/extensions/gsd/tests/db-writer.test.ts +41 -0
  122. package/src/resources/extensions/gsd/tests/model-isolation.test.ts +75 -1
  123. package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +17 -4
  124. package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +17 -41
  125. package/src/resources/extensions/gsd/tests/worktree-db-respawn-truncation.test.ts +81 -2
  126. package/src/resources/extensions/gsd/tools/complete-slice.ts +3 -5
  127. package/src/resources/extensions/gsd/workflow-logger.ts +13 -8
  128. package/src/resources/extensions/gsd/workflow-reconcile.ts +3 -1
  129. package/src/resources/extensions/shared/tests/ask-user-freetext.test.ts +6 -1
  130. /package/dist/web/standalone/.next/static/{fbkSIi4k8fmB8mi0Sq9sF → erQZ_8_1lkclnPJLJnCxG}/_buildManifest.js +0 -0
  131. /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
- * Global skills (~/.agents/skills/) take precedence over project skills.
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 skillsDir = join(homedir(), ".agents", "skills");
893
- if (!existsSync(skillsDir))
894
- return false;
895
- return pack.skills.every((name) => existsSync(join(skillsDir, name, "SKILL.md")));
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
- /** Industry-standard skills.sh global skills directory */
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
- const skillMdPath = join(SKILLS_DIR, dir, "SKILL.md");
48
- if (!existsSync(skillMdPath))
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 listSkillDirs() {
82
- if (!existsSync(SKILLS_DIR))
83
+ function listSkillDirsFrom(dir) {
84
+ if (!existsSync(dir))
83
85
  return [];
84
86
  try {
85
- return readdirSync(SKILLS_DIR, { withFileTypes: true })
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, "&amp;")
@@ -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 skillPath = join(homedir(), ".agents", "skills", skillName, "SKILL.md");
145
- if (existsSync(skillPath)) {
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
- process.stderr.write(`gsd-db: complete_slice — could not find roadmap for ${params.milestoneId}, skipping checkbox toggle\n`);
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: ${renderErr.message}`);
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 warning: ${hookErr.message}`);
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
- * Note: context fields are not included in the formatted output.
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
- if (entries.length === 1) {
120
- const e = entries[0];
121
- return `[${e.component}] ${e.message}`;
122
- }
123
- return entries
124
- .map((e) => `[${e.component}] ${e.message}`)
125
- .join("\n");
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
- logError("reconcile", `${conflicts.length} conflict(s) detected`, { count: String(conflicts.length), path: join(mainBasePath, ".gsd", "CONFLICTS.md") });
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
- fbkSIi4k8fmB8mi0Sq9sF
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/preferences/route": "/api/preferences",
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/projects/route": "/api/projects",
28
- "/api/settings-data/route": "/api/settings-data",
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/steer/route": "/api/steer",
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/terminal/stream/route": "/api/terminal/stream",
35
+ "/api/steer/route": "/api/steer",
37
36
  "/api/terminal/resize/route": "/api/terminal/resize",
38
- "/api/session/events/route": "/api/session/events",
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/fbkSIi4k8fmB8mi0Sq9sF/_buildManifest.js",
8
- "static/fbkSIi4k8fmB8mi0Sq9sF/_ssgManifest.js"
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": "bf5436351435f341eec90e6ae113f5a5",
82
- "previewModeSigningKey": "b41252408d13f60673269677a0c86efcafa036c79f03d26059c9723dbd6ea5ed",
83
- "previewModeEncryptionKey": "b6b34c7c4e263349899e4a6f6aa68271562b975080961a86d020bfc83984d89b"
81
+ "previewModeId": "a1e059cda3af117becdf5686492e7825",
82
+ "previewModeSigningKey": "4fea5dd011f3cb2528bd4a9454fb199a9cb083eee6f1c4b35379121565edd131",
83
+ "previewModeEncryptionKey": "674622b9b55cff55d6d9b04514d7880401c4cd965eaeb00b97061ddf7b722912"
84
84
  }
85
85
  }
@@ -1,2 +1,2 @@
1
- <!DOCTYPE html><!--fbkSIi4k8fmB8mi0Sq9sF--><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,&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-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\":\"fbkSIi4k8fmB8mi0Sq9sF\",\"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><!--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,&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-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":"fbkSIi4k8fmB8mi0Sq9sF","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":"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":"fbkSIi4k8fmB8mi0Sq9sF","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":"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":"fbkSIi4k8fmB8mi0Sq9sF","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":"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
@@ -1,4 +1,4 @@
1
1
  1:"$Sreact.fragment"
2
2
  2:I[57121,[],""]
3
3
  3:I[74581,[],""]
4
- 0:{"buildId":"fbkSIi4k8fmB8mi0Sq9sF","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
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":"fbkSIi4k8fmB8mi0Sq9sF","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":"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":"fbkSIi4k8fmB8mi0Sq9sF","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
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":"fbkSIi4k8fmB8mi0Sq9sF","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":"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}