@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 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ export declare const AUTH_CATEGORIES_STATIC: readonly ["filesystem_read", "filesystem_write", "filesystem_delete", "shell_exec", "http_fetch", "paid_api_call", "git_write", "git_push", "deploy", "external_message"];
2
+ export type AuthCategoryStatic = (typeof AUTH_CATEGORIES_STATIC)[number];
3
+ export type AuthCategoryMcpServer = `mcp_tool:${string}`;
4
+ export type AuthCategoryMcpTool = `mcp_tool:${string}:${string}`;
5
+ export type AuthCategory = AuthCategoryStatic | AuthCategoryMcpServer | AuthCategoryMcpTool;
6
+ export declare const DEFAULT_ALLOWED: ReadonlySet<AuthCategoryStatic>;
7
+ export declare function isStaticCategory(s: string): s is AuthCategoryStatic;
8
+ export declare function isMcpCategory(s: string): s is AuthCategoryMcpServer | AuthCategoryMcpTool;
9
+ export declare function parseMcpCategory(s: string): {
10
+ server: string;
11
+ tool?: string;
12
+ } | null;
13
+ //# sourceMappingURL=categories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"categories.d.ts","sourceRoot":"","sources":["../../src/auth/categories.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,sBAAsB,2KAWzB,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC;AAIzE,MAAM,MAAM,qBAAqB,GAAG,YAAY,MAAM,EAAE,CAAC;AACzD,MAAM,MAAM,mBAAmB,GAAG,YAAY,MAAM,IAAI,MAAM,EAAE,CAAC;AAEjE,MAAM,MAAM,YAAY,GAAG,kBAAkB,GAAG,qBAAqB,GAAG,mBAAmB,CAAC;AAI5F,eAAO,MAAM,eAAe,EAAE,WAAW,CAAC,kBAAkB,CAE1D,CAAC;AAEH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,IAAI,kBAAkB,CAEnE;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,IAAI,qBAAqB,GAAG,mBAAmB,CAEzF;AAID,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAUpF"}
@@ -0,0 +1,47 @@
1
+ // Authorization categories. Brief.authorized_costs lists items from this set
2
+ // (or wildcards over it). Every tool call is checked against this list at the
3
+ // boundary between LLM intent and sandbox execution.
4
+ //
5
+ // MCP categories are dynamic ("mcp_tool:<server>" or
6
+ // "mcp_tool:<server>:<tool>") and represented as template literal types.
7
+ export const AUTH_CATEGORIES_STATIC = [
8
+ "filesystem_read",
9
+ "filesystem_write",
10
+ "filesystem_delete",
11
+ "shell_exec",
12
+ "http_fetch",
13
+ "paid_api_call",
14
+ "git_write",
15
+ "git_push",
16
+ "deploy",
17
+ "external_message",
18
+ ];
19
+ // Default-allowed categories. Reads are not destructive; everything else
20
+ // requires explicit pre-approval in authorized_costs or a Phase 3 prompt.
21
+ export const DEFAULT_ALLOWED = new Set([
22
+ "filesystem_read",
23
+ ]);
24
+ export function isStaticCategory(s) {
25
+ return AUTH_CATEGORIES_STATIC.includes(s);
26
+ }
27
+ export function isMcpCategory(s) {
28
+ return s.startsWith("mcp_tool:");
29
+ }
30
+ // Parse "mcp_tool:server" or "mcp_tool:server:tool" into parts.
31
+ // Returns null for malformed input.
32
+ export function parseMcpCategory(s) {
33
+ if (!s.startsWith("mcp_tool:"))
34
+ return null;
35
+ const rest = s.slice("mcp_tool:".length);
36
+ if (rest.length === 0)
37
+ return null;
38
+ const firstColon = rest.indexOf(":");
39
+ if (firstColon === -1)
40
+ return { server: rest };
41
+ const server = rest.slice(0, firstColon);
42
+ const tool = rest.slice(firstColon + 1);
43
+ if (server.length === 0 || tool.length === 0)
44
+ return null;
45
+ return { server, tool };
46
+ }
47
+ //# sourceMappingURL=categories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"categories.js","sourceRoot":"","sources":["../../src/auth/categories.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,8EAA8E;AAC9E,qDAAqD;AACrD,EAAE;AACF,qDAAqD;AACrD,yEAAyE;AAEzE,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,iBAAiB;IACjB,kBAAkB;IAClB,mBAAmB;IACnB,YAAY;IACZ,YAAY;IACZ,eAAe;IACf,WAAW;IACX,UAAU;IACV,QAAQ;IACR,kBAAkB;CACV,CAAC;AAWX,yEAAyE;AACzE,0EAA0E;AAC1E,MAAM,CAAC,MAAM,eAAe,GAAoC,IAAI,GAAG,CAAC;IACtE,iBAAiB;CAClB,CAAC,CAAC;AAEH,MAAM,UAAU,gBAAgB,CAAC,CAAS;IACxC,OAAQ,sBAA4C,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,CAAS;IACrC,OAAO,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AACnC,CAAC;AAED,gEAAgE;AAChE,oCAAoC;AACpC,MAAM,UAAU,gBAAgB,CAAC,CAAS;IACxC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5C,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,UAAU,KAAK,CAAC,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;IACxC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1D,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,31 @@
1
+ import type { AuthCategory } from "./categories.js";
2
+ import type { ToolDefinition } from "../tools/types.js";
3
+ export interface AuthDecision {
4
+ allowed: boolean;
5
+ required_categories: readonly AuthCategory[];
6
+ missing_categories: readonly AuthCategory[];
7
+ }
8
+ export interface AuthCheckInput {
9
+ tool: ToolDefinition;
10
+ authorizedCosts: readonly string[];
11
+ sessionApproved?: readonly string[];
12
+ }
13
+ export declare function checkAuthorization(input: AuthCheckInput): AuthDecision;
14
+ import type { RoleDefinition } from "../types.js";
15
+ export interface RoleAwareAuthInput extends AuthCheckInput {
16
+ role: RoleDefinition;
17
+ }
18
+ export type RoleAwareAuthResult = {
19
+ kind: "allowed";
20
+ decision: AuthDecision;
21
+ } | {
22
+ kind: "role_scope_violation";
23
+ missing_categories: string[];
24
+ role_id: string;
25
+ tool_name: string;
26
+ } | {
27
+ kind: "needs_operator";
28
+ decision: AuthDecision;
29
+ };
30
+ export declare function checkAuthorizationWithRole(input: RoleAwareAuthInput): RoleAwareAuthResult;
31
+ //# sourceMappingURL=check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/auth/check.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAGpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IAEjB,mBAAmB,EAAE,SAAS,YAAY,EAAE,CAAC;IAG7C,kBAAkB,EAAE,SAAS,YAAY,EAAE,CAAC;CAC7C;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,cAAc,CAAC;IACrB,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IAGnC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAiBD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,cAAc,GAAG,YAAY,CActE;AAMD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,MAAM,WAAW,kBAAmB,SAAQ,cAAc;IACxD,IAAI,EAAE,cAAc,CAAC;CACtB;AAED,MAAM,MAAM,mBAAmB,GAC3B;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,YAAY,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,sBAAsB,CAAC;IAAC,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAClG;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,QAAQ,EAAE,YAAY,CAAA;CAAE,CAAC;AAEvD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,kBAAkB,GAAG,mBAAmB,CAczF"}
@@ -0,0 +1,59 @@
1
+ // Authorization gate for tool calls. Runs at the boundary between
2
+ // "the LLM said call this tool" and "the sandbox actually runs it."
3
+ //
4
+ // Inputs:
5
+ // - The tool definition (which categories does this tool require?)
6
+ // - authorized_costs from the brief frontmatter
7
+ // - A session-level set of categories approved at Phase 3 (operator
8
+ // answered "Y" for session-wide on a prior call)
9
+ //
10
+ // Output: AuthDecision. allowed=false means the runtime must enter Phase 3
11
+ // and prompt the operator. After approval, the runtime re-runs the check
12
+ // with the session-approved set updated.
13
+ import { DEFAULT_ALLOWED, isStaticCategory } from "./categories.js";
14
+ import { matchesAuthorization } from "./wildcards.js";
15
+ function isCovered(cat, authorizedCosts, sessionApproved) {
16
+ if (isStaticCategory(cat) && DEFAULT_ALLOWED.has(cat))
17
+ return true;
18
+ for (const entry of authorizedCosts) {
19
+ if (matchesAuthorization(cat, entry))
20
+ return true;
21
+ }
22
+ for (const entry of sessionApproved) {
23
+ if (matchesAuthorization(cat, entry))
24
+ return true;
25
+ }
26
+ return false;
27
+ }
28
+ export function checkAuthorization(input) {
29
+ const sessionApproved = input.sessionApproved ?? [];
30
+ const required = input.tool.authorization_categories;
31
+ const missing = [];
32
+ for (const cat of required) {
33
+ if (!isCovered(cat, input.authorizedCosts, sessionApproved)) {
34
+ missing.push(cat);
35
+ }
36
+ }
37
+ return {
38
+ allowed: missing.length === 0,
39
+ required_categories: required,
40
+ missing_categories: missing,
41
+ };
42
+ }
43
+ import { checkRoleScope } from "./role-scope.js";
44
+ export function checkAuthorizationWithRole(input) {
45
+ const scope = checkRoleScope({ tool: input.tool, role: input.role });
46
+ if (!scope.in_scope) {
47
+ return {
48
+ kind: "role_scope_violation",
49
+ missing_categories: scope.missing_categories,
50
+ role_id: input.role.id,
51
+ tool_name: input.tool.name,
52
+ };
53
+ }
54
+ const decision = checkAuthorization(input);
55
+ return decision.allowed
56
+ ? { kind: "allowed", decision }
57
+ : { kind: "needs_operator", decision };
58
+ }
59
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/auth/check.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,oEAAoE;AACpE,EAAE;AACF,UAAU;AACV,qEAAqE;AACrE,kDAAkD;AAClD,sEAAsE;AACtE,qDAAqD;AACrD,EAAE;AACF,2EAA2E;AAC3E,yEAAyE;AACzE,yCAAyC;AAGzC,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAoBtD,SAAS,SAAS,CAChB,GAAiB,EACjB,eAAkC,EAClC,eAAkC;IAElC,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACnE,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;QACpC,IAAI,oBAAoB,CAAC,GAAG,EAAE,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;IACpD,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;QACpC,IAAI,oBAAoB,CAAC,GAAG,EAAE,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;IACpD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAqB;IACtD,MAAM,eAAe,GAAG,KAAK,CAAC,eAAe,IAAI,EAAE,CAAC;IACpD,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC;IACrD,MAAM,OAAO,GAAmB,EAAE,CAAC;IACnC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,eAAe,EAAE,eAAe,CAAC,EAAE,CAAC;YAC5D,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IACD,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC;QAC7B,mBAAmB,EAAE,QAAQ;QAC7B,kBAAkB,EAAE,OAAO;KAC5B,CAAC;AACJ,CAAC;AAOD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAWjD,MAAM,UAAU,0BAA0B,CAAC,KAAyB;IAClE,MAAM,KAAK,GAAG,cAAc,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACrE,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACpB,OAAO;YACL,IAAI,EAAE,sBAAsB;YAC5B,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;YAC5C,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE;YACtB,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI;SAC3B,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC3C,OAAO,QAAQ,CAAC,OAAO;QACrB,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE;QAC/B,CAAC,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { ToolDefinition } from "../tools/types.js";
2
+ import type { RoleDefinition } from "../types.js";
3
+ export interface RoleScopeDecision {
4
+ in_scope: boolean;
5
+ missing_categories: string[];
6
+ }
7
+ export declare function checkRoleScope(input: {
8
+ tool: ToolDefinition;
9
+ role: RoleDefinition;
10
+ }): RoleScopeDecision;
11
+ export declare class RoleScopeViolation extends Error {
12
+ readonly role_id: string;
13
+ readonly tool_name: string;
14
+ readonly missing_categories: string[];
15
+ readonly code: "ROLE_SCOPE_VIOLATION";
16
+ constructor(role_id: string, tool_name: string, missing_categories: string[]);
17
+ }
18
+ //# sourceMappingURL=role-scope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role-scope.d.ts","sourceRoot":"","sources":["../../src/auth/role-scope.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,OAAO,CAAC;IAClB,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAC9B;AAKD,wBAAgB,cAAc,CAAC,KAAK,EAAE;IACpC,IAAI,EAAE,cAAc,CAAC;IACrB,IAAI,EAAE,cAAc,CAAC;CACtB,GAAG,iBAAiB,CAwBpB;AAKD,qBAAa,kBAAmB,SAAQ,KAAK;aAGzB,OAAO,EAAE,MAAM;aACf,SAAS,EAAE,MAAM;aACjB,kBAAkB,EAAE,MAAM,EAAE;IAJ9C,QAAQ,CAAC,IAAI,EAAG,sBAAsB,CAAU;gBAE9B,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,kBAAkB,EAAE,MAAM,EAAE;CAQ/C"}
@@ -0,0 +1,62 @@
1
+ // Per-role authorization scoping (v0.4). On top of the brief-level
2
+ // authorized_costs check, every tool call is also checked against the
3
+ // role's own tool_categories allowlist. The two checks compose:
4
+ //
5
+ // 1. Role scope check: is this tool's category in the role's allowlist?
6
+ // If no, this is a *programming error* (the coordinator routed a tool
7
+ // call to a role that shouldn't have it). Halt the coordinator.
8
+ //
9
+ // 2. Brief authorization check: does the brief's authorized_costs cover
10
+ // the tool's categories? If no, run the Phase 3 operator prompt.
11
+ //
12
+ // The role-scope check is therefore fail-closed and structural; the brief
13
+ // check is the operator-decision gate.
14
+ import { matchesAuthorization } from "./wildcards.js";
15
+ // Pure. Returns whether the tool's required auth categories are all covered
16
+ // by the role's tool_categories allowlist (plus a free `read_file` if the
17
+ // role opted in via `allow_read_file`).
18
+ export function checkRoleScope(input) {
19
+ const required = input.tool.authorization_categories;
20
+ // Special exemption: read_file (and other tools that only require
21
+ // filesystem_read) is allowed for any role with allow_read_file: true,
22
+ // regardless of the role's tool_categories list.
23
+ const onlyReads = required.length === 0 ||
24
+ required.every((c) => c === "filesystem_read");
25
+ if (onlyReads && input.role.allow_read_file) {
26
+ return { in_scope: true, missing_categories: [] };
27
+ }
28
+ const allowed = input.role.tool_categories;
29
+ const missing = [];
30
+ for (const cat of required) {
31
+ if (cat === "filesystem_read" && input.role.allow_read_file)
32
+ continue;
33
+ let covered = false;
34
+ for (const entry of allowed) {
35
+ if (matchesAuthorization(cat, entry)) {
36
+ covered = true;
37
+ break;
38
+ }
39
+ }
40
+ if (!covered)
41
+ missing.push(cat);
42
+ }
43
+ return { in_scope: missing.length === 0, missing_categories: missing };
44
+ }
45
+ // Thrown when the coordinator detects a role-scope violation. Distinct from
46
+ // a Phase 3 prompt: this represents a programming bug or a misconfigured
47
+ // custom role, not an operator decision.
48
+ export class RoleScopeViolation extends Error {
49
+ role_id;
50
+ tool_name;
51
+ missing_categories;
52
+ code = "ROLE_SCOPE_VIOLATION";
53
+ constructor(role_id, tool_name, missing_categories) {
54
+ super(`Role "${role_id}" attempted to call "${tool_name}" but its scope ` +
55
+ `does not include: ${missing_categories.join(", ")}`);
56
+ this.role_id = role_id;
57
+ this.tool_name = tool_name;
58
+ this.missing_categories = missing_categories;
59
+ this.name = "RoleScopeViolation";
60
+ }
61
+ }
62
+ //# sourceMappingURL=role-scope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role-scope.js","sourceRoot":"","sources":["../../src/auth/role-scope.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,sEAAsE;AACtE,gEAAgE;AAChE,EAAE;AACF,0EAA0E;AAC1E,2EAA2E;AAC3E,qEAAqE;AACrE,EAAE;AACF,0EAA0E;AAC1E,sEAAsE;AACtE,EAAE;AACF,0EAA0E;AAC1E,uCAAuC;AAIvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAOtD,4EAA4E;AAC5E,0EAA0E;AAC1E,wCAAwC;AACxC,MAAM,UAAU,cAAc,CAAC,KAG9B;IACC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC;IAErD,kEAAkE;IAClE,uEAAuE;IACvE,iDAAiD;IACjD,MAAM,SAAS,GACb,QAAQ,CAAC,MAAM,KAAK,CAAC;QACrB,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,iBAAiB,CAAC,CAAC;IACjD,IAAI,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;QAC5C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,kBAAkB,EAAE,EAAE,EAAE,CAAC;IACpD,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC;IAC3C,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,IAAI,GAAG,KAAK,iBAAiB,IAAI,KAAK,CAAC,IAAI,CAAC,eAAe;YAAE,SAAS;QACtE,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,oBAAoB,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC;gBAAC,OAAO,GAAG,IAAI,CAAC;gBAAC,MAAM;YAAC,CAAC;QAClE,CAAC;QACD,IAAI,CAAC,OAAO;YAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,kBAAkB,EAAE,OAAO,EAAE,CAAC;AACzE,CAAC;AAED,4EAA4E;AAC5E,yEAAyE;AACzE,yCAAyC;AACzC,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAGzB;IACA;IACA;IAJT,IAAI,GAAG,sBAA+B,CAAC;IAChD,YACkB,OAAe,EACf,SAAiB,EACjB,kBAA4B;QAE5C,KAAK,CACH,SAAS,OAAO,wBAAwB,SAAS,kBAAkB;YACjE,qBAAqB,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACvD,CAAC;QAPc,YAAO,GAAP,OAAO,CAAQ;QACf,cAAS,GAAT,SAAS,CAAQ;QACjB,uBAAkB,GAAlB,kBAAkB,CAAU;QAM5C,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ import type { AuthCategory } from "./categories.js";
2
+ export declare function matchesAuthorization(required: AuthCategory, authorizedEntry: string): boolean;
3
+ export declare const WILDCARD_ALL_WARNING: string;
4
+ export declare function detectWildcardAllWarning(authorizedCosts: readonly string[]): string | null;
5
+ //# sourceMappingURL=wildcards.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wildcards.d.ts","sourceRoot":"","sources":["../../src/auth/wildcards.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAY7F;AAKD,eAAO,MAAM,oBAAoB,QAE+C,CAAC;AAEjF,wBAAgB,wBAAwB,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAE1F"}
@@ -0,0 +1,36 @@
1
+ // Wildcard matching for authorization entries. Supported patterns:
2
+ //
3
+ // "*" matches every category (with linter warning)
4
+ // "mcp_tool:*" matches any "mcp_tool:..." category
5
+ // "mcp_tool:server:*" matches any tool from the named MCP server
6
+ // (and the server umbrella itself)
7
+ //
8
+ // Exact entries match by string equality (case-sensitive; categories are
9
+ // lower_snake_case by convention).
10
+ export function matchesAuthorization(required, authorizedEntry) {
11
+ if (required === authorizedEntry)
12
+ return true;
13
+ if (authorizedEntry === "*")
14
+ return true;
15
+ if (authorizedEntry === "mcp_tool:*" && required.startsWith("mcp_tool:"))
16
+ return true;
17
+ if (authorizedEntry.startsWith("mcp_tool:") && authorizedEntry.endsWith(":*")) {
18
+ const prefix = authorizedEntry.slice(0, -2);
19
+ // "mcp_tool:server:*" matches "mcp_tool:server:anytool"
20
+ if (required.startsWith(prefix + ":"))
21
+ return true;
22
+ // "mcp_tool:server:*" also matches the server umbrella "mcp_tool:server"
23
+ if (required === prefix)
24
+ return true;
25
+ }
26
+ return false;
27
+ }
28
+ // Emitted by brief lint when "*" appears in authorized_costs. Brief frontmatter
29
+ // validation surfaces this; it is not a hard error because operators may opt in
30
+ // deliberately. The runtime still runs.
31
+ export const WILDCARD_ALL_WARNING = "authorized_costs contains '*'. This authorizes every destructive category. " +
32
+ "Almost always you want a specific list (filesystem_write, shell_exec, etc.).";
33
+ export function detectWildcardAllWarning(authorizedCosts) {
34
+ return authorizedCosts.includes("*") ? WILDCARD_ALL_WARNING : null;
35
+ }
36
+ //# sourceMappingURL=wildcards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wildcards.js","sourceRoot":"","sources":["../../src/auth/wildcards.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,EAAE;AACF,2EAA2E;AAC3E,kEAAkE;AAClE,yEAAyE;AACzE,+DAA+D;AAC/D,EAAE;AACF,yEAAyE;AACzE,mCAAmC;AAInC,MAAM,UAAU,oBAAoB,CAAC,QAAsB,EAAE,eAAuB;IAClF,IAAI,QAAQ,KAAK,eAAe;QAAE,OAAO,IAAI,CAAC;IAC9C,IAAI,eAAe,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IACzC,IAAI,eAAe,KAAK,YAAY,IAAI,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,IAAI,CAAC;IACtF,IAAI,eAAe,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9E,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5C,wDAAwD;QACxD,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QACnD,yEAAyE;QACzE,IAAI,QAAQ,KAAK,MAAM;YAAE,OAAO,IAAI,CAAC;IACvC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,gFAAgF;AAChF,gFAAgF;AAChF,wCAAwC;AACxC,MAAM,CAAC,MAAM,oBAAoB,GAC/B,6EAA6E;IAC7E,8EAA8E,CAAC;AAEjF,MAAM,UAAU,wBAAwB,CAAC,eAAkC;IACzE,OAAO,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC;AACrE,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { Brief, ValidationResult } from "./types.js";
2
+ export declare function parseBrief(input: string): Brief;
3
+ export interface ValidateBriefOptions {
4
+ knownRoles?: readonly string[];
5
+ }
6
+ export declare function validateBrief(brief: Brief, options?: ValidateBriefOptions): ValidationResult;
7
+ export declare function renderBriefForAgent(brief: Brief): string;
8
+ export declare function generateBriefId(date?: Date): string;
9
+ //# sourceMappingURL=brief.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brief.d.ts","sourceRoot":"","sources":["../src/brief.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,KAAK,EAGL,gBAAgB,EAGjB,MAAM,YAAY,CAAC;AAKpB,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,CAsB/C;AAED,MAAM,WAAW,oBAAoB;IAKnC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAChC;AAUD,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,GAAE,oBAAyB,GAAG,gBAAgB,CAmHhG;AAID,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAyBxD;AA2TD,wBAAgB,eAAe,CAAC,IAAI,OAAa,GAAG,MAAM,CAMzD"}