trellis 3.2.0 → 3.2.3

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 (260) 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-2AACZRII.js} +312 -30
  7. package/dist/{chunk-3GDRZTAW.js → chunk-5KSGGKET.js} +1 -1
  8. package/dist/{chunk-MBNBTJCR.js → chunk-6GEZ6DN5.js} +2 -2
  9. package/dist/chunk-6RWGFC3N.js +403 -0
  10. package/dist/{chunk-X762XWVC.js → chunk-7DUMWO5L.js} +1 -1
  11. package/dist/chunk-CAG4FULI.js +121 -0
  12. package/dist/{chunk-GD5QJXSS.js → chunk-FWRS4CSC.js} +2 -2
  13. package/dist/{chunk-36VSSTL7.js → chunk-GU374KWZ.js} +1 -1
  14. package/dist/{chunk-BJ7EZ7FP.js → chunk-JHHEXEDM.js} +17 -0
  15. package/dist/{chunk-7WQGTFVJ.js → chunk-L5N5PR2S.js} +130 -75
  16. package/dist/{chunk-BXSTJVE3.js → chunk-N6MYZT4O.js} +2 -1
  17. package/dist/chunk-NWSW5YNS.js +225 -0
  18. package/dist/{chunk-HO4TURXW.js → chunk-S3XLFZ27.js} +28 -11
  19. package/dist/{chunk-BQBUVMRN.js → chunk-S6GBJ2ZB.js} +25 -14
  20. package/dist/{chunk-B3ZIFA2O.js → chunk-VBYUTRXX.js} +1 -1
  21. package/dist/cli/deploy-cli.d.ts +18 -0
  22. package/dist/cli/deploy-cli.d.ts.map +1 -0
  23. package/dist/cli/deploy-cli.js +67 -0
  24. package/dist/cli/index.d.ts +1 -1
  25. package/dist/cli/index.d.ts.map +1 -1
  26. package/dist/cli/index.js +153 -100
  27. package/dist/client/index.browser.d.ts +29 -0
  28. package/dist/client/index.browser.d.ts.map +1 -0
  29. package/dist/client/index.browser.js +64 -0
  30. package/dist/client/index.js +10 -10
  31. package/dist/client/sdk.browser.d.ts +131 -0
  32. package/dist/client/sdk.browser.d.ts.map +1 -0
  33. package/dist/{sdk-LZ7W3EEY.js → client/sdk.browser.js} +2 -2
  34. package/dist/client/sdk.js +1 -1
  35. package/dist/db/index.js +16 -16
  36. package/dist/db/inspector.js +6 -6
  37. package/dist/decisions/index.js +2 -2
  38. package/dist/embeddings/auto-embed.d.ts.map +1 -1
  39. package/dist/embeddings/index.js +1 -1
  40. package/dist/embeddings/store.d.ts.map +1 -1
  41. package/dist/engine.d.ts +27 -7
  42. package/dist/engine.d.ts.map +1 -1
  43. package/dist/index.js +6 -6
  44. package/dist/mcp/server.d.ts.map +1 -1
  45. package/dist/react/index.js +2 -2
  46. package/dist/react/schema-hooks.js +7 -7
  47. package/dist/{remote-manager-SG545WNY.js → remote-manager-ODE3T2KR.js} +5 -5
  48. package/dist/scaffold/seed.d.ts.map +1 -1
  49. package/dist/scaffold/write.d.ts +1 -1
  50. package/dist/scaffold/write.d.ts.map +1 -1
  51. package/dist/schema/index.js +4 -3
  52. package/dist/server/cors.d.ts +13 -0
  53. package/dist/server/cors.d.ts.map +1 -0
  54. package/dist/server/deploy-meta.d.ts +25 -0
  55. package/dist/server/deploy-meta.d.ts.map +1 -0
  56. package/dist/server/deploy.d.ts +8 -3
  57. package/dist/server/deploy.d.ts.map +1 -1
  58. package/dist/server/deploy.js +9 -0
  59. package/dist/server/index.d.ts +5 -2
  60. package/dist/server/index.d.ts.map +1 -1
  61. package/dist/server/index.js +51 -17
  62. package/dist/server/realtime.d.ts +4 -1
  63. package/dist/server/realtime.d.ts.map +1 -1
  64. package/dist/server/server.d.ts +1 -0
  65. package/dist/server/server.d.ts.map +1 -1
  66. package/dist/server/sprites.d.ts +18 -1
  67. package/dist/server/sprites.d.ts.map +1 -1
  68. package/dist/server/tenancy.d.ts +4 -0
  69. package/dist/server/tenancy.d.ts.map +1 -1
  70. package/dist/server/usage-meter.d.ts +53 -0
  71. package/dist/server/usage-meter.d.ts.map +1 -0
  72. package/dist/{server-IGBIIJSF.js → server-OGVWNDNK.js} +6 -1
  73. package/dist/sprites-KQGTGM6W.js +27 -0
  74. package/dist/{tenancy-OP34NFFS.js → tenancy-POMWQP6M.js} +5 -3
  75. package/dist/vcs/index.js +3 -3
  76. package/dist/vcs/types.d.ts +2 -0
  77. package/dist/vcs/types.d.ts.map +1 -1
  78. package/package.json +17 -6
  79. package/dist/better-sqlite-backend-PII64VE6.js +0 -159
  80. package/dist/better-sqlite-backend-VUBVQ7SN.js +0 -209
  81. package/dist/better-sqlite-backend-Y3AQN65E.js +0 -159
  82. package/dist/better-sqlite-backend-Y3M7DXOX.js +0 -159
  83. package/dist/boot-middleware-FJDGVUM4.js +0 -9
  84. package/dist/boot-middleware-MLJUTLUM.js +0 -9
  85. package/dist/boot-middleware-ZZPDZNYR.js +0 -9
  86. package/dist/chunk-276LKLZR.js +0 -359
  87. package/dist/chunk-2CX5UCRV.js +0 -111
  88. package/dist/chunk-2ESYSVXG.js +0 -48
  89. package/dist/chunk-2I5JU73Y.js +0 -340
  90. package/dist/chunk-2UNSRRNB.js +0 -171
  91. package/dist/chunk-335UEHQR.js +0 -907
  92. package/dist/chunk-4CF2L46N.js +0 -29
  93. package/dist/chunk-5CINODKT.js +0 -41
  94. package/dist/chunk-5ESGWJ5L.js +0 -45
  95. package/dist/chunk-5FGLQGMF.js +0 -1676
  96. package/dist/chunk-5IQZFITY.js +0 -357
  97. package/dist/chunk-5JWFAQDW.js +0 -150
  98. package/dist/chunk-62UHTVU3.js +0 -141
  99. package/dist/chunk-66UJQT2I.js +0 -35
  100. package/dist/chunk-6RNNVOAS.js +0 -355
  101. package/dist/chunk-6X23PZ6H.js +0 -969
  102. package/dist/chunk-7C7LL6MB.js +0 -315
  103. package/dist/chunk-7F4HM3JG.js +0 -394
  104. package/dist/chunk-7KJ7T4D3.js +0 -910
  105. package/dist/chunk-7QQQNUB5.js +0 -92
  106. package/dist/chunk-7QWJBS72.js +0 -946
  107. package/dist/chunk-7R36OZK3.js +0 -957
  108. package/dist/chunk-7UPKCOHE.js +0 -946
  109. package/dist/chunk-A3BONW34.js +0 -35
  110. package/dist/chunk-AHMDVHBL.js +0 -141
  111. package/dist/chunk-AW6A4OZY.js +0 -171
  112. package/dist/chunk-BJ5EKCJ5.js +0 -458
  113. package/dist/chunk-BRGYDO7D.js +0 -223
  114. package/dist/chunk-C5KPSEDN.js +0 -359
  115. package/dist/chunk-CCTNYTUC.js +0 -940
  116. package/dist/chunk-CYQ2OVD2.js +0 -35
  117. package/dist/chunk-DDAK7YOE.js +0 -299
  118. package/dist/chunk-DRILKBY6.js +0 -965
  119. package/dist/chunk-DXE24HNN.js +0 -45
  120. package/dist/chunk-E7ICUNW7.js +0 -945
  121. package/dist/chunk-EAL2PUOE.js +0 -10022
  122. package/dist/chunk-ELT7MLZB.js +0 -109
  123. package/dist/chunk-EWEIRF6G.js +0 -171
  124. package/dist/chunk-F5VDGQJC.js +0 -120
  125. package/dist/chunk-FCPL3IEQ.js +0 -98
  126. package/dist/chunk-FDPKYSV7.js +0 -96
  127. package/dist/chunk-FES3TC24.js +0 -171
  128. package/dist/chunk-FF36CQHZ.js +0 -61
  129. package/dist/chunk-FOWKR5TW.js +0 -129
  130. package/dist/chunk-FZVCXDYW.js +0 -150
  131. package/dist/chunk-G3XIHPSQ.js +0 -361
  132. package/dist/chunk-GKJLYLVU.js +0 -359
  133. package/dist/chunk-GNXHXNVQ.js +0 -113
  134. package/dist/chunk-GSR6ILTM.js +0 -277
  135. package/dist/chunk-GWRIMRSX.js +0 -45
  136. package/dist/chunk-H72UW2HJ.js +0 -45
  137. package/dist/chunk-HGI74PXB.js +0 -7417
  138. package/dist/chunk-HGRA37LO.js +0 -145
  139. package/dist/chunk-HXSRQO3L.js +0 -145
  140. package/dist/chunk-IG2X2BVO.js +0 -373
  141. package/dist/chunk-IIJVDD54.js +0 -373
  142. package/dist/chunk-IUWVEEOX.js +0 -145
  143. package/dist/chunk-IX4BBOIT.js +0 -394
  144. package/dist/chunk-IXU4RMQM.js +0 -349
  145. package/dist/chunk-J6OUIION.js +0 -857
  146. package/dist/chunk-K46RNFDE.js +0 -171
  147. package/dist/chunk-KAGU2XMY.js +0 -359
  148. package/dist/chunk-KCVYJNVX.js +0 -394
  149. package/dist/chunk-KKDRMIV6.js +0 -419
  150. package/dist/chunk-KYLIQ3YI.js +0 -399
  151. package/dist/chunk-KZYJJIRN.js +0 -946
  152. package/dist/chunk-LFOX744K.js +0 -96
  153. package/dist/chunk-LHOVJEWR.js +0 -7403
  154. package/dist/chunk-LOPXTPF3.js +0 -120
  155. package/dist/chunk-LZR3VIFU.js +0 -907
  156. package/dist/chunk-MCKGQKYU.js +0 -15
  157. package/dist/chunk-MU6EOS6F.js +0 -0
  158. package/dist/chunk-MWRQ2TXT.js +0 -357
  159. package/dist/chunk-NO73OK2I.js +0 -102
  160. package/dist/chunk-NPE2YJHK.js +0 -394
  161. package/dist/chunk-NSDXU6QX.js +0 -2213
  162. package/dist/chunk-NXIRDSZ6.js +0 -145
  163. package/dist/chunk-NZWFNHCS.js +0 -407
  164. package/dist/chunk-OB4CMMX6.js +0 -260
  165. package/dist/chunk-OBKU74FU.js +0 -7411
  166. package/dist/chunk-OQNDWRDE.js +0 -145
  167. package/dist/chunk-OVWAJMB6.js +0 -394
  168. package/dist/chunk-PDHLBTTD.js +0 -45
  169. package/dist/chunk-PEQNRKLG.js +0 -210
  170. package/dist/chunk-QERIS7QY.js +0 -7403
  171. package/dist/chunk-QHA2DM3C.js +0 -373
  172. package/dist/chunk-QLM4HSYC.js +0 -45
  173. package/dist/chunk-S2OT3TQJ.js +0 -283
  174. package/dist/chunk-S5PHSN5K.js +0 -907
  175. package/dist/chunk-SIAA4J6H.js +0 -21
  176. package/dist/chunk-SQBNLUIA.js +0 -171
  177. package/dist/chunk-STLN6A6B.js +0 -355
  178. package/dist/chunk-U7HV7GU2.js +0 -17
  179. package/dist/chunk-UGZHOGRA.js +0 -39
  180. package/dist/chunk-UICF66FS.js +0 -359
  181. package/dist/chunk-UK3EQREE.js +0 -1078
  182. package/dist/chunk-UPKPURVY.js +0 -394
  183. package/dist/chunk-URC74VCN.js +0 -959
  184. package/dist/chunk-V3G7Q3QQ.js +0 -102
  185. package/dist/chunk-VUJ6SA55.js +0 -303
  186. package/dist/chunk-VUJQLIML.js +0 -141
  187. package/dist/chunk-VWKLKLYB.js +0 -267
  188. package/dist/chunk-VYC3RZMK.js +0 -277
  189. package/dist/chunk-WMERMSWI.js +0 -154
  190. package/dist/chunk-WMR777PO.js +0 -2213
  191. package/dist/chunk-X46IECAC.js +0 -517
  192. package/dist/chunk-XEN3OEYY.js +0 -2234
  193. package/dist/chunk-XZQ66K7A.js +0 -124
  194. package/dist/chunk-YY3GF7DH.js +0 -7411
  195. package/dist/chunk-ZE5R3H4C.js +0 -907
  196. package/dist/chunk-ZHVI7BQN.js +0 -1077
  197. package/dist/chunk-ZMN5LUB7.js +0 -7411
  198. package/dist/chunk-ZUV4MD5U.js +0 -94
  199. package/dist/config-KMY6RRK3.js +0 -19
  200. package/dist/config-VDMK2DUJ.js +0 -19
  201. package/dist/db/trellis.css +0 -1
  202. package/dist/deploy-66EC752W.js +0 -9
  203. package/dist/deploy-SO7AFK6L.js +0 -9
  204. package/dist/engine-7GXBM4IT.js +0 -7
  205. package/dist/engine-NSR6BIF7.js +0 -7
  206. package/dist/factory-2P64OC7M.js +0 -34
  207. package/dist/factory-YP4ZZK5K.js +0 -34
  208. package/dist/import-AJLYHFIA.js +0 -10
  209. package/dist/launch-explorer-AI6L2AWJ.js +0 -91
  210. package/dist/query-GJL3CVGN.js +0 -31
  211. package/dist/query-MBJSK3EB.js +0 -31
  212. package/dist/query-TJHEVSKL.js +0 -31
  213. package/dist/query-WUIKOHPE.js +0 -524
  214. package/dist/remote-manager-BLJZ6KF6.js +0 -224
  215. package/dist/remote-manager-BPYE46SI.js +0 -223
  216. package/dist/remote-manager-FMESEAFA.js +0 -224
  217. package/dist/remote-manager-K2WZ5RHY.js +0 -223
  218. package/dist/remote-manager-SG5PQKCH.js +0 -224
  219. package/dist/remote-manager-WGP6MIQZ.js +0 -224
  220. package/dist/sdk-3KBB3E6V.js +0 -16
  221. package/dist/sdk-4ZQO6UTU.js +0 -16
  222. package/dist/sdk-6JA6GV3G.js +0 -16
  223. package/dist/sdk-6VTP5UTZ.js +0 -16
  224. package/dist/sdk-7VS6TYCD.js +0 -16
  225. package/dist/sdk-HQ3FTLRT.js +0 -16
  226. package/dist/sdk-HZ7NU3XE.js +0 -15
  227. package/dist/sdk-KBQE2OXT.js +0 -16
  228. package/dist/sdk-MSCDZ7JU.js +0 -15
  229. package/dist/sdk-WNZOGO3S.js +0 -15
  230. package/dist/sdk-YLV33ZCW.js +0 -9
  231. package/dist/sdk-ZSUD2LLJ.js +0 -16
  232. package/dist/server-AFXFFBWA.js +0 -11
  233. package/dist/server-AGHC4VUL.js +0 -11
  234. package/dist/server-BOH7M4TT.js +0 -13
  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-RU3E4XQN.js +0 -15
  243. package/dist/sprites-XVSMQLSI.js +0 -15
  244. package/dist/sql-wasm-FORCZFHZ.js +0 -2148
  245. package/dist/sql-wasm-JZH76RLO.js +0 -2148
  246. package/dist/sqljs-backend-CJQOIQYE.js +0 -266
  247. package/dist/sqljs-backend-KWXBUDUO.js +0 -266
  248. package/dist/state-demo.bundle.js +0 -1033
  249. package/dist/tenancy-CBWYEVUB.js +0 -11
  250. package/dist/tenancy-FO6WVYFN.js +0 -13
  251. package/dist/tenancy-FWDBESMX.js +0 -14
  252. package/dist/tenancy-HGPIS5QA.js +0 -13
  253. package/dist/tenancy-HXFALA37.js +0 -14
  254. package/dist/tenancy-S676GLID.js +0 -14
  255. package/dist/tenancy-V7ARWNNV.js +0 -14
  256. package/dist/tenancy-ZDN4GXK5.js +0 -13
  257. package/dist/tenancy-ZT5VMY7B.js +0 -14
  258. package/dist/vm-config-YZRJ3KUB.js +0 -21
  259. /package/dist/{chunk-2BRTCEHB.js → chunk-PZ4XYZ4J.js} +0 -0
  260. /package/dist/{chunk-EO3J7GRP.js → chunk-WXSWA3MV.js} +0 -0
