@pythonluvr/openwar 0.4.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 (298) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +297 -0
  3. package/bin/openwar +45 -0
  4. package/dist/adapters/anthropic.d.ts +15 -0
  5. package/dist/adapters/anthropic.d.ts.map +1 -0
  6. package/dist/adapters/anthropic.js +179 -0
  7. package/dist/adapters/anthropic.js.map +1 -0
  8. package/dist/adapters/gemini.d.ts +15 -0
  9. package/dist/adapters/gemini.d.ts.map +1 -0
  10. package/dist/adapters/gemini.js +141 -0
  11. package/dist/adapters/gemini.js.map +1 -0
  12. package/dist/adapters/grok.d.ts +6 -0
  13. package/dist/adapters/grok.d.ts.map +1 -0
  14. package/dist/adapters/grok.js +15 -0
  15. package/dist/adapters/grok.js.map +1 -0
  16. package/dist/adapters/index.d.ts +16 -0
  17. package/dist/adapters/index.d.ts.map +1 -0
  18. package/dist/adapters/index.js +35 -0
  19. package/dist/adapters/index.js.map +1 -0
  20. package/dist/adapters/mock.d.ts +17 -0
  21. package/dist/adapters/mock.d.ts.map +1 -0
  22. package/dist/adapters/mock.js +33 -0
  23. package/dist/adapters/mock.js.map +1 -0
  24. package/dist/adapters/openai-compat.d.ts +6 -0
  25. package/dist/adapters/openai-compat.d.ts.map +1 -0
  26. package/dist/adapters/openai-compat.js +19 -0
  27. package/dist/adapters/openai-compat.js.map +1 -0
  28. package/dist/adapters/openai.d.ts +23 -0
  29. package/dist/adapters/openai.d.ts.map +1 -0
  30. package/dist/adapters/openai.js +176 -0
  31. package/dist/adapters/openai.js.map +1 -0
  32. package/dist/adapters/sse.d.ts +6 -0
  33. package/dist/adapters/sse.d.ts.map +1 -0
  34. package/dist/adapters/sse.js +45 -0
  35. package/dist/adapters/sse.js.map +1 -0
  36. package/dist/adapters/types.d.ts +7 -0
  37. package/dist/adapters/types.d.ts.map +1 -0
  38. package/dist/adapters/types.js +2 -0
  39. package/dist/adapters/types.js.map +1 -0
  40. package/dist/auth/categories.d.ts +13 -0
  41. package/dist/auth/categories.d.ts.map +1 -0
  42. package/dist/auth/categories.js +47 -0
  43. package/dist/auth/categories.js.map +1 -0
  44. package/dist/auth/check.d.ts +31 -0
  45. package/dist/auth/check.d.ts.map +1 -0
  46. package/dist/auth/check.js +59 -0
  47. package/dist/auth/check.js.map +1 -0
  48. package/dist/auth/role-scope.d.ts +18 -0
  49. package/dist/auth/role-scope.d.ts.map +1 -0
  50. package/dist/auth/role-scope.js +62 -0
  51. package/dist/auth/role-scope.js.map +1 -0
  52. package/dist/auth/wildcards.d.ts +5 -0
  53. package/dist/auth/wildcards.d.ts.map +1 -0
  54. package/dist/auth/wildcards.js +36 -0
  55. package/dist/auth/wildcards.js.map +1 -0
  56. package/dist/brief.d.ts +9 -0
  57. package/dist/brief.d.ts.map +1 -0
  58. package/dist/brief.js +514 -0
  59. package/dist/brief.js.map +1 -0
  60. package/dist/cli.d.ts +2 -0
  61. package/dist/cli.d.ts.map +1 -0
  62. package/dist/cli.js +585 -0
  63. package/dist/cli.js.map +1 -0
  64. package/dist/coordinator/cost-tracker.d.ts +14 -0
  65. package/dist/coordinator/cost-tracker.d.ts.map +1 -0
  66. package/dist/coordinator/cost-tracker.js +63 -0
  67. package/dist/coordinator/cost-tracker.js.map +1 -0
  68. package/dist/coordinator/driver.d.ts +37 -0
  69. package/dist/coordinator/driver.d.ts.map +1 -0
  70. package/dist/coordinator/driver.js +644 -0
  71. package/dist/coordinator/driver.js.map +1 -0
  72. package/dist/coordinator/index.d.ts +14 -0
  73. package/dist/coordinator/index.d.ts.map +1 -0
  74. package/dist/coordinator/index.js +8 -0
  75. package/dist/coordinator/index.js.map +1 -0
  76. package/dist/coordinator/plan-parser.d.ts +17 -0
  77. package/dist/coordinator/plan-parser.d.ts.map +1 -0
  78. package/dist/coordinator/plan-parser.js +44 -0
  79. package/dist/coordinator/plan-parser.js.map +1 -0
  80. package/dist/coordinator/result-aggregator.d.ts +21 -0
  81. package/dist/coordinator/result-aggregator.d.ts.map +1 -0
  82. package/dist/coordinator/result-aggregator.js +58 -0
  83. package/dist/coordinator/result-aggregator.js.map +1 -0
  84. package/dist/coordinator/retry-policy.d.ts +7 -0
  85. package/dist/coordinator/retry-policy.d.ts.map +1 -0
  86. package/dist/coordinator/retry-policy.js +17 -0
  87. package/dist/coordinator/retry-policy.js.map +1 -0
  88. package/dist/coordinator/state-machine.d.ts +63 -0
  89. package/dist/coordinator/state-machine.d.ts.map +1 -0
  90. package/dist/coordinator/state-machine.js +242 -0
  91. package/dist/coordinator/state-machine.js.map +1 -0
  92. package/dist/coordinator/types.d.ts +3 -0
  93. package/dist/coordinator/types.d.ts.map +1 -0
  94. package/dist/coordinator/types.js +5 -0
  95. package/dist/coordinator/types.js.map +1 -0
  96. package/dist/detectors/banned-phrases.d.ts +3 -0
  97. package/dist/detectors/banned-phrases.d.ts.map +1 -0
  98. package/dist/detectors/banned-phrases.js +33 -0
  99. package/dist/detectors/banned-phrases.js.map +1 -0
  100. package/dist/detectors/blocker.d.ts +3 -0
  101. package/dist/detectors/blocker.d.ts.map +1 -0
  102. package/dist/detectors/blocker.js +62 -0
  103. package/dist/detectors/blocker.js.map +1 -0
  104. package/dist/detectors/completion.d.ts +3 -0
  105. package/dist/detectors/completion.d.ts.map +1 -0
  106. package/dist/detectors/completion.js +17 -0
  107. package/dist/detectors/completion.js.map +1 -0
  108. package/dist/detectors/confirmation-summary.d.ts +3 -0
  109. package/dist/detectors/confirmation-summary.d.ts.map +1 -0
  110. package/dist/detectors/confirmation-summary.js +76 -0
  111. package/dist/detectors/confirmation-summary.js.map +1 -0
  112. package/dist/detectors/destructive.d.ts +3 -0
  113. package/dist/detectors/destructive.d.ts.map +1 -0
  114. package/dist/detectors/destructive.js +96 -0
  115. package/dist/detectors/destructive.js.map +1 -0
  116. package/dist/detectors/index.d.ts +12 -0
  117. package/dist/detectors/index.d.ts.map +1 -0
  118. package/dist/detectors/index.js +19 -0
  119. package/dist/detectors/index.js.map +1 -0
  120. package/dist/detectors/phase-marker.d.ts +3 -0
  121. package/dist/detectors/phase-marker.d.ts.map +1 -0
  122. package/dist/detectors/phase-marker.js +25 -0
  123. package/dist/detectors/phase-marker.js.map +1 -0
  124. package/dist/framework.d.ts +2 -0
  125. package/dist/framework.d.ts.map +1 -0
  126. package/dist/framework.js +34 -0
  127. package/dist/framework.js.map +1 -0
  128. package/dist/index.d.ts +10 -0
  129. package/dist/index.d.ts.map +1 -0
  130. package/dist/index.js +10 -0
  131. package/dist/index.js.map +1 -0
  132. package/dist/io.d.ts +25 -0
  133. package/dist/io.d.ts.map +1 -0
  134. package/dist/io.js +83 -0
  135. package/dist/io.js.map +1 -0
  136. package/dist/mcp/client.d.ts +22 -0
  137. package/dist/mcp/client.d.ts.map +1 -0
  138. package/dist/mcp/client.js +44 -0
  139. package/dist/mcp/client.js.map +1 -0
  140. package/dist/mcp/index.d.ts +5 -0
  141. package/dist/mcp/index.d.ts.map +1 -0
  142. package/dist/mcp/index.js +6 -0
  143. package/dist/mcp/index.js.map +1 -0
  144. package/dist/mcp/registry.d.ts +16 -0
  145. package/dist/mcp/registry.d.ts.map +1 -0
  146. package/dist/mcp/registry.js +53 -0
  147. package/dist/mcp/registry.js.map +1 -0
  148. package/dist/mcp/transport-stdio.d.ts +26 -0
  149. package/dist/mcp/transport-stdio.d.ts.map +1 -0
  150. package/dist/mcp/transport-stdio.js +138 -0
  151. package/dist/mcp/transport-stdio.js.map +1 -0
  152. package/dist/mcp/types.d.ts +90 -0
  153. package/dist/mcp/types.d.ts.map +1 -0
  154. package/dist/mcp/types.js +23 -0
  155. package/dist/mcp/types.js.map +1 -0
  156. package/dist/orchestration/handoff.d.ts +27 -0
  157. package/dist/orchestration/handoff.d.ts.map +1 -0
  158. package/dist/orchestration/handoff.js +322 -0
  159. package/dist/orchestration/handoff.js.map +1 -0
  160. package/dist/phases/blocker.d.ts +8 -0
  161. package/dist/phases/blocker.d.ts.map +1 -0
  162. package/dist/phases/blocker.js +11 -0
  163. package/dist/phases/blocker.js.map +1 -0
  164. package/dist/phases/completion.d.ts +10 -0
  165. package/dist/phases/completion.d.ts.map +1 -0
  166. package/dist/phases/completion.js +47 -0
  167. package/dist/phases/completion.js.map +1 -0
  168. package/dist/phases/destructive.d.ts +10 -0
  169. package/dist/phases/destructive.d.ts.map +1 -0
  170. package/dist/phases/destructive.js +31 -0
  171. package/dist/phases/destructive.js.map +1 -0
  172. package/dist/phases/execute.d.ts +30 -0
  173. package/dist/phases/execute.d.ts.map +1 -0
  174. package/dist/phases/execute.js +222 -0
  175. package/dist/phases/execute.js.map +1 -0
  176. package/dist/phases/intake.d.ts +16 -0
  177. package/dist/phases/intake.d.ts.map +1 -0
  178. package/dist/phases/intake.js +105 -0
  179. package/dist/phases/intake.js.map +1 -0
  180. package/dist/roles/critic.d.ts +3 -0
  181. package/dist/roles/critic.d.ts.map +1 -0
  182. package/dist/roles/critic.js +35 -0
  183. package/dist/roles/critic.js.map +1 -0
  184. package/dist/roles/executor.d.ts +3 -0
  185. package/dist/roles/executor.d.ts.map +1 -0
  186. package/dist/roles/executor.js +46 -0
  187. package/dist/roles/executor.js.map +1 -0
  188. package/dist/roles/index.d.ts +8 -0
  189. package/dist/roles/index.d.ts.map +1 -0
  190. package/dist/roles/index.js +8 -0
  191. package/dist/roles/index.js.map +1 -0
  192. package/dist/roles/planner.d.ts +3 -0
  193. package/dist/roles/planner.d.ts.map +1 -0
  194. package/dist/roles/planner.js +50 -0
  195. package/dist/roles/planner.js.map +1 -0
  196. package/dist/roles/prompt-overlay.d.ts +9 -0
  197. package/dist/roles/prompt-overlay.d.ts.map +1 -0
  198. package/dist/roles/prompt-overlay.js +25 -0
  199. package/dist/roles/prompt-overlay.js.map +1 -0
  200. package/dist/roles/registry.d.ts +8 -0
  201. package/dist/roles/registry.d.ts.map +1 -0
  202. package/dist/roles/registry.js +45 -0
  203. package/dist/roles/registry.js.map +1 -0
  204. package/dist/roles/reviewer.d.ts +3 -0
  205. package/dist/roles/reviewer.d.ts.map +1 -0
  206. package/dist/roles/reviewer.js +46 -0
  207. package/dist/roles/reviewer.js.map +1 -0
  208. package/dist/roles/types.d.ts +2 -0
  209. package/dist/roles/types.d.ts.map +1 -0
  210. package/dist/roles/types.js +4 -0
  211. package/dist/roles/types.js.map +1 -0
  212. package/dist/runner.d.ts +3 -0
  213. package/dist/runner.d.ts.map +1 -0
  214. package/dist/runner.js +473 -0
  215. package/dist/runner.js.map +1 -0
  216. package/dist/sandbox/host-allowlist.d.ts +13 -0
  217. package/dist/sandbox/host-allowlist.d.ts.map +1 -0
  218. package/dist/sandbox/host-allowlist.js +85 -0
  219. package/dist/sandbox/host-allowlist.js.map +1 -0
  220. package/dist/sandbox/output-cap.d.ts +9 -0
  221. package/dist/sandbox/output-cap.d.ts.map +1 -0
  222. package/dist/sandbox/output-cap.js +66 -0
  223. package/dist/sandbox/output-cap.js.map +1 -0
  224. package/dist/sandbox/timeout.d.ts +7 -0
  225. package/dist/sandbox/timeout.d.ts.map +1 -0
  226. package/dist/sandbox/timeout.js +52 -0
  227. package/dist/sandbox/timeout.js.map +1 -0
  228. package/dist/sandbox/types.d.ts +18 -0
  229. package/dist/sandbox/types.d.ts.map +1 -0
  230. package/dist/sandbox/types.js +27 -0
  231. package/dist/sandbox/types.js.map +1 -0
  232. package/dist/sandbox/workdir.d.ts +9 -0
  233. package/dist/sandbox/workdir.d.ts.map +1 -0
  234. package/dist/sandbox/workdir.js +83 -0
  235. package/dist/sandbox/workdir.js.map +1 -0
  236. package/dist/state/index.d.ts +4 -0
  237. package/dist/state/index.d.ts.map +1 -0
  238. package/dist/state/index.js +4 -0
  239. package/dist/state/index.js.map +1 -0
  240. package/dist/state/paths.d.ts +5 -0
  241. package/dist/state/paths.d.ts.map +1 -0
  242. package/dist/state/paths.js +18 -0
  243. package/dist/state/paths.js.map +1 -0
  244. package/dist/state/persist.d.ts +14 -0
  245. package/dist/state/persist.d.ts.map +1 -0
  246. package/dist/state/persist.js +146 -0
  247. package/dist/state/persist.js.map +1 -0
  248. package/dist/state/transcript.d.ts +9 -0
  249. package/dist/state/transcript.d.ts.map +1 -0
  250. package/dist/state/transcript.js +34 -0
  251. package/dist/state/transcript.js.map +1 -0
  252. package/dist/tools/native/apply_patch.d.ts +18 -0
  253. package/dist/tools/native/apply_patch.d.ts.map +1 -0
  254. package/dist/tools/native/apply_patch.js +245 -0
  255. package/dist/tools/native/apply_patch.js.map +1 -0
  256. package/dist/tools/native/http_fetch.d.ts +6 -0
  257. package/dist/tools/native/http_fetch.d.ts.map +1 -0
  258. package/dist/tools/native/http_fetch.js +168 -0
  259. package/dist/tools/native/http_fetch.js.map +1 -0
  260. package/dist/tools/native/index.d.ts +9 -0
  261. package/dist/tools/native/index.d.ts.map +1 -0
  262. package/dist/tools/native/index.js +22 -0
  263. package/dist/tools/native/index.js.map +1 -0
  264. package/dist/tools/native/list_dir.d.ts +4 -0
  265. package/dist/tools/native/list_dir.d.ts.map +1 -0
  266. package/dist/tools/native/list_dir.js +175 -0
  267. package/dist/tools/native/list_dir.js.map +1 -0
  268. package/dist/tools/native/read_file.d.ts +4 -0
  269. package/dist/tools/native/read_file.d.ts.map +1 -0
  270. package/dist/tools/native/read_file.js +91 -0
  271. package/dist/tools/native/read_file.js.map +1 -0
  272. package/dist/tools/native/shell_exec.d.ts +4 -0
  273. package/dist/tools/native/shell_exec.d.ts.map +1 -0
  274. package/dist/tools/native/shell_exec.js +180 -0
  275. package/dist/tools/native/shell_exec.js.map +1 -0
  276. package/dist/tools/native/write_file.d.ts +4 -0
  277. package/dist/tools/native/write_file.d.ts.map +1 -0
  278. package/dist/tools/native/write_file.js +101 -0
  279. package/dist/tools/native/write_file.js.map +1 -0
  280. package/dist/tools/types.d.ts +48 -0
  281. package/dist/tools/types.d.ts.map +1 -0
  282. package/dist/tools/types.js +10 -0
  283. package/dist/tools/types.js.map +1 -0
  284. package/dist/types.d.ts +385 -0
  285. package/dist/types.d.ts.map +1 -0
  286. package/dist/types.js +9 -0
  287. package/dist/types.js.map +1 -0
  288. package/examples/README.md +73 -0
  289. package/examples/creative-brief.md +34 -0
  290. package/examples/critic-disagreement-brief.md +42 -0
  291. package/examples/engineering-brief.md +35 -0
  292. package/examples/file-editing-brief.md +33 -0
  293. package/examples/mcp-brief.md +34 -0
  294. package/examples/multi-agent-brief.md +43 -0
  295. package/examples/research-brief.md +35 -0
  296. package/openwar.md +248 -0
  297. package/package.json +76 -0
  298. package/templates/brief.md +62 -0
