ghostrail 0.0.0

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 (218) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +16 -0
  3. package/README.md +56 -0
  4. package/dist/agent/claude-code.d.ts +37 -0
  5. package/dist/agent/claude-code.d.ts.map +1 -0
  6. package/dist/agent/claude-code.js +74 -0
  7. package/dist/agent/claude-code.js.map +1 -0
  8. package/dist/agent/index.d.ts +4 -0
  9. package/dist/agent/index.d.ts.map +1 -0
  10. package/dist/agent/index.js +4 -0
  11. package/dist/agent/index.js.map +1 -0
  12. package/dist/agent/prompt.d.ts +9 -0
  13. package/dist/agent/prompt.d.ts.map +1 -0
  14. package/dist/agent/prompt.js +15 -0
  15. package/dist/agent/prompt.js.map +1 -0
  16. package/dist/agent/result.d.ts +16 -0
  17. package/dist/agent/result.d.ts.map +1 -0
  18. package/dist/agent/result.js +56 -0
  19. package/dist/agent/result.js.map +1 -0
  20. package/dist/args.d.ts +27 -0
  21. package/dist/args.d.ts.map +1 -0
  22. package/dist/args.js +25 -0
  23. package/dist/args.js.map +1 -0
  24. package/dist/backend/container.d.ts +18 -0
  25. package/dist/backend/container.d.ts.map +1 -0
  26. package/dist/backend/container.js +70 -0
  27. package/dist/backend/container.js.map +1 -0
  28. package/dist/backend/docker.d.ts +22 -0
  29. package/dist/backend/docker.d.ts.map +1 -0
  30. package/dist/backend/docker.js +38 -0
  31. package/dist/backend/docker.js.map +1 -0
  32. package/dist/backend/fs.d.ts +9 -0
  33. package/dist/backend/fs.d.ts.map +1 -0
  34. package/dist/backend/fs.js +21 -0
  35. package/dist/backend/fs.js.map +1 -0
  36. package/dist/backend/index.d.ts +7 -0
  37. package/dist/backend/index.d.ts.map +1 -0
  38. package/dist/backend/index.js +6 -0
  39. package/dist/backend/index.js.map +1 -0
  40. package/dist/backend/local-worktree.d.ts +17 -0
  41. package/dist/backend/local-worktree.d.ts.map +1 -0
  42. package/dist/backend/local-worktree.js +51 -0
  43. package/dist/backend/local-worktree.js.map +1 -0
  44. package/dist/backend/proc.d.ts +24 -0
  45. package/dist/backend/proc.d.ts.map +1 -0
  46. package/dist/backend/proc.js +103 -0
  47. package/dist/backend/proc.js.map +1 -0
  48. package/dist/backend/types.d.ts +75 -0
  49. package/dist/backend/types.d.ts.map +1 -0
  50. package/dist/backend/types.js +12 -0
  51. package/dist/backend/types.js.map +1 -0
  52. package/dist/bin.d.ts +3 -0
  53. package/dist/bin.d.ts.map +1 -0
  54. package/dist/bin.js +10 -0
  55. package/dist/bin.js.map +1 -0
  56. package/dist/board/index.d.ts +4 -0
  57. package/dist/board/index.d.ts.map +1 -0
  58. package/dist/board/index.js +4 -0
  59. package/dist/board/index.js.map +1 -0
  60. package/dist/board/page.d.ts +3 -0
  61. package/dist/board/page.d.ts.map +1 -0
  62. package/dist/board/page.js +55 -0
  63. package/dist/board/page.js.map +1 -0
  64. package/dist/board/server.d.ts +36 -0
  65. package/dist/board/server.d.ts.map +1 -0
  66. package/dist/board/server.js +110 -0
  67. package/dist/board/server.js.map +1 -0
  68. package/dist/board/stats.d.ts +26 -0
  69. package/dist/board/stats.d.ts.map +1 -0
  70. package/dist/board/stats.js +57 -0
  71. package/dist/board/stats.js.map +1 -0
  72. package/dist/cli/commands.d.ts +39 -0
  73. package/dist/cli/commands.d.ts.map +1 -0
  74. package/dist/cli/commands.js +224 -0
  75. package/dist/cli/commands.js.map +1 -0
  76. package/dist/cli.d.ts +16 -0
  77. package/dist/cli.d.ts.map +1 -0
  78. package/dist/cli.js +45 -0
  79. package/dist/cli.js.map +1 -0
  80. package/dist/commands/help.d.ts +6 -0
  81. package/dist/commands/help.d.ts.map +1 -0
  82. package/dist/commands/help.js +29 -0
  83. package/dist/commands/help.js.map +1 -0
  84. package/dist/config/duration.d.ts +14 -0
  85. package/dist/config/duration.d.ts.map +1 -0
  86. package/dist/config/duration.js +25 -0
  87. package/dist/config/duration.js.map +1 -0
  88. package/dist/config/index.d.ts +5 -0
  89. package/dist/config/index.d.ts.map +1 -0
  90. package/dist/config/index.js +4 -0
  91. package/dist/config/index.js.map +1 -0
  92. package/dist/config/load.d.ts +26 -0
  93. package/dist/config/load.d.ts.map +1 -0
  94. package/dist/config/load.js +306 -0
  95. package/dist/config/load.js.map +1 -0
  96. package/dist/config/result.d.ts +18 -0
  97. package/dist/config/result.d.ts.map +1 -0
  98. package/dist/config/result.js +7 -0
  99. package/dist/config/result.js.map +1 -0
  100. package/dist/config/schema.d.ts +77 -0
  101. package/dist/config/schema.d.ts.map +1 -0
  102. package/dist/config/schema.js +35 -0
  103. package/dist/config/schema.js.map +1 -0
  104. package/dist/factory/build.d.ts +39 -0
  105. package/dist/factory/build.d.ts.map +1 -0
  106. package/dist/factory/build.js +85 -0
  107. package/dist/factory/build.js.map +1 -0
  108. package/dist/gate/gate.d.ts +12 -0
  109. package/dist/gate/gate.d.ts.map +1 -0
  110. package/dist/gate/gate.js +22 -0
  111. package/dist/gate/gate.js.map +1 -0
  112. package/dist/gate/index.d.ts +2 -0
  113. package/dist/gate/index.d.ts.map +1 -0
  114. package/dist/gate/index.js +2 -0
  115. package/dist/gate/index.js.map +1 -0
  116. package/dist/global/index.d.ts +3 -0
  117. package/dist/global/index.d.ts.map +1 -0
  118. package/dist/global/index.js +3 -0
  119. package/dist/global/index.js.map +1 -0
  120. package/dist/global/stage.d.ts +13 -0
  121. package/dist/global/stage.d.ts.map +1 -0
  122. package/dist/global/stage.js +24 -0
  123. package/dist/global/stage.js.map +1 -0
  124. package/dist/global/store.d.ts +30 -0
  125. package/dist/global/store.d.ts.map +1 -0
  126. package/dist/global/store.js +65 -0
  127. package/dist/global/store.js.map +1 -0
  128. package/dist/lock/file-lock.d.ts +16 -0
  129. package/dist/lock/file-lock.d.ts.map +1 -0
  130. package/dist/lock/file-lock.js +51 -0
  131. package/dist/lock/file-lock.js.map +1 -0
  132. package/dist/loop/branch.d.ts +14 -0
  133. package/dist/loop/branch.d.ts.map +1 -0
  134. package/dist/loop/branch.js +24 -0
  135. package/dist/loop/branch.js.map +1 -0
  136. package/dist/loop/engine.d.ts +37 -0
  137. package/dist/loop/engine.d.ts.map +1 -0
  138. package/dist/loop/engine.js +204 -0
  139. package/dist/loop/engine.js.map +1 -0
  140. package/dist/loop/index.d.ts +6 -0
  141. package/dist/loop/index.d.ts.map +1 -0
  142. package/dist/loop/index.js +3 -0
  143. package/dist/loop/index.js.map +1 -0
  144. package/dist/loop/ports.d.ts +97 -0
  145. package/dist/loop/ports.d.ts.map +1 -0
  146. package/dist/loop/ports.js +2 -0
  147. package/dist/loop/ports.js.map +1 -0
  148. package/dist/loop/record.d.ts +26 -0
  149. package/dist/loop/record.d.ts.map +1 -0
  150. package/dist/loop/record.js +2 -0
  151. package/dist/loop/record.js.map +1 -0
  152. package/dist/publish/gh.d.ts +24 -0
  153. package/dist/publish/gh.d.ts.map +1 -0
  154. package/dist/publish/gh.js +109 -0
  155. package/dist/publish/gh.js.map +1 -0
  156. package/dist/publish/githost.d.ts +54 -0
  157. package/dist/publish/githost.d.ts.map +1 -0
  158. package/dist/publish/githost.js +33 -0
  159. package/dist/publish/githost.js.map +1 -0
  160. package/dist/publish/github-publisher.d.ts +30 -0
  161. package/dist/publish/github-publisher.d.ts.map +1 -0
  162. package/dist/publish/github-publisher.js +51 -0
  163. package/dist/publish/github-publisher.js.map +1 -0
  164. package/dist/publish/index.d.ts +4 -0
  165. package/dist/publish/index.d.ts.map +1 -0
  166. package/dist/publish/index.js +4 -0
  167. package/dist/publish/index.js.map +1 -0
  168. package/dist/respond/index.d.ts +4 -0
  169. package/dist/respond/index.d.ts.map +1 -0
  170. package/dist/respond/index.js +4 -0
  171. package/dist/respond/index.js.map +1 -0
  172. package/dist/respond/respond.d.ts +42 -0
  173. package/dist/respond/respond.d.ts.map +1 -0
  174. package/dist/respond/respond.js +128 -0
  175. package/dist/respond/respond.js.map +1 -0
  176. package/dist/respond/select.d.ts +22 -0
  177. package/dist/respond/select.d.ts.map +1 -0
  178. package/dist/respond/select.js +31 -0
  179. package/dist/respond/select.js.map +1 -0
  180. package/dist/respond/store.d.ts +25 -0
  181. package/dist/respond/store.d.ts.map +1 -0
  182. package/dist/respond/store.js +49 -0
  183. package/dist/respond/store.js.map +1 -0
  184. package/dist/secrets/redact.d.ts +11 -0
  185. package/dist/secrets/redact.d.ts.map +1 -0
  186. package/dist/secrets/redact.js +21 -0
  187. package/dist/secrets/redact.js.map +1 -0
  188. package/dist/source/index.d.ts +2 -0
  189. package/dist/source/index.d.ts.map +1 -0
  190. package/dist/source/index.js +2 -0
  191. package/dist/source/index.js.map +1 -0
  192. package/dist/source/linear.d.ts +61 -0
  193. package/dist/source/linear.d.ts.map +1 -0
  194. package/dist/source/linear.js +166 -0
  195. package/dist/source/linear.js.map +1 -0
  196. package/dist/store/events.d.ts +105 -0
  197. package/dist/store/events.d.ts.map +1 -0
  198. package/dist/store/events.js +64 -0
  199. package/dist/store/events.js.map +1 -0
  200. package/dist/store/file-store.d.ts +49 -0
  201. package/dist/store/file-store.d.ts.map +1 -0
  202. package/dist/store/file-store.js +188 -0
  203. package/dist/store/file-store.js.map +1 -0
  204. package/dist/store/index.d.ts +3 -0
  205. package/dist/store/index.d.ts.map +1 -0
  206. package/dist/store/index.js +3 -0
  207. package/dist/store/index.js.map +1 -0
  208. package/dist/version.d.ts +3 -0
  209. package/dist/version.d.ts.map +1 -0
  210. package/dist/version.js +21 -0
  211. package/dist/version.js.map +1 -0
  212. package/package.json +52 -0
  213. package/templates/content-loop/README.md +23 -0
  214. package/templates/content-loop/ghostrail.toml +36 -0
  215. package/templates/content-loop/prompts/draft.md +29 -0
  216. package/templates/fix-bugs-local/README.md +23 -0
  217. package/templates/fix-bugs-local/ghostrail.toml +37 -0
  218. package/templates/fix-bugs-local/prompts/fix-bug.md +27 -0
