@cavelang/cli 0.27.14 → 0.29.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 (321) hide show
  1. package/Authors.md +5 -0
  2. package/License.md +6 -0
  3. package/README.md +122 -24
  4. package/dist/internal/act/action.d.ts +69 -0
  5. package/dist/internal/act/action.d.ts.map +1 -0
  6. package/dist/internal/act/action.js +201 -0
  7. package/dist/internal/act/action.js.map +1 -0
  8. package/dist/internal/act/declare.d.ts +102 -0
  9. package/dist/internal/act/declare.d.ts.map +1 -0
  10. package/dist/internal/act/declare.js +270 -0
  11. package/dist/internal/act/declare.js.map +1 -0
  12. package/dist/internal/act/engine.d.ts +103 -0
  13. package/dist/internal/act/engine.d.ts.map +1 -0
  14. package/dist/internal/act/engine.js +298 -0
  15. package/dist/internal/act/engine.js.map +1 -0
  16. package/dist/internal/act/index.d.ts +27 -0
  17. package/dist/internal/act/index.d.ts.map +1 -0
  18. package/dist/internal/act/index.js +25 -0
  19. package/dist/internal/act/index.js.map +1 -0
  20. package/dist/internal/automate/automation.d.ts +78 -0
  21. package/dist/internal/automate/automation.d.ts.map +1 -0
  22. package/dist/internal/automate/automation.js +135 -0
  23. package/dist/internal/automate/automation.js.map +1 -0
  24. package/dist/internal/automate/declare.d.ts +84 -0
  25. package/dist/internal/automate/declare.d.ts.map +1 -0
  26. package/dist/internal/automate/declare.js +233 -0
  27. package/dist/internal/automate/declare.js.map +1 -0
  28. package/dist/internal/automate/engine.d.ts +125 -0
  29. package/dist/internal/automate/engine.d.ts.map +1 -0
  30. package/dist/internal/automate/engine.js +388 -0
  31. package/dist/internal/automate/engine.js.map +1 -0
  32. package/dist/internal/automate/index.d.ts +28 -0
  33. package/dist/internal/automate/index.d.ts.map +1 -0
  34. package/dist/internal/automate/index.js +26 -0
  35. package/dist/internal/automate/index.js.map +1 -0
  36. package/dist/internal/automate/main.d.ts +26 -0
  37. package/dist/internal/automate/main.d.ts.map +1 -0
  38. package/dist/internal/automate/main.js +298 -0
  39. package/dist/internal/automate/main.js.map +1 -0
  40. package/dist/internal/connect/index.d.ts +26 -0
  41. package/dist/internal/connect/index.d.ts.map +1 -0
  42. package/dist/internal/connect/index.js +24 -0
  43. package/dist/internal/connect/index.js.map +1 -0
  44. package/dist/internal/connect/main.d.ts +23 -0
  45. package/dist/internal/connect/main.d.ts.map +1 -0
  46. package/dist/internal/connect/main.js +330 -0
  47. package/dist/internal/connect/main.js.map +1 -0
  48. package/dist/internal/connect/run.d.ts +85 -0
  49. package/dist/internal/connect/run.d.ts.map +1 -0
  50. package/dist/internal/connect/run.js +242 -0
  51. package/dist/internal/connect/run.js.map +1 -0
  52. package/dist/internal/connect/source.d.ts +44 -0
  53. package/dist/internal/connect/source.d.ts.map +1 -0
  54. package/dist/internal/connect/source.js +215 -0
  55. package/dist/internal/connect/source.js.map +1 -0
  56. package/dist/internal/connect/template.d.ts +69 -0
  57. package/dist/internal/connect/template.d.ts.map +1 -0
  58. package/dist/internal/connect/template.js +221 -0
  59. package/dist/internal/connect/template.js.map +1 -0
  60. package/dist/internal/eval/index.d.ts +28 -0
  61. package/dist/internal/eval/index.d.ts.map +1 -0
  62. package/dist/internal/eval/index.js +27 -0
  63. package/dist/internal/eval/index.js.map +1 -0
  64. package/dist/internal/eval/judge.d.ts +30 -0
  65. package/dist/internal/eval/judge.d.ts.map +1 -0
  66. package/dist/internal/eval/judge.js +101 -0
  67. package/dist/internal/eval/judge.js.map +1 -0
  68. package/dist/internal/eval/loop.d.ts +64 -0
  69. package/dist/internal/eval/loop.d.ts.map +1 -0
  70. package/dist/internal/eval/loop.js +123 -0
  71. package/dist/internal/eval/loop.js.map +1 -0
  72. package/dist/internal/eval/main.d.ts +17 -0
  73. package/dist/internal/eval/main.d.ts.map +1 -0
  74. package/dist/internal/eval/main.js +236 -0
  75. package/dist/internal/eval/main.js.map +1 -0
  76. package/dist/internal/eval/queries.d.ts +74 -0
  77. package/dist/internal/eval/queries.d.ts.map +1 -0
  78. package/dist/internal/eval/queries.js +161 -0
  79. package/dist/internal/eval/queries.js.map +1 -0
  80. package/dist/internal/eval/run.d.ts +143 -0
  81. package/dist/internal/eval/run.d.ts.map +1 -0
  82. package/dist/internal/eval/run.js +376 -0
  83. package/dist/internal/eval/run.js.map +1 -0
  84. package/dist/internal/eval/score.d.ts +81 -0
  85. package/dist/internal/eval/score.d.ts.map +1 -0
  86. package/dist/internal/eval/score.js +126 -0
  87. package/dist/internal/eval/score.js.map +1 -0
  88. package/dist/internal/eval/suite.d.ts +66 -0
  89. package/dist/internal/eval/suite.d.ts.map +1 -0
  90. package/dist/internal/eval/suite.js +130 -0
  91. package/dist/internal/eval/suite.js.map +1 -0
  92. package/dist/internal/ingest/context.d.ts +20 -0
  93. package/dist/internal/ingest/context.d.ts.map +1 -0
  94. package/dist/internal/ingest/context.js +59 -0
  95. package/dist/internal/ingest/context.js.map +1 -0
  96. package/dist/internal/ingest/files.d.ts +46 -0
  97. package/dist/internal/ingest/files.d.ts.map +1 -0
  98. package/dist/internal/ingest/files.js +115 -0
  99. package/dist/internal/ingest/files.js.map +1 -0
  100. package/dist/internal/ingest/index.d.ts +31 -0
  101. package/dist/internal/ingest/index.d.ts.map +1 -0
  102. package/dist/internal/ingest/index.js +29 -0
  103. package/dist/internal/ingest/index.js.map +1 -0
  104. package/dist/internal/ingest/main.d.ts +12 -0
  105. package/dist/internal/ingest/main.d.ts.map +1 -0
  106. package/dist/internal/ingest/main.js +180 -0
  107. package/dist/internal/ingest/main.js.map +1 -0
  108. package/dist/internal/ingest/prompt.d.ts +32 -0
  109. package/dist/internal/ingest/prompt.d.ts.map +1 -0
  110. package/dist/internal/ingest/prompt.js +75 -0
  111. package/dist/internal/ingest/prompt.js.map +1 -0
  112. package/dist/internal/ingest/run.d.ts +142 -0
  113. package/dist/internal/ingest/run.d.ts.map +1 -0
  114. package/dist/internal/ingest/run.js +350 -0
  115. package/dist/internal/ingest/run.js.map +1 -0
  116. package/dist/internal/ingest/web.d.ts +48 -0
  117. package/dist/internal/ingest/web.d.ts.map +1 -0
  118. package/dist/internal/ingest/web.js +140 -0
  119. package/dist/internal/ingest/web.js.map +1 -0
  120. package/dist/internal/loop/demo.d.ts +22 -0
  121. package/dist/internal/loop/demo.d.ts.map +1 -0
  122. package/dist/internal/loop/demo.js +67 -0
  123. package/dist/internal/loop/demo.js.map +1 -0
  124. package/dist/internal/loop/index.d.ts +20 -0
  125. package/dist/internal/loop/index.d.ts.map +1 -0
  126. package/dist/internal/loop/index.js +17 -0
  127. package/dist/internal/loop/index.js.map +1 -0
  128. package/dist/internal/loop/llm.d.ts +99 -0
  129. package/dist/internal/loop/llm.d.ts.map +1 -0
  130. package/dist/internal/loop/llm.js +231 -0
  131. package/dist/internal/loop/llm.js.map +1 -0
  132. package/dist/internal/loop/reconstruct.d.ts +87 -0
  133. package/dist/internal/loop/reconstruct.d.ts.map +1 -0
  134. package/dist/internal/loop/reconstruct.js +157 -0
  135. package/dist/internal/loop/reconstruct.js.map +1 -0
  136. package/dist/internal/loop/sqlite.d.ts +13 -0
  137. package/dist/internal/loop/sqlite.d.ts.map +1 -0
  138. package/dist/internal/loop/sqlite.js +33 -0
  139. package/dist/internal/loop/sqlite.js.map +1 -0
  140. package/dist/internal/loop/store.d.ts +50 -0
  141. package/dist/internal/loop/store.d.ts.map +1 -0
  142. package/dist/internal/loop/store.js +100 -0
  143. package/dist/internal/loop/store.js.map +1 -0
  144. package/dist/internal/mcp/bin.d.ts +7 -0
  145. package/dist/internal/mcp/bin.d.ts.map +1 -0
  146. package/dist/internal/mcp/bin.js +8 -0
  147. package/dist/internal/mcp/bin.js.map +1 -0
  148. package/dist/internal/mcp/index.d.ts +25 -0
  149. package/dist/internal/mcp/index.d.ts.map +1 -0
  150. package/dist/internal/mcp/index.js +23 -0
  151. package/dist/internal/mcp/index.js.map +1 -0
  152. package/dist/internal/mcp/main.d.ts +23 -0
  153. package/dist/internal/mcp/main.d.ts.map +1 -0
  154. package/dist/internal/mcp/main.js +156 -0
  155. package/dist/internal/mcp/main.js.map +1 -0
  156. package/dist/internal/mcp/server.d.ts +92 -0
  157. package/dist/internal/mcp/server.d.ts.map +1 -0
  158. package/dist/internal/mcp/server.js +251 -0
  159. package/dist/internal/mcp/server.js.map +1 -0
  160. package/dist/internal/mcp/tools.d.ts +91 -0
  161. package/dist/internal/mcp/tools.d.ts.map +1 -0
  162. package/dist/internal/mcp/tools.js +584 -0
  163. package/dist/internal/mcp/tools.js.map +1 -0
  164. package/dist/internal/rules/declare.d.ts +58 -0
  165. package/dist/internal/rules/declare.d.ts.map +1 -0
  166. package/dist/internal/rules/declare.js +152 -0
  167. package/dist/internal/rules/declare.js.map +1 -0
  168. package/dist/internal/rules/engine.d.ts +125 -0
  169. package/dist/internal/rules/engine.d.ts.map +1 -0
  170. package/dist/internal/rules/engine.js +575 -0
  171. package/dist/internal/rules/engine.js.map +1 -0
  172. package/dist/internal/rules/index.d.ts +23 -0
  173. package/dist/internal/rules/index.d.ts.map +1 -0
  174. package/dist/internal/rules/index.js +21 -0
  175. package/dist/internal/rules/index.js.map +1 -0
  176. package/dist/internal/rules/rule.d.ts +88 -0
  177. package/dist/internal/rules/rule.d.ts.map +1 -0
  178. package/dist/internal/rules/rule.js +221 -0
  179. package/dist/internal/rules/rule.js.map +1 -0
  180. package/dist/internal/shape/check.d.ts +118 -0
  181. package/dist/internal/shape/check.d.ts.map +1 -0
  182. package/dist/internal/shape/check.js +331 -0
  183. package/dist/internal/shape/check.js.map +1 -0
  184. package/dist/internal/shape/client.d.ts +31 -0
  185. package/dist/internal/shape/client.d.ts.map +1 -0
  186. package/dist/internal/shape/client.js +170 -0
  187. package/dist/internal/shape/client.js.map +1 -0
  188. package/dist/internal/shape/gate.d.ts +33 -0
  189. package/dist/internal/shape/gate.d.ts.map +1 -0
  190. package/dist/internal/shape/gate.js +0 -0
  191. package/dist/internal/shape/gate.js.map +1 -0
  192. package/dist/internal/shape/index.d.ts +27 -0
  193. package/dist/internal/shape/index.d.ts.map +1 -0
  194. package/dist/internal/shape/index.js +23 -0
  195. package/dist/internal/shape/index.js.map +1 -0
  196. package/dist/internal/shape/suggest.d.ts +82 -0
  197. package/dist/internal/shape/suggest.d.ts.map +1 -0
  198. package/dist/internal/shape/suggest.js +374 -0
  199. package/dist/internal/shape/suggest.js.map +1 -0
  200. package/dist/internal/sync/index.d.ts +22 -0
  201. package/dist/internal/sync/index.d.ts.map +1 -0
  202. package/dist/internal/sync/index.js +21 -0
  203. package/dist/internal/sync/index.js.map +1 -0
  204. package/dist/internal/sync/sync.d.ts +95 -0
  205. package/dist/internal/sync/sync.d.ts.map +1 -0
  206. package/dist/internal/sync/sync.js +342 -0
  207. package/dist/internal/sync/sync.js.map +1 -0
  208. package/dist/internal/view/api.d.ts +196 -0
  209. package/dist/internal/view/api.d.ts.map +1 -0
  210. package/dist/internal/view/api.js +189 -0
  211. package/dist/internal/view/api.js.map +1 -0
  212. package/dist/internal/view/index.d.ts +33 -0
  213. package/dist/internal/view/index.d.ts.map +1 -0
  214. package/dist/internal/view/index.js +30 -0
  215. package/dist/internal/view/index.js.map +1 -0
  216. package/dist/internal/view/main.d.ts +11 -0
  217. package/dist/internal/view/main.d.ts.map +1 -0
  218. package/dist/internal/view/main.js +98 -0
  219. package/dist/internal/view/main.js.map +1 -0
  220. package/dist/internal/view/page.d.ts +14 -0
  221. package/dist/internal/view/page.d.ts.map +1 -0
  222. package/dist/internal/view/page.js +370 -0
  223. package/dist/internal/view/page.js.map +1 -0
  224. package/dist/internal/view/report.d.ts +52 -0
  225. package/dist/internal/view/report.d.ts.map +1 -0
  226. package/dist/internal/view/report.js +367 -0
  227. package/dist/internal/view/report.js.map +1 -0
  228. package/dist/internal/view/scope.d.ts +11 -0
  229. package/dist/internal/view/scope.d.ts.map +1 -0
  230. package/dist/internal/view/scope.js +41 -0
  231. package/dist/internal/view/scope.js.map +1 -0
  232. package/dist/internal/view/server.d.ts +35 -0
  233. package/dist/internal/view/server.d.ts.map +1 -0
  234. package/dist/internal/view/server.js +141 -0
  235. package/dist/internal/view/server.js.map +1 -0
  236. package/dist/src/act.d.ts +3 -0
  237. package/dist/src/act.d.ts.map +1 -0
  238. package/dist/src/act.js +3 -0
  239. package/dist/src/act.js.map +1 -0
  240. package/dist/src/automate.d.ts +3 -0
  241. package/dist/src/automate.d.ts.map +1 -0
  242. package/dist/src/automate.js +3 -0
  243. package/dist/src/automate.js.map +1 -0
  244. package/dist/src/cli.d.ts +24 -17
  245. package/dist/src/cli.d.ts.map +1 -1
  246. package/dist/src/cli.js +408 -107
  247. package/dist/src/cli.js.map +1 -1
  248. package/dist/src/commands.d.ts +104 -0
  249. package/dist/src/commands.d.ts.map +1 -0
  250. package/dist/src/commands.js +33 -0
  251. package/dist/src/commands.js.map +1 -0
  252. package/dist/src/connect.d.ts +3 -0
  253. package/dist/src/connect.d.ts.map +1 -0
  254. package/dist/src/connect.js +3 -0
  255. package/dist/src/connect.js.map +1 -0
  256. package/dist/src/dispatch.d.ts +14 -0
  257. package/dist/src/dispatch.d.ts.map +1 -0
  258. package/dist/src/dispatch.js +116 -0
  259. package/dist/src/dispatch.js.map +1 -0
  260. package/dist/src/doctor.d.ts +45 -0
  261. package/dist/src/doctor.d.ts.map +1 -0
  262. package/dist/src/doctor.js +284 -0
  263. package/dist/src/doctor.js.map +1 -0
  264. package/dist/src/eval.d.ts +3 -0
  265. package/dist/src/eval.d.ts.map +1 -0
  266. package/dist/src/eval.js +3 -0
  267. package/dist/src/eval.js.map +1 -0
  268. package/dist/src/index.d.ts +9 -2
  269. package/dist/src/index.d.ts.map +1 -1
  270. package/dist/src/index.js +6 -2
  271. package/dist/src/index.js.map +1 -1
  272. package/dist/src/ingest.d.ts +3 -0
  273. package/dist/src/ingest.d.ts.map +1 -0
  274. package/dist/src/ingest.js +3 -0
  275. package/dist/src/ingest.js.map +1 -0
  276. package/dist/src/loop.d.ts +3 -0
  277. package/dist/src/loop.d.ts.map +1 -0
  278. package/dist/src/loop.js +3 -0
  279. package/dist/src/loop.js.map +1 -0
  280. package/dist/src/main.d.ts +1 -1
  281. package/dist/src/main.d.ts.map +1 -1
  282. package/dist/src/main.js +3 -75
  283. package/dist/src/main.js.map +1 -1
  284. package/dist/src/mcp.d.ts +3 -0
  285. package/dist/src/mcp.d.ts.map +1 -0
  286. package/dist/src/mcp.js +3 -0
  287. package/dist/src/mcp.js.map +1 -0
  288. package/dist/src/rules.d.ts +3 -0
  289. package/dist/src/rules.d.ts.map +1 -0
  290. package/dist/src/rules.js +3 -0
  291. package/dist/src/rules.js.map +1 -0
  292. package/dist/src/shape.d.ts +3 -0
  293. package/dist/src/shape.d.ts.map +1 -0
  294. package/dist/src/shape.js +3 -0
  295. package/dist/src/shape.js.map +1 -0
  296. package/dist/src/sync.d.ts +3 -0
  297. package/dist/src/sync.d.ts.map +1 -0
  298. package/dist/src/sync.js +3 -0
  299. package/dist/src/sync.js.map +1 -0
  300. package/dist/src/view.d.ts +3 -0
  301. package/dist/src/view.d.ts.map +1 -0
  302. package/dist/src/view.js +3 -0
  303. package/dist/src/view.js.map +1 -0
  304. package/package.json +81 -21
  305. package/src/act.ts +2 -0
  306. package/src/automate.ts +2 -0
  307. package/src/cli.ts +416 -102
  308. package/src/commands.ts +48 -0
  309. package/src/connect.ts +2 -0
  310. package/src/dispatch.ts +141 -0
  311. package/src/doctor.ts +370 -0
  312. package/src/eval.ts +2 -0
  313. package/src/index.ts +9 -2
  314. package/src/ingest.ts +2 -0
  315. package/src/loop.ts +2 -0
  316. package/src/main.ts +3 -66
  317. package/src/mcp.ts +2 -0
  318. package/src/rules.ts +2 -0
  319. package/src/shape.ts +2 -0
  320. package/src/sync.ts +2 -0
  321. package/src/view.ts +2 -0
