@red-codes/agentguard 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (294) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +298 -0
  3. package/dist/adapters/claude-code.d.ts +24 -0
  4. package/dist/adapters/claude-code.d.ts.map +1 -0
  5. package/dist/adapters/claude-code.js +99 -0
  6. package/dist/adapters/claude-code.js.map +1 -0
  7. package/dist/adapters/file.d.ts +3 -0
  8. package/dist/adapters/file.d.ts.map +1 -0
  9. package/dist/adapters/file.js +35 -0
  10. package/dist/adapters/file.js.map +1 -0
  11. package/dist/adapters/git.d.ts +3 -0
  12. package/dist/adapters/git.d.ts.map +1 -0
  13. package/dist/adapters/git.js +61 -0
  14. package/dist/adapters/git.js.map +1 -0
  15. package/dist/adapters/registry.d.ts +5 -0
  16. package/dist/adapters/registry.d.ts.map +1 -0
  17. package/dist/adapters/registry.js +15 -0
  18. package/dist/adapters/registry.js.map +1 -0
  19. package/dist/adapters/shell.d.ts +8 -0
  20. package/dist/adapters/shell.d.ts.map +1 -0
  21. package/dist/adapters/shell.js +27 -0
  22. package/dist/adapters/shell.js.map +1 -0
  23. package/dist/cli/args.d.ts +25 -0
  24. package/dist/cli/args.d.ts.map +1 -0
  25. package/dist/cli/args.js +63 -0
  26. package/dist/cli/args.js.map +1 -0
  27. package/dist/cli/bin.d.ts +3 -0
  28. package/dist/cli/bin.d.ts.map +1 -0
  29. package/dist/cli/bin.js +5769 -0
  30. package/dist/cli/bin.js.map +7 -0
  31. package/dist/cli/colors.d.ts +11 -0
  32. package/dist/cli/colors.d.ts.map +1 -0
  33. package/dist/cli/colors.js +44 -0
  34. package/dist/cli/colors.js.map +1 -0
  35. package/dist/cli/commands/claude-hook.d.ts +2 -0
  36. package/dist/cli/commands/claude-hook.d.ts.map +1 -0
  37. package/dist/cli/commands/claude-hook.js +110 -0
  38. package/dist/cli/commands/claude-hook.js.map +1 -0
  39. package/dist/cli/commands/claude-init.d.ts +2 -0
  40. package/dist/cli/commands/claude-init.d.ts.map +1 -0
  41. package/dist/cli/commands/claude-init.js +150 -0
  42. package/dist/cli/commands/claude-init.js.map +1 -0
  43. package/dist/cli/commands/export.d.ts +11 -0
  44. package/dist/cli/commands/export.d.ts.map +1 -0
  45. package/dist/cli/commands/export.js +113 -0
  46. package/dist/cli/commands/export.js.map +1 -0
  47. package/dist/cli/commands/guard.d.ts +12 -0
  48. package/dist/cli/commands/guard.d.ts.map +1 -0
  49. package/dist/cli/commands/guard.js +145 -0
  50. package/dist/cli/commands/guard.js.map +1 -0
  51. package/dist/cli/commands/import.d.ts +2 -0
  52. package/dist/cli/commands/import.d.ts.map +1 -0
  53. package/dist/cli/commands/import.js +115 -0
  54. package/dist/cli/commands/import.js.map +1 -0
  55. package/dist/cli/commands/inspect.d.ts +3 -0
  56. package/dist/cli/commands/inspect.d.ts.map +1 -0
  57. package/dist/cli/commands/inspect.js +185 -0
  58. package/dist/cli/commands/inspect.js.map +1 -0
  59. package/dist/cli/commands/plugin.d.ts +7 -0
  60. package/dist/cli/commands/plugin.d.ts.map +1 -0
  61. package/dist/cli/commands/plugin.js +234 -0
  62. package/dist/cli/commands/plugin.js.map +1 -0
  63. package/dist/cli/commands/replay.d.ts +12 -0
  64. package/dist/cli/commands/replay.d.ts.map +1 -0
  65. package/dist/cli/commands/replay.js +208 -0
  66. package/dist/cli/commands/replay.js.map +1 -0
  67. package/dist/cli/file-event-store.d.ts +41 -0
  68. package/dist/cli/file-event-store.d.ts.map +1 -0
  69. package/dist/cli/file-event-store.js +219 -0
  70. package/dist/cli/file-event-store.js.map +1 -0
  71. package/dist/cli/policy-resolver.d.ts +4 -0
  72. package/dist/cli/policy-resolver.d.ts.map +1 -0
  73. package/dist/cli/policy-resolver.js +62 -0
  74. package/dist/cli/policy-resolver.js.map +1 -0
  75. package/dist/cli/recorder.d.ts +36 -0
  76. package/dist/cli/recorder.d.ts.map +1 -0
  77. package/dist/cli/recorder.js +85 -0
  78. package/dist/cli/recorder.js.map +1 -0
  79. package/dist/cli/replay.d.ts +2 -0
  80. package/dist/cli/replay.d.ts.map +1 -0
  81. package/dist/cli/replay.js +310 -0
  82. package/dist/cli/replay.js.map +1 -0
  83. package/dist/cli/session-store.d.ts +41 -0
  84. package/dist/cli/session-store.d.ts.map +1 -0
  85. package/dist/cli/session-store.js +95 -0
  86. package/dist/cli/session-store.js.map +1 -0
  87. package/dist/cli/tui.d.ts +24 -0
  88. package/dist/cli/tui.d.ts.map +1 -0
  89. package/dist/cli/tui.js +197 -0
  90. package/dist/cli/tui.js.map +1 -0
  91. package/dist/core/actions.d.ts +11 -0
  92. package/dist/core/actions.d.ts.map +1 -0
  93. package/dist/core/actions.js +112 -0
  94. package/dist/core/actions.js.map +1 -0
  95. package/dist/core/adapters.d.ts +19 -0
  96. package/dist/core/adapters.d.ts.map +1 -0
  97. package/dist/core/adapters.js +85 -0
  98. package/dist/core/adapters.js.map +1 -0
  99. package/dist/core/execution-log/bridge.d.ts +12 -0
  100. package/dist/core/execution-log/bridge.d.ts.map +1 -0
  101. package/dist/core/execution-log/bridge.js +112 -0
  102. package/dist/core/execution-log/bridge.js.map +1 -0
  103. package/dist/core/execution-log/event-log.d.ts +7 -0
  104. package/dist/core/execution-log/event-log.d.ts.map +1 -0
  105. package/dist/core/execution-log/event-log.js +103 -0
  106. package/dist/core/execution-log/event-log.js.map +1 -0
  107. package/dist/core/execution-log/event-projections.d.ts +28 -0
  108. package/dist/core/execution-log/event-projections.d.ts.map +1 -0
  109. package/dist/core/execution-log/event-projections.js +272 -0
  110. package/dist/core/execution-log/event-projections.js.map +1 -0
  111. package/dist/core/execution-log/event-schema.d.ts +56 -0
  112. package/dist/core/execution-log/event-schema.d.ts.map +1 -0
  113. package/dist/core/execution-log/event-schema.js +160 -0
  114. package/dist/core/execution-log/event-schema.js.map +1 -0
  115. package/dist/core/execution-log/index.d.ts +7 -0
  116. package/dist/core/execution-log/index.d.ts.map +1 -0
  117. package/dist/core/execution-log/index.js +13 -0
  118. package/dist/core/execution-log/index.js.map +1 -0
  119. package/dist/core/hash.d.ts +5 -0
  120. package/dist/core/hash.d.ts.map +1 -0
  121. package/dist/core/hash.js +13 -0
  122. package/dist/core/hash.js.map +1 -0
  123. package/dist/core/rng.d.ts +29 -0
  124. package/dist/core/rng.d.ts.map +1 -0
  125. package/dist/core/rng.js +48 -0
  126. package/dist/core/rng.js.map +1 -0
  127. package/dist/core/types.d.ts +746 -0
  128. package/dist/core/types.d.ts.map +1 -0
  129. package/dist/core/types.js +8 -0
  130. package/dist/core/types.js.map +1 -0
  131. package/dist/events/bus.d.ts +24 -0
  132. package/dist/events/bus.d.ts.map +1 -0
  133. package/dist/events/bus.js +64 -0
  134. package/dist/events/bus.js.map +1 -0
  135. package/dist/events/decision-jsonl.d.ts +8 -0
  136. package/dist/events/decision-jsonl.d.ts.map +1 -0
  137. package/dist/events/decision-jsonl.js +44 -0
  138. package/dist/events/decision-jsonl.js.map +1 -0
  139. package/dist/events/jsonl.d.ts +8 -0
  140. package/dist/events/jsonl.d.ts.map +1 -0
  141. package/dist/events/jsonl.js +46 -0
  142. package/dist/events/jsonl.js.map +1 -0
  143. package/dist/events/schema.d.ts +59 -0
  144. package/dist/events/schema.d.ts.map +1 -0
  145. package/dist/events/schema.js +296 -0
  146. package/dist/events/schema.js.map +1 -0
  147. package/dist/events/store.d.ts +7 -0
  148. package/dist/events/store.d.ts.map +1 -0
  149. package/dist/events/store.js +64 -0
  150. package/dist/events/store.js.map +1 -0
  151. package/dist/invariants/checker.d.ts +15 -0
  152. package/dist/invariants/checker.d.ts.map +1 -0
  153. package/dist/invariants/checker.js +52 -0
  154. package/dist/invariants/checker.js.map +1 -0
  155. package/dist/invariants/definitions.d.ts +33 -0
  156. package/dist/invariants/definitions.d.ts.map +1 -0
  157. package/dist/invariants/definitions.js +168 -0
  158. package/dist/invariants/definitions.js.map +1 -0
  159. package/dist/kernel/aab.d.ts +26 -0
  160. package/dist/kernel/aab.d.ts.map +1 -0
  161. package/dist/kernel/aab.js +149 -0
  162. package/dist/kernel/aab.js.map +1 -0
  163. package/dist/kernel/blast-radius.d.ts +60 -0
  164. package/dist/kernel/blast-radius.d.ts.map +1 -0
  165. package/dist/kernel/blast-radius.js +146 -0
  166. package/dist/kernel/blast-radius.js.map +1 -0
  167. package/dist/kernel/decision.d.ts +40 -0
  168. package/dist/kernel/decision.d.ts.map +1 -0
  169. package/dist/kernel/decision.js +92 -0
  170. package/dist/kernel/decision.js.map +1 -0
  171. package/dist/kernel/decisions/factory.d.ts +12 -0
  172. package/dist/kernel/decisions/factory.d.ts.map +1 -0
  173. package/dist/kernel/decisions/factory.js +56 -0
  174. package/dist/kernel/decisions/factory.js.map +1 -0
  175. package/dist/kernel/decisions/types.d.ts +70 -0
  176. package/dist/kernel/decisions/types.d.ts.map +1 -0
  177. package/dist/kernel/decisions/types.js +5 -0
  178. package/dist/kernel/decisions/types.js.map +1 -0
  179. package/dist/kernel/evidence.d.ts +29 -0
  180. package/dist/kernel/evidence.d.ts.map +1 -0
  181. package/dist/kernel/evidence.js +61 -0
  182. package/dist/kernel/evidence.js.map +1 -0
  183. package/dist/kernel/kernel.d.ts +47 -0
  184. package/dist/kernel/kernel.d.ts.map +1 -0
  185. package/dist/kernel/kernel.js +377 -0
  186. package/dist/kernel/kernel.js.map +1 -0
  187. package/dist/kernel/monitor.d.ts +35 -0
  188. package/dist/kernel/monitor.d.ts.map +1 -0
  189. package/dist/kernel/monitor.js +144 -0
  190. package/dist/kernel/monitor.js.map +1 -0
  191. package/dist/kernel/replay-comparator.d.ts +72 -0
  192. package/dist/kernel/replay-comparator.d.ts.map +1 -0
  193. package/dist/kernel/replay-comparator.js +251 -0
  194. package/dist/kernel/replay-comparator.js.map +1 -0
  195. package/dist/kernel/replay-engine.d.ts +108 -0
  196. package/dist/kernel/replay-engine.d.ts.map +1 -0
  197. package/dist/kernel/replay-engine.js +241 -0
  198. package/dist/kernel/replay-engine.js.map +1 -0
  199. package/dist/kernel/replay-processor.d.ts +109 -0
  200. package/dist/kernel/replay-processor.d.ts.map +1 -0
  201. package/dist/kernel/replay-processor.js +118 -0
  202. package/dist/kernel/replay-processor.js.map +1 -0
  203. package/dist/kernel/simulation/filesystem-simulator.d.ts +3 -0
  204. package/dist/kernel/simulation/filesystem-simulator.d.ts.map +1 -0
  205. package/dist/kernel/simulation/filesystem-simulator.js +81 -0
  206. package/dist/kernel/simulation/filesystem-simulator.js.map +1 -0
  207. package/dist/kernel/simulation/git-simulator.d.ts +5 -0
  208. package/dist/kernel/simulation/git-simulator.d.ts.map +1 -0
  209. package/dist/kernel/simulation/git-simulator.js +115 -0
  210. package/dist/kernel/simulation/git-simulator.js.map +1 -0
  211. package/dist/kernel/simulation/package-simulator.d.ts +5 -0
  212. package/dist/kernel/simulation/package-simulator.d.ts.map +1 -0
  213. package/dist/kernel/simulation/package-simulator.js +164 -0
  214. package/dist/kernel/simulation/package-simulator.js.map +1 -0
  215. package/dist/kernel/simulation/registry.d.ts +3 -0
  216. package/dist/kernel/simulation/registry.d.ts.map +1 -0
  217. package/dist/kernel/simulation/registry.js +24 -0
  218. package/dist/kernel/simulation/registry.js.map +1 -0
  219. package/dist/kernel/simulation/types.d.ts +35 -0
  220. package/dist/kernel/simulation/types.d.ts.map +1 -0
  221. package/dist/kernel/simulation/types.js +4 -0
  222. package/dist/kernel/simulation/types.js.map +1 -0
  223. package/dist/plugins/discovery.d.ts +45 -0
  224. package/dist/plugins/discovery.d.ts.map +1 -0
  225. package/dist/plugins/discovery.js +89 -0
  226. package/dist/plugins/discovery.js.map +1 -0
  227. package/dist/plugins/index.d.ts +10 -0
  228. package/dist/plugins/index.d.ts.map +1 -0
  229. package/dist/plugins/index.js +7 -0
  230. package/dist/plugins/index.js.map +1 -0
  231. package/dist/plugins/registry.d.ts +52 -0
  232. package/dist/plugins/registry.d.ts.map +1 -0
  233. package/dist/plugins/registry.js +148 -0
  234. package/dist/plugins/registry.js.map +1 -0
  235. package/dist/plugins/sandbox.d.ts +87 -0
  236. package/dist/plugins/sandbox.d.ts.map +1 -0
  237. package/dist/plugins/sandbox.js +122 -0
  238. package/dist/plugins/sandbox.js.map +1 -0
  239. package/dist/plugins/types.d.ts +61 -0
  240. package/dist/plugins/types.d.ts.map +1 -0
  241. package/dist/plugins/types.js +16 -0
  242. package/dist/plugins/types.js.map +1 -0
  243. package/dist/plugins/validator.d.ts +36 -0
  244. package/dist/plugins/validator.d.ts.map +1 -0
  245. package/dist/plugins/validator.js +276 -0
  246. package/dist/plugins/validator.js.map +1 -0
  247. package/dist/policy/evaluator.d.ts +41 -0
  248. package/dist/policy/evaluator.d.ts.map +1 -0
  249. package/dist/policy/evaluator.js +111 -0
  250. package/dist/policy/evaluator.js.map +1 -0
  251. package/dist/policy/loader.d.ts +13 -0
  252. package/dist/policy/loader.d.ts.map +1 -0
  253. package/dist/policy/loader.js +118 -0
  254. package/dist/policy/loader.js.map +1 -0
  255. package/dist/policy/pack-loader.d.ts +40 -0
  256. package/dist/policy/pack-loader.d.ts.map +1 -0
  257. package/dist/policy/pack-loader.js +138 -0
  258. package/dist/policy/pack-loader.js.map +1 -0
  259. package/dist/policy/yaml-loader.d.ts +23 -0
  260. package/dist/policy/yaml-loader.d.ts.map +1 -0
  261. package/dist/policy/yaml-loader.js +222 -0
  262. package/dist/policy/yaml-loader.js.map +1 -0
  263. package/dist/renderers/index.d.ts +6 -0
  264. package/dist/renderers/index.d.ts.map +1 -0
  265. package/dist/renderers/index.js +4 -0
  266. package/dist/renderers/index.js.map +1 -0
  267. package/dist/renderers/registry.d.ts +39 -0
  268. package/dist/renderers/registry.d.ts.map +1 -0
  269. package/dist/renderers/registry.js +97 -0
  270. package/dist/renderers/registry.js.map +1 -0
  271. package/dist/renderers/tui-renderer.d.ts +18 -0
  272. package/dist/renderers/tui-renderer.d.ts.map +1 -0
  273. package/dist/renderers/tui-renderer.js +57 -0
  274. package/dist/renderers/tui-renderer.js.map +1 -0
  275. package/dist/renderers/types.d.ts +52 -0
  276. package/dist/renderers/types.d.ts.map +1 -0
  277. package/dist/renderers/types.js +4 -0
  278. package/dist/renderers/types.js.map +1 -0
  279. package/dist/telemetry/index.d.ts +3 -0
  280. package/dist/telemetry/index.d.ts.map +1 -0
  281. package/dist/telemetry/index.js +2 -0
  282. package/dist/telemetry/index.js.map +1 -0
  283. package/dist/telemetry/runtimeLogger.d.ts +9 -0
  284. package/dist/telemetry/runtimeLogger.d.ts.map +1 -0
  285. package/dist/telemetry/runtimeLogger.js +68 -0
  286. package/dist/telemetry/runtimeLogger.js.map +1 -0
  287. package/dist/telemetry/types.d.ts +22 -0
  288. package/dist/telemetry/types.d.ts.map +1 -0
  289. package/dist/telemetry/types.js +4 -0
  290. package/dist/telemetry/types.js.map +1 -0
  291. package/hooks/post-commit +57 -0
  292. package/hooks/post-merge +33 -0
  293. package/hooks/pre-commit +28 -0
  294. package/package.json +72 -0
