trellis 3.1.35 → 3.2.2

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 (287) hide show
  1. package/CHANGELOG.md +23 -5
  2. package/README.md +63 -156
  3. package/bin/trellis.mjs +2 -75
  4. package/dist/{better-sqlite-backend-ahx5p0br.js → better-sqlite-backend-2P4F6AOJ.js} +91 -29
  5. package/dist/boot-middleware-MHLHFCUC.js +9 -0
  6. package/dist/browser/index.d.ts +18 -0
  7. package/dist/browser/index.d.ts.map +1 -0
  8. package/dist/browser/index.js +95 -0
  9. package/dist/{index-53f3b8p8.js → chunk-2W3MHTMG.js} +552 -213
  10. package/dist/chunk-44FFQKQX.js +142 -0
  11. package/dist/chunk-4HYPLFJD.js +150 -0
  12. package/dist/chunk-4XIVMVHC.js +361 -0
  13. package/dist/{index-yp88he8n.js → chunk-6CTA6MCE.js} +88 -64
  14. package/dist/chunk-6GEZ6DN5.js +394 -0
  15. package/dist/chunk-7ZFRVCUE.js +211 -0
  16. package/dist/chunk-CAG4FULI.js +121 -0
  17. package/dist/chunk-FF36CQHZ.js +61 -0
  18. package/dist/{index-h32txmxe.js → chunk-FKQO5A3H.js} +6 -13
  19. package/dist/{index-nq520y6k.js → chunk-FWRS4CSC.js} +46 -32
  20. package/dist/chunk-GFZCJ4EH.js +108 -0
  21. package/dist/chunk-GLM4HGN4.js +55 -0
  22. package/dist/{index-4cdr7x2x.js → chunk-GU374KWZ.js} +182 -111
  23. package/dist/chunk-H6JB3PZ3.js +45 -0
  24. package/dist/chunk-IZX2PLIB.js +1240 -0
  25. package/dist/chunk-J2TXUFCZ.js +289 -0
  26. package/dist/chunk-J3WYZO3Q.js +211 -0
  27. package/dist/{index-xzym9w0m.js → chunk-JA7AIHRK.js} +12 -7
  28. package/dist/chunk-JHHEXEDM.js +162 -0
  29. package/dist/chunk-JUEMDWLU.js +233 -0
  30. package/dist/chunk-KFQGP6VL.js +33 -0
  31. package/dist/chunk-KIJITUZB.js +419 -0
  32. package/dist/{index-4wxa8xz4.js → chunk-KQ4A2D2P.js} +162 -23
  33. package/dist/chunk-KSU2GW22.js +958 -0
  34. package/dist/{index-rv1p47gp.js → chunk-L5N5PR2S.js} +3015 -2480
  35. package/dist/{index-h9e2efx4.js → chunk-LNUIGRDZ.js} +71 -55
  36. package/dist/{index-skhn0agf.js → chunk-MLC5BUYO.js} +19 -20
  37. package/dist/chunk-MPXUVGT3.js +104 -0
  38. package/dist/chunk-N6MYZT4O.js +68 -0
  39. package/dist/chunk-O2AV5WMN.js +48 -0
  40. package/dist/chunk-PZ4XYZ4J.js +143 -0
  41. package/dist/chunk-QB5ISE47.js +419 -0
  42. package/dist/chunk-RSWUFTO2.js +857 -0
  43. package/dist/chunk-S3XLFZ27.js +1095 -0
  44. package/dist/{index-w5wccer3.js → chunk-S6GBJ2ZB.js} +28 -12
  45. package/dist/{index-7pjz3tsy.js → chunk-SGMDTWJJ.js} +57 -15
  46. package/dist/chunk-SPSPV5BC.js +390 -0
  47. package/dist/chunk-TCKXSOBP.js +123 -0
  48. package/dist/chunk-UBGUDMUV.js +59 -0
  49. package/dist/{index-wt8rz4gn.js → chunk-UQISRW6T.js} +97 -26
  50. package/dist/chunk-USEINYUL.js +12 -0
  51. package/dist/{index-bmyt7k8n.js → chunk-UZRUP7QW.js} +12 -4
  52. package/dist/{index-xhcp6xrn.js → chunk-VBYUTRXX.js} +695 -514
  53. package/dist/{index-vkpkfwhq.js → chunk-VDAKEOML.js} +234 -194
  54. package/dist/chunk-WXSWA3MV.js +0 -0
  55. package/dist/{index-n9f2qyh5.js → chunk-X5FLTRUB.js} +55 -33
  56. package/dist/{index-h7zxhhhh.js → chunk-XMQ7G77X.js} +46 -38
  57. package/dist/{index-w7ng765c.js → chunk-YCM7ZYEZ.js} +102 -49
  58. package/dist/cli/deploy-cli.d.ts +18 -0
  59. package/dist/cli/deploy-cli.d.ts.map +1 -0
  60. package/dist/cli/errors.d.ts +6 -0
  61. package/dist/cli/errors.d.ts.map +1 -0
  62. package/dist/cli/examples.d.ts +23 -0
  63. package/dist/cli/examples.d.ts.map +1 -0
  64. package/dist/cli/index.d.ts +1 -1
  65. package/dist/cli/index.d.ts.map +1 -1
  66. package/dist/cli/index.js +2426 -6225
  67. package/dist/client/index.browser.d.ts +29 -0
  68. package/dist/client/index.browser.d.ts.map +1 -0
  69. package/dist/client/index.browser.js +64 -0
  70. package/dist/client/index.d.ts +6 -1
  71. package/dist/client/index.d.ts.map +1 -1
  72. package/dist/client/index.js +41 -21
  73. package/dist/client/live.d.ts +67 -0
  74. package/dist/client/live.d.ts.map +1 -0
  75. package/dist/client/reactive.d.ts +31 -0
  76. package/dist/client/reactive.d.ts.map +1 -0
  77. package/dist/client/sdk.browser.d.ts +104 -0
  78. package/dist/client/sdk.browser.d.ts.map +1 -0
  79. package/dist/client/sdk.browser.js +9 -0
  80. package/dist/client/sdk.d.ts +26 -2
  81. package/dist/client/sdk.d.ts.map +1 -1
  82. package/dist/client/sdk.js +9 -0
  83. package/dist/client/vcs-client.d.ts +129 -0
  84. package/dist/client/vcs-client.d.ts.map +1 -0
  85. package/dist/cms/index.js +171 -163
  86. package/dist/{config-8hczw0rs.js → config-PFTP67TR.js} +8 -9
  87. package/dist/core/computation/index.d.ts +5 -0
  88. package/dist/core/computation/index.d.ts.map +1 -0
  89. package/dist/core/computation/rollup.d.ts +18 -0
  90. package/dist/core/computation/rollup.d.ts.map +1 -0
  91. package/dist/core/index.d.ts +5 -0
  92. package/dist/core/index.d.ts.map +1 -1
  93. package/dist/core/index.js +171 -104
  94. package/dist/core/kernel/boot-middleware.d.ts +10 -0
  95. package/dist/core/kernel/boot-middleware.d.ts.map +1 -0
  96. package/dist/core/kernel/logic-middleware.d.ts +7 -1
  97. package/dist/core/kernel/logic-middleware.d.ts.map +1 -1
  98. package/dist/core/kernel/trellis-kernel.d.ts.map +1 -1
  99. package/dist/core/ontology/types.d.ts +5 -0
  100. package/dist/core/ontology/types.d.ts.map +1 -1
  101. package/dist/core/persist/better-sqlite-backend.d.ts +9 -2
  102. package/dist/core/persist/better-sqlite-backend.d.ts.map +1 -1
  103. package/dist/core/persist/factory.d.ts +6 -7
  104. package/dist/core/persist/factory.d.ts.map +1 -1
  105. package/dist/core/persist/factory.js +2 -3
  106. package/dist/core/persist/sqljs-backend.js +2 -3
  107. package/dist/db/index.d.ts +4 -1
  108. package/dist/db/index.d.ts.map +1 -1
  109. package/dist/db/index.js +67 -54
  110. package/dist/db/inspector.js +11 -19
  111. package/dist/db/trellis.css +1 -1
  112. package/dist/decisions/index.js +9 -10
  113. package/dist/deploy-LQ7GUGJ5.js +9 -0
  114. package/dist/deploy-YNVG5E4E.js +9 -0
  115. package/dist/deploy-cli-24BCHAXY.js +67 -0
  116. package/dist/deploy-cli-C35HTITO.js +67 -0
  117. package/dist/embeddings/auto-embed.d.ts +2 -2
  118. package/dist/embeddings/auto-embed.d.ts.map +1 -1
  119. package/dist/embeddings/index.js +20 -22
  120. package/dist/embeddings/search.d.ts +2 -1
  121. package/dist/embeddings/search.d.ts.map +1 -1
  122. package/dist/embeddings/store.d.ts +25 -4
  123. package/dist/embeddings/store.d.ts.map +1 -1
  124. package/dist/engine.d.ts +59 -19
  125. package/dist/engine.d.ts.map +1 -1
  126. package/dist/import-UZEKXU3B.js +10 -0
  127. package/dist/index.js +102 -93
  128. package/dist/launch-explorer-HZ4ZJA4X.js +95 -0
  129. package/dist/links/index.js +24 -26
  130. package/dist/mcp/server.d.ts.map +1 -1
  131. package/dist/plugins/agent-memory/index.js +316 -0
  132. package/dist/plugins/idea-garden/index.js +165 -0
  133. package/dist/plugins/plan-approval/index.js +579 -0
  134. package/dist/plugins/proactive-watcher/index.js +194 -0
  135. package/dist/{index-2r4jxwnb.js → query-XYLTJYSA.js} +14 -15
  136. package/dist/react/index.js +39 -70
  137. package/dist/react/realtime.js +11 -0
  138. package/dist/react/schema-hooks.js +87 -0
  139. package/dist/realtime/broadcast-channel-transport.d.ts +43 -0
  140. package/dist/realtime/broadcast-channel-transport.d.ts.map +1 -0
  141. package/dist/realtime/durable-object-relay-transport.d.ts +96 -0
  142. package/dist/realtime/durable-object-relay-transport.d.ts.map +1 -0
  143. package/dist/realtime/index.d.ts +44 -0
  144. package/dist/realtime/index.d.ts.map +1 -0
  145. package/dist/realtime/index.js +40 -0
  146. package/dist/realtime/memory-hub.d.ts +32 -0
  147. package/dist/realtime/memory-hub.d.ts.map +1 -0
  148. package/dist/realtime/persistent-channel.d.ts +105 -0
  149. package/dist/realtime/persistent-channel.d.ts.map +1 -0
  150. package/dist/realtime/presence.d.ts +73 -0
  151. package/dist/realtime/presence.d.ts.map +1 -0
  152. package/dist/realtime/relay-persistence.d.ts +37 -0
  153. package/dist/realtime/relay-persistence.d.ts.map +1 -0
  154. package/dist/realtime/relay-persistence.js +107 -0
  155. package/dist/realtime/relay-server.d.ts +103 -0
  156. package/dist/realtime/relay-server.d.ts.map +1 -0
  157. package/dist/realtime/room.d.ts +98 -0
  158. package/dist/realtime/room.d.ts.map +1 -0
  159. package/dist/realtime/text.d.ts +73 -0
  160. package/dist/realtime/text.d.ts.map +1 -0
  161. package/dist/realtime/types.d.ts +89 -0
  162. package/dist/realtime/types.d.ts.map +1 -0
  163. package/dist/realtime/websocket-relay-transport.d.ts +28 -0
  164. package/dist/realtime/websocket-relay-transport.d.ts.map +1 -0
  165. package/dist/realtime.bundle.js +1100 -0
  166. package/dist/{remote-manager-xvbg4230.js → remote-manager-ODE3T2KR.js} +25 -15
  167. package/dist/scaffold/seed.d.ts.map +1 -1
  168. package/dist/scaffold/write.d.ts +1 -1
  169. package/dist/scaffold/write.d.ts.map +1 -1
  170. package/dist/schema/define.d.ts +137 -0
  171. package/dist/schema/define.d.ts.map +1 -0
  172. package/dist/schema/entity-projection.d.ts +34 -0
  173. package/dist/schema/entity-projection.d.ts.map +1 -0
  174. package/dist/schema/eql.d.ts +46 -0
  175. package/dist/schema/eql.d.ts.map +1 -0
  176. package/dist/schema/index.d.ts +21 -0
  177. package/dist/schema/index.d.ts.map +1 -0
  178. package/dist/schema/index.js +46 -0
  179. package/dist/schema/kernel-resolve.d.ts +21 -0
  180. package/dist/schema/kernel-resolve.d.ts.map +1 -0
  181. package/dist/schema/mutations.d.ts +20 -0
  182. package/dist/schema/mutations.d.ts.map +1 -0
  183. package/dist/schema/resolve.d.ts +21 -0
  184. package/dist/schema/resolve.d.ts.map +1 -0
  185. package/dist/server/deploy-meta.d.ts +25 -0
  186. package/dist/server/deploy-meta.d.ts.map +1 -0
  187. package/dist/server/deploy.d.ts +7 -2
  188. package/dist/server/deploy.d.ts.map +1 -1
  189. package/dist/server/index.d.ts +7 -2
  190. package/dist/server/index.d.ts.map +1 -1
  191. package/dist/server/index.js +100 -58
  192. package/dist/server/node-adapter.js +5 -104
  193. package/dist/server/realtime.d.ts +14 -3
  194. package/dist/server/realtime.d.ts.map +1 -1
  195. package/dist/server/server.d.ts +8 -16
  196. package/dist/server/server.d.ts.map +1 -1
  197. package/dist/server/sprites.d.ts +18 -1
  198. package/dist/server/sprites.d.ts.map +1 -1
  199. package/dist/server/tenancy.d.ts +4 -0
  200. package/dist/server/tenancy.d.ts.map +1 -1
  201. package/dist/server/usage-meter.d.ts +53 -0
  202. package/dist/server/usage-meter.d.ts.map +1 -0
  203. package/dist/server-MB3OPSPI.js +18 -0
  204. package/dist/server-ZVWGLLRF.js +18 -0
  205. package/dist/sprites-KQGTGM6W.js +27 -0
  206. package/dist/{sprites-vc4qbrp1.js → sprites-RU3E4XQN.js} +6 -7
  207. package/dist/svelte/index.d.ts +17 -0
  208. package/dist/svelte/index.d.ts.map +1 -0
  209. package/dist/svelte/index.js +51 -0
  210. package/dist/svelte/schema-hooks.d.ts +45 -0
  211. package/dist/svelte/schema-hooks.d.ts.map +1 -0
  212. package/dist/svelte/schema-hooks.js +71 -0
  213. package/dist/svelte/stores.d.ts +78 -0
  214. package/dist/svelte/stores.d.ts.map +1 -0
  215. package/dist/sync/http-transport.d.ts +3 -3
  216. package/dist/sync/http-transport.d.ts.map +1 -1
  217. package/dist/sync/index.d.ts +15 -1
  218. package/dist/sync/index.d.ts.map +1 -1
  219. package/dist/sync/index.js +617 -0
  220. package/dist/sync/memory-room.d.ts +37 -0
  221. package/dist/sync/memory-room.d.ts.map +1 -0
  222. package/dist/sync/memory-transport.d.ts +3 -3
  223. package/dist/sync/memory-transport.d.ts.map +1 -1
  224. package/dist/sync/partykit-room.d.ts +40 -0
  225. package/dist/sync/partykit-room.d.ts.map +1 -0
  226. package/dist/sync/partykit-transport.d.ts +84 -0
  227. package/dist/sync/partykit-transport.d.ts.map +1 -0
  228. package/dist/sync/room-core.d.ts +53 -0
  229. package/dist/sync/room-core.d.ts.map +1 -0
  230. package/dist/sync/sync-engine.d.ts +40 -2
  231. package/dist/sync/sync-engine.d.ts.map +1 -1
  232. package/dist/sync/sync-room-server.d.ts +39 -0
  233. package/dist/sync/sync-room-server.d.ts.map +1 -0
  234. package/dist/sync/types.d.ts +70 -3
  235. package/dist/sync/types.d.ts.map +1 -1
  236. package/dist/sync/vcs-sync-peer.d.ts +63 -0
  237. package/dist/sync/vcs-sync-peer.d.ts.map +1 -0
  238. package/dist/sync/ws-transport.d.ts +2 -2
  239. package/dist/sync/ws-transport.d.ts.map +1 -1
  240. package/dist/tenancy-NBLLGCNJ.js +14 -0
  241. package/dist/tenancy-POMWQP6M.js +16 -0
  242. package/dist/ui/client.html +355 -67
  243. package/dist/ui/launch-explorer.d.ts +22 -0
  244. package/dist/ui/launch-explorer.d.ts.map +1 -0
  245. package/dist/ui/server.d.ts +1 -1
  246. package/dist/ui/server.d.ts.map +1 -1
  247. package/dist/vcs/blob-store.d.ts.map +1 -1
  248. package/dist/vcs/idb-op-log.d.ts +67 -0
  249. package/dist/vcs/idb-op-log.d.ts.map +1 -0
  250. package/dist/vcs/index.d.ts +1 -0
  251. package/dist/vcs/index.d.ts.map +1 -1
  252. package/dist/vcs/index.js +81 -72
  253. package/dist/vcs/issue.d.ts +22 -5
  254. package/dist/vcs/issue.d.ts.map +1 -1
  255. package/dist/vcs/lane-materialize.d.ts +5 -0
  256. package/dist/vcs/lane-materialize.d.ts.map +1 -1
  257. package/dist/vcs/op-log.d.ts +28 -2
  258. package/dist/vcs/op-log.d.ts.map +1 -1
  259. package/dist/vcs/ops.d.ts +10 -0
  260. package/dist/vcs/ops.d.ts.map +1 -1
  261. package/dist/vcs/types.d.ts +2 -0
  262. package/dist/vcs/types.d.ts.map +1 -1
  263. package/dist/{vm-config-6xhsj6b3.js → vm-config-JI4OXKDQ.js} +9 -10
  264. package/dist/vue/hooks.d.ts +64 -0
  265. package/dist/vue/hooks.d.ts.map +1 -0
  266. package/dist/vue/index.d.ts +19 -0
  267. package/dist/vue/index.d.ts.map +1 -0
  268. package/dist/vue/index.js +59 -0
  269. package/dist/vue/schema-hooks.d.ts +41 -0
  270. package/dist/vue/schema-hooks.d.ts.map +1 -0
  271. package/dist/vue/schema-hooks.js +64 -0
  272. package/package.json +130 -17
  273. package/dist/deploy-999q207z.js +0 -10
  274. package/dist/engine-y0724kjq.js +0 -8
  275. package/dist/import-s2b8e0ft.js +0 -11
  276. package/dist/index-a76rekgs.js +0 -67
  277. package/dist/index-c9h37r6h.js +0 -1
  278. package/dist/index-hr9qvv77.js +0 -860
  279. package/dist/index-k5b0xskw.js +0 -1
  280. package/dist/index-nzb3am4f.js +0 -80
  281. package/dist/index-wncptktd.js +0 -292
  282. package/dist/index-y6a4kj0p.js +0 -43
  283. package/dist/index-yhwjgfvj.js +0 -342
  284. package/dist/sdk-bepky0xs.js +0 -16
  285. package/dist/server-szdjx0nt.js +0 -13
  286. package/dist/sqlite-backend-0vsmc6qj.js +0 -8
  287. package/dist/tenancy-pjm32b4v.js +0 -14