package/dist/cli.js ADDED
@@ -0,0 +1,45 @@
1
+ import process from "node:process";
2
+ import { parseArgs } from "./args.js";
3
+ import { cmdArtifacts, cmdBoard, cmdInit, cmdRespond, cmdRun } from "./cli/commands.js";
4
+ import { renderHelp } from "./commands/help.js";
5
+ import { VERSION } from "./version.js";
6
+ const defaultStreams = {
7
+ out: (text) => process.stdout.write(text),
8
+ err: (text) => process.stderr.write(text),
9
+ };
10
+ /**
11
+ * Execute the ghostrail CLI for the given arguments (argv with the node binary
12
+ * and script path already stripped) and resolve the intended process exit code.
13
+ * Subcommands (`run`, `respond`) dispatch to their handlers; otherwise the
14
+ * top-level flags (`help`, `version`) are handled here.
15
+ *
16
+ * `run` performs no process-level side effects beyond writing to the provided
17
+ * streams and whatever the dispatched command does.
18
+ */
19
+ export async function run(argv, streams = defaultStreams) {
20
+ const [first, ...rest] = argv;
21
+ if (first === "run")
22
+ return cmdRun(rest, streams);
23
+ if (first === "respond")
24
+ return cmdRespond(rest, streams);
25
+ if (first === "board")
26
+ return cmdBoard(rest, streams);
27
+ if (first === "init")
28
+ return cmdInit(rest, streams);
29
+ if (first === "artifacts")
30
+ return cmdArtifacts(rest, streams);
31
+ const parsed = parseArgs(argv);
32
+ switch (parsed.command) {
33
+ case "version":
34
+ streams.out(`${VERSION}\n`);
35
+ return 0;
36
+ case "help":
37
+ streams.out(`${renderHelp()}\n`);
38
+ return 0;
39
+ case "unknown":
40
+ streams.err(`ghostrail: unknown command '${parsed.raw}'\n\n`);
41
+ streams.out(`${renderHelp()}\n`);
42
+ return 1;
43
+ }
44
+ }
45
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACxF,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAQvC,MAAM,cAAc,GAAY;IAC9B,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;IACzC,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;CAC1C,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,GAAG,CACvB,IAAuB,EACvB,UAAmB,cAAc;IAEjC,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAC9B,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAClD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC1D,IAAI,KAAK,KAAK,OAAO;QAAE,OAAO,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACtD,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACpD,IAAI,KAAK,KAAK,WAAW;QAAE,OAAO,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAE9D,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC/B,QAAQ,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,KAAK,SAAS;YACZ,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;YAC5B,OAAO,CAAC,CAAC;QACX,KAAK,MAAM;YACT,OAAO,CAAC,GAAG,CAAC,GAAG,UAAU,EAAE,IAAI,CAAC,CAAC;YACjC,OAAO,CAAC,CAAC;QACX,KAAK,SAAS;YACZ,OAAO,CAAC,GAAG,CAAC,+BAA+B,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC;YAC9D,OAAO,CAAC,GAAG,CAAC,GAAG,UAAU,EAAE,IAAI,CAAC,CAAC;YACjC,OAAO,CAAC,CAAC;IACb,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Render the top-level help text shown by `ghostrail help` and printed
3
+ * alongside the error on unknown input.
4
+ */
5
+ export declare function renderHelp(): string;
6
+ //# sourceMappingURL=help.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/commands/help.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAsBnC"}
@@ -0,0 +1,29 @@
1
+ import { VERSION } from "../version.js";
2
+ /**
3
+ * Render the top-level help text shown by `ghostrail help` and printed
4
+ * alongside the error on unknown input.
5
+ */
6
+ export function renderHelp() {
7
+ return [
8
+ `ghostrail ${VERSION} — open source software factory for coding agents`,
9
+ "",
10
+ "Usage:",
11
+ " ghostrail <command> [options]",
12
+ "",
13
+ "Commands:",
14
+ " init <t> Scaffold a repo from a template (fix-bugs-local, content-loop)",
15
+ " run Drain eligible work once: claim, isolate, run, gate, open PRs",
16
+ " respond Fold new human PR comments back into their branches",
17
+ " board Serve the run store as a local dashboard",
18
+ " artifacts List shared artifacts in the global store",
19
+ " help Show this help",
20
+ " version Show the ghostrail version",
21
+ "",
22
+ "Options (run, respond):",
23
+ " -c, --config <path> Config file (default: ghostrail.toml)",
24
+ " -C, --repo <path> Repo to operate on (default: cwd)",
25
+ "",
26
+ "Docs: https://ghostrail.dev",
27
+ ].join("\n");
28
+ }
29
+ //# sourceMappingURL=help.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/commands/help.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC;;;GAGG;AACH,MAAM,UAAU,UAAU;IACxB,OAAO;QACL,aAAa,OAAO,mDAAmD;QACvE,EAAE;QACF,QAAQ;QACR,iCAAiC;QACjC,EAAE;QACF,WAAW;QACX,8EAA8E;QAC9E,6EAA6E;QAC7E,mEAAmE;QACnE,wDAAwD;QACxD,yDAAyD;QACzD,8BAA8B;QAC9B,0CAA0C;QAC1C,EAAE;QACF,yBAAyB;QACzB,+DAA+D;QAC/D,2DAA2D;QAC3D,EAAE;QACF,6BAA6B;KAC9B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Parse a short duration string into milliseconds.
3
+ *
4
+ * Accepts a whole, positive number followed by a single unit suffix:
5
+ * `s` (seconds), `m` (minutes), or `h` (hours). Surrounding whitespace is
6
+ * ignored; the input is case-sensitive on the unit. Examples: `"30m"`,
7
+ * `"2h"`, `"90s"`.
8
+ *
9
+ * Returns the duration in milliseconds, or `null` if the string is not a valid
10
+ * duration (empty, no unit, non-integer, zero/negative, unknown unit, or extra
11
+ * characters).
12
+ */
13
+ export declare function parseDuration(input: string): number | null;
14
+ //# sourceMappingURL=duration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duration.d.ts","sourceRoot":"","sources":["../../src/config/duration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAW1D"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Parse a short duration string into milliseconds.
3
+ *
4
+ * Accepts a whole, positive number followed by a single unit suffix:
5
+ * `s` (seconds), `m` (minutes), or `h` (hours). Surrounding whitespace is
6
+ * ignored; the input is case-sensitive on the unit. Examples: `"30m"`,
7
+ * `"2h"`, `"90s"`.
8
+ *
9
+ * Returns the duration in milliseconds, or `null` if the string is not a valid
10
+ * duration (empty, no unit, non-integer, zero/negative, unknown unit, or extra
11
+ * characters).
12
+ */
13
+ export function parseDuration(input) {
14
+ const trimmed = input.trim();
15
+ const match = /^(\d+)(s|m|h)$/.exec(trimmed);
16
+ if (match === null)
17
+ return null;
18
+ const amount = Number(match[1]);
19
+ if (!Number.isSafeInteger(amount) || amount <= 0)
20
+ return null;
21
+ const unit = match[2];
22
+ const unitMs = unit === "s" ? 1_000 : unit === "m" ? 60_000 : 3_600_000;
23
+ return amount * unitMs;
24
+ }
25
+ //# sourceMappingURL=duration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duration.js","sourceRoot":"","sources":["../../src/config/duration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7C,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAEhC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAE9D,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACtB,MAAM,MAAM,GAAG,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IACxE,OAAO,MAAM,GAAG,MAAM,CAAC;AACzB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { parseDuration } from "./duration.js";
2
+ export { deepMerge, parseConfig, parseMergedConfig, validateConfigObject } from "./load.js";
3
+ export type { ConfigError, Result } from "./result.js";
4
+ export * from "./schema.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAC5F,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACvD,cAAc,aAAa,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { parseDuration } from "./duration.js";
2
+ export { deepMerge, parseConfig, parseMergedConfig, validateConfigObject } from "./load.js";
3
+ export * from "./schema.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAE5F,cAAc,aAAa,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { type Result } from "./result.js";
2
+ import { type GhostrailConfig } from "./schema.js";
3
+ /**
4
+ * Parse and validate a `ghostrail.toml` document into a normalized config.
5
+ *
6
+ * On success the returned config has every optional field filled with its
7
+ * default. On failure every problem found is reported (parsing does not stop at
8
+ * the first error), each addressed by a dotted path such as `backend.kind`.
9
+ * A TOML syntax error is reported as a single error at the root path `""`.
10
+ */
11
+ export declare function parseConfig(toml: string): Result<GhostrailConfig>;
12
+ /** Validate an already-parsed config object (used after merging global settings). */
13
+ export declare function validateConfigObject(root: Record<string, unknown>): Result<GhostrailConfig>;
14
+ /**
15
+ * Deep-merge two TOML tables, with `override` winning: nested tables merge
16
+ * recursively; arrays and scalars from `override` replace those in `base`. Used
17
+ * to layer a repo's config over the global account defaults.
18
+ */
19
+ export declare function deepMerge(base: Record<string, unknown>, override: Record<string, unknown>): Record<string, unknown>;
20
+ /**
21
+ * Parse a repo config layered over optional global account settings (repo wins),
22
+ * then validate the merged result. A TOML syntax error in either document is
23
+ * reported at the root path.
24
+ */
25
+ export declare function parseMergedConfig(repoToml: string, globalToml?: string): Result<GhostrailConfig>;
26
+ //# sourceMappingURL=load.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../src/config/load.ts"],"names":[],"mappings":"AAEA,OAAO,EAAoB,KAAK,MAAM,EAAW,MAAM,aAAa,CAAC;AACrE,OAAO,EAYL,KAAK,eAAe,EAMrB,MAAM,aAAa,CAAC;AAgQrB;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,eAAe,CAAC,CAYjE;AAED,qFAAqF;AACrF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,eAAe,CAAC,CAa3F;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAWzB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,eAAe,CAAC,CAOhG"}
@@ -0,0 +1,306 @@
1
+ import { TomlError, parse as parseToml } from "smol-toml";
2
+ import { parseDuration } from "./duration.js";
3
+ import { err, ok } from "./result.js";
4
+ import { BACKEND_KINDS, DEFAULT_ALLOWED_TOOLS, DEFAULT_BACKEND_KIND, DEFAULT_BASE_BRANCH, DEFAULT_GUARDRAILS, SOURCE_KINDS, } from "./schema.js";
5
+ /** True for a plain object (a TOML table), excluding arrays and null. */
6
+ function isTable(value) {
7
+ return typeof value === "object" && value !== null && !Array.isArray(value);
8
+ }
9
+ function join(base, key) {
10
+ return base === "" ? key : `${base}.${key}`;
11
+ }
12
+ /** Accumulates validation errors while walking the parsed config tree. */
13
+ class Ctx {
14
+ errors = [];
15
+ add(path, message) {
16
+ this.errors.push({ path, message });
17
+ }
18
+ /** Read a required non-empty string; records an error and returns undefined if absent/wrong. */
19
+ requiredString(table, key, path) {
20
+ const value = table[key];
21
+ if (value === undefined) {
22
+ this.add(join(path, key), "is required");
23
+ return undefined;
24
+ }
25
+ if (typeof value !== "string" || value.length === 0) {
26
+ this.add(join(path, key), "must be a non-empty string");
27
+ return undefined;
28
+ }
29
+ return value;
30
+ }
31
+ optionalString(table, key, path) {
32
+ const value = table[key];
33
+ if (value === undefined)
34
+ return undefined;
35
+ if (typeof value !== "string" || value.length === 0) {
36
+ this.add(join(path, key), "must be a non-empty string");
37
+ return undefined;
38
+ }
39
+ return value;
40
+ }
41
+ optionalBool(table, key, path, fallback) {
42
+ const value = table[key];
43
+ if (value === undefined)
44
+ return fallback;
45
+ if (typeof value !== "boolean") {
46
+ this.add(join(path, key), "must be a boolean");
47
+ return fallback;
48
+ }
49
+ return value;
50
+ }
51
+ /** Read a positive, finite number; records an error and returns the fallback otherwise. */
52
+ positiveNumber(table, key, path, fallback) {
53
+ const value = table[key];
54
+ if (value === undefined)
55
+ return fallback;
56
+ if (typeof value !== "number" || !Number.isFinite(value) || value <= 0) {
57
+ this.add(join(path, key), "must be a number greater than 0");
58
+ return fallback;
59
+ }
60
+ return value;
61
+ }
62
+ /** Read a duration string (e.g. "30m") as milliseconds; records an error otherwise. */
63
+ durationMs(table, key, path, fallbackMs) {
64
+ const value = table[key];
65
+ if (value === undefined)
66
+ return fallbackMs;
67
+ if (typeof value !== "string") {
68
+ this.add(join(path, key), 'must be a duration string like "30m", "2h", or "90s"');
69
+ return fallbackMs;
70
+ }
71
+ const ms = parseDuration(value);
72
+ if (ms === null) {
73
+ this.add(join(path, key), `is not a valid duration: ${JSON.stringify(value)}`);
74
+ return fallbackMs;
75
+ }
76
+ return ms;
77
+ }
78
+ /** Read an array of non-empty strings; records an error and returns undefined otherwise. */
79
+ stringArray(table, key, path) {
80
+ const value = table[key];
81
+ if (value === undefined)
82
+ return undefined;
83
+ if (!Array.isArray(value) || value.some((v) => typeof v !== "string" || v.length === 0)) {
84
+ this.add(join(path, key), "must be an array of non-empty strings");
85
+ return undefined;
86
+ }
87
+ return value;
88
+ }
89
+ }
90
+ function validateFactory(ctx, root) {
91
+ const table = root.factory;
92
+ if (!isTable(table)) {
93
+ ctx.add("factory", "is required");
94
+ return { name: "", baseBranch: DEFAULT_BASE_BRANCH };
95
+ }
96
+ const name = ctx.requiredString(table, "name", "factory") ?? "";
97
+ const baseBranch = ctx.optionalString(table, "base_branch", "factory") ?? DEFAULT_BASE_BRANCH;
98
+ return { name, baseBranch };
99
+ }
100
+ function validateEligible(ctx, source) {
101
+ const raw = source.eligible;
102
+ if (raw === undefined)
103
+ return { labels: [], unassigned: true };
104
+ if (!isTable(raw)) {
105
+ ctx.add("source.eligible", "must be a table");
106
+ return { labels: [], unassigned: true };
107
+ }
108
+ const state = ctx.optionalString(raw, "state", "source.eligible");
109
+ const unassigned = ctx.optionalBool(raw, "unassigned", "source.eligible", true);
110
+ let labels = [];
111
+ const label = raw.label;
112
+ if (typeof label === "string" && label.length > 0) {
113
+ labels = [label];
114
+ }
115
+ else if (Array.isArray(label) && label.every((l) => typeof l === "string" && l.length > 0)) {
116
+ labels = label;
117
+ }
118
+ else if (label !== undefined) {
119
+ ctx.add("source.eligible.label", "must be a non-empty string or an array of non-empty strings");
120
+ }
121
+ return state === undefined ? { labels, unassigned } : { state, labels, unassigned };
122
+ }
123
+ function validateSource(ctx, root) {
124
+ const table = root.source;
125
+ if (!isTable(table)) {
126
+ ctx.add("source", "is required");
127
+ return { kind: "linear", eligible: { labels: [], unassigned: true } };
128
+ }
129
+ const kindRaw = ctx.requiredString(table, "kind", "source");
130
+ let kind = "linear";
131
+ if (kindRaw !== undefined) {
132
+ if (SOURCE_KINDS.includes(kindRaw)) {
133
+ kind = kindRaw;
134
+ }
135
+ else {
136
+ ctx.add("source.kind", `must be one of ${SOURCE_KINDS.join(", ")}`);
137
+ }
138
+ }
139
+ const project = ctx.optionalString(table, "project", "source");
140
+ const eligible = validateEligible(ctx, table);
141
+ return project === undefined ? { kind, eligible } : { kind, project, eligible };
142
+ }
143
+ function validateAgent(ctx, root) {
144
+ const table = root.agent;
145
+ if (!isTable(table)) {
146
+ ctx.add("agent", "is required");
147
+ return { kind: "claude-code", prompt: "", allowedTools: [...DEFAULT_ALLOWED_TOOLS] };
148
+ }
149
+ const kind = ctx.requiredString(table, "kind", "agent") ?? "claude-code";
150
+ const prompt = ctx.requiredString(table, "prompt", "agent") ?? "";
151
+ const allowedTools = ctx.stringArray(table, "allowed_tools", "agent") ?? [
152
+ ...DEFAULT_ALLOWED_TOOLS,
153
+ ];
154
+ return { kind, prompt, allowedTools };
155
+ }
156
+ function validateBackend(ctx, root) {
157
+ const table = root.backend;
158
+ if (table === undefined)
159
+ return { kind: DEFAULT_BACKEND_KIND };
160
+ if (!isTable(table)) {
161
+ ctx.add("backend", "must be a table");
162
+ return { kind: DEFAULT_BACKEND_KIND };
163
+ }
164
+ let kind = DEFAULT_BACKEND_KIND;
165
+ const kindRaw = table.kind;
166
+ if (kindRaw !== undefined) {
167
+ if (typeof kindRaw === "string" && BACKEND_KINDS.includes(kindRaw)) {
168
+ kind = kindRaw;
169
+ }
170
+ else {
171
+ ctx.add("backend.kind", `must be one of ${BACKEND_KINDS.join(", ")}`);
172
+ }
173
+ }
174
+ const image = ctx.optionalString(table, "image", "backend");
175
+ return image === undefined ? { kind } : { kind, image };
176
+ }
177
+ function validateGate(ctx, root) {
178
+ const table = root.gate;
179
+ if (table === undefined)
180
+ return { commands: [] };
181
+ if (!isTable(table)) {
182
+ ctx.add("gate", "must be a table");
183
+ return { commands: [] };
184
+ }
185
+ const commands = ctx.stringArray(table, "commands", "gate") ?? [];
186
+ return { commands };
187
+ }
188
+ function validateGuardrails(ctx, root) {
189
+ const table = root.guardrails;
190
+ if (table === undefined)
191
+ return { ...DEFAULT_GUARDRAILS };
192
+ if (!isTable(table)) {
193
+ ctx.add("guardrails", "must be a table");
194
+ return { ...DEFAULT_GUARDRAILS };
195
+ }
196
+ return {
197
+ maxItemsPerRun: ctx.positiveNumber(table, "max_items_per_run", "guardrails", DEFAULT_GUARDRAILS.maxItemsPerRun),
198
+ budgetUsdPerItem: ctx.positiveNumber(table, "budget_usd_per_item", "guardrails", DEFAULT_GUARDRAILS.budgetUsdPerItem),
199
+ timeoutMs: ctx.durationMs(table, "timeout", "guardrails", DEFAULT_GUARDRAILS.timeoutMs),
200
+ maxCostUsdPerRun: ctx.positiveNumber(table, "max_cost_usd_per_run", "guardrails", DEFAULT_GUARDRAILS.maxCostUsdPerRun),
201
+ claimTtlMs: ctx.durationMs(table, "claim_ttl", "guardrails", DEFAULT_GUARDRAILS.claimTtlMs),
202
+ };
203
+ }
204
+ function validateOutput(ctx, root) {
205
+ const table = root.output;
206
+ const defaults = { openPr: true, draft: false, autoMerge: false };
207
+ if (table === undefined)
208
+ return defaults;
209
+ if (!isTable(table)) {
210
+ ctx.add("output", "must be a table");
211
+ return defaults;
212
+ }
213
+ return {
214
+ openPr: ctx.optionalBool(table, "open_pr", "output", true),
215
+ draft: ctx.optionalBool(table, "draft", "output", false),
216
+ autoMerge: ctx.optionalBool(table, "auto_merge", "output", false),
217
+ };
218
+ }
219
+ function validateArtifacts(ctx, root) {
220
+ return ctx.stringArray(root, "artifacts", "") ?? [];
221
+ }
222
+ /**
223
+ * Parse and validate a `ghostrail.toml` document into a normalized config.
224
+ *
225
+ * On success the returned config has every optional field filled with its
226
+ * default. On failure every problem found is reported (parsing does not stop at
227
+ * the first error), each addressed by a dotted path such as `backend.kind`.
228
+ * A TOML syntax error is reported as a single error at the root path `""`.
229
+ */
230
+ export function parseConfig(toml) {
231
+ let root;
232
+ try {
233
+ root = parseToml(toml);
234
+ }
235
+ catch (error) {
236
+ const message = error instanceof TomlError ? error.message : String(error);
237
+ return err([{ path: "", message: `invalid TOML: ${message}` }]);
238
+ }
239
+ if (!isTable(root)) {
240
+ return err([{ path: "", message: "config must be a TOML table" }]);
241
+ }
242
+ return validateConfigObject(root);
243
+ }
244
+ /** Validate an already-parsed config object (used after merging global settings). */
245
+ export function validateConfigObject(root) {
246
+ const ctx = new Ctx();
247
+ const config = {
248
+ factory: validateFactory(ctx, root),
249
+ source: validateSource(ctx, root),
250
+ agent: validateAgent(ctx, root),
251
+ backend: validateBackend(ctx, root),
252
+ gate: validateGate(ctx, root),
253
+ guardrails: validateGuardrails(ctx, root),
254
+ output: validateOutput(ctx, root),
255
+ artifacts: validateArtifacts(ctx, root),
256
+ };
257
+ return ctx.errors.length > 0 ? err(ctx.errors) : ok(config);
258
+ }
259
+ /**
260
+ * Deep-merge two TOML tables, with `override` winning: nested tables merge
261
+ * recursively; arrays and scalars from `override` replace those in `base`. Used
262
+ * to layer a repo's config over the global account defaults.
263
+ */
264
+ export function deepMerge(base, override) {
265
+ const result = { ...base };
266
+ for (const [key, value] of Object.entries(override)) {
267
+ const existing = result[key];
268
+ if (isTable(existing) && isTable(value)) {
269
+ result[key] = deepMerge(existing, value);
270
+ }
271
+ else {
272
+ result[key] = value;
273
+ }
274
+ }
275
+ return result;
276
+ }
277
+ /**
278
+ * Parse a repo config layered over optional global account settings (repo wins),
279
+ * then validate the merged result. A TOML syntax error in either document is
280
+ * reported at the root path.
281
+ */
282
+ export function parseMergedConfig(repoToml, globalToml) {
283
+ const repo = parseTomlTable(repoToml, "config");
284
+ if (!repo.ok)
285
+ return repo;
286
+ if (globalToml === undefined)
287
+ return validateConfigObject(repo.value);
288
+ const global = parseTomlTable(globalToml, "global settings");
289
+ if (!global.ok)
290
+ return global;
291
+ return validateConfigObject(deepMerge(global.value, repo.value));
292
+ }
293
+ function parseTomlTable(toml, label) {
294
+ let root;
295
+ try {
296
+ root = parseToml(toml);
297
+ }
298
+ catch (error) {
299
+ const message = error instanceof TomlError ? error.message : String(error);
300
+ return err([{ path: "", message: `invalid TOML in ${label}: ${message}` }]);
301
+ }
302
+ if (!isTable(root))
303
+ return err([{ path: "", message: `${label} must be a TOML table` }]);
304
+ return ok(root);
305
+ }
306
+ //# sourceMappingURL=load.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load.js","sourceRoot":"","sources":["../../src/config/load.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /** A single configuration problem, addressed by a dotted path into the config. */
2
+ export interface ConfigError {
3
+ /** Dotted path to the offending value, e.g. `backend.kind` or `guardrails.timeout`. */
4
+ path: string;
5
+ /** Human-readable description of what is wrong and, where useful, what was expected. */
6
+ message: string;
7
+ }
8
+ /** The result of parsing/validating config: either a value or a non-empty list of errors. */
9
+ export type Result<T> = {
10
+ ok: true;
11
+ value: T;
12
+ } | {
13
+ ok: false;
14
+ errors: ConfigError[];
15
+ };
16
+ export declare function ok<T>(value: T): Result<T>;
17
+ export declare function err<T>(errors: ConfigError[]): Result<T>;
18
+ //# sourceMappingURL=result.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../../src/config/result.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,MAAM,WAAW,WAAW;IAC1B,uFAAuF;IACvF,IAAI,EAAE,MAAM,CAAC;IACb,wFAAwF;IACxF,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,6FAA6F;AAC7F,MAAM,MAAM,MAAM,CAAC,CAAC,IAAI;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,WAAW,EAAE,CAAA;CAAE,CAAC;AAEtF,wBAAgB,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAEzC;AAED,wBAAgB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAEvD"}
@@ -0,0 +1,7 @@
1
+ export function ok(value) {
2
+ return { ok: true, value };
3
+ }
4
+ export function err(errors) {
5
+ return { ok: false, errors };
6
+ }
7
+ //# sourceMappingURL=result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result.js","sourceRoot":"","sources":["../../src/config/result.ts"],"names":[],"mappings":"AAWA,MAAM,UAAU,EAAE,CAAI,KAAQ;IAC5B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,GAAG,CAAI,MAAqB;IAC1C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * The typed ghostrail configuration, normalized from `ghostrail.toml`.
3
+ *
4
+ * The TOML uses snake_case keys (`base_branch`, `allowed_tools`, ...); parsing
5
+ * normalizes them to the camelCase fields below. Only the Phase 0 surface is
6
+ * modeled here; `[store]` and `[board]` arrive in later phases.
7
+ */
8
+ export declare const SOURCE_KINDS: readonly ["linear", "github-issues", "beads"];
9
+ export type SourceKind = (typeof SOURCE_KINDS)[number];
10
+ export declare const BACKEND_KINDS: readonly ["local-worktree", "container", "firecracker", "e2b", "remote"];
11
+ export type BackendKind = (typeof BACKEND_KINDS)[number];
12
+ export interface FactoryConfig {
13
+ name: string;
14
+ baseBranch: string;
15
+ }
16
+ export interface EligibleFilter {
17
+ state?: string;
18
+ /** One or more labels an item must carry to be eligible. */
19
+ labels: string[];
20
+ unassigned: boolean;
21
+ }
22
+ export interface SourceConfig {
23
+ kind: SourceKind;
24
+ /** Tracker project/repo identifier the source reads from. */
25
+ project?: string;
26
+ eligible: EligibleFilter;
27
+ }
28
+ export interface AgentConfig {
29
+ /** `claude-code` today; `strands`, `acp`, or `pty:<cmd>` in later phases. */
30
+ kind: string;
31
+ /** Path to the prompt file, relative to the config file. */
32
+ prompt: string;
33
+ allowedTools: string[];
34
+ }
35
+ export interface BackendConfig {
36
+ kind: BackendKind;
37
+ /** Container image, for backends that use one. */
38
+ image?: string;
39
+ }
40
+ export interface GateConfig {
41
+ /** CI-mirror commands, run in order inside the workspace. */
42
+ commands: string[];
43
+ }
44
+ export interface Guardrails {
45
+ maxItemsPerRun: number;
46
+ budgetUsdPerItem: number;
47
+ /** Per-item wall-clock cap, in milliseconds (parsed from e.g. `"30m"`). */
48
+ timeoutMs: number;
49
+ maxCostUsdPerRun: number;
50
+ /** Claim time-to-live, in milliseconds (parsed from e.g. `"2h"`). */
51
+ claimTtlMs: number;
52
+ }
53
+ export interface OutputConfig {
54
+ openPr: boolean;
55
+ /** Open the PR as a draft (the content-factory default). */
56
+ draft: boolean;
57
+ /** Hard-defaults to false. A human owns every merge. */
58
+ autoMerge: boolean;
59
+ }
60
+ export interface GhostrailConfig {
61
+ factory: FactoryConfig;
62
+ source: SourceConfig;
63
+ agent: AgentConfig;
64
+ backend: BackendConfig;
65
+ gate: GateConfig;
66
+ guardrails: Guardrails;
67
+ output: OutputConfig;
68
+ /** Names of global shared artifacts to stage into each run's workspace. */
69
+ artifacts: string[];
70
+ }
71
+ /** Default agent tool allowlist: read + write files and run shell/search only. */
72
+ export declare const DEFAULT_ALLOWED_TOOLS: readonly string[];
73
+ /** Guardrail defaults, carried over from the reference factory. */
74
+ export declare const DEFAULT_GUARDRAILS: Guardrails;
75
+ export declare const DEFAULT_BASE_BRANCH = "main";
76
+ export declare const DEFAULT_BACKEND_KIND: BackendKind;
77
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,eAAO,MAAM,YAAY,+CAAgD,CAAC;AAC1E,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvD,eAAO,MAAM,aAAa,0EAMhB,CAAC;AACX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4DAA4D;IAC5D,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,UAAU,CAAC;IACjB,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAED,MAAM,WAAW,WAAW;IAC1B,6EAA6E;IAC7E,IAAI,EAAE,MAAM,CAAC;IACb,4DAA4D;IAC5D,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,WAAW,CAAC;IAClB,kDAAkD;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,2EAA2E;IAC3E,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,qEAAqE;IACrE,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,OAAO,CAAC;IAChB,4DAA4D;IAC5D,KAAK,EAAE,OAAO,CAAC;IACf,wDAAwD;IACxD,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,aAAa,CAAC;IACvB,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE,WAAW,CAAC;IACnB,OAAO,EAAE,aAAa,CAAC;IACvB,IAAI,EAAE,UAAU,CAAC;IACjB,UAAU,EAAE,UAAU,CAAC;IACvB,MAAM,EAAE,YAAY,CAAC;IACrB,2EAA2E;IAC3E,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,kFAAkF;AAClF,eAAO,MAAM,qBAAqB,EAAE,SAAS,MAAM,EAOlD,CAAC;AAEF,mEAAmE;AACnE,eAAO,MAAM,kBAAkB,EAAE,UAMhC,CAAC;AAEF,eAAO,MAAM,mBAAmB,SAAS,CAAC;AAC1C,eAAO,MAAM,oBAAoB,EAAE,WAA8B,CAAC"}