@@ -0,0 +1,322 @@
1
+ // Typed cross-role communication. Every handoff between roles uses one of
2
+ // these shapes. Roles emit a handoff inside a fenced ```json block at the
3
+ // end of their final assistant turn; the coordinator parses, validates,
4
+ // and rejects malformed handoffs with a clear error the role can react to.
5
+ //
6
+ // The validator is hand-written (zero deps) and adversarial-resistant:
7
+ // - Unknown extra fields are stripped (no prototype pollution surface).
8
+ // - String fields are length-capped and stripped of control characters.
9
+ // - Arrays are length-capped.
10
+ // - Discriminator `kind` is exact-match required.
11
+ //
12
+ // Roles must NOT be able to inject behavior into the coordinator by
13
+ // crafting handoff fields. Anything passed through to operator prompts or
14
+ // other roles is sanitized via `sanitizeText`.
15
+ // ---------- Limits ----------
16
+ const MAX_STRING_LEN = 16_000;
17
+ const MAX_SHORT_STRING_LEN = 1_024;
18
+ const MAX_LIST_LEN = 64;
19
+ const MAX_TOOLCALLS_LEN = 256;
20
+ // ---------- Errors ----------
21
+ export class HandoffParseError extends Error {
22
+ cause_text;
23
+ code = "HANDOFF_PARSE";
24
+ constructor(message, cause_text) {
25
+ super(message);
26
+ this.cause_text = cause_text;
27
+ this.name = "HandoffParseError";
28
+ }
29
+ }
30
+ export class HandoffValidationError extends Error {
31
+ path;
32
+ code = "HANDOFF_VALIDATION";
33
+ constructor(message, path) {
34
+ super(`handoff invalid at ${path}: ${message}`);
35
+ this.path = path;
36
+ this.name = "HandoffValidationError";
37
+ }
38
+ }
39
+ // ---------- Fenced-block extractor ----------
40
+ // Pulls the LAST fenced ```json block out of a role's output. The "last"
41
+ // rule means roles may write narrative + thinking before the formal
42
+ // handoff and we always pick the canonical one.
43
+ export function extractHandoffJson(text) {
44
+ const re = /```(?:json|JSON)\s*\n([\s\S]*?)```/g;
45
+ let match;
46
+ let last = null;
47
+ while ((match = re.exec(text)) !== null) {
48
+ last = match[1] ?? null;
49
+ }
50
+ return last === null ? null : last.trim();
51
+ }
52
+ // ---------- Sanitizers ----------
53
+ // Strip C0 control characters except 0x09 (tab), 0x0A (LF), 0x0D (CR),
54
+ // plus DEL (0x7F). Built from hex escapes so the source stays grep-clean.
55
+ const CONTROL_CHARS = new RegExp(String.fromCharCode(0x5b) +
56
+ "\\x00-\\x08" +
57
+ "\\x0B\\x0C" +
58
+ "\\x0E-\\x1F" +
59
+ "\\x7F" +
60
+ String.fromCharCode(0x5d), "g");
61
+ function sanitizeText(value, max = MAX_STRING_LEN) {
62
+ if (typeof value !== "string")
63
+ return "";
64
+ // Strip C0 control chars except tab, LF, CR; plus DEL. Then cap length.
65
+ const cleaned = value.replace(CONTROL_CHARS, "");
66
+ return cleaned.length > max ? cleaned.slice(0, max) : cleaned;
67
+ }
68
+ function sanitizeShort(value) {
69
+ return sanitizeText(value, MAX_SHORT_STRING_LEN);
70
+ }
71
+ function sanitizeStringArray(value, max = MAX_LIST_LEN) {
72
+ if (!Array.isArray(value))
73
+ return [];
74
+ const out = [];
75
+ for (const v of value) {
76
+ if (typeof v === "string") {
77
+ const s = sanitizeShort(v).trim();
78
+ if (s.length > 0)
79
+ out.push(s);
80
+ }
81
+ if (out.length >= max)
82
+ break;
83
+ }
84
+ return out;
85
+ }
86
+ // ---------- Validators ----------
87
+ function requireString(obj, key, path) {
88
+ const v = obj[key];
89
+ if (typeof v !== "string" || v.length === 0) {
90
+ throw new HandoffValidationError(`expected non-empty string at "${key}"`, path);
91
+ }
92
+ return v;
93
+ }
94
+ function isPlainObject(v) {
95
+ return typeof v === "object" && v !== null && !Array.isArray(v);
96
+ }
97
+ export function validatePlanHandoff(raw) {
98
+ if (!isPlainObject(raw)) {
99
+ throw new HandoffValidationError("expected object", "$");
100
+ }
101
+ const kind = requireString(raw, "kind", "$.kind");
102
+ if (kind !== "plan") {
103
+ throw new HandoffValidationError(`expected kind="plan", got ${JSON.stringify(kind)}`, "$.kind");
104
+ }
105
+ if (!Array.isArray(raw.subtasks)) {
106
+ throw new HandoffValidationError("expected array", "$.subtasks");
107
+ }
108
+ if (raw.subtasks.length === 0) {
109
+ throw new HandoffValidationError("plan must contain at least one sub-task", "$.subtasks");
110
+ }
111
+ if (raw.subtasks.length > MAX_LIST_LEN) {
112
+ throw new HandoffValidationError(`too many sub-tasks (max ${MAX_LIST_LEN})`, "$.subtasks");
113
+ }
114
+ const subtasks = [];
115
+ const seenIds = new Set();
116
+ for (let i = 0; i < raw.subtasks.length; i++) {
117
+ const st = raw.subtasks[i];
118
+ const stPath = `$.subtasks[${i}]`;
119
+ if (!isPlainObject(st)) {
120
+ throw new HandoffValidationError("expected object", stPath);
121
+ }
122
+ const id = sanitizeShort(st.id).trim();
123
+ if (!id)
124
+ throw new HandoffValidationError("subtask id required", `${stPath}.id`);
125
+ if (seenIds.has(id)) {
126
+ throw new HandoffValidationError(`duplicate subtask id ${JSON.stringify(id)}`, `${stPath}.id`);
127
+ }
128
+ seenIds.add(id);
129
+ const title = sanitizeShort(st.title).trim();
130
+ if (!title)
131
+ throw new HandoffValidationError("subtask title required", `${stPath}.title`);
132
+ const instruction = sanitizeText(st.instruction).trim();
133
+ if (!instruction) {
134
+ throw new HandoffValidationError("subtask instruction required", `${stPath}.instruction`);
135
+ }
136
+ const acceptance_criteria = sanitizeStringArray(st.acceptance_criteria);
137
+ if (acceptance_criteria.length === 0) {
138
+ throw new HandoffValidationError("subtask acceptance_criteria must list at least one item", `${stPath}.acceptance_criteria`);
139
+ }
140
+ const order = typeof st.order === "number" && Number.isFinite(st.order) ? st.order : i;
141
+ const depends_on = sanitizeStringArray(st.depends_on, 4);
142
+ // v0.4: linear plans only. Sub-task N may depend only on sub-task N-1
143
+ // (or no dependency). Anything else fails validation.
144
+ if (depends_on.length > 0) {
145
+ if (depends_on.length > 1) {
146
+ throw new HandoffValidationError("v0.4 supports linear plans only (max one dependency per sub-task)", `${stPath}.depends_on`);
147
+ }
148
+ const prior = subtasks[subtasks.length - 1];
149
+ if (!prior || depends_on[0] !== prior.id) {
150
+ throw new HandoffValidationError("v0.4 supports linear plans only (dependency must be the immediately preceding sub-task)", `${stPath}.depends_on`);
151
+ }
152
+ }
153
+ subtasks.push({
154
+ id,
155
+ title,
156
+ instruction,
157
+ acceptance_criteria,
158
+ order,
159
+ ...(depends_on.length > 0 ? { depends_on } : {}),
160
+ });
161
+ }
162
+ // Stable ordering: ensure `order` is monotonic. Reassign if planner skipped.
163
+ subtasks.sort((a, b) => a.order - b.order);
164
+ for (let i = 0; i < subtasks.length; i++)
165
+ subtasks[i].order = i;
166
+ const rationale = sanitizeText(raw.rationale).trim();
167
+ return { kind: "plan", subtasks, rationale };
168
+ }
169
+ export function validateExecutionHandoff(raw) {
170
+ if (!isPlainObject(raw))
171
+ throw new HandoffValidationError("expected object", "$");
172
+ const kind = requireString(raw, "kind", "$.kind");
173
+ if (kind !== "execution") {
174
+ throw new HandoffValidationError(`expected kind="execution"`, "$.kind");
175
+ }
176
+ const subtask_id = sanitizeShort(raw.subtask_id).trim();
177
+ if (!subtask_id)
178
+ throw new HandoffValidationError("subtask_id required", "$.subtask_id");
179
+ const output = sanitizeText(raw.output);
180
+ const notes = sanitizeText(raw.notes);
181
+ const tool_calls = sanitizeToolCalls(raw.tool_calls);
182
+ return { kind: "execution", subtask_id, output, tool_calls, notes };
183
+ }
184
+ function sanitizeToolCalls(value) {
185
+ if (!Array.isArray(value))
186
+ return [];
187
+ const out = [];
188
+ for (const v of value) {
189
+ if (!isPlainObject(v))
190
+ continue;
191
+ const call_id = sanitizeShort(v.call_id).trim();
192
+ const name = sanitizeShort(v.name).trim();
193
+ if (!call_id || !name)
194
+ continue;
195
+ const at = sanitizeShort(v.at).trim() || new Date().toISOString();
196
+ const authorized = v.authorized === true;
197
+ const auth_note = typeof v.auth_note === "string" ? sanitizeShort(v.auth_note) : undefined;
198
+ let result;
199
+ if (isPlainObject(v.result)) {
200
+ result = {
201
+ success: v.result.success === true,
202
+ content: sanitizeText(v.result.content),
203
+ };
204
+ }
205
+ out.push({
206
+ call_id,
207
+ name,
208
+ arguments: v.arguments,
209
+ at,
210
+ authorized,
211
+ ...(auth_note ? { auth_note } : {}),
212
+ ...(result ? { result } : {}),
213
+ });
214
+ if (out.length >= MAX_TOOLCALLS_LEN)
215
+ break;
216
+ }
217
+ return out;
218
+ }
219
+ export function validateReviewHandoff(raw) {
220
+ if (!isPlainObject(raw))
221
+ throw new HandoffValidationError("expected object", "$");
222
+ const kind = requireString(raw, "kind", "$.kind");
223
+ if (kind !== "review") {
224
+ throw new HandoffValidationError(`expected kind="review"`, "$.kind");
225
+ }
226
+ const subtask_id = sanitizeShort(raw.subtask_id).trim();
227
+ if (!subtask_id)
228
+ throw new HandoffValidationError("subtask_id required", "$.subtask_id");
229
+ const verdict = raw.verdict;
230
+ if (verdict !== "pass" && verdict !== "fail" && verdict !== "needs_retry") {
231
+ throw new HandoffValidationError(`verdict must be "pass" | "fail" | "needs_retry"`, "$.verdict");
232
+ }
233
+ const rationale = sanitizeText(raw.rationale).trim();
234
+ if (!rationale) {
235
+ throw new HandoffValidationError("rationale required", "$.rationale");
236
+ }
237
+ const suggested_revision = typeof raw.suggested_revision === "string"
238
+ ? sanitizeText(raw.suggested_revision)
239
+ : undefined;
240
+ return {
241
+ kind: "review",
242
+ subtask_id,
243
+ verdict,
244
+ rationale,
245
+ ...(suggested_revision ? { suggested_revision } : {}),
246
+ };
247
+ }
248
+ export function validateEscalationHandoff(raw) {
249
+ if (!isPlainObject(raw))
250
+ throw new HandoffValidationError("expected object", "$");
251
+ const kind = requireString(raw, "kind", "$.kind");
252
+ if (kind !== "escalation") {
253
+ throw new HandoffValidationError(`expected kind="escalation"`, "$.kind");
254
+ }
255
+ const severity = raw.severity;
256
+ if (severity !== "info" && severity !== "warn" && severity !== "error") {
257
+ throw new HandoffValidationError(`severity must be info|warn|error`, "$.severity");
258
+ }
259
+ const role = sanitizeShort(raw.role).trim();
260
+ if (!role)
261
+ throw new HandoffValidationError("role required", "$.role");
262
+ const reason = sanitizeText(raw.reason).trim();
263
+ if (!reason)
264
+ throw new HandoffValidationError("reason required", "$.reason");
265
+ const context = sanitizeText(raw.context);
266
+ const budget_metric = raw.budget_metric === "tokens" ||
267
+ raw.budget_metric === "wall_clock_ms" ||
268
+ raw.budget_metric === "tool_calls"
269
+ ? raw.budget_metric
270
+ : undefined;
271
+ return {
272
+ kind: "escalation",
273
+ severity,
274
+ role,
275
+ reason,
276
+ context,
277
+ ...(budget_metric ? { budget_metric } : {}),
278
+ };
279
+ }
280
+ export function parseHandoffFromText(text) {
281
+ const fenced = extractHandoffJson(text);
282
+ if (fenced === null) {
283
+ return { ok: false, reason: "no_fence", message: "no fenced ```json block found" };
284
+ }
285
+ let parsed;
286
+ try {
287
+ parsed = JSON.parse(fenced);
288
+ }
289
+ catch (err) {
290
+ return {
291
+ ok: false,
292
+ reason: "bad_json",
293
+ message: err.message.slice(0, 240),
294
+ };
295
+ }
296
+ if (!isPlainObject(parsed)) {
297
+ return { ok: false, reason: "validation", message: "handoff must be a JSON object" };
298
+ }
299
+ const kind = parsed.kind;
300
+ try {
301
+ if (kind === "plan")
302
+ return { ok: true, handoff: validatePlanHandoff(parsed) };
303
+ if (kind === "execution")
304
+ return { ok: true, handoff: validateExecutionHandoff(parsed) };
305
+ if (kind === "review")
306
+ return { ok: true, handoff: validateReviewHandoff(parsed) };
307
+ if (kind === "escalation")
308
+ return { ok: true, handoff: validateEscalationHandoff(parsed) };
309
+ return {
310
+ ok: false,
311
+ reason: "validation",
312
+ message: `unknown handoff kind ${JSON.stringify(kind)}`,
313
+ };
314
+ }
315
+ catch (err) {
316
+ if (err instanceof HandoffValidationError) {
317
+ return { ok: false, reason: "validation", message: err.message };
318
+ }
319
+ throw err;
320
+ }
321
+ }
322
+ //# sourceMappingURL=handoff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handoff.js","sourceRoot":"","sources":["../../src/orchestration/handoff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { Message, RunnerIO } from "../types.js";
2
+ export interface BlockerOpts {
3
+ io: RunnerIO;
4
+ reason: string;
5
+ lastAssistant?: Message;
6
+ }
7
+ export declare function reportBlocker(opts: BlockerOpts): void;
8
+ //# sourceMappingURL=blocker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blocker.d.ts","sourceRoot":"","sources":["../../src/phases/blocker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAKrD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,QAAQ,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CASrD"}
@@ -0,0 +1,11 @@
1
+ export function reportBlocker(opts) {
2
+ const { io, reason, lastAssistant } = opts;
3
+ io.banner("Phase 2: Blocker");
4
+ io.write(`Reason: ${reason}\n`);
5
+ if (lastAssistant) {
6
+ io.write("\nLast assistant message:\n");
7
+ io.write(lastAssistant.content.trim() + "\n");
8
+ }
9
+ io.write("\nRuntime has stopped. Resume with `openwar resume <brief_id>` after resolving.\n");
10
+ }
11
+ //# sourceMappingURL=blocker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blocker.js","sourceRoot":"","sources":["../../src/phases/blocker.ts"],"names":[],"mappings":"AAWA,MAAM,UAAU,aAAa,CAAC,IAAiB;IAC7C,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC;IAC3C,EAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAC9B,EAAE,CAAC,KAAK,CAAC,WAAW,MAAM,IAAI,CAAC,CAAC;IAChC,IAAI,aAAa,EAAE,CAAC;QAClB,EAAE,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACxC,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC;IAChD,CAAC;IACD,EAAE,CAAC,KAAK,CAAC,mFAAmF,CAAC,CAAC;AAChG,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { AgentAdapter, Message, RunnerIO } from "../types.js";
2
+ export interface CompletionOpts {
3
+ adapter: AgentAdapter;
4
+ system: string;
5
+ io: RunnerIO;
6
+ history: Message[];
7
+ signal?: AbortSignal;
8
+ }
9
+ export declare function runCompletion(opts: CompletionOpts): Promise<Message>;
10
+ //# sourceMappingURL=completion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../../src/phases/completion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAe,MAAM,aAAa,CAAC;AAEhF,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,YAAY,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,QAAQ,CAAC;IACb,OAAO,EAAE,OAAO,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAYD,wBAAsB,aAAa,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAqC1E"}
@@ -0,0 +1,47 @@
1
+ const FINAL_REPORT_PROMPT = `
2
+ Produce the Phase 4 completion report now. Be concise:
3
+
4
+ - What was delivered
5
+ - Anything unresolved
6
+ - Anything left open / handed back to the operator
7
+
8
+ Do not restate the diff or anything visible in the work itself. Surface what the operator cannot see by reading the result.
9
+ `.trim();
10
+ export async function runCompletion(opts) {
11
+ const { adapter, system, io, history, signal } = opts;
12
+ io.banner("Phase 4: Completion");
13
+ const request = {
14
+ role: "user",
15
+ content: FINAL_REPORT_PROMPT,
16
+ at: new Date().toISOString(),
17
+ meta: { phase: "completion", step_index: 0 },
18
+ };
19
+ let assembled = "";
20
+ for await (const ev of adapter.sendMessage({
21
+ system,
22
+ messages: [...history, request],
23
+ ...(signal ? { signal } : {}),
24
+ })) {
25
+ if (ev.type === "text_delta") {
26
+ io.write(ev.delta);
27
+ assembled += ev.delta;
28
+ }
29
+ else if (ev.type === "done") {
30
+ io.write("\n");
31
+ if (ev.message && ev.message.length >= assembled.length) {
32
+ assembled = ev.message;
33
+ }
34
+ break;
35
+ }
36
+ else if (ev.type === "error") {
37
+ throw ev.error;
38
+ }
39
+ }
40
+ return {
41
+ role: "assistant",
42
+ content: assembled,
43
+ at: new Date().toISOString(),
44
+ meta: { phase: "completion", step_index: 1 },
45
+ };
46
+ }
47
+ //# sourceMappingURL=completion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.js","sourceRoot":"","sources":["../../src/phases/completion.ts"],"names":[],"mappings":"AAUA,MAAM,mBAAmB,GAAG;;;;;;;;CAQ3B,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAoB;IACtD,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACtD,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAEjC,MAAM,OAAO,GAAY;QACvB,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,mBAAmB;QAC5B,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC5B,IAAI,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC,EAAE;KAC7C,CAAC;IAEF,IAAI,SAAS,GAAG,EAAE,CAAC;IACnB,IAAI,KAAK,EAAE,MAAM,EAAE,IAAI,OAAO,CAAC,WAAW,CAAC;QACzC,MAAM;QACN,QAAQ,EAAE,CAAC,GAAG,OAAO,EAAE,OAAO,CAAC;QAC/B,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9B,CAA+B,EAAE,CAAC;QACjC,IAAI,EAAE,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAC7B,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;YACnB,SAAS,IAAI,EAAE,CAAC,KAAK,CAAC;QACxB,CAAC;aAAM,IAAI,EAAE,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC9B,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACf,IAAI,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;gBACxD,SAAS,GAAG,EAAE,CAAC,OAAO,CAAC;YACzB,CAAC;YACD,MAAM;QACR,CAAC;aAAM,IAAI,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC/B,MAAM,EAAE,CAAC,KAAK,CAAC;QACjB,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,SAAS;QAClB,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC5B,IAAI,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC,EAAE;KAC7C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { DestructiveDetection, Message, RunnerIO } from "../types.js";
2
+ export interface DestructiveOpts {
3
+ io: RunnerIO;
4
+ detection: DestructiveDetection;
5
+ lastAssistant?: Message;
6
+ }
7
+ export declare function awaitOperatorYes(opts: DestructiveOpts): Promise<boolean>;
8
+ export declare function denialMessage(detection: DestructiveDetection): Message;
9
+ export declare function approvalMessage(detection: DestructiveDetection): Message;
10
+ //# sourceMappingURL=destructive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"destructive.d.ts","sourceRoot":"","sources":["../../src/phases/destructive.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAI3E,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,QAAQ,CAAC;IACb,SAAS,EAAE,oBAAoB,CAAC;IAChC,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAa9E;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,oBAAoB,GAAG,OAAO,CAStE;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,oBAAoB,GAAG,OAAO,CASxE"}
@@ -0,0 +1,31 @@
1
+ export async function awaitOperatorYes(opts) {
2
+ const { io, detection, lastAssistant } = opts;
3
+ io.banner("Phase 3: Destructive flag");
4
+ io.write(`Action category: ${detection.action ?? "unspecified"}\n`);
5
+ if (lastAssistant) {
6
+ io.write("\nProposed action (from the agent):\n");
7
+ io.write(lastAssistant.content.trim() + "\n\n");
8
+ }
9
+ io.write("This action falls outside the brief's authorized_costs and requires explicit approval.\n");
10
+ const approved = await io.confirm("Approve this action for the current session?");
11
+ return approved;
12
+ }
13
+ export function denialMessage(detection) {
14
+ return {
15
+ role: "user",
16
+ content: `The operator has DENIED the destructive action ("${detection.action ?? "unspecified"}"). ` +
17
+ "Do not perform it. Propose a non-destructive alternative or stop and ask for a scope clarification.",
18
+ at: new Date().toISOString(),
19
+ meta: { phase: "destructive", step_index: 0 },
20
+ };
21
+ }
22
+ export function approvalMessage(detection) {
23
+ return {
24
+ role: "user",
25
+ content: `The operator has APPROVED the destructive action ("${detection.action ?? "unspecified"}") ` +
26
+ "for the current session. Proceed, then report what was done.",
27
+ at: new Date().toISOString(),
28
+ meta: { phase: "destructive", step_index: 0 },
29
+ };
30
+ }
31
+ //# sourceMappingURL=destructive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"destructive.js","sourceRoot":"","sources":["../../src/phases/destructive.ts"],"names":[],"mappings":"AAUA,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAqB;IAC1D,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC;IAC9C,EAAE,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAC;IACvC,EAAE,CAAC,KAAK,CAAC,oBAAoB,SAAS,CAAC,MAAM,IAAI,aAAa,IAAI,CAAC,CAAC;IACpE,IAAI,aAAa,EAAE,CAAC;QAClB,EAAE,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAClD,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,CAAC;IAClD,CAAC;IACD,EAAE,CAAC,KAAK,CACN,0FAA0F,CAC3F,CAAC;IACF,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,8CAA8C,CAAC,CAAC;IAClF,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,SAA+B;IAC3D,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,OAAO,EACL,oDAAoD,SAAS,CAAC,MAAM,IAAI,aAAa,MAAM;YAC3F,qGAAqG;QACvG,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC5B,IAAI,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,EAAE;KAC9C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,SAA+B;IAC7D,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,OAAO,EACL,sDAAsD,SAAS,CAAC,MAAM,IAAI,aAAa,KAAK;YAC5F,8DAA8D;QAChE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC5B,IAAI,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,EAAE;KAC9C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { AgentAdapter, Brief, Message, RunnerIO, ExecutionMode, DetectorSnapshot, ToolDefinition, ToolCall, ToolResultForRound } from "../types.js";
2
+ import type { SandboxContext } from "../sandbox/types.js";
3
+ import type { ToolExecutor } from "../tools/types.js";
4
+ export interface ExecuteOpts {
5
+ brief: Brief;
6
+ adapter: AgentAdapter;
7
+ system: string;
8
+ io: RunnerIO;
9
+ mode: ExecutionMode;
10
+ history: Message[];
11
+ maxSteps?: number;
12
+ maxToolRoundsPerStep?: number;
13
+ signal?: AbortSignal;
14
+ onMessage?: (m: Message) => void;
15
+ onToolCall?: (call: ToolCall, result: ToolResultForRound) => void;
16
+ toolDefinitions?: ToolDefinition[];
17
+ toolExecutors?: Map<string, ToolExecutor>;
18
+ sandbox?: SandboxContext;
19
+ sessionApproved?: string[];
20
+ }
21
+ export interface ExecuteResult {
22
+ history: Message[];
23
+ outcome: "completion" | "blocker" | "destructive_denied" | "max_steps" | "operator_done";
24
+ reason?: string;
25
+ blocking_detectors?: DetectorSnapshot;
26
+ destructive_tool_call?: ToolCall;
27
+ destructive_missing_categories?: readonly string[];
28
+ }
29
+ export declare function runExecute(opts: ExecuteOpts): Promise<ExecuteResult>;
30
+ //# sourceMappingURL=execute.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../src/phases/execute.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,KAAK,EACL,OAAO,EACP,QAAQ,EACR,aAAa,EAEb,gBAAgB,EAChB,cAAc,EACd,QAAQ,EACR,kBAAkB,EACnB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAItD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,YAAY,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,QAAQ,CAAC;IACb,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE,OAAO,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACjC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAGlE,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;IACnC,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC1C,OAAO,CAAC,EAAE,cAAc,CAAC;IAEzB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,EAAE,CAAC;IACnB,OAAO,EAAE,YAAY,GAAG,SAAS,GAAG,oBAAoB,GAAG,WAAW,GAAG,eAAe,CAAC;IACzF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kBAAkB,CAAC,EAAE,gBAAgB,CAAC;IAGtC,qBAAqB,CAAC,EAAE,QAAQ,CAAC;IACjC,8BAA8B,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACpD;AAkBD,wBAAsB,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAwM1E"}