trellis 3.2.0 → 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 (258) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/README.md +61 -171
  3. package/dist/browser/index.d.ts +18 -0
  4. package/dist/browser/index.d.ts.map +1 -0
  5. package/dist/browser/index.js +95 -0
  6. package/dist/{chunk-3ETIIPPB.js → chunk-2W3MHTMG.js} +190 -27
  7. package/dist/{chunk-MBNBTJCR.js → chunk-6GEZ6DN5.js} +2 -2
  8. package/dist/chunk-7ZFRVCUE.js +211 -0
  9. package/dist/chunk-CAG4FULI.js +121 -0
  10. package/dist/{chunk-GD5QJXSS.js → chunk-FWRS4CSC.js} +2 -2
  11. package/dist/{chunk-36VSSTL7.js → chunk-GU374KWZ.js} +1 -1
  12. package/dist/{chunk-3GDRZTAW.js → chunk-H6JB3PZ3.js} +1 -1
  13. package/dist/{chunk-ZHVI7BQN.js → chunk-IZX2PLIB.js} +191 -28
  14. package/dist/chunk-J2TXUFCZ.js +289 -0
  15. package/dist/{chunk-BJ7EZ7FP.js → chunk-JHHEXEDM.js} +17 -0
  16. package/dist/{chunk-X762XWVC.js → chunk-KIJITUZB.js} +1 -1
  17. package/dist/{chunk-7WQGTFVJ.js → chunk-L5N5PR2S.js} +130 -75
  18. package/dist/{chunk-BXSTJVE3.js → chunk-N6MYZT4O.js} +2 -1
  19. package/dist/{chunk-KKDRMIV6.js → chunk-QB5ISE47.js} +1 -1
  20. package/dist/{chunk-HO4TURXW.js → chunk-S3XLFZ27.js} +28 -11
  21. package/dist/{chunk-BQBUVMRN.js → chunk-S6GBJ2ZB.js} +25 -14
  22. package/dist/{chunk-IUWVEEOX.js → chunk-SGMDTWJJ.js} +4 -0
  23. package/dist/{chunk-FZVCXDYW.js → chunk-UQISRW6T.js} +65 -12
  24. package/dist/{chunk-B3ZIFA2O.js → chunk-VBYUTRXX.js} +1 -1
  25. package/dist/cli/deploy-cli.d.ts +18 -0
  26. package/dist/cli/deploy-cli.d.ts.map +1 -0
  27. package/dist/cli/index.d.ts +1 -1
  28. package/dist/cli/index.d.ts.map +1 -1
  29. package/dist/cli/index.js +153 -100
  30. package/dist/client/index.browser.d.ts +29 -0
  31. package/dist/client/index.browser.d.ts.map +1 -0
  32. package/dist/client/index.browser.js +64 -0
  33. package/dist/client/index.js +10 -10
  34. package/dist/client/sdk.browser.d.ts +104 -0
  35. package/dist/client/sdk.browser.d.ts.map +1 -0
  36. package/dist/{sdk-LZ7W3EEY.js → client/sdk.browser.js} +2 -2
  37. package/dist/client/sdk.js +1 -1
  38. package/dist/core/index.js +6 -6
  39. package/dist/db/index.js +18 -18
  40. package/dist/db/inspector.js +6 -6
  41. package/dist/db/trellis.css +1 -1
  42. package/dist/decisions/index.js +2 -2
  43. package/dist/deploy-LQ7GUGJ5.js +9 -0
  44. package/dist/{deploy-66EC752W.js → deploy-YNVG5E4E.js} +1 -1
  45. package/dist/deploy-cli-24BCHAXY.js +67 -0
  46. package/dist/deploy-cli-C35HTITO.js +67 -0
  47. package/dist/embeddings/auto-embed.d.ts.map +1 -1
  48. package/dist/embeddings/index.js +1 -1
  49. package/dist/embeddings/store.d.ts.map +1 -1
  50. package/dist/engine.d.ts +27 -7
  51. package/dist/engine.d.ts.map +1 -1
  52. package/dist/index.js +6 -6
  53. package/dist/mcp/server.d.ts.map +1 -1
  54. package/dist/react/index.js +2 -2
  55. package/dist/react/schema-hooks.js +7 -7
  56. package/dist/{remote-manager-SG545WNY.js → remote-manager-ODE3T2KR.js} +5 -5
  57. package/dist/scaffold/seed.d.ts.map +1 -1
  58. package/dist/scaffold/write.d.ts +1 -1
  59. package/dist/scaffold/write.d.ts.map +1 -1
  60. package/dist/schema/index.js +4 -3
  61. package/dist/server/deploy-meta.d.ts +25 -0
  62. package/dist/server/deploy-meta.d.ts.map +1 -0
  63. package/dist/server/deploy.d.ts +7 -2
  64. package/dist/server/deploy.d.ts.map +1 -1
  65. package/dist/server/index.d.ts +5 -2
  66. package/dist/server/index.d.ts.map +1 -1
  67. package/dist/server/index.js +52 -18
  68. package/dist/server/realtime.d.ts +4 -1
  69. package/dist/server/realtime.d.ts.map +1 -1
  70. package/dist/server/server.d.ts +1 -0
  71. package/dist/server/server.d.ts.map +1 -1
  72. package/dist/server/sprites.d.ts +18 -1
  73. package/dist/server/sprites.d.ts.map +1 -1
  74. package/dist/server/tenancy.d.ts +4 -0
  75. package/dist/server/tenancy.d.ts.map +1 -1
  76. package/dist/server/usage-meter.d.ts +53 -0
  77. package/dist/server/usage-meter.d.ts.map +1 -0
  78. package/dist/{server-IGBIIJSF.js → server-MB3OPSPI.js} +6 -1
  79. package/dist/{server-BOH7M4TT.js → server-ZVWGLLRF.js} +7 -2
  80. package/dist/sprites-KQGTGM6W.js +27 -0
  81. package/dist/{tenancy-S676GLID.js → tenancy-NBLLGCNJ.js} +1 -1
  82. package/dist/{tenancy-OP34NFFS.js → tenancy-POMWQP6M.js} +5 -3
  83. package/dist/vcs/index.js +3 -3
  84. package/dist/vcs/types.d.ts +2 -0
  85. package/dist/vcs/types.d.ts.map +1 -1
  86. package/package.json +17 -6
  87. package/dist/better-sqlite-backend-PII64VE6.js +0 -159
  88. package/dist/better-sqlite-backend-VUBVQ7SN.js +0 -209
  89. package/dist/better-sqlite-backend-Y3AQN65E.js +0 -159
  90. package/dist/better-sqlite-backend-Y3M7DXOX.js +0 -159
  91. package/dist/boot-middleware-FJDGVUM4.js +0 -9
  92. package/dist/boot-middleware-MLJUTLUM.js +0 -9
  93. package/dist/boot-middleware-ZZPDZNYR.js +0 -9
  94. package/dist/chunk-276LKLZR.js +0 -359
  95. package/dist/chunk-2CX5UCRV.js +0 -111
  96. package/dist/chunk-2ESYSVXG.js +0 -48
  97. package/dist/chunk-2I5JU73Y.js +0 -340
  98. package/dist/chunk-2UNSRRNB.js +0 -171
  99. package/dist/chunk-335UEHQR.js +0 -907
  100. package/dist/chunk-4CF2L46N.js +0 -29
  101. package/dist/chunk-5CINODKT.js +0 -41
  102. package/dist/chunk-5ESGWJ5L.js +0 -45
  103. package/dist/chunk-5FGLQGMF.js +0 -1676
  104. package/dist/chunk-5IQZFITY.js +0 -357
  105. package/dist/chunk-5JWFAQDW.js +0 -150
  106. package/dist/chunk-62UHTVU3.js +0 -141
  107. package/dist/chunk-66UJQT2I.js +0 -35
  108. package/dist/chunk-6RNNVOAS.js +0 -355
  109. package/dist/chunk-6X23PZ6H.js +0 -969
  110. package/dist/chunk-7C7LL6MB.js +0 -315
  111. package/dist/chunk-7F4HM3JG.js +0 -394
  112. package/dist/chunk-7KJ7T4D3.js +0 -910
  113. package/dist/chunk-7QQQNUB5.js +0 -92
  114. package/dist/chunk-7QWJBS72.js +0 -946
  115. package/dist/chunk-7R36OZK3.js +0 -957
  116. package/dist/chunk-7UPKCOHE.js +0 -946
  117. package/dist/chunk-A3BONW34.js +0 -35
  118. package/dist/chunk-AHMDVHBL.js +0 -141
  119. package/dist/chunk-AW6A4OZY.js +0 -171
  120. package/dist/chunk-BJ5EKCJ5.js +0 -458
  121. package/dist/chunk-BRGYDO7D.js +0 -223
  122. package/dist/chunk-C5KPSEDN.js +0 -359
  123. package/dist/chunk-CCTNYTUC.js +0 -940
  124. package/dist/chunk-CYQ2OVD2.js +0 -35
  125. package/dist/chunk-DDAK7YOE.js +0 -299
  126. package/dist/chunk-DRILKBY6.js +0 -965
  127. package/dist/chunk-DXE24HNN.js +0 -45
  128. package/dist/chunk-E7ICUNW7.js +0 -945
  129. package/dist/chunk-EAL2PUOE.js +0 -10022
  130. package/dist/chunk-ELT7MLZB.js +0 -109
  131. package/dist/chunk-EWEIRF6G.js +0 -171
  132. package/dist/chunk-F5VDGQJC.js +0 -120
  133. package/dist/chunk-FCPL3IEQ.js +0 -98
  134. package/dist/chunk-FDPKYSV7.js +0 -96
  135. package/dist/chunk-FES3TC24.js +0 -171
  136. package/dist/chunk-FOWKR5TW.js +0 -129
  137. package/dist/chunk-G3XIHPSQ.js +0 -361
  138. package/dist/chunk-GKJLYLVU.js +0 -359
  139. package/dist/chunk-GNXHXNVQ.js +0 -113
  140. package/dist/chunk-GSR6ILTM.js +0 -277
  141. package/dist/chunk-GWRIMRSX.js +0 -45
  142. package/dist/chunk-H72UW2HJ.js +0 -45
  143. package/dist/chunk-HGI74PXB.js +0 -7417
  144. package/dist/chunk-HGRA37LO.js +0 -145
  145. package/dist/chunk-HXSRQO3L.js +0 -145
  146. package/dist/chunk-IG2X2BVO.js +0 -373
  147. package/dist/chunk-IIJVDD54.js +0 -373
  148. package/dist/chunk-IX4BBOIT.js +0 -394
  149. package/dist/chunk-IXU4RMQM.js +0 -349
  150. package/dist/chunk-J6OUIION.js +0 -857
  151. package/dist/chunk-K46RNFDE.js +0 -171
  152. package/dist/chunk-KAGU2XMY.js +0 -359
  153. package/dist/chunk-KCVYJNVX.js +0 -394
  154. package/dist/chunk-KYLIQ3YI.js +0 -399
  155. package/dist/chunk-KZYJJIRN.js +0 -946
  156. package/dist/chunk-LFOX744K.js +0 -96
  157. package/dist/chunk-LHOVJEWR.js +0 -7403
  158. package/dist/chunk-LOPXTPF3.js +0 -120
  159. package/dist/chunk-LZR3VIFU.js +0 -907
  160. package/dist/chunk-MCKGQKYU.js +0 -15
  161. package/dist/chunk-MU6EOS6F.js +0 -0
  162. package/dist/chunk-MWRQ2TXT.js +0 -357
  163. package/dist/chunk-NO73OK2I.js +0 -102
  164. package/dist/chunk-NPE2YJHK.js +0 -394
  165. package/dist/chunk-NSDXU6QX.js +0 -2213
  166. package/dist/chunk-NXIRDSZ6.js +0 -145
  167. package/dist/chunk-NZWFNHCS.js +0 -407
  168. package/dist/chunk-OB4CMMX6.js +0 -260
  169. package/dist/chunk-OBKU74FU.js +0 -7411
  170. package/dist/chunk-OQNDWRDE.js +0 -145
  171. package/dist/chunk-OVWAJMB6.js +0 -394
  172. package/dist/chunk-PDHLBTTD.js +0 -45
  173. package/dist/chunk-PEQNRKLG.js +0 -210
  174. package/dist/chunk-QERIS7QY.js +0 -7403
  175. package/dist/chunk-QHA2DM3C.js +0 -373
  176. package/dist/chunk-QLM4HSYC.js +0 -45
  177. package/dist/chunk-S2OT3TQJ.js +0 -283
  178. package/dist/chunk-S5PHSN5K.js +0 -907
  179. package/dist/chunk-SIAA4J6H.js +0 -21
  180. package/dist/chunk-SQBNLUIA.js +0 -171
  181. package/dist/chunk-STLN6A6B.js +0 -355
  182. package/dist/chunk-U7HV7GU2.js +0 -17
  183. package/dist/chunk-UGZHOGRA.js +0 -39
  184. package/dist/chunk-UICF66FS.js +0 -359
  185. package/dist/chunk-UK3EQREE.js +0 -1078
  186. package/dist/chunk-UPKPURVY.js +0 -394
  187. package/dist/chunk-URC74VCN.js +0 -959
  188. package/dist/chunk-V3G7Q3QQ.js +0 -102
  189. package/dist/chunk-VUJ6SA55.js +0 -303
  190. package/dist/chunk-VUJQLIML.js +0 -141
  191. package/dist/chunk-VWKLKLYB.js +0 -267
  192. package/dist/chunk-VYC3RZMK.js +0 -277
  193. package/dist/chunk-WMERMSWI.js +0 -154
  194. package/dist/chunk-WMR777PO.js +0 -2213
  195. package/dist/chunk-X46IECAC.js +0 -517
  196. package/dist/chunk-XEN3OEYY.js +0 -2234
  197. package/dist/chunk-XZQ66K7A.js +0 -124
  198. package/dist/chunk-YY3GF7DH.js +0 -7411
  199. package/dist/chunk-ZE5R3H4C.js +0 -907
  200. package/dist/chunk-ZMN5LUB7.js +0 -7411
  201. package/dist/chunk-ZUV4MD5U.js +0 -94
  202. package/dist/config-KMY6RRK3.js +0 -19
  203. package/dist/config-VDMK2DUJ.js +0 -19
  204. package/dist/deploy-SO7AFK6L.js +0 -9
  205. package/dist/engine-7GXBM4IT.js +0 -7
  206. package/dist/engine-NSR6BIF7.js +0 -7
  207. package/dist/factory-2P64OC7M.js +0 -34
  208. package/dist/factory-YP4ZZK5K.js +0 -34
  209. package/dist/import-AJLYHFIA.js +0 -10
  210. package/dist/launch-explorer-AI6L2AWJ.js +0 -91
  211. package/dist/query-GJL3CVGN.js +0 -31
  212. package/dist/query-MBJSK3EB.js +0 -31
  213. package/dist/query-TJHEVSKL.js +0 -31
  214. package/dist/query-WUIKOHPE.js +0 -524
  215. package/dist/remote-manager-BLJZ6KF6.js +0 -224
  216. package/dist/remote-manager-BPYE46SI.js +0 -223
  217. package/dist/remote-manager-FMESEAFA.js +0 -224
  218. package/dist/remote-manager-K2WZ5RHY.js +0 -223
  219. package/dist/remote-manager-SG5PQKCH.js +0 -224
  220. package/dist/remote-manager-WGP6MIQZ.js +0 -224
  221. package/dist/sdk-3KBB3E6V.js +0 -16
  222. package/dist/sdk-4ZQO6UTU.js +0 -16
  223. package/dist/sdk-6JA6GV3G.js +0 -16
  224. package/dist/sdk-6VTP5UTZ.js +0 -16
  225. package/dist/sdk-7VS6TYCD.js +0 -16
  226. package/dist/sdk-HQ3FTLRT.js +0 -16
  227. package/dist/sdk-HZ7NU3XE.js +0 -15
  228. package/dist/sdk-KBQE2OXT.js +0 -16
  229. package/dist/sdk-MSCDZ7JU.js +0 -15
  230. package/dist/sdk-WNZOGO3S.js +0 -15
  231. package/dist/sdk-YLV33ZCW.js +0 -9
  232. package/dist/sdk-ZSUD2LLJ.js +0 -16
  233. package/dist/server-AFXFFBWA.js +0 -11
  234. package/dist/server-AGHC4VUL.js +0 -11
  235. package/dist/server-DBUY2KY5.js +0 -11
  236. package/dist/server-GWBQJPRG.js +0 -11
  237. package/dist/server-JZZFULVU.js +0 -11
  238. package/dist/server-L5XAF4M5.js +0 -11
  239. package/dist/server-NYFUHANA.js +0 -12
  240. package/dist/server-OABUB2LO.js +0 -12
  241. package/dist/server-P2CKZWWV.js +0 -12
  242. package/dist/sprites-XVSMQLSI.js +0 -15
  243. package/dist/sql-wasm-FORCZFHZ.js +0 -2148
  244. package/dist/sql-wasm-JZH76RLO.js +0 -2148
  245. package/dist/sqljs-backend-CJQOIQYE.js +0 -266
  246. package/dist/sqljs-backend-KWXBUDUO.js +0 -266
  247. package/dist/state-demo.bundle.js +0 -1033
  248. package/dist/tenancy-CBWYEVUB.js +0 -11
  249. package/dist/tenancy-FO6WVYFN.js +0 -13
  250. package/dist/tenancy-FWDBESMX.js +0 -14
  251. package/dist/tenancy-HGPIS5QA.js +0 -13
  252. package/dist/tenancy-HXFALA37.js +0 -14
  253. package/dist/tenancy-V7ARWNNV.js +0 -14
  254. package/dist/tenancy-ZDN4GXK5.js +0 -13
  255. package/dist/tenancy-ZT5VMY7B.js +0 -14
  256. package/dist/vm-config-YZRJ3KUB.js +0 -21
  257. /package/dist/{chunk-2BRTCEHB.js → chunk-PZ4XYZ4J.js} +0 -0
  258. /package/dist/{chunk-EO3J7GRP.js → chunk-WXSWA3MV.js} +0 -0
