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
@@ -0,0 +1,142 @@
1
+ // src/schema/define.ts
2
+ import { z } from "zod";
3
+ function rel(target, cardinality = "one") {
4
+ return { target, cardinality };
5
+ }
6
+ function rollup(cfg) {
7
+ return { spec: { valueType: "rollup", rollup: cfg, computed: true, editable: false } };
8
+ }
9
+ function formula(expr) {
10
+ return { spec: { valueType: "formula", formula: expr, computed: true, editable: false } };
11
+ }
12
+ function defineType(type, shape, opts = {}) {
13
+ const relations = opts.relations ?? {};
14
+ const computed = opts.computed ?? {};
15
+ const fields = [
16
+ ...Object.entries(shape).map(
17
+ ([name, zt]) => zodToSpec(name, zt, name === opts.title)
18
+ ),
19
+ ...Object.entries(relations).map(([name, r]) => relationToSpec(name, r)),
20
+ ...Object.entries(computed).map(
21
+ ([name, c]) => ({ name, required: false, ...c.spec })
22
+ )
23
+ ];
24
+ const definition = {
25
+ "@id": `trellis:${type}`,
26
+ "@type": "trellis:Schema",
27
+ version: opts.version ?? "1.0.0",
28
+ tier: opts.tier ?? "user",
29
+ label: opts.label ?? type,
30
+ fields,
31
+ ...opts.extends ? { subClassOf: opts.extends } : {}
32
+ };
33
+ return {
34
+ type,
35
+ zod: z.object(shape),
36
+ relations,
37
+ computed,
38
+ definition,
39
+ toOntologySchema: () => lowerToLegacy(type, definition, relations)
40
+ };
41
+ }
42
+ function unwrap(zt) {
43
+ let t = zt;
44
+ for (let i = 0; i < 8; i++) {
45
+ if (t instanceof z.ZodOptional || t instanceof z.ZodNullable || t instanceof z.ZodDefault) {
46
+ const inner = t._def.innerType;
47
+ if (!inner) break;
48
+ t = inner;
49
+ } else {
50
+ break;
51
+ }
52
+ }
53
+ return t;
54
+ }
55
+ function zodToSpec(name, zt, isTitle) {
56
+ const required = !zt.isOptional();
57
+ const base = unwrap(zt);
58
+ let valueType = "rich_text";
59
+ let selectOptions;
60
+ if (isTitle) {
61
+ valueType = "title";
62
+ } else if (base instanceof z.ZodString) {
63
+ const checks = base._def.checks ?? [];
64
+ if (checks.some((c) => c.kind === "email")) valueType = "email";
65
+ else if (checks.some((c) => c.kind === "url")) valueType = "url";
66
+ else if (checks.some((c) => c.kind === "datetime")) valueType = "date";
67
+ else valueType = "rich_text";
68
+ } else if (base instanceof z.ZodNumber) {
69
+ valueType = "number";
70
+ } else if (base instanceof z.ZodBoolean) {
71
+ valueType = "checkbox";
72
+ } else if (base instanceof z.ZodDate) {
73
+ valueType = "date";
74
+ } else if (base instanceof z.ZodEnum) {
75
+ valueType = "select";
76
+ selectOptions = base.options.slice();
77
+ } else if (base instanceof z.ZodArray) {
78
+ const el = unwrap(base._def.type);
79
+ valueType = "multi_select";
80
+ if (el instanceof z.ZodEnum) {
81
+ selectOptions = el.options.slice();
82
+ }
83
+ } else {
84
+ valueType = "json";
85
+ }
86
+ const spec = { name, valueType, required };
87
+ if (selectOptions) spec.selectOptions = selectOptions;
88
+ return spec;
89
+ }
90
+ function targetName(r) {
91
+ return typeof r.target === "string" ? r.target : r.target().type;
92
+ }
93
+ function relationToSpec(name, r) {
94
+ return {
95
+ name,
96
+ valueType: "relation",
97
+ required: false,
98
+ relation: { targetSchema: targetName(r), cardinality: r.cardinality }
99
+ };
100
+ }
101
+ function attrType(v) {
102
+ switch (v) {
103
+ case "number":
104
+ case "rollup":
105
+ return "number";
106
+ case "checkbox":
107
+ return "boolean";
108
+ case "date":
109
+ return "date";
110
+ case "relation":
111
+ return "ref";
112
+ default:
113
+ return "string";
114
+ }
115
+ }
116
+ function lowerToLegacy(type, def, relations) {
117
+ const attributes = def.fields.filter((f) => f.valueType !== "relation").map((f) => ({
118
+ name: f.name,
119
+ type: attrType(f.valueType),
120
+ required: f.required ?? false
121
+ }));
122
+ const rels = Object.entries(relations).map(([name, r]) => ({
123
+ name,
124
+ sourceTypes: [type],
125
+ targetTypes: [targetName(r)],
126
+ cardinality: r.cardinality
127
+ }));
128
+ return {
129
+ id: def["@id"],
130
+ name: type,
131
+ version: def.version,
132
+ entities: [{ name: type, attributes }],
133
+ relations: rels
134
+ };
135
+ }
136
+
137
+ export {
138
+ rel,
139
+ rollup,
140
+ formula,
141
+ defineType
142
+ };
@@ -0,0 +1,150 @@
1
+ import {
2
+ __esm,
3
+ __export
4
+ } from "./chunk-KFQGP6VL.js";
5
+
6
+ // src/sync/reconciler.ts
7
+ var reconciler_exports = {};
8
+ __export(reconciler_exports, {
9
+ findForkPoint: () => findForkPoint,
10
+ reconcile: () => reconcile
11
+ });
12
+ function findForkPoint(opsA, opsB) {
13
+ const hashesB = new Set(opsB.map((o) => o.hash));
14
+ let forkPoint = null;
15
+ for (const op of opsA) {
16
+ if (hashesB.has(op.hash)) {
17
+ forkPoint = op.hash;
18
+ }
19
+ }
20
+ return forkPoint;
21
+ }
22
+ function reconcile(opsA, opsB) {
23
+ const forkPoint = findForkPoint(opsA, opsB);
24
+ const hashesA = new Set(opsA.map((o) => o.hash));
25
+ const hashesB = new Set(opsB.map((o) => o.hash));
26
+ const shared = [];
27
+ const uniqueToA = [];
28
+ const uniqueToB = [];
29
+ for (const op of opsA) {
30
+ if (hashesB.has(op.hash)) {
31
+ shared.push(op);
32
+ } else {
33
+ uniqueToA.push(op);
34
+ }
35
+ }
36
+ for (const op of opsB) {
37
+ if (!hashesA.has(op.hash)) {
38
+ uniqueToB.push(op);
39
+ }
40
+ }
41
+ if (uniqueToA.length === 0) {
42
+ return {
43
+ merged: [...shared, ...uniqueToB],
44
+ uniqueToA: [],
45
+ uniqueToB,
46
+ forkPoint,
47
+ clean: true,
48
+ conflicts: []
49
+ };
50
+ }
51
+ if (uniqueToB.length === 0) {
52
+ return {
53
+ merged: [...shared, ...uniqueToA],
54
+ uniqueToA,
55
+ uniqueToB: [],
56
+ forkPoint,
57
+ clean: true,
58
+ conflicts: []
59
+ };
60
+ }
61
+ const conflicts = detectConflicts(uniqueToA, uniqueToB);
62
+ const interleaved = interleaveByTimestamp(uniqueToA, uniqueToB);
63
+ return {
64
+ merged: [...shared, ...interleaved],
65
+ uniqueToA,
66
+ uniqueToB,
67
+ forkPoint,
68
+ clean: conflicts.length === 0,
69
+ conflicts
70
+ };
71
+ }
72
+ function detectConflicts(uniqueA, uniqueB) {
73
+ const conflicts = [];
74
+ const aMutations = /* @__PURE__ */ new Map();
75
+ for (const op of uniqueA) {
76
+ if (!FILE_MUTATION_KINDS.has(op.kind) || !op.vcs?.filePath) continue;
77
+ const path = op.vcs.filePath;
78
+ if (!aMutations.has(path)) aMutations.set(path, []);
79
+ aMutations.get(path).push(op);
80
+ }
81
+ for (const op of uniqueB) {
82
+ if (!FILE_MUTATION_KINDS.has(op.kind) || !op.vcs?.filePath) continue;
83
+ const path = op.vcs.filePath;
84
+ const aOps = aMutations.get(path);
85
+ if (!aOps) continue;
86
+ for (const aOp of aOps) {
87
+ if (aOp.kind === "vcs:fileModify" && op.kind === "vcs:fileModify") {
88
+ conflicts.push({
89
+ opA: aOp,
90
+ opB: op,
91
+ filePath: path,
92
+ reason: `Both sides modified ${path}`
93
+ });
94
+ } else if (aOp.kind === "vcs:fileDelete" && op.kind === "vcs:fileModify" || aOp.kind === "vcs:fileModify" && op.kind === "vcs:fileDelete") {
95
+ conflicts.push({
96
+ opA: aOp,
97
+ opB: op,
98
+ filePath: path,
99
+ reason: `Delete/modify conflict on ${path}`
100
+ });
101
+ } else if (aOp.kind === "vcs:fileAdd" && op.kind === "vcs:fileAdd") {
102
+ if (aOp.vcs?.contentHash !== op.vcs?.contentHash) {
103
+ conflicts.push({
104
+ opA: aOp,
105
+ opB: op,
106
+ filePath: path,
107
+ reason: `Both sides added ${path} with different content`
108
+ });
109
+ }
110
+ }
111
+ }
112
+ }
113
+ return conflicts;
114
+ }
115
+ function interleaveByTimestamp(a, b) {
116
+ const result = [];
117
+ let ai = 0;
118
+ let bi = 0;
119
+ while (ai < a.length && bi < b.length) {
120
+ const tA = new Date(a[ai].timestamp).getTime();
121
+ const tB = new Date(b[bi].timestamp).getTime();
122
+ if (tA <= tB) {
123
+ result.push(a[ai++]);
124
+ } else {
125
+ result.push(b[bi++]);
126
+ }
127
+ }
128
+ while (ai < a.length) result.push(a[ai++]);
129
+ while (bi < b.length) result.push(b[bi++]);
130
+ return result;
131
+ }
132
+ var FILE_MUTATION_KINDS;
133
+ var init_reconciler = __esm({
134
+ "src/sync/reconciler.ts"() {
135
+ "use strict";
136
+ FILE_MUTATION_KINDS = /* @__PURE__ */ new Set([
137
+ "vcs:fileAdd",
138
+ "vcs:fileModify",
139
+ "vcs:fileDelete",
140
+ "vcs:fileRename"
141
+ ]);
142
+ }
143
+ });
144
+
145
+ export {
146
+ findForkPoint,
147
+ reconcile,
148
+ reconciler_exports,
149
+ init_reconciler
150
+ };
@@ -0,0 +1,361 @@
1
+ import {
2
+ __esm
3
+ } from "./chunk-KFQGP6VL.js";
4
+
5
+ // src/core/store/eav-store.ts
6
+ function* flatten(obj, base = "") {
7
+ if (Array.isArray(obj)) {
8
+ for (const v of obj) {
9
+ yield* flatten(v, base);
10
+ }
11
+ } else if (obj && typeof obj === "object") {
12
+ for (const [k, v] of Object.entries(obj)) {
13
+ yield* flatten(v, base ? `${base}.${k}` : k);
14
+ }
15
+ } else {
16
+ yield [base, obj];
17
+ }
18
+ }
19
+ function jsonEntityFacts(entityId, root, type) {
20
+ const facts = [{ e: entityId, a: "type", v: type }];
21
+ for (const [a, v] of flatten(root)) {
22
+ if (v === void 0 || v === null) continue;
23
+ if (Array.isArray(v)) {
24
+ for (const el of v) {
25
+ facts.push({ e: entityId, a, v: el });
26
+ }
27
+ } else if (typeof v === "object") {
28
+ } else {
29
+ facts.push({ e: entityId, a, v });
30
+ }
31
+ }
32
+ return facts;
33
+ }
34
+ var EAVStore;
35
+ var init_eav_store = __esm({
36
+ "src/core/store/eav-store.ts"() {
37
+ "use strict";
38
+ EAVStore = class {
39
+ facts = [];
40
+ links = [];
41
+ catalog = /* @__PURE__ */ new Map();
42
+ // Indexes for fast lookups
43
+ eavIndex = /* @__PURE__ */ new Map();
44
+ aevIndex = /* @__PURE__ */ new Map();
45
+ aveIndex = /* @__PURE__ */ new Map();
46
+ // Link indexes for graph queries
47
+ linkIndex = /* @__PURE__ */ new Map();
48
+ // e1 -> a -> e2s
49
+ linkReverseIndex = /* @__PURE__ */ new Map();
50
+ // e2 -> a -> e1s
51
+ linkAttrIndex = /* @__PURE__ */ new Map();
52
+ // a -> [(e1, e2)]
53
+ // Distinct value tracking
54
+ distinct = /* @__PURE__ */ new Map();
55
+ // attr -> set of valueKey
56
+ addFacts(facts) {
57
+ for (let i = 0; i < facts.length; i++) {
58
+ const fact = facts[i];
59
+ if (fact) {
60
+ if (this.hasFact(fact.e, fact.a, fact.v)) {
61
+ continue;
62
+ }
63
+ this.facts.push(fact);
64
+ this.updateIndexes(fact, this.facts.length - 1);
65
+ this.updateCatalog(fact);
66
+ }
67
+ }
68
+ }
69
+ /**
70
+ * Check if a fact already exists in the store.
71
+ */
72
+ hasFact(entity, attribute, value) {
73
+ const valueKey = this.valueKey(value);
74
+ const indices = this.aveIndex.get(attribute)?.get(valueKey);
75
+ if (!indices) return false;
76
+ for (const idx of indices) {
77
+ const fact = this.facts[idx];
78
+ if (fact && fact.e === entity && fact.a === attribute) {
79
+ return true;
80
+ }
81
+ }
82
+ return false;
83
+ }
84
+ addLinks(links) {
85
+ for (const link of links) {
86
+ this.links.push(link);
87
+ this.updateLinkIndexes(link);
88
+ }
89
+ }
90
+ deleteFacts(factsToDelete) {
91
+ for (const fact of factsToDelete) {
92
+ const valueKey = this.valueKey(fact.v);
93
+ const indices = this.aveIndex.get(fact.a)?.get(valueKey);
94
+ if (!indices) continue;
95
+ let foundIdx = -1;
96
+ for (const idx of indices) {
97
+ const storedFact = this.facts[idx];
98
+ if (storedFact && storedFact.e === fact.e && storedFact.a === fact.a) {
99
+ foundIdx = idx;
100
+ break;
101
+ }
102
+ }
103
+ if (foundIdx !== -1) {
104
+ this.facts[foundIdx] = void 0;
105
+ this.eavIndex.get(fact.e)?.get(fact.a)?.delete(foundIdx);
106
+ this.aevIndex.get(fact.a)?.get(fact.e)?.delete(foundIdx);
107
+ this.aveIndex.get(fact.a)?.get(valueKey)?.delete(foundIdx);
108
+ const entry = this.catalog.get(fact.a);
109
+ if (entry) {
110
+ }
111
+ }
112
+ }
113
+ }
114
+ deleteLinks(linksToDelete) {
115
+ for (const link of linksToDelete) {
116
+ const initialLen = this.links.length;
117
+ this.links = this.links.filter(
118
+ (l) => !(l.e1 === link.e1 && l.a === link.a && l.e2 === link.e2)
119
+ );
120
+ if (this.links.length < initialLen) {
121
+ this.linkIndex.get(link.e1)?.get(link.a)?.delete(link.e2);
122
+ this.linkReverseIndex.get(link.e2)?.get(link.a)?.delete(link.e1);
123
+ const attrPairs = this.linkAttrIndex.get(link.a);
124
+ if (attrPairs) {
125
+ for (const pair of attrPairs) {
126
+ if (pair[0] === link.e1 && pair[1] === link.e2) {
127
+ attrPairs.delete(pair);
128
+ break;
129
+ }
130
+ }
131
+ }
132
+ }
133
+ }
134
+ }
135
+ updateIndexes(fact, index) {
136
+ if (!this.eavIndex.has(fact.e)) {
137
+ this.eavIndex.set(fact.e, /* @__PURE__ */ new Map());
138
+ }
139
+ if (!this.eavIndex.get(fact.e).has(fact.a)) {
140
+ this.eavIndex.get(fact.e).set(fact.a, /* @__PURE__ */ new Set());
141
+ }
142
+ this.eavIndex.get(fact.e).get(fact.a).add(index);
143
+ if (!this.aevIndex.has(fact.a)) {
144
+ this.aevIndex.set(fact.a, /* @__PURE__ */ new Map());
145
+ }
146
+ if (!this.aevIndex.get(fact.a).has(fact.e)) {
147
+ this.aevIndex.get(fact.a).set(fact.e, /* @__PURE__ */ new Set());
148
+ }
149
+ this.aevIndex.get(fact.a).get(fact.e).add(index);
150
+ if (!this.aveIndex.has(fact.a)) {
151
+ this.aveIndex.set(fact.a, /* @__PURE__ */ new Map());
152
+ }
153
+ const valueKey = this.valueKey(fact.v);
154
+ if (!this.aveIndex.get(fact.a).has(valueKey)) {
155
+ this.aveIndex.get(fact.a).set(valueKey, /* @__PURE__ */ new Set());
156
+ }
157
+ this.aveIndex.get(fact.a).get(valueKey).add(index);
158
+ }
159
+ updateLinkIndexes(link) {
160
+ if (!this.linkIndex.has(link.e1)) {
161
+ this.linkIndex.set(link.e1, /* @__PURE__ */ new Map());
162
+ }
163
+ const e1Attrs = this.linkIndex.get(link.e1);
164
+ if (!e1Attrs.has(link.a)) {
165
+ e1Attrs.set(link.a, /* @__PURE__ */ new Set());
166
+ }
167
+ e1Attrs.get(link.a).add(link.e2);
168
+ if (!this.linkReverseIndex.has(link.e2)) {
169
+ this.linkReverseIndex.set(link.e2, /* @__PURE__ */ new Map());
170
+ }
171
+ const e2Attrs = this.linkReverseIndex.get(link.e2);
172
+ if (!e2Attrs.has(link.a)) {
173
+ e2Attrs.set(link.a, /* @__PURE__ */ new Set());
174
+ }
175
+ e2Attrs.get(link.a).add(link.e1);
176
+ if (!this.linkAttrIndex.has(link.a)) {
177
+ this.linkAttrIndex.set(link.a, /* @__PURE__ */ new Set());
178
+ }
179
+ this.linkAttrIndex.get(link.a).add([link.e1, link.e2]);
180
+ }
181
+ valueKey(v) {
182
+ if (v instanceof Date) return `date:${v.toISOString()}`;
183
+ return `${typeof v}:${v}`;
184
+ }
185
+ updateCatalog(fact) {
186
+ const entry = this.catalog.get(fact.a) || {
187
+ attribute: fact.a,
188
+ type: this.inferType(fact.v),
189
+ cardinality: "one",
190
+ distinctCount: 0,
191
+ examples: []
192
+ };
193
+ const factType = this.inferType(fact.v);
194
+ if (entry.type !== factType && entry.type !== "mixed") {
195
+ entry.type = "mixed";
196
+ }
197
+ const entityAttrs = this.eavIndex.get(fact.e)?.get(fact.a);
198
+ if (entityAttrs && entityAttrs.size > 1) {
199
+ entry.cardinality = "many";
200
+ }
201
+ const k = this.valueKey(fact.v);
202
+ const s = this.distinct.get(fact.a) || (this.distinct.set(fact.a, /* @__PURE__ */ new Set()), this.distinct.get(fact.a));
203
+ s.add(k);
204
+ entry.distinctCount = s.size;
205
+ if (entry.examples.length < 5 && !entry.examples.includes(fact.v)) {
206
+ entry.examples.push(fact.v);
207
+ }
208
+ if (typeof fact.v === "number") {
209
+ entry.min = Math.min(entry.min ?? fact.v, fact.v);
210
+ entry.max = Math.max(entry.max ?? fact.v, fact.v);
211
+ }
212
+ this.catalog.set(fact.a, entry);
213
+ }
214
+ inferType(v) {
215
+ if (typeof v === "string") return "string";
216
+ if (typeof v === "number") return "number";
217
+ if (typeof v === "boolean") return "boolean";
218
+ if (v instanceof Date) return "date";
219
+ return "mixed";
220
+ }
221
+ // Query methods
222
+ getFactsByEntity(entity) {
223
+ const indices = this.eavIndex.get(entity);
224
+ if (!indices) return [];
225
+ const result = [];
226
+ for (const attrIndices of indices.values()) {
227
+ for (const idx of attrIndices) {
228
+ const fact = this.facts[idx];
229
+ if (fact) {
230
+ result.push(fact);
231
+ }
232
+ }
233
+ }
234
+ return result;
235
+ }
236
+ getFactsByAttribute(attribute) {
237
+ const indices = this.aevIndex.get(attribute);
238
+ if (!indices) return [];
239
+ const result = [];
240
+ for (const entityIndices of indices.values()) {
241
+ for (const idx of entityIndices) {
242
+ const fact = this.facts[idx];
243
+ if (fact) {
244
+ result.push(fact);
245
+ }
246
+ }
247
+ }
248
+ return result;
249
+ }
250
+ getFactsByValue(attribute, value) {
251
+ const indices = this.aveIndex.get(attribute)?.get(this.valueKey(value));
252
+ if (!indices) return [];
253
+ return Array.from(indices).map((idx) => this.facts[idx]).filter((fact) => fact !== void 0);
254
+ }
255
+ getCatalog() {
256
+ return Array.from(this.catalog.values());
257
+ }
258
+ getCatalogEntry(attribute) {
259
+ return this.catalog.get(attribute);
260
+ }
261
+ // Statistics
262
+ getAllFacts() {
263
+ return this.facts.filter((f) => f !== void 0);
264
+ }
265
+ getAllLinks() {
266
+ return [...this.links];
267
+ }
268
+ getLinksByEntity(entity) {
269
+ const results = [];
270
+ const forwardLinks = this.linkIndex.get(entity);
271
+ if (forwardLinks) {
272
+ for (const [attr, targets] of forwardLinks) {
273
+ for (const target of targets) {
274
+ results.push({ e1: entity, a: attr, e2: target });
275
+ }
276
+ }
277
+ }
278
+ const reverseLinks = this.linkReverseIndex.get(entity);
279
+ if (reverseLinks) {
280
+ for (const [attr, sources] of reverseLinks) {
281
+ for (const source of sources) {
282
+ results.push({ e1: source, a: attr, e2: entity });
283
+ }
284
+ }
285
+ }
286
+ return results;
287
+ }
288
+ getLinksByAttribute(attribute) {
289
+ const results = [];
290
+ const links = this.linkAttrIndex.get(attribute);
291
+ if (links) {
292
+ for (const [e1, e2] of links) {
293
+ results.push({ e1, a: attribute, e2 });
294
+ }
295
+ }
296
+ return results;
297
+ }
298
+ getLinksByEntityAndAttribute(entity, attribute) {
299
+ const results = [];
300
+ const attrs = this.linkIndex.get(entity);
301
+ if (attrs) {
302
+ const targets = attrs.get(attribute);
303
+ if (targets) {
304
+ for (const target of targets) {
305
+ results.push({ e1: entity, a: attribute, e2: target });
306
+ }
307
+ }
308
+ }
309
+ return results;
310
+ }
311
+ getStats() {
312
+ return {
313
+ totalFacts: this.facts.length,
314
+ totalLinks: this.links.length,
315
+ uniqueEntities: this.eavIndex.size,
316
+ uniqueAttributes: this.aevIndex.size,
317
+ catalogEntries: this.catalog.size
318
+ };
319
+ }
320
+ /**
321
+ * Creates a serializable snapshot of the current store state.
322
+ */
323
+ snapshot() {
324
+ return {
325
+ facts: this.facts.filter((f) => f !== void 0),
326
+ links: [...this.links],
327
+ catalog: this.getCatalog()
328
+ };
329
+ }
330
+ /**
331
+ * Restores the store state from a snapshot and rebuilds all indexes.
332
+ */
333
+ restore(snapshot) {
334
+ this.facts = [];
335
+ this.links = [];
336
+ this.catalog.clear();
337
+ this.eavIndex.clear();
338
+ this.aevIndex.clear();
339
+ this.aveIndex.clear();
340
+ this.linkIndex.clear();
341
+ this.linkReverseIndex.clear();
342
+ this.linkAttrIndex.clear();
343
+ this.distinct.clear();
344
+ this.addFacts(snapshot.facts);
345
+ this.addLinks(snapshot.links);
346
+ if (snapshot.catalog) {
347
+ for (const entry of snapshot.catalog) {
348
+ this.catalog.set(entry.attribute, entry);
349
+ }
350
+ }
351
+ }
352
+ };
353
+ }
354
+ });
355
+
356
+ export {
357
+ flatten,
358
+ jsonEntityFacts,
359
+ EAVStore,
360
+ init_eav_store
361
+ };