@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,331 @@
1
+ /**
2
+ * Knowledge health checks (spec §20).
3
+ *
4
+ * Everything here is a *read* over a store: expectations come from current
5
+ * positive `EXPECTS` claims (§20.1), targets bind through the `EXTENDS`
6
+ * taxonomy, and the report (§20.2) lists shape violations, stale beliefs,
7
+ * review candidates, alias disagreements and coverage stats. Nothing is
8
+ * written — enforcement is the opt-in gate in `gate.ts` (§20.3).
9
+ */
10
+ import { Uuidv7, Verb } from '@cavelang/core';
11
+ import { Registry } from '@cavelang/canonical';
12
+ const currentSql = `
13
+ SELECT c.* FROM cave_claim c
14
+ JOIN (
15
+ SELECT claim_key, MAX(tx) AS max_tx
16
+ FROM cave_claim GROUP BY claim_key
17
+ ) latest ON c.claim_key = latest.claim_key AND c.tx = latest.max_tx
18
+ `;
19
+ export const defaultStaleDays = 90;
20
+ /** Entity test for coverage/targets: not a verb token, not a stored literal. */
21
+ const isEntityName = (name) => !Verb.isVerbToken(name) && !name.startsWith('"') && !name.startsWith('`');
22
+ const all = (store, sql, ...params) => store.db.prepare(sql).all(...params);
23
+ /**
24
+ * One evaluation snapshot. Query count is constant: current beliefs, tags,
25
+ * and declaration-excluding qualifier edges, independent of shape size.
26
+ */
27
+ const shapeState = (store) => {
28
+ const rows = all(store, `SELECT c.* FROM (${currentSql}) c ORDER BY c.tx`);
29
+ const currentIds = new Set(rows.map(row => row.id));
30
+ const tags = new Map();
31
+ const tagRows = store.db.prepare("SELECT claim_id, key, value FROM cave_tag WHERE key IN ('unit', 'cardinality') ORDER BY rowid").all();
32
+ for (const tag of tagRows) {
33
+ if (!currentIds.has(tag.claim_id))
34
+ continue;
35
+ const byKey = tags.get(tag.claim_id) ?? new Map();
36
+ if (!byKey.has(tag.key))
37
+ byKey.set(tag.key, tag.value);
38
+ tags.set(tag.claim_id, byKey);
39
+ }
40
+ const excludedDeclarations = new Set(store.db.prepare(`
41
+ SELECT DISTINCT child_id FROM cave_edge WHERE role IN ('WHEN', 'VIA', 'BECAUSE')
42
+ `).all().map(row => row.child_id));
43
+ return { rows, tags, excludedDeclarations };
44
+ };
45
+ const tagValue = (state, row, key) => state.tags.get(row.id)?.get(key) ?? undefined;
46
+ const expectationOf = (state, row) => {
47
+ if (!isEntityName(row.subject) || row.object === null || row.object.startsWith('"') || row.object.startsWith('`')) {
48
+ return undefined;
49
+ }
50
+ const kind = Verb.isVerbToken(row.object) ? 'relation' : 'attribute';
51
+ const unit = kind === 'attribute' ? tagValue(state, row, 'unit') : undefined;
52
+ return {
53
+ type: row.subject,
54
+ kind,
55
+ name: row.object,
56
+ cardinality: tagValue(state, row, 'cardinality') === 'one' ? 'one' : 'some',
57
+ ...unit === undefined ? {} : { unit },
58
+ row
59
+ };
60
+ };
61
+ const expectationsOf = (state) => state.rows.flatMap(row => {
62
+ if (row.verb !== 'EXPECTS' || row.negated !== 0 || row.conf <= 0 || row.object === null ||
63
+ state.excludedDeclarations.has(row.id))
64
+ return [];
65
+ const expectation = expectationOf(state, row);
66
+ return expectation === undefined ? [] : [expectation];
67
+ });
68
+ /**
69
+ * Current positive `EXPECTS` declarations (spec §20.1), oldest first.
70
+ * Qualifier condition rows never declare, mirroring the registry's
71
+ * treatment of in-band declarations; verb-token and literal subjects are
72
+ * not types.
73
+ */
74
+ export const expectations = (store) => expectationsOf(shapeState(store));
75
+ const targetIndexes = (state) => {
76
+ const children = new Map();
77
+ const typings = [];
78
+ for (const row of state.rows) {
79
+ if (row.negated !== 0 || row.conf <= 0 || row.object === null)
80
+ continue;
81
+ if (row.verb === 'EXTENDS') {
82
+ children.set(row.object, [...children.get(row.object) ?? [], row.subject]);
83
+ }
84
+ else if (row.verb === 'IS' && isEntityName(row.subject)) {
85
+ typings.push({ entity: row.subject, via: row.object });
86
+ }
87
+ }
88
+ return { children, typings };
89
+ };
90
+ const instancesOf = (targets, type) => {
91
+ const types = new Set([type]);
92
+ let frontier = [type];
93
+ for (let depth = 0; depth < 32 && frontier.length > 0; depth += 1) {
94
+ const next = [];
95
+ for (const parent of frontier) {
96
+ for (const child of targets.children.get(parent) ?? []) {
97
+ if (types.has(child))
98
+ continue;
99
+ types.add(child);
100
+ next.push(child);
101
+ }
102
+ }
103
+ frontier = next;
104
+ }
105
+ const instances = new Map();
106
+ for (const { entity, via } of targets.typings) {
107
+ if (types.has(via) && !instances.has(entity)) {
108
+ instances.set(entity, via);
109
+ }
110
+ }
111
+ return instances;
112
+ };
113
+ const addObserved = (index, slot, entity, unit) => {
114
+ const byEntity = index.get(slot) ?? new Map();
115
+ const actual = byEntity.get(entity) ?? { count: 0, units: new Set() };
116
+ actual.count += 1;
117
+ if (unit !== undefined)
118
+ actual.units.add(unit);
119
+ byEntity.set(entity, actual);
120
+ index.set(slot, byEntity);
121
+ };
122
+ const observedIndexes = (state) => {
123
+ const attributes = new Map();
124
+ const forward = new Map();
125
+ const reverse = new Map();
126
+ for (const row of state.rows) {
127
+ if (row.negated !== 0 || row.conf <= 0)
128
+ continue;
129
+ if (row.verb === 'HAS' && row.attribute !== null) {
130
+ addObserved(attributes, row.attribute, row.subject, row.value_unit);
131
+ }
132
+ if (row.object !== null) {
133
+ addObserved(forward, row.verb, row.subject);
134
+ addObserved(reverse, row.verb, row.object);
135
+ }
136
+ }
137
+ return { attributes, forward, reverse };
138
+ };
139
+ const observed = (store, indexes, entity, expectation) => {
140
+ let actual;
141
+ if (expectation.kind === 'attribute') {
142
+ actual = indexes.attributes.get(expectation.name)?.get(entity);
143
+ }
144
+ else {
145
+ // An inverse expectation reads the object side of its stored primary.
146
+ const { primary, isInverse } = Registry.primaryOf(store.registry(), expectation.name);
147
+ actual = (isInverse ? indexes.reverse : indexes.forward).get(primary)?.get(entity);
148
+ }
149
+ if (actual === undefined)
150
+ return { count: 0, units: [] };
151
+ return {
152
+ count: actual.count,
153
+ units: [...actual.units].sort((a, b) => (a ?? '').localeCompare(b ?? ''))
154
+ };
155
+ };
156
+ const satisfies = (expectation, actual) => actual.count > 0 &&
157
+ (expectation.cardinality === 'some' || actual.count === 1) &&
158
+ (expectation.unit === undefined || actual.units.every(unit => unit === expectation.unit));
159
+ /** Evaluates every declared expectation against its instances (spec §20.2). */
160
+ export const evaluate = (store) => {
161
+ const state = shapeState(store);
162
+ const declared = expectationsOf(state);
163
+ const indexes = observedIndexes(state);
164
+ const targets = targetIndexes(state);
165
+ const byType = new Map();
166
+ for (const expectation of declared) {
167
+ byType.set(expectation.type, [...byType.get(expectation.type) ?? [], expectation]);
168
+ }
169
+ const violations = [];
170
+ const targeted = new Set();
171
+ let checks = 0;
172
+ for (const [type, typeExpectations] of byType) {
173
+ for (const [entity, via] of instancesOf(targets, type)) {
174
+ targeted.add(entity);
175
+ for (const expectation of typeExpectations) {
176
+ checks += 1;
177
+ const actual = observed(store, indexes, entity, expectation);
178
+ if (!satisfies(expectation, actual)) {
179
+ violations.push({
180
+ entity,
181
+ via,
182
+ expectation,
183
+ actualCount: actual.count,
184
+ actualUnits: actual.units
185
+ });
186
+ }
187
+ }
188
+ }
189
+ }
190
+ return { expectations: declared, violations, instances: targeted.size, checks };
191
+ };
192
+ /** Current believed rows older than the horizon (spec §20.2), oldest first. */
193
+ const staleRows = (store, staleDays, nowMs) => {
194
+ const cutoff = nowMs - staleDays * 86_400_000;
195
+ return all(store, `SELECT c.* FROM (${currentSql}) c WHERE c.conf > 0 ORDER BY c.tx`)
196
+ .filter(row => Uuidv7.msOf(row.tx) < cutoff)
197
+ .map(row => ({ row, ageDays: Math.floor((nowMs - Uuidv7.msOf(row.tx)) / 86_400_000) }));
198
+ };
199
+ /** Alias closure groups of size ≥ 2 — union-find over current positive `ALIAS` links (spec §13.6). */
200
+ const aliasGroups = (store) => {
201
+ const edges = store.db.prepare(`
202
+ SELECT c.subject AS a, c.object AS b FROM (${currentSql}) c
203
+ WHERE c.verb = 'ALIAS' AND c.negated = 0 AND c.conf > 0 AND c.object IS NOT NULL
204
+ `).all();
205
+ const parent = new Map();
206
+ const find = (name) => {
207
+ const up = parent.get(name);
208
+ if (up === undefined || up === name) {
209
+ return name;
210
+ }
211
+ const root = find(up);
212
+ parent.set(name, root);
213
+ return root;
214
+ };
215
+ for (const { a, b } of edges) {
216
+ parent.set(find(a), find(b));
217
+ }
218
+ const groups = new Map();
219
+ for (const name of new Set(edges.flatMap(({ a, b }) => [a, b]))) {
220
+ const root = find(name);
221
+ groups.set(root, [...groups.get(root) ?? [], name]);
222
+ }
223
+ return [...groups.values()].filter(group => group.length >= 2).map(group => group.sort());
224
+ };
225
+ /**
226
+ * Scope signature of a row: its non-`src:` contexts, sorted. Series scoped
227
+ * to different contexts (`@prod` vs `@staging`) describe different facts
228
+ * and never disagree; actor provenance stamps (spec §9.5) are provenance,
229
+ * not scope, so they don't separate.
230
+ */
231
+ const scopeOf = (store, row) => store.db.prepare('SELECT context FROM cave_context WHERE claim_id = ?').all(row.id)
232
+ .map(({ context }) => context)
233
+ .filter(context => !context.startsWith('src:'))
234
+ .sort()
235
+ .join('');
236
+ /** Whether two rows from different alias names actually conflict. */
237
+ const hasCrossNamePair = (rows, differs) => rows.some((left, at) => rows.slice(at + 1).some(right => left.subject !== right.subject && differs(left, right)));
238
+ /**
239
+ * Cross-series conflicts inside alias groups (spec §20.2) — the checking
240
+ * half open decision 2 deferred: union-of-rows keeps disagreeing series
241
+ * side by side; this is what looks at them.
242
+ */
243
+ const findDisagreements = (store) => {
244
+ const disagreements = [];
245
+ for (const group of aliasGroups(store)) {
246
+ const rows = all(store, `
247
+ SELECT c.* FROM (${currentSql}) c
248
+ WHERE c.subject IN (${group.map(() => '?').join(', ')}) AND c.verb <> 'ALIAS' AND c.conf > 0
249
+ ORDER BY c.tx
250
+ `, ...group);
251
+ const buckets = new Map();
252
+ for (const row of rows) {
253
+ const slot = row.attribute !== null ? `attr:${row.attribute}` : row.object !== null ? `obj:${row.object}` : '';
254
+ if (slot === '') {
255
+ continue;
256
+ }
257
+ const key = `${row.verb}${slot}${scopeOf(store, row)}`;
258
+ buckets.set(key, [...buckets.get(key) ?? [], row]);
259
+ }
260
+ for (const bucket of buckets.values()) {
261
+ const first = bucket[0];
262
+ if (first.attribute !== null) {
263
+ const positives = bucket.filter(row => row.negated === 0);
264
+ const subjects = [...new Set(positives.map(row => row.subject))].sort();
265
+ if (hasCrossNamePair(positives, (left, right) => left.value_text !== right.value_text)) {
266
+ disagreements.push({ kind: 'value', about: `${first.verb} ${first.attribute}`, entities: subjects, rows: positives });
267
+ }
268
+ }
269
+ else {
270
+ if (hasCrossNamePair(bucket, (left, right) => left.negated !== right.negated)) {
271
+ disagreements.push({
272
+ kind: 'polarity',
273
+ about: `${first.verb} ${first.object}`,
274
+ entities: [...new Set(bucket.map(row => row.subject))].sort(),
275
+ rows: bucket
276
+ });
277
+ }
278
+ }
279
+ }
280
+ }
281
+ return disagreements;
282
+ };
283
+ const count = (store, sql) => store.db.prepare(sql).get().n;
284
+ const coverage = (store, evaluation) => {
285
+ const average = store.db.prepare(`SELECT AVG(conf) AS avg FROM (${currentSql}) c WHERE c.conf > 0`)
286
+ .get().avg;
287
+ const names = store.db.prepare(`
288
+ SELECT c.subject AS name FROM (${currentSql}) c WHERE c.conf > 0
289
+ UNION
290
+ SELECT c.object AS name FROM (${currentSql}) c WHERE c.conf > 0 AND c.object IS NOT NULL
291
+ `).all().map(row => row.name).filter(isEntityName);
292
+ const typed = store.db.prepare(`
293
+ SELECT DISTINCT c.subject AS name FROM (${currentSql}) c
294
+ WHERE c.verb = 'IS' AND c.negated = 0 AND c.conf > 0 AND c.object IS NOT NULL
295
+ `).all().map(row => row.name).filter(isEntityName);
296
+ return {
297
+ rows: count(store, 'SELECT COUNT(*) AS n FROM cave_claim'),
298
+ facts: count(store, 'SELECT COUNT(DISTINCT claim_key) AS n FROM cave_claim'),
299
+ current: count(store, `SELECT COUNT(*) AS n FROM (${currentSql}) c WHERE c.conf > 0 AND c.negated = 0`),
300
+ retracted: count(store, `SELECT COUNT(*) AS n FROM (${currentSql}) c WHERE c.conf = 0`),
301
+ negated: count(store, `SELECT COUNT(*) AS n FROM (${currentSql}) c WHERE c.conf > 0 AND c.negated = 1`),
302
+ averageConfidence: average,
303
+ lowConfidence: count(store, `SELECT COUNT(*) AS n FROM (${currentSql}) c WHERE c.conf > 0 AND c.conf < 0.3`),
304
+ entities: new Set(names).size,
305
+ typedEntities: typed.length,
306
+ expectations: evaluation.expectations.length,
307
+ instances: evaluation.instances,
308
+ checks: evaluation.checks,
309
+ satisfied: evaluation.checks - evaluation.violations.length
310
+ };
311
+ };
312
+ /**
313
+ * The knowledge-health report (spec §20.2): shape violations, stale
314
+ * beliefs, review candidates (`conf 0.3–0.7`, §13.5), alias disagreements
315
+ * and coverage. Violations are the failing section; the rest is advisory.
316
+ */
317
+ export const check = (store, options = {}) => {
318
+ const evaluation = evaluate(store);
319
+ return {
320
+ expectations: evaluation.expectations,
321
+ violations: evaluation.violations,
322
+ stale: staleRows(store, options.staleDays ?? defaultStaleDays, (options.now ?? Date.now)()),
323
+ review: all(store, `
324
+ SELECT c.* FROM (${currentSql}) c
325
+ WHERE c.conf >= 0.3 AND c.conf <= 0.7 ORDER BY c.conf, c.tx
326
+ `),
327
+ disagreements: findDisagreements(store),
328
+ coverage: coverage(store, evaluation)
329
+ };
330
+ };
331
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/check.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAG9C,MAAM,UAAU,GAAG;;;;;;CAMlB,CAAA;AA2FD,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,CAAA;AAElC,gFAAgF;AAChF,MAAM,YAAY,GAAG,CAAC,IAAY,EAAW,EAAE,CAC7C,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;AAE3E,MAAM,GAAG,GAAG,CAAC,KAAY,EAAE,GAAW,EAAE,GAAG,MAA2B,EAAW,EAAE,CACjF,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAuB,CAAA;AAS5D;;;GAGG;AACH,MAAM,UAAU,GAAG,CAAC,KAAY,EAAc,EAAE;IAC9C,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,EAAE,oBAAoB,UAAU,mBAAmB,CAAC,CAAA;IAC1E,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;IACnD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAsC,CAAA;IAC1D,MAAM,OAAO,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,CAC9B,+FAA+F,CAChG,CAAC,GAAG,EAA+D,CAAA;IACpE,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,SAAQ;QAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,GAAG,EAAyB,CAAA;QACxE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,CAAA;QACtD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;IAC/B,CAAC;IACD,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAE,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC;;GAEtD,CAAC,CAAC,GAAG,EAA6B,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAA;IAC7D,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAA;AAC7C,CAAC,CAAA;AAED,MAAM,QAAQ,GAAG,CAAC,KAAiB,EAAE,GAAU,EAAE,GAAW,EAAsB,EAAE,CAClF,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,SAAS,CAAA;AAE/C,MAAM,aAAa,GAAG,CAAC,KAAiB,EAAE,GAAU,EAA2B,EAAE;IAC/E,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAClH,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAmB,CAAC,CAAC,CAAC,WAAoB,CAAA;IACtF,MAAM,IAAI,GAAG,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAC5E,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,OAAO;QACjB,IAAI;QACJ,IAAI,EAAE,GAAG,CAAC,MAAM;QAChB,WAAW,EAAE,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,aAAa,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM;QAC3E,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE;QACrC,GAAG;KACJ,CAAA;AACH,CAAC,CAAA;AAED,MAAM,cAAc,GAAG,CAAC,KAAiB,EAAiB,EAAE,CAC1D,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;IACvB,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,GAAG,CAAC,OAAO,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI;QACnF,KAAK,CAAC,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAAE,OAAO,EAAE,CAAA;IACrD,MAAM,WAAW,GAAG,aAAa,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IAC7C,OAAO,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAA;AACvD,CAAC,CAAC,CAAA;AAEJ;;;;;GAKG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAY,EAAiB,EAAE,CAC1D,cAAc,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAA;AAYnC,MAAM,aAAa,GAAG,CAAC,KAAiB,EAAiB,EAAE;IACzD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAA;IAC5C,MAAM,OAAO,GAAsC,EAAE,CAAA;IACrD,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,GAAG,CAAC,OAAO,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI;YAAE,SAAQ;QACvE,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC3B,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAA;QAC5E,CAAC;aAAM,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1D,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAA;QACxD,CAAC;IACH,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAA;AAC9B,CAAC,CAAA;AAED,MAAM,WAAW,GAAG,CAAC,OAAsB,EAAE,IAAY,EAAuB,EAAE;IAChF,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;IAC7B,IAAI,QAAQ,GAAG,CAAC,IAAI,CAAC,CAAA;IACrB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAClE,MAAM,IAAI,GAAa,EAAE,CAAA;QACzB,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;YAC9B,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;gBACvD,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;oBAAE,SAAQ;gBAC9B,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;gBAChB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAClB,CAAC;QACH,CAAC;QACD,QAAQ,GAAG,IAAI,CAAA;IACjB,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAA;IAC3C,KAAK,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QAC9C,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7C,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;QAC5B,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA;AAUD,MAAM,WAAW,GAAG,CAAC,KAAgB,EAAE,IAAY,EAAE,MAAc,EAAE,IAAoB,EAAQ,EAAE;IACjG,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,EAA2B,CAAA;IACtE,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,GAAG,EAAiB,EAAE,CAAA;IACpF,MAAM,CAAC,KAAK,IAAI,CAAC,CAAA;IACjB,IAAI,IAAI,KAAK,SAAS;QAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAC9C,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC5B,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;AAC3B,CAAC,CAAA;AAQD,MAAM,eAAe,GAAG,CAAC,KAAiB,EAAmB,EAAE;IAC7D,MAAM,UAAU,GAAc,IAAI,GAAG,EAAE,CAAA;IACvC,MAAM,OAAO,GAAc,IAAI,GAAG,EAAE,CAAA;IACpC,MAAM,OAAO,GAAc,IAAI,GAAG,EAAE,CAAA;IACpC,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,GAAG,CAAC,OAAO,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC;YAAE,SAAQ;QAChD,IAAI,GAAG,CAAC,IAAI,KAAK,KAAK,IAAI,GAAG,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;YACjD,WAAW,CAAC,UAAU,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,UAAU,CAAC,CAAA;QACrE,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YACxB,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;YAC3C,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;QAC5C,CAAC;IACH,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,CAAA;AACzC,CAAC,CAAA;AAED,MAAM,QAAQ,GAAG,CACf,KAAY,EACZ,OAAwB,EACxB,MAAc,EACd,WAAwB,EACd,EAAE;IACZ,IAAI,MAAmC,CAAA;IACvC,IAAI,WAAW,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QACrC,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAChE,CAAC;SAAM,CAAC;QACN,sEAAsE;QACtE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,WAAW,CAAC,IAAI,CAAC,CAAA;QACrF,MAAM,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACpF,CAAC;IACD,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAA;IACxD,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;KAC1E,CAAA;AACH,CAAC,CAAA;AAED,MAAM,SAAS,GAAG,CAAC,WAAwB,EAAE,MAAgB,EAAW,EAAE,CACxE,MAAM,CAAC,KAAK,GAAG,CAAC;IAChB,CAAC,WAAW,CAAC,WAAW,KAAK,MAAM,IAAI,MAAM,CAAC,KAAK,KAAK,CAAC,CAAC;IAC1D,CAAC,WAAW,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI,CAAC,CAAC,CAAA;AAY3F,+EAA+E;AAC/E,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAAY,EAAc,EAAE;IACnD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAA;IAC/B,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,CAAA;IACtC,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,CAAA;IACtC,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,CAAA;IACpC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAyB,CAAA;IAC/C,KAAK,MAAM,WAAW,IAAI,QAAQ,EAAE,CAAC;QACnC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,WAAW,CAAC,CAAC,CAAA;IACpF,CAAC;IACD,MAAM,UAAU,GAAgB,EAAE,CAAA;IAClC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAA;IAClC,IAAI,MAAM,GAAG,CAAC,CAAA;IACd,KAAK,MAAM,CAAC,IAAI,EAAE,gBAAgB,CAAC,IAAI,MAAM,EAAE,CAAC;QAC9C,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC;YACvD,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;YACpB,KAAK,MAAM,WAAW,IAAI,gBAAgB,EAAE,CAAC;gBAC3C,MAAM,IAAI,CAAC,CAAA;gBACX,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,CAAA;gBAC5D,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,CAAC;oBACpC,UAAU,CAAC,IAAI,CAAC;wBACd,MAAM;wBACN,GAAG;wBACH,WAAW;wBACX,WAAW,EAAE,MAAM,CAAC,KAAK;wBACzB,WAAW,EAAE,MAAM,CAAC,KAAK;qBAC1B,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAA;AACjF,CAAC,CAAA;AAED,+EAA+E;AAC/E,MAAM,SAAS,GAAG,CAAC,KAAY,EAAE,SAAiB,EAAE,KAAa,EAAW,EAAE;IAC5E,MAAM,MAAM,GAAG,KAAK,GAAG,SAAS,GAAG,UAAU,CAAA;IAC7C,OAAO,GAAG,CAAC,KAAK,EAAE,oBAAoB,UAAU,oCAAoC,CAAC;SAClF,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC;SAC3C,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC,CAAA;AAC3F,CAAC,CAAA;AAED,sGAAsG;AACtG,MAAM,WAAW,GAAG,CAAC,KAAY,EAAc,EAAE;IAC/C,MAAM,KAAK,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC;iDACgB,UAAU;;GAExD,CAAC,CAAC,GAAG,EAAgC,CAAA;IACtC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAA;IACxC,MAAM,IAAI,GAAG,CAAC,IAAY,EAAU,EAAE;QACpC,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAC3B,IAAI,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;YACpC,OAAO,IAAI,CAAA;QACb,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAA;QACrB,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QACtB,OAAO,IAAI,CAAA;IACb,CAAC,CAAA;IACD,KAAK,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,KAAK,EAAE,CAAC;QAC7B,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;IAC9B,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAA;IAC1C,KAAK,MAAM,IAAI,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAA;QACvB,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC,CAAA;IACrD,CAAC;IACD,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;AAC3F,CAAC,CAAA;AAED;;;;;GAKG;AACH,MAAM,OAAO,GAAG,CAAC,KAAY,EAAE,GAAU,EAAU,EAAE,CAClD,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,qDAAqD,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAA2B;KAC3G,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC;KAC7B,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;KAC9C,IAAI,EAAE;KACN,IAAI,CAAC,GAAG,CAAC,CAAA;AAEd,qEAAqE;AACrE,MAAM,gBAAgB,GAAG,CACvB,IAAsB,EACtB,OAA+C,EACtC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CACnC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAA;AAE3F;;;;GAIG;AACH,MAAM,iBAAiB,GAAG,CAAC,KAAY,EAAkB,EAAE;IACzD,MAAM,aAAa,GAAmB,EAAE,CAAA;IACxC,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,EAAE;yBACH,UAAU;4BACP,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;KAEtD,EAAE,GAAG,KAAK,CAAC,CAAA;QACZ,MAAM,OAAO,GAAG,IAAI,GAAG,EAAmB,CAAA;QAC1C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG,GAAG,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;YAC9G,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;gBAChB,SAAQ;YACV,CAAC;YACD,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,IAAI,IAAI,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAA;YACxD,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAA;QACpD,CAAC;QACD,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YACtC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAE,CAAA;YACxB,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;gBAC7B,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,CAAC,CAAA;gBACzD,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;gBACvE,IAAI,gBAAgB,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,KAAK,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;oBACvF,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAA;gBACvH,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,IAAI,gBAAgB,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC9E,aAAa,CAAC,IAAI,CAAC;wBACjB,IAAI,EAAE,UAAU;wBAChB,KAAK,EAAE,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,EAAE;wBACtC,QAAQ,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;wBAC7D,IAAI,EAAE,MAAM;qBACb,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,aAAa,CAAA;AACtB,CAAC,CAAA;AAED,MAAM,KAAK,GAAG,CAAC,KAAY,EAAE,GAAW,EAAU,EAAE,CACjD,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAoB,CAAC,CAAC,CAAA;AAElD,MAAM,QAAQ,GAAG,CAAC,KAAY,EAAE,UAAsB,EAAY,EAAE;IAClE,MAAM,OAAO,GAAI,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,iCAAiC,UAAU,sBAAsB,CAAC;SACjG,GAAG,EAA6B,CAAC,GAAG,CAAA;IACvC,MAAM,KAAK,GAAI,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC;qCACG,UAAU;;oCAEX,UAAU;GAC3C,CAAC,CAAC,GAAG,EAAyB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;IACzE,MAAM,KAAK,GAAI,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC;8CACY,UAAU;;GAErD,CAAC,CAAC,GAAG,EAAyB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;IACzE,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,sCAAsC,CAAC;QAC1D,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,uDAAuD,CAAC;QAC5E,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE,8BAA8B,UAAU,wCAAwC,CAAC;QACvG,SAAS,EAAE,KAAK,CAAC,KAAK,EAAE,8BAA8B,UAAU,sBAAsB,CAAC;QACvF,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE,8BAA8B,UAAU,wCAAwC,CAAC;QACvG,iBAAiB,EAAE,OAAO;QAC1B,aAAa,EAAE,KAAK,CAAC,KAAK,EAAE,8BAA8B,UAAU,uCAAuC,CAAC;QAC5G,QAAQ,EAAE,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI;QAC7B,aAAa,EAAE,KAAK,CAAC,MAAM;QAC3B,YAAY,EAAE,UAAU,CAAC,YAAY,CAAC,MAAM;QAC5C,SAAS,EAAE,UAAU,CAAC,SAAS;QAC/B,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,SAAS,EAAE,UAAU,CAAC,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,MAAM;KAC5D,CAAA;AACH,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,KAAY,EAAE,UAAmB,EAAE,EAAU,EAAE;IACnE,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAClC,OAAO;QACL,YAAY,EAAE,UAAU,CAAC,YAAY;QACrC,UAAU,EAAE,UAAU,CAAC,UAAU;QACjC,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,IAAI,gBAAgB,EAAE,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3F,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE;yBACE,UAAU;;KAE9B,CAAC;QACF,aAAa,EAAE,iBAAiB,CAAC,KAAK,CAAC;QACvC,QAAQ,EAAE,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;KACtC,CAAA;AACH,CAAC,CAAA"}
@@ -0,0 +1,31 @@
1
+ /** Deterministic TypeScript client generation from §20 EXPECTS claims (spec §20.4). */
2
+ import type { Store } from '@cavelang/store';
3
+ export declare const clientFormatVersion: 1;
4
+ export type ClientField = {
5
+ readonly type: string;
6
+ readonly typeName: string;
7
+ readonly kind: 'attribute' | 'relation';
8
+ readonly name: string;
9
+ readonly cardinality: 'some' | 'one';
10
+ readonly unit?: string;
11
+ /** Physical verb used by store traversal. */
12
+ readonly primary?: string;
13
+ /** Whether the authored relation reads from the physical object side. */
14
+ readonly inverse?: boolean;
15
+ };
16
+ export type GeneratedClient = {
17
+ readonly ok: true;
18
+ readonly version: typeof clientFormatVersion;
19
+ readonly digest: string;
20
+ readonly fields: readonly ClientField[];
21
+ readonly code: string;
22
+ };
23
+ export type ClientGenerationFailure = {
24
+ readonly ok: false;
25
+ readonly problems: readonly string[];
26
+ };
27
+ export type ClientGeneration = GeneratedClient | ClientGenerationFailure;
28
+ export declare const generateClient: (store: Store, options?: {
29
+ version?: number;
30
+ }) => ClientGeneration;
31
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAAA,uFAAuF;AAIvF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAI5C,eAAO,MAAM,mBAAmB,EAAG,CAAU,CAAA;AAE7C,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,IAAI,EAAE,WAAW,GAAG,UAAU,CAAA;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,KAAK,CAAA;IACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,6CAA6C;IAC7C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,yEAAyE;IACzE,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAC3B,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAA;IACjB,QAAQ,CAAC,OAAO,EAAE,OAAO,mBAAmB,CAAA;IAC5C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAA;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB,CAAA;AAED,MAAM,MAAM,uBAAuB,GAAG;IACpC,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAA;IAClB,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;CACrC,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG,eAAe,GAAG,uBAAuB,CAAA;AAkKxE,eAAO,MAAM,cAAc,GACzB,OAAO,KAAK,EACZ,UAAS;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,KACjC,gBAkBF,CAAA"}
@@ -0,0 +1,170 @@
1
+ /** Deterministic TypeScript client generation from §20 EXPECTS claims (spec §20.4). */
2
+ import { createHash } from 'node:crypto';
3
+ import { Registry } from '@cavelang/canonical';
4
+ import { expectations } from "./check.js";
5
+ export const clientFormatVersion = 1;
6
+ const identifierOf = (type) => {
7
+ const words = type.split(/[^A-Za-z0-9]+/).filter(Boolean);
8
+ if (words.length === 0) {
9
+ return undefined;
10
+ }
11
+ const name = words.map(word => word[0].toUpperCase() + word.slice(1)).join('');
12
+ return /^[0-9]/.test(name) ? `_${name}` : name;
13
+ };
14
+ const compare = (a, b) => a < b ? -1 : a > b ? 1 : 0;
15
+ const tagsOf = (store, expectation) => store.db.prepare('SELECT key, value FROM cave_tag WHERE claim_id = ? ORDER BY rowid')
16
+ .all(expectation.row.id);
17
+ const normalizedFields = (store) => {
18
+ const problems = [];
19
+ const typeNames = new Map();
20
+ const fields = new Map();
21
+ const declarations = [...expectations(store)].sort((a, b) => compare(a.type, b.type) || compare(a.kind, b.kind) || compare(a.name, b.name) ||
22
+ compare(a.row.claim_key, b.row.claim_key));
23
+ for (const expectation of declarations) {
24
+ const typeName = identifierOf(expectation.type);
25
+ if (typeName === undefined) {
26
+ problems.push(`${expectation.type} cannot become a TypeScript type name`);
27
+ continue;
28
+ }
29
+ const priorType = typeNames.get(typeName);
30
+ if (priorType !== undefined && priorType !== expectation.type) {
31
+ problems.push(`types ${JSON.stringify(priorType)} and ${JSON.stringify(expectation.type)} both generate ${typeName}`);
32
+ continue;
33
+ }
34
+ typeNames.set(typeName, expectation.type);
35
+ const tags = tagsOf(store, expectation);
36
+ const cardinalities = tags.filter(tag => tag.key === 'cardinality').map(tag => tag.value);
37
+ const units = tags.filter(tag => tag.key === 'unit').map(tag => tag.value);
38
+ if (cardinalities.length > 1 || cardinalities.some(value => value !== 'one' && value !== 'some')) {
39
+ problems.push(`${expectation.type} EXPECTS ${expectation.name}: cardinality must be one or some, at most once`);
40
+ continue;
41
+ }
42
+ if (units.length > 1 || units.some(value => value === null || value === '')) {
43
+ problems.push(`${expectation.type} EXPECTS ${expectation.name}: unit must have one non-empty value`);
44
+ continue;
45
+ }
46
+ if (expectation.kind === 'relation' && units.length > 0) {
47
+ problems.push(`${expectation.type} EXPECTS ${expectation.name}: relation expectations cannot declare #unit`);
48
+ continue;
49
+ }
50
+ const relation = expectation.kind === 'relation' ?
51
+ Registry.primaryOf(store.registry(), expectation.name) : undefined;
52
+ const field = {
53
+ type: expectation.type,
54
+ typeName,
55
+ kind: expectation.kind,
56
+ name: expectation.name,
57
+ cardinality: cardinalities[0] === 'one' ? 'one' : 'some',
58
+ ...units[0] === undefined || units[0] === null ? {} : { unit: units[0] },
59
+ ...relation === undefined ? {} : { primary: relation.primary, inverse: relation.isInverse }
60
+ };
61
+ const key = `${field.type}\0${field.kind}\0${field.name}`;
62
+ const prior = fields.get(key);
63
+ if (prior !== undefined && JSON.stringify(prior) !== JSON.stringify(field)) {
64
+ problems.push(`${expectation.type} EXPECTS ${expectation.name}: conflicting current declarations`);
65
+ continue;
66
+ }
67
+ fields.set(key, field);
68
+ }
69
+ return { fields: [...fields.values()], problems: [...new Set(problems)].sort() };
70
+ };
71
+ const q = (text) => JSON.stringify(text);
72
+ const valueType = (field) => `CaveValue<${field.unit === undefined ? 'undefined' : q(field.unit)}>`;
73
+ const propertyType = (field) => {
74
+ const value = field.kind === 'attribute' ? valueType(field) : 'string';
75
+ return field.cardinality === 'one' ? value : `readonly ${value}[]`;
76
+ };
77
+ const expression = (field) => {
78
+ const values = field.kind === 'attribute' ?
79
+ `attributeValues<${field.unit === undefined ? 'undefined' : q(field.unit)}>(store, entity, ${q(field.name)}, ` +
80
+ `${field.unit === undefined ? 'undefined' : q(field.unit)})` :
81
+ `relationValues(store, entity, ${q(field.primary)}, ${field.inverse === true})`;
82
+ return field.cardinality === 'one' ?
83
+ `one(${values}, ${q(`${field.type}.${field.name}`)})` : values;
84
+ };
85
+ const emit = (fields, digest) => {
86
+ const groups = new Map();
87
+ for (const field of fields) {
88
+ groups.set(field.type, [...groups.get(field.type) ?? [], field]);
89
+ }
90
+ const types = [...groups.entries()].sort(([a], [b]) => compare(a, b));
91
+ const declarations = types.flatMap(([type, typeFields]) => {
92
+ const typeName = typeFields[0].typeName;
93
+ return [
94
+ `export interface ${typeName} {`,
95
+ ...typeFields.map(field => ` readonly ${q(field.name)}: ${propertyType(field)}`),
96
+ '}',
97
+ '',
98
+ `export const read${typeName} = (store: Store, entity: string): ${typeName} => ({`,
99
+ ...typeFields.map(field => ` ${q(field.name)}: ${expression(field)},`),
100
+ '})',
101
+ ''
102
+ ];
103
+ });
104
+ return [
105
+ `// Generated by CAVE typed-client/v${clientFormatVersion}; do not edit.`,
106
+ `// Schema SHA-256: ${digest}`,
107
+ `import { QuerySql, type Store } from '@cavelang/store'`,
108
+ '',
109
+ `export const caveClientFormatVersion = ${clientFormatVersion} as const`,
110
+ `export const caveSchemaDigest = ${q(digest)} as const`,
111
+ `export const caveSchema = ${JSON.stringify(fields, undefined, 2)} as const`,
112
+ '',
113
+ 'export type CaveValue<Unit extends string | undefined = undefined> = {',
114
+ ' readonly text: string',
115
+ ' readonly number: number | null',
116
+ ' readonly unit: Unit extends string ? Unit : string | null',
117
+ '}',
118
+ '',
119
+ 'const currentSql = QuerySql.current()',
120
+ '',
121
+ 'const attributeValues = <Unit extends string | undefined>(',
122
+ ' store: Store, entity: string, attribute: string, expectedUnit: Unit',
123
+ '): CaveValue<Unit>[] => {',
124
+ ' const values = store.db.prepare(`',
125
+ ' SELECT c.value_text AS text, c.value_num AS number, c.value_unit AS unit',
126
+ ' FROM (${currentSql}) c',
127
+ " WHERE c.subject = ? AND c.verb = 'HAS' AND c.attribute = ?",
128
+ ' AND c.negated = 0 AND c.conf > 0 ORDER BY c.tx',
129
+ ' `).all(entity, attribute) as unknown as CaveValue<Unit>[]',
130
+ ' if (expectedUnit !== undefined && values.some(value => value.unit !== expectedUnit)) {',
131
+ ' throw new Error(`CAVE generated client: ${entity}.${attribute} expected unit ${expectedUnit}`)',
132
+ ' }',
133
+ ' return values',
134
+ '}',
135
+ '',
136
+ 'const relationValues = (store: Store, entity: string, primary: string, inverse: boolean): string[] =>',
137
+ ' inverse ?',
138
+ ' store.reverse(entity).filter(fact => fact.verb === primary).map(fact => fact.source) :',
139
+ ' store.forward(entity).filter(fact => fact.verb === primary).map(fact => fact.target)',
140
+ '',
141
+ 'const one = <T>(values: readonly T[], field: string): T => {',
142
+ ' if (values.length !== 1) {',
143
+ ' throw new Error(`CAVE generated client: ${field} expected exactly one value, got ${values.length}`)',
144
+ ' }',
145
+ ' return values[0]!',
146
+ '}',
147
+ '',
148
+ ...declarations
149
+ ].join('\n');
150
+ };
151
+ export const generateClient = (store, options = {}) => {
152
+ const version = options.version ?? clientFormatVersion;
153
+ if (version !== clientFormatVersion) {
154
+ return { ok: false, problems: [`unsupported typed-client format version ${version}; supported: ${clientFormatVersion}`] };
155
+ }
156
+ const normalized = normalizedFields(store);
157
+ if (normalized.problems.length > 0) {
158
+ return { ok: false, problems: normalized.problems };
159
+ }
160
+ const schema = JSON.stringify({ version, fields: normalized.fields });
161
+ const digest = createHash('sha256').update(schema).digest('hex');
162
+ return {
163
+ ok: true,
164
+ version: clientFormatVersion,
165
+ digest,
166
+ fields: normalized.fields,
167
+ code: emit(normalized.fields, digest)
168
+ };
169
+ };
170
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Write gating (spec §20.3): append, check, and roll back when the append
3
+ * introduces shape violations that were not present before. Pre-existing
4
+ * violations never block — the gate compares, it does not demand a clean
5
+ * store. `cave add --check` is the first enforcement point; action
6
+ * preconditions reuse the same mechanism.
7
+ */
8
+ import type { AppendOptions, IngestResult, Store } from '@cavelang/store';
9
+ import type { Violation } from './check.ts';
10
+ export type GateResult = {
11
+ readonly ok: true;
12
+ readonly result: IngestResult;
13
+ }
14
+ /** The append was rolled back; `violations` are the ones it would have introduced. */
15
+ | {
16
+ readonly ok: false;
17
+ readonly violations: readonly Violation[];
18
+ };
19
+ /**
20
+ * Identity of a violation for before/after comparison — shared with
21
+ * `@cavelang/cli/act`, whose executions run inside the same gate (spec §25.3).
22
+ */
23
+ export declare const violationKey: (violation: Violation) => string;
24
+ /**
25
+ * Ingests CAVE text through the shape gate: parse problems behave exactly
26
+ * like `store.ingest` (lenient by default, `strict` throws), and an append
27
+ * that introduces new violations — including against expectations the text
28
+ * itself declares — is rolled back atomically, registry included.
29
+ */
30
+ export declare const gatedIngest: (store: Store, text: string, options?: {
31
+ strict?: boolean;
32
+ } & AppendOptions) => GateResult;
33
+ //# sourceMappingURL=gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../../src/gate.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAEzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAE3C,MAAM,MAAM,UAAU,GAClB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;CAAE;AACtD,sFAAsF;GACpF;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,SAAS,SAAS,EAAE,CAAA;CAAE,CAAA;AAErE;;;GAGG;AACH,eAAO,MAAM,YAAY,GAAI,WAAW,SAAS,KAAG,MAC8D,CAAA;AASlH;;;;;GAKG;AACH,eAAO,MAAM,WAAW,GAAI,OAAO,KAAK,EAAE,MAAM,MAAM,EAAE,UAAS;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,aAAkB,KAAG,UAiB5G,CAAA"}
Binary file
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate.js","sourceRoot":"","sources":["../../src/gate.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAQrC;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,SAAoB,EAAU,EAAE,CAC3D,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAElH,wFAAwF;AACxF,MAAM,QAAQ,GAAG,MAAM,CAAC,0BAA0B,CAAC,CAAA;AAGnD,MAAM,UAAU,GAAG,CAAC,KAAc,EAAqB,EAAE,CACvD,KAAK,YAAY,KAAK,IAAI,QAAQ,IAAI,KAAK,CAAA;AAE7C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAY,EAAE,IAAY,EAAE,UAAgD,EAAE,EAAc,EAAE;IACxH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAA;IACpE,IAAI,CAAC;QACH,OAAO,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;YAC5B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;YAC1C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;YAClG,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,eAAe,KAAK,CAAC,MAAM,mBAAmB,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;YACvG,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;QAC7B,CAAC,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAA;QACnD,CAAC;QACD,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC,CAAA"}