@@ -0,0 +1,60 @@
1
+ import type { NormalizedIntent } from '../policy/evaluator.js';
2
+ /** Weights applied to different action categories */
3
+ export interface BlastRadiusWeights {
4
+ /** Multiplier for delete operations (default: 3.0) */
5
+ delete: number;
6
+ /** Multiplier for write operations (default: 1.5) */
7
+ write: number;
8
+ /** Multiplier for read operations (default: 0.1) */
9
+ read: number;
10
+ /** Multiplier for git operations (default: 2.0) */
11
+ git: number;
12
+ /** Multiplier for shell exec (default: 1.0) */
13
+ shell: number;
14
+ /** Multiplier for sensitive path matches (default: 5.0) */
15
+ sensitivePath: number;
16
+ /** Multiplier for config file matches (default: 2.0) */
17
+ configPath: number;
18
+ }
19
+ /** Result of blast radius computation */
20
+ export interface BlastRadiusResult {
21
+ /** Raw count of files/entities affected */
22
+ rawCount: number;
23
+ /** Weighted score after applying action and path multipliers */
24
+ weightedScore: number;
25
+ /** Risk level derived from weighted score */
26
+ riskLevel: 'low' | 'medium' | 'high';
27
+ /** Which factors contributed to the score */
28
+ factors: BlastRadiusFactor[];
29
+ /** Whether the weighted score exceeds the given threshold */
30
+ exceeded: boolean;
31
+ /** The threshold that was checked against */
32
+ threshold: number;
33
+ }
34
+ /** A single factor contributing to the blast radius score */
35
+ export interface BlastRadiusFactor {
36
+ name: string;
37
+ multiplier: number;
38
+ reason: string;
39
+ }
40
+ declare const DEFAULT_WEIGHTS: BlastRadiusWeights;
41
+ declare const SENSITIVE_PATTERNS: string[];
42
+ declare const CONFIG_PATTERNS: string[];
43
+ /**
44
+ * Compute the blast radius for a normalized intent.
45
+ *
46
+ * The engine applies multipliers for:
47
+ * - Action type (delete > write > git > shell > read)
48
+ * - Path sensitivity (secrets, credentials)
49
+ * - Config file impact (package.json, CI configs, etc.)
50
+ *
51
+ * The final weighted score is the raw file count multiplied by
52
+ * the highest applicable multiplier from each factor category.
53
+ *
54
+ * @param intent The normalized action intent
55
+ * @param threshold The policy limit to check against
56
+ * @param weights Optional custom weights (defaults provided)
57
+ */
58
+ export declare function computeBlastRadius(intent: NormalizedIntent, threshold: number, weights?: BlastRadiusWeights): BlastRadiusResult;
59
+ export { DEFAULT_WEIGHTS, SENSITIVE_PATTERNS, CONFIG_PATTERNS };
60
+ //# sourceMappingURL=blast-radius.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blast-radius.d.ts","sourceRoot":"","sources":["../../src/kernel/blast-radius.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,qDAAqD;AACrD,MAAM,WAAW,kBAAkB;IACjC,sDAAsD;IACtD,MAAM,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,GAAG,EAAE,MAAM,CAAC;IACZ,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,aAAa,EAAE,MAAM,CAAC;IACtB,wDAAwD;IACxD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,yCAAyC;AACzC,MAAM,WAAW,iBAAiB;IAChC,2CAA2C;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,aAAa,EAAE,MAAM,CAAC;IACtB,6CAA6C;IAC7C,SAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACrC,6CAA6C;IAC7C,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,6DAA6D;IAC7D,QAAQ,EAAE,OAAO,CAAC;IAClB,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,6DAA6D;AAC7D,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,QAAA,MAAM,eAAe,EAAE,kBAQtB,CAAC;AAEF,QAAA,MAAM,kBAAkB,UAA0E,CAAC;AAEnG,QAAA,MAAM,eAAe,UAkBpB,CAAC;AAgFF;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,gBAAgB,EACxB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,kBAAoC,GAC5C,iBAAiB,CA8BnB;AAED,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,eAAe,EAAE,CAAC"}
@@ -0,0 +1,146 @@
1
+ // Blast radius computation engine — Phase 2 implementation.
2
+ // Pure domain logic: computes a weighted blast radius score from action metadata.
3
+ // No I/O, no Node.js-specific APIs. Suitable for use inside the synchronous authorize() flow.
4
+ const DEFAULT_WEIGHTS = {
5
+ delete: 3.0,
6
+ write: 1.5,
7
+ read: 0.1,
8
+ git: 2.0,
9
+ shell: 1.0,
10
+ sensitivePath: 5.0,
11
+ configPath: 2.0,
12
+ };
13
+ const SENSITIVE_PATTERNS = ['.env', 'credentials', '.pem', '.key', 'secret', 'token', '.password'];
14
+ const CONFIG_PATTERNS = [
15
+ 'package.json',
16
+ 'tsconfig.json',
17
+ 'eslint',
18
+ '.prettierrc',
19
+ 'webpack.config',
20
+ 'vite.config',
21
+ 'next.config',
22
+ 'jest.config',
23
+ 'vitest.config',
24
+ '.babelrc',
25
+ 'babel.config',
26
+ 'Dockerfile',
27
+ 'docker-compose',
28
+ '.github/',
29
+ '.gitlab-ci',
30
+ 'Jenkinsfile',
31
+ '.circleci/',
32
+ ];
33
+ /** Determine the action weight multiplier based on action type */
34
+ function getActionMultiplier(action, weights) {
35
+ if (action.startsWith('file.delete')) {
36
+ return { name: 'delete-action', multiplier: weights.delete, reason: 'File deletion' };
37
+ }
38
+ if (action.startsWith('file.write') || action === 'file.move') {
39
+ return { name: 'write-action', multiplier: weights.write, reason: 'File write/move' };
40
+ }
41
+ if (action.startsWith('file.read')) {
42
+ return { name: 'read-action', multiplier: weights.read, reason: 'File read (low impact)' };
43
+ }
44
+ if (action.startsWith('git.')) {
45
+ if (action === 'git.force-push') {
46
+ return {
47
+ name: 'force-push',
48
+ multiplier: weights.git * 2,
49
+ reason: 'Git force push (history rewrite)',
50
+ };
51
+ }
52
+ if (action === 'git.branch.delete') {
53
+ return {
54
+ name: 'branch-delete',
55
+ multiplier: weights.git * 1.5,
56
+ reason: 'Git branch deletion',
57
+ };
58
+ }
59
+ return { name: 'git-action', multiplier: weights.git, reason: `Git operation: ${action}` };
60
+ }
61
+ if (action === 'shell.exec') {
62
+ return { name: 'shell-exec', multiplier: weights.shell, reason: 'Shell execution' };
63
+ }
64
+ return null;
65
+ }
66
+ /** Check if the target path matches sensitive patterns */
67
+ function getSensitivePathFactor(target, weights) {
68
+ if (!target)
69
+ return null;
70
+ const lower = target.toLowerCase();
71
+ if (SENSITIVE_PATTERNS.some((p) => lower.includes(p))) {
72
+ return {
73
+ name: 'sensitive-path',
74
+ multiplier: weights.sensitivePath,
75
+ reason: `Sensitive file path: ${target}`,
76
+ };
77
+ }
78
+ return null;
79
+ }
80
+ /** Check if the target path matches config file patterns */
81
+ function getConfigPathFactor(target, weights) {
82
+ if (!target)
83
+ return null;
84
+ const lower = target.toLowerCase();
85
+ if (CONFIG_PATTERNS.some((p) => lower.includes(p))) {
86
+ return {
87
+ name: 'config-path',
88
+ multiplier: weights.configPath,
89
+ reason: `Config/CI file: ${target}`,
90
+ };
91
+ }
92
+ return null;
93
+ }
94
+ /** Derive risk level from a weighted score */
95
+ function deriveRiskLevel(weightedScore) {
96
+ if (weightedScore >= 50)
97
+ return 'high';
98
+ if (weightedScore >= 15)
99
+ return 'medium';
100
+ return 'low';
101
+ }
102
+ /**
103
+ * Compute the blast radius for a normalized intent.
104
+ *
105
+ * The engine applies multipliers for:
106
+ * - Action type (delete > write > git > shell > read)
107
+ * - Path sensitivity (secrets, credentials)
108
+ * - Config file impact (package.json, CI configs, etc.)
109
+ *
110
+ * The final weighted score is the raw file count multiplied by
111
+ * the highest applicable multiplier from each factor category.
112
+ *
113
+ * @param intent The normalized action intent
114
+ * @param threshold The policy limit to check against
115
+ * @param weights Optional custom weights (defaults provided)
116
+ */
117
+ export function computeBlastRadius(intent, threshold, weights = DEFAULT_WEIGHTS) {
118
+ const rawCount = intent.filesAffected ?? 1;
119
+ const factors = [];
120
+ // Collect applicable factors
121
+ const actionFactor = getActionMultiplier(intent.action, weights);
122
+ if (actionFactor)
123
+ factors.push(actionFactor);
124
+ const sensitiveFactor = getSensitivePathFactor(intent.target, weights);
125
+ if (sensitiveFactor)
126
+ factors.push(sensitiveFactor);
127
+ const configFactor = getConfigPathFactor(intent.target, weights);
128
+ if (configFactor)
129
+ factors.push(configFactor);
130
+ // Compute weighted score: raw count * product of all factor multipliers
131
+ // Each factor category contributes independently (multiplicative)
132
+ const totalMultiplier = factors.reduce((acc, f) => acc * f.multiplier, 1);
133
+ const weightedScore = Math.round(rawCount * totalMultiplier * 100) / 100;
134
+ const riskLevel = deriveRiskLevel(weightedScore);
135
+ const exceeded = weightedScore > threshold;
136
+ return {
137
+ rawCount,
138
+ weightedScore,
139
+ riskLevel,
140
+ factors,
141
+ exceeded,
142
+ threshold,
143
+ };
144
+ }
145
+ export { DEFAULT_WEIGHTS, SENSITIVE_PATTERNS, CONFIG_PATTERNS };
146
+ //# sourceMappingURL=blast-radius.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blast-radius.js","sourceRoot":"","sources":["../../src/kernel/blast-radius.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { DomainEvent } from '../core/types.js';
2
+ import type { RawAgentAction } from './aab.js';
3
+ import type { NormalizedIntent, EvalResult } from '../policy/evaluator.js';
4
+ import type { EvidencePack } from './evidence.js';
5
+ import type { AgentGuardInvariant } from '../invariants/definitions.js';
6
+ export declare const INTERVENTION: {
7
+ readonly DENY: "deny";
8
+ readonly ROLLBACK: "rollback";
9
+ readonly PAUSE: "pause";
10
+ readonly TEST_ONLY: "test-only";
11
+ };
12
+ export type InterventionType = (typeof INTERVENTION)[keyof typeof INTERVENTION];
13
+ export interface EngineDecision {
14
+ allowed: boolean;
15
+ intent: NormalizedIntent;
16
+ decision: EvalResult;
17
+ violations: Array<{
18
+ invariantId: string;
19
+ name: string;
20
+ severity: number;
21
+ expected: string;
22
+ actual: string;
23
+ }>;
24
+ events: DomainEvent[];
25
+ evidencePack: EvidencePack | null;
26
+ intervention: InterventionType | null;
27
+ }
28
+ export interface EngineConfig {
29
+ policyDefs?: unknown[];
30
+ invariants?: AgentGuardInvariant[];
31
+ onEvent?: (event: DomainEvent) => void;
32
+ }
33
+ export interface Engine {
34
+ getPolicyErrors(): string[];
35
+ getPolicyCount(): number;
36
+ getInvariantCount(): number;
37
+ evaluate(rawAction: RawAgentAction | null, systemContext?: Record<string, unknown>): EngineDecision;
38
+ }
39
+ export declare function createEngine(config?: EngineConfig): Engine;
40
+ //# sourceMappingURL=decision.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decision.d.ts","sourceRoot":"","sources":["../../src/kernel/decision.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAI3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAGlD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAExE,eAAO,MAAM,YAAY;;;;;CAKf,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC;AAEhF,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,gBAAgB,CAAC;IACzB,QAAQ,EAAE,UAAU,CAAC;IACrB,UAAU,EAAE,KAAK,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;IACH,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,YAAY,EAAE,YAAY,GAAG,IAAI,CAAC;IAClC,YAAY,EAAE,gBAAgB,GAAG,IAAI,CAAC;CACvC;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACnC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;CACxC;AAED,MAAM,WAAW,MAAM;IACrB,eAAe,IAAI,MAAM,EAAE,CAAC;IAC5B,cAAc,IAAI,MAAM,CAAC;IACzB,iBAAiB,IAAI,MAAM,CAAC;IAC5B,QAAQ,CACN,SAAS,EAAE,cAAc,GAAG,IAAI,EAChC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACtC,cAAc,CAAC;CACnB;AAcD,wBAAgB,YAAY,CAAC,MAAM,GAAE,YAAiB,GAAG,MAAM,CAoF9D"}
@@ -0,0 +1,92 @@
1
+ // Runtime Assurance Engine — the RTA decision switch.
2
+ // Pure domain logic. No DOM, no Node.js-specific APIs.
3
+ import { authorize } from './aab.js';
4
+ import { checkAllInvariants, buildSystemState } from '../invariants/checker.js';
5
+ import { createEvidencePack } from './evidence.js';
6
+ import { loadPolicies } from '../policy/loader.js';
7
+ import { DEFAULT_INVARIANTS } from '../invariants/definitions.js';
8
+ export const INTERVENTION = {
9
+ DENY: 'deny',
10
+ ROLLBACK: 'rollback',
11
+ PAUSE: 'pause',
12
+ TEST_ONLY: 'test-only',
13
+ };
14
+ function selectIntervention(decision, violations) {
15
+ const maxSeverity = Math.max(decision.severity || 0, ...violations.map((v) => v.invariant?.severity || 0));
16
+ if (maxSeverity >= 5)
17
+ return INTERVENTION.DENY;
18
+ if (maxSeverity >= 4)
19
+ return INTERVENTION.PAUSE;
20
+ if (maxSeverity >= 3)
21
+ return INTERVENTION.ROLLBACK;
22
+ return INTERVENTION.TEST_ONLY;
23
+ }
24
+ export function createEngine(config = {}) {
25
+ const { policies, errors: policyErrors } = loadPolicies(config.policyDefs || []);
26
+ const invariants = config.invariants || DEFAULT_INVARIANTS;
27
+ const onEvent = config.onEvent || null;
28
+ function emitEvents(events) {
29
+ if (onEvent) {
30
+ for (const event of events) {
31
+ onEvent(event);
32
+ }
33
+ }
34
+ }
35
+ return {
36
+ getPolicyErrors() {
37
+ return [...policyErrors];
38
+ },
39
+ getPolicyCount() {
40
+ return policies.length;
41
+ },
42
+ getInvariantCount() {
43
+ return invariants.length;
44
+ },
45
+ evaluate(rawAction, systemContext = {}) {
46
+ const { intent, result: authResult, events: authEvents } = authorize(rawAction, policies);
47
+ const state = buildSystemState({
48
+ ...systemContext,
49
+ currentTarget: intent.target,
50
+ currentCommand: intent.command,
51
+ filesAffected: intent.filesAffected || systemContext.filesAffected,
52
+ targetBranch: intent.branch || systemContext.targetBranch,
53
+ forcePush: intent.action === 'git.force-push',
54
+ directPush: intent.action === 'git.push',
55
+ isPush: intent.action === 'git.push' || intent.action === 'git.force-push',
56
+ });
57
+ const { violations, events: invariantEvents, allHold, } = checkAllInvariants(invariants, state);
58
+ const allEvents = [...authEvents, ...invariantEvents];
59
+ const allowed = authResult.allowed && allHold;
60
+ const needsEvidence = !allowed || allEvents.length > 0;
61
+ let evidencePack = null;
62
+ if (needsEvidence && allEvents.length > 0) {
63
+ const { pack, event: packEvent } = createEvidencePack({
64
+ intent,
65
+ decision: authResult,
66
+ violations,
67
+ events: allEvents,
68
+ });
69
+ evidencePack = pack;
70
+ allEvents.push(packEvent);
71
+ }
72
+ const intervention = allowed ? null : selectIntervention(authResult, violations);
73
+ emitEvents(allEvents);
74
+ return {
75
+ allowed,
76
+ intent,
77
+ decision: authResult,
78
+ violations: violations.map((v) => ({
79
+ invariantId: v.invariant.id,
80
+ name: v.invariant.name,
81
+ severity: v.invariant.severity,
82
+ expected: v.result.expected,
83
+ actual: v.result.actual,
84
+ })),
85
+ events: allEvents,
86
+ evidencePack,
87
+ intervention,
88
+ };
89
+ },
90
+ };
91
+ }
92
+ //# sourceMappingURL=decision.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decision.js","sourceRoot":"","sources":["../../src/kernel/decision.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { GovernanceDecisionRecord, SimulationSummary } from './types.js';
2
+ import type { MonitorDecision } from '../monitor.js';
3
+ import type { ExecutionResult } from '../../core/types.js';
4
+ export interface DecisionFactoryInput {
5
+ runId: string;
6
+ decision: MonitorDecision;
7
+ execution: ExecutionResult | null;
8
+ executionDurationMs: number | null;
9
+ simulation: SimulationSummary | null;
10
+ }
11
+ export declare function buildDecisionRecord(input: DecisionFactoryInput): GovernanceDecisionRecord;
12
+ //# sourceMappingURL=factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../src/kernel/decisions/factory.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAG3D,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,eAAe,CAAC;IAC1B,SAAS,EAAE,eAAe,GAAG,IAAI,CAAC;IAClC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,UAAU,EAAE,iBAAiB,GAAG,IAAI,CAAC;CACtC;AAOD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,oBAAoB,GAAG,wBAAwB,CAgDzF"}
@@ -0,0 +1,56 @@
1
+ // Decision record factory — builds GovernanceDecisionRecord from kernel data.
2
+ // Pure logic. Combines MonitorDecision + execution result into a single record.
3
+ import { simpleHash } from '../../core/hash.js';
4
+ function generateRecordId(timestamp, runId, action) {
5
+ const content = `${timestamp}:${runId}:${action}`;
6
+ return `dec_${timestamp}_${simpleHash(content)}`;
7
+ }
8
+ export function buildDecisionRecord(input) {
9
+ const { runId, decision, execution, executionDurationMs, simulation } = input;
10
+ const timestamp = Date.now();
11
+ const intent = decision.intent;
12
+ return {
13
+ recordId: generateRecordId(timestamp, runId, intent.action),
14
+ runId,
15
+ timestamp,
16
+ action: {
17
+ type: intent.action,
18
+ target: intent.target,
19
+ agent: intent.agent,
20
+ destructive: intent.destructive,
21
+ command: intent.command,
22
+ },
23
+ outcome: decision.allowed ? 'allow' : 'deny',
24
+ reason: decision.decision.reason,
25
+ intervention: decision.intervention,
26
+ policy: {
27
+ matchedPolicyId: decision.decision.matchedPolicy?.id ?? null,
28
+ matchedPolicyName: decision.decision.matchedPolicy?.name ?? null,
29
+ severity: decision.decision.severity,
30
+ },
31
+ invariants: {
32
+ allHold: decision.violations.length === 0,
33
+ violations: decision.violations.map((v) => ({
34
+ invariantId: v.invariantId,
35
+ name: v.name,
36
+ severity: v.severity,
37
+ expected: v.expected,
38
+ actual: v.actual,
39
+ })),
40
+ },
41
+ simulation,
42
+ evidencePackId: decision.evidencePack?.packId ?? null,
43
+ monitor: {
44
+ escalationLevel: decision.monitor.escalationLevel,
45
+ totalEvaluations: decision.monitor.totalEvaluations,
46
+ totalDenials: decision.monitor.totalDenials,
47
+ },
48
+ execution: {
49
+ executed: execution !== null,
50
+ success: execution?.success ?? null,
51
+ durationMs: executionDurationMs,
52
+ error: execution?.error ?? null,
53
+ },
54
+ };
55
+ }
56
+ //# sourceMappingURL=factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.js","sourceRoot":"","sources":["../../../src/kernel/decisions/factory.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,gFAAgF;AAKhF,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAUhD,SAAS,gBAAgB,CAAC,SAAiB,EAAE,KAAa,EAAE,MAAc;IACxE,MAAM,OAAO,GAAG,GAAG,SAAS,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;IAClD,OAAO,OAAO,SAAS,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAA2B;IAC7D,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,mBAAmB,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC;IAC9E,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;IAE/B,OAAO;QACL,QAAQ,EAAE,gBAAgB,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;QAC3D,KAAK;QACL,SAAS;QACT,MAAM,EAAE;YACN,IAAI,EAAE,MAAM,CAAC,MAAM;YACnB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB;QACD,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;QAC5C,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM;QAChC,YAAY,EAAE,QAAQ,CAAC,YAAY;QACnC,MAAM,EAAE;YACN,eAAe,EAAE,QAAQ,CAAC,QAAQ,CAAC,aAAa,EAAE,EAAE,IAAI,IAAI;YAC5D,iBAAiB,EAAE,QAAQ,CAAC,QAAQ,CAAC,aAAa,EAAE,IAAI,IAAI,IAAI;YAChE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,QAAQ;SACrC;QACD,UAAU,EAAE;YACV,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC;YACzC,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC1C,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,MAAM,EAAE,CAAC,CAAC,MAAM;aACjB,CAAC,CAAC;SACJ;QACD,UAAU;QACV,cAAc,EAAE,QAAQ,CAAC,YAAY,EAAE,MAAM,IAAI,IAAI;QACrD,OAAO,EAAE;YACP,eAAe,EAAE,QAAQ,CAAC,OAAO,CAAC,eAAe;YACjD,gBAAgB,EAAE,QAAQ,CAAC,OAAO,CAAC,gBAAgB;YACnD,YAAY,EAAE,QAAQ,CAAC,OAAO,CAAC,YAAY;SAC5C;QACD,SAAS,EAAE;YACT,QAAQ,EAAE,SAAS,KAAK,IAAI;YAC5B,OAAO,EAAE,SAAS,EAAE,OAAO,IAAI,IAAI;YACnC,UAAU,EAAE,mBAAmB;YAC/B,KAAK,EAAE,SAAS,EAAE,KAAK,IAAI,IAAI;SAChC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,70 @@
1
+ export interface GovernanceDecisionRecord {
2
+ /** Unique record ID: "dec_<timestamp>_<hash>" */
3
+ recordId: string;
4
+ /** Kernel run ID this decision belongs to */
5
+ runId: string;
6
+ /** When the decision was made */
7
+ timestamp: number;
8
+ /** The action that was evaluated */
9
+ action: {
10
+ type: string;
11
+ target: string;
12
+ agent: string;
13
+ destructive: boolean;
14
+ command?: string;
15
+ };
16
+ /** Final governance outcome */
17
+ outcome: 'allow' | 'deny';
18
+ /** Human-readable reason for the outcome */
19
+ reason: string;
20
+ /** Intervention type if denied (deny, rollback, pause, test-only) */
21
+ intervention: string | null;
22
+ /** Policy matching details */
23
+ policy: {
24
+ matchedPolicyId: string | null;
25
+ matchedPolicyName: string | null;
26
+ severity: number;
27
+ };
28
+ /** Invariant evaluation results */
29
+ invariants: {
30
+ allHold: boolean;
31
+ violations: Array<{
32
+ invariantId: string;
33
+ name: string;
34
+ severity: number;
35
+ expected: string;
36
+ actual: string;
37
+ }>;
38
+ };
39
+ /** Pre-execution simulation results (Phase 2 integration point) */
40
+ simulation: SimulationSummary | null;
41
+ /** Evidence pack ID if generated */
42
+ evidencePackId: string | null;
43
+ /** Monitor state at decision time */
44
+ monitor: {
45
+ escalationLevel: number;
46
+ totalEvaluations: number;
47
+ totalDenials: number;
48
+ };
49
+ /** Execution results (null if denied or dry-run) */
50
+ execution: {
51
+ executed: boolean;
52
+ success: boolean | null;
53
+ durationMs: number | null;
54
+ error: string | null;
55
+ };
56
+ }
57
+ /** Placeholder for Phase 2 simulation integration */
58
+ export interface SimulationSummary {
59
+ predictedChanges: string[];
60
+ blastRadius: number;
61
+ riskLevel: 'low' | 'medium' | 'high';
62
+ simulatorId: string;
63
+ durationMs: number;
64
+ }
65
+ /** Sink interface for decision records (mirrors EventSink pattern) */
66
+ export interface DecisionSink {
67
+ write(record: GovernanceDecisionRecord): void;
68
+ flush?(): void;
69
+ }
70
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/kernel/decisions/types.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,wBAAwB;IACvC,iDAAiD;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,iCAAiC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,oCAAoC;IACpC,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,OAAO,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,+BAA+B;IAC/B,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC;IAC1B,4CAA4C;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,qEAAqE;IACrE,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,8BAA8B;IAC9B,MAAM,EAAE;QACN,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;QAC/B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;QACjC,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,mCAAmC;IACnC,UAAU,EAAE;QACV,OAAO,EAAE,OAAO,CAAC;QACjB,UAAU,EAAE,KAAK,CAAC;YAChB,WAAW,EAAE,MAAM,CAAC;YACpB,IAAI,EAAE,MAAM,CAAC;YACb,QAAQ,EAAE,MAAM,CAAC;YACjB,QAAQ,EAAE,MAAM,CAAC;YACjB,MAAM,EAAE,MAAM,CAAC;SAChB,CAAC,CAAC;KACJ,CAAC;IACF,mEAAmE;IACnE,UAAU,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACrC,oCAAoC;IACpC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,qCAAqC;IACrC,OAAO,EAAE;QACP,eAAe,EAAE,MAAM,CAAC;QACxB,gBAAgB,EAAE,MAAM,CAAC;QACzB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,oDAAoD;IACpD,SAAS,EAAE;QACT,QAAQ,EAAE,OAAO,CAAC;QAClB,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;QACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;KACtB,CAAC;CACH;AAED,qDAAqD;AACrD,MAAM,WAAW,iBAAiB;IAChC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,sEAAsE;AACtE,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,MAAM,EAAE,wBAAwB,GAAG,IAAI,CAAC;IAC9C,KAAK,CAAC,IAAI,IAAI,CAAC;CAChB"}
@@ -0,0 +1,5 @@
1
+ // Governance Decision Record — first-class audit artifact.
2
+ // Aggregates monitor decision, execution data, and evidence into
3
+ // a single persisted, queryable record per agent action.
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/kernel/decisions/types.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,iEAAiE;AACjE,yDAAyD"}
@@ -0,0 +1,29 @@
1
+ import type { DomainEvent } from '../core/types.js';
2
+ import type { NormalizedIntent, EvalResult } from '../policy/evaluator.js';
3
+ import type { InvariantCheck } from '../invariants/checker.js';
4
+ export interface EvidencePack {
5
+ packId: string;
6
+ timestamp: number;
7
+ intent: NormalizedIntent;
8
+ decision: EvalResult;
9
+ violations: Array<{
10
+ invariantId: string;
11
+ name: string;
12
+ severity: number;
13
+ expected: string;
14
+ actual: string;
15
+ }>;
16
+ events: string[];
17
+ summary: string;
18
+ severity: number;
19
+ }
20
+ export declare function createEvidencePack(params: {
21
+ intent: NormalizedIntent;
22
+ decision: EvalResult;
23
+ violations?: InvariantCheck[];
24
+ events?: DomainEvent[];
25
+ }): {
26
+ pack: EvidencePack;
27
+ event: DomainEvent;
28
+ };
29
+ //# sourceMappingURL=evidence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidence.d.ts","sourceRoot":"","sources":["../../src/kernel/evidence.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAC3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE/D,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,gBAAgB,CAAC;IACzB,QAAQ,EAAE,UAAU,CAAC;IACrB,UAAU,EAAE,KAAK,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;IACH,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAyCD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE;IACzC,MAAM,EAAE,gBAAgB,CAAC;IACzB,QAAQ,EAAE,UAAU,CAAC;IACrB,UAAU,CAAC,EAAE,cAAc,EAAE,CAAC;IAC9B,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;CACxB,GAAG;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,KAAK,EAAE,WAAW,CAAA;CAAE,CAgC7C"}
@@ -0,0 +1,61 @@
1
+ // Evidence pack generator — creates structured audit records.
2
+ // Pure domain logic. No DOM, no Node.js-specific APIs.
3
+ import { createEvent, EVIDENCE_PACK_GENERATED } from '../events/schema.js';
4
+ import { simpleHash } from '../core/hash.js';
5
+ function generatePackId(timestamp, intent) {
6
+ const content = `${timestamp}:${intent.action}:${intent.target}:${intent.agent}`;
7
+ return `pack_${simpleHash(content)}`;
8
+ }
9
+ function computeMaxSeverity(decision, violations) {
10
+ let maxSeverity = decision.severity || 0;
11
+ for (const v of violations) {
12
+ if (v.invariant && v.invariant.severity > maxSeverity) {
13
+ maxSeverity = v.invariant.severity;
14
+ }
15
+ }
16
+ return maxSeverity;
17
+ }
18
+ function generateSummary(intent, decision, violations) {
19
+ const parts = [];
20
+ parts.push(`Action: ${intent.action} on ${intent.target || 'unknown'}`);
21
+ parts.push(`Decision: ${decision.decision.toUpperCase()}`);
22
+ if (decision.reason) {
23
+ parts.push(`Reason: ${decision.reason}`);
24
+ }
25
+ if (violations.length > 0) {
26
+ const names = violations.map((v) => v.invariant.name);
27
+ parts.push(`Violations: ${names.join(', ')}`);
28
+ }
29
+ return parts.join(' | ');
30
+ }
31
+ export function createEvidencePack(params) {
32
+ const { intent, decision, violations = [], events = [] } = params;
33
+ const timestamp = Date.now();
34
+ const packId = generatePackId(timestamp, intent);
35
+ const severity = computeMaxSeverity(decision, violations);
36
+ const summary = generateSummary(intent, decision, violations);
37
+ const pack = {
38
+ packId,
39
+ timestamp,
40
+ intent,
41
+ decision,
42
+ violations: violations.map((v) => ({
43
+ invariantId: v.invariant.id,
44
+ name: v.invariant.name,
45
+ severity: v.invariant.severity,
46
+ expected: v.result.expected,
47
+ actual: v.result.actual,
48
+ })),
49
+ events: events.map((e) => e.id),
50
+ summary,
51
+ severity,
52
+ };
53
+ const event = createEvent(EVIDENCE_PACK_GENERATED, {
54
+ packId,
55
+ eventIds: events.map((e) => e.id),
56
+ summary,
57
+ metadata: { severity, violationCount: violations.length },
58
+ });
59
+ return { pack, event };
60
+ }
61
+ //# sourceMappingURL=evidence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidence.js","sourceRoot":"","sources":["../../src/kernel/evidence.ts"],"names":[],"mappings":"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"}