@@ -1,907 +0,0 @@
1
- import {
2
- EAVStore,
3
- init_eav_store
4
- } from "./chunk-4XIVMVHC.js";
5
- import {
6
- QueryEngine
7
- } from "./chunk-2I5JU73Y.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 = { agentId: this.agentId };
494
- const chain = this.middleware.filter((m) => m.handleQuery);
495
- if (chain.length === 0) {
496
- return engine.execute(q);
497
- }
498
- let result;
499
- let idx = 0;
500
- const next = (query, context) => {
501
- if (idx < chain.length) {
502
- const mw = chain[idx++];
503
- return mw.handleQuery(query, context, next);
504
- }
505
- result = engine.execute(query);
506
- return result;
507
- };
508
- result = next(q, ctx);
509
- return result;
510
- }
511
- /**
512
- * Time-travel: reconstruct the store state at a specific op hash.
513
- * Returns a new EAVStore with state replayed up to (and including) that op.
514
- */
515
- timeTravel(opHash) {
516
- const ops = this.backend.readUntil(opHash);
517
- const snapshot = new EAVStore();
518
- for (const op of ops) {
519
- if (op.deleteFacts && op.deleteFacts.length > 0) {
520
- snapshot.deleteFacts(op.deleteFacts);
521
- }
522
- if (op.deleteLinks && op.deleteLinks.length > 0) {
523
- snapshot.deleteLinks(op.deleteLinks);
524
- }
525
- if (op.facts && op.facts.length > 0) {
526
- snapshot.addFacts(op.facts);
527
- }
528
- if (op.links && op.links.length > 0) {
529
- snapshot.addLinks(op.links);
530
- }
531
- }
532
- return snapshot;
533
- }
534
- // -------------------------------------------------------------------------
535
- // Entity CRUD (high-level graph operations)
536
- // -------------------------------------------------------------------------
537
- /**
538
- * Create a new entity with the given type and attributes.
539
- * Returns the entity ID.
540
- */
541
- async createEntity(entityId, type, attributes = {}, links) {
542
- const facts = [
543
- { e: entityId, a: "type", v: type },
544
- { e: entityId, a: "createdAt", v: (/* @__PURE__ */ new Date()).toISOString() }
545
- ];
546
- for (const [attr, value] of Object.entries(attributes)) {
547
- facts.push({ e: entityId, a: attr, v: value });
548
- }
549
- const linkRecords = (links ?? []).map((l) => ({
550
- e1: entityId,
551
- a: l.attribute,
552
- e2: l.targetEntityId
553
- }));
554
- return this.mutate("addFacts", {
555
- facts,
556
- links: linkRecords.length > 0 ? linkRecords : void 0
557
- });
558
- }
559
- /**
560
- * Get an entity by ID, returning all its facts and links.
561
- */
562
- getEntity(entityId) {
563
- const facts = this.store.getFactsByEntity(entityId);
564
- if (facts.length === 0) return null;
565
- const typeFact = facts.find((f2) => f2.a === "type");
566
- return {
567
- id: entityId,
568
- type: typeFact?.v ?? "unknown",
569
- facts,
570
- links: this.store.getLinksByEntity(entityId)
571
- };
572
- }
573
- /**
574
- * Update an entity's attributes. Deletes old values and adds new ones.
575
- */
576
- async updateEntity(entityId, updates) {
577
- const existingFacts = this.store.getFactsByEntity(entityId);
578
- const deleteFacts = [];
579
- const addFacts = [];
580
- for (const [attr, newValue] of Object.entries(updates)) {
581
- const existing = existingFacts.filter((f2) => f2.a === attr);
582
- deleteFacts.push(...existing);
583
- addFacts.push({ e: entityId, a: attr, v: newValue });
584
- }
585
- const updatedAtFacts = existingFacts.filter((f2) => f2.a === "updatedAt");
586
- deleteFacts.push(...updatedAtFacts);
587
- addFacts.push({ e: entityId, a: "updatedAt", v: (/* @__PURE__ */ new Date()).toISOString() });
588
- return this.mutate("addFacts", {
589
- facts: addFacts,
590
- deleteFacts
591
- });
592
- }
593
- /**
594
- * Delete an entity and all its facts and links.
595
- */
596
- async deleteEntity(entityId) {
597
- const facts = this.store.getFactsByEntity(entityId);
598
- const links = this.store.getLinksByEntity(entityId);
599
- return this.mutate("deleteFacts", {
600
- deleteFacts: facts,
601
- deleteLinks: links
602
- });
603
- }
604
- /**
605
- * List entities by type, with optional attribute filters.
606
- */
607
- listEntities(type, filters) {
608
- let entityIds;
609
- if (type) {
610
- const typeFacts = this.store.getFactsByValue("type", type);
611
- entityIds = new Set(typeFacts.map((f2) => f2.e));
612
- } else {
613
- const allTypeFacts = this.store.getFactsByAttribute("type");
614
- entityIds = new Set(allTypeFacts.map((f2) => f2.e));
615
- }
616
- if (filters) {
617
- for (const [attr, value] of Object.entries(filters)) {
618
- const matchingFacts = this.store.getFactsByValue(attr, value);
619
- const matchingEntities = new Set(matchingFacts.map((f2) => f2.e));
620
- for (const id of entityIds) {
621
- if (!matchingEntities.has(id)) {
622
- entityIds.delete(id);
623
- }
624
- }
625
- }
626
- }
627
- return Array.from(entityIds).map((id) => this.getEntity(id)).filter(Boolean);
628
- }
629
- /**
630
- * Add a link between two entities.
631
- */
632
- async addLink(sourceId, attribute, targetId) {
633
- return this.mutate("addLinks", {
634
- links: [{ e1: sourceId, a: attribute, e2: targetId }]
635
- });
636
- }
637
- /**
638
- * Remove a link between two entities.
639
- */
640
- async removeLink(sourceId, attribute, targetId) {
641
- return this.mutate("deleteLinks", {
642
- deleteLinks: [{ e1: sourceId, a: attribute, e2: targetId }]
643
- });
644
- }
645
- /**
646
- * Add a fact to an entity.
647
- */
648
- async addFact(entityId, attribute, value) {
649
- return this.mutate("addFacts", {
650
- facts: [{ e: entityId, a: attribute, v: value }]
651
- });
652
- }
653
- /**
654
- * Remove a fact from an entity.
655
- */
656
- async removeFact(entityId, attribute, value) {
657
- return this.mutate("deleteFacts", {
658
- deleteFacts: [{ e: entityId, a: attribute, v: value }]
659
- });
660
- }
661
- // -------------------------------------------------------------------------
662
- // Ontology CRUD
663
- // -------------------------------------------------------------------------
664
- /**
665
- * Get an ontology schema by ID.
666
- */
667
- getOntology(id) {
668
- return this.ontologies.get(id);
669
- }
670
- /**
671
- * List all ontologies.
672
- */
673
- listOntologies() {
674
- return Array.from(this.ontologies.values());
675
- }
676
- /**
677
- * Create a new ontology schema.
678
- */
679
- createOntology(schema) {
680
- const tier = schema.tier ?? "user";
681
- if (tier === "core") {
682
- throw new Error("Cannot modify core ontologies");
683
- }
684
- if (this.ontologies.has(schema["@id"])) {
685
- throw new Error(`Ontology ${schema["@id"]} already exists`);
686
- }
687
- this.ontologies.set(schema["@id"], schema);
688
- const fact = {
689
- e: schema["@id"],
690
- a: "schema",
691
- v: JSON.stringify(schema)
692
- };
693
- this.store.addFacts([fact]);
694
- }
695
- /**
696
- * Update an existing ontology schema.
697
- */
698
- updateOntology(id, updates) {
699
- const existing = this.ontologies.get(id);
700
- if (!existing) {
701
- throw new Error(`Ontology ${id} not found`);
702
- }
703
- const tier = existing.tier ?? "user";
704
- if (tier === "core") {
705
- throw new Error("Cannot modify core ontologies");
706
- }
707
- const updated = { ...existing, ...updates };
708
- this.ontologies.set(id, updated);
709
- const existingFacts = this.store.getFactsByEntity(id);
710
- const schemaFacts = existingFacts.filter((f2) => f2.a === "schema");
711
- const deleteFacts = [...schemaFacts];
712
- const addFacts = [
713
- {
714
- e: id,
715
- a: "schema",
716
- v: JSON.stringify(updated)
717
- }
718
- ];
719
- this.store.deleteFacts(deleteFacts);
720
- this.store.addFacts(addFacts);
721
- }
722
- /**
723
- * Delete an ontology schema.
724
- */
725
- deleteOntology(id) {
726
- const existing = this.ontologies.get(id);
727
- if (!existing) {
728
- throw new Error(`Ontology ${id} not found`);
729
- }
730
- const tier = existing.tier ?? "user";
731
- if (tier === "core") {
732
- throw new Error("Cannot delete core ontologies");
733
- }
734
- this.ontologies.delete(id);
735
- const facts = this.store.getFactsByEntity(id);
736
- this.store.deleteFacts(facts);
737
- }
738
- // -------------------------------------------------------------------------
739
- // Workspace
740
- // -------------------------------------------------------------------------
741
- /**
742
- * Boot the kernel with a workspace configuration.
743
- * Loads ontologies, projections, and seed data.
744
- */
745
- bootWorkspace(config) {
746
- this.workspaceConfig = config;
747
- if (config.workspace.ontologies) {
748
- for (const [id, schema] of Object.entries(config.workspace.ontologies)) {
749
- if (!this.ontologies.has(id)) {
750
- this.ontologies.set(id, schema);
751
- }
752
- }
753
- }
754
- if (config.workspace.graph?.nodes) {
755
- for (const node of config.workspace.graph.nodes) {
756
- const n = node;
757
- if (n.id && n.type) {
758
- const facts = [
759
- { e: String(n.id), a: "type", v: String(n.type) }
760
- ];
761
- for (const [key, value] of Object.entries(n)) {
762
- if (key !== "id" && key !== "type") {
763
- facts.push({ e: String(n.id), a: key, v: value });
764
- }
765
- }
766
- this.store.addFacts(facts);
767
- }
768
- }
769
- }
770
- if (config.workspace.graph?.edges) {
771
- for (const edge of config.workspace.graph.edges) {
772
- const e = edge;
773
- if (e.source && e.target && e.relation) {
774
- this.store.addLinks([
775
- {
776
- e1: String(e.source),
777
- a: String(e.relation),
778
- e2: String(e.target)
779
- }
780
- ]);
781
- }
782
- }
783
- }
784
- this.boot();
785
- }
786
- /**
787
- * Export the current workspace configuration.
788
- */
789
- exportWorkspace() {
790
- const ontologies = {};
791
- for (const [id, schema] of this.ontologies) {
792
- if (schema.tier !== "core") {
793
- ontologies[id] = schema;
794
- }
795
- }
796
- const allFacts = this.store.getAllFacts();
797
- const nodes = [];
798
- const entityIds = new Set(allFacts.map((f2) => f2.e));
799
- for (const id of entityIds) {
800
- const facts = this.store.getFactsByEntity(id);
801
- const typeFact = facts.find((f2) => f2.a === "type");
802
- const node = { id };
803
- if (typeFact) {
804
- node.type = typeFact.v;
805
- }
806
- for (const fact of facts) {
807
- if (fact.a !== "type") {
808
- node[fact.a] = fact.v;
809
- }
810
- }
811
- nodes.push(node);
812
- }
813
- const allLinks = this.store.getAllLinks();
814
- const edges = allLinks.map((l) => ({
815
- source: l.e1,
816
- relation: l.a,
817
- target: l.e2
818
- }));
819
- return {
820
- workspace: {
821
- name: this.workspaceConfig?.workspace.name,
822
- description: this.workspaceConfig?.workspace.description,
823
- ontologies: Object.keys(ontologies).length > 0 ? ontologies : void 0,
824
- graph: { nodes, edges },
825
- projections: this.workspaceConfig?.workspace.projections,
826
- routes: this.workspaceConfig?.workspace.routes,
827
- app: this.workspaceConfig?.workspace.app
828
- }
829
- };
830
- }
831
- // -------------------------------------------------------------------------
832
- // TQL Compatibility Aliases
833
- // -------------------------------------------------------------------------
834
- /**
835
- * Create a node (alias for createEntity with schema validation).
836
- */
837
- async createNode(id, data, type, _ctx) {
838
- return this.createEntity(id, type, data);
839
- }
840
- /**
841
- * Update a node (alias for updateEntity with schema validation).
842
- */
843
- async updateNode(id, data, type, _ctx) {
844
- return this.updateEntity(id, data);
845
- }
846
- /**
847
- * Delete a node (alias for deleteEntity).
848
- */
849
- async deleteNode(id, _ctx) {
850
- return this.deleteEntity(id);
851
- }
852
- /**
853
- * Link two nodes (alias for addLink).
854
- */
855
- async link(e1, a, e2, _ctx) {
856
- return this.addLink(e1, a, e2);
857
- }
858
- /**
859
- * Unlink two nodes (alias for removeLink).
860
- */
861
- async unlink(e1, a, e2, _ctx) {
862
- return this.removeLink(e1, a, e2);
863
- }
864
- // -------------------------------------------------------------------------
865
- // Middleware
866
- // -------------------------------------------------------------------------
867
- addMiddleware(mw) {
868
- this.middleware.push(mw);
869
- }
870
- removeMiddleware(name) {
871
- this.middleware = this.middleware.filter((m) => m.name !== name);
872
- }
873
- // -------------------------------------------------------------------------
874
- // Internal
875
- // -------------------------------------------------------------------------
876
- async _runMiddleware(op, ctx) {
877
- const chain = [...this.middleware];
878
- let idx = 0;
879
- const next = async (op2, ctx2) => {
880
- const mw = chain[idx++];
881
- if (mw?.handleOp) {
882
- await mw.handleOp(op2, ctx2, next);
883
- }
884
- };
885
- if (chain.length > 0) {
886
- await next(op, ctx);
887
- }
888
- }
889
- _replayOp(op) {
890
- if (op.deleteFacts && op.deleteFacts.length > 0) {
891
- this.store.deleteFacts(op.deleteFacts);
892
- }
893
- if (op.deleteLinks && op.deleteLinks.length > 0) {
894
- this.store.deleteLinks(op.deleteLinks);
895
- }
896
- if (op.facts && op.facts.length > 0) {
897
- this.store.addFacts(op.facts);
898
- }
899
- if (op.links && op.links.length > 0) {
900
- this.store.addLinks(op.links);
901
- }
902
- }
903
- };
904
-
905
- export {
906
- TrellisKernel
907
- };