plan-assistant 1.4.5 → 1.6.0-alpha.1

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 (130) hide show
  1. package/README.md +31 -12
  2. package/build/client/_app/immutable/assets/0.Bc8GgJCN.css +1 -0
  3. package/build/client/_app/immutable/chunks/{ABPQj_I6.js → 5KpFG7Y3.js} +1 -1
  4. package/build/client/_app/immutable/chunks/AMggw8F_.js +1 -0
  5. package/build/client/_app/immutable/chunks/{DCP7pAeu.js → B0Br67Jm.js} +22 -22
  6. package/build/client/_app/immutable/chunks/{D01yuNpr.js → BGuzEOEG.js} +1 -1
  7. package/build/client/_app/immutable/chunks/{x3JJhWj3.js → BPC30ZkC.js} +1 -1
  8. package/build/client/_app/immutable/chunks/{Dn9lSg-V.js → BT-rYp04.js} +1 -1
  9. package/build/client/_app/immutable/chunks/{B25Hd2fz.js → BXachUYg.js} +1 -1
  10. package/build/client/_app/immutable/chunks/{CKmKshyc.js → BdxNwExl.js} +1 -1
  11. package/build/client/_app/immutable/chunks/{BcKBKgcZ.js → Bdy6d4YN.js} +1 -1
  12. package/build/client/_app/immutable/chunks/{ClpyzqjJ.js → BkkBWYh4.js} +1 -1
  13. package/build/client/_app/immutable/chunks/{yS11QLaS.js → Bmsplg2Y.js} +1 -1
  14. package/build/client/_app/immutable/chunks/{hHxGQnZj.js → Bn0XLNse.js} +1 -1
  15. package/build/client/_app/immutable/chunks/{J7DoTV-B.js → BuxFeYZa.js} +1 -1
  16. package/build/client/_app/immutable/chunks/{DJ4AwCJ9.js → C2OLrLCJ.js} +1 -1
  17. package/build/client/_app/immutable/chunks/C88p_n1l.js +3 -0
  18. package/build/client/_app/immutable/chunks/{DVaxwt1f.js → CFomSPzW.js} +1 -1
  19. package/build/client/_app/immutable/chunks/{BRUI-1NR.js → CFx4VLDw.js} +1 -1
  20. package/build/client/_app/immutable/chunks/{DBY3mAk0.js → CRUUUIwS.js} +1 -1
  21. package/build/client/_app/immutable/chunks/{CfICpXHz.js → CRuCklg1.js} +1 -1
  22. package/build/client/_app/immutable/chunks/{DmuA5Qzn.js → CUHvMbx0.js} +1 -1
  23. package/build/client/_app/immutable/chunks/{CadzRJ6P.js → C_5efo6-.js} +1 -1
  24. package/build/client/_app/immutable/chunks/{BierXyQN.js → Cb177sm-.js} +1 -1
  25. package/build/client/_app/immutable/chunks/{CWe1fJjs.js → Cb9ekAV0.js} +1 -1
  26. package/build/client/_app/immutable/chunks/{DnZ1MoPi.js → CdiHcRRA.js} +1 -1
  27. package/build/client/_app/immutable/chunks/{BAG_vqoT.js → CgIOtWnS.js} +1 -1
  28. package/build/client/_app/immutable/chunks/{CbLSu4oh.js → CghPw8Xx.js} +1 -1
  29. package/build/client/_app/immutable/chunks/{Uy7RUP_Z.js → Cmym6IfH.js} +1 -1
  30. package/build/client/_app/immutable/chunks/{C7FtzXJF.js → Cvpo3167.js} +1 -1
  31. package/build/client/_app/immutable/chunks/{4dPdNqKL.js → Cy0JyQfD.js} +1 -1
  32. package/build/client/_app/immutable/chunks/{DXnvq78W.js → D-0mahX7.js} +1 -1
  33. package/build/client/_app/immutable/chunks/{gqH_bfvs.js → D8823oiN.js} +1 -1
  34. package/build/client/_app/immutable/chunks/{BCxCv_4N.js → DIjXbgfi.js} +1 -1
  35. package/build/client/_app/immutable/chunks/{CF3N_j1A.js → DUIJXtzj.js} +1 -1
  36. package/build/client/_app/immutable/chunks/{DbxsK-Gw.js → DXlvMCt6.js} +1 -1
  37. package/build/client/_app/immutable/chunks/{DA_DyJGG.js → Dffa6mVP.js} +1 -1
  38. package/build/client/_app/immutable/chunks/{D8aFfI6M.js → DgzenGSu.js} +1 -1
  39. package/build/client/_app/immutable/chunks/{1hoFVlwF.js → DqaGnr0n.js} +4 -4
  40. package/build/client/_app/immutable/chunks/{CE48ZXRi.js → Drf3oeac.js} +1 -1
  41. package/build/client/_app/immutable/chunks/{CmCoqHco.js → EBvoHjF1.js} +1 -1
  42. package/build/client/_app/immutable/chunks/{Cumsgxi9.js → Fqo6xqtt.js} +1 -1
  43. package/build/client/_app/immutable/chunks/QDQklEwM.js +1 -0
  44. package/build/client/_app/immutable/chunks/{zMHAx0Qk.js → Q_gMk3PN.js} +1 -1
  45. package/build/client/_app/immutable/chunks/{Wv7WdG7L.js → XHkT9caI.js} +1 -1
  46. package/build/client/_app/immutable/chunks/{B3CyqxdZ.js → Zxe_1j0j.js} +1 -1
  47. package/build/client/_app/immutable/chunks/{Bysr0gLv.js → czbfzgw3.js} +1 -1
  48. package/build/client/_app/immutable/chunks/{BdcZtdph.js → mlMCI16G.js} +1 -1
  49. package/build/client/_app/immutable/chunks/{BEobpKJ6.js → qFFXeAvY.js} +1 -1
  50. package/build/client/_app/immutable/entry/{app.BdutA_ce.js → app.C_pWXh8R.js} +2 -2
  51. package/build/client/_app/immutable/entry/start.DfbNX0kb.js +1 -0
  52. package/build/client/_app/immutable/nodes/{1.BBwvzKm5.js → 1.DN_p76XO.js} +1 -1
  53. package/build/client/_app/immutable/nodes/3.B0eShLlr.js +1 -0
  54. package/build/client/_app/version.json +1 -1
  55. package/build/server/chunks/{0-DpiwjOzQ.js → 0-rXmaDIAK.js} +3 -3
  56. package/build/server/chunks/{0-DpiwjOzQ.js.map → 0-rXmaDIAK.js.map} +1 -1
  57. package/build/server/chunks/{1-DLxoXeuD.js → 1-CEFNOpUG.js} +2 -2
  58. package/build/server/chunks/{1-DLxoXeuD.js.map → 1-CEFNOpUG.js.map} +1 -1
  59. package/build/server/chunks/{2-Cy9PX2zK.js → 2-qGWtN2-9.js} +3 -2
  60. package/build/server/chunks/{2-Cy9PX2zK.js.map → 2-qGWtN2-9.js.map} +1 -1
  61. package/build/server/chunks/{3-DIjT-1nt.js → 3-OUU46X3b.js} +6 -7
  62. package/build/server/chunks/3-OUU46X3b.js.map +1 -0
  63. package/build/server/chunks/{_page.svelte-XhzZOhTs.js → _page.svelte-DcqVlJwT.js} +13 -14
  64. package/build/server/chunks/_page.svelte-DcqVlJwT.js.map +1 -0
  65. package/build/server/chunks/_server.ts-BOWeAYnM.js +13 -0
  66. package/build/server/chunks/_server.ts-BOWeAYnM.js.map +1 -0
  67. package/build/server/chunks/{_server.ts-CEtvrNT1.js → _server.ts-BbMhMik1.js} +4 -3
  68. package/build/server/chunks/_server.ts-BbMhMik1.js.map +1 -0
  69. package/build/server/chunks/{_server.ts-b4ynvdd4.js → _server.ts-BhmTJZsP.js} +3 -4
  70. package/build/server/chunks/_server.ts-BhmTJZsP.js.map +1 -0
  71. package/build/server/chunks/{_server.ts-DCa-_qe7.js → _server.ts-BjSxqsHx.js} +5 -7
  72. package/build/server/chunks/_server.ts-BjSxqsHx.js.map +1 -0
  73. package/build/server/chunks/{_server.ts-sRxHDQa9.js → _server.ts-C7d7vtwn.js} +3 -2
  74. package/build/server/chunks/_server.ts-C7d7vtwn.js.map +1 -0
  75. package/build/server/chunks/{_server.ts-aWI5JVTi.js → _server.ts-D9nBKsq1.js} +2 -2
  76. package/build/server/chunks/{_server.ts-aWI5JVTi.js.map → _server.ts-D9nBKsq1.js.map} +1 -1
  77. package/build/server/chunks/_server.ts-DTGwAmWz.js +14 -0
  78. package/build/server/chunks/_server.ts-DTGwAmWz.js.map +1 -0
  79. package/build/server/chunks/{_server.ts-DVH0ejp0.js → _server.ts-DiMlmks0.js} +2 -2
  80. package/build/server/chunks/{_server.ts-DVH0ejp0.js.map → _server.ts-DiMlmks0.js.map} +1 -1
  81. package/build/server/chunks/{hooks.server-sBuk2932.js → hooks.server-DigZpFgW.js} +4 -3
  82. package/build/server/chunks/{hooks.server-sBuk2932.js.map → hooks.server-DigZpFgW.js.map} +1 -1
  83. package/build/server/chunks/{idle-timer-CouFy_WF.js → idle-timer-BshN5Svi.js} +3 -2
  84. package/build/server/chunks/idle-timer-BshN5Svi.js.map +1 -0
  85. package/build/server/chunks/{session-manager-Vdr0BxAo.js → session-manager-scAVAR7S.js} +39 -41
  86. package/build/server/chunks/session-manager-scAVAR7S.js.map +1 -0
  87. package/build/server/index.js +2 -2
  88. package/build/server/index.js.map +1 -1
  89. package/build/server/manifest.js +13 -20
  90. package/build/server/manifest.js.map +1 -1
  91. package/dist/cli/commands/clean.js +33 -29
  92. package/dist/cli/commands/export.js +5 -8
  93. package/dist/cli/commands/feedback.js +5 -8
  94. package/dist/cli/commands/init.js +2 -1
  95. package/dist/cli/commands/review.js +18 -121
  96. package/dist/cli/commands/status.js +20 -23
  97. package/dist/cli/commands/stop.js +7 -15
  98. package/dist/cli/errors.js +23 -0
  99. package/dist/cli/export-html.js +1 -1
  100. package/dist/cli/index.js +21 -5
  101. package/dist/cli/markdown-parser.js +117 -132
  102. package/dist/cli/markdown-to-plan.js +1 -50
  103. package/dist/cli/review-session.js +130 -0
  104. package/dist/cli/server-client.js +20 -33
  105. package/dist/cli/session-reader.js +20 -47
  106. package/dist/cli/session-resolver.js +10 -0
  107. package/dist/lib/server/session-manager.js +115 -0
  108. package/dist/lib/utils/status.js +53 -0
  109. package/package.json +1 -1
  110. package/build/client/_app/immutable/assets/0.CltY7ilp.css +0 -1
  111. package/build/client/_app/immutable/chunks/CULHGyhn.js +0 -1
  112. package/build/client/_app/immutable/chunks/DPsQ0F5p.js +0 -3
  113. package/build/client/_app/immutable/chunks/UfQGGAux.js +0 -1
  114. package/build/client/_app/immutable/entry/start.CTfow7ge.js +0 -1
  115. package/build/client/_app/immutable/nodes/3.DHzG8WJV.js +0 -1
  116. package/build/server/chunks/3-DIjT-1nt.js.map +0 -1
  117. package/build/server/chunks/_page.svelte-XhzZOhTs.js.map +0 -1
  118. package/build/server/chunks/_server.ts-BkcqX0Gw.js +0 -14
  119. package/build/server/chunks/_server.ts-BkcqX0Gw.js.map +0 -1
  120. package/build/server/chunks/_server.ts-C9Rz5pqb.js +0 -15
  121. package/build/server/chunks/_server.ts-C9Rz5pqb.js.map +0 -1
  122. package/build/server/chunks/_server.ts-CEtvrNT1.js.map +0 -1
  123. package/build/server/chunks/_server.ts-DCa-_qe7.js.map +0 -1
  124. package/build/server/chunks/_server.ts-b4ynvdd4.js.map +0 -1
  125. package/build/server/chunks/_server.ts-r59HGb-h.js +0 -22
  126. package/build/server/chunks/_server.ts-r59HGb-h.js.map +0 -1
  127. package/build/server/chunks/_server.ts-sRxHDQa9.js.map +0 -1
  128. package/build/server/chunks/idle-timer-CouFy_WF.js.map +0 -1
  129. package/build/server/chunks/session-manager-Vdr0BxAo.js.map +0 -1
  130. /package/build/client/_app/immutable/nodes/{0.D7ZwKtS7.js → 0.CuhA9F69.js} +0 -0
