@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,45 @@
1
+ // Role registry. Built-in roles are registered at module-load time;
2
+ // forkers add custom roles via `registerRole(def)`. The registry is the
3
+ // authoritative source the brief validator consults when checking that a
4
+ // brief's `roles:` field references known ids.
5
+ import { plannerDefinition } from "./planner.js";
6
+ import { executorDefinition } from "./executor.js";
7
+ import { reviewerDefinition } from "./reviewer.js";
8
+ import { criticDefinition } from "./critic.js";
9
+ const registry = new Map();
10
+ export function registerRole(def) {
11
+ if (!def.id || typeof def.id !== "string") {
12
+ throw new Error("Role definition requires a non-empty string id.");
13
+ }
14
+ registry.set(def.id, def);
15
+ }
16
+ export function getRole(id) {
17
+ return registry.get(id);
18
+ }
19
+ export function listRoles() {
20
+ return [...registry.values()];
21
+ }
22
+ export function listRoleIds() {
23
+ return [...registry.keys()];
24
+ }
25
+ // Replace a registered role. Mostly used in tests to swap built-ins for
26
+ // deterministic prompts. Does not warn on missing prior registration.
27
+ export function setRole(def) {
28
+ registry.set(def.id, def);
29
+ }
30
+ // Test/utility: clear non-builtin entries. Built-ins are re-registered at
31
+ // the bottom of this module on first import; tests that need a clean slate
32
+ // can call this and then re-import this module to reset.
33
+ export function _resetRegistryToBuiltIns() {
34
+ registry.clear();
35
+ registerBuiltIns();
36
+ }
37
+ function registerBuiltIns() {
38
+ registerRole(plannerDefinition);
39
+ registerRole(executorDefinition);
40
+ registerRole(reviewerDefinition);
41
+ registerRole(criticDefinition);
42
+ }
43
+ // Side effect at load: every consumer of the registry sees built-ins.
44
+ registerBuiltIns();
45
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/roles/registry.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,wEAAwE;AACxE,yEAAyE;AACzE,+CAA+C;AAG/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA0B,CAAC;AAEnD,MAAM,UAAU,YAAY,CAAC,GAAmB;IAC9C,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IACD,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,EAAU;IAChC,OAAO,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;AAC9B,CAAC;AAED,wEAAwE;AACxE,sEAAsE;AACtE,MAAM,UAAU,OAAO,CAAC,GAAmB;IACzC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED,0EAA0E;AAC1E,2EAA2E;AAC3E,yDAAyD;AACzD,MAAM,UAAU,wBAAwB;IACtC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACjB,gBAAgB,EAAE,CAAC;AACrB,CAAC;AAED,SAAS,gBAAgB;IACvB,YAAY,CAAC,iBAAiB,CAAC,CAAC;IAChC,YAAY,CAAC,kBAAkB,CAAC,CAAC;IACjC,YAAY,CAAC,kBAAkB,CAAC,CAAC;IACjC,YAAY,CAAC,gBAAgB,CAAC,CAAC;AACjC,CAAC;AAED,sEAAsE;AACtE,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { RoleDefinition } from "../types.js";
2
+ export declare const reviewerDefinition: RoleDefinition;
3
+ //# sourceMappingURL=reviewer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reviewer.d.ts","sourceRoot":"","sources":["../../src/roles/reviewer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,eAAO,MAAM,kBAAkB,EAAE,cA6ChC,CAAC"}
@@ -0,0 +1,46 @@
1
+ export const reviewerDefinition = {
2
+ id: "reviewer",
3
+ description: "Evaluates the executor's output against the sub-task's acceptance " +
4
+ "criteria. Read-only file access; no write or shell. Emits a pass/fail/" +
5
+ "needs_retry verdict.",
6
+ // No write categories. read_file allowed for verification reads.
7
+ tool_categories: ["filesystem_read"],
8
+ allow_read_file: true,
9
+ prompt_overlay: `
10
+ You are the **reviewer** role under the OpenWar multi-agent coordinator.
11
+
12
+ You evaluate the executor's output against a single sub-task's acceptance
13
+ criteria. You are not the executor's friend; you are the quality gate.
14
+
15
+ Your responsibilities:
16
+
17
+ 1. Read the executor's ExecutionHandoff carefully. Check every acceptance
18
+ criterion. If you need to verify a claim by reading a file, use read_file
19
+ (your only authorized tool category is filesystem_read).
20
+ 2. Produce one ReviewHandoff. Verdict is one of:
21
+ - "pass": every acceptance criterion is met, no qualifications.
22
+ - "fail": the executor's output is fundamentally wrong or unrecoverable.
23
+ Coordinator escalates this to the operator.
24
+ - "needs_retry": the executor's output is close but missing or mistaken
25
+ on specific points the executor can fix. Include a concrete
26
+ suggested_revision string the executor can act on.
27
+ 3. End your reply with a single fenced \`\`\`json block:
28
+ {
29
+ "kind": "review",
30
+ "subtask_id": "<the sub-task id>",
31
+ "verdict": "pass" | "fail" | "needs_retry",
32
+ "rationale": "<terse explanation, point-by-point against criteria>",
33
+ "suggested_revision": "<only when verdict is needs_retry>"
34
+ }
35
+ 4. Do not invent acceptance criteria the planner did not specify. Do not
36
+ downgrade the bar because the executor "tried hard."
37
+ 5. If you cannot evaluate (e.g. the executor referenced a file you cannot
38
+ read), return verdict "needs_retry" with a suggested_revision asking
39
+ the executor to surface the file's contents inline. Do not emit "fail"
40
+ for ambiguity.
41
+
42
+ You do not have write or shell access. Trying to use them would halt the
43
+ coordinator on a structural error.
44
+ `.trim(),
45
+ };
46
+ //# sourceMappingURL=reviewer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reviewer.js","sourceRoot":"","sources":["../../src/roles/reviewer.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,kBAAkB,GAAmB;IAChD,EAAE,EAAE,UAAU;IACd,WAAW,EACT,oEAAoE;QACpE,wEAAwE;QACxE,sBAAsB;IACxB,iEAAiE;IACjE,eAAe,EAAE,CAAC,iBAAiB,CAAC;IACpC,eAAe,EAAE,IAAI;IACrB,cAAc,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmCjB,CAAC,IAAI,EAAE;CACP,CAAC"}
@@ -0,0 +1,2 @@
1
+ export type { RoleDefinition, RoleContext, RoleResult, RoleCost, RoleId, BuiltInRoleId, } from "../types.js";
2
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/roles/types.ts"],"names":[],"mappings":"AAGA,YAAY,EACV,cAAc,EACd,WAAW,EACX,UAAU,EACV,QAAQ,EACR,MAAM,EACN,aAAa,GACd,MAAM,aAAa,CAAC"}
@@ -0,0 +1,4 @@
1
+ // Re-export the v0.4 role-related types from the central types file so
2
+ // consumers can import either path (`openwar/roles/types` or `openwar`).
3
+ export {};
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/roles/types.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,yEAAyE"}
@@ -0,0 +1,3 @@
1
+ import type { RunOptions, RunResult } from "./types.js";
2
+ export declare function run(opts: RunOptions): Promise<RunResult>;
3
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,UAAU,EACV,SAAS,EAQV,MAAM,YAAY,CAAC;AAuBpB,wBAAsB,GAAG,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAic9D"}
package/dist/runner.js ADDED
@@ -0,0 +1,473 @@
1
+ import { parseBrief, validateBrief, generateBriefId } from "./brief.js";
2
+ import { loadFrameworkDoc } from "./framework.js";
3
+ import { runIntake } from "./phases/intake.js";
4
+ import { runExecute } from "./phases/execute.js";
5
+ import { reportBlocker } from "./phases/blocker.js";
6
+ import { awaitOperatorYes, approvalMessage, denialMessage, } from "./phases/destructive.js";
7
+ import { runCompletion } from "./phases/completion.js";
8
+ import { createTerminalIO } from "./io.js";
9
+ import { writeSession, readSession } from "./state/persist.js";
10
+ import { appendTranscript } from "./state/transcript.js";
11
+ import { NATIVE_TOOLS } from "./tools/native/index.js";
12
+ import { SandboxContext } from "./sandbox/types.js";
13
+ import { loadHostAllowlist } from "./sandbox/host-allowlist.js";
14
+ import { homedir } from "node:os";
15
+ import { join } from "node:path";
16
+ import { MCPClient, StdioTransport, loadGlobalMcpConfig, splitCommand } from "./mcp/index.js";
17
+ export async function run(opts) {
18
+ if (!opts.briefPath && !opts.briefSource) {
19
+ throw new Error("run() requires either briefPath or briefSource.");
20
+ }
21
+ const briefInput = opts.briefSource ?? opts.briefPath;
22
+ const brief = parseBrief(briefInput);
23
+ const validation = validateBrief(brief);
24
+ const errors = validation.issues.filter((i) => i.severity === "error");
25
+ if (errors.length > 0) {
26
+ throw new Error(`Brief is invalid: ${errors.map((e) => `${e.field}: ${e.message}`).join("; ")}`);
27
+ }
28
+ const io = opts.io ?? createTerminalIO();
29
+ const adapter = opts.adapter;
30
+ if (!adapter.isConfigured()) {
31
+ throw new Error(`Adapter "${adapter.id}" is not configured. Check API key environment variable.`);
32
+ }
33
+ // Compose the system prompt: framework doc verbatim, no inlining.
34
+ const framework = loadFrameworkDoc();
35
+ const system = framework;
36
+ // Resolve / open session.
37
+ const briefId = opts.sessionId ?? brief.frontmatter.brief_id ?? generateBriefId();
38
+ let session;
39
+ let isResumed = false;
40
+ if (!opts.ephemeral && opts.resume) {
41
+ const prior = readSession(briefId);
42
+ if (prior) {
43
+ session = prior;
44
+ isResumed = true;
45
+ io.banner(`Resuming session ${briefId} (phase: ${session.meta.phase})`);
46
+ }
47
+ else {
48
+ session = createSession(brief, briefId);
49
+ }
50
+ }
51
+ else {
52
+ session = createSession(brief, briefId);
53
+ }
54
+ const persist = () => {
55
+ if (opts.ephemeral)
56
+ return;
57
+ session.meta.updated_at = new Date().toISOString();
58
+ writeSession(session);
59
+ };
60
+ const recordMessage = (m) => {
61
+ session.messages.push(m);
62
+ if (!opts.ephemeral)
63
+ appendTranscript(session.meta.brief_id, m);
64
+ };
65
+ const transition = (to, reason) => {
66
+ const t = {
67
+ from: session.meta.phase,
68
+ to,
69
+ at: new Date().toISOString(),
70
+ reason,
71
+ };
72
+ session.meta.phase = to;
73
+ session.meta.transitions.push(t);
74
+ };
75
+ // ------------------- Phase 0 -------------------
76
+ let mode;
77
+ let historyForExecute;
78
+ if (!isResumed || session.meta.phase === "intake") {
79
+ transition("intake", "starting");
80
+ persist();
81
+ const intake = await runIntake({ brief, adapter, system, io });
82
+ recordMessage(intake.brief_prompt);
83
+ recordMessage(intake.assistant_message);
84
+ persist();
85
+ if (!intake.accepted) {
86
+ // Operator did not accept. Persist their correction as the next user
87
+ // turn so a future `resume` can pick it up.
88
+ if (intake.operator_reply.trim()) {
89
+ recordMessage({
90
+ role: "user",
91
+ content: intake.operator_reply,
92
+ at: new Date().toISOString(),
93
+ meta: { phase: "intake", step_index: 2 },
94
+ });
95
+ }
96
+ persist();
97
+ io.write("\nConfirmation Summary not accepted. Session paused at Phase 0. Resume with adjustments or restart.\n");
98
+ return {
99
+ session_id: session.meta.brief_id,
100
+ final_phase: "intake",
101
+ completed: false,
102
+ halted: true,
103
+ halt_reason: "intake_not_accepted",
104
+ messages: session.messages,
105
+ };
106
+ }
107
+ mode = await resolveMode(brief, opts, io, intake.operator_reply);
108
+ session.meta.mode = mode;
109
+ historyForExecute = [intake.brief_prompt, intake.assistant_message];
110
+ }
111
+ else {
112
+ mode = session.meta.mode ?? (await resolveMode(brief, opts, io, ""));
113
+ session.meta.mode = mode;
114
+ historyForExecute = session.messages.slice();
115
+ }
116
+ // ------------------- Set up tools + sandbox + MCP -------------------
117
+ const workdir = opts.workdir ?? brief.frontmatter.workdir ?? process.cwd();
118
+ const httpAllowPath = join(homedir(), ".openwar", "http-allow.json");
119
+ let httpAllowlist;
120
+ try {
121
+ httpAllowlist = await loadHostAllowlist(httpAllowPath);
122
+ }
123
+ catch {
124
+ httpAllowlist = null;
125
+ }
126
+ const sandbox = SandboxContext._create({
127
+ workdir,
128
+ defaultTimeoutMs: 30_000,
129
+ defaultMaxOutputBytes: 1_000_000,
130
+ httpAllowlist,
131
+ shellEnabled: !opts.disableShell,
132
+ });
133
+ const toolDefinitions = [];
134
+ const toolExecutors = new Map();
135
+ if (!opts.disableNativeTools) {
136
+ for (const [name, t] of NATIVE_TOOLS.entries()) {
137
+ toolDefinitions.push(t.definition);
138
+ toolExecutors.set(name, t.executor);
139
+ }
140
+ }
141
+ // MCP servers from brief + global + opts.
142
+ const mcpClients = [];
143
+ const briefMcp = brief.frontmatter.mcp_servers ?? [];
144
+ const globalMcp = await loadGlobalMcpConfig().catch(() => []);
145
+ const mcpConfigs = [...globalMcp, ...briefMcp, ...(opts.mcpServers ?? [])];
146
+ for (const cfg of mcpConfigs) {
147
+ try {
148
+ const { bin, args } = splitCommand(cfg.command);
149
+ const transport = new StdioTransport({ command: bin, args, ...(cfg.cwd && { cwd: cfg.cwd }) });
150
+ const client = new MCPClient({ transport });
151
+ await client.connect();
152
+ const tools = await client.listTools();
153
+ for (const t of tools) {
154
+ const fqName = `${cfg.name}:${t.name}`;
155
+ toolDefinitions.push({
156
+ name: fqName,
157
+ description: t.description ?? `MCP tool ${fqName}`,
158
+ input_schema: t.inputSchema,
159
+ origin: "mcp",
160
+ mcp_server_name: cfg.name,
161
+ authorization_categories: [`mcp_tool:${cfg.name}:${t.name}`],
162
+ });
163
+ toolExecutors.set(fqName, async (call) => {
164
+ const result = await client.callTool({ name: t.name, arguments: call.arguments });
165
+ const text = result.content.map(c => c.text ?? "").join("\n");
166
+ return {
167
+ call_id: call.id,
168
+ success: !result.isError,
169
+ content: text,
170
+ ...(result.isError && { error: { code: "MCP_ERROR", message: text } }),
171
+ };
172
+ });
173
+ }
174
+ mcpClients.push(client);
175
+ io.write(`MCP connected: ${cfg.name} (${tools.length} tools)\n`);
176
+ }
177
+ catch (err) {
178
+ io.warn(`MCP server "${cfg.name}" failed to connect: ${err.message}`);
179
+ }
180
+ }
181
+ const cleanupMcp = async () => {
182
+ for (const c of mcpClients)
183
+ await c.disconnect().catch(() => { });
184
+ };
185
+ // ------------------- v0.4 multi-agent branch -------------------
186
+ // When the brief opts into multi-agent (roles: [planner, executor, reviewer, ...]),
187
+ // the coordinator drives the rest of the run. Single-agent mode (roles
188
+ // unset or roles: []) falls through to the v0.3 phase loop below.
189
+ const roleIds = (opts.runtimeRoles ?? brief.frontmatter.roles ?? []).filter((r) => typeof r === "string" && r.length > 0);
190
+ if (roleIds.length > 0) {
191
+ const { runCoordinator, resolveBudgets } = await import("./coordinator/index.js");
192
+ const budgets = { ...resolveBudgets(brief), ...(opts.runtimeBudgets ?? {}) };
193
+ transition("execute", "intake accepted (multi-agent)");
194
+ persist();
195
+ const coordResult = await runCoordinator({
196
+ brief,
197
+ framework: system,
198
+ adapter,
199
+ io,
200
+ roleIds,
201
+ budgets,
202
+ toolDefinitions,
203
+ toolExecutors,
204
+ sandbox,
205
+ sessionApproved: session.meta.session_approved_categories ?? [],
206
+ sessionId: session.meta.brief_id,
207
+ onSnapshot: (snap, events) => {
208
+ // Project coordinator snapshot into SessionMeta (schema v3 fields).
209
+ const metaV3 = session.meta;
210
+ metaV3.coordinator_state = snap.state;
211
+ metaV3.plan = snap.plan;
212
+ metaV3.subtask_states = snap.subtask_states;
213
+ metaV3.active_roles = snap.active_roles;
214
+ metaV3.budgets = snap.budgets;
215
+ metaV3.coordinator_events = events;
216
+ if (!metaV3.cost)
217
+ metaV3.cost = { tokens_used: 0, wall_clock_ms: 0, tool_calls: 0, tool_calls_by_subtask: {}, started_at: new Date().toISOString() };
218
+ metaV3.cost.tokens_used = snap.cost.tokens_used;
219
+ metaV3.cost.wall_clock_ms = snap.cost.wall_clock_ms;
220
+ metaV3.cost.tool_calls_by_subtask = { ...snap.cost.tool_calls_by_subtask };
221
+ persist();
222
+ },
223
+ onMessage: (m) => {
224
+ recordMessage(m);
225
+ },
226
+ onApproval: (a) => {
227
+ session.meta.destructive_approvals.push({
228
+ at: new Date().toISOString(),
229
+ action: a.action,
230
+ approved: a.approved,
231
+ ...(a.session_categories ? { session_categories: a.session_categories } : {}),
232
+ });
233
+ if (a.approved && a.session_categories) {
234
+ const existing = session.meta.session_approved_categories ?? [];
235
+ for (const c of a.session_categories)
236
+ if (!existing.includes(c))
237
+ existing.push(c);
238
+ session.meta.session_approved_categories = existing;
239
+ }
240
+ persist();
241
+ },
242
+ });
243
+ transition(coordResult.completed ? "done" : "blocker", `coordinator final_state=${coordResult.final_state}`);
244
+ persist();
245
+ await cleanupMcp();
246
+ return {
247
+ session_id: session.meta.brief_id,
248
+ final_phase: coordResult.final_phase,
249
+ completed: coordResult.completed,
250
+ halted: coordResult.halted,
251
+ ...(coordResult.halt_reason ? { halt_reason: coordResult.halt_reason } : {}),
252
+ messages: session.messages,
253
+ };
254
+ }
255
+ // ------------------- Phase 1 (single-agent, v0.3) -------------------
256
+ transition("execute", "intake accepted");
257
+ persist();
258
+ let executeResult = await runExecute({
259
+ brief,
260
+ adapter,
261
+ system,
262
+ io,
263
+ mode,
264
+ history: historyForExecute,
265
+ toolDefinitions,
266
+ toolExecutors,
267
+ sandbox,
268
+ sessionApproved: session.meta.session_approved_categories ?? [],
269
+ onMessage: (m) => {
270
+ recordMessage(m);
271
+ persist();
272
+ },
273
+ });
274
+ // ------------------- Phase 3 (loop) -------------------
275
+ while (executeResult.outcome === "destructive_denied") {
276
+ transition("destructive", "destructive intent detected");
277
+ persist();
278
+ // Two variants of Phase 3:
279
+ // (a) Tool-call gate: the runner detected an unauthorized tool call.
280
+ // Prompt y / Y / n. Y promotes the missing categories session-wide.
281
+ // (b) Text-based gate: detector matched a destructive verb in the
282
+ // assistant text. Original v0.2 behavior, one-shot y/n.
283
+ if (executeResult.destructive_tool_call) {
284
+ const call = executeResult.destructive_tool_call;
285
+ const missing = executeResult.destructive_missing_categories ?? [];
286
+ io.banner("Phase 3: Tool authorization required");
287
+ io.write(`Tool: ${call.name}\n` +
288
+ `Arguments: ${JSON.stringify(call.arguments)}\n` +
289
+ `Categories: ${missing.join(", ")}\n`);
290
+ io.write(`Approve? y = this call only, Y = approve "${missing.join(", ")}" for the rest of the session, n = deny\n`);
291
+ const reply = (await io.prompt("> ")).trim();
292
+ const approveOnce = reply === "y" || reply === "yes";
293
+ const approveSession = reply === "Y";
294
+ const approved = approveOnce || approveSession;
295
+ session.meta.destructive_approvals.push({
296
+ at: new Date().toISOString(),
297
+ action: `tool:${call.name}`,
298
+ approved,
299
+ ...(approveSession && { session_categories: missing }),
300
+ });
301
+ if (approveSession) {
302
+ session.meta.session_approved_categories = [
303
+ ...(session.meta.session_approved_categories ?? []),
304
+ ...missing,
305
+ ];
306
+ }
307
+ persist();
308
+ if (!approved) {
309
+ // Inject a synthetic tool result expressing denial, then continue.
310
+ const denialMsg = {
311
+ role: "user",
312
+ content: `[tool_result ${call.id} (denied by operator)]\nThe operator did not approve "${call.name}". Pick a different path or stop.`,
313
+ at: new Date().toISOString(),
314
+ meta: { phase: "execute" },
315
+ };
316
+ recordMessage(denialMsg);
317
+ transition("execute", "tool call denied");
318
+ persist();
319
+ executeResult = await runExecute({
320
+ brief, adapter, system, io, mode,
321
+ history: [...executeResult.history, denialMsg],
322
+ toolDefinitions, toolExecutors, sandbox,
323
+ sessionApproved: session.meta.session_approved_categories ?? [],
324
+ onMessage: (m) => { recordMessage(m); persist(); },
325
+ });
326
+ continue;
327
+ }
328
+ transition("execute", approveSession ? "tool approved (session)" : "tool approved (once)");
329
+ persist();
330
+ executeResult = await runExecute({
331
+ brief, adapter, system, io, mode,
332
+ history: executeResult.history,
333
+ toolDefinitions, toolExecutors, sandbox,
334
+ sessionApproved: session.meta.session_approved_categories ?? [],
335
+ onMessage: (m) => { recordMessage(m); persist(); },
336
+ });
337
+ continue;
338
+ }
339
+ // Variant (b): text-based destructive gate (v0.2 path).
340
+ const last = lastAssistant(executeResult.history);
341
+ const detection = executeResult.blocking_detectors?.destructive;
342
+ if (!detection || !detection.destructive)
343
+ break;
344
+ const approved = await awaitOperatorYes({
345
+ io,
346
+ detection,
347
+ ...(last ? { lastAssistant: last } : {}),
348
+ });
349
+ session.meta.destructive_approvals.push({
350
+ at: new Date().toISOString(),
351
+ action: detection.action ?? "unspecified",
352
+ approved,
353
+ });
354
+ persist();
355
+ const followUp = approved ? approvalMessage(detection) : denialMessage(detection);
356
+ recordMessage(followUp);
357
+ transition("execute", approved ? "destructive approved" : "destructive denied");
358
+ persist();
359
+ executeResult = await runExecute({
360
+ brief, adapter, system, io, mode,
361
+ history: [...executeResult.history, followUp],
362
+ toolDefinitions, toolExecutors, sandbox,
363
+ sessionApproved: session.meta.session_approved_categories ?? [],
364
+ onMessage: (m) => { recordMessage(m); persist(); },
365
+ });
366
+ }
367
+ // ------------------- Phase 2 -------------------
368
+ if (executeResult.outcome === "blocker") {
369
+ transition("blocker", executeResult.reason ?? "blocker");
370
+ persist();
371
+ reportBlocker({
372
+ io,
373
+ reason: executeResult.reason ?? "unspecified",
374
+ ...(lastAssistant(executeResult.history) ? { lastAssistant: lastAssistant(executeResult.history) } : {}),
375
+ });
376
+ await cleanupMcp();
377
+ return {
378
+ session_id: session.meta.brief_id,
379
+ final_phase: "blocker",
380
+ completed: false,
381
+ halted: true,
382
+ halt_reason: executeResult.reason ?? "blocker",
383
+ messages: session.messages,
384
+ };
385
+ }
386
+ if (executeResult.outcome === "max_steps") {
387
+ transition("blocker", "max_steps");
388
+ persist();
389
+ io.banner("Phase 2: Blocker (max_steps reached)");
390
+ io.write(`Stopping: ${executeResult.reason}\n`);
391
+ await cleanupMcp();
392
+ return {
393
+ session_id: session.meta.brief_id,
394
+ final_phase: "blocker",
395
+ completed: false,
396
+ halted: true,
397
+ halt_reason: "max_steps",
398
+ messages: session.messages,
399
+ };
400
+ }
401
+ if (executeResult.outcome === "operator_done") {
402
+ transition("completion", "operator ended");
403
+ persist();
404
+ await cleanupMcp();
405
+ return {
406
+ session_id: session.meta.brief_id,
407
+ final_phase: "completion",
408
+ completed: true,
409
+ halted: false,
410
+ messages: session.messages,
411
+ };
412
+ }
413
+ // ------------------- Phase 4 -------------------
414
+ transition("completion", "completion detected");
415
+ persist();
416
+ const finalReport = await runCompletion({
417
+ adapter,
418
+ system,
419
+ io,
420
+ history: executeResult.history,
421
+ });
422
+ recordMessage(finalReport);
423
+ transition("done", "completion report delivered");
424
+ persist();
425
+ await cleanupMcp();
426
+ return {
427
+ session_id: session.meta.brief_id,
428
+ final_phase: "done",
429
+ completed: true,
430
+ halted: false,
431
+ messages: session.messages,
432
+ };
433
+ }
434
+ function createSession(brief, briefId) {
435
+ const now = new Date().toISOString();
436
+ const meta = {
437
+ brief_id: briefId,
438
+ project: brief.frontmatter.project,
439
+ started_at: now,
440
+ updated_at: now,
441
+ phase: "intake",
442
+ mode: null,
443
+ destructive_approvals: [],
444
+ transitions: [],
445
+ schema_version: 2,
446
+ session_approved_categories: [],
447
+ tool_calls: [],
448
+ };
449
+ return { meta, brief, messages: [] };
450
+ }
451
+ function lastAssistant(messages) {
452
+ for (let i = messages.length - 1; i >= 0; i--) {
453
+ const m = messages[i];
454
+ if (m && m.role === "assistant")
455
+ return m;
456
+ }
457
+ return undefined;
458
+ }
459
+ async function resolveMode(brief, opts, io, operatorReply) {
460
+ // Precedence: CLI override > brief frontmatter > operator-typed > prompt.
461
+ if (opts.mode)
462
+ return opts.mode;
463
+ if (brief.frontmatter.mode)
464
+ return brief.frontmatter.mode;
465
+ const reply = operatorReply.toLowerCase();
466
+ if (/\bauto(?:-?pilot)?\b/.test(reply))
467
+ return "auto";
468
+ if (/\b(gated|per[-\s]?step|step)\b/.test(reply))
469
+ return "gated";
470
+ const picked = await io.prompt('Execution mode? Type "gated" or "auto":');
471
+ return picked.trim().toLowerCase() === "auto" ? "auto" : "gated";
472
+ }
473
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export interface HostAllowlist {
2
+ hosts: ReadonlySet<string>;
3
+ wildcardSuffixes: readonly string[];
4
+ wildcardBases: ReadonlySet<string>;
5
+ }
6
+ export declare class HostAllowlistError extends Error {
7
+ readonly code: "HOST_ALLOWLIST_MALFORMED";
8
+ constructor(message: string);
9
+ }
10
+ export declare function loadHostAllowlist(path: string): Promise<HostAllowlist | null>;
11
+ export declare function buildAllowlist(entries: unknown[]): HostAllowlist;
12
+ export declare function isHostAllowed(allowlist: HostAllowlist | null, hostname: string): boolean;
13
+ //# sourceMappingURL=host-allowlist.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-allowlist.d.ts","sourceRoot":"","sources":["../../src/sandbox/host-allowlist.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,aAAa;IAE5B,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAE3B,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;IAEpC,aAAa,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACpC;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,IAAI,EAAG,0BAA0B,CAAU;gBACxC,OAAO,EAAE,MAAM;CAI5B;AAKD,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAmBnF;AAID,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,aAAa,CAsBhE;AAID,wBAAgB,aAAa,CAAC,SAAS,EAAE,aAAa,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CASxF"}