@cavelang/cli 0.27.14 → 0.29.1

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
+ * `cave automate` entry (spec §29.5) — argument parsing, the declare /
3
+ * list / retract lifecycle, one settle cycle under `--once`, and the
4
+ * long-running loop: a cheap `MAX(tx)` poll, a cycle whenever it moves.
5
+ */
6
+ import { readFileSync } from 'node:fs';
7
+ import { parseArgs } from 'node:util';
8
+ import { Registry } from '@cavelang/canonical';
9
+ import { shellComplete } from '@cavelang/cli/loop';
10
+ import { defaultDbPath, open } from '@cavelang/store';
11
+ import { declareAutomations, listAutomations, retractAutomation } from "./declare.js";
12
+ import { defaultAgentTimeoutSeconds, defaultMaxPasses, settle, settled } from "./engine.js";
13
+ const usage = `cave automate — the event-driven loop (spec §29)
14
+
15
+ Usage:
16
+ cave automate [--db <path>] [options] watch the store; settle on change
17
+ cave automate [--db <path>] --once [--json] one settle cycle, then exit
18
+ cave automate [--db <path>] --declare [file...]
19
+ cave automate [--db <path>] --list [--json]
20
+ cave automate [--db <path>] --retract <name>
21
+
22
+ Options:
23
+ --db <path> database file (default: $CAVE_DB, or cave.db)
24
+ --once run one settle cycle and exit — cron replaces the
25
+ daemon; the exit code carries step failures
26
+ --interval <s> poll interval in seconds (default 2)
27
+ --declare declare the automations of CAVE documents (stdin
28
+ when no file); other lines are prelude
29
+ --list print the store's current automations and exit
30
+ --retract <n> retract an automation's declaration and exit
31
+ --hooks <file> JSON file of out-of-band hook command templates,
32
+ name → shell template (spec §25.4), shared with
33
+ action steps; default: $CAVE_HOOKS
34
+ --agent <template> shell agent for prompt steps — the cave ingest/eval
35
+ contract: prompt on stdin and {prompt-file}
36
+ (substituted shell-quoted), CAVE reply on stdout
37
+ (appended, spec §29.3)
38
+ --timeout <seconds> per-prompt agent timeout (default ${defaultAgentTimeoutSeconds})
39
+ --aliases triggers match through the alias closure (spec §13.6)
40
+ --no-derive do not fire the store's rules each pass (spec §29.4)
41
+ --no-check skip the shape gate on action steps (spec §25.3)
42
+ --max-passes <n> settle guard per cycle (default ${defaultMaxPasses})
43
+ --json with --once/--list: emit the report as JSON
44
+ --no-prelude open the store without the standard verb registry
45
+
46
+ An automation pairs a trigger with steps, declared in-band (spec §29.1):
47
+
48
+ automation/page-on-spike HAS automation: \`?svc IS service,
49
+ ?svc HAS error-rate: ?r, ?r > 0.05 =>
50
+ action/open-incident, hook/page, "investigate the spike on ?svc"\`
51
+
52
+ New claims matching the trigger fire the steps — a §25 action (parameters
53
+ bound from same-named trigger variables), an out-of-band hook (trigger
54
+ claims on stdin), or an agent prompt whose CAVE reply is recorded. Rules
55
+ (spec §24) fire incrementally each pass. An automation is armed at its
56
+ declaration and never wakes itself; chains across automations converge
57
+ because every write path is idempotent.
58
+
59
+ Examples:
60
+ cave automate --db k.db --declare automations.cave
61
+ cave automate --db k.db --once
62
+ cave automate --db k.db --hooks hooks.json --agent 'claude -p'
63
+ cave automate --db k.db --once --json | jq '.automations'`;
64
+ const waitForAbort = (signal) => signal?.aborted === true ? Promise.resolve() : new Promise(resolve => signal?.addEventListener('abort', () => resolve(), { once: true }));
65
+ /** Loads a §25.4 hooks configuration file: name → shell command template. */
66
+ const readHooks = (path) => {
67
+ const parsed = JSON.parse(readFileSync(path, 'utf8'));
68
+ if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed) ||
69
+ Object.values(parsed).some(value => typeof value !== 'string')) {
70
+ throw new Error(`${path}: hooks must be a JSON object of name → shell template strings`);
71
+ }
72
+ return parsed;
73
+ };
74
+ const readInput = async (files, input) => {
75
+ if (files.length > 0 && !(files.length === 1 && files[0] === '-')) {
76
+ return files.map(file => readFileSync(file, 'utf8')).join('\n');
77
+ }
78
+ let text = '';
79
+ for await (const chunk of input) {
80
+ text += String(chunk);
81
+ }
82
+ return text;
83
+ };
84
+ /** Text rendering of one cycle — only what fired, plus problems and notes. */
85
+ const renderReport = (report) => {
86
+ const lines = [];
87
+ for (const problem of report.problems) {
88
+ lines.push(`${problem.subject}: ${problem.problems.join('; ')}`);
89
+ }
90
+ for (const automation of report.automations) {
91
+ if (automation.fired === 0) {
92
+ continue;
93
+ }
94
+ lines.push(`${automation.subject}: fired ${automation.fired} solution(s)` +
95
+ (automation.description === undefined ? '' : ` ; ${automation.description}`));
96
+ for (const firing of automation.firings) {
97
+ const bindings = Object.entries(firing.bindings)
98
+ .map(([name, value]) => `?${name} = ${value}`)
99
+ .join(' ');
100
+ if (bindings !== '') {
101
+ lines.push(` ${bindings}`);
102
+ }
103
+ for (const step of firing.steps) {
104
+ lines.push(` ${step.step}: ${step.outcome}${step.detail === undefined ? '' : ` (${step.detail})`}`);
105
+ }
106
+ }
107
+ }
108
+ lines.push(...report.notes.map(note => `note: ${note}`));
109
+ const fired = report.automations.reduce((sum, automation) => sum + automation.fired, 0);
110
+ const derived = report.derive === undefined ?
111
+ '' :
112
+ `; derived +${report.derive.appended} appended, ${report.derive.updated} updated, ${report.derive.retracted} retracted`;
113
+ lines.push(`settled: ${fired} firing(s) over ${report.passes} pass(es)${derived}`);
114
+ return lines;
115
+ };
116
+ const settleOptions = (values) => {
117
+ const hooksPath = values.hooks ?? process.env['CAVE_HOOKS'];
118
+ const timeoutSeconds = values.timeout === undefined ? defaultAgentTimeoutSeconds : Number(values.timeout);
119
+ return {
120
+ aliases: values.aliases === true,
121
+ derive: values['no-derive'] !== true,
122
+ check: values['no-check'] !== true,
123
+ ...values['max-passes'] === undefined ? {} : { maxPasses: Number(values['max-passes']) },
124
+ ...hooksPath === undefined ? {} : { hooks: readHooks(hooksPath) },
125
+ ...values.agent === undefined ? {} : { complete: shellComplete(values.agent, { timeoutSeconds }) }
126
+ };
127
+ };
128
+ const maxTxOf = (store) => store.db.prepare('SELECT MAX(tx) AS t FROM cave_claim').get().t;
129
+ /**
130
+ * One watch cycle (spec §29.5): settle, report, and return the tx
131
+ * boundary the poll may treat as seen. The boundary is captured *before*
132
+ * each settle, and the cycle re-settles until `MAX(tx)` is unchanged
133
+ * across one — a write landing while a settle runs (or while its report
134
+ * renders) re-enters the loop instead of being marked seen unprocessed
135
+ * (BUGS.md watch-watermark-race). Settle's own appends move `MAX(tx)`
136
+ * too, so a cycle that fired ends with one confirming settle; quiescent
137
+ * write paths (§29.4) are what make the loop terminate.
138
+ */
139
+ export const watchCycle = async (store, options, onReport) => {
140
+ for (;;) {
141
+ const boundary = maxTxOf(store);
142
+ onReport(await settle(store, options));
143
+ if (maxTxOf(store) === boundary) {
144
+ return boundary;
145
+ }
146
+ }
147
+ };
148
+ /** The daemon (spec §29.5): settle at startup, then settle when MAX(tx) moves. */
149
+ const runWatch = async (store, options, intervalSeconds, io) => {
150
+ let seen = null;
151
+ let running = false;
152
+ const onReport = (report) => {
153
+ const fired = report.automations.some(automation => automation.fired > 0);
154
+ if (fired || report.problems.length > 0 || report.notes.length > 0) {
155
+ io.stdout.write(`${renderReport(report).join('\n')}\n`);
156
+ }
157
+ };
158
+ const cycle = async () => {
159
+ running = true;
160
+ try {
161
+ seen = await watchCycle(store, options, onReport);
162
+ }
163
+ catch (error) {
164
+ io.stderr.write(`cave automate: ${error instanceof Error ? error.message : String(error)}\n`);
165
+ // `seen` stays put: the next tick retries the pending events —
166
+ // settling is idempotent (§29.3) — instead of stalling them
167
+ // behind an unrelated later append.
168
+ }
169
+ running = false;
170
+ };
171
+ let active = cycle();
172
+ await active;
173
+ io.stdout.write(`watching (poll every ${intervalSeconds}s, ctrl-c to stop)\n`);
174
+ const timer = setInterval(() => {
175
+ if (!running && maxTxOf(store) !== seen) {
176
+ active = cycle();
177
+ void active;
178
+ }
179
+ }, intervalSeconds * 1000);
180
+ await waitForAbort(io.signal);
181
+ clearInterval(timer);
182
+ await active;
183
+ return 0;
184
+ };
185
+ export const runAutomate = async (argv, context = {}) => {
186
+ const io = {
187
+ stdin: context.stdin ?? process.stdin,
188
+ stdout: context.stdout ?? process.stdout,
189
+ stderr: context.stderr ?? process.stderr,
190
+ ...context.signal === undefined ? {} : { signal: context.signal }
191
+ };
192
+ const { values, positionals } = parseArgs({
193
+ args: [...argv],
194
+ options: {
195
+ db: { type: 'string' },
196
+ once: { type: 'boolean' },
197
+ interval: { type: 'string' },
198
+ declare: { type: 'boolean' },
199
+ list: { type: 'boolean' },
200
+ retract: { type: 'string' },
201
+ hooks: { type: 'string' },
202
+ agent: { type: 'string' },
203
+ timeout: { type: 'string' },
204
+ aliases: { type: 'boolean' },
205
+ 'no-derive': { type: 'boolean' },
206
+ 'no-check': { type: 'boolean' },
207
+ 'max-passes': { type: 'string' },
208
+ json: { type: 'boolean' },
209
+ 'no-prelude': { type: 'boolean' },
210
+ help: { type: 'boolean', short: 'h' }
211
+ },
212
+ allowPositionals: true
213
+ });
214
+ if (values.help === true) {
215
+ io.stdout.write(`${usage}\n`);
216
+ return 0;
217
+ }
218
+ const intervalSeconds = values.interval === undefined ? 2 : Number(values.interval);
219
+ if (!Number.isFinite(intervalSeconds) || intervalSeconds <= 0) {
220
+ io.stderr.write(`cave automate: --interval must be a positive number of seconds, got '${values.interval}'\n`);
221
+ return 1;
222
+ }
223
+ const maxPasses = values['max-passes'] === undefined ? undefined : Number(values['max-passes']);
224
+ if (maxPasses !== undefined && (!Number.isInteger(maxPasses) || maxPasses < 1)) {
225
+ io.stderr.write(`cave automate: --max-passes expects a positive integer, got '${values['max-passes']}'\n`);
226
+ return 1;
227
+ }
228
+ const timeoutSeconds = values.timeout === undefined ? undefined : Number(values.timeout);
229
+ if (timeoutSeconds !== undefined && (!Number.isFinite(timeoutSeconds) || timeoutSeconds <= 0)) {
230
+ io.stderr.write(`cave automate: --timeout must be a positive number of seconds, got '${values.timeout}'\n`);
231
+ return 1;
232
+ }
233
+ const store = open(values.db ?? defaultDbPath(), values['no-prelude'] === true ? { registry: Registry.empty } : {});
234
+ try {
235
+ if (values.declare === true) {
236
+ const declaration = declareAutomations(store, await readInput(positionals, io.stdin));
237
+ for (const problem of declaration.problems) {
238
+ io.stderr.write(`line ${problem.line}: ${problem.message}\n`);
239
+ }
240
+ io.stdout.write(`declared ${declaration.declared} automation(s)` +
241
+ (declaration.unchanged > 0 ? `, ${declaration.unchanged} unchanged` : '') +
242
+ (declaration.prelude > 0 ? `, +${declaration.prelude} prelude claim(s)` : '') + '\n');
243
+ return declaration.problems.length > 0 ? 1 : 0;
244
+ }
245
+ if (values.list === true) {
246
+ const automations = listAutomations(store);
247
+ if (values.json === true) {
248
+ io.stdout.write(`${JSON.stringify(automations, undefined, 2)}\n`);
249
+ return 0;
250
+ }
251
+ if (automations.length === 0) {
252
+ io.stdout.write('no automations\n');
253
+ return 0;
254
+ }
255
+ for (const automation of automations) {
256
+ io.stdout.write(`${automation.subject} \`${automation.text}\`` +
257
+ `${automation.description === undefined ? '' : ` ; ${automation.description}`}\n`);
258
+ if (!automation.ok) {
259
+ io.stdout.write(` problems: ${automation.problems.join('; ')}\n`);
260
+ }
261
+ }
262
+ return 0;
263
+ }
264
+ if (values.retract !== undefined) {
265
+ const outcome = retractAutomation(store, values.retract);
266
+ if (!outcome.ok) {
267
+ io.stderr.write(`cave automate: ${outcome.error}\n`);
268
+ return 1;
269
+ }
270
+ io.stdout.write(`retracted ${outcome.subject} — what past firings recorded stays recorded (spec §29.1)\n`);
271
+ return 0;
272
+ }
273
+ if (positionals.length > 0) {
274
+ io.stderr.write(`cave automate: unexpected argument ${JSON.stringify(positionals[0])} — files go with --declare\n`);
275
+ return 1;
276
+ }
277
+ const options = settleOptions(values);
278
+ if (values.once === true) {
279
+ const report = await settle(store, options);
280
+ if (values.json === true) {
281
+ io.stdout.write(`${JSON.stringify(report, undefined, 2)}\n`);
282
+ }
283
+ else {
284
+ io.stdout.write(`${renderReport(report).join('\n')}\n`);
285
+ }
286
+ return settled(report) ? 0 : 1;
287
+ }
288
+ return await runWatch(store, options, intervalSeconds, io);
289
+ }
290
+ catch (error) {
291
+ io.stderr.write(`cave automate: ${error instanceof Error ? error.message : String(error)}\n`);
292
+ return 1;
293
+ }
294
+ finally {
295
+ store.close();
296
+ }
297
+ };
298
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/main.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * `@cavelang/cli/connect` — deterministic structured ingestion (spec §23).
3
+ *
4
+ * ```sh
5
+ * cave connect people.csv --map people.map.cave --db k.db --key id
6
+ * ```
7
+ *
8
+ * Library API:
9
+ *
10
+ * ```ts
11
+ * import { Source, Template, connect } from '@cavelang/cli/connect'
12
+ * import { open } from '@cavelang/store'
13
+ *
14
+ * const store = open('k.db')
15
+ * const { mapping } = Template.parse(mappingText)
16
+ * const { records } = await Source.load('people.csv')
17
+ * const report = connect(store, mapping!, records, { name: 'people', key: 'id' })
18
+ * ```
19
+ */
20
+ export * as Source from './source.ts';
21
+ export * as Template from './template.ts';
22
+ export { connect, digestAttribute, digestOf, federatedQuery, isConnected, provenanceContext } from './run.ts';
23
+ export type { ConnectOptions, Failure, FederatedOutcome, Report } from './run.ts';
24
+ export { runConnect } from './main.ts';
25
+ export type { RunContext as ConnectRunContext, ScheduleLike, WatchLike } from './main.ts';
26
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA;AACzC,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,cAAc,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAC7G,YAAY,EAAE,cAAc,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACtC,YAAY,EAAE,UAAU,IAAI,iBAAiB,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * `@cavelang/cli/connect` — deterministic structured ingestion (spec §23).
3
+ *
4
+ * ```sh
5
+ * cave connect people.csv --map people.map.cave --db k.db --key id
6
+ * ```
7
+ *
8
+ * Library API:
9
+ *
10
+ * ```ts
11
+ * import { Source, Template, connect } from '@cavelang/cli/connect'
12
+ * import { open } from '@cavelang/store'
13
+ *
14
+ * const store = open('k.db')
15
+ * const { mapping } = Template.parse(mappingText)
16
+ * const { records } = await Source.load('people.csv')
17
+ * const report = connect(store, mapping!, records, { name: 'people', key: 'id' })
18
+ * ```
19
+ */
20
+ export * as Source from "./source.js";
21
+ export * as Template from "./template.js";
22
+ export { connect, digestAttribute, digestOf, federatedQuery, isConnected, provenanceContext } from "./run.js";
23
+ export { runConnect } from "./main.js";
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA;AACzC,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,cAAc,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAE7G,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * `cave connect` entry — argument parsing, pass orchestration (single,
3
+ * `--watch`, `--query`), and report rendering around `run.ts`.
4
+ */
5
+ import * as Source from './source.ts';
6
+ export type RunContext = {
7
+ readonly stdout?: NodeJS.WritableStream;
8
+ readonly stderr?: NodeJS.WritableStream;
9
+ readonly signal?: AbortSignal;
10
+ /** URL transport injection for deterministic integrations. */
11
+ readonly fetchImpl?: Source.FetchLike;
12
+ /** Directory-watcher injection; production uses `node:fs.watch`. */
13
+ readonly watch?: WatchLike;
14
+ /** Debounce scheduler injection; production waits 200ms. */
15
+ readonly schedule?: ScheduleLike;
16
+ readonly cancelScheduled?: (handle: unknown) => void;
17
+ };
18
+ export type WatchLike = (path: string, listener: (event: string, filename: string | Buffer | null) => void) => {
19
+ close(): void;
20
+ };
21
+ export type ScheduleLike = (callback: () => Promise<void>, delayMs: number) => unknown;
22
+ export declare const runConnect: (argv: readonly string[], context?: RunContext) => Promise<number>;
23
+ //# sourceMappingURL=main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/main.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AAuErC,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAA;IACvC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAA;IACvC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;IAC7B,8DAA8D;IAC9D,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,SAAS,CAAA;IACrC,oEAAoE;IACpE,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAA;IAC1B,4DAA4D;IAC5D,QAAQ,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAA;IAChC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAA;CACrD,CAAA;AAED,MAAM,MAAM,SAAS,GAAG,CACtB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,KAAK,IAAI,KAChE;IAAE,KAAK,IAAI,IAAI,CAAA;CAAE,CAAA;AAEtB,MAAM,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAA;AAyOtF,eAAO,MAAM,UAAU,GAAU,MAAM,SAAS,MAAM,EAAE,EAAE,UAAS,UAAe,KAAG,OAAO,CAAC,MAAM,CA6ElG,CAAA"}