package/dist/cms/index.js CHANGED
@@ -1,28 +1,6 @@
1
- // @bun
2
- import"../index-a76rekgs.js";
1
+ import "../chunk-KFQGP6VL.js";
3
2
 
4
3
  // src/cms/internal.ts
5
- var SYSTEM_TYPES = new Set([
6
- "issue",
7
- "agent",
8
- "project",
9
- "memory",
10
- "mcp",
11
- "sprite",
12
- "workunit",
13
- "cycle",
14
- "epic",
15
- "roadmap",
16
- "suggestion",
17
- "file",
18
- "directory",
19
- "op",
20
- "branch",
21
- "decision",
22
- "session",
23
- "typeschema",
24
- "field"
25
- ]);
26
4
  function typeKey(type) {
27
5
  return type.trim().toLowerCase();
28
6
  }
@@ -31,8 +9,7 @@ function entryFromFacts(entity, facts, links) {
31
9
  let status = "draft";
32
10
  let cmsStatusSeen = false;
33
11
  for (const f of facts) {
34
- if (f.a === "type")
35
- continue;
12
+ if (f.a === "type") continue;
36
13
  if (f.a === "cms_status") {
37
14
  status = f.v === "published" ? "published" : "draft";
38
15
  cmsStatusSeen = true;
@@ -41,62 +18,54 @@ function entryFromFacts(entity, facts, links) {
41
18
  fields[f.a] = f.v;
42
19
  }
43
20
  if (!cmsStatusSeen) {
44
- if (fields.status === "published")
45
- status = "published";
46
- else if (fields.status === "draft")
47
- status = "draft";
21
+ if (fields.status === "published") status = "published";
22
+ else if (fields.status === "draft") status = "draft";
48
23
  }
49
24
  if (links) {
50
25
  for (const link of links) {
51
- if (link.e1 !== entity.id)
52
- continue;
53
- if (!(link.a in fields))
54
- fields[link.a] = link.e2;
26
+ if (link.e1 !== entity.id) continue;
27
+ if (!(link.a in fields)) fields[link.a] = link.e2;
55
28
  }
56
29
  }
57
30
  return { id: entity.id, type: entity.type, status, fields };
58
31
  }
59
32
  function groupFactsByEntity(facts) {
60
- const map = new Map;
33
+ const map = /* @__PURE__ */ new Map();
61
34
  for (const f of facts) {
62
35
  const list = map.get(f.e);
63
- if (list)
64
- list.push(f);
65
- else
66
- map.set(f.e, [f]);
36
+ if (list) list.push(f);
37
+ else map.set(f.e, [f]);
67
38
  }
68
39
  return map;
69
40
  }
70
41
  function groupLinksBySource(links) {
71
- const map = new Map;
42
+ const map = /* @__PURE__ */ new Map();
72
43
  for (const l of links) {
73
44
  const list = map.get(l.e1);
74
- if (list)
75
- list.push(l);
76
- else
77
- map.set(l.e1, [l]);
45
+ if (list) list.push(l);
46
+ else map.set(l.e1, [l]);
78
47
  }
79
48
  return map;
80
49
  }
81
50
  async function expandReferences(entries, expandKeys, fetchEntity) {
82
- const ids = new Set;
51
+ const ids = /* @__PURE__ */ new Set();
83
52
  for (const entry of entries) {
84
53
  for (const key of expandKeys) {
85
54
  const v = entry.fields[key];
86
- if (typeof v === "string")
87
- ids.add(v);
55
+ if (typeof v === "string") ids.add(v);
88
56
  }
89
57
  }
90
- if (ids.size === 0)
91
- return entries;
92
- const resolved = new Map;
93
- await Promise.all([...ids].map(async (id) => {
94
- try {
95
- resolved.set(id, await fetchEntity(id));
96
- } catch {
97
- resolved.set(id, null);
98
- }
99
- }));
58
+ if (ids.size === 0) return entries;
59
+ const resolved = /* @__PURE__ */ new Map();
60
+ await Promise.all(
61
+ [...ids].map(async (id) => {
62
+ try {
63
+ resolved.set(id, await fetchEntity(id));
64
+ } catch {
65
+ resolved.set(id, null);
66
+ }
67
+ })
68
+ );
100
69
  return entries.map((entry) => {
101
70
  const next = { ...entry.fields };
102
71
  for (const key of expandKeys) {
@@ -113,14 +82,13 @@ function fingerprint(value) {
113
82
  }
114
83
 
115
84
  // src/cms/formula.ts
116
- var OPS = new Set(["+", "-", "*", "/", "(", ")"]);
85
+ var OPS = /* @__PURE__ */ new Set(["+", "-", "*", "/", "(", ")"]);
117
86
  function num(value) {
118
87
  if (typeof value === "number")
119
- return Number.isFinite(value) ? value : undefined;
120
- if (typeof value !== "string" || value.trim() === "")
121
- return;
88
+ return Number.isFinite(value) ? value : void 0;
89
+ if (typeof value !== "string" || value.trim() === "") return void 0;
122
90
  const parsed = Number(value);
123
- return Number.isFinite(parsed) ? parsed : undefined;
91
+ return Number.isFinite(parsed) ? parsed : void 0;
124
92
  }
125
93
  function tokenize(expr) {
126
94
  const tokens = [];
@@ -138,16 +106,14 @@ function tokenize(expr) {
138
106
  }
139
107
  if (/\d|\./.test(ch)) {
140
108
  let end = i + 1;
141
- while (end < expr.length && /\d|\./.test(expr[end]))
142
- end++;
109
+ while (end < expr.length && /\d|\./.test(expr[end])) end++;
143
110
  const value = Number(expr.slice(i, end));
144
- if (!Number.isFinite(value))
145
- return;
111
+ if (!Number.isFinite(value)) return void 0;
146
112
  tokens.push(value);
147
113
  i = end;
148
114
  continue;
149
115
  }
150
- return;
116
+ return void 0;
151
117
  }
152
118
  return tokens;
153
119
  }
@@ -157,29 +123,25 @@ function parse(tokens) {
157
123
  const take = () => tokens[i++];
158
124
  const primary = () => {
159
125
  const token = take();
160
- if (typeof token === "number")
161
- return token;
162
- if (token === "+")
163
- return primary();
126
+ if (typeof token === "number") return token;
127
+ if (token === "+") return primary();
164
128
  if (token === "-") {
165
129
  const value2 = primary();
166
- return value2 === undefined ? undefined : -value2;
130
+ return value2 === void 0 ? void 0 : -value2;
167
131
  }
168
132
  if (token === "(") {
169
133
  const value2 = add();
170
- if (take() !== ")")
171
- return;
134
+ if (take() !== ")") return void 0;
172
135
  return value2;
173
136
  }
174
- return;
137
+ return void 0;
175
138
  };
176
139
  const mul = () => {
177
140
  let left = primary();
178
141
  while (peek() === "*" || peek() === "/") {
179
142
  const op = take();
180
143
  const right = primary();
181
- if (left === undefined || right === undefined)
182
- return;
144
+ if (left === void 0 || right === void 0) return void 0;
183
145
  left = op === "*" ? left * right : left / right;
184
146
  }
185
147
  return left;
@@ -189,26 +151,25 @@ function parse(tokens) {
189
151
  while (peek() === "+" || peek() === "-") {
190
152
  const op = take();
191
153
  const right = mul();
192
- if (left === undefined || right === undefined)
193
- return;
154
+ if (left === void 0 || right === void 0) return void 0;
194
155
  left = op === "+" ? left + right : left - right;
195
156
  }
196
157
  return left;
197
158
  };
198
159
  const value = add();
199
- if (i !== tokens.length || value === undefined || !Number.isFinite(value))
200
- return;
160
+ if (i !== tokens.length || value === void 0 || !Number.isFinite(value))
161
+ return void 0;
201
162
  return value;
202
163
  }
203
164
  function evaluateFormula(expr, fields) {
204
165
  const interpolated = expr.replace(/\{([^{}]+)\}/g, (match, key) => {
205
166
  const value = num(fields[key.trim()]);
206
- return value === undefined ? match : String(value);
167
+ return value === void 0 ? match : String(value);
207
168
  });
208
169
  if (interpolated.includes("{") || interpolated.includes("}"))
209
- return;
170
+ return void 0;
210
171
  const tokens = tokenize(interpolated);
211
- return tokens ? parse(tokens) : undefined;
172
+ return tokens ? parse(tokens) : void 0;
212
173
  }
213
174
  function keys(value) {
214
175
  const raw = value.replace(/^schema:/, "").trim();
@@ -219,15 +180,12 @@ function keys(value) {
219
180
  return [...new Set([lower, snake, compact].filter(Boolean))];
220
181
  }
221
182
  function parseFields(raw) {
222
- if (typeof raw !== "string")
223
- return [];
183
+ if (typeof raw !== "string") return [];
224
184
  try {
225
185
  const parsed = JSON.parse(raw);
226
- if (!Array.isArray(parsed))
227
- return [];
186
+ if (!Array.isArray(parsed)) return [];
228
187
  return parsed.filter((item) => {
229
- if (!item || typeof item !== "object")
230
- return false;
188
+ if (!item || typeof item !== "object") return false;
231
189
  const def = item;
232
190
  return typeof def.key === "string" && typeof def.type === "string";
233
191
  });
@@ -237,15 +195,18 @@ function parseFields(raw) {
237
195
  }
238
196
  function schemaFields(facts, names) {
239
197
  const wanted = new Set(names.flatMap(keys));
240
- const fact = facts.find((item) => item.e.startsWith("schema:") && item.a === "props" && keys(item.e).some((key) => wanted.has(key)));
198
+ const fact = facts.find(
199
+ (item) => item.e.startsWith("schema:") && item.a === "props" && keys(item.e).some((key) => wanted.has(key))
200
+ );
241
201
  return parseFields(fact?.v);
242
202
  }
243
203
  function applyFormulas(entry, defs) {
244
- const formulas = defs.filter((def) => def.type === "formula" && typeof def.formula === "string" && def.formula.trim());
245
- if (formulas.length === 0)
246
- return entry;
204
+ const formulas = defs.filter(
205
+ (def) => def.type === "formula" && typeof def.formula === "string" && def.formula.trim()
206
+ );
207
+ if (formulas.length === 0) return entry;
247
208
  const fields = { ...entry.fields };
248
- for (let pass = 0;pass < formulas.length; pass++) {
209
+ for (let pass = 0; pass < formulas.length; pass++) {
249
210
  for (const def of formulas)
250
211
  fields[def.key] = evaluateFormula(def.formula, fields);
251
212
  }
@@ -254,25 +215,27 @@ function applyFormulas(entry, defs) {
254
215
 
255
216
  // src/cms/client.ts
256
217
  var DEFAULT_BASE_PATH = "/trellis/store";
257
- var DEFAULT_POLL_MS = 2000;
218
+ var DEFAULT_POLL_MS = 2e3;
258
219
  var MIN_POLL_MS = 500;
259
- var MAX_FACTS_PER_FETCH = 5000;
260
- var MAX_ENTITIES_PER_FETCH = 1000;
220
+ var MAX_FACTS_PER_FETCH = 5e3;
221
+ var MAX_ENTITIES_PER_FETCH = 1e3;
261
222
  var defaultEquals = (prev, next) => fingerprint(prev) === fingerprint(next);
262
-
263
- class CmsClient {
223
+ var CmsClient = class {
264
224
  url;
265
225
  basePath;
266
226
  directory;
267
227
  pollIntervalMs;
268
228
  fetchFn;
269
229
  apiKey;
270
- subscriptions = new Map;
230
+ subscriptions = /* @__PURE__ */ new Map();
271
231
  constructor(opts) {
272
232
  this.url = opts.url.replace(/\/+$/, "");
273
233
  this.basePath = (opts.basePath ?? DEFAULT_BASE_PATH).replace(/\/+$/, "");
274
234
  this.directory = opts.directory;
275
- this.pollIntervalMs = Math.max(MIN_POLL_MS, opts.pollIntervalMs ?? DEFAULT_POLL_MS);
235
+ this.pollIntervalMs = Math.max(
236
+ MIN_POLL_MS,
237
+ opts.pollIntervalMs ?? DEFAULT_POLL_MS
238
+ );
276
239
  this.fetchFn = opts.fetch ?? globalThis.fetch.bind(globalThis);
277
240
  this.apiKey = opts.apiKey;
278
241
  }
@@ -282,25 +245,24 @@ class CmsClient {
282
245
  entry(id) {
283
246
  return new EntryRef(this, id);
284
247
  }
248
+ /** List CMS collections (TypeSchema entities marked cms=true). */
285
249
  async collections() {
286
250
  const [entities, facts] = await Promise.all([
287
251
  this._entities(),
288
252
  this._facts()
289
253
  ]);
290
254
  const factsByEntity = groupFactsByEntity(facts ?? []);
291
- const counts = new Map;
255
+ const counts = /* @__PURE__ */ new Map();
292
256
  for (const e of entities ?? []) {
293
257
  const k = typeKey(e.type);
294
258
  counts.set(k, (counts.get(k) ?? 0) + 1);
295
259
  }
296
- const out = new Map;
260
+ const out = /* @__PURE__ */ new Map();
297
261
  for (const e of entities ?? []) {
298
- if (e.type !== "TypeSchema")
299
- continue;
262
+ if (e.type !== "TypeSchema") continue;
300
263
  const efacts = factsByEntity.get(e.id) ?? [];
301
264
  const isCms = efacts.some((f) => f.a === "cms" && f.v === true);
302
- if (!isCms)
303
- continue;
265
+ if (!isCms) continue;
304
266
  const name = e.id.replace(/^schema:/, "");
305
267
  const k = typeKey(name);
306
268
  const labelFact = efacts.find((f) => f.a === "label");
@@ -321,12 +283,19 @@ class CmsClient {
321
283
  }
322
284
  this.subscriptions.clear();
323
285
  }
286
+ /**
287
+ * Shared polling subscription. Multiple subscribers to the same key share a
288
+ * single timer and one HTTP request per poll cycle. New subscribers receive
289
+ * the most recently fetched value immediately if one is cached.
290
+ *
291
+ * @internal
292
+ */
324
293
  _share(key, fetcher, callback, extras = {}) {
325
294
  let sub = this.subscriptions.get(key);
326
295
  if (!sub) {
327
296
  const fresh = {
328
- subscribers: new Set,
329
- interval: undefined,
297
+ subscribers: /* @__PURE__ */ new Set(),
298
+ interval: void 0,
330
299
  hasLast: false,
331
300
  fetcher
332
301
  };
@@ -343,14 +312,13 @@ class CmsClient {
343
312
  }
344
313
  }
345
314
  } catch (err) {
346
- for (const item2 of fresh.subscribers)
347
- item2.onError?.(err);
315
+ for (const item2 of fresh.subscribers) item2.onError?.(err);
348
316
  }
349
317
  };
350
318
  fresh.interval = setInterval(tick, this.pollIntervalMs);
351
319
  this.subscriptions.set(key, fresh);
352
320
  sub = fresh;
353
- tick();
321
+ void tick();
354
322
  }
355
323
  const item = {
356
324
  callback,
@@ -372,6 +340,7 @@ class CmsClient {
372
340
  }
373
341
  };
374
342
  }
343
+ /** @internal */
375
344
  async _get(path) {
376
345
  const u = new URL(`${this.basePath}${path}`, this.url);
377
346
  if (this.directory && !u.searchParams.has("directory")) {
@@ -380,29 +349,37 @@ class CmsClient {
380
349
  const res = await this.fetchFn(u.toString(), {
381
350
  headers: this.apiKey ? { Authorization: `Bearer ${this.apiKey}` } : {}
382
351
  });
383
- if (res.status === 404)
384
- return;
352
+ if (res.status === 404) return void 0;
385
353
  if (!res.ok)
386
- throw new Error(`Trellis CMS request failed (${res.status}) ${u.pathname}`);
354
+ throw new Error(
355
+ `Trellis CMS request failed (${res.status}) ${u.pathname}`
356
+ );
387
357
  const kind = res.headers.get("content-type") ?? "";
388
358
  const text = await res.text();
389
359
  if (!kind.toLowerCase().includes("application/json")) {
390
- throw new Error(`Trellis CMS expected JSON (${res.status}) ${u.pathname}: ${text.slice(0, 120)}`);
360
+ throw new Error(
361
+ `Trellis CMS expected JSON (${res.status}) ${u.pathname}: ${text.slice(0, 120)}`
362
+ );
391
363
  }
392
364
  try {
393
365
  return JSON.parse(text);
394
366
  } catch (err) {
395
- throw new Error(`Trellis CMS invalid JSON (${res.status}) ${u.pathname}: ${text.slice(0, 120)}`, { cause: err });
367
+ throw new Error(
368
+ `Trellis CMS invalid JSON (${res.status}) ${u.pathname}: ${text.slice(0, 120)}`,
369
+ { cause: err }
370
+ );
396
371
  }
397
372
  }
373
+ /** @internal */
398
374
  async _entities() {
399
375
  const out = [];
400
376
  let offset = 0;
401
377
  while (true) {
402
- const page = await this._get(`/entities?limit=${MAX_ENTITIES_PER_FETCH}&offset=${offset}`) ?? [];
378
+ const page = await this._get(
379
+ `/entities?limit=${MAX_ENTITIES_PER_FETCH}&offset=${offset}`
380
+ ) ?? [];
403
381
  out.push(...page);
404
- if (page.length < MAX_ENTITIES_PER_FETCH)
405
- return out;
382
+ if (page.length < MAX_ENTITIES_PER_FETCH) return out;
406
383
  offset += MAX_ENTITIES_PER_FETCH;
407
384
  }
408
385
  }
@@ -410,27 +387,28 @@ class CmsClient {
410
387
  const out = [];
411
388
  let offset = 0;
412
389
  while (true) {
413
- const page = await this._get(`/facts?limit=${MAX_FACTS_PER_FETCH}&offset=${offset}`) ?? [];
390
+ const page = await this._get(
391
+ `/facts?limit=${MAX_FACTS_PER_FETCH}&offset=${offset}`
392
+ ) ?? [];
414
393
  out.push(...page);
415
- if (page.length < MAX_FACTS_PER_FETCH)
416
- return out;
394
+ if (page.length < MAX_FACTS_PER_FETCH) return out;
417
395
  offset += MAX_FACTS_PER_FETCH;
418
396
  }
419
397
  }
398
+ /** @internal */
420
399
  async _entryById(id, schemaFacts) {
421
400
  const detail = await this._get(`/entity/${encodeURIComponent(id)}`);
422
- if (!detail)
423
- return null;
401
+ if (!detail) return null;
424
402
  const typeFact = detail.facts.find((f) => f.a === "type");
425
403
  const type = typeof typeFact?.v === "string" ? typeFact.v : "unknown";
426
404
  const facts = schemaFacts ?? await this._facts() ?? [];
427
- return applyFormulas(entryFromFacts({ id: detail.id, type }, detail.facts, detail.links), schemaFields(facts, [type]));
405
+ return applyFormulas(
406
+ entryFromFacts({ id: detail.id, type }, detail.facts, detail.links),
407
+ schemaFields(facts, [type])
408
+ );
428
409
  }
429
- }
430
-
431
- class CollectionRef {
432
- client;
433
- key;
410
+ };
411
+ var CollectionRef = class {
434
412
  constructor(client, key) {
435
413
  this.client = client;
436
414
  this.key = key;
@@ -444,62 +422,88 @@ class CollectionRef {
444
422
  this.client._facts(),
445
423
  this.client._get(`/links`)
446
424
  ]);
447
- if (!allEntities)
448
- return [];
425
+ if (!allEntities) return [];
449
426
  const wantedKey = typeKey(this.key);
450
427
  const matching = allEntities.filter((e) => typeKey(e.type) === wantedKey);
451
- if (matching.length === 0)
452
- return [];
428
+ if (matching.length === 0) return [];
453
429
  const factsByEntity = groupFactsByEntity(facts ?? []);
454
430
  const linksBySource = groupLinksBySource(links ?? []);
455
431
  const defs = schemaFields(facts ?? [], [
456
432
  this.key,
457
433
  ...matching.map((e) => e.type)
458
434
  ]);
459
- let entries = matching.map((e) => applyFormulas(entryFromFacts(e, factsByEntity.get(e.id) ?? [], linksBySource.get(e.id) ?? []), defs));
435
+ let entries = matching.map(
436
+ (e) => applyFormulas(
437
+ entryFromFacts(
438
+ e,
439
+ factsByEntity.get(e.id) ?? [],
440
+ linksBySource.get(e.id) ?? []
441
+ ),
442
+ defs
443
+ )
444
+ );
460
445
  if (status !== "all") {
461
446
  entries = entries.filter((e) => e.status === status);
462
447
  }
463
448
  entries = entries.slice(0, limit);
464
449
  if (wantsExpand) {
465
- entries = await expandReferences(entries, opts.expand, (id) => this.client._entryById(id, facts ?? []));
450
+ entries = await expandReferences(
451
+ entries,
452
+ opts.expand,
453
+ (id) => this.client._entryById(id, facts ?? [])
454
+ );
466
455
  }
467
456
  return entries;
468
457
  }
469
458
  async get(id, opts = {}) {
470
459
  const entry = await this.client._entryById(id);
471
- if (!entry)
472
- return null;
460
+ if (!entry) return null;
473
461
  if (opts.expand && opts.expand.length > 0) {
474
- const [expanded] = await expandReferences([entry], opts.expand, (eid) => this.client._entryById(eid));
462
+ const [expanded] = await expandReferences(
463
+ [entry],
464
+ opts.expand,
465
+ (eid) => this.client._entryById(eid)
466
+ );
475
467
  return expanded;
476
468
  }
477
469
  return entry;
478
470
  }
471
+ /**
472
+ * Subscribe to changes. Currently implemented as polling; a future SSE-backed
473
+ * upgrade will replace the transport without changing this API.
474
+ *
475
+ * Multiple subscribers to the same collection + opts share one polling timer
476
+ * and one HTTP request per cycle.
477
+ */
479
478
  subscribe(callback, opts = {}) {
480
479
  const { onError, equals, ...listOpts } = opts;
481
480
  const key = `coll:${typeKey(this.key)}:${JSON.stringify(listOpts)}`;
482
- return this.client._share(key, () => this.list(listOpts), callback, { onError, equals });
481
+ return this.client._share(
482
+ key,
483
+ () => this.list(listOpts),
484
+ callback,
485
+ { onError, equals }
486
+ );
483
487
  }
484
488
  async schema() {
485
489
  const facts = await this.client._facts();
486
490
  return schemaFields(facts ?? [], [this.key]);
487
491
  }
488
- }
489
-
490
- class EntryRef {
491
- client;
492
- id;
492
+ };
493
+ var EntryRef = class {
493
494
  constructor(client, id) {
494
495
  this.client = client;
495
496
  this.id = id;
496
497
  }
497
498
  async get(opts = {}) {
498
499
  const entry = await this.client._entryById(this.id);
499
- if (!entry)
500
- return null;
500
+ if (!entry) return null;
501
501
  if (opts.expand && opts.expand.length > 0) {
502
- const [expanded] = await expandReferences([entry], opts.expand, (eid) => this.client._entryById(eid));
502
+ const [expanded] = await expandReferences(
503
+ [entry],
504
+ opts.expand,
505
+ (eid) => this.client._entryById(eid)
506
+ );
503
507
  return expanded;
504
508
  }
505
509
  return entry;
@@ -507,22 +511,26 @@ class EntryRef {
507
511
  subscribe(callback, opts = {}) {
508
512
  const { onError, equals, ...getOpts } = opts;
509
513
  const key = `entry:${this.id}:${JSON.stringify(getOpts)}`;
510
- return this.client._share(key, () => this.get(getOpts), callback, { onError, equals });
514
+ return this.client._share(
515
+ key,
516
+ () => this.get(getOpts),
517
+ callback,
518
+ { onError, equals }
519
+ );
511
520
  }
512
- }
521
+ };
513
522
  function createCmsClient(opts) {
514
523
  return new CmsClient(opts);
515
524
  }
525
+
516
526
  // src/cms/scaffold.ts
517
527
  var DEFAULT_URL = "http://localhost:4096";
518
528
  function expandLiteral(expand) {
519
- if (!expand || expand.length === 0)
520
- return "";
529
+ if (!expand || expand.length === 0) return "";
521
530
  return ` expand: ${JSON.stringify(expand)},`;
522
531
  }
523
532
  function clientLiteral(url, directory) {
524
- if (!directory)
525
- return `createCmsClient({ url: "${url}" })`;
533
+ if (!directory) return `createCmsClient({ url: "${url}" })`;
526
534
  return `createCmsClient({ url: "${url}", directory: ${JSON.stringify(directory)} })`;
527
535
  }
528
536
  function vanilla(opts) {
@@ -636,13 +644,13 @@ function scaffoldFilename(opts) {
636
644
  }
637
645
  }
638
646
  export {
639
- scaffoldFilename,
640
- scaffoldConsumer,
641
- parseFields,
642
- evaluateFormula,
643
- createCmsClient,
644
- applyFormulas,
645
- EntryRef,
647
+ CmsClient,
646
648
  CollectionRef,
647
- CmsClient
649
+ EntryRef,
650
+ applyFormulas,
651
+ createCmsClient,
652
+ evaluateFormula,
653
+ parseFields,
654
+ scaffoldConsumer,
655
+ scaffoldFilename
648
656
  };
@@ -1,4 +1,3 @@
1
- // @bun
2
1
  import {
3
2
  CONFIG_FILE,
4
3
  configPath,
@@ -7,14 +6,14 @@ import {
7
6
  readConfig,
8
7
  updateConfig,
9
8
  writeConfig
10
- } from "./index-xzym9w0m.js";
11
- import"./index-a76rekgs.js";
9
+ } from "./chunk-JA7AIHRK.js";
10
+ import "./chunk-KFQGP6VL.js";
12
11
  export {
13
- writeConfig,
14
- updateConfig,
15
- readConfig,
16
- hasConfig,
17
- defaultLocalConfig,
12
+ CONFIG_FILE,
18
13
  configPath,
19
- CONFIG_FILE
14
+ defaultLocalConfig,
15
+ hasConfig,
16
+ readConfig,
17
+ updateConfig,
18
+ writeConfig
20
19
  };
@@ -0,0 +1,5 @@
1
+ export { ExprEvaluator, evalExpr } from './expr-evaluator.js';
2
+ export type { EvalContext } from './expr-evaluator.js';
3
+ export { evaluateRollup, collectRollupRelatedIds, projectRelationFields, } from './rollup.js';
4
+ export type { RollupEvalContext } from './rollup.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/computation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC9D,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EACL,cAAc,EACd,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Ontology rollup evaluation — aggregates over graph links or join-entities.
3
+ */
4
+ import type { EAVStore, Atom } from '../store/eav-store.js';
5
+ import type { PropertyValueSpecification, RollupConfig, SchemaDefinition } from '../ontology/types.js';
6
+ export interface RollupEvalContext {
7
+ store: EAVStore;
8
+ entityId: string;
9
+ schema?: SchemaDefinition;
10
+ getEntityType?: (entityId: string) => string | undefined;
11
+ }
12
+ /** Collect related entity ids for a rollup field. */
13
+ export declare function collectRollupRelatedIds(rollup: RollupConfig, ctx: RollupEvalContext): string[];
14
+ export declare function evaluateRollup(rollup: RollupConfig, ctx: RollupEvalContext): Atom;
15
+ /** Project ontology relation fields from graph links onto a binding row. */
16
+ export declare function projectRelationFields(binding: Record<string, Atom>, schema: SchemaDefinition, store: EAVStore, entityId: string): void;
17
+ export declare function findRollupField(schema: SchemaDefinition, name: string): PropertyValueSpecification | undefined;
18
+ //# sourceMappingURL=rollup.d.ts.map