@@ -9,19 +9,24 @@ import { spawn, execSync } from "node:child_process";
9
9
  import { createServer } from "node:net";
10
10
  export const DEFAULT_BASE_PORT = 5181;
11
11
  export const MAX_PORT = 5199;
12
- export function getPackageDir() {
12
+ export async function fetchWithTimeout(url, options, timeoutMs) {
13
+ const controller = new AbortController();
14
+ const timeout = setTimeout(() => controller.abort(), timeoutMs);
15
+ try {
16
+ return await fetch(url, { ...options, signal: controller.signal });
17
+ }
18
+ finally {
19
+ clearTimeout(timeout);
20
+ }
21
+ }
22
+ function getPackageDir() {
13
23
  const thisFile = fileURLToPath(import.meta.url);
14
24
  // dist/cli/server-client.js -> package root
15
25
  return resolve(dirname(thisFile), "../..");
16
26
  }
17
27
  export async function checkHealth(port) {
18
28
  try {
19
- const controller = new AbortController();
20
- const timeout = setTimeout(() => controller.abort(), 500);
21
- const res = await fetch(`http://localhost:${port}/api/health`, {
22
- signal: controller.signal,
23
- });
24
- clearTimeout(timeout);
29
+ const res = await fetchWithTimeout(`http://localhost:${port}/api/health`, {}, 500);
25
30
  if (!res.ok)
26
31
  return null;
27
32
  return (await res.json());
@@ -48,7 +53,7 @@ function writeLock(sessionDir, port, pid) {
48
53
  mkdirSync(sessionDir, { recursive: true });
49
54
  writeFileSync(lockFilePath(sessionDir), JSON.stringify({ port, pid }));
50
55
  }
51
- function clearLock(sessionDir) {
56
+ export function clearLock(sessionDir) {
52
57
  try {
53
58
  unlinkSync(lockFilePath(sessionDir));
54
59
  }
@@ -115,8 +120,7 @@ function startServer(sessionDir, port) {
115
120
  const packageDir = getPackageDir();
116
121
  const buildEntry = join(packageDir, "build", "index.js");
117
122
  if (!existsSync(buildEntry)) {
118
- console.error(`Error: Server build not found at ${buildEntry}\nRun 'npm run build:server' in the plan-assistant package first.`);
119
- process.exit(1);
123
+ throw new Error(`Server build not found at ${buildEntry}\nRun 'npm run build:server' in the plan-assistant package first.`);
120
124
  }
121
125
  return new Promise((resolvePromise, reject) => {
122
126
  const child = spawn("node", [buildEntry], {
@@ -135,12 +139,7 @@ function startServer(sessionDir, port) {
135
139
  const interval = setInterval(async () => {
136
140
  attempts++;
137
141
  try {
138
- const controller = new AbortController();
139
- const timeout = setTimeout(() => controller.abort(), 1000);
140
- const res = await fetch(`http://localhost:${port}/api/health`, {
141
- signal: controller.signal,
142
- });
143
- clearTimeout(timeout);
142
+ const res = await fetchWithTimeout(`http://localhost:${port}/api/health`, {}, 1000);
144
143
  if (res.ok) {
145
144
  clearInterval(interval);
146
145
  resolvePromise(pid);
@@ -156,16 +155,10 @@ function startServer(sessionDir, port) {
156
155
  });
157
156
  }
158
157
  export async function launchServer(sessionDir, port) {
159
- process.stdout.write(`Starting Plan Assistant server on port ${port}...`);
160
- try {
161
- const pid = await startServer(sessionDir, port);
162
- writeLock(sessionDir, port, pid);
163
- console.log(" ready.");
164
- }
165
- catch (err) {
166
- console.error(` failed: ${err}`);
167
- process.exit(1);
168
- }
158
+ process.stderr.write(`Starting Plan Assistant server on port ${port}...`);
159
+ const pid = await startServer(sessionDir, port);
160
+ writeLock(sessionDir, port, pid);
161
+ console.error(" ready.");
169
162
  }
170
163
  export async function stopServer(sessionDir) {
171
164
  // Try lock file first
@@ -173,13 +166,7 @@ export async function stopServer(sessionDir) {
173
166
  const port = lock?.port;
174
167
  if (port) {
175
168
  try {
176
- const controller = new AbortController();
177
- const timeout = setTimeout(() => controller.abort(), 2000);
178
- await fetch(`http://localhost:${port}/api/shutdown`, {
179
- method: "POST",
180
- signal: controller.signal,
181
- });
182
- clearTimeout(timeout);
169
+ await fetchWithTimeout(`http://localhost:${port}/api/shutdown`, { method: "POST" }, 2000);
183
170
  clearLock(sessionDir);
184
171
  return true;
185
172
  }
@@ -1,45 +1,14 @@
1
1
  /**
2
2
  * Session data reading and feedback watching.
3
- * CLI-side equivalent of the server's session-manager.
3
+ * Read functions are imported from session-manager (single implementation).
4
4
  */
5
- import { readFileSync, existsSync, readdirSync, statSync } from "node:fs";
5
+ import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
6
6
  import { join, dirname } from "node:path";
7
7
  import { watch } from "chokidar";
8
8
  import { outputJson } from "./output.js";
9
9
  import { stopServer } from "./server-client.js";
10
- export function readMeta(sessionDir) {
11
- const path = join(sessionDir, "meta.json");
12
- if (!existsSync(path))
13
- return null;
14
- try {
15
- return JSON.parse(readFileSync(path, "utf-8"));
16
- }
17
- catch {
18
- return null;
19
- }
20
- }
21
- export function readFeedback(sessionDir) {
22
- const path = join(sessionDir, "feedback.json");
23
- if (!existsSync(path))
24
- return null;
25
- try {
26
- return JSON.parse(readFileSync(path, "utf-8"));
27
- }
28
- catch {
29
- return null;
30
- }
31
- }
32
- export function readPlan(sessionDir) {
33
- const path = join(sessionDir, "plan.json");
34
- if (!existsSync(path))
35
- return null;
36
- try {
37
- return JSON.parse(readFileSync(path, "utf-8"));
38
- }
39
- catch {
40
- return null;
41
- }
42
- }
10
+ import { readMeta, readFeedbackByDir as readFeedback, readPlanByDir as readPlan, } from "../lib/server/session-manager.js";
11
+ export { readMeta, readFeedback, readPlan };
43
12
  /**
44
13
  * Find all session directories under .plan-sessions/ in the given directory
45
14
  * and all parent directories.
@@ -86,8 +55,8 @@ export function findSessionDirs(startDir) {
86
55
  return entries;
87
56
  }
88
57
  // ── Feedback watching ──────────────────────────────────────────────
89
- const EXIT_APPROVED = 0;
90
- const EXIT_NEEDS_WORK = 3;
58
+ import { CliExitCode } from "./errors.js";
59
+ import { EXIT_APPROVED, EXIT_NEEDS_WORK } from "./commands/status.js";
91
60
  async function outputFeedbackResult(feedback, sessionId, planTitle, sessionDir) {
92
61
  // Stop the server — review cycle is complete
93
62
  const parentDir = dirname(sessionDir);
@@ -104,9 +73,9 @@ async function outputFeedbackResult(feedback, sessionId, planTitle, sessionDir)
104
73
  comments: unresolvedComments,
105
74
  commentCount: unresolvedComments.length,
106
75
  });
107
- process.exit(feedback.status === "approved" ? EXIT_APPROVED : EXIT_NEEDS_WORK);
76
+ throw new CliExitCode(feedback.status === "approved" ? EXIT_APPROVED : EXIT_NEEDS_WORK);
108
77
  }
109
- export async function waitForFeedback(feedbackPath, sessionId, planTitle, mdWatcher, sessionDir) {
78
+ export async function awaitReviewFeedback(feedbackPath, sessionId, planTitle, mdWatcher, sessionDir) {
110
79
  // Check if feedback already submitted
111
80
  if (existsSync(feedbackPath)) {
112
81
  try {
@@ -125,14 +94,18 @@ export async function waitForFeedback(feedbackPath, sessionId, planTitle, mdWatc
125
94
  const fbWatcher = watch(feedbackPath, {
126
95
  awaitWriteFinish: { stabilityThreshold: 200, pollInterval: 100 },
127
96
  });
97
+ const cleanup = () => {
98
+ fbWatcher.close();
99
+ mdWatcher.close();
100
+ process.removeListener("SIGINT", onSigint);
101
+ };
128
102
  const check = async () => {
129
103
  try {
130
104
  if (!existsSync(feedbackPath))
131
105
  return;
132
106
  const data = JSON.parse(readFileSync(feedbackPath, "utf-8"));
133
107
  if (data.status === "approved" || data.status === "needs-work") {
134
- fbWatcher.close();
135
- mdWatcher.close();
108
+ cleanup();
136
109
  await outputFeedbackResult(data, sessionId, planTitle, sessionDir);
137
110
  resolve();
138
111
  }
@@ -141,13 +114,13 @@ export async function waitForFeedback(feedbackPath, sessionId, planTitle, mdWatc
141
114
  /* ignore parse errors during writes */
142
115
  }
143
116
  };
117
+ const onSigint = () => {
118
+ cleanup();
119
+ console.error("\nStopped watching.");
120
+ throw new CliExitCode(0);
121
+ };
144
122
  fbWatcher.on("change", check);
145
123
  fbWatcher.on("add", check);
146
- process.on("SIGINT", () => {
147
- fbWatcher.close();
148
- mdWatcher.close();
149
- console.error("\nStopped watching.");
150
- process.exit(0);
151
- });
124
+ process.on("SIGINT", onSigint);
152
125
  });
153
126
  }
@@ -8,6 +8,8 @@
8
8
  import { existsSync } from "node:fs";
9
9
  import { resolve, dirname, join } from "node:path";
10
10
  import { sessionIdFromPath } from "./markdown-to-plan.js";
11
+ import { outputError } from "./output.js";
12
+ import { CliError } from "./errors.js";
11
13
  const SESSION_ID_PATTERN = /^[0-9a-f]{8}$/i;
12
14
  export function resolveSession(idOrFile) {
13
15
  // Strategy 1: File path
@@ -36,3 +38,11 @@ export function resolveSession(idOrFile) {
36
38
  }
37
39
  return null;
38
40
  }
41
+ export function requireSession(idOrFile) {
42
+ const resolved = resolveSession(idOrFile);
43
+ if (!resolved) {
44
+ outputError(`Session not found for: ${idOrFile}`, "NOT_FOUND");
45
+ throw new CliError(`Session not found for: ${idOrFile}`);
46
+ }
47
+ return resolved;
48
+ }
@@ -0,0 +1,115 @@
1
+ import { readFileSync, writeFileSync, mkdirSync, existsSync, readdirSync, } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { homedir } from "node:os";
4
+ import { error } from "@sveltejs/kit";
5
+ /**
6
+ * Session storage root directory.
7
+ *
8
+ * The CLI creates sessions in `.plan-sessions/` adjacent to the markdown file,
9
+ * then passes that path to the server via the `SESSION_DIR` env var when spawning it.
10
+ * The fallback (`~/.plan-assistant/sessions`) is only used when the server runs standalone.
11
+ */
12
+ export function getBaseDir() {
13
+ return (process.env.SESSION_DIR || join(homedir(), ".plan-assistant", "sessions"));
14
+ }
15
+ export function validateSessionId(sessionId) {
16
+ if (!/^[a-f0-9]{1,16}$/.test(sessionId)) {
17
+ throw new Error(`Invalid session ID: ${sessionId}`);
18
+ }
19
+ }
20
+ function getSessionDir(sessionId) {
21
+ validateSessionId(sessionId);
22
+ return join(getBaseDir(), sessionId);
23
+ }
24
+ // ── Shared JSON read helper ──────────────────────────────────────
25
+ export function readJsonFile(filePath) {
26
+ if (!existsSync(filePath))
27
+ return null;
28
+ try {
29
+ return JSON.parse(readFileSync(filePath, "utf-8"));
30
+ }
31
+ catch {
32
+ return null;
33
+ }
34
+ }
35
+ // ── Path-based reads (used by CLI via session-reader) ────────────
36
+ export function readMeta(sessionDir) {
37
+ return readJsonFile(join(sessionDir, "meta.json"));
38
+ }
39
+ export function readFeedbackByDir(sessionDir) {
40
+ return readJsonFile(join(sessionDir, "feedback.json"));
41
+ }
42
+ export function readPlanByDir(sessionDir) {
43
+ return readJsonFile(join(sessionDir, "plan.json"));
44
+ }
45
+ // ── ID-based reads (used by server routes) ───────────────────────
46
+ export function listSessions() {
47
+ const baseDir = getBaseDir();
48
+ mkdirSync(baseDir, { recursive: true });
49
+ const entries = readdirSync(baseDir, { withFileTypes: true });
50
+ const sessions = [];
51
+ for (const entry of entries) {
52
+ if (!entry.isDirectory())
53
+ continue;
54
+ const meta = readJsonFile(join(baseDir, entry.name, "meta.json"));
55
+ if (meta)
56
+ sessions.push(meta);
57
+ }
58
+ return sessions.sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime());
59
+ }
60
+ export function getSession(sessionId) {
61
+ return readMeta(getSessionDir(sessionId));
62
+ }
63
+ export function requireSession(sessionId) {
64
+ const session = getSession(sessionId);
65
+ if (!session)
66
+ throw error(404, "Session not found");
67
+ return session;
68
+ }
69
+ export function createSession(sessionId, meta) {
70
+ const dir = getSessionDir(sessionId);
71
+ mkdirSync(dir, { recursive: true });
72
+ mkdirSync(join(dir, "versions"), { recursive: true });
73
+ writeFileSync(join(dir, "meta.json"), JSON.stringify(meta, null, 2));
74
+ }
75
+ export function getPlan(sessionId) {
76
+ return readPlanByDir(getSessionDir(sessionId));
77
+ }
78
+ export function getFeedback(sessionId) {
79
+ return readFeedbackByDir(getSessionDir(sessionId));
80
+ }
81
+ export function saveFeedback(sessionId, feedback) {
82
+ const dir = getSessionDir(sessionId);
83
+ mkdirSync(dir, { recursive: true });
84
+ writeFileSync(join(dir, "feedback.json"), JSON.stringify(feedback, null, 2));
85
+ }
86
+ export function snapshotVersion(sessionId, plan) {
87
+ const dir = join(getSessionDir(sessionId), "versions");
88
+ mkdirSync(dir, { recursive: true });
89
+ const versionFile = join(dir, `v${plan.meta.version}.json`);
90
+ writeFileSync(versionFile, JSON.stringify(plan, null, 2));
91
+ }
92
+ export function listVersions(sessionId) {
93
+ const dir = join(getSessionDir(sessionId), "versions");
94
+ if (!existsSync(dir))
95
+ return [];
96
+ return readdirSync(dir)
97
+ .filter((f) => f.startsWith("v") && f.endsWith(".json"))
98
+ .map((f) => parseInt(f.slice(1, -5), 10))
99
+ .filter((n) => !isNaN(n))
100
+ .sort((a, b) => a - b);
101
+ }
102
+ export function updateSessionStatus(sessionId, status) {
103
+ const meta = getSession(sessionId);
104
+ if (!meta)
105
+ throw new Error(`Session not found: ${sessionId}`);
106
+ const updated = {
107
+ ...meta,
108
+ status,
109
+ updatedAt: new Date().toISOString(),
110
+ };
111
+ writeFileSync(join(getSessionDir(sessionId), "meta.json"), JSON.stringify(updated, null, 2));
112
+ }
113
+ export function getVersion(sessionId, version) {
114
+ return readJsonFile(join(getSessionDir(sessionId), "versions", `v${version}.json`));
115
+ }
@@ -0,0 +1,53 @@
1
+ export const STATUS_LABELS = {
2
+ 'pending': 'Pending',
3
+ 'approved': 'Approved',
4
+ 'needs-work': 'Needs Work',
5
+ };
6
+ export function statusLabel(status) {
7
+ return STATUS_LABELS[status] ?? 'Pending';
8
+ }
9
+ export function statusBadgeClass(status) {
10
+ switch (status) {
11
+ case "approved":
12
+ return "bg-green/15 text-green";
13
+ case "needs-work":
14
+ return "bg-orange/15 text-orange";
15
+ default:
16
+ return "bg-accent/15 text-accent";
17
+ }
18
+ }
19
+ export function sessionStatusBadgeClass(status) {
20
+ switch (status) {
21
+ case "approved":
22
+ return "bg-green/15 text-green";
23
+ case "archived":
24
+ return "bg-text-dim/15 text-text-dim";
25
+ case "active":
26
+ default:
27
+ return "bg-accent/15 text-accent";
28
+ }
29
+ }
30
+ export function diffStatusColor(status) {
31
+ switch (status) {
32
+ case "added":
33
+ return "border-l-green bg-green/5";
34
+ case "removed":
35
+ return "border-l-red bg-red/5";
36
+ case "changed":
37
+ return "border-l-orange bg-orange/5";
38
+ default:
39
+ return "border-l-border";
40
+ }
41
+ }
42
+ export function diffStatusBadge(status) {
43
+ switch (status) {
44
+ case "added":
45
+ return "bg-green/15 text-green";
46
+ case "removed":
47
+ return "bg-red/15 text-red";
48
+ case "changed":
49
+ return "bg-orange/15 text-orange";
50
+ default:
51
+ return "bg-text-dim/15 text-text-dim";
52
+ }
53
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "plan-assistant",
3
- "version": "1.4.5",
3
+ "version": "1.6.0-alpha.1",
4
4
  "description": "Review implementation plans in the browser with live reload",
5
5
  "homepage": "https://github.com/sanderdatema/plan_assistant#readme",
6
6
  "bugs": {
@@ -1 +0,0 @@
1
- /*! tailwindcss v4.2.0 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-ease:initial}}}@layer theme{:root,:host{--font-sans:"Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif;--font-mono:"JetBrains Mono", "SF Mono", SFMono-Regular, Consolas, monospace;--color-red-200:oklch(88.5% .062 18.334);--color-red-900:oklch(39.6% .141 25.723);--color-green-50:oklch(98.2% .018 155.826);--color-green-200:oklch(92.5% .084 155.995);--color-green-600:oklch(62.7% .194 149.214);--color-green-800:oklch(44.8% .119 151.328);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-slate-100:oklch(96.8% .007 247.896);--color-slate-200:oklch(92.9% .013 255.508);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-600:oklch(44.6% .043 257.281);--color-slate-700:oklch(37.2% .044 257.287);--color-slate-800:oklch(27.9% .041 260.031);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-4xl:56rem;--container-5xl:64rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wide:.025em;--leading-relaxed:1.625;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--ease-out:cubic-bezier(0, 0, .2, 1);--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:"Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif;--default-mono-font-family:"JetBrains Mono", "SF Mono", SFMono-Regular, Consolas, monospace;--color-bg:#0d1117;--color-surface:#161b22;--color-surface2:#1c2129;--color-border:#30363d;--color-text:#e6edf3;--color-text-dim:#8b949e;--color-accent:#58a6ff;--color-green:#3fb950;--color-red:#f85149;--color-orange:#d29922;--color-purple:#bc8cff}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*{border-color:#30363d}body{color:#e6edf3;background-color:#0d1117;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif;line-height:1.6}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.top-0{top:calc(var(--spacing) * 0)}.top-2{top:calc(var(--spacing) * 2)}.right-0{right:calc(var(--spacing) * 0)}.right-4{right:calc(var(--spacing) * 4)}.bottom-0{bottom:calc(var(--spacing) * 0)}.left-0{left:calc(var(--spacing) * 0)}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.ml-2{margin-left:calc(var(--spacing) * 2)}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.table{display:table}.h-\[3px\]{height:3px}.h-full{height:100%}.max-h-\[calc\(100vh-1rem\)\]{max-height:calc(100vh - 1rem)}.min-h-screen{min-height:100vh}.w-32{width:calc(var(--spacing) * 32)}.w-80{width:calc(var(--spacing) * 80)}.w-full{width:100%}.max-w-4xl{max-width:var(--container-4xl)}.max-w-5xl{max-width:var(--container-5xl)}.flex-1{flex:1}.flex-shrink{flex-shrink:1}.border-collapse{border-collapse:collapse}.rotate-90{rotate:90deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.cursor-pointer{cursor:pointer}.resize{resize:both}.resize-y{resize:vertical}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-border>:not(:last-child)){border-color:#30363d}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l-3{border-left-style:var(--tw-border-style);border-left-width:3px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-accent\/30{border-color:#58a6ff4d}.border-blue-500{border-color:var(--color-blue-500)}.border-border{border-color:#30363d}.border-green\/30{border-color:#3fb9504d}.border-orange\/30{border-color:#d299224d}.border-slate-600{border-color:var(--color-slate-600)}.border-slate-600\/40{border-color:#45556c66}@supports (color:color-mix(in lab,red,red)){.border-slate-600\/40{border-color:color-mix(in oklab,var(--color-slate-600) 40%,transparent)}}.border-slate-700{border-color:var(--color-slate-700)}.border-transparent{border-color:#0000}.border-white\/10{border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.border-white\/10{border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.border-l-border{border-left-color:#30363d}.border-l-green{border-left-color:#3fb950}.border-l-orange{border-left-color:#d29922}.border-l-red{border-left-color:#f85149}.bg-\[\#0f172a\]{background-color:#0f172a}.bg-accent\/15{background-color:#58a6ff26}.bg-bg{background-color:#0d1117}.bg-blue-600{background-color:var(--color-blue-600)}.bg-blue-700{background-color:var(--color-blue-700)}.bg-green{background-color:#3fb950}.bg-green-600{background-color:var(--color-green-600)}.bg-green-800{background-color:var(--color-green-800)}.bg-green\/5{background-color:#3fb9500d}.bg-green\/15{background-color:#3fb95026}.bg-orange\/5{background-color:#d299220d}.bg-orange\/15{background-color:#d2992226}.bg-red-900{background-color:var(--color-red-900)}.bg-red\/5{background-color:#f851490d}.bg-red\/15{background-color:#f8514926}.bg-slate-700{background-color:var(--color-slate-700)}.bg-slate-800\/40{background-color:#1d293d66}@supports (color:color-mix(in lab,red,red)){.bg-slate-800\/40{background-color:color-mix(in oklab,var(--color-slate-800) 40%,transparent)}}.bg-slate-800\/90{background-color:#1d293de6}@supports (color:color-mix(in lab,red,red)){.bg-slate-800\/90{background-color:color-mix(in oklab,var(--color-slate-800) 90%,transparent)}}.bg-surface{background-color:#161b22}.bg-surface2{background-color:#1c2129}.bg-text-dim\/15{background-color:#8b949e26}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pr-80{padding-right:calc(var(--spacing) * 80)}.pr-\[22rem\]{padding-right:22rem}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-20{padding-bottom:calc(var(--spacing) * 20)}.pl-1{padding-left:calc(var(--spacing) * 1)}.pl-5{padding-left:calc(var(--spacing) * 5)}.pl-8{padding-left:calc(var(--spacing) * 8)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:JetBrains Mono,SF Mono,SFMono-Regular,Consolas,monospace}.font-sans{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[0\.7rem\]{font-size:.7rem}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.whitespace-pre-wrap{white-space:pre-wrap}.text-accent{color:#58a6ff}.text-blue-300{color:var(--color-blue-300)}.text-green{color:#3fb950}.text-green-50{color:var(--color-green-50)}.text-green-200{color:var(--color-green-200)}.text-orange{color:#d29922}.text-red{color:#f85149}.text-red-200{color:var(--color-red-200)}.text-slate-100{color:var(--color-slate-100)}.text-slate-200{color:var(--color-slate-200)}.text-slate-300{color:var(--color-slate-300)}.text-slate-400{color:var(--color-slate-400)}.text-text{color:#e6edf3}.text-text-dim{color:#8b949e}.text-white{color:var(--color-white)}.uppercase{text-transform:uppercase}.italic{font-style:italic}.line-through{text-decoration-line:line-through}.accent-green{accent-color:#3fb950}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-black\/35{--tw-shadow-color:#00000059}@supports (color:color-mix(in lab,red,red)){.shadow-black\/35{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 35%, transparent) var(--tw-shadow-alpha), transparent)}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-400{--tw-duration:.4s;transition-duration:.4s}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}@media(hover:hover){.hover\:border-accent\/50:hover{border-color:#58a6ff80}.hover\:bg-blue-500:hover{background-color:var(--color-blue-500)}.hover\:bg-orange\/25:hover{background-color:#d2992240}.hover\:bg-surface:hover{background-color:#161b22}.hover\:bg-surface2:hover{background-color:#1c2129}.hover\:text-accent:hover{color:#58a6ff}.hover\:text-text:hover{color:#e6edf3}.hover\:brightness-110:hover{--tw-brightness:brightness(110%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}}.focus\:border-blue-500:focus{border-color:var(--color-blue-500)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.disabled\:opacity-50:disabled{opacity:.5}}pre code.hljs{padding:1em;display:block;overflow-x:auto}code.hljs{padding:3px 5px}.hljs{color:#c9d1d9;background:#0d1117}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#ff7b72}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#d2a8ff}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-variable{color:#79c0ff}.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#a5d6ff}.hljs-built_in,.hljs-symbol{color:#ffa657}.hljs-code,.hljs-comment,.hljs-formula{color:#8b949e}.hljs-name,.hljs-quote,.hljs-selector-pseudo,.hljs-selector-tag{color:#7ee787}.hljs-subst{color:#c9d1d9}.hljs-section{color:#1f6feb;font-weight:700}.hljs-bullet{color:#f2cc60}.hljs-emphasis{color:#c9d1d9;font-style:italic}.hljs-strong{color:#c9d1d9;font-weight:700}.hljs-addition{color:#aff5b4;background-color:#033a16}.hljs-deletion{color:#ffdcd7;background-color:#67060c}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@keyframes pulse{50%{opacity:.5}}
@@ -1 +0,0 @@
1
- import{ap as o,aq as n}from"./1hoFVlwF.js";const t=(a,r)=>o.lang.round(n.parse(a)[r]);export{t as c};
@@ -1,3 +0,0 @@
1
- var Qe=e=>{throw TypeError(e)};var $t=(e,t,n)=>t.has(e)||Qe("Cannot "+n);var S=(e,t,n)=>($t(e,t,"read from private field"),n?n.call(e):t.get(e)),P=(e,t,n)=>t.has(e)?Qe("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,n);import{b8 as Ce,b9 as Dt,d as O,g as j,b as N,aM as _e,ba as Bt}from"./CobJHAAW.js";import{o as et}from"./DGn8gxMH.js";const Y=[];function Fe(e,t=Ce){let n=null;const a=new Set;function r(c){if(Dt(e,c)&&(e=c,n)){const s=!Y.length;for(const l of a)l[1](),Y.push(l,e);if(s){for(let l=0;l<Y.length;l+=2)Y[l][0](Y[l+1]);Y.length=0}}}function i(c){r(c(e))}function o(c,s=Ce){const l=[c,s];return a.add(l),a.size===1&&(n=t(r,i)||Ce),c(e),()=>{a.delete(l),a.size===0&&n&&(n(),n=null)}}return{set:r,update:i,subscribe:o}}class Re{constructor(t,n){this.status=t,typeof n=="string"?this.body={message:n}:n?this.body=n:this.body={message:`Error: ${t}`}}toString(){return JSON.stringify(this.body)}}class Me{constructor(t,n){this.status=t,this.location=n}}class Ve extends Error{constructor(t,n,a){super(a),this.status=t,this.text=n}}new URL("sveltekit-internal://");function qt(e,t){return e==="/"||t==="ignore"?e:t==="never"?e.endsWith("/")?e.slice(0,-1):e:t==="always"&&!e.endsWith("/")?e+"/":e}function Ft(e){return e.split("%25").map(decodeURI).join("%25")}function Mt(e){for(const t in e)e[t]=decodeURIComponent(e[t]);return e}function Pe({href:e}){return e.split("#")[0]}function Vt(...e){let t=5381;for(const n of e)if(typeof n=="string"){let a=n.length;for(;a;)t=t*33^n.charCodeAt(--a)}else if(ArrayBuffer.isView(n)){const a=new Uint8Array(n.buffer,n.byteOffset,n.byteLength);let r=a.length;for(;r;)t=t*33^a[--r]}else throw new TypeError("value must be a string or TypedArray");return(t>>>0).toString(36)}new TextEncoder;const Gt=new TextDecoder;function Kt(e){const t=atob(e),n=new Uint8Array(t.length);for(let a=0;a<t.length;a++)n[a]=t.charCodeAt(a);return n}const Yt=window.fetch;window.fetch=(e,t)=>((e instanceof Request?e.method:(t==null?void 0:t.method)||"GET")!=="GET"&&Q.delete(Ge(e)),Yt(e,t));const Q=new Map;function Wt(e,t){const n=Ge(e,t),a=document.querySelector(n);if(a!=null&&a.textContent){a.remove();let{body:r,...i}=JSON.parse(a.textContent);const o=a.getAttribute("data-ttl");return o&&Q.set(n,{body:r,init:i,ttl:1e3*Number(o)}),a.getAttribute("data-b64")!==null&&(r=Kt(r)),Promise.resolve(new Response(r,i))}return window.fetch(e,t)}function zt(e,t,n){if(Q.size>0){const a=Ge(e,n),r=Q.get(a);if(r){if(performance.now()<r.ttl&&["default","force-cache","only-if-cached",void 0].includes(n==null?void 0:n.cache))return new Response(r.body,r.init);Q.delete(a)}}return window.fetch(t,n)}function Ge(e,t){let a=`script[data-sveltekit-fetched][data-url=${JSON.stringify(e instanceof Request?e.url:e)}]`;if(t!=null&&t.headers||t!=null&&t.body){const r=[];t.headers&&r.push([...new Headers(t.headers)].join(",")),t.body&&(typeof t.body=="string"||ArrayBuffer.isView(t.body))&&r.push(t.body),a+=`[data-hash="${Vt(...r)}"]`}return a}const Ht=/^(\[)?(\.\.\.)?(\w+)(?:=(\w+))?(\])?$/;function Jt(e){const t=[];return{pattern:e==="/"?/^\/$/:new RegExp(`^${Zt(e).map(a=>{const r=/^\[\.\.\.(\w+)(?:=(\w+))?\]$/.exec(a);if(r)return t.push({name:r[1],matcher:r[2],optional:!1,rest:!0,chained:!0}),"(?:/([^]*))?";const i=/^\[\[(\w+)(?:=(\w+))?\]\]$/.exec(a);if(i)return t.push({name:i[1],matcher:i[2],optional:!0,rest:!1,chained:!0}),"(?:/([^/]+))?";if(!a)return;const o=a.split(/\[(.+?)\](?!\])/);return"/"+o.map((s,l)=>{if(l%2){if(s.startsWith("x+"))return xe(String.fromCharCode(parseInt(s.slice(2),16)));if(s.startsWith("u+"))return xe(String.fromCharCode(...s.slice(2).split("-").map(h=>parseInt(h,16))));const f=Ht.exec(s),[,u,m,d,p]=f;return t.push({name:d,matcher:p,optional:!!u,rest:!!m,chained:m?l===1&&o[0]==="":!1}),m?"([^]*?)":u?"([^/]*)?":"([^/]+?)"}return xe(s)}).join("")}).join("")}/?$`),params:t}}function Xt(e){return e!==""&&!/^\([^)]+\)$/.test(e)}function Zt(e){return e.slice(1).split("/").filter(Xt)}function Qt(e,t,n){const a={},r=e.slice(1),i=r.filter(c=>c!==void 0);let o=0;for(let c=0;c<t.length;c+=1){const s=t[c];let l=r[c-o];if(s.chained&&s.rest&&o&&(l=r.slice(c-o,c+1).filter(f=>f).join("/"),o=0),l===void 0)if(s.rest)l="";else continue;if(!s.matcher||n[s.matcher](l)){a[s.name]=l;const f=t[c+1],u=r[c+1];f&&!f.rest&&f.optional&&u&&s.chained&&(o=0),!f&&!u&&Object.keys(a).length===i.length&&(o=0);continue}if(s.optional&&s.chained){o++;continue}return}if(!o)return a}function xe(e){return e.normalize().replace(/[[\]]/g,"\\$&").replace(/%/g,"%25").replace(/\//g,"%2[Ff]").replace(/\?/g,"%3[Ff]").replace(/#/g,"%23").replace(/[.*+?^${}()|\\]/g,"\\$&")}function en({nodes:e,server_loads:t,dictionary:n,matchers:a}){const r=new Set(t);return Object.entries(n).map(([c,[s,l,f]])=>{const{pattern:u,params:m}=Jt(c),d={id:c,exec:p=>{const h=u.exec(p);if(h)return Qt(h,m,a)},errors:[1,...f||[]].map(p=>e[p]),layouts:[0,...l||[]].map(o),leaf:i(s)};return d.errors.length=d.layouts.length=Math.max(d.errors.length,d.layouts.length),d});function i(c){const s=c<0;return s&&(c=~c),[s,e[c]]}function o(c){return c===void 0?c:[r.has(c),e[c]]}}function gt(e,t=JSON.parse){try{return t(sessionStorage[e])}catch{}}function tt(e,t,n=JSON.stringify){const a=n(t);try{sessionStorage[e]=a}catch{}}var ft;const C=((ft=globalThis.__sveltekit_qe4x74)==null?void 0:ft.base)??"";var ut;const tn=((ut=globalThis.__sveltekit_qe4x74)==null?void 0:ut.assets)??C??"",nn="1774005355251",mt="sveltekit:snapshot",_t="sveltekit:scroll",wt="sveltekit:states",rn="sveltekit:pageurl",z="sveltekit:history",ne="sveltekit:navigation",V={tap:1,hover:2,viewport:3,eager:4,off:-1,false:-1},Ie=location.origin;function yt(e){if(e instanceof URL)return e;let t=document.baseURI;if(!t){const n=document.getElementsByTagName("base");t=n.length?n[0].href:document.URL}return new URL(e,t)}function K(){return{x:pageXOffset,y:pageYOffset}}function W(e,t){return e.getAttribute(`data-sveltekit-${t}`)}const nt={...V,"":V.hover};function vt(e){let t=e.assignedSlot??e.parentNode;return(t==null?void 0:t.nodeType)===11&&(t=t.host),t}function bt(e,t){for(;e&&e!==t;){if(e.nodeName.toUpperCase()==="A"&&e.hasAttribute("href"))return e;e=vt(e)}}function Ne(e,t,n){let a;try{if(a=new URL(e instanceof SVGAElement?e.href.baseVal:e.href,document.baseURI),n&&a.hash.match(/^#[^/]/)){const c=location.hash.split("#")[1]||"/";a.hash=`#${c}${a.hash}`}}catch{}const r=e instanceof SVGAElement?e.target.baseVal:e.target,i=!a||!!r||Te(a,t,n)||(e.getAttribute("rel")||"").split(/\s+/).includes("external"),o=(a==null?void 0:a.origin)===Ie&&e.hasAttribute("download");return{url:a,external:i,target:r,download:o}}function we(e){let t=null,n=null,a=null,r=null,i=null,o=null,c=e;for(;c&&c!==document.documentElement;)a===null&&(a=W(c,"preload-code")),r===null&&(r=W(c,"preload-data")),t===null&&(t=W(c,"keepfocus")),n===null&&(n=W(c,"noscroll")),i===null&&(i=W(c,"reload")),o===null&&(o=W(c,"replacestate")),c=vt(c);function s(l){switch(l){case"":case"true":return!0;case"off":case"false":return!1;default:return}}return{preload_code:nt[a??"off"],preload_data:nt[r??"off"],keepfocus:s(t),noscroll:s(n),reload:s(i),replace_state:s(o)}}function rt(e){const t=Fe(e);let n=!0;function a(){n=!0,t.update(o=>o)}function r(o){n=!1,t.set(o)}function i(o){let c;return t.subscribe(s=>{(c===void 0||n&&s!==c)&&o(c=s)})}return{notify:a,set:r,subscribe:i}}const kt={v:()=>{}};function an(){const{set:e,subscribe:t}=Fe(!1);let n;async function a(){clearTimeout(n);try{const r=await fetch(`${tn}/_app/version.json`,{headers:{pragma:"no-cache","cache-control":"no-cache"}});if(!r.ok)return!1;const o=(await r.json()).version!==nn;return o&&(e(!0),kt.v(),clearTimeout(n)),o}catch{return!1}}return{subscribe:t,check:a}}function Te(e,t,n){return e.origin!==Ie||!e.pathname.startsWith(t)?!0:n?e.pathname!==location.pathname:!1}function Wn(e){}function on(e){const t=cn(e),n=new ArrayBuffer(t.length),a=new DataView(n);for(let r=0;r<n.byteLength;r++)a.setUint8(r,t.charCodeAt(r));return n}const sn="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";function cn(e){e.length%4===0&&(e=e.replace(/==?$/,""));let t="",n=0,a=0;for(let r=0;r<e.length;r++)n<<=6,n|=sn.indexOf(e[r]),a+=6,a===24&&(t+=String.fromCharCode((n&16711680)>>16),t+=String.fromCharCode((n&65280)>>8),t+=String.fromCharCode(n&255),n=a=0);return a===12?(n>>=4,t+=String.fromCharCode(n)):a===18&&(n>>=2,t+=String.fromCharCode((n&65280)>>8),t+=String.fromCharCode(n&255)),t}const ln=-1,fn=-2,un=-3,hn=-4,dn=-5,pn=-6,gn=-7;function mn(e,t){if(typeof e=="number")return i(e,!0);if(!Array.isArray(e)||e.length===0)throw new Error("Invalid input");const n=e,a=Array(n.length);let r=null;function i(o,c=!1){if(o===ln)return;if(o===un)return NaN;if(o===hn)return 1/0;if(o===dn)return-1/0;if(o===pn)return-0;if(c||typeof o!="number")throw new Error("Invalid input");if(o in a)return a[o];const s=n[o];if(!s||typeof s!="object")a[o]=s;else if(Array.isArray(s))if(typeof s[0]=="string"){const l=s[0],f=t&&Object.hasOwn(t,l)?t[l]:void 0;if(f){let u=s[1];if(typeof u!="number"&&(u=n.push(s[1])-1),r??(r=new Set),r.has(u))throw new Error("Invalid circular reference");return r.add(u),a[o]=f(i(u)),r.delete(u),a[o]}switch(l){case"Date":a[o]=new Date(s[1]);break;case"Set":const u=new Set;a[o]=u;for(let h=1;h<s.length;h+=1)u.add(i(s[h]));break;case"Map":const m=new Map;a[o]=m;for(let h=1;h<s.length;h+=2)m.set(i(s[h]),i(s[h+1]));break;case"RegExp":a[o]=new RegExp(s[1],s[2]);break;case"Object":const d=Object(s[1]);if(Object.hasOwn(d,"__proto__"))throw new Error("Cannot parse an object with a `__proto__` property");a[o]=d;break;case"BigInt":a[o]=BigInt(s[1]);break;case"null":const p=Object.create(null);a[o]=p;for(let h=1;h<s.length;h+=2){if(s[h]==="__proto__")throw new Error("Cannot parse an object with a `__proto__` property");p[s[h]]=i(s[h+1])}break;case"Int8Array":case"Uint8Array":case"Uint8ClampedArray":case"Int16Array":case"Uint16Array":case"Int32Array":case"Uint32Array":case"Float32Array":case"Float64Array":case"BigInt64Array":case"BigUint64Array":{if(n[s[1]][0]!=="ArrayBuffer")throw new Error("Invalid data");const h=globalThis[l],w=i(s[1]),_=new h(w);a[o]=s[2]!==void 0?_.subarray(s[2],s[3]):_;break}case"ArrayBuffer":{const h=s[1];if(typeof h!="string")throw new Error("Invalid ArrayBuffer encoding");const w=on(h);a[o]=w;break}case"Temporal.Duration":case"Temporal.Instant":case"Temporal.PlainDate":case"Temporal.PlainTime":case"Temporal.PlainDateTime":case"Temporal.PlainMonthDay":case"Temporal.PlainYearMonth":case"Temporal.ZonedDateTime":{const h=l.slice(9);a[o]=Temporal[h].from(s[1]);break}case"URL":{const h=new URL(s[1]);a[o]=h;break}case"URLSearchParams":{const h=new URLSearchParams(s[1]);a[o]=h;break}default:throw new Error(`Unknown type ${l}`)}}else if(s[0]===gn){const l=s[1];if(!Number.isInteger(l)||l<0)throw new Error("Invalid input");const f=new Array(l);a[o]=f;for(let u=2;u<s.length;u+=2){const m=s[u];if(!Number.isInteger(m)||m<0||m>=l)throw new Error("Invalid input");f[m]=i(s[u+1])}}else{const l=new Array(s.length);a[o]=l;for(let f=0;f<s.length;f+=1){const u=s[f];u!==fn&&(l[f]=i(u))}}else{const l={};a[o]=l;for(const f of Object.keys(s)){if(f==="__proto__")throw new Error("Cannot parse an object with a `__proto__` property");const u=s[f];l[f]=i(u)}}return a[o]}return i(0)}const Et=new Set(["load","prerender","csr","ssr","trailingSlash","config"]);[...Et];const _n=new Set([...Et]);[..._n];function wn(e){return e.filter(t=>t!=null)}const yn="x-sveltekit-invalidated",vn="x-sveltekit-trailing-slash";function ye(e){return e instanceof Re||e instanceof Ve?e.status:500}function bn(e){return e instanceof Ve?e.text:"Internal Error"}let U,re,Oe;const kn=et.toString().includes("$$")||/function \w+\(\) \{\}/.test(et.toString());var se,ie,ce,le,fe,ue,he,de,ht,pe,dt,ge,pt;kn?(U={data:{},form:null,error:null,params:{},route:{id:null},state:{},status:-1,url:new URL("https://example.com")},re={current:null},Oe={current:!1}):(U=new(ht=class{constructor(){P(this,se,O({}));P(this,ie,O(null));P(this,ce,O(null));P(this,le,O({}));P(this,fe,O({id:null}));P(this,ue,O({}));P(this,he,O(-1));P(this,de,O(new URL("https://example.com")))}get data(){return j(S(this,se))}set data(t){N(S(this,se),t)}get form(){return j(S(this,ie))}set form(t){N(S(this,ie),t)}get error(){return j(S(this,ce))}set error(t){N(S(this,ce),t)}get params(){return j(S(this,le))}set params(t){N(S(this,le),t)}get route(){return j(S(this,fe))}set route(t){N(S(this,fe),t)}get state(){return j(S(this,ue))}set state(t){N(S(this,ue),t)}get status(){return j(S(this,he))}set status(t){N(S(this,he),t)}get url(){return j(S(this,de))}set url(t){N(S(this,de),t)}},se=new WeakMap,ie=new WeakMap,ce=new WeakMap,le=new WeakMap,fe=new WeakMap,ue=new WeakMap,he=new WeakMap,de=new WeakMap,ht),re=new(dt=class{constructor(){P(this,pe,O(null))}get current(){return j(S(this,pe))}set current(t){N(S(this,pe),t)}},pe=new WeakMap,dt),Oe=new(pt=class{constructor(){P(this,ge,O(!1))}get current(){return j(S(this,ge))}set current(t){N(S(this,ge),t)}},ge=new WeakMap,pt),kt.v=()=>Oe.current=!0);function En(e){Object.assign(U,e)}const Sn="/__data.json",An=".html__data.json";function Rn(e){return e.endsWith(".html")?e.replace(/\.html$/,An):e.replace(/\/$/,"")+Sn}const In=new Set(["icon","shortcut icon","apple-touch-icon"]),q=gt(_t)??{},ae=gt(mt)??{},B={url:rt({}),page:rt({}),navigating:Fe(null),updated:an()};function Ke(e){q[e]=K()}function Tn(e,t){let n=e+1;for(;q[n];)delete q[n],n+=1;for(n=t+1;ae[n];)delete ae[n],n+=1}function X(e,t=!1){return t?location.replace(e.href):location.href=e.href,new Promise(()=>{})}async function St(){if("serviceWorker"in navigator){const e=await navigator.serviceWorker.getRegistration(C||"/");e&&await e.update()}}function at(){}let Ye,$e,ve,D,De,R;const be=[],ke=[];let A=null;function Be(){var e;(e=A==null?void 0:A.fork)==null||e.then(t=>t==null?void 0:t.discard()),A=null}const me=new Map,At=new Set,Un=new Set,ee=new Set;let y={branch:[],error:null,url:null},We=!1,Ee=!1,ot=!0,oe=!1,Z=!1,Rt=!1,ze=!1,It,I,L,G;const te=new Set,st=new Map;async function Xn(e,t,n){var i,o,c,s,l;(i=globalThis.__sveltekit_qe4x74)!=null&&i.data&&globalThis.__sveltekit_qe4x74.data,document.URL!==location.href&&(location.href=location.href),R=e,await((c=(o=e.hooks).init)==null?void 0:c.call(o)),Ye=en(e),D=document.documentElement,De=t,$e=e.nodes[0],ve=e.nodes[1],$e(),ve(),I=(s=history.state)==null?void 0:s[z],L=(l=history.state)==null?void 0:l[ne],I||(I=L=Date.now(),history.replaceState({...history.state,[z]:I,[ne]:L},""));const a=q[I];function r(){a&&(history.scrollRestoration="manual",scrollTo(a.x,a.y))}n?(r(),await Fn(De,n)):(await H({type:"enter",url:yt(R.hash?Vn(new URL(location.href)):location.href),replace_state:!0}),r()),qn()}function Ln(){be.length=0,ze=!1}function Tt(e){ke.some(t=>t==null?void 0:t.snapshot)&&(ae[e]=ke.map(t=>{var n;return(n=t==null?void 0:t.snapshot)==null?void 0:n.capture()}))}function Ut(e){var t;(t=ae[e])==null||t.forEach((n,a)=>{var r,i;(i=(r=ke[a])==null?void 0:r.snapshot)==null||i.restore(n)})}function it(){Ke(I),tt(_t,q),Tt(L),tt(mt,ae)}async function Cn(e,t,n,a){let r;t.invalidateAll&&Be(),await H({type:"goto",url:yt(e),keepfocus:t.keepFocus,noscroll:t.noScroll,replace_state:t.replaceState,state:t.state,redirect_count:n,nav_token:a,accept:()=>{t.invalidateAll&&(ze=!0,r=[...st.keys()]),t.invalidate&&t.invalidate.forEach(Bn)}}),t.invalidateAll&&_e().then(_e).then(()=>{st.forEach(({resource:i},o)=>{var c;r!=null&&r.includes(o)&&((c=i.refresh)==null||c.call(i))})})}async function Pn(e){if(e.id!==(A==null?void 0:A.id)){Be();const t={};te.add(t),A={id:e.id,token:t,promise:Ct({...e,preload:t}).then(n=>(te.delete(t),n.type==="loaded"&&n.state.error&&Be(),n)),fork:null}}return A.promise}async function je(e){var n;const t=(n=await Le(e,!1))==null?void 0:n.route;t&&await Promise.all([...t.layouts,t.leaf].filter(Boolean).map(a=>a[1]()))}async function Lt(e,t,n){var r;y=e.state;const a=document.querySelector("style[data-sveltekit]");if(a&&a.remove(),Object.assign(U,e.props.page),It=new R.root({target:t,props:{...e.props,stores:B,components:ke},hydrate:n,sync:!1}),await Promise.resolve(),Ut(L),n){const i={from:null,to:{params:y.params,route:{id:((r=y.route)==null?void 0:r.id)??null},url:new URL(location.href),scroll:q[I]??K()},willUnload:!1,type:"enter",complete:Promise.resolve()};ee.forEach(o=>o(i))}Ee=!0}function Se({url:e,params:t,branch:n,status:a,error:r,route:i,form:o}){let c="never";if(C&&(e.pathname===C||e.pathname===C+"/"))c="always";else for(const d of n)(d==null?void 0:d.slash)!==void 0&&(c=d.slash);e.pathname=qt(e.pathname,c),e.search=e.search;const s={type:"loaded",state:{url:e,params:t,branch:n,error:r,route:i},props:{constructors:wn(n).map(d=>d.node.component),page:Ze(U)}};o!==void 0&&(s.props.form=o);let l={},f=!U,u=0;for(let d=0;d<Math.max(n.length,y.branch.length);d+=1){const p=n[d],h=y.branch[d];(p==null?void 0:p.data)!==(h==null?void 0:h.data)&&(f=!0),p&&(l={...l,...p.data},f&&(s.props[`data_${u}`]=l),u+=1)}return(!y.url||e.href!==y.url.href||y.error!==r||o!==void 0&&o!==U.form||f)&&(s.props.page={error:r,params:t,route:{id:(i==null?void 0:i.id)??null},state:{},status:a,url:new URL(e),form:o??null,data:f?l:U.data}),s}async function He({loader:e,parent:t,url:n,params:a,route:r,server_data_node:i}){var l,f;let o=null;const c={dependencies:new Set,params:new Set,parent:!1,route:!1,url:!1,search_params:new Set},s=await e();return{node:s,loader:e,server:i,universal:(l=s.universal)!=null&&l.load?{type:"data",data:o,uses:c}:null,data:o??(i==null?void 0:i.data)??null,slash:((f=s.universal)==null?void 0:f.trailingSlash)??(i==null?void 0:i.slash)}}function xn(e,t,n){let a=e instanceof Request?e.url:e;const r=new URL(a,n);r.origin===n.origin&&(a=r.href.slice(n.origin.length));const i=Ee?zt(a,r.href,t):Wt(a,t);return{resolved:r,promise:i}}function ct(e,t,n,a,r,i){if(ze)return!0;if(!r)return!1;if(r.parent&&e||r.route&&t||r.url&&n)return!0;for(const o of r.search_params)if(a.has(o))return!0;for(const o of r.params)if(i[o]!==y.params[o])return!0;for(const o of r.dependencies)if(be.some(c=>c(new URL(o))))return!0;return!1}function Je(e,t){return(e==null?void 0:e.type)==="data"?e:(e==null?void 0:e.type)==="skip"?t??null:null}function On(e,t){if(!e)return new Set(t.searchParams.keys());const n=new Set([...e.searchParams.keys(),...t.searchParams.keys()]);for(const a of n){const r=e.searchParams.getAll(a),i=t.searchParams.getAll(a);r.every(o=>i.includes(o))&&i.every(o=>r.includes(o))&&n.delete(a)}return n}function lt({error:e,url:t,route:n,params:a}){return{type:"loaded",state:{error:e,url:t,route:n,params:a,branch:[]},props:{page:Ze(U),constructors:[]}}}async function Ct({id:e,invalidating:t,url:n,params:a,route:r,preload:i}){if((A==null?void 0:A.id)===e)return te.delete(A.token),A.promise;const{errors:o,layouts:c,leaf:s}=r,l=[...c,s];o.forEach(g=>g==null?void 0:g().catch(()=>{})),l.forEach(g=>g==null?void 0:g[1]().catch(()=>{}));let f=null;const u=y.url?e!==Ae(y.url):!1,m=y.route?r.id!==y.route.id:!1,d=On(y.url,n);let p=!1;{const g=l.map((v,b)=>{var E;const k=y.branch[b],x=!!(v!=null&&v[0])&&((k==null?void 0:k.loader)!==v[1]||ct(p,m,u,d,(E=k.server)==null?void 0:E.uses,a));return x&&(p=!0),x});if(g.some(Boolean)){try{f=await Ot(n,g)}catch(v){const b=await J(v,{url:n,params:a,route:{id:e}});return te.has(i)?lt({error:b,url:n,params:a,route:r}):Ue({status:ye(v),error:b,url:n,route:r})}if(f.type==="redirect")return f}}const h=f==null?void 0:f.nodes;let w=!1;const _=l.map(async(g,v)=>{var E;if(!g)return;const b=y.branch[v],k=h==null?void 0:h[v];if((!k||k.type==="skip")&&g[1]===(b==null?void 0:b.loader)&&!ct(w,m,u,d,(E=b.universal)==null?void 0:E.uses,a))return b;if(w=!0,(k==null?void 0:k.type)==="error")throw k;return He({loader:g[1],url:n,params:a,route:r,parent:async()=>{var $;const F={};for(let M=0;M<v;M+=1)Object.assign(F,($=await _[M])==null?void 0:$.data);return F},server_data_node:Je(k===void 0&&g[0]?{type:"skip"}:k??null,g[0]?b==null?void 0:b.server:void 0)})});for(const g of _)g.catch(()=>{});const T=[];for(let g=0;g<l.length;g+=1)if(l[g])try{T.push(await _[g])}catch(v){if(v instanceof Me)return{type:"redirect",location:v.location};if(te.has(i))return lt({error:await J(v,{params:a,url:n,route:{id:r.id}}),url:n,params:a,route:r});let b=ye(v),k;if(h!=null&&h.includes(v))b=v.status??b,k=v.error;else if(v instanceof Re)k=v.body;else{if(await B.updated.check())return await St(),await X(n);k=await J(v,{params:a,url:n,route:{id:r.id}})}const x=await jn(g,T,o);return x?Se({url:n,params:a,branch:T.slice(0,x.idx).concat(x.node),status:b,error:k,route:r}):await xt(n,{id:r.id},k,b)}else T.push(void 0);return Se({url:n,params:a,branch:T,status:200,error:null,route:r,form:t?void 0:null})}async function jn(e,t,n){for(;e--;)if(n[e]){let a=e;for(;!t[a];)a-=1;try{return{idx:a+1,node:{node:await n[e](),loader:n[e],data:{},server:null,universal:null}}}catch{continue}}}async function Ue({status:e,error:t,url:n,route:a}){const r={};let i=null;if(R.server_loads[0]===0)try{const c=await Ot(n,[!0]);if(c.type!=="data"||c.nodes[0]&&c.nodes[0].type!=="data")throw 0;i=c.nodes[0]??null}catch{(n.origin!==Ie||n.pathname!==location.pathname||We)&&await X(n)}try{const o=await He({loader:$e,url:n,params:r,route:a,parent:()=>Promise.resolve({}),server_data_node:Je(i)}),c={node:await ve(),loader:ve,universal:null,server:null,data:null};return Se({url:n,params:r,branch:[o,c],status:e,error:t,route:null})}catch(o){if(o instanceof Me)return Cn(new URL(o.location,location.href),{},0);throw o}}async function Nn(e){const t=e.href;if(me.has(t))return me.get(t);let n;try{const a=(async()=>{let r=await R.hooks.reroute({url:new URL(e),fetch:async(i,o)=>xn(i,o,e).promise})??e;if(typeof r=="string"){const i=new URL(e);R.hash?i.hash=r:i.pathname=r,r=i}return r})();me.set(t,a),n=await a}catch{me.delete(t);return}return n}async function Le(e,t){if(e&&!Te(e,C,R.hash)){const n=await Nn(e);if(!n)return;const a=$n(n);for(const r of Ye){const i=r.exec(a);if(i)return{id:Ae(e),invalidating:t,route:r,params:Mt(i),url:e}}}}function $n(e){return Ft(R.hash?e.hash.replace(/^#/,"").replace(/[?#].+/,""):e.pathname.slice(C.length))||"/"}function Ae(e){return(R.hash?e.hash.replace(/^#/,""):e.pathname)+e.search}function Pt({url:e,type:t,intent:n,delta:a,event:r,scroll:i}){let o=!1;const c=Xe(y,n,e,t,i??null);a!==void 0&&(c.navigation.delta=a),r!==void 0&&(c.navigation.event=r);const s={...c.navigation,cancel:()=>{o=!0,c.reject(new Error("navigation cancelled"))}};return oe||At.forEach(l=>l(s)),o?null:c}async function H({type:e,url:t,popped:n,keepfocus:a,noscroll:r,replace_state:i,state:o={},redirect_count:c=0,nav_token:s={},accept:l=at,block:f=at,event:u}){var x;const m=G;G=s;const d=await Le(t,!1),p=e==="enter"?Xe(y,d,t,e):Pt({url:t,type:e,delta:n==null?void 0:n.delta,intent:d,scroll:n==null?void 0:n.scroll,event:u});if(!p){f(),G===s&&(G=m);return}const h=I,w=L;l(),oe=!0,Ee&&p.navigation.type!=="enter"&&B.navigating.set(re.current=p.navigation);let _=d&&await Ct(d);if(!_){if(Te(t,C,R.hash))return await X(t,i);_=await xt(t,{id:null},await J(new Ve(404,"Not Found",`Not found: ${t.pathname}`),{url:t,params:{},route:{id:null}}),404,i)}if(t=(d==null?void 0:d.url)||t,G!==s)return p.reject(new Error("navigation aborted")),!1;if(_.type==="redirect"){if(c<20){await H({type:e,url:new URL(_.location,t),popped:n,keepfocus:a,noscroll:r,replace_state:i,state:o,redirect_count:c+1,nav_token:s}),p.fulfil(void 0);return}_=await Ue({status:500,error:await J(new Error("Redirect loop"),{url:t,params:{},route:{id:null}}),url:t,route:{id:null}})}else _.props.page.status>=400&&await B.updated.check()&&(await St(),await X(t,i));if(Ln(),Ke(h),Tt(w),_.props.page.url.pathname!==t.pathname&&(t.pathname=_.props.page.url.pathname),o=n?n.state:o,!n){const E=i?0:1,F={[z]:I+=E,[ne]:L+=E,[wt]:o};(i?history.replaceState:history.pushState).call(history,F,"",t),i||Tn(I,L)}const T=d&&(A==null?void 0:A.id)===d.id?A.fork:null;A=null,_.props.page.state=o;let g;if(Ee){const E=(await Promise.all(Array.from(Un,$=>$(p.navigation)))).filter($=>typeof $=="function");if(E.length>0){let $=function(){E.forEach(M=>{ee.delete(M)})};E.push($),E.forEach(M=>{ee.add(M)})}y=_.state,_.props.page&&(_.props.page.url=t);const F=T&&await T;F?g=F.commit():(It.$set(_.props),En(_.props.page),g=(x=Bt)==null?void 0:x()),Rt=!0}else await Lt(_,De,!1);const{activeElement:v}=document;await g,await _e(),await _e();let b=null;if(ot){const E=n?n.scroll:r?K():null;E?scrollTo(E.x,E.y):(b=t.hash&&document.getElementById(Nt(t)))?b.scrollIntoView():scrollTo(0,0)}const k=document.activeElement!==v&&document.activeElement!==document.body;!a&&!k&&Mn(t,!b),ot=!0,_.props.page&&Object.assign(U,_.props.page),oe=!1,e==="popstate"&&Ut(L),p.fulfil(void 0),p.navigation.to&&(p.navigation.to.scroll=K()),ee.forEach(E=>E(p.navigation)),B.navigating.set(re.current=null)}async function xt(e,t,n,a,r){return e.origin===Ie&&e.pathname===location.pathname&&!We?await Ue({status:a,error:n,url:e,route:t}):await X(e,r)}function Dn(){let e,t={element:void 0,href:void 0},n;D.addEventListener("mousemove",c=>{const s=c.target;clearTimeout(e),e=setTimeout(()=>{i(s,V.hover)},20)});function a(c){c.defaultPrevented||i(c.composedPath()[0],V.tap)}D.addEventListener("mousedown",a),D.addEventListener("touchstart",a,{passive:!0});const r=new IntersectionObserver(c=>{for(const s of c)s.isIntersecting&&(je(new URL(s.target.href)),r.unobserve(s.target))},{threshold:0});async function i(c,s){const l=bt(c,D),f=l===t.element&&(l==null?void 0:l.href)===t.href&&s>=n;if(!l||f)return;const{url:u,external:m,download:d}=Ne(l,C,R.hash);if(m||d)return;const p=we(l),h=u&&Ae(y.url)===Ae(u);if(!(p.reload||h))if(s<=p.preload_data){t={element:l,href:l.href},n=V.tap;const w=await Le(u,!1);if(!w)return;Pn(w)}else s<=p.preload_code&&(t={element:l,href:l.href},n=s,je(u))}function o(){r.disconnect();for(const c of D.querySelectorAll("a")){const{url:s,external:l,download:f}=Ne(c,C,R.hash);if(l||f)continue;const u=we(c);u.reload||(u.preload_code===V.viewport&&r.observe(c),u.preload_code===V.eager&&je(s))}}ee.add(o),o()}function J(e,t){if(e instanceof Re)return e.body;const n=ye(e),a=bn(e);return R.hooks.handleError({error:e,event:t,status:n,message:a})??{message:a}}function Bn(e){if(typeof e=="function")be.push(e);else{const{href:t}=new URL(e,location.href);be.push(n=>n.href===t)}}function qn(){var t;history.scrollRestoration="manual",addEventListener("beforeunload",n=>{let a=!1;if(it(),!oe){const r=Xe(y,void 0,null,"leave"),i={...r.navigation,cancel:()=>{a=!0,r.reject(new Error("navigation cancelled"))}};At.forEach(o=>o(i))}a?(n.preventDefault(),n.returnValue=""):history.scrollRestoration="auto"}),addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&it()}),(t=navigator.connection)!=null&&t.saveData||Dn(),D.addEventListener("click",async n=>{if(n.button||n.which!==1||n.metaKey||n.ctrlKey||n.shiftKey||n.altKey||n.defaultPrevented)return;const a=bt(n.composedPath()[0],D);if(!a)return;const{url:r,external:i,target:o,download:c}=Ne(a,C,R.hash);if(!r)return;if(o==="_parent"||o==="_top"){if(window.parent!==window)return}else if(o&&o!=="_self")return;const s=we(a);if(!(a instanceof SVGAElement)&&r.protocol!==location.protocol&&!(r.protocol==="https:"||r.protocol==="http:")||c)return;const[f,u]=(R.hash?r.hash.replace(/^#/,""):r.href).split("#"),m=f===Pe(location);if(i||s.reload&&(!m||!u)){Pt({url:r,type:"link",event:n})?oe=!0:n.preventDefault();return}if(u!==void 0&&m){const[,d]=y.url.href.split("#");if(d===u){if(n.preventDefault(),u===""||u==="top"&&a.ownerDocument.getElementById("top")===null)scrollTo({top:0});else{const p=a.ownerDocument.getElementById(decodeURIComponent(u));p&&(p.scrollIntoView(),p.focus())}return}if(Z=!0,Ke(I),e(r),!s.replace_state)return;Z=!1}n.preventDefault(),await new Promise(d=>{requestAnimationFrame(()=>{setTimeout(d,0)}),setTimeout(d,100)}),await H({type:"link",url:r,keepfocus:s.keepfocus,noscroll:s.noscroll,replace_state:s.replace_state??r.href===location.href,event:n})}),D.addEventListener("submit",n=>{if(n.defaultPrevented)return;const a=HTMLFormElement.prototype.cloneNode.call(n.target),r=n.submitter;if(((r==null?void 0:r.formTarget)||a.target)==="_blank"||((r==null?void 0:r.formMethod)||a.method)!=="get")return;const c=new URL((r==null?void 0:r.hasAttribute("formaction"))&&(r==null?void 0:r.formAction)||a.action);if(Te(c,C,!1))return;const s=n.target,l=we(s);if(l.reload)return;n.preventDefault(),n.stopPropagation();const f=new FormData(s,r);c.search=new URLSearchParams(f).toString(),H({type:"form",url:c,keepfocus:l.keepfocus,noscroll:l.noscroll,replace_state:l.replace_state??c.href===location.href,event:n})}),addEventListener("popstate",async n=>{var a;if(!qe){if((a=n.state)!=null&&a[z]){const r=n.state[z];if(G={},r===I)return;const i=q[r],o=n.state[wt]??{},c=new URL(n.state[rn]??location.href),s=n.state[ne],l=y.url?Pe(location)===Pe(y.url):!1;if(s===L&&(Rt||l)){o!==U.state&&(U.state=o),e(c),q[I]=K(),i&&scrollTo(i.x,i.y),I=r;return}const u=r-I;await H({type:"popstate",url:c,popped:{state:o,scroll:i,delta:u},accept:()=>{I=r,L=s},block:()=>{history.go(-u)},nav_token:G,event:n})}else if(!Z){const r=new URL(location.href);e(r),R.hash&&location.reload()}}}),addEventListener("hashchange",()=>{Z&&(Z=!1,history.replaceState({...history.state,[z]:++I,[ne]:L},"",location.href))});for(const n of document.querySelectorAll("link"))In.has(n.rel)&&(n.href=n.href);addEventListener("pageshow",n=>{n.persisted&&B.navigating.set(re.current=null)});function e(n){y.url=U.url=n,B.page.set(Ze(U)),B.page.notify()}}async function Fn(e,{status:t=200,error:n,node_ids:a,params:r,route:i,server_route:o,data:c,form:s}){We=!0;const l=new URL(location.href);let f;({params:r={},route:i={id:null}}=await Le(l,!1)||{}),f=Ye.find(({id:d})=>d===i.id);let u,m=!0;try{const d=a.map(async(h,w)=>{const _=c[w];return _!=null&&_.uses&&(_.uses=jt(_.uses)),He({loader:R.nodes[h],url:l,params:r,route:i,parent:async()=>{const T={};for(let g=0;g<w;g+=1)Object.assign(T,(await d[g]).data);return T},server_data_node:Je(_)})}),p=await Promise.all(d);if(f){const h=f.layouts;for(let w=0;w<h.length;w++)h[w]||p.splice(w,0,void 0)}u=Se({url:l,params:r,branch:p,status:t,error:n,form:s,route:f??null})}catch(d){if(d instanceof Me){await X(new URL(d.location,location.href));return}u=await Ue({status:ye(d),error:await J(d,{url:l,params:r,route:i}),url:l,route:i}),e.textContent="",m=!1}u.props.page&&(u.props.page.state={}),await Lt(u,e,m)}async function Ot(e,t){var i;const n=new URL(e);n.pathname=Rn(e.pathname),e.pathname.endsWith("/")&&n.searchParams.append(vn,"1"),n.searchParams.append(yn,t.map(o=>o?"1":"0").join(""));const a=window.fetch,r=await a(n.href,{});if(!r.ok){let o;throw(i=r.headers.get("content-type"))!=null&&i.includes("application/json")?o=await r.json():r.status===404?o="Not Found":r.status===500&&(o="Internal Error"),new Re(r.status,o)}return new Promise(async o=>{var u;const c=new Map,s=r.body.getReader();function l(m){return mn(m,{...R.decoders,Promise:d=>new Promise((p,h)=>{c.set(d,{fulfil:p,reject:h})})})}let f="";for(;;){const{done:m,value:d}=await s.read();if(m&&!f)break;for(f+=!d&&f?`
2
- `:Gt.decode(d,{stream:!0});;){const p=f.indexOf(`
3
- `);if(p===-1)break;const h=JSON.parse(f.slice(0,p));if(f=f.slice(p+1),h.type==="redirect")return o(h);if(h.type==="data")(u=h.nodes)==null||u.forEach(w=>{(w==null?void 0:w.type)==="data"&&(w.uses=jt(w.uses),w.data=l(w.data))}),o(h);else if(h.type==="chunk"){const{id:w,data:_,error:T}=h,g=c.get(w);c.delete(w),T?g.reject(l(T)):g.fulfil(l(_))}}}})}function jt(e){return{dependencies:new Set((e==null?void 0:e.dependencies)??[]),params:new Set((e==null?void 0:e.params)??[]),parent:!!(e!=null&&e.parent),route:!!(e!=null&&e.route),url:!!(e!=null&&e.url),search_params:new Set((e==null?void 0:e.search_params)??[])}}let qe=!1;function Mn(e,t=!0){const n=document.querySelector("[autofocus]");if(n)n.focus();else{const a=Nt(e);if(a&&document.getElementById(a)){const{x:i,y:o}=K();setTimeout(()=>{const c=history.state;qe=!0,location.replace(new URL(`#${a}`,location.href)),history.replaceState(c,"",e),t&&scrollTo(i,o),qe=!1})}else{const i=document.body,o=i.getAttribute("tabindex");i.tabIndex=-1,i.focus({preventScroll:!0,focusVisible:!1}),o!==null?i.setAttribute("tabindex",o):i.removeAttribute("tabindex")}const r=getSelection();if(r&&r.type!=="None"){const i=[];for(let o=0;o<r.rangeCount;o+=1)i.push(r.getRangeAt(o));setTimeout(()=>{if(r.rangeCount===i.length){for(let o=0;o<r.rangeCount;o+=1){const c=i[o],s=r.getRangeAt(o);if(c.commonAncestorContainer!==s.commonAncestorContainer||c.startContainer!==s.startContainer||c.endContainer!==s.endContainer||c.startOffset!==s.startOffset||c.endOffset!==s.endOffset)return}r.removeAllRanges()}})}}}function Xe(e,t,n,a,r=null){var l,f;let i,o;const c=new Promise((u,m)=>{i=u,o=m});return c.catch(()=>{}),{navigation:{from:{params:e.params,route:{id:((l=e.route)==null?void 0:l.id)??null},url:e.url,scroll:K()},to:n&&{params:(t==null?void 0:t.params)??null,route:{id:((f=t==null?void 0:t.route)==null?void 0:f.id)??null},url:n,scroll:r},willUnload:!t,type:a,complete:c},fulfil:i,reject:o}}function Ze(e){return{data:e.data,error:e.error,form:e.form,params:e.params,route:e.route,state:e.state,status:e.status,url:e.url}}function Vn(e){const t=new URL(e);return t.hash=decodeURIComponent(e.hash),t}function Nt(e){let t;if(R.hash){const[,,n]=e.hash.split("#",3);t=n??""}else t=e.hash.slice(1);return decodeURIComponent(t)}export{Xn as a,Wn as l,U as p,B as s};
@@ -1 +0,0 @@
1
- import{b as r}from"./CfICpXHz.js";var e=4;function a(o){return r(o,e)}export{a as c};
@@ -1 +0,0 @@
1
- import{l as o,a as r}from"../chunks/DPsQ0F5p.js";export{o as load_css,r as start};
@@ -1 +0,0 @@
1
- import{_ as m}from"../chunks/DCP7pAeu.js";export{m as component};
@@ -1 +0,0 @@
1
- {"version":3,"file":"3-DIjT-1nt.js","sources":["../../../.svelte-kit/adapter-node/entries/pages/plan/_sessionId_/_page.server.ts.js","../../../.svelte-kit/adapter-node/nodes/3.js"],"sourcesContent":["import { error } from \"@sveltejs/kit\";\nimport { a as getSession, b as getPlan, d as getFeedback, e as listVersions } from \"../../../../chunks/session-manager.js\";\nconst load = async ({ params }) => {\n const session = getSession(params.sessionId);\n if (!session) throw error(404, \"Session not found\");\n const plan = getPlan(params.sessionId);\n const feedback = getFeedback(params.sessionId);\n const versions = listVersions(params.sessionId);\n return {\n session,\n plan,\n feedback,\n versions,\n sessionId: params.sessionId\n };\n};\nexport {\n load\n};\n","import * as server from '../entries/pages/plan/_sessionId_/_page.server.ts.js';\n\nexport const index = 3;\nlet component_cache;\nexport const component = async () => component_cache ??= (await import('../entries/pages/plan/_sessionId_/_page.svelte.js')).default;\nexport { server };\nexport const server_id = \"src/routes/plan/[sessionId]/+page.server.ts\";\nexport const imports = [\"_app/immutable/nodes/3.DHzG8WJV.js\",\"_app/immutable/chunks/DCP7pAeu.js\",\"_app/immutable/chunks/BrjAEg64.js\",\"_app/immutable/chunks/CobJHAAW.js\",\"_app/immutable/chunks/DGn8gxMH.js\",\"_app/immutable/chunks/dRJp6O4P.js\",\"_app/immutable/chunks/BZQqs639.js\",\"_app/immutable/chunks/C5wtj4WQ.js\",\"_app/immutable/chunks/CuD0M7ml.js\",\"_app/immutable/chunks/Dj-iuGW3.js\"];\nexport const stylesheets = [\"_app/immutable/assets/3.OXdAvKD0.css\"];\nexport const fonts = [];\n"],"names":[],"mappings":";;;;;;AAEA,MAAM,IAAI,GAAG,OAAO,EAAE,MAAM,EAAE,KAAK;AACnC,EAAE,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC;AAC9C,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,KAAK,CAAC,GAAG,EAAE,mBAAmB,CAAC;AACrD,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC;AACxC,EAAE,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC;AAChD,EAAE,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC;AACjD,EAAE,OAAO;AACT,IAAI,OAAO;AACX,IAAI,IAAI;AACR,IAAI,QAAQ;AACZ,IAAI,QAAQ;AACZ,IAAI,SAAS,EAAE,MAAM,CAAC;AACtB,GAAG;AACH,CAAC;;;;;;;ACbW,MAAC,KAAK,GAAG;AACrB,IAAI,eAAe;AACP,MAAC,SAAS,GAAG,YAAY,eAAe,KAAK,CAAC,MAAM,OAAO,4BAAmD,CAAC,EAAE;AAEjH,MAAC,SAAS,GAAG;AACb,MAAC,OAAO,GAAG,CAAC,oCAAoC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC;AACpX,MAAC,WAAW,GAAG,CAAC,sCAAsC;AACtD,MAAC,KAAK,GAAG;;;;"}