@intutic/cli 2.2.0 → 2.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 (356) hide show
  1. package/README.md +8 -8
  2. package/dist/cli.d.ts +0 -1
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +582 -21
  5. package/dist/cli.js.map +1 -1
  6. package/dist/commands/apiCommand.d.ts +40 -0
  7. package/dist/commands/apiCommand.d.ts.map +1 -0
  8. package/dist/commands/apiCommand.js +88 -0
  9. package/dist/commands/apiCommand.js.map +1 -0
  10. package/dist/commands/budget.d.ts +4 -0
  11. package/dist/commands/budget.d.ts.map +1 -1
  12. package/dist/commands/budget.js +8 -0
  13. package/dist/commands/budget.js.map +1 -1
  14. package/dist/commands/budgetLimits.d.ts +70 -0
  15. package/dist/commands/budgetLimits.d.ts.map +1 -0
  16. package/dist/commands/budgetLimits.js +223 -0
  17. package/dist/commands/budgetLimits.js.map +1 -0
  18. package/dist/commands/compliance.d.ts +122 -0
  19. package/dist/commands/compliance.d.ts.map +1 -0
  20. package/dist/commands/compliance.js +278 -0
  21. package/dist/commands/compliance.js.map +1 -0
  22. package/dist/commands/connect.d.ts +26 -1
  23. package/dist/commands/connect.d.ts.map +1 -1
  24. package/dist/commands/connect.js +109 -51
  25. package/dist/commands/connect.js.map +1 -1
  26. package/dist/commands/credentials.d.ts +6 -2
  27. package/dist/commands/credentials.d.ts.map +1 -1
  28. package/dist/commands/credentials.js +99 -10
  29. package/dist/commands/credentials.js.map +1 -1
  30. package/dist/commands/decision.d.ts +4 -4
  31. package/dist/commands/decision.js +4 -4
  32. package/dist/commands/disconnect.d.ts +4 -0
  33. package/dist/commands/disconnect.d.ts.map +1 -1
  34. package/dist/commands/disconnect.js +17 -3
  35. package/dist/commands/disconnect.js.map +1 -1
  36. package/dist/commands/doctor.d.ts +0 -1
  37. package/dist/commands/doctor.d.ts.map +1 -1
  38. package/dist/commands/doctor.js +0 -1
  39. package/dist/commands/doctor.js.map +1 -1
  40. package/dist/commands/enforce.d.ts +1 -1
  41. package/dist/commands/enforce.js +1 -1
  42. package/dist/commands/enterprise.d.ts +3 -2
  43. package/dist/commands/enterprise.d.ts.map +1 -1
  44. package/dist/commands/enterprise.js +11 -3
  45. package/dist/commands/enterprise.js.map +1 -1
  46. package/dist/commands/env.js +1 -1
  47. package/dist/commands/exec.d.ts +2 -3
  48. package/dist/commands/exec.d.ts.map +1 -1
  49. package/dist/commands/exec.js +4 -5
  50. package/dist/commands/exec.js.map +1 -1
  51. package/dist/commands/gateLiveness.d.ts +15 -0
  52. package/dist/commands/gateLiveness.d.ts.map +1 -0
  53. package/dist/commands/gateLiveness.js +34 -0
  54. package/dist/commands/gateLiveness.js.map +1 -0
  55. package/dist/commands/gateway.d.ts +14 -4
  56. package/dist/commands/gateway.d.ts.map +1 -1
  57. package/dist/commands/gateway.js +34 -4
  58. package/dist/commands/gateway.js.map +1 -1
  59. package/dist/commands/github.d.ts +20 -0
  60. package/dist/commands/github.d.ts.map +1 -0
  61. package/dist/commands/github.js +41 -0
  62. package/dist/commands/github.js.map +1 -0
  63. package/dist/commands/guardrails.d.ts +28 -2
  64. package/dist/commands/guardrails.d.ts.map +1 -1
  65. package/dist/commands/guardrails.js +233 -24
  66. package/dist/commands/guardrails.js.map +1 -1
  67. package/dist/commands/incidents.d.ts +32 -0
  68. package/dist/commands/incidents.d.ts.map +1 -0
  69. package/dist/commands/incidents.js +94 -0
  70. package/dist/commands/incidents.js.map +1 -0
  71. package/dist/commands/init.d.ts +1 -2
  72. package/dist/commands/init.d.ts.map +1 -1
  73. package/dist/commands/init.js +1 -2
  74. package/dist/commands/init.js.map +1 -1
  75. package/dist/commands/install-daemon.d.ts +1 -1
  76. package/dist/commands/install-daemon.js +2 -2
  77. package/dist/commands/integrity.d.ts +10 -2
  78. package/dist/commands/integrity.d.ts.map +1 -1
  79. package/dist/commands/integrity.js +3 -3
  80. package/dist/commands/integrity.js.map +1 -1
  81. package/dist/commands/inventory.d.ts +60 -0
  82. package/dist/commands/inventory.d.ts.map +1 -0
  83. package/dist/commands/inventory.js +141 -0
  84. package/dist/commands/inventory.js.map +1 -0
  85. package/dist/commands/judge.d.ts +1 -1
  86. package/dist/commands/judge.js +2 -2
  87. package/dist/commands/judge.js.map +1 -1
  88. package/dist/commands/login.d.ts +0 -1
  89. package/dist/commands/login.d.ts.map +1 -1
  90. package/dist/commands/login.js +0 -1
  91. package/dist/commands/login.js.map +1 -1
  92. package/dist/commands/logout.d.ts +0 -1
  93. package/dist/commands/logout.d.ts.map +1 -1
  94. package/dist/commands/logout.js +0 -1
  95. package/dist/commands/logout.js.map +1 -1
  96. package/dist/commands/mcp.d.ts +31 -0
  97. package/dist/commands/mcp.d.ts.map +1 -0
  98. package/dist/commands/mcp.js +65 -0
  99. package/dist/commands/mcp.js.map +1 -0
  100. package/dist/commands/notifications.d.ts +54 -0
  101. package/dist/commands/notifications.d.ts.map +1 -0
  102. package/dist/commands/notifications.js +151 -0
  103. package/dist/commands/notifications.js.map +1 -0
  104. package/dist/commands/org.d.ts +3 -3
  105. package/dist/commands/org.js +3 -3
  106. package/dist/commands/policy.d.ts +6 -1
  107. package/dist/commands/policy.d.ts.map +1 -1
  108. package/dist/commands/policy.js +77 -37
  109. package/dist/commands/policy.js.map +1 -1
  110. package/dist/commands/rollback.d.ts.map +1 -1
  111. package/dist/commands/rollback.js +3 -1
  112. package/dist/commands/rollback.js.map +1 -1
  113. package/dist/commands/routing.d.ts +1 -1
  114. package/dist/commands/routing.js +1 -1
  115. package/dist/commands/rules.d.ts +74 -0
  116. package/dist/commands/rules.d.ts.map +1 -0
  117. package/dist/commands/rules.js +283 -0
  118. package/dist/commands/rules.js.map +1 -0
  119. package/dist/commands/settings.d.ts +44 -0
  120. package/dist/commands/settings.d.ts.map +1 -0
  121. package/dist/commands/settings.js +110 -0
  122. package/dist/commands/settings.js.map +1 -0
  123. package/dist/commands/setup.d.ts +1 -1
  124. package/dist/commands/setup.js +1 -1
  125. package/dist/commands/siem.d.ts +53 -0
  126. package/dist/commands/siem.d.ts.map +1 -0
  127. package/dist/commands/siem.js +132 -0
  128. package/dist/commands/siem.js.map +1 -0
  129. package/dist/commands/skill.d.ts +5 -5
  130. package/dist/commands/skill.js +7 -7
  131. package/dist/commands/skill.js.map +1 -1
  132. package/dist/commands/status.d.ts +0 -1
  133. package/dist/commands/status.d.ts.map +1 -1
  134. package/dist/commands/status.js +2 -3
  135. package/dist/commands/status.js.map +1 -1
  136. package/dist/commands/syncContext.d.ts +0 -1
  137. package/dist/commands/syncContext.d.ts.map +1 -1
  138. package/dist/commands/syncContext.js +0 -1
  139. package/dist/commands/syncContext.js.map +1 -1
  140. package/dist/commands/team.d.ts +2 -2
  141. package/dist/commands/team.js +2 -2
  142. package/dist/commands/traces.d.ts +0 -3
  143. package/dist/commands/traces.d.ts.map +1 -1
  144. package/dist/commands/traces.js +0 -3
  145. package/dist/commands/traces.js.map +1 -1
  146. package/dist/commands/usage.d.ts +41 -0
  147. package/dist/commands/usage.d.ts.map +1 -0
  148. package/dist/commands/usage.js +129 -0
  149. package/dist/commands/usage.js.map +1 -0
  150. package/dist/commands/whoami.d.ts +0 -1
  151. package/dist/commands/whoami.d.ts.map +1 -1
  152. package/dist/commands/whoami.js +0 -1
  153. package/dist/commands/whoami.js.map +1 -1
  154. package/dist/config/keychain.d.ts +0 -1
  155. package/dist/config/keychain.d.ts.map +1 -1
  156. package/dist/config/keychain.js +0 -1
  157. package/dist/config/keychain.js.map +1 -1
  158. package/dist/config/paths.d.ts +0 -1
  159. package/dist/config/paths.d.ts.map +1 -1
  160. package/dist/config/paths.js +0 -1
  161. package/dist/config/paths.js.map +1 -1
  162. package/dist/config/store.d.ts +0 -1
  163. package/dist/config/store.d.ts.map +1 -1
  164. package/dist/config/store.js +0 -1
  165. package/dist/config/store.js.map +1 -1
  166. package/dist/harness/ag2.d.ts +1 -1
  167. package/dist/harness/ag2.js +1 -1
  168. package/dist/harness/agentFramework.d.ts +1 -1
  169. package/dist/harness/agentFramework.js +1 -1
  170. package/dist/harness/agenticOrchestrator.d.ts +1 -1
  171. package/dist/harness/agenticOrchestrator.js +2 -2
  172. package/dist/harness/agenticOrchestrator.js.map +1 -1
  173. package/dist/harness/agentsMd.d.ts +24 -0
  174. package/dist/harness/agentsMd.d.ts.map +1 -0
  175. package/dist/harness/agentsMd.js +28 -0
  176. package/dist/harness/agentsMd.js.map +1 -0
  177. package/dist/harness/aider.d.ts +3 -1
  178. package/dist/harness/aider.d.ts.map +1 -1
  179. package/dist/harness/aider.js +9 -7
  180. package/dist/harness/aider.js.map +1 -1
  181. package/dist/harness/antigravity.d.ts +23 -5
  182. package/dist/harness/antigravity.d.ts.map +1 -1
  183. package/dist/harness/antigravity.js +45 -55
  184. package/dist/harness/antigravity.js.map +1 -1
  185. package/dist/harness/autogen.d.ts +1 -1
  186. package/dist/harness/autogen.js +2 -2
  187. package/dist/harness/autogen.js.map +1 -1
  188. package/dist/harness/claudeCode.d.ts +22 -1
  189. package/dist/harness/claudeCode.d.ts.map +1 -1
  190. package/dist/harness/claudeCode.js +47 -3
  191. package/dist/harness/claudeCode.js.map +1 -1
  192. package/dist/harness/cline.d.ts.map +1 -1
  193. package/dist/harness/cline.js +14 -23
  194. package/dist/harness/cline.js.map +1 -1
  195. package/dist/harness/codex.d.ts +6 -1
  196. package/dist/harness/codex.d.ts.map +1 -1
  197. package/dist/harness/codex.js +23 -21
  198. package/dist/harness/codex.js.map +1 -1
  199. package/dist/harness/continue.d.ts +10 -4
  200. package/dist/harness/continue.d.ts.map +1 -1
  201. package/dist/harness/continue.js +22 -22
  202. package/dist/harness/continue.js.map +1 -1
  203. package/dist/harness/cursor.d.ts +5 -2
  204. package/dist/harness/cursor.d.ts.map +1 -1
  205. package/dist/harness/cursor.js +19 -23
  206. package/dist/harness/cursor.js.map +1 -1
  207. package/dist/harness/detector.d.ts +0 -1
  208. package/dist/harness/detector.d.ts.map +1 -1
  209. package/dist/harness/detector.js +0 -1
  210. package/dist/harness/detector.js.map +1 -1
  211. package/dist/harness/dsh.d.ts +5 -3
  212. package/dist/harness/dsh.d.ts.map +1 -1
  213. package/dist/harness/dsh.js +17 -29
  214. package/dist/harness/dsh.js.map +1 -1
  215. package/dist/harness/eve.d.ts +3 -4
  216. package/dist/harness/eve.d.ts.map +1 -1
  217. package/dist/harness/eve.js +3 -4
  218. package/dist/harness/eve.js.map +1 -1
  219. package/dist/harness/githubCopilot.d.ts +4 -1
  220. package/dist/harness/githubCopilot.d.ts.map +1 -1
  221. package/dist/harness/githubCopilot.js +12 -20
  222. package/dist/harness/githubCopilot.js.map +1 -1
  223. package/dist/harness/goose.d.ts +7 -3
  224. package/dist/harness/goose.d.ts.map +1 -1
  225. package/dist/harness/goose.js +18 -21
  226. package/dist/harness/goose.js.map +1 -1
  227. package/dist/harness/grok.d.ts +2 -2
  228. package/dist/harness/grok.d.ts.map +1 -1
  229. package/dist/harness/grok.js +13 -24
  230. package/dist/harness/grok.js.map +1 -1
  231. package/dist/harness/hermes.d.ts +6 -0
  232. package/dist/harness/hermes.d.ts.map +1 -1
  233. package/dist/harness/hermes.js +17 -16
  234. package/dist/harness/hermes.js.map +1 -1
  235. package/dist/harness/muse.d.ts +3 -7
  236. package/dist/harness/muse.d.ts.map +1 -1
  237. package/dist/harness/muse.js +15 -35
  238. package/dist/harness/muse.js.map +1 -1
  239. package/dist/harness/n8n.d.ts +13 -14
  240. package/dist/harness/n8n.d.ts.map +1 -1
  241. package/dist/harness/n8n.js +21 -181
  242. package/dist/harness/n8n.js.map +1 -1
  243. package/dist/harness/openWebUI.d.ts.map +1 -1
  244. package/dist/harness/openWebUI.js +5 -4
  245. package/dist/harness/openWebUI.js.map +1 -1
  246. package/dist/harness/openaiAgents.d.ts +1 -1
  247. package/dist/harness/openaiAgents.js +2 -2
  248. package/dist/harness/openaiAgents.js.map +1 -1
  249. package/dist/harness/openclaw.d.ts +8 -0
  250. package/dist/harness/openclaw.d.ts.map +1 -1
  251. package/dist/harness/openclaw.js +27 -12
  252. package/dist/harness/openclaw.js.map +1 -1
  253. package/dist/harness/opencode.d.ts +4 -5
  254. package/dist/harness/opencode.d.ts.map +1 -1
  255. package/dist/harness/opencode.js +15 -30
  256. package/dist/harness/opencode.js.map +1 -1
  257. package/dist/harness/openhands.d.ts +9 -3
  258. package/dist/harness/openhands.d.ts.map +1 -1
  259. package/dist/harness/openhands.js +30 -24
  260. package/dist/harness/openhands.js.map +1 -1
  261. package/dist/harness/pi.d.ts +7 -2
  262. package/dist/harness/pi.d.ts.map +1 -1
  263. package/dist/harness/pi.js +19 -18
  264. package/dist/harness/pi.js.map +1 -1
  265. package/dist/harness/rooCode.d.ts +12 -5
  266. package/dist/harness/rooCode.d.ts.map +1 -1
  267. package/dist/harness/rooCode.js +23 -39
  268. package/dist/harness/rooCode.js.map +1 -1
  269. package/dist/harness/rulesFiles.d.ts +53 -0
  270. package/dist/harness/rulesFiles.d.ts.map +1 -0
  271. package/dist/harness/rulesFiles.js +106 -0
  272. package/dist/harness/rulesFiles.js.map +1 -0
  273. package/dist/harness/smolagents.d.ts +2 -2
  274. package/dist/harness/smolagents.js +3 -3
  275. package/dist/harness/smolagents.js.map +1 -1
  276. package/dist/harness/types.d.ts +20 -6
  277. package/dist/harness/types.d.ts.map +1 -1
  278. package/dist/harness/types.js +1 -95
  279. package/dist/harness/types.js.map +1 -1
  280. package/dist/harness/windsurf.d.ts +6 -1
  281. package/dist/harness/windsurf.d.ts.map +1 -1
  282. package/dist/harness/windsurf.js +21 -24
  283. package/dist/harness/windsurf.js.map +1 -1
  284. package/dist/harness/xirp.d.ts +1 -2
  285. package/dist/harness/xirp.d.ts.map +1 -1
  286. package/dist/harness/xirp.js +2 -3
  287. package/dist/harness/xirp.js.map +1 -1
  288. package/dist/lib/api.d.ts +27 -1
  289. package/dist/lib/api.d.ts.map +1 -1
  290. package/dist/lib/api.js +55 -18
  291. package/dist/lib/api.js.map +1 -1
  292. package/dist/lib/ciscoScanner.d.ts +1 -1
  293. package/dist/lib/ciscoScanner.js +1 -1
  294. package/dist/lib/decisionsLogRefresh.d.ts.map +1 -1
  295. package/dist/lib/decisionsLogRefresh.js +6 -7
  296. package/dist/lib/decisionsLogRefresh.js.map +1 -1
  297. package/dist/lib/deviceReport.d.ts +15 -0
  298. package/dist/lib/deviceReport.d.ts.map +1 -1
  299. package/dist/lib/deviceReport.js +30 -0
  300. package/dist/lib/deviceReport.js.map +1 -1
  301. package/dist/lib/gitHooks.d.ts +0 -1
  302. package/dist/lib/gitHooks.d.ts.map +1 -1
  303. package/dist/lib/gitHooks.js +8 -9
  304. package/dist/lib/gitHooks.js.map +1 -1
  305. package/dist/lib/gracefulShutdown.d.ts +1 -1
  306. package/dist/lib/gracefulShutdown.js +1 -1
  307. package/dist/lib/hash.d.ts +0 -1
  308. package/dist/lib/hash.d.ts.map +1 -1
  309. package/dist/lib/hash.js +0 -1
  310. package/dist/lib/hash.js.map +1 -1
  311. package/dist/lib/inventory.d.ts +47 -0
  312. package/dist/lib/inventory.d.ts.map +1 -0
  313. package/dist/lib/inventory.js +106 -0
  314. package/dist/lib/inventory.js.map +1 -0
  315. package/dist/lib/logger.d.ts +0 -1
  316. package/dist/lib/logger.d.ts.map +1 -1
  317. package/dist/lib/logger.js +0 -1
  318. package/dist/lib/logger.js.map +1 -1
  319. package/dist/lib/mdmManifest.d.ts +30 -2
  320. package/dist/lib/mdmManifest.d.ts.map +1 -1
  321. package/dist/lib/mdmManifest.js +50 -2
  322. package/dist/lib/mdmManifest.js.map +1 -1
  323. package/dist/lib/onboarding.d.ts +0 -1
  324. package/dist/lib/onboarding.d.ts.map +1 -1
  325. package/dist/lib/onboarding.js +1 -2
  326. package/dist/lib/onboarding.js.map +1 -1
  327. package/dist/lib/policySnapshot.d.ts +3 -2
  328. package/dist/lib/policySnapshot.d.ts.map +1 -1
  329. package/dist/lib/policySnapshot.js +6 -3
  330. package/dist/lib/policySnapshot.js.map +1 -1
  331. package/dist/lib/process.d.ts +5 -1
  332. package/dist/lib/process.d.ts.map +1 -1
  333. package/dist/lib/process.js +13 -4
  334. package/dist/lib/process.js.map +1 -1
  335. package/dist/lib/providerProbe.d.ts +3 -3
  336. package/dist/lib/providerProbe.d.ts.map +1 -1
  337. package/dist/lib/providerProbe.js +15 -7
  338. package/dist/lib/providerProbe.js.map +1 -1
  339. package/dist/lib/sandbox/firecracker.d.ts +3 -3
  340. package/dist/lib/sandbox/firecracker.js +3 -3
  341. package/dist/lib/sandbox/index.d.ts +2 -2
  342. package/dist/lib/sandbox/index.js +2 -2
  343. package/dist/lib/sandbox/oci.d.ts +1 -1
  344. package/dist/lib/sandbox/oci.js +1 -1
  345. package/dist/lib/sandbox/types.d.ts +1 -1
  346. package/dist/lib/sandbox/types.js +1 -1
  347. package/dist/lib/sopFrontMatter.d.ts +1 -1
  348. package/dist/lib/sopFrontMatter.js +1 -1
  349. package/package.json +6 -5
  350. package/resources/sandbox/Dockerfile +1 -1
  351. package/resources/sandbox/entrypoint.sh +4 -4
  352. package/resources/sandbox/firecracker-launch.sh +1 -1
  353. package/dist/harness/base.d.ts +0 -24
  354. package/dist/harness/base.d.ts.map +0 -1
  355. package/dist/harness/base.js +0 -74
  356. package/dist/harness/base.js.map +0 -1
