@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,367 @@
1
+ /**
2
+ * `cave report` (spec §31) — templated markdown rendered from CAVE-Q
3
+ * results, claim keys as citations.
4
+ *
5
+ * A template is an ordinary markdown document with two live constructs:
6
+ *
7
+ * - a fenced ```cave-q block — first line a CAVE-Q pattern (§12.1),
8
+ * following `WHERE` lines its filters (§12.2), the rest a markdown
9
+ * fragment rendered once per solution with `?var` bindings
10
+ * substituted (no fragment: the solution as `cave query` prints it,
11
+ * as a cited bullet);
12
+ * - an inline `` `cave-q: <pattern>` `` splice — a code span of any
13
+ * delimiter length (```` ``cave-q: …`` ```` when the pattern carries a
14
+ * backtick code literal), exactly one variable, exactly one solution,
15
+ * replaced by the bound value; anything else is a problem (§25.2's
16
+ * determinism, and `--resolve` is the knob when sources contest the
17
+ * fact, §26).
18
+ *
19
+ * Every solution that matched a stored row cites it: `[^cN]` footnote
20
+ * markers land at the fragment's `[^?]` placeholder (appended when
21
+ * absent), and the definitions — the row's canonical line, tx date and
22
+ * claim key (§9.2) — collect at the end of the document, one per row.
23
+ * Everything else in the template passes through verbatim, other fenced
24
+ * blocks included.
25
+ */
26
+ import { SourceSpan, Uuidv7 } from '@cavelang/core';
27
+ import { emitClaim } from '@cavelang/canonical';
28
+ import { Pattern, query } from '@cavelang/query';
29
+ import { Row } from '@cavelang/store';
30
+ import { Sensitivity } from '@cavelang/store';
31
+ import { withScopedStore } from "./scope.js";
32
+ /** The fragment's citation placeholder — replaced by the `[^cN]` marker. */
33
+ const placeholder = '[^?]';
34
+ /**
35
+ * The in-document marker for a block or splice whose query never ran —
36
+ * §31.3's contract: the document still emits, problems marked in place.
37
+ */
38
+ const invalidQuery = '*(invalid query)*';
39
+ const escapeRegExp = (text) => text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
40
+ /**
41
+ * Wraps store text as a Markdown code span that survives its own
42
+ * backticks: the delimiter outruns the longest run inside by one, and a
43
+ * space pads content that begins or ends with a backtick (CommonMark
44
+ * strips the pair back out).
45
+ */
46
+ const toCodeSpan = (text) => {
47
+ const longest = Math.max(0, ...[...text.matchAll(/`+/g)].map(run => run[0].length));
48
+ const delimiter = '`'.repeat(longest + 1);
49
+ const pad = text.startsWith('`') || text.endsWith('`') ? ' ' : '';
50
+ return `${delimiter}${pad}${text}${pad}${delimiter}`;
51
+ };
52
+ const sourceLink = (reference) => reference.href === undefined ?
53
+ toCodeSpan(reference.location) :
54
+ `[${reference.location.replaceAll('[', '\\[').replaceAll(']', '\\]')}](<${reference.href.replaceAll('>', '%3E')}>)`;
55
+ /**
56
+ * Substitutes `?var` occurrences with bindings, longest names first so
57
+ * `?who` never clips `?who2`; a token no binding matches passes through
58
+ * untouched (fragments are prose — the §29.3 convention).
59
+ */
60
+ const substitute = (fragment, bindings) => {
61
+ let text = fragment;
62
+ for (const name of Object.keys(bindings).sort((a, b) => b.length - a.length)) {
63
+ text = text.replace(new RegExp(`\\?${escapeRegExp(name)}(?![A-Za-z0-9_-])`, 'g'), () => bindings[name]);
64
+ }
65
+ return text;
66
+ };
67
+ /** Distinct `?var` names of a parsed pattern, in slot order. */
68
+ const variablesOf = (pattern) => {
69
+ const names = [];
70
+ const add = (slot) => {
71
+ if (slot.kind === 'var' && slot.name !== undefined && !names.includes(slot.name)) {
72
+ names.push(slot.name);
73
+ }
74
+ };
75
+ add(pattern.subject);
76
+ add(pattern.verb);
77
+ if (pattern.payload.kind === 'object') {
78
+ add(pattern.payload.object);
79
+ }
80
+ else if (pattern.payload.kind === 'attribute') {
81
+ add(pattern.payload.value);
82
+ }
83
+ return names;
84
+ };
85
+ /** Fence line: ``` or ~~~ (3+, up to 3 leading spaces) plus an info string. */
86
+ const fenceRe = /^ {0,3}(`{3,}|~{3,})(.*)$/;
87
+ const closesFence = (line, fence) => {
88
+ const match = fenceRe.exec(line);
89
+ return match !== null &&
90
+ match[1][0] === fence[0] && match[1].length >= fence.length && match[2].trim() === '';
91
+ };
92
+ /**
93
+ * One query block (spec §31.1): pattern, `WHERE` filters, fragment.
94
+ * Renders one fragment instance per solution — the default fragment is
95
+ * the solution as `cave query` prints it, as a cited bullet.
96
+ */
97
+ const renderBlock = (blockLines, startLine, renderer) => {
98
+ const lines = [...blockLines];
99
+ while (lines.length > 0 && lines[0].trim() === '') {
100
+ lines.shift();
101
+ startLine += 1;
102
+ }
103
+ if (lines.length === 0) {
104
+ renderer.problem(startLine, 'empty cave-q block — a CAVE-Q pattern is required (spec §31.1)');
105
+ return [invalidQuery];
106
+ }
107
+ const queryLines = [lines[0]];
108
+ let at = 1;
109
+ while (at < lines.length && lines[at].trim().startsWith('WHERE ')) {
110
+ queryLines.push(lines[at]);
111
+ at += 1;
112
+ }
113
+ const fragmentLines = lines.slice(at);
114
+ while (fragmentLines.length > 0 && fragmentLines[0].trim() === '') {
115
+ fragmentLines.shift();
116
+ }
117
+ const fragment = fragmentLines.some(line => line.trim() !== '') ? fragmentLines.join('\n') : undefined;
118
+ const matches = renderer.run(queryLines.join('\n'), startLine);
119
+ if (matches === undefined) {
120
+ return [invalidQuery];
121
+ }
122
+ const out = [];
123
+ for (const match of matches) {
124
+ let instance;
125
+ if (fragment === undefined) {
126
+ const bindings = Object.entries(match.bindings)
127
+ .map(([name, value]) => `?${name} = ${value}`)
128
+ .join(' ');
129
+ // A fully bound pattern has nothing to bind — the claim itself is
130
+ // the point (mirroring `cave query`'s rendering).
131
+ instance = `- ${bindings !== '' ? bindings : toCodeSpan(match.row?.raw_line ?? queryLines[0].trim())} ${placeholder}`;
132
+ }
133
+ else {
134
+ instance = substitute(fragment, match.bindings);
135
+ }
136
+ if (match.row !== undefined) {
137
+ const marker = renderer.cite(match.row);
138
+ if (instance.includes(placeholder)) {
139
+ instance = instance.replaceAll(placeholder, marker);
140
+ }
141
+ else {
142
+ // Append to the last non-blank line, so a paragraph fragment's
143
+ // trailing blank separator stays a separator.
144
+ const instanceLines = instance.split('\n');
145
+ for (let i = instanceLines.length - 1; i >= 0; i--) {
146
+ if (instanceLines[i].trim() !== '') {
147
+ instanceLines[i] = `${instanceLines[i]} ${marker}`;
148
+ break;
149
+ }
150
+ }
151
+ instance = instanceLines.join('\n');
152
+ }
153
+ }
154
+ else {
155
+ // Transitive solutions carry no row (§24.2's rule) — nothing to cite.
156
+ instance = instance.replace(/[ \t]*\[\^\?\]/g, '');
157
+ }
158
+ out.push(...instance.split('\n'));
159
+ }
160
+ return out;
161
+ };
162
+ /**
163
+ * Scans one line for Markdown code spans (CommonMark 6.1): a span opens
164
+ * with a backtick run and closes at the next run of exactly the same
165
+ * length — longer and shorter runs in between are content, an opener
166
+ * with no closer is literal text. Content that both begins and ends
167
+ * with a space (and isn't all spaces) loses one from each end, the
168
+ * escape hatch that lets content begin or end with a backtick.
169
+ */
170
+ const codeSpans = (line) => {
171
+ const spans = [];
172
+ let at = 0;
173
+ while (at < line.length) {
174
+ const start = line.indexOf('`', at);
175
+ if (start === -1) {
176
+ break;
177
+ }
178
+ let opened = start + 1;
179
+ while (opened < line.length && line[opened] === '`') {
180
+ opened += 1;
181
+ }
182
+ const length = opened - start;
183
+ let close = -1;
184
+ for (let search = opened; search < line.length;) {
185
+ const candidate = line.indexOf('`', search);
186
+ if (candidate === -1) {
187
+ break;
188
+ }
189
+ let candidateEnd = candidate + 1;
190
+ while (candidateEnd < line.length && line[candidateEnd] === '`') {
191
+ candidateEnd += 1;
192
+ }
193
+ if (candidateEnd - candidate === length) {
194
+ close = candidate;
195
+ break;
196
+ }
197
+ search = candidateEnd;
198
+ }
199
+ if (close === -1) {
200
+ at = opened;
201
+ continue;
202
+ }
203
+ let content = line.slice(opened, close);
204
+ if (content.startsWith(' ') && content.endsWith(' ') && /[^ ]/.test(content)) {
205
+ content = content.slice(1, -1);
206
+ }
207
+ spans.push({ start, end: close + length, content });
208
+ at = close + length;
209
+ }
210
+ return spans;
211
+ };
212
+ const splicePrefix = 'cave-q:';
213
+ /**
214
+ * One inline splice (spec §31.1): exactly one variable, exactly one
215
+ * solution — deterministic or nothing.
216
+ */
217
+ const renderSplice = (patternText, lineNo, renderer) => {
218
+ let names;
219
+ try {
220
+ names = variablesOf(Pattern.parse(patternText));
221
+ }
222
+ catch (error) {
223
+ renderer.problem(lineNo, error instanceof Error ? error.message : String(error));
224
+ return invalidQuery;
225
+ }
226
+ if (names.length !== 1) {
227
+ renderer.problem(lineNo, `an inline splice needs exactly one ?variable, got ${names.length} (spec §31.1)`);
228
+ return invalidQuery;
229
+ }
230
+ const matches = renderer.run(patternText, lineNo);
231
+ if (matches === undefined) {
232
+ return invalidQuery;
233
+ }
234
+ if (matches.length === 0) {
235
+ renderer.problem(lineNo, `no match for inline splice ${JSON.stringify(patternText.trim())}`);
236
+ return '*(no match)*';
237
+ }
238
+ if (matches.length > 1) {
239
+ renderer.problem(lineNo, `ambiguous inline splice ${JSON.stringify(patternText.trim())}: ${matches.length} matches — ` +
240
+ 'several series contest the fact; --resolve picks the §26 winner');
241
+ return `*(ambiguous: ${matches.length} matches)*`;
242
+ }
243
+ const match = matches[0];
244
+ const value = match.bindings[names[0]];
245
+ return match.row === undefined ? value : `${value}${renderer.cite(match.row)}`;
246
+ };
247
+ /**
248
+ * Splices on one prose line: each code span whose content starts with
249
+ * `cave-q:` — whatever its delimiter length, so patterns may carry
250
+ * backtick code literals — is replaced by its splice rendering; other
251
+ * spans and the text between pass through untouched.
252
+ */
253
+ const renderInline = (line, lineNo, renderer) => {
254
+ let out = '';
255
+ let at = 0;
256
+ for (const span of codeSpans(line)) {
257
+ out += line.slice(at, span.start);
258
+ out += span.content.startsWith(splicePrefix)
259
+ ? renderSplice(span.content.slice(splicePrefix.length), lineNo, renderer)
260
+ : line.slice(span.start, span.end);
261
+ at = span.end;
262
+ }
263
+ return out + line.slice(at);
264
+ };
265
+ /**
266
+ * Renders a report template against a store (spec §31): markdown in,
267
+ * markdown out — query blocks and inline splices resolved, citations
268
+ * appended as footnote definitions. Problems don't stop the render;
269
+ * they mark the text and are returned with template line numbers.
270
+ */
271
+ const renderReport = (store, template, options) => {
272
+ const problems = [];
273
+ /** Footnote number per cited row id — repeats share a marker. */
274
+ const numbers = new Map();
275
+ const definitions = [];
276
+ const cite = (row) => {
277
+ const existing = numbers.get(row.id);
278
+ if (existing !== undefined) {
279
+ return `[^c${existing}]`;
280
+ }
281
+ const number = numbers.size + 1;
282
+ numbers.set(row.id, number);
283
+ const contexts = store.db.prepare('SELECT context FROM cave_context WHERE claim_id = ?').all(row.id).map(entry => entry.context);
284
+ const tags = store.db.prepare('SELECT key, value FROM cave_tag WHERE claim_id = ?').all(row.id);
285
+ // The canonical line (§16's emitter over the stored row) rather than
286
+ // raw_line: §9.5 stamps live in the context table, and a citation
287
+ // must show provenance the authored abbreviation would hide.
288
+ const canonical = emitClaim(Row.toClaim(row, contexts, tags));
289
+ const date = new Date(Uuidv7.msOf(row.tx)).toISOString().slice(0, 10);
290
+ const spans = SourceSpan.ofContexts(contexts).filter(reference => reference.span !== undefined);
291
+ const provenance = spans.length === 0 ? '' : `, source ${spans.map(sourceLink).join(', ')}`;
292
+ definitions.push(`[^c${number}]: ${toCodeSpan(canonical)} — ${date}, claim key ${toCodeSpan(row.claim_key)}${provenance}`);
293
+ return `[^c${number}]`;
294
+ };
295
+ const renderer = {
296
+ cite,
297
+ problem: (line, message) => problems.push({ line, message }),
298
+ run: (queryText, line) => {
299
+ try {
300
+ return query(store, queryText, {
301
+ ...options.aliases === true ? { aliases: true } : {},
302
+ ...options.resolve === true ? { resolve: true } : {},
303
+ ...options.asOf === undefined ? {} : { asOf: options.asOf },
304
+ ...options.at === undefined ? {} : { at: options.at }
305
+ });
306
+ }
307
+ catch (error) {
308
+ problems.push({ line, message: error instanceof Error ? error.message : String(error) });
309
+ return undefined;
310
+ }
311
+ }
312
+ };
313
+ const lines = template.split(/\r?\n/);
314
+ const out = [];
315
+ let at = 0;
316
+ while (at < lines.length) {
317
+ const line = lines[at];
318
+ const fence = fenceRe.exec(line);
319
+ if (fence !== null && fence[2].trim() !== '' && fence[2].trim().split(/\s+/)[0] === 'cave-q') {
320
+ const blockStart = at + 1;
321
+ const blockLines = [];
322
+ at += 1;
323
+ while (at < lines.length && !closesFence(lines[at], fence[1])) {
324
+ blockLines.push(lines[at]);
325
+ at += 1;
326
+ }
327
+ if (at >= lines.length) {
328
+ problems.push({ line: blockStart, message: 'unclosed cave-q block' });
329
+ }
330
+ else {
331
+ at += 1; // the closing fence
332
+ }
333
+ out.push(...renderBlock(blockLines, blockStart + 1, renderer));
334
+ continue;
335
+ }
336
+ if (fence !== null) {
337
+ // Any other fenced block passes through verbatim — its content is
338
+ // code, so inline splices inside it never fire.
339
+ out.push(line);
340
+ at += 1;
341
+ while (at < lines.length) {
342
+ out.push(lines[at]);
343
+ if (closesFence(lines[at], fence[1])) {
344
+ at += 1;
345
+ break;
346
+ }
347
+ at += 1;
348
+ }
349
+ continue;
350
+ }
351
+ out.push(renderInline(line, at + 1, renderer));
352
+ at += 1;
353
+ }
354
+ // One newline ends the document — the template's own EOF blank lines
355
+ // (and the split's trailing empty element) normalize away.
356
+ while (out.length > 0 && out[out.length - 1].trim() === '') {
357
+ out.pop();
358
+ }
359
+ if (definitions.length > 0) {
360
+ out.push('', ...definitions);
361
+ }
362
+ const body = out.join('\n');
363
+ const markdown = body === '' ? '' : `${body}\n`;
364
+ return { markdown, citations: definitions.length, problems };
365
+ };
366
+ export const report = (store, template, options = {}) => withScopedStore(store, options.maxSensitivity ?? Sensitivity.defaultMaximum, scoped => renderReport(scoped, template, options));
367
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /** Build a read-only sensitivity-scoped store snapshot for data-leaving views. */
2
+ import { Sensitivity } from '@cavelang/store';
3
+ import type { Store } from '@cavelang/store';
4
+ /**
5
+ * Runs `body` against rows at or below `maximum`. Restricted includes every
6
+ * row, so it can use the source directly; narrower views get an isolated
7
+ * in-memory store whose counts, aliases, history, search, and lineage cannot
8
+ * observe filtered rows indirectly.
9
+ */
10
+ export declare const withScopedStore: <T>(source: Store, maximum: Sensitivity.Level, body: (store: Store) => T) => T;
11
+ //# sourceMappingURL=scope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../src/scope.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAIlF,OAAO,EAAE,WAAW,EAAQ,MAAM,iBAAiB,CAAA;AACnD,OAAO,KAAK,EAAO,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAEjD;;;;;GAKG;AACH,eAAO,MAAM,eAAe,GAAI,CAAC,EAAE,QAAQ,KAAK,EAAE,SAAS,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,KAAK,CAAC,KAAG,CA8BzG,CAAA"}
@@ -0,0 +1,41 @@
1
+ /** Build a read-only sensitivity-scoped store snapshot for data-leaving views. */
2
+ import { Uuidv7 } from '@cavelang/core';
3
+ import { Sensitivity, open } from '@cavelang/store';
4
+ /**
5
+ * Runs `body` against rows at or below `maximum`. Restricted includes every
6
+ * row, so it can use the source directly; narrower views get an isolated
7
+ * in-memory store whose counts, aliases, history, search, and lineage cannot
8
+ * observe filtered rows indirectly.
9
+ */
10
+ export const withScopedStore = (source, maximum, body) => {
11
+ if (maximum === 'restricted') {
12
+ return body(source);
13
+ }
14
+ return Uuidv7.withStatePreserved(() => {
15
+ const target = open(':memory:', { registry: source.baseRegistry() });
16
+ try {
17
+ const rows = source.db.prepare(`
18
+ SELECT c.* FROM cave_claim c
19
+ WHERE ${Sensitivity.sql('c', maximum)} ORDER BY c.tx
20
+ `).all();
21
+ const index = new Map(rows.map((row, at) => [row.id, at]));
22
+ const edges = source.db.prepare('SELECT parent_id, role, child_id FROM cave_edge ORDER BY rowid').all().flatMap(edge => {
23
+ const parent = index.get(edge.parent_id);
24
+ const child = index.get(edge.child_id);
25
+ return parent === undefined || child === undefined ? [] : [{ parent, role: edge.role, child }];
26
+ });
27
+ target.insertResult({
28
+ claims: rows.map(row => ({ claim: source.toClaim(row), line: 0 })),
29
+ edges,
30
+ registry: source.baseRegistry(),
31
+ problems: []
32
+ }, { ids: rows.map(row => row.id) });
33
+ target.reloadRegistry();
34
+ return body(target);
35
+ }
36
+ finally {
37
+ target.close();
38
+ }
39
+ });
40
+ };
41
+ //# sourceMappingURL=scope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope.js","sourceRoot":"","sources":["../../src/scope.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAElF,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAEvC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAGnD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAI,MAAa,EAAE,OAA0B,EAAE,IAAyB,EAAK,EAAE;IAC5G,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC,MAAM,CAAC,CAAA;IACrB,CAAC;IACD,OAAO,MAAM,CAAC,kBAAkB,CAAC,GAAG,EAAE;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,YAAY,EAAE,EAAE,CAAC,CAAA;QACpE,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC;;gBAErB,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC;OACtC,CAAC,CAAC,GAAG,EAAwB,CAAA;YAC9B,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA;YAC1D,MAAM,KAAK,GAAI,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,gEAAgE,CAAC,CAAC,GAAG,EAC1C,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBACxE,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;gBACxC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;gBACtC,OAAO,MAAM,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;YAChG,CAAC,CAAC,CAAA;YACJ,MAAM,CAAC,YAAY,CAAC;gBAClB,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;gBAClE,KAAK;gBACL,QAAQ,EAAE,MAAM,CAAC,YAAY,EAAE;gBAC/B,QAAQ,EAAE,EAAE;aACb,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;YACpC,MAAM,CAAC,cAAc,EAAE,CAAA;YACvB,OAAO,IAAI,CAAC,MAAM,CAAC,CAAA;QACrB,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,KAAK,EAAE,CAAA;QAChB,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * `cave serve` (spec §30.3) — the store behind a local HTTP server: the
3
+ * §30.1 page at `/`, the §30.2 view models under `/api/*`. Strictly a
4
+ * read surface: only GET/HEAD are answered (anything else is 405), no
5
+ * route writes, and the page's CSP forbids every non-self source — the
6
+ * browser can render the store but never mutate it or leak it.
7
+ *
8
+ * Binds 127.0.0.1 by default: the store is one person's knowledge on
9
+ * one machine (§19), and serving it wider is an explicit `--host` act.
10
+ */
11
+ import type { Server } from 'node:http';
12
+ import { Sensitivity } from '@cavelang/store';
13
+ import type { Store } from '@cavelang/store';
14
+ /** `cave` on a phone keypad. */
15
+ export declare const defaultPort = 2283;
16
+ export declare const defaultHost = "127.0.0.1";
17
+ export type ServeOptions = {
18
+ /** Interface to bind (default {@link defaultHost} — localhost only). */
19
+ readonly host?: string;
20
+ /** Port to bind (default {@link defaultPort}; `0` picks a free one). */
21
+ readonly port?: number;
22
+ /** Store label shown on the page — typically the `--db` path. */
23
+ readonly label?: string;
24
+ /** Highest sensitivity level served (default `internal`, spec §9.7). */
25
+ readonly maxSensitivity?: Sensitivity.Level;
26
+ };
27
+ export type Handle = {
28
+ /** The root URL actually bound, e.g. `http://127.0.0.1:2283/`. */
29
+ readonly url: string;
30
+ readonly server: Server;
31
+ close(): Promise<void>;
32
+ };
33
+ /** Starts the read surface; resolves once the port is bound. */
34
+ export declare const serve: (store: Store, options?: ServeOptions) => Promise<Handle>;
35
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAmB,MAAM,EAAkB,MAAM,WAAW,CAAA;AAExE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAI5C,gCAAgC;AAChC,eAAO,MAAM,WAAW,OAAO,CAAA;AAC/B,eAAO,MAAM,WAAW,cAAc,CAAA;AAEtC,MAAM,MAAM,YAAY,GAAG;IACzB,wEAAwE;IACxE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,wEAAwE;IACxE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,iEAAiE;IACjE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,wEAAwE;IACxE,QAAQ,CAAC,cAAc,CAAC,EAAE,WAAW,CAAC,KAAK,CAAA;CAC5C,CAAA;AAED,MAAM,MAAM,MAAM,GAAG;IACnB,kEAAkE;IAClE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB,CAAA;AA+GD,gEAAgE;AAChE,eAAO,MAAM,KAAK,GAAI,OAAO,KAAK,EAAE,UAAS,YAAiB,KAAG,OAAO,CAAC,MAAM,CAsB9E,CAAA"}
@@ -0,0 +1,141 @@
1
+ /**
2
+ * `cave serve` (spec §30.3) — the store behind a local HTTP server: the
3
+ * §30.1 page at `/`, the §30.2 view models under `/api/*`. Strictly a
4
+ * read surface: only GET/HEAD are answered (anything else is 405), no
5
+ * route writes, and the page's CSP forbids every non-self source — the
6
+ * browser can render the store but never mutate it or leak it.
7
+ *
8
+ * Binds 127.0.0.1 by default: the store is one person's knowledge on
9
+ * one machine (§19), and serving it wider is an explicit `--host` act.
10
+ */
11
+ import { createServer } from 'node:http';
12
+ import { Version } from '@cavelang/core';
13
+ import { Sensitivity } from '@cavelang/store';
14
+ import { entity, history, lineage, overview, search, topic } from "./api.js";
15
+ import { page } from "./page.js";
16
+ /** `cave` on a phone keypad. */
17
+ export const defaultPort = 2283;
18
+ export const defaultHost = '127.0.0.1';
19
+ const escapeHtml = (text) => text.replace(/[&<>"']/g, char => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' })[char]);
20
+ const json = (res, status, body) => {
21
+ res.writeHead(status, {
22
+ 'content-type': 'application/json; charset=utf-8',
23
+ 'x-content-type-options': 'nosniff',
24
+ 'cache-control': 'no-store'
25
+ });
26
+ res.end(JSON.stringify(body));
27
+ };
28
+ /** A required query parameter, `undefined` when absent or blank. */
29
+ const param = (url, name) => {
30
+ const value = url.searchParams.get(name);
31
+ return value === null || value === '' ? undefined : value;
32
+ };
33
+ const handler = (store, label, maximum) => {
34
+ const html = page
35
+ .replaceAll('__CAVE_DB__', escapeHtml(label))
36
+ .replaceAll('__CAVE_VERSION__', escapeHtml(Version.current()))
37
+ .replaceAll('__CAVE_SENSITIVITY__', escapeHtml(maximum));
38
+ return (req, res) => {
39
+ try {
40
+ if (req.method !== 'GET' && req.method !== 'HEAD') {
41
+ res.writeHead(405, { allow: 'GET, HEAD', 'content-type': 'application/json; charset=utf-8' });
42
+ res.end(req.method === 'HEAD' ? undefined : JSON.stringify({ error: 'read-only surface — GET only (spec §30.3)' }));
43
+ return;
44
+ }
45
+ const url = new URL(req.url ?? '/', 'http://cave.local');
46
+ const head = req.method === 'HEAD';
47
+ if (url.pathname === '/') {
48
+ res.writeHead(200, {
49
+ 'content-type': 'text/html; charset=utf-8',
50
+ 'x-content-type-options': 'nosniff',
51
+ 'cache-control': 'no-store',
52
+ // Self-contained (spec §30.1): inline style/script, same-origin
53
+ // fetches, nothing else — the page cannot call out anywhere.
54
+ 'content-security-policy': "default-src 'none'; style-src 'unsafe-inline'; script-src 'unsafe-inline'; connect-src 'self'; img-src data:"
55
+ });
56
+ res.end(head ? undefined : html);
57
+ return;
58
+ }
59
+ if (!url.pathname.startsWith('/api/')) {
60
+ json(res, 404, { error: `no such path: ${url.pathname}` });
61
+ return;
62
+ }
63
+ const aliases = url.searchParams.get('aliases') === '1';
64
+ const body = (() => {
65
+ switch (url.pathname) {
66
+ case '/api/overview':
67
+ return { status: 200, body: { db: label, maxSensitivity: maximum, ...overview(store, { maxSensitivity: maximum }) } };
68
+ case '/api/entity': {
69
+ const name = param(url, 'name');
70
+ return name === undefined ?
71
+ { status: 400, body: { error: 'entity requires ?name=' } } :
72
+ { status: 200, body: entity(store, name, { aliases, maxSensitivity: maximum }) };
73
+ }
74
+ case '/api/topic': {
75
+ const name = param(url, 'name');
76
+ return name === undefined ?
77
+ { status: 400, body: { error: 'topic requires ?name=' } } :
78
+ { status: 200, body: topic(store, name, { aliases, maxSensitivity: maximum }) };
79
+ }
80
+ case '/api/history': {
81
+ const key = param(url, 'key');
82
+ if (key === undefined) {
83
+ return { status: 400, body: { error: 'history requires ?key=' } };
84
+ }
85
+ const series = history(store, key, { maxSensitivity: maximum });
86
+ return series.rows.length === 0 ?
87
+ { status: 404, body: { error: `unknown claim key: ${key}` } } :
88
+ { status: 200, body: series };
89
+ }
90
+ case '/api/lineage': {
91
+ const id = param(url, 'id');
92
+ if (id === undefined) {
93
+ return { status: 400, body: { error: 'lineage requires ?id=' } };
94
+ }
95
+ const tree = lineage(store, id, { maxSensitivity: maximum });
96
+ return tree === undefined ?
97
+ { status: 404, body: { error: `unknown row id: ${id}` } } :
98
+ { status: 200, body: tree };
99
+ }
100
+ case '/api/search': {
101
+ const text = param(url, 'q');
102
+ return text === undefined ?
103
+ { status: 400, body: { error: 'search requires ?q=' } } :
104
+ { status: 200, body: search(store, text, { maxSensitivity: maximum }) };
105
+ }
106
+ default:
107
+ return { status: 404, body: { error: `no such endpoint: ${url.pathname}` } };
108
+ }
109
+ })();
110
+ if (head) {
111
+ res.writeHead(body.status, { 'content-type': 'application/json; charset=utf-8' });
112
+ res.end();
113
+ return;
114
+ }
115
+ json(res, body.status, body.body);
116
+ }
117
+ catch (error) {
118
+ json(res, 500, { error: error instanceof Error ? error.message : String(error) });
119
+ }
120
+ };
121
+ };
122
+ /** Starts the read surface; resolves once the port is bound. */
123
+ export const serve = (store, options = {}) => {
124
+ const host = options.host ?? defaultHost;
125
+ const server = createServer(handler(store, options.label ?? 'cave.db', options.maxSensitivity ?? Sensitivity.defaultMaximum));
126
+ return new Promise((resolve, reject) => {
127
+ server.once('error', reject);
128
+ server.listen(options.port ?? defaultPort, host, () => {
129
+ const address = server.address();
130
+ const port = typeof address === 'object' && address !== null ? address.port : options.port ?? defaultPort;
131
+ // Bracket IPv6 hosts; the default is IPv4 loopback.
132
+ const shown = host.includes(':') ? `[${host}]` : host;
133
+ resolve({
134
+ url: `http://${shown}:${port}/`,
135
+ server,
136
+ close: () => new Promise((done, fail) => server.close(error => error === undefined ? done() : fail(error)))
137
+ });
138
+ });
139
+ });
140
+ };
141
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"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"}