@@ -1,910 +0,0 @@
1
- import {
2
- EAVStore,
3
- init_eav_store
4
- } from "./chunk-4XIVMVHC.js";
5
- import {
6
- QueryEngine
7
- } from "./chunk-6CTA6MCE.js";
8
-
9
- // src/core/kernel/trellis-kernel.ts
10
- init_eav_store();
11
-
12
- // src/core/ontology/core-ontology.ts
13
- var VERSION = "1.0.0";
14
- function f(name, valueType, opts) {
15
- return { name, valueType, ...opts };
16
- }
17
- var thing = {
18
- "@id": "core:Thing",
19
- "@type": "trellis:Schema",
20
- version: VERSION,
21
- tier: "core",
22
- label: "Thing",
23
- icon: "lucide:box",
24
- fields: [
25
- f("id", "title", { required: true }),
26
- f("createdAt", "date"),
27
- f("updatedAt", "date"),
28
- f("createdBy", "relation", {
29
- relation: { targetSchema: "core:Member", cardinality: "one" }
30
- }),
31
- f("tags", "multi_select")
32
- ]
33
- };
34
- var record = {
35
- "@id": "core:Record",
36
- "@type": "trellis:Schema",
37
- version: VERSION,
38
- tier: "core",
39
- subClassOf: "core:Thing",
40
- label: "Record",
41
- icon: "lucide:file",
42
- fields: [
43
- f("title", "title", { required: true }),
44
- f("description", "rich_text"),
45
- f("status", "select"),
46
- f("tags", "multi_select")
47
- ]
48
- };
49
- var document = {
50
- "@id": "core:Document",
51
- "@type": "trellis:Schema",
52
- version: VERSION,
53
- tier: "core",
54
- subClassOf: "core:Record",
55
- label: "Document",
56
- icon: "lucide:file-text",
57
- fields: [
58
- f("content", "rich_text"),
59
- f("mimeType", "rich_text"),
60
- f("fileUrl", "url")
61
- ]
62
- };
63
- var event = {
64
- "@id": "core:Event",
65
- "@type": "trellis:Schema",
66
- version: VERSION,
67
- tier: "core",
68
- subClassOf: "core:Record",
69
- label: "Event",
70
- icon: "lucide:calendar",
71
- fields: [
72
- f("startDate", "date"),
73
- f("endDate", "date"),
74
- f("location", "rich_text"),
75
- f("allDay", "checkbox")
76
- ]
77
- };
78
- var collection = {
79
- "@id": "core:Collection",
80
- "@type": "trellis:Schema",
81
- version: VERSION,
82
- tier: "core",
83
- subClassOf: "core:Thing",
84
- label: "Collection",
85
- icon: "lucide:database",
86
- fields: [
87
- f("title", "title", { required: true }),
88
- f("description", "rich_text"),
89
- f("icon", "rich_text"),
90
- f("schema", "rich_text"),
91
- f("recordType", "relation", {
92
- relation: { targetSchema: "core:Record", cardinality: "one" }
93
- })
94
- ]
95
- };
96
- var tag = {
97
- "@id": "core:Tag",
98
- "@type": "trellis:Schema",
99
- version: VERSION,
100
- tier: "core",
101
- subClassOf: "core:Thing",
102
- label: "Tag",
103
- icon: "lucide:tag",
104
- fields: [
105
- f("name", "title", { required: true }),
106
- f("slug", "rich_text"),
107
- f("color", "rich_text"),
108
- f("icon", "rich_text"),
109
- f("parentTag", "relation", {
110
- relation: { targetSchema: "core:Tag", cardinality: "one" }
111
- })
112
- ]
113
- };
114
- var workspace = {
115
- "@id": "core:Workspace",
116
- "@type": "trellis:Schema",
117
- version: VERSION,
118
- tier: "core",
119
- subClassOf: "core:Thing",
120
- label: "Workspace",
121
- icon: "lucide:building-2",
122
- fields: [
123
- f("name", "title", { required: true }),
124
- f("slug", "rich_text"),
125
- f("avatar", "files"),
126
- f("plan", "select")
127
- ]
128
- };
129
- var app = {
130
- "@id": "core:App",
131
- "@type": "trellis:Schema",
132
- version: VERSION,
133
- tier: "core",
134
- subClassOf: "core:Thing",
135
- label: "App",
136
- icon: "lucide:layout-grid",
137
- fields: [
138
- f("name", "title", { required: true }),
139
- f("slug", "rich_text"),
140
- f("icon", "rich_text"),
141
- f("color", "rich_text"),
142
- f("description", "rich_text"),
143
- f("ontologies", "multi_select")
144
- ]
145
- };
146
- var member = {
147
- "@id": "core:Member",
148
- "@type": "trellis:Schema",
149
- version: VERSION,
150
- tier: "core",
151
- subClassOf: "core:Thing",
152
- label: "Member",
153
- icon: "lucide:user",
154
- fields: [
155
- f("name", "title", { required: true }),
156
- f("email", "email"),
157
- f("avatar", "files"),
158
- f("role", "select", {
159
- required: true,
160
- selectOptions: ["owner", "admin", "member", "guest"],
161
- defaultValue: "member"
162
- }),
163
- f("status", "select", {
164
- required: true,
165
- selectOptions: ["pending", "active", "suspended"],
166
- defaultValue: "pending"
167
- }),
168
- f("orgId", "relation", {
169
- required: true,
170
- relation: { targetSchema: "core:Workspace", cardinality: "one" }
171
- }),
172
- f("userId", "relation", {
173
- relation: { targetSchema: "core:Person", cardinality: "one" }
174
- }),
175
- f("invitedAt", "date"),
176
- f("joinedAt", "date")
177
- ]
178
- };
179
- var notification = {
180
- "@id": "core:Notification",
181
- "@type": "trellis:Schema",
182
- version: VERSION,
183
- tier: "core",
184
- subClassOf: "core:Thing",
185
- label: "Notification",
186
- icon: "lucide:bell",
187
- fields: [
188
- f("recipientId", "relation", {
189
- required: true,
190
- relation: { targetSchema: "core:Person", cardinality: "one" }
191
- }),
192
- f("orgId", "relation", {
193
- relation: { targetSchema: "core:Workspace", cardinality: "one" }
194
- }),
195
- f("orgName", "rich_text"),
196
- f("type", "select", {
197
- required: true,
198
- selectOptions: [
199
- "invite_accepted",
200
- "invite_sent",
201
- "member_joined",
202
- "member_removed",
203
- "role_changed",
204
- "mention",
205
- "comment",
206
- "entity_updated",
207
- "system"
208
- ]
209
- }),
210
- f("title", "title", { required: true }),
211
- f("message", "rich_text", { required: true }),
212
- f("actionUrl", "url"),
213
- f("icon", "rich_text"),
214
- f("variant", "select", {
215
- selectOptions: ["default", "success", "warning", "destructive", "info"]
216
- }),
217
- f("isRead", "checkbox", { defaultValue: false }),
218
- f("actorId", "relation", {
219
- relation: { targetSchema: "core:Person", cardinality: "one" }
220
- }),
221
- f("actorName", "rich_text"),
222
- f("metadata", "rich_text"),
223
- f("createdAt", "date", { required: true })
224
- ]
225
- };
226
- var share = {
227
- "@id": "core:Share",
228
- "@type": "trellis:Schema",
229
- version: VERSION,
230
- tier: "core",
231
- subClassOf: "core:Thing",
232
- label: "Share",
233
- icon: "lucide:share-2",
234
- fields: [
235
- f("entityId", "relation", { required: true }),
236
- f("entityType", "select", { selectOptions: ["entity", "collection"] }),
237
- f("userId", "relation", {
238
- required: true,
239
- relation: { targetSchema: "core:Person", cardinality: "one" }
240
- }),
241
- f("orgId", "relation", {
242
- relation: { targetSchema: "core:Workspace", cardinality: "one" }
243
- }),
244
- f("permission", "select", {
245
- required: true,
246
- selectOptions: ["view", "comment", "edit"],
247
- defaultValue: "view"
248
- }),
249
- f("sharedBy", "relation", {
250
- relation: { targetSchema: "core:Person", cardinality: "one" }
251
- }),
252
- f("createdAt", "date", { required: true })
253
- ]
254
- };
255
- var person = {
256
- "@id": "core:Person",
257
- "@type": "trellis:Schema",
258
- version: VERSION,
259
- tier: "core",
260
- subClassOf: "core:Thing",
261
- label: "Person",
262
- icon: "lucide:user",
263
- fields: [f("name", "title", { required: true })]
264
- };
265
- var workflow = {
266
- "@id": "core:Workflow",
267
- "@type": "trellis:Schema",
268
- version: VERSION,
269
- tier: "core",
270
- subClassOf: "core:Thing",
271
- label: "Workflow",
272
- icon: "lucide:git-branch",
273
- fields: [
274
- f("name", "title", { required: true }),
275
- f("trigger", "rich_text"),
276
- f("steps", "multi_select"),
277
- f("active", "checkbox")
278
- ]
279
- };
280
- var CORE_ONTOLOGY = [
281
- thing,
282
- record,
283
- document,
284
- event,
285
- collection,
286
- tag,
287
- workspace,
288
- app,
289
- member,
290
- notification,
291
- share,
292
- person,
293
- workflow
294
- ];
295
-
296
- // src/core/kernel/trellis-kernel.ts
297
- async function hashOp(kind, timestamp, agentId, previousHash, payload) {
298
- const data = `${kind}|${timestamp}|${agentId}|${previousHash ?? ""}|${payload}`;
299
- const buf = new TextEncoder().encode(data);
300
- const hashBuf = await crypto.subtle.digest("SHA-256", buf);
301
- const hex = Array.from(new Uint8Array(hashBuf)).map((b) => b.toString(16).padStart(2, "0")).join("");
302
- return `trellis:op:${hex}`;
303
- }
304
- var TrellisKernel = class {
305
- store;
306
- backend;
307
- middleware;
308
- agentId;
309
- snapshotThreshold;
310
- opsSinceSnapshot = 0;
311
- _booted = false;
312
- ontologies = /* @__PURE__ */ new Map();
313
- workspaceConfig = null;
314
- autoReplay = true;
315
- constructor(config) {
316
- this.store = new EAVStore();
317
- this.backend = config.backend;
318
- this.agentId = config.agentId;
319
- this.middleware = config.middleware ?? [];
320
- this.snapshotThreshold = config.snapshotThreshold ?? 0;
321
- this.autoReplay = config.autoReplay ?? true;
322
- for (const schema of CORE_ONTOLOGY) {
323
- this.ontologies.set(schema["@id"], schema);
324
- }
325
- }
326
- // -------------------------------------------------------------------------
327
- // Lifecycle
328
- // -------------------------------------------------------------------------
329
- /**
330
- * Initialize the backend and replay persisted state.
331
- * Loads latest snapshot if available, then replays ops after it.
332
- */
333
- boot() {
334
- this.backend.init();
335
- if (!this.autoReplay) {
336
- this._booted = true;
337
- return { opsReplayed: 0, fromSnapshot: false };
338
- }
339
- let opsReplayed = 0;
340
- let fromSnapshot = false;
341
- const snapshot = this.backend.loadLatestSnapshot();
342
- if (snapshot) {
343
- this.store.restore(snapshot.data);
344
- fromSnapshot = true;
345
- const recentOps = this.backend.readAfter(snapshot.lastOpHash);
346
- for (const op of recentOps) {
347
- this._replayOp(op);
348
- opsReplayed++;
349
- }
350
- } else {
351
- const allOps = this.backend.readAll();
352
- for (const op of allOps) {
353
- this._replayOp(op);
354
- opsReplayed++;
355
- }
356
- }
357
- this._booted = true;
358
- return { opsReplayed, fromSnapshot };
359
- }
360
- /**
361
- * Close the backend connection.
362
- */
363
- close() {
364
- this.backend.close?.();
365
- this._booted = false;
366
- }
367
- isBooted() {
368
- return this._booted;
369
- }
370
- // -------------------------------------------------------------------------
371
- // Mutations
372
- // -------------------------------------------------------------------------
373
- /**
374
- * Apply a mutation to the graph. Creates an op, runs it through middleware,
375
- * decomposes into EAV primitives, persists, and returns the result.
376
- */
377
- async mutate(kind, payload, ctx) {
378
- const timestamp = (/* @__PURE__ */ new Date()).toISOString();
379
- const lastOp = this.backend.getLastOp();
380
- const agentId = ctx?.agentId ?? this.agentId;
381
- const payloadStr = JSON.stringify(payload);
382
- const hash = await hashOp(
383
- kind,
384
- timestamp,
385
- agentId,
386
- lastOp?.hash,
387
- payloadStr
388
- );
389
- const op = {
390
- hash,
391
- kind,
392
- timestamp,
393
- agentId,
394
- previousHash: lastOp?.hash,
395
- facts: [...payload.facts ?? []],
396
- links: [...payload.links ?? []],
397
- deleteFacts: payload.deleteFacts?.length ? [...payload.deleteFacts] : void 0,
398
- deleteLinks: payload.deleteLinks?.length ? [...payload.deleteLinks] : void 0
399
- };
400
- const extOp = op;
401
- if (payload.meta) {
402
- for (const [k, v] of Object.entries(payload.meta)) {
403
- extOp[k] = v;
404
- }
405
- }
406
- const mwCtx = { agentId, ...ctx };
407
- await this._runMiddleware(op, mwCtx);
408
- let factsAdded = 0;
409
- let factsDeleted = 0;
410
- let linksAdded = 0;
411
- let linksDeleted = 0;
412
- if (payload.deleteFacts && payload.deleteFacts.length > 0) {
413
- this.store.deleteFacts(payload.deleteFacts);
414
- factsDeleted = payload.deleteFacts.length;
415
- }
416
- if (payload.deleteLinks && payload.deleteLinks.length > 0) {
417
- this.store.deleteLinks(payload.deleteLinks);
418
- linksDeleted = payload.deleteLinks.length;
419
- }
420
- if (payload.facts && payload.facts.length > 0) {
421
- this.store.addFacts(payload.facts);
422
- factsAdded = payload.facts.length;
423
- }
424
- if (payload.links && payload.links.length > 0) {
425
- this.store.addLinks(payload.links);
426
- linksAdded = payload.links.length;
427
- }
428
- this.backend.append(op);
429
- this.opsSinceSnapshot++;
430
- if (this.snapshotThreshold > 0 && this.opsSinceSnapshot >= this.snapshotThreshold) {
431
- this.checkpoint();
432
- }
433
- return {
434
- op,
435
- factsDelta: { added: factsAdded, deleted: factsDeleted },
436
- linksDelta: { added: linksAdded, deleted: linksDeleted }
437
- };
438
- }
439
- /**
440
- * Create a snapshot of the current store state.
441
- */
442
- checkpoint() {
443
- const lastOp = this.backend.getLastOp();
444
- if (!lastOp) return;
445
- this.backend.saveSnapshot(lastOp.hash, this.store.snapshot());
446
- this.opsSinceSnapshot = 0;
447
- }
448
- // -------------------------------------------------------------------------
449
- // Queries
450
- // -------------------------------------------------------------------------
451
- /**
452
- * Get the underlying EAV store for direct queries.
453
- */
454
- getStore() {
455
- return this.store;
456
- }
457
- /**
458
- * Get the persistence backend.
459
- */
460
- getBackend() {
461
- return this.backend;
462
- }
463
- /**
464
- * Get the agent ID.
465
- */
466
- getAgentId() {
467
- return this.agentId;
468
- }
469
- /**
470
- * Read all persisted ops.
471
- */
472
- readAllOps() {
473
- return this.backend.readAll();
474
- }
475
- /**
476
- * Get the last persisted op.
477
- */
478
- getLastOp() {
479
- return this.backend.getLastOp();
480
- }
481
- /**
482
- * Create a QueryEngine bound to this kernel's store.
483
- */
484
- createQueryEngine() {
485
- return new QueryEngine(this.store);
486
- }
487
- /**
488
- * Execute an EQL-S query, routing through middleware handleQuery hooks.
489
- * If no middleware intercepts, the query runs directly against the store.
490
- */
491
- async query(q) {
492
- const engine = new QueryEngine(this.store);
493
- const ctx = {
494
- agentId: this.agentId,
495
- store: this.store
496
- };
497
- const chain = this.middleware.filter((m) => m.handleQuery);
498
- if (chain.length === 0) {
499
- return engine.execute(q);
500
- }
501
- let result;
502
- let idx = 0;
503
- const next = (query, context) => {
504
- if (idx < chain.length) {
505
- const mw = chain[idx++];
506
- return mw.handleQuery(query, context, next);
507
- }
508
- result = engine.execute(query);
509
- return result;
510
- };
511
- result = next(q, ctx);
512
- return result;
513
- }
514
- /**
515
- * Time-travel: reconstruct the store state at a specific op hash.
516
- * Returns a new EAVStore with state replayed up to (and including) that op.
517
- */
518
- timeTravel(opHash) {
519
- const ops = this.backend.readUntil(opHash);
520
- const snapshot = new EAVStore();
521
- for (const op of ops) {
522
- if (op.deleteFacts && op.deleteFacts.length > 0) {
523
- snapshot.deleteFacts(op.deleteFacts);
524
- }
525
- if (op.deleteLinks && op.deleteLinks.length > 0) {
526
- snapshot.deleteLinks(op.deleteLinks);
527
- }
528
- if (op.facts && op.facts.length > 0) {
529
- snapshot.addFacts(op.facts);
530
- }
531
- if (op.links && op.links.length > 0) {
532
- snapshot.addLinks(op.links);
533
- }
534
- }
535
- return snapshot;
536
- }
537
- // -------------------------------------------------------------------------
538
- // Entity CRUD (high-level graph operations)
539
- // -------------------------------------------------------------------------
540
- /**
541
- * Create a new entity with the given type and attributes.
542
- * Returns the entity ID.
543
- */
544
- async createEntity(entityId, type, attributes = {}, links) {
545
- const facts = [
546
- { e: entityId, a: "type", v: type },
547
- { e: entityId, a: "createdAt", v: (/* @__PURE__ */ new Date()).toISOString() }
548
- ];
549
- for (const [attr, value] of Object.entries(attributes)) {
550
- facts.push({ e: entityId, a: attr, v: value });
551
- }
552
- const linkRecords = (links ?? []).map((l) => ({
553
- e1: entityId,
554
- a: l.attribute,
555
- e2: l.targetEntityId
556
- }));
557
- return this.mutate("addFacts", {
558
- facts,
559
- links: linkRecords.length > 0 ? linkRecords : void 0
560
- });
561
- }
562
- /**
563
- * Get an entity by ID, returning all its facts and links.
564
- */
565
- getEntity(entityId) {
566
- const facts = this.store.getFactsByEntity(entityId);
567
- if (facts.length === 0) return null;
568
- const typeFact = facts.find((f2) => f2.a === "type");
569
- return {
570
- id: entityId,
571
- type: typeFact?.v ?? "unknown",
572
- facts,
573
- links: this.store.getLinksByEntity(entityId)
574
- };
575
- }
576
- /**
577
- * Update an entity's attributes. Deletes old values and adds new ones.
578
- */
579
- async updateEntity(entityId, updates) {
580
- const existingFacts = this.store.getFactsByEntity(entityId);
581
- const deleteFacts = [];
582
- const addFacts = [];
583
- for (const [attr, newValue] of Object.entries(updates)) {
584
- const existing = existingFacts.filter((f2) => f2.a === attr);
585
- deleteFacts.push(...existing);
586
- addFacts.push({ e: entityId, a: attr, v: newValue });
587
- }
588
- const updatedAtFacts = existingFacts.filter((f2) => f2.a === "updatedAt");
589
- deleteFacts.push(...updatedAtFacts);
590
- addFacts.push({ e: entityId, a: "updatedAt", v: (/* @__PURE__ */ new Date()).toISOString() });
591
- return this.mutate("addFacts", {
592
- facts: addFacts,
593
- deleteFacts
594
- });
595
- }
596
- /**
597
- * Delete an entity and all its facts and links.
598
- */
599
- async deleteEntity(entityId) {
600
- const facts = this.store.getFactsByEntity(entityId);
601
- const links = this.store.getLinksByEntity(entityId);
602
- return this.mutate("deleteFacts", {
603
- deleteFacts: facts,
604
- deleteLinks: links
605
- });
606
- }
607
- /**
608
- * List entities by type, with optional attribute filters.
609
- */
610
- listEntities(type, filters) {
611
- let entityIds;
612
- if (type) {
613
- const typeFacts = this.store.getFactsByValue("type", type);
614
- entityIds = new Set(typeFacts.map((f2) => f2.e));
615
- } else {
616
- const allTypeFacts = this.store.getFactsByAttribute("type");
617
- entityIds = new Set(allTypeFacts.map((f2) => f2.e));
618
- }
619
- if (filters) {
620
- for (const [attr, value] of Object.entries(filters)) {
621
- const matchingFacts = this.store.getFactsByValue(attr, value);
622
- const matchingEntities = new Set(matchingFacts.map((f2) => f2.e));
623
- for (const id of entityIds) {
624
- if (!matchingEntities.has(id)) {
625
- entityIds.delete(id);
626
- }
627
- }
628
- }
629
- }
630
- return Array.from(entityIds).map((id) => this.getEntity(id)).filter(Boolean);
631
- }
632
- /**
633
- * Add a link between two entities.
634
- */
635
- async addLink(sourceId, attribute, targetId) {
636
- return this.mutate("addLinks", {
637
- links: [{ e1: sourceId, a: attribute, e2: targetId }]
638
- });
639
- }
640
- /**
641
- * Remove a link between two entities.
642
- */
643
- async removeLink(sourceId, attribute, targetId) {
644
- return this.mutate("deleteLinks", {
645
- deleteLinks: [{ e1: sourceId, a: attribute, e2: targetId }]
646
- });
647
- }
648
- /**
649
- * Add a fact to an entity.
650
- */
651
- async addFact(entityId, attribute, value) {
652
- return this.mutate("addFacts", {
653
- facts: [{ e: entityId, a: attribute, v: value }]
654
- });
655
- }
656
- /**
657
- * Remove a fact from an entity.
658
- */
659
- async removeFact(entityId, attribute, value) {
660
- return this.mutate("deleteFacts", {
661
- deleteFacts: [{ e: entityId, a: attribute, v: value }]
662
- });
663
- }
664
- // -------------------------------------------------------------------------
665
- // Ontology CRUD
666
- // -------------------------------------------------------------------------
667
- /**
668
- * Get an ontology schema by ID.
669
- */
670
- getOntology(id) {
671
- return this.ontologies.get(id);
672
- }
673
- /**
674
- * List all ontologies.
675
- */
676
- listOntologies() {
677
- return Array.from(this.ontologies.values());
678
- }
679
- /**
680
- * Create a new ontology schema.
681
- */
682
- createOntology(schema) {
683
- const tier = schema.tier ?? "user";
684
- if (tier === "core") {
685
- throw new Error("Cannot modify core ontologies");
686
- }
687
- if (this.ontologies.has(schema["@id"])) {
688
- throw new Error(`Ontology ${schema["@id"]} already exists`);
689
- }
690
- this.ontologies.set(schema["@id"], schema);
691
- const fact = {
692
- e: schema["@id"],
693
- a: "schema",
694
- v: JSON.stringify(schema)
695
- };
696
- this.store.addFacts([fact]);
697
- }
698
- /**
699
- * Update an existing ontology schema.
700
- */
701
- updateOntology(id, updates) {
702
- const existing = this.ontologies.get(id);
703
- if (!existing) {
704
- throw new Error(`Ontology ${id} not found`);
705
- }
706
- const tier = existing.tier ?? "user";
707
- if (tier === "core") {
708
- throw new Error("Cannot modify core ontologies");
709
- }
710
- const updated = { ...existing, ...updates };
711
- this.ontologies.set(id, updated);
712
- const existingFacts = this.store.getFactsByEntity(id);
713
- const schemaFacts = existingFacts.filter((f2) => f2.a === "schema");
714
- const deleteFacts = [...schemaFacts];
715
- const addFacts = [
716
- {
717
- e: id,
718
- a: "schema",
719
- v: JSON.stringify(updated)
720
- }
721
- ];
722
- this.store.deleteFacts(deleteFacts);
723
- this.store.addFacts(addFacts);
724
- }
725
- /**
726
- * Delete an ontology schema.
727
- */
728
- deleteOntology(id) {
729
- const existing = this.ontologies.get(id);
730
- if (!existing) {
731
- throw new Error(`Ontology ${id} not found`);
732
- }
733
- const tier = existing.tier ?? "user";
734
- if (tier === "core") {
735
- throw new Error("Cannot delete core ontologies");
736
- }
737
- this.ontologies.delete(id);
738
- const facts = this.store.getFactsByEntity(id);
739
- this.store.deleteFacts(facts);
740
- }
741
- // -------------------------------------------------------------------------
742
- // Workspace
743
- // -------------------------------------------------------------------------
744
- /**
745
- * Boot the kernel with a workspace configuration.
746
- * Loads ontologies, projections, and seed data.
747
- */
748
- bootWorkspace(config) {
749
- this.workspaceConfig = config;
750
- if (config.workspace.ontologies) {
751
- for (const [id, schema] of Object.entries(config.workspace.ontologies)) {
752
- if (!this.ontologies.has(id)) {
753
- this.ontologies.set(id, schema);
754
- }
755
- }
756
- }
757
- if (config.workspace.graph?.nodes) {
758
- for (const node of config.workspace.graph.nodes) {
759
- const n = node;
760
- if (n.id && n.type) {
761
- const facts = [
762
- { e: String(n.id), a: "type", v: String(n.type) }
763
- ];
764
- for (const [key, value] of Object.entries(n)) {
765
- if (key !== "id" && key !== "type") {
766
- facts.push({ e: String(n.id), a: key, v: value });
767
- }
768
- }
769
- this.store.addFacts(facts);
770
- }
771
- }
772
- }
773
- if (config.workspace.graph?.edges) {
774
- for (const edge of config.workspace.graph.edges) {
775
- const e = edge;
776
- if (e.source && e.target && e.relation) {
777
- this.store.addLinks([
778
- {
779
- e1: String(e.source),
780
- a: String(e.relation),
781
- e2: String(e.target)
782
- }
783
- ]);
784
- }
785
- }
786
- }
787
- this.boot();
788
- }
789
- /**
790
- * Export the current workspace configuration.
791
- */
792
- exportWorkspace() {
793
- const ontologies = {};
794
- for (const [id, schema] of this.ontologies) {
795
- if (schema.tier !== "core") {
796
- ontologies[id] = schema;
797
- }
798
- }
799
- const allFacts = this.store.getAllFacts();
800
- const nodes = [];
801
- const entityIds = new Set(allFacts.map((f2) => f2.e));
802
- for (const id of entityIds) {
803
- const facts = this.store.getFactsByEntity(id);
804
- const typeFact = facts.find((f2) => f2.a === "type");
805
- const node = { id };
806
- if (typeFact) {
807
- node.type = typeFact.v;
808
- }
809
- for (const fact of facts) {
810
- if (fact.a !== "type") {
811
- node[fact.a] = fact.v;
812
- }
813
- }
814
- nodes.push(node);
815
- }
816
- const allLinks = this.store.getAllLinks();
817
- const edges = allLinks.map((l) => ({
818
- source: l.e1,
819
- relation: l.a,
820
- target: l.e2
821
- }));
822
- return {
823
- workspace: {
824
- name: this.workspaceConfig?.workspace.name,
825
- description: this.workspaceConfig?.workspace.description,
826
- ontologies: Object.keys(ontologies).length > 0 ? ontologies : void 0,
827
- graph: { nodes, edges },
828
- projections: this.workspaceConfig?.workspace.projections,
829
- routes: this.workspaceConfig?.workspace.routes,
830
- app: this.workspaceConfig?.workspace.app
831
- }
832
- };
833
- }
834
- // -------------------------------------------------------------------------
835
- // TQL Compatibility Aliases
836
- // -------------------------------------------------------------------------
837
- /**
838
- * Create a node (alias for createEntity with schema validation).
839
- */
840
- async createNode(id, data, type, _ctx) {
841
- return this.createEntity(id, type, data);
842
- }
843
- /**
844
- * Update a node (alias for updateEntity with schema validation).
845
- */
846
- async updateNode(id, data, type, _ctx) {
847
- return this.updateEntity(id, data);
848
- }
849
- /**
850
- * Delete a node (alias for deleteEntity).
851
- */
852
- async deleteNode(id, _ctx) {
853
- return this.deleteEntity(id);
854
- }
855
- /**
856
- * Link two nodes (alias for addLink).
857
- */
858
- async link(e1, a, e2, _ctx) {
859
- return this.addLink(e1, a, e2);
860
- }
861
- /**
862
- * Unlink two nodes (alias for removeLink).
863
- */
864
- async unlink(e1, a, e2, _ctx) {
865
- return this.removeLink(e1, a, e2);
866
- }
867
- // -------------------------------------------------------------------------
868
- // Middleware
869
- // -------------------------------------------------------------------------
870
- addMiddleware(mw) {
871
- this.middleware.push(mw);
872
- }
873
- removeMiddleware(name) {
874
- this.middleware = this.middleware.filter((m) => m.name !== name);
875
- }
876
- // -------------------------------------------------------------------------
877
- // Internal
878
- // -------------------------------------------------------------------------
879
- async _runMiddleware(op, ctx) {
880
- const chain = [...this.middleware];
881
- let idx = 0;
882
- const next = async (op2, ctx2) => {
883
- const mw = chain[idx++];
884
- if (mw?.handleOp) {
885
- await mw.handleOp(op2, ctx2, next);
886
- }
887
- };
888
- if (chain.length > 0) {
889
- await next(op, ctx);
890
- }
891
- }
892
- _replayOp(op) {
893
- if (op.deleteFacts && op.deleteFacts.length > 0) {
894
- this.store.deleteFacts(op.deleteFacts);
895
- }
896
- if (op.deleteLinks && op.deleteLinks.length > 0) {
897
- this.store.deleteLinks(op.deleteLinks);
898
- }
899
- if (op.facts && op.facts.length > 0) {
900
- this.store.addFacts(op.facts);
901
- }
902
- if (op.links && op.links.length > 0) {
903
- this.store.addLinks(op.links);
904
- }
905
- }
906
- };
907
-
908
- export {
909
- TrellisKernel
910
- };