@@ -0,0 +1,298 @@
1
+ /**
2
+ * Action execution (spec §25.2–§25.4) — the governed write path.
3
+ *
4
+ * `act` resolves the named action's current declaration, validates the
5
+ * caller's arguments against its parameters, evaluates the premises over
6
+ * current beliefs with the parameters pre-bound (the §24.2 left-to-right
7
+ * join — a premise with no solution fails the action), and appends the
8
+ * instantiated effects atomically:
9
+ *
10
+ * - effect confidence is the template's own — an action is the caller's
11
+ * assertion; premises are gates, not evidence (no noisy-AND, §25.2);
12
+ * - appended rows are stamped `@src:action/<name>` (§9.5) and linked
13
+ * `BECAUSE` to the premise rows of the justifying solution and `VIA`
14
+ * to the declaration row (§24.3's obligations);
15
+ * - execution is idempotent: an effect equal to its current belief
16
+ * appends nothing;
17
+ * - the §20.3 shape gate runs by default — effects that introduce new
18
+ * `EXPECTS` violations roll the whole execution back (§25.3);
19
+ * - after a commit that changed belief, a named-and-configured hook runs
20
+ * as a shell command — placeholders shell-quoted, appended claims on
21
+ * stdin, failures reported but never rolled back into the store
22
+ * (§25.4).
23
+ */
24
+ import { spawnSync } from 'node:child_process';
25
+ import { Claim, Context, Key } from '@cavelang/core';
26
+ import * as Canonical from '@cavelang/canonical';
27
+ import { Template } from '@cavelang/cli/connect';
28
+ import { match } from '@cavelang/query';
29
+ import { boundTerm, satisfies, specialize } from '@cavelang/cli/rules';
30
+ import { evaluate, violationKey } from '@cavelang/cli/shape';
31
+ import { Row } from '@cavelang/store';
32
+ import * as Action from "./action.js";
33
+ import { currentHook, loadAction } from "./declare.js";
34
+ export const defaultHookTimeoutSeconds = 600;
35
+ const fail = (action, error, rest = {}) => ({ ok: false, action, error, ...rest });
36
+ /**
37
+ * Formats one caller argument as the CAVE term text it binds to —
38
+ * exactly the §23.1 record-field rules (spec §25.2), via
39
+ * `@cavelang/cli/connect`.
40
+ */
41
+ const formatArg = (name, value) => {
42
+ const formatted = Template.formatValue(value, 'payload');
43
+ switch (formatted.kind) {
44
+ case 'ok':
45
+ return { text: formatted.text };
46
+ case 'missing':
47
+ return { problem: `parameter ${name} requires a value` };
48
+ default:
49
+ return { problem: `parameter ${name}: ${formatted.message}` };
50
+ }
51
+ };
52
+ /**
53
+ * Instantiates one effect template under the chosen bindings and pushes
54
+ * it through the ordinary emit → canonicalize pipeline (§13.4), so
55
+ * inverse verbs swap and entities normalize. The claim key is computed
56
+ * on the *stamped* claim — the same claim `insertResult` will key.
57
+ */
58
+ const instantiate = (effect, bindings, registry, subject) => {
59
+ const term = (candidate, position) => candidate.kind === 'entity' && candidate.text.startsWith('?') && candidate.text.length > 1 ?
60
+ boundTerm(bindings[candidate.text.slice(1)], position) :
61
+ candidate;
62
+ let payload = effect.payload;
63
+ if (payload.kind === 'relation') {
64
+ payload = Claim.relation(term(payload.object, 'payload'));
65
+ }
66
+ else if (payload.kind === 'attribute' && payload.value.kind === 'atom' && payload.value.raw.startsWith('?')) {
67
+ payload = Claim.attribute(payload.attribute, Row.parseValue(bindings[payload.value.raw.slice(1)]));
68
+ }
69
+ else if (payload.kind === 'metric' && payload.value.kind === 'atom' && payload.value.raw.startsWith('?')) {
70
+ payload = Claim.metric(Row.parseValue(bindings[payload.value.raw.slice(1)]));
71
+ }
72
+ const draft = Claim.of({
73
+ subject: term(effect.subject, 'subject'),
74
+ verb: effect.verb,
75
+ negated: effect.negated,
76
+ payload,
77
+ contexts: effect.meta.contexts,
78
+ tags: effect.meta.tags,
79
+ importance: effect.meta.importance,
80
+ conf: effect.meta.conf ?? 1,
81
+ ...effect.meta.comment === undefined ? {} : { comment: effect.meta.comment }
82
+ });
83
+ const result = Canonical.canonicalizeText(Canonical.emitClaim(draft), registry);
84
+ const claim = result.claims[0]?.claim;
85
+ if (result.problems.length > 0 || claim === undefined) {
86
+ const detail = result.problems.map(problem => problem.message).join('; ');
87
+ return { problem: `effect ${JSON.stringify(Canonical.emitClaim(draft))} did not canonicalize${detail === '' ? '' : ` — ${detail}`}` };
88
+ }
89
+ // Lifecycle stamp (spec §9.5, §25.2): applied even when the template
90
+ // names its own `src:` — execution attribution is mandatory, so an
91
+ // authored source must not displace it.
92
+ const stamp = Context.source(subject);
93
+ const stamped = claim.contexts.includes(stamp) ?
94
+ claim :
95
+ { ...claim, contexts: [...claim.contexts, stamp] };
96
+ return { instantiated: { claim, key: Key.of(stamped), line: Canonical.emitClaim(claim), registry: result.registry } };
97
+ };
98
+ /** POSIX single-quoting — hook placeholders never splice raw (spec §25.4). */
99
+ export const shellQuote = (value) => `'${value.replaceAll("'", `'\\''`)}'`;
100
+ /**
101
+ * Substitutes `{action}` and `{<param>}` placeholders in one pass —
102
+ * substituted values are never re-scanned, unknown placeholders stay.
103
+ */
104
+ export const substitute = (template, action, args) => template.replace(/\{([A-Za-z][A-Za-z0-9_-]*)\}/g, (whole, name) => name === 'action' ? shellQuote(action) :
105
+ name in args ? shellQuote(String(args[name])) :
106
+ whole);
107
+ const runHook = (name, template, action, args, claims, options) => {
108
+ const command = substitute(template, action.name, args);
109
+ const result = spawnSync(command, {
110
+ shell: true,
111
+ encoding: 'utf8',
112
+ input: `${claims.join('\n')}\n`,
113
+ timeout: (options.hookTimeoutSeconds ?? defaultHookTimeoutSeconds) * 1000,
114
+ ...options.cwd === undefined ? {} : { cwd: options.cwd }
115
+ });
116
+ const output = `${result.stdout ?? ''}${result.stderr ?? ''}`.trim();
117
+ // A hook may exit without reading its stdin (e.g. `true`): the input
118
+ // pipe then reports EPIPE even though the hook ran and exited cleanly,
119
+ // so only non-EPIPE spawn errors fail the hook — the exit status still
120
+ // arrives and is judged as usual.
121
+ const spawnFailure = result.error !== undefined && result.error.code !== 'EPIPE' ?
122
+ result.error.message :
123
+ undefined;
124
+ const error = spawnFailure !== undefined ? spawnFailure :
125
+ result.status !== 0 ? `hook exited with ${result.status ?? `signal ${result.signal}`}` :
126
+ undefined;
127
+ return {
128
+ name,
129
+ fired: true,
130
+ code: result.status,
131
+ ...output === '' ? {} : { output },
132
+ ...error === undefined ? {} : { error }
133
+ };
134
+ };
135
+ const rollback = Symbol('cave-act dry run');
136
+ /** Thrown inside the transaction on gate rejection; never escapes `act`. */
137
+ const rejected = Symbol('cave-act gate rejected');
138
+ const isRejected = (error) => error instanceof Error && rejected in error;
139
+ /**
140
+ * Executes one action (spec §25.2). See the module doc for semantics;
141
+ * `dryRun` computes the same report inside a rolled-back transaction.
142
+ */
143
+ export const act = (store, name, args = {}, options = {}) => {
144
+ const resolved = loadAction(store, name);
145
+ if (resolved === undefined) {
146
+ return fail(name, `no current action ${JSON.stringify(Action.actionSubject(name))} — declare it first (spec §25.1)`);
147
+ }
148
+ if (resolved.loaded === undefined) {
149
+ return fail(name, `the declaration of ${JSON.stringify(Action.actionSubject(name))} does not parse: ${resolved.problems.join('; ')}`);
150
+ }
151
+ const { action, row } = resolved.loaded;
152
+ // Arguments: every parameter supplied, no unknown names (§25.2).
153
+ const unknown = Object.keys(args).filter(key => !action.params.includes(key));
154
+ if (unknown.length > 0) {
155
+ return fail(action.name, `unknown parameter(s) ${unknown.join(', ')} — ${action.name} takes ${action.params.length === 0 ? 'none' : action.params.map(param => `?${param}`).join(', ')}`);
156
+ }
157
+ const bindings = {};
158
+ for (const param of action.params) {
159
+ const { text, problem } = formatArg(param, args[param]);
160
+ if (problem !== undefined) {
161
+ return fail(action.name, problem);
162
+ }
163
+ bindings[param] = text;
164
+ }
165
+ // Premises: the §24.2 join with parameters pre-bound (§25.2).
166
+ let solutions = [{ bindings, rows: [] }];
167
+ for (const premise of action.premises) {
168
+ if (premise.kind === 'constraint') {
169
+ solutions = solutions.filter(solution => satisfies(solution.bindings[premise.variable], premise.op, premise.value));
170
+ }
171
+ else {
172
+ solutions = solutions.flatMap(solution => {
173
+ const pattern = specialize(premise.pattern, solution.bindings);
174
+ if (pattern === undefined) {
175
+ return [];
176
+ }
177
+ return match(store, pattern, { aliases: options.aliases === true }).map(found => ({
178
+ bindings: { ...solution.bindings, ...found.bindings },
179
+ rows: found.row === undefined ? solution.rows : [...solution.rows, found.row]
180
+ }));
181
+ });
182
+ }
183
+ if (solutions.length === 0) {
184
+ return fail(action.name, `precondition failed — no current belief satisfies ${JSON.stringify(premise.text)}`, { failedPremise: premise.text });
185
+ }
186
+ }
187
+ // Premise-bound effect variables must bind uniquely (§25.2).
188
+ const chosen = { ...bindings };
189
+ for (const variable of new Set(action.effects.flatMap(Action.effectVariables))) {
190
+ if (chosen[variable] !== undefined) {
191
+ continue;
192
+ }
193
+ const values = [...new Set(solutions.map(solution => solution.bindings[variable]))];
194
+ if (values.length > 1) {
195
+ return fail(action.name, `ambiguous binding for ?${variable} (${values.join(', ')}) — an action executes once, deterministically (spec §25.2)`);
196
+ }
197
+ chosen[variable] = values[0];
198
+ }
199
+ // Instantiation is a pure read — any problem fails before writing.
200
+ const instantiated = [];
201
+ let effectRegistry = store.registry();
202
+ for (const effect of action.effects) {
203
+ const { instantiated: entry, problem } = instantiate(effect, chosen, effectRegistry, action.subject);
204
+ if (problem !== undefined) {
205
+ return fail(action.name, problem);
206
+ }
207
+ instantiated.push(entry);
208
+ effectRegistry = entry.registry;
209
+ }
210
+ const check = options.check !== false;
211
+ const before = check ? new Set(evaluate(store).violations.map(violationKey)) : undefined;
212
+ const effects = [];
213
+ const changed = [];
214
+ let appended = 0;
215
+ let updated = 0;
216
+ let unchanged = 0;
217
+ const premiseIds = [...new Set(solutions[0].rows.map(premiseRow => premiseRow.id))];
218
+ try {
219
+ store.transaction(() => {
220
+ for (const entry of instantiated) {
221
+ const current = store.currentBelief(entry.key);
222
+ const columns = Row.toColumns(entry.claim);
223
+ if (current !== undefined && Math.abs(current.conf - entry.claim.conf) < 1e-9 &&
224
+ current.value_text === columns.valueText) {
225
+ effects.push({ line: entry.line, outcome: 'unchanged' });
226
+ unchanged += 1;
227
+ continue;
228
+ }
229
+ const inserted = store.insertResult({ claims: [{ claim: entry.claim, line: 0 }], edges: [], registry: entry.registry, problems: [] }, { source: action.subject, lifecycle: true });
230
+ const id = inserted.ids[0];
231
+ store.appendEdges([
232
+ ...premiseIds.map(childId => ({ parentId: id, role: 'BECAUSE', childId })),
233
+ { parentId: id, role: 'VIA', childId: row.id }
234
+ ]);
235
+ if (current === undefined || current.conf === 0) {
236
+ effects.push({ line: entry.line, outcome: 'appended' });
237
+ appended += 1;
238
+ }
239
+ else {
240
+ effects.push({ line: entry.line, outcome: 'updated' });
241
+ updated += 1;
242
+ }
243
+ changed.push(entry.line);
244
+ }
245
+ if (before !== undefined) {
246
+ const fresh = evaluate(store).violations.filter(violation => !before.has(violationKey(violation)));
247
+ if (fresh.length > 0) {
248
+ throw Object.assign(new Error(`shape gate: ${fresh.length} new violation(s)`), { [rejected]: fresh });
249
+ }
250
+ }
251
+ if (options.dryRun === true) {
252
+ throw rollback;
253
+ }
254
+ });
255
+ }
256
+ catch (error) {
257
+ if (isRejected(error)) {
258
+ return fail(action.name, `rejected by the shape gate — ${error[rejected].length} new violation(s), nothing appended (spec §25.3)`, { violations: error[rejected] });
259
+ }
260
+ if (error !== rollback) {
261
+ throw error;
262
+ }
263
+ }
264
+ // The hook runs strictly after commit (§25.4) — dry runs and no-op
265
+ // executions never reach the outside world.
266
+ const hookName = currentHook(store, action.subject);
267
+ let hook;
268
+ if (hookName !== undefined) {
269
+ const template = options.hooks?.[hookName];
270
+ if (options.dryRun === true) {
271
+ hook = { name: hookName, fired: false, note: 'dry run' };
272
+ }
273
+ else if (changed.length === 0) {
274
+ hook = { name: hookName, fired: false, note: 'nothing changed' };
275
+ }
276
+ else if (template === undefined) {
277
+ hook = { name: hookName, fired: false, note: 'not configured' };
278
+ }
279
+ else {
280
+ hook = runHook(hookName, template, action, args, changed, options);
281
+ }
282
+ }
283
+ return {
284
+ ok: true,
285
+ action: action.name,
286
+ subject: action.subject,
287
+ dryRun: options.dryRun === true,
288
+ solutions: solutions.length,
289
+ effects,
290
+ appended,
291
+ updated,
292
+ unchanged,
293
+ ...hook === undefined ? {} : { hook }
294
+ };
295
+ };
296
+ /** Execute an untrusted proposal through the governed action boundary. */
297
+ export const actProposal = (store, proposal, options = {}) => act(store, proposal.action, proposal.parameters, options);
298
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * `@cavelang/cli/act` — action templates (spec §25): named, parameterized
3
+ * governed writes over a CAVE store.
4
+ *
5
+ * ```ts
6
+ * import { act, declareActions } from '@cavelang/cli/act'
7
+ *
8
+ * declareActions(store, 'action/mark-deployed HAS action: ' +
9
+ * '`?service, ?version, ?service IS service => ' +
10
+ * '?service HAS deployed-version: ?version`')
11
+ * act(store, 'mark-deployed', { service: 'api-gateway', version: '1.2.3' })
12
+ * // appends `api-gateway HAS deployed-version: 1.2.3 @src:action/mark-deployed`,
13
+ * // linked BECAUSE to the matched precondition row and VIA to the declaration
14
+ * ```
15
+ *
16
+ * Preconditions are §24.1 premises evaluated against current beliefs with
17
+ * the parameters pre-bound — a premise with no solution fails the action
18
+ * and nothing is appended. Executions are atomic, idempotent, gated on
19
+ * the store's `EXPECTS` declarations by default (§25.3), and may fire an
20
+ * out-of-band, config-declared side-effect hook after commit (§25.4).
21
+ */
22
+ export * as Action from './action.ts';
23
+ export { act, actProposal, defaultHookTimeoutSeconds, shellQuote, substitute } from './engine.ts';
24
+ export type { ActionProposal, ActFailure, ActOptions, ActReport, ActSuccess, EffectOutcome, HookOutcome } from './engine.ts';
25
+ export { currentHook, declareActions, listActions, loadAction, provenanceContext, retractAction } from './declare.ts';
26
+ export type { Declaration, ListedAction, ListedParam, Loaded, Retraction } from './declare.ts';
27
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,yBAAyB,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACjG,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAC5H,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AACrH,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * `@cavelang/cli/act` — action templates (spec §25): named, parameterized
3
+ * governed writes over a CAVE store.
4
+ *
5
+ * ```ts
6
+ * import { act, declareActions } from '@cavelang/cli/act'
7
+ *
8
+ * declareActions(store, 'action/mark-deployed HAS action: ' +
9
+ * '`?service, ?version, ?service IS service => ' +
10
+ * '?service HAS deployed-version: ?version`')
11
+ * act(store, 'mark-deployed', { service: 'api-gateway', version: '1.2.3' })
12
+ * // appends `api-gateway HAS deployed-version: 1.2.3 @src:action/mark-deployed`,
13
+ * // linked BECAUSE to the matched precondition row and VIA to the declaration
14
+ * ```
15
+ *
16
+ * Preconditions are §24.1 premises evaluated against current beliefs with
17
+ * the parameters pre-bound — a premise with no solution fails the action
18
+ * and nothing is appended. Executions are atomic, idempotent, gated on
19
+ * the store's `EXPECTS` declarations by default (§25.3), and may fire an
20
+ * out-of-band, config-declared side-effect hook after commit (§25.4).
21
+ */
22
+ export * as Action from "./action.js";
23
+ export { act, actProposal, defaultHookTimeoutSeconds, shellQuote, substitute } from "./engine.js";
24
+ export { currentHook, declareActions, listActions, loadAction, provenanceContext, retractAction } from "./declare.js";
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,yBAAyB,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAEjG,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Automation parsing (spec §29.1) — the §24.1 rule line pointed at the
3
+ * store's own change feed:
4
+ *
5
+ * ```cave
6
+ * automation/page-on-spike HAS automation: `?svc IS service, ?svc HAS error-rate: ?r, ?r > 0.05 => action/open-incident, hook/page, "error rate reached ?r on ?svc"` ; page and investigate error-rate spikes
7
+ * ```
8
+ *
9
+ * The left side is the **trigger** — §24.1 premises verbatim: CAVE-Q
10
+ * patterns and `?var op value` constraints, at least one pattern. Unlike
11
+ * an action (§25.1) a bare-variable segment is an error — an automation
12
+ * has no caller, so every binding comes from the trigger. The right side
13
+ * is a comma-separated list of **steps**:
14
+ *
15
+ * - `action/<name>` — execute the §25 action, its parameters bound from
16
+ * same-named trigger variables;
17
+ * - `hook/<name>` — fire the out-of-band hook from the §25.4
18
+ * configuration actions use;
19
+ * - a `"…"` or `` `…` `` literal — an agent prompt template, fired
20
+ * through the out-of-band `--agent` shell command (spec §29.3).
21
+ *
22
+ * Like an action, an automation is identified by *name*: the declaration
23
+ * subject is `automation/<name>` and the body evolves as an ordinary
24
+ * belief series under one claim key (§25.1's rule). The body is pure
25
+ * data — patterns, names and prose, never commands (§19.5).
26
+ */
27
+ import { Rule } from '@cavelang/cli/rules';
28
+ /** Attribute of automation declaration claims: `automation/<name> HAS automation: …`. */
29
+ export declare const automationAttribute = "automation";
30
+ /** Subject prefix of automation declarations. */
31
+ export declare const subjectPrefix = "automation/";
32
+ /** Prefix of `action/<name>` steps — the §25 declaration scope. */
33
+ export declare const actionStepPrefix = "action/";
34
+ /** Prefix of `hook/<name>` steps — hooks live out-of-band, the name in-band (§25.4). */
35
+ export declare const hookStepPrefix = "hook/";
36
+ /** Declaration subject of an automation: its name under the `automation/` scope. */
37
+ export declare const automationSubject: (name: string) => string;
38
+ /** Automation name of a declaration subject, `undefined` when out of scope. */
39
+ export declare const automationName: (subject: string) => undefined | string;
40
+ export type Step = {
41
+ readonly kind: 'action';
42
+ readonly name: string;
43
+ readonly text: string;
44
+ } | {
45
+ readonly kind: 'hook';
46
+ readonly name: string;
47
+ readonly text: string;
48
+ } | {
49
+ readonly kind: 'prompt';
50
+ readonly template: string;
51
+ readonly text: string;
52
+ };
53
+ export type Automation = {
54
+ readonly name: string;
55
+ /** Declaration subject, `automation/<name>`. */
56
+ readonly subject: string;
57
+ /** Normalized body text — single-spaced tokens, comment dropped. */
58
+ readonly text: string;
59
+ /** Trigger premises — §24.1 patterns and constraints (spec §29.2). */
60
+ readonly premises: readonly Rule.Premise[];
61
+ /** Steps, in declaration (= execution) order. */
62
+ readonly steps: readonly Step[];
63
+ };
64
+ export type t = Automation;
65
+ export type Parsed = {
66
+ readonly ok: true;
67
+ readonly automation: Automation;
68
+ } | {
69
+ readonly ok: false;
70
+ readonly problems: readonly string[];
71
+ };
72
+ /**
73
+ * Parses one automation body. Problems are returned, never thrown — a
74
+ * stored declaration that fails to parse is reported and skipped,
75
+ * mirroring rules (§24.1) and actions (§25.1).
76
+ */
77
+ export declare const parse: (subject: string, body: string) => Parsed;
78
+ //# sourceMappingURL=automation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"automation.d.ts","sourceRoot":"","sources":["../../src/automation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAGH,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAEtC,yFAAyF;AACzF,eAAO,MAAM,mBAAmB,eAAe,CAAA;AAE/C,iDAAiD;AACjD,eAAO,MAAM,aAAa,gBAAgB,CAAA;AAE1C,mEAAmE;AACnE,eAAO,MAAM,gBAAgB,YAAY,CAAA;AAEzC,wFAAwF;AACxF,eAAO,MAAM,cAAc,UAAU,CAAA;AAErC,oFAAoF;AACpF,eAAO,MAAM,iBAAiB,GAAI,MAAM,MAAM,KAAG,MACkB,CAAA;AAEnE,+EAA+E;AAC/E,eAAO,MAAM,cAAc,GAAI,SAAS,MAAM,KAAG,SAAS,GAAG,MAGhD,CAAA;AAEb,MAAM,MAAM,IAAI,GACZ;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzE;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACvE;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAEjF,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,gDAAgD;IAChD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,oEAAoE;IACpE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,sEAAsE;IACtE,QAAQ,CAAC,QAAQ,EAAE,SAAS,IAAI,CAAC,OAAO,EAAE,CAAA;IAC1C,iDAAiD;IACjD,QAAQ,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,CAAA;CAChC,CAAA;AAED,MAAM,MAAM,CAAC,GAAG,UAAU,CAAA;AAE1B,MAAM,MAAM,MAAM,GACd;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAA;CAAE,GACtD;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAA;AAsChE;;;;GAIG;AACH,eAAO,MAAM,KAAK,GAAI,SAAS,MAAM,EAAE,MAAM,MAAM,KAAG,MAyDrD,CAAA"}
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Automation parsing (spec §29.1) — the §24.1 rule line pointed at the
3
+ * store's own change feed:
4
+ *
5
+ * ```cave
6
+ * automation/page-on-spike HAS automation: `?svc IS service, ?svc HAS error-rate: ?r, ?r > 0.05 => action/open-incident, hook/page, "error rate reached ?r on ?svc"` ; page and investigate error-rate spikes
7
+ * ```
8
+ *
9
+ * The left side is the **trigger** — §24.1 premises verbatim: CAVE-Q
10
+ * patterns and `?var op value` constraints, at least one pattern. Unlike
11
+ * an action (§25.1) a bare-variable segment is an error — an automation
12
+ * has no caller, so every binding comes from the trigger. The right side
13
+ * is a comma-separated list of **steps**:
14
+ *
15
+ * - `action/<name>` — execute the §25 action, its parameters bound from
16
+ * same-named trigger variables;
17
+ * - `hook/<name>` — fire the out-of-band hook from the §25.4
18
+ * configuration actions use;
19
+ * - a `"…"` or `` `…` `` literal — an agent prompt template, fired
20
+ * through the out-of-band `--agent` shell command (spec §29.3).
21
+ *
22
+ * Like an action, an automation is identified by *name*: the declaration
23
+ * subject is `automation/<name>` and the body evolves as an ordinary
24
+ * belief series under one claim key (§25.1's rule). The body is pure
25
+ * data — patterns, names and prose, never commands (§19.5).
26
+ */
27
+ import { Token } from '@cavelang/parser';
28
+ import { Rule } from '@cavelang/cli/rules';
29
+ /** Attribute of automation declaration claims: `automation/<name> HAS automation: …`. */
30
+ export const automationAttribute = 'automation';
31
+ /** Subject prefix of automation declarations. */
32
+ export const subjectPrefix = 'automation/';
33
+ /** Prefix of `action/<name>` steps — the §25 declaration scope. */
34
+ export const actionStepPrefix = 'action/';
35
+ /** Prefix of `hook/<name>` steps — hooks live out-of-band, the name in-band (§25.4). */
36
+ export const hookStepPrefix = 'hook/';
37
+ /** Declaration subject of an automation: its name under the `automation/` scope. */
38
+ export const automationSubject = (name) => name.startsWith(subjectPrefix) ? name : `${subjectPrefix}${name}`;
39
+ /** Automation name of a declaration subject, `undefined` when out of scope. */
40
+ export const automationName = (subject) => subject.startsWith(subjectPrefix) && subject.length > subjectPrefix.length ?
41
+ subject.slice(subjectPrefix.length) :
42
+ undefined;
43
+ const isVariableToken = (token) => token.kind === 'word' && token.text.startsWith('?') && token.text.length > 1;
44
+ /** Splits `text` at its top-level commas — literal-protected, like §24.1. */
45
+ const splitSegments = (text) => {
46
+ const segments = [];
47
+ let cursor = 0;
48
+ for (const at of Rule.topLevel(text, ',')) {
49
+ segments.push(text.slice(cursor, at));
50
+ cursor = at + 1;
51
+ }
52
+ segments.push(text.slice(cursor));
53
+ return segments;
54
+ };
55
+ const parseStep = (segment) => {
56
+ const text = Rule.normalizeSegment(segment);
57
+ if (text === '') {
58
+ return { problem: 'empty step — remove the extra comma' };
59
+ }
60
+ const tokens = Token.tokenize(segment);
61
+ if (tokens.length === 1) {
62
+ const token = tokens[0];
63
+ if (token.kind === 'text' || token.kind === 'code') {
64
+ return { step: { kind: 'prompt', template: token.text, text } };
65
+ }
66
+ if (token.kind === 'word' && token.text.startsWith(actionStepPrefix) && token.text.length > actionStepPrefix.length) {
67
+ return { step: { kind: 'action', name: token.text.slice(actionStepPrefix.length), text } };
68
+ }
69
+ if (token.kind === 'word' && token.text.startsWith(hookStepPrefix) && token.text.length > hookStepPrefix.length) {
70
+ return { step: { kind: 'hook', name: token.text.slice(hookStepPrefix.length), text } };
71
+ }
72
+ }
73
+ return { problem: `step ${JSON.stringify(text)} is not action/<name>, hook/<name> or a prompt literal (spec §29.1)` };
74
+ };
75
+ /**
76
+ * Parses one automation body. Problems are returned, never thrown — a
77
+ * stored declaration that fails to parse is reported and skipped,
78
+ * mirroring rules (§24.1) and actions (§25.1).
79
+ */
80
+ export const parse = (subject, body) => {
81
+ const problems = [];
82
+ const name = automationName(subject);
83
+ if (name === undefined) {
84
+ return { ok: false, problems: [`declaration subject ${JSON.stringify(subject)} is not under ${subjectPrefix} (spec §29.1)`] };
85
+ }
86
+ const { head } = Token.splitComment(body);
87
+ const arrows = Rule.topLevel(head, '=>');
88
+ if (arrows.length === 0) {
89
+ return { ok: false, problems: ['not an automation — no top-level "=>" (spec §29.1)'] };
90
+ }
91
+ if (arrows.length > 1) {
92
+ return { ok: false, problems: ['an automation has exactly one "=>" (spec §29.1)'] };
93
+ }
94
+ const leftText = head.slice(0, arrows[0]);
95
+ const rightText = head.slice(arrows[0] + 2);
96
+ const premises = [];
97
+ const bound = new Set();
98
+ for (const segment of splitSegments(leftText)) {
99
+ const tokens = Token.tokenize(segment);
100
+ if (tokens.length === 1 && isVariableToken(tokens[0])) {
101
+ problems.push(`bare ${tokens[0].text} — an automation has no caller, so it takes no parameters; bind variables in trigger patterns (spec §29.1)`);
102
+ continue;
103
+ }
104
+ const { premise, problem } = Rule.parsePremise(segment, bound);
105
+ if (problem !== undefined) {
106
+ problems.push(problem);
107
+ continue;
108
+ }
109
+ premises.push(premise);
110
+ if (premise.kind === 'pattern') {
111
+ Rule.patternVariables(premise.pattern).forEach(variable => bound.add(variable));
112
+ }
113
+ }
114
+ if (!premises.some(premise => premise.kind === 'pattern')) {
115
+ problems.push('an automation needs at least one pattern premise — the trigger (spec §29.1)');
116
+ }
117
+ const steps = [];
118
+ for (const segment of splitSegments(rightText)) {
119
+ const { step, problem } = parseStep(segment);
120
+ if (problem !== undefined) {
121
+ problems.push(problem);
122
+ continue;
123
+ }
124
+ steps.push(step);
125
+ }
126
+ if (steps.length === 0 && problems.length === 0) {
127
+ problems.push('an automation needs at least one step (spec §29.1)');
128
+ }
129
+ if (problems.length > 0) {
130
+ return { ok: false, problems };
131
+ }
132
+ const text = `${premises.map(premise => premise.text).join(', ')} => ${steps.map(step => step.text).join(', ')}`;
133
+ return { ok: true, automation: { name, subject, text, premises, steps } };
134
+ };
135
+ //# sourceMappingURL=automation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"automation.js","sourceRoot":"","sources":["../../src/automation.ts"],"names":[],"mappings":"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"}