@@ -0,0 +1,283 @@
1
+ /**
2
+ * `intutic rules build|test` — Rego policies as Intutic rules.
3
+ *
4
+ * `build` compiles Rego with OPA (`opa build -t wasm`) and packages the module
5
+ * with the metadata the hosts read: the entrypoint to evaluate, the ABI
6
+ * (`opa`) and a default risk tier, in an `intutic.rule` custom section, so
7
+ * the result is still one `.wasm` file that installs and uploads like any
8
+ * rule. `test` runs a rule against sample inputs through the same Rego host
9
+ * the MCP proxy uses (`@intutic/shared-types`), which decides as the Rust
10
+ * proxy does: both are checked against `opa eval` on the same cases.
11
+ *
12
+ * Installing is `intutic policy install --wasm <file>`, the same command as
13
+ * for any rule; uploading is the dashboard or `POST /api/v1/wasm-rules`.
14
+ *
15
+ * @module
16
+ */
17
+ import * as fs from 'node:fs/promises';
18
+ import * as path from 'node:path';
19
+ import * as os from 'node:os';
20
+ import { createHash } from 'node:crypto';
21
+ import { spawn } from 'node:child_process';
22
+ import { gunzipSync } from 'node:zlib';
23
+ import { FUEL_EXPORT, REGO_FUEL_BUDGET, boundedRegoInput, evaluateRegoRule, loadRegoRule, meterFuel, regoDecision, withRegoMetadata, } from '@intutic/shared-types';
24
+ import { log } from '../lib/logger.js';
25
+ /** The OPA binary: `INTUTIC_OPA_BIN`, else `opa` on the PATH. */
26
+ export function opaBinary() {
27
+ return process.env['INTUTIC_OPA_BIN'] || 'opa';
28
+ }
29
+ export const REGO_HOST = {
30
+ digest: (algorithm, data) => createHash(algorithm).update(data).digest('hex'),
31
+ };
32
+ const RISK_TIERS = ['low', 'medium', 'high', 'critical'];
33
+ /**
34
+ * Load a Rego rule as the MCP proxy loads it: rewritten to count its own
35
+ * instructions against the proxies' budget (`REGO_FUEL_BUDGET`, the Rust
36
+ * proxy's `limits::REGO` on V8's meter), so a rule that runs out of fuel in a
37
+ * proxy runs out here, and reaches no decision the same way. Null for a
38
+ * native rule. `budget` is for tests.
39
+ */
40
+ export function loadMeteredRegoRule(bytes, budget = REGO_FUEL_BUDGET) {
41
+ const plain = new Uint8Array(bytes);
42
+ const rule = loadRegoRule(plain, new WebAssembly.Module(meterFuel(plain, budget)), REGO_HOST);
43
+ return rule && { ...rule, fuelBudget: budget };
44
+ }
45
+ function run(cmd, args) {
46
+ return new Promise((resolve, reject) => {
47
+ const child = spawn(cmd, args, { stdio: ['ignore', 'pipe', 'pipe'] });
48
+ let stdout = '';
49
+ let stderr = '';
50
+ child.stdout.setEncoding('utf8').on('data', (d) => (stdout += d));
51
+ child.stderr.setEncoding('utf8').on('data', (d) => (stderr += d));
52
+ child.on('error', reject);
53
+ child.on('close', (code) => resolve({ code: code ?? 1, stdout, stderr }));
54
+ });
55
+ }
56
+ /**
57
+ * `/policy.wasm` out of the gzipped tar `opa build` writes. Read here rather
58
+ * than by a `tar` binary, which a Windows machine may not have.
59
+ */
60
+ export function extractPolicyWasm(bundle) {
61
+ const tar = gunzipSync(bundle);
62
+ for (let offset = 0; offset + 512 <= tar.length;) {
63
+ const header = tar.subarray(offset, offset + 512);
64
+ if (header.every((b) => b === 0))
65
+ break;
66
+ const field = (start, len) => header.subarray(start, start + len).toString('utf8').replace(/\0.*$/s, '');
67
+ const name = `${field(345, 155)}${field(0, 100)}`;
68
+ const size = parseInt(field(124, 12).trim() || '0', 8);
69
+ const body = offset + 512;
70
+ if (name.replace(/^\/+/, '') === 'policy.wasm')
71
+ return Buffer.from(tar.subarray(body, body + size));
72
+ offset = body + Math.ceil(size / 512) * 512;
73
+ }
74
+ throw new Error('the OPA bundle has no policy.wasm');
75
+ }
76
+ /** Every `.rego` file under `regoPath`, a file or a directory, with its text. */
77
+ async function regoSources(regoPath) {
78
+ const stat = await fs.stat(regoPath);
79
+ if (!stat.isDirectory())
80
+ return [{ file: regoPath, text: await fs.readFile(regoPath, 'utf-8') }];
81
+ const entries = await fs.readdir(regoPath, { recursive: true, withFileTypes: true });
82
+ const files = entries
83
+ .filter((e) => e.isFile() && e.name.endsWith('.rego'))
84
+ .map((e) => path.join(e.parentPath, e.name));
85
+ return Promise.all(files.map(async (file) => ({ file, text: await fs.readFile(file, 'utf-8') })));
86
+ }
87
+ /**
88
+ * Whether a policy's source files, together, read `input.args` but never
89
+ * `input.truncated`.
90
+ *
91
+ * Strings in `args` are cut to keep the input under 64 KB, and `truncated`
92
+ * says so. A policy that inspects `args` without checking it judges a cut
93
+ * command as if it were whole, so padding a command past the limit hides
94
+ * whatever was cut. A textual check, comments stripped: it can be fooled by
95
+ * an alias (`a := input; a.args`), which is why it only warns.
96
+ */
97
+ export function readsArgsIgnoringTruncation(sources) {
98
+ const code = sources
99
+ .join('\n')
100
+ .split('\n')
101
+ .map((line) => line.replace(/#.*$/, ''))
102
+ .join('\n');
103
+ const reads = (field) => new RegExp(`\\binput\\s*(\\.\\s*${field}\\b|\\[\\s*"${field}"\\s*\\])`).test(code);
104
+ return reads('args') && !reads('truncated');
105
+ }
106
+ /** Default output: `build/<entrypoint with / as _>.wasm`. */
107
+ export function defaultOutPath(entrypoint) {
108
+ return path.join('build', `${entrypoint.replace(/[^A-Za-z0-9_-]+/g, '_')}.wasm`);
109
+ }
110
+ export async function runRulesBuild(opts) {
111
+ log.header('Intutic — Build Rego Rule');
112
+ const riskTier = opts.riskTier?.toLowerCase();
113
+ if (riskTier !== undefined && !RISK_TIERS.includes(riskTier)) {
114
+ log.error(`Invalid risk tier "${opts.riskTier}". Use one of: ${RISK_TIERS.join(', ')}.`);
115
+ process.exit(1);
116
+ }
117
+ if (!/^[A-Za-z_][\w.]*(\/[A-Za-z_][\w]*)+$/.test(opts.entrypoint)) {
118
+ log.error(`Invalid entrypoint "${opts.entrypoint}". Use package/rule, e.g. intutic/shell/deny.`);
119
+ process.exit(1);
120
+ }
121
+ // Warn, not fail: the check is textual, and a policy may have reasons of
122
+ // its own. Unreadable source is left for `opa build` to report.
123
+ const unguarded = await regoSources(opts.rego).then((sources) => readsArgsIgnoringTruncation(sources.map((s) => s.text)), () => false);
124
+ if (unguarded) {
125
+ log.warn('The policy reads input.args but never input.truncated. Arguments over the 64 KB input limit ' +
126
+ 'are cut before the policy sees them, so a padded command can hide what it looks for. ' +
127
+ 'Refuse the tools it governs when input.truncated is true.');
128
+ }
129
+ const opa = opaBinary();
130
+ try {
131
+ await run(opa, ['version']);
132
+ }
133
+ catch {
134
+ log.error(`OPA is required to compile Rego and "${opa}" was not found. Install it ` +
135
+ '(https://www.openpolicyagent.org/docs/latest/#1-download-opa) or set INTUTIC_OPA_BIN to its path.');
136
+ process.exit(1);
137
+ }
138
+ const work = await fs.mkdtemp(path.join(os.tmpdir(), 'intutic-rego-'));
139
+ let module;
140
+ try {
141
+ const bundle = path.join(work, 'bundle.tar.gz');
142
+ const built = await run(opa, ['build', '-t', 'wasm', '-e', opts.entrypoint, opts.rego, '-o', bundle]);
143
+ if (built.code !== 0) {
144
+ log.error(`opa build failed:\n${built.stderr || built.stdout}`);
145
+ process.exit(1);
146
+ }
147
+ module = withRegoMetadata(extractPolicyWasm(await fs.readFile(bundle)), {
148
+ v: 1,
149
+ abi: 'opa',
150
+ entrypoint: opts.entrypoint,
151
+ ...(riskTier ? { risk_tier: riskTier } : {}),
152
+ });
153
+ }
154
+ finally {
155
+ await fs.rm(work, { recursive: true, force: true });
156
+ }
157
+ // Refuse here what a host would refuse at load: a builtin it lacks, an old
158
+ // ABI. Building a rule that every proxy then skips helps nobody.
159
+ try {
160
+ loadMeteredRegoRule(module);
161
+ }
162
+ catch (err) {
163
+ log.error(`The policy compiled, but Intutic cannot run it: ${err.message}`);
164
+ process.exit(1);
165
+ }
166
+ const out = opts.out ?? defaultOutPath(opts.entrypoint);
167
+ await fs.mkdir(path.dirname(out), { recursive: true });
168
+ await fs.writeFile(out, module);
169
+ log.success(`Built ${out}`);
170
+ log.field('Entrypoint', opts.entrypoint);
171
+ log.field('Risk tier', riskTier ?? '(none)');
172
+ log.field('Size', `${(module.length / 1024).toFixed(0)} KB`);
173
+ log.field('SHA-256', createHash('sha256').update(module).digest('hex'));
174
+ log.info(`Test it: intutic rules test ${out} --input <cases.json>`);
175
+ log.info(`Install it: intutic policy install --wasm ${out}`);
176
+ }
177
+ /** A file of cases `[{name?, input, expect?}]`, or one bare input document. */
178
+ export function parseCases(text) {
179
+ const parsed = JSON.parse(text);
180
+ if (Array.isArray(parsed)) {
181
+ return parsed.map((c, i) => {
182
+ if (c === null || typeof c !== 'object' || typeof c.input !== 'object') {
183
+ throw new Error(`case ${i + 1} has no "input" object`);
184
+ }
185
+ return c;
186
+ });
187
+ }
188
+ if (parsed === null || typeof parsed !== 'object')
189
+ throw new Error('expected an input object or an array of cases');
190
+ return [{ input: parsed }];
191
+ }
192
+ /**
193
+ * The decision `rule` reaches on one input, as a proxy would reach it. Throws
194
+ * when it reaches none: out of instructions (a metered rule), an error, or a
195
+ * result in none of the decision shapes.
196
+ */
197
+ export function decideCase(rule, input) {
198
+ let fuel;
199
+ const host = {
200
+ ...REGO_HOST,
201
+ onInstance: (exports) => {
202
+ const counter = exports[FUEL_EXPORT];
203
+ if (counter instanceof WebAssembly.Global)
204
+ fuel = counter;
205
+ },
206
+ };
207
+ let raw;
208
+ try {
209
+ raw = evaluateRegoRule(rule, boundedRegoInput({ v: 1, ...input }), host);
210
+ }
211
+ catch (err) {
212
+ if (fuel && fuel.value < 0 && 'fuelBudget' in rule) {
213
+ throw new Error(`Rego rule ran out of its ${rule.fuelBudget}-instruction budget`, { cause: err });
214
+ }
215
+ throw err;
216
+ }
217
+ const decision = regoDecision(raw, rule.entrypoint);
218
+ return decision.riskTier || !rule.riskTier ? decision : { ...decision, riskTier: rule.riskTier };
219
+ }
220
+ export async function runRulesTest(modulePath, opts) {
221
+ log.header('Intutic — Test Rego Rule');
222
+ let rule;
223
+ try {
224
+ rule = loadMeteredRegoRule(await fs.readFile(modulePath));
225
+ }
226
+ catch (err) {
227
+ log.error(`Cannot load "${modulePath}": ${err.message}`);
228
+ process.exit(1);
229
+ }
230
+ if (!rule) {
231
+ log.error(`"${modulePath}" is a native rule, not a Rego one. Test it with: intutic policy test --wasm ${modulePath} --mock <context.json>`);
232
+ process.exit(1);
233
+ }
234
+ log.field('Entrypoint', rule.entrypoint);
235
+ let failed = 0;
236
+ let total = 0;
237
+ for (const file of opts.input) {
238
+ let cases;
239
+ try {
240
+ cases = parseCases(await fs.readFile(file, 'utf-8'));
241
+ }
242
+ catch (err) {
243
+ log.error(`Cannot read cases from "${file}": ${err.message}`);
244
+ process.exit(1);
245
+ }
246
+ for (const [i, c] of cases.entries()) {
247
+ total += 1;
248
+ const label = c.name ?? `${path.basename(file)} #${i + 1}`;
249
+ let decision;
250
+ try {
251
+ decision = decideCase(rule, c.input);
252
+ }
253
+ catch (err) {
254
+ failed += 1;
255
+ log.error(`${label}: evaluation reached no decision (a proxy refuses the call as GOVERNANCE_UNAVAILABLE): ${err.message}`);
256
+ continue;
257
+ }
258
+ const detail = [
259
+ decision.decision.toUpperCase(),
260
+ 'reason' in decision ? `— ${decision.reason}` : '',
261
+ decision.riskTier ? `[${decision.riskTier}]` : '',
262
+ ]
263
+ .filter(Boolean)
264
+ .join(' ');
265
+ if (c.expect && c.expect !== decision.decision) {
266
+ failed += 1;
267
+ log.error(`${label}: expected ${c.expect.toUpperCase()}, got ${detail}`);
268
+ }
269
+ else if (c.expect) {
270
+ log.success(`${label}: ${detail}`);
271
+ }
272
+ else {
273
+ log.info(`${label}: ${detail}`);
274
+ }
275
+ }
276
+ }
277
+ if (failed > 0) {
278
+ log.error(`${failed} of ${total} case${total === 1 ? '' : 's'} failed`);
279
+ process.exit(1);
280
+ }
281
+ log.success(`${total} case${total === 1 ? '' : 's'} evaluated`);
282
+ }
283
+ //# sourceMappingURL=rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/commands/rules.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * `intutic settings` — read and change workspace settings.
3
+ *
4
+ * Subcommands:
5
+ * - `intutic settings get [key] [--json]`
6
+ * - `intutic settings set <key> [value] [--file <path>] [--json]`
7
+ *
8
+ * Server side: `GET` / `PUT /api/v1/workspace/settings`
9
+ * (services/control-plane/src/routes/workspace.ts). One generic pair rather
10
+ * than a command per setting: the route's strict schema is the authority on
11
+ * which keys exist and what each accepts, and refuses an unknown key or a bad
12
+ * value with a 400 naming it, so the CLI stays correct as settings are added.
13
+ * The MCP policy (`mcpDefaultPolicy`, `mcpHighRiskToolChange`, `mcpBudgets`,
14
+ * `mcpInjectionAction`, `mcpAnomalyMode`, …), the group policy
15
+ * (`sso_group_policy`), the PII detector actions (`piiDetectors`), upstream
16
+ * retries and fallbacks (`upstreamRetry`) and `configBodyUpload` are all set
17
+ * this way.
18
+ *
19
+ * The structured settings with a schema in `@intutic/shared-types` are
20
+ * checked here first, so a mistake in a budgets, group-policy, detector or
21
+ * retry file is reported with the path of the field at fault rather than only the
22
+ * top-level key the server's 400 names.
23
+ *
24
+ * @module
25
+ */
26
+ import { type ApiCommandOpts } from './apiCommand.js';
27
+ /**
28
+ * What is wrong with `value` for `key`, by field path, for the settings with
29
+ * a schema in `@intutic/shared-types`; empty for every other key, which the
30
+ * server checks.
31
+ */
32
+ export declare function localProblems(key: string, value: unknown): string[];
33
+ /**
34
+ * A value given on the command line: JSON when it parses as JSON (`true`,
35
+ * `30`, `null`, `["a","b"]`), the plain string otherwise (`deny`).
36
+ */
37
+ export declare function parseSettingValue(raw: string): unknown;
38
+ /** `intutic settings get [key]` */
39
+ export declare function runSettingsGet(key: string | undefined, opts: ApiCommandOpts): Promise<void>;
40
+ /** `intutic settings set <key> [value] [--file <path>]` */
41
+ export declare function runSettingsSet(key: string, raw: string | undefined, opts: ApiCommandOpts & {
42
+ file?: string;
43
+ }): Promise<void>;
44
+ //# sourceMappingURL=settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/commands/settings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AASH,OAAO,EAAqC,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAOxF;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,CAYnE;AAMD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAMtD;AAED,mCAAmC;AACnC,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BjG;AAED,2DAA2D;AAC3D,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,IAAI,EAAE,cAAc,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACvC,OAAO,CAAC,IAAI,CAAC,CAoBf"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * `intutic settings` — read and change workspace settings.
3
+ *
4
+ * Subcommands:
5
+ * - `intutic settings get [key] [--json]`
6
+ * - `intutic settings set <key> [value] [--file <path>] [--json]`
7
+ *
8
+ * Server side: `GET` / `PUT /api/v1/workspace/settings`
9
+ * (services/control-plane/src/routes/workspace.ts). One generic pair rather
10
+ * than a command per setting: the route's strict schema is the authority on
11
+ * which keys exist and what each accepts, and refuses an unknown key or a bad
12
+ * value with a 400 naming it, so the CLI stays correct as settings are added.
13
+ * The MCP policy (`mcpDefaultPolicy`, `mcpHighRiskToolChange`, `mcpBudgets`,
14
+ * `mcpInjectionAction`, `mcpAnomalyMode`, …), the group policy
15
+ * (`sso_group_policy`), the PII detector actions (`piiDetectors`), upstream
16
+ * retries and fallbacks (`upstreamRetry`) and `configBodyUpload` are all set
17
+ * this way.
18
+ *
19
+ * The structured settings with a schema in `@intutic/shared-types` are
20
+ * checked here first, so a mistake in a budgets, group-policy, detector or
21
+ * retry file is reported with the path of the field at fault rather than only the
22
+ * top-level key the server's 400 names.
23
+ *
24
+ * @module
25
+ */
26
+ import { McpBudgetSettingsSchema, PiiDetectorSettingsSchema, SsoGroupPolicySchema, UpstreamRetrySettingsSchema, } from '@intutic/shared-types';
27
+ import { log } from '../lib/logger.js';
28
+ import { fail, readJsonFile, runApiCommand } from './apiCommand.js';
29
+ /**
30
+ * What is wrong with `value` for `key`, by field path, for the settings with
31
+ * a schema in `@intutic/shared-types`; empty for every other key, which the
32
+ * server checks.
33
+ */
34
+ export function localProblems(key, value) {
35
+ const schema = key === 'mcpBudgets' ? McpBudgetSettingsSchema
36
+ // `null` clears the policy.
37
+ : key === 'sso_group_policy' ? SsoGroupPolicySchema.nullable()
38
+ : key === 'piiDetectors' ? PiiDetectorSettingsSchema.nullable()
39
+ : key === 'upstreamRetry' ? UpstreamRetrySettingsSchema.nullable()
40
+ : null;
41
+ if (!schema)
42
+ return [];
43
+ const checked = schema.safeParse(value);
44
+ if (checked.success)
45
+ return [];
46
+ return checked.error.issues.map((i) => `${[key, ...i.path.map(String)].join('.')}: ${i.message}`);
47
+ }
48
+ function formatValue(value) {
49
+ return typeof value === 'string' ? value : JSON.stringify(value, null, 2);
50
+ }
51
+ /**
52
+ * A value given on the command line: JSON when it parses as JSON (`true`,
53
+ * `30`, `null`, `["a","b"]`), the plain string otherwise (`deny`).
54
+ */
55
+ export function parseSettingValue(raw) {
56
+ try {
57
+ return JSON.parse(raw);
58
+ }
59
+ catch {
60
+ return raw;
61
+ }
62
+ }
63
+ /** `intutic settings get [key]` */
64
+ export async function runSettingsGet(key, opts) {
65
+ await runApiCommand(
66
+ // Not `opts`: with a key, `--json` prints that value, not the whole response.
67
+ { dev: opts.dev }, 'Failed to read workspace settings', (client) => client.get('/api/v1/workspace/settings'), (res) => {
68
+ if (key !== undefined) {
69
+ const value = res.settings[key];
70
+ if (opts.json) {
71
+ console.log(JSON.stringify(value ?? null, null, 2));
72
+ }
73
+ else if (value === undefined) {
74
+ log.dim(`${key} is not set.`);
75
+ }
76
+ else {
77
+ console.log(formatValue(value));
78
+ }
79
+ return;
80
+ }
81
+ if (opts.json) {
82
+ console.log(JSON.stringify(res, null, 2));
83
+ return;
84
+ }
85
+ log.header('Intutic — Workspace Settings');
86
+ log.field('Workspace', res.workspaceId);
87
+ for (const [name, value] of Object.entries(res.settings)) {
88
+ log.field(name, typeof value === 'string' ? value : JSON.stringify(value));
89
+ }
90
+ });
91
+ }
92
+ /** `intutic settings set <key> [value] [--file <path>]` */
93
+ export async function runSettingsSet(key, raw, opts) {
94
+ if ((raw === undefined) === (opts.file === undefined)) {
95
+ fail('Give the value either as an argument or with --file <path>, not both.');
96
+ }
97
+ const value = opts.file !== undefined ? readJsonFile(opts.file) : parseSettingValue(raw);
98
+ const problems = localProblems(key, value);
99
+ if (problems.length > 0)
100
+ fail(`${key} is not valid:\n${problems.map((p) => ` ${p}`).join('\n')}`);
101
+ await runApiCommand(opts, `Failed to update ${key}`, (client) => client.put('/api/v1/workspace/settings', { [key]: value }), (res) => {
102
+ log.success(`${key} updated.`);
103
+ const now = res.settings[key];
104
+ if (now === undefined)
105
+ log.dim(` ${key} is now unset.`);
106
+ else
107
+ console.log(formatValue(now));
108
+ });
109
+ }
110
+ //# sourceMappingURL=settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/commands/settings.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * `intutic setup` — the cohort setup wizard (LLD #70, model catalog & cohort
2
+ * `intutic setup` — the cohort setup wizard (model catalog & cohort
3
3
  * wizard): codescan → provider → credentials → verify → persist → summary. Mirrors the dashboard's `SetupWizard.tsx` step order
4
4
  * (minus the parts that need a browser) and, wherever a step corresponds to
5
5
  * an existing flag-driven command, calls exactly what that command calls —
@@ -1,5 +1,5 @@
1
1
  /**
2
- * `intutic setup` — the cohort setup wizard (LLD #70, model catalog & cohort
2
+ * `intutic setup` — the cohort setup wizard (model catalog & cohort
3
3
  * wizard): codescan → provider → credentials → verify → persist → summary. Mirrors the dashboard's `SetupWizard.tsx` step order
4
4
  * (minus the parts that need a browser) and, wherever a step corresponds to
5
5
  * an existing flag-driven command, calls exactly what that command calls —
@@ -0,0 +1,53 @@
1
+ /**
2
+ * `intutic siem` — SIEM export destinations: where governance events stream
3
+ * (syslog CEF, HTTPS webhook, Splunk HEC, Datadog Logs, GCS, S3), and which
4
+ * event sources each receives.
5
+ *
6
+ * Subcommands:
7
+ * - `intutic siem list [--json]`
8
+ * - `intutic siem show <destination_id> [--json]`
9
+ * - `intutic siem sources [--json]`
10
+ * - `intutic siem create --name <name> --type <adapter> --config <path> [...] [--json]`
11
+ * - `intutic siem update <destination_id> [...] [--json]`
12
+ * - `intutic siem delete <destination_id> [--json]`
13
+ * - `intutic siem rotate-secret <destination_id> [--json]`
14
+ *
15
+ * Server side: services/control-plane/src/routes/siem.ts. Writes need OWNER
16
+ * or ADMIN. The adapter config carries credentials (a HEC token, an API key),
17
+ * so it is read from a JSON file rather than taken on the command line, where
18
+ * it would land in shell history. The server encrypts it, masks it on every
19
+ * read, and refuses a destination that points at an internal address.
20
+ *
21
+ * @module
22
+ */
23
+ import { type ApiCommandOpts } from './apiCommand.js';
24
+ /** The flags `create` and `update` share. */
25
+ export interface DestinationFlags {
26
+ name?: string;
27
+ config?: string;
28
+ sources?: string;
29
+ defaultSources?: boolean;
30
+ batchSize?: string;
31
+ flushIntervalMs?: string;
32
+ }
33
+ /** The request body for the given flags: only the fields a flag set. */
34
+ export declare function destinationBody(flags: DestinationFlags): Record<string, unknown>;
35
+ /** `intutic siem list` */
36
+ export declare function runSiemList(opts: ApiCommandOpts): Promise<void>;
37
+ /** `intutic siem show <destination_id>` */
38
+ export declare function runSiemShow(destinationId: string, opts: ApiCommandOpts): Promise<void>;
39
+ /** `intutic siem sources` */
40
+ export declare function runSiemSources(opts: ApiCommandOpts): Promise<void>;
41
+ /** `intutic siem create` */
42
+ export declare function runSiemCreate(opts: ApiCommandOpts & DestinationFlags & {
43
+ type?: string;
44
+ }): Promise<void>;
45
+ /** `intutic siem update <destination_id>` */
46
+ export declare function runSiemUpdate(destinationId: string, opts: ApiCommandOpts & DestinationFlags & {
47
+ enable?: boolean;
48
+ }): Promise<void>;
49
+ /** `intutic siem delete <destination_id>` */
50
+ export declare function runSiemDelete(destinationId: string, opts: ApiCommandOpts): Promise<void>;
51
+ /** `intutic siem rotate-secret <destination_id>` */
52
+ export declare function runSiemRotateSecret(destinationId: string, opts: ApiCommandOpts): Promise<void>;
53
+ //# sourceMappingURL=siem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"siem.d.ts","sourceRoot":"","sources":["../../src/commands/siem.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAIH,OAAO,EAA4E,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAuB/H,6CAA6C;AAC7C,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,wEAAwE;AACxE,wBAAgB,eAAe,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAiBhF;AAcD,0BAA0B;AAC1B,wBAAsB,WAAW,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBrE;AAED,2CAA2C;AAC3C,wBAAsB,WAAW,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAU5F;AAED,6BAA6B;AAC7B,wBAAsB,cAAc,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAaxE;AAED,4BAA4B;AAC5B,wBAAsB,aAAa,CAAC,IAAI,EAAE,cAAc,GAAG,gBAAgB,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAe9G;AAED,6CAA6C;AAC7C,wBAAsB,aAAa,CACjC,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,cAAc,GAAG,gBAAgB,GAAG;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAC7D,OAAO,CAAC,IAAI,CAAC,CAaf;AAED,6CAA6C;AAC7C,wBAAsB,aAAa,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAO9F;AAED,oDAAoD;AACpD,wBAAsB,mBAAmB,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAapG"}