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,121 @@
1
+ // src/server/sprites.ts
2
+ import { execFile, spawn } from "child_process";
3
+ import { promisify } from "util";
4
+ var execFileAsync = promisify(execFile);
5
+ async function runSpriteCmd(args) {
6
+ try {
7
+ const { stdout } = await execFileAsync("sprite", args);
8
+ return stdout.trim();
9
+ } catch (err) {
10
+ throw new Error(
11
+ `sprite ${args[0]} failed (exit ${err.code ?? "?"}): ${err.stderr ?? err.message}`
12
+ );
13
+ }
14
+ }
15
+ async function runSpriteExec(spriteName, shellCommand, extraArgs = []) {
16
+ return runSpriteCmd([
17
+ "exec",
18
+ "-s",
19
+ spriteName,
20
+ ...extraArgs,
21
+ "--",
22
+ "bash",
23
+ "-c",
24
+ shellCommand
25
+ ]);
26
+ }
27
+ async function runSpriteCopy(localPath, spriteName, remotePath) {
28
+ try {
29
+ await execFileAsync("sprite", [
30
+ "exec",
31
+ "-s",
32
+ spriteName,
33
+ "--file",
34
+ `${localPath}:${remotePath}`,
35
+ "echo",
36
+ "uploaded"
37
+ ]);
38
+ } catch (err) {
39
+ throw new Error(
40
+ `sprite file upload failed (exit ${err.code ?? "?"}): ${err.stderr ?? err.message}`
41
+ );
42
+ }
43
+ }
44
+ var SPRITE_ENSURE_BUN_SH = `
45
+ set -e
46
+ export PATH="$HOME/.bun/bin:$PATH"
47
+ if ! command -v bun >/dev/null 2>&1; then
48
+ curl -fsSL https://bun.sh/install | bash
49
+ export PATH="$HOME/.bun/bin:$PATH"
50
+ fi
51
+ command -v bun
52
+ `.trim();
53
+ function parseSpriteUrlOutput(stdout) {
54
+ const match = stdout.match(/URL:\s*(https:\/\/\S+)/i);
55
+ if (!match) {
56
+ throw new Error(`Could not parse sprite URL from output: ${stdout.trim()}`);
57
+ }
58
+ return match[1].replace(/\/$/, "");
59
+ }
60
+ async function resolveSpritePublicUrl(spriteName) {
61
+ const out = await runSpriteCmd(["url", "-s", spriteName]);
62
+ return parseSpriteUrlOutput(out);
63
+ }
64
+ async function ensureSpritePublicAccess(spriteName) {
65
+ try {
66
+ await runSpriteCmd(["url", "update", "--auth", "public", "-s", spriteName]);
67
+ } catch (err) {
68
+ const msg = String(err.message ?? err);
69
+ if (/already|unchanged|public/i.test(msg)) return;
70
+ throw err;
71
+ }
72
+ }
73
+ async function ensureSprite(spriteName) {
74
+ try {
75
+ await runSpriteCmd(["create", spriteName, "--skip-console"]);
76
+ } catch (err) {
77
+ const msg = String(err.message ?? err);
78
+ if (/already exists|duplicate|conflict/i.test(msg)) return;
79
+ throw err;
80
+ }
81
+ }
82
+ async function runSpriteInteractive(args) {
83
+ return new Promise((resolve, reject) => {
84
+ const proc = spawn("sprite", args, { stdio: "inherit" });
85
+ proc.on("close", (code) => {
86
+ if (code !== 0)
87
+ reject(new Error(`sprite ${args[0]} failed (exit ${code})`));
88
+ else resolve();
89
+ });
90
+ proc.on("error", reject);
91
+ });
92
+ }
93
+ async function assertSpriteCli() {
94
+ await runSpriteCmd(["--version"]).catch(() => {
95
+ throw new Error(
96
+ "`sprite` CLI not found. Install it from https://docs.sprites.dev and authenticate."
97
+ );
98
+ });
99
+ }
100
+ function resolveSprite(explicitName) {
101
+ if (explicitName) {
102
+ return explicitName;
103
+ }
104
+ throw new Error(
105
+ "No sprite specified. Use --sprite <name> or set an active sprite with `trellis vm use <name>`"
106
+ );
107
+ }
108
+
109
+ export {
110
+ runSpriteCmd,
111
+ runSpriteExec,
112
+ runSpriteCopy,
113
+ SPRITE_ENSURE_BUN_SH,
114
+ parseSpriteUrlOutput,
115
+ resolveSpritePublicUrl,
116
+ ensureSpritePublicAccess,
117
+ ensureSprite,
118
+ runSpriteInteractive,
119
+ assertSpriteCli,
120
+ resolveSprite
121
+ };
@@ -0,0 +1,61 @@
1
+ // src/server/sprites.ts
2
+ import { execFile, spawn } from "child_process";
3
+ import { promisify } from "util";
4
+ var execFileAsync = promisify(execFile);
5
+ async function runSpriteCmd(args) {
6
+ try {
7
+ const { stdout } = await execFileAsync("sprite", args);
8
+ return stdout.trim();
9
+ } catch (err) {
10
+ throw new Error(
11
+ `sprite ${args[0]} failed (exit ${err.code ?? "?"}): ${err.stderr ?? err.message}`
12
+ );
13
+ }
14
+ }
15
+ async function runSpriteCopy(localPath, spriteName, remotePath) {
16
+ try {
17
+ await execFileAsync("sprite", [
18
+ "cp",
19
+ localPath,
20
+ `${spriteName}:${remotePath}`
21
+ ]);
22
+ } catch (err) {
23
+ throw new Error(
24
+ `sprite cp failed (exit ${err.code ?? "?"}): ${err.stderr ?? err.message}`
25
+ );
26
+ }
27
+ }
28
+ async function runSpriteInteractive(args) {
29
+ return new Promise((resolve, reject) => {
30
+ const proc = spawn("sprite", args, { stdio: "inherit" });
31
+ proc.on("close", (code) => {
32
+ if (code !== 0)
33
+ reject(new Error(`sprite ${args[0]} failed (exit ${code})`));
34
+ else resolve();
35
+ });
36
+ proc.on("error", reject);
37
+ });
38
+ }
39
+ async function assertSpriteCli() {
40
+ await runSpriteCmd(["--version"]).catch(() => {
41
+ throw new Error(
42
+ "`sprite` CLI not found. Install it from https://docs.sprites.dev and authenticate."
43
+ );
44
+ });
45
+ }
46
+ function resolveSprite(explicitName) {
47
+ if (explicitName) {
48
+ return explicitName;
49
+ }
50
+ throw new Error(
51
+ "No sprite specified. Use --sprite <name> or set an active sprite with `trellis vm use <name>`"
52
+ );
53
+ }
54
+
55
+ export {
56
+ runSpriteCmd,
57
+ runSpriteCopy,
58
+ runSpriteInteractive,
59
+ assertSpriteCli,
60
+ resolveSprite
61
+ };
@@ -1,19 +1,12 @@
1
- // @bun
2
1
  import {
3
2
  __require
4
- } from "./index-a76rekgs.js";
3
+ } from "./chunk-KFQGP6VL.js";
5
4
 
6
5
  // src/core/persist/factory.ts
7
6
  async function createKernelBackend(dbPath, opts = {}) {
8
7
  const choice = opts.backend ?? detectBackend();
9
- if (choice === "bun") {
10
- const { SqliteKernelBackend } = await import("./sqlite-backend-0vsmc6qj.js");
11
- const backend2 = new SqliteKernelBackend(dbPath);
12
- backend2.init();
13
- return backend2;
14
- }
15
8
  if (choice === "better-sqlite") {
16
- const { BetterSqliteKernelBackend } = await import("./better-sqlite-backend-ahx5p0br.js");
9
+ const { BetterSqliteKernelBackend } = await import("./better-sqlite-backend-2P4F6AOJ.js");
17
10
  const backend2 = new BetterSqliteKernelBackend(dbPath);
18
11
  backend2.init();
19
12
  return backend2;
@@ -27,16 +20,16 @@ async function createKernelBackend(dbPath, opts = {}) {
27
20
  return backend;
28
21
  }
29
22
  function detectBackend() {
30
- if (typeof globalThis.Bun !== "undefined")
31
- return "bun";
32
23
  try {
33
24
  const { createRequire } = __require("module");
34
25
  const req = createRequire(import.meta.url);
35
- req.resolve("better-sqlite3");
26
+ req("better-sqlite3");
36
27
  return "better-sqlite";
37
28
  } catch {
38
29
  return "sqljs";
39
30
  }
40
31
  }
41
32
 
42
- export { createKernelBackend };
33
+ export {
34
+ createKernelBackend
35
+ };
@@ -1,4 +1,3 @@
1
- // @bun
2
1
  import {
3
2
  decompose,
4
3
  init_blob_store,
@@ -11,12 +10,14 @@ import {
11
10
  init_merge,
12
11
  init_milestone,
13
12
  init_op_log
14
- } from "./index-xhcp6xrn.js";
13
+ } from "./chunk-VBYUTRXX.js";
14
+ import {
15
+ init_types
16
+ } from "./chunk-N6MYZT4O.js";
15
17
  import {
16
18
  init_ops,
17
- init_types,
18
19
  isVcsOp
19
- } from "./index-nzb3am4f.js";
20
+ } from "./chunk-GLM4HGN4.js";
20
21
 
21
22
  // src/vcs/index.ts
22
23
  init_types();
@@ -26,8 +27,7 @@ init_decompose();
26
27
  // src/vcs/vcs-middleware.ts
27
28
  init_decompose();
28
29
  init_ops();
29
-
30
- class VcsMiddleware {
30
+ var VcsMiddleware = class {
31
31
  name = "vcs";
32
32
  async handleOp(op, ctx, next) {
33
33
  if (!isVcsOp(op)) {
@@ -36,39 +36,51 @@ class VcsMiddleware {
36
36
  const vcsOp = op;
37
37
  const decomposed = decompose(vcsOp);
38
38
  if (decomposed.deleteFacts.length > 0) {
39
- await next({
40
- ...op,
41
- kind: "deleteFacts",
42
- facts: decomposed.deleteFacts,
43
- links: undefined
44
- }, ctx);
39
+ await next(
40
+ {
41
+ ...op,
42
+ kind: "deleteFacts",
43
+ facts: decomposed.deleteFacts,
44
+ links: void 0
45
+ },
46
+ ctx
47
+ );
45
48
  }
46
49
  if (decomposed.deleteLinks.length > 0) {
47
- await next({
48
- ...op,
49
- kind: "deleteLinks",
50
- facts: undefined,
51
- links: decomposed.deleteLinks
52
- }, ctx);
50
+ await next(
51
+ {
52
+ ...op,
53
+ kind: "deleteLinks",
54
+ facts: void 0,
55
+ links: decomposed.deleteLinks
56
+ },
57
+ ctx
58
+ );
53
59
  }
54
60
  if (decomposed.addFacts.length > 0) {
55
- await next({
56
- ...op,
57
- kind: "addFacts",
58
- facts: decomposed.addFacts,
59
- links: undefined
60
- }, ctx);
61
+ await next(
62
+ {
63
+ ...op,
64
+ kind: "addFacts",
65
+ facts: decomposed.addFacts,
66
+ links: void 0
67
+ },
68
+ ctx
69
+ );
61
70
  }
62
71
  if (decomposed.addLinks.length > 0) {
63
- await next({
64
- ...op,
65
- kind: "addLinks",
66
- facts: undefined,
67
- links: decomposed.addLinks
68
- }, ctx);
72
+ await next(
73
+ {
74
+ ...op,
75
+ kind: "addLinks",
76
+ facts: void 0,
77
+ links: decomposed.addLinks
78
+ },
79
+ ctx
80
+ );
69
81
  }
70
82
  }
71
- }
83
+ };
72
84
 
73
85
  // src/vcs/index.ts
74
86
  init_blob_store();
@@ -81,4 +93,6 @@ init_issue();
81
93
  init_op_log();
82
94
  init_lane();
83
95
 
84
- export { VcsMiddleware };
96
+ export {
97
+ VcsMiddleware
98
+ };
@@ -0,0 +1,108 @@
1
+ // src/realtime/relay-persistence.ts
2
+ var DEFAULT_MAX_CHAT = 200;
3
+ var DEFAULT_MAX_TEXT_OPS = 2e3;
4
+ function chatKey(msg) {
5
+ return msg.id ?? `${msg.from}:${msg.ts}`;
6
+ }
7
+ function tieKey(msg) {
8
+ if (msg.t === "msg") return chatKey(msg);
9
+ if (msg.t === "presence" || msg.t === "bye") return msg.from;
10
+ return "";
11
+ }
12
+ function messageTs(msg) {
13
+ if (msg.t === "presence" || msg.t === "bye" || msg.t === "msg") {
14
+ return msg.ts;
15
+ }
16
+ return 0;
17
+ }
18
+ var RelayPersistence = class {
19
+ maxChat;
20
+ maxTextOps;
21
+ presence = /* @__PURE__ */ new Map();
22
+ /** Chat is a grow-only set keyed by {@link chatKey} — dedup on record. */
23
+ chatLog = [];
24
+ chatKeys = /* @__PURE__ */ new Set();
25
+ textSnapshot = null;
26
+ textOps = [];
27
+ constructor(opts = {}) {
28
+ this.maxChat = opts.maxChat ?? DEFAULT_MAX_CHAT;
29
+ this.maxTextOps = opts.maxTextOps ?? DEFAULT_MAX_TEXT_OPS;
30
+ }
31
+ /** Record an inbound client message (skip `hello` / `replay`). */
32
+ record(message) {
33
+ if (message.v !== 1) return;
34
+ switch (message.t) {
35
+ case "hello":
36
+ return;
37
+ case "replay":
38
+ return;
39
+ case "presence":
40
+ this.presence.set(message.from, message);
41
+ return;
42
+ case "bye":
43
+ this.presence.delete(message.from);
44
+ return;
45
+ case "msg":
46
+ this.recordBroadcast(message);
47
+ return;
48
+ }
49
+ }
50
+ /** Ordered messages to replay to a peer that just connected. */
51
+ buildReplay() {
52
+ const out = [
53
+ ...this.presence.values(),
54
+ ...this.chatLog
55
+ ];
56
+ if (this.textSnapshot) {
57
+ out.push(this.textSnapshot);
58
+ } else {
59
+ out.push(...this.textOps);
60
+ }
61
+ out.sort((a, b) => {
62
+ const dt = messageTs(a) - messageTs(b);
63
+ if (dt !== 0) return dt;
64
+ return tieKey(a).localeCompare(tieKey(b));
65
+ });
66
+ return out;
67
+ }
68
+ getPresenceCount() {
69
+ return this.presence.size;
70
+ }
71
+ getChatCount() {
72
+ return this.chatLog.length;
73
+ }
74
+ hasTextSnapshot() {
75
+ return this.textSnapshot !== null;
76
+ }
77
+ recordBroadcast(message) {
78
+ if (message.channel === "chat" && message.event === "message") {
79
+ const key = chatKey(message);
80
+ if (this.chatKeys.has(key)) return;
81
+ this.chatKeys.add(key);
82
+ this.chatLog.push(message);
83
+ if (this.chatLog.length > this.maxChat) {
84
+ const evicted = this.chatLog.splice(0, this.chatLog.length - this.maxChat);
85
+ for (const m of evicted) this.chatKeys.delete(chatKey(m));
86
+ }
87
+ return;
88
+ }
89
+ if (message.channel === "text" && message.event === "state") {
90
+ this.textSnapshot = message;
91
+ this.textOps = [];
92
+ return;
93
+ }
94
+ if (message.channel === "text" && message.event === "op") {
95
+ if (this.textSnapshot) return;
96
+ this.textOps.push(message);
97
+ if (this.textOps.length > this.maxTextOps) {
98
+ this.textOps.splice(0, this.textOps.length - this.maxTextOps);
99
+ }
100
+ }
101
+ }
102
+ };
103
+
104
+ export {
105
+ DEFAULT_MAX_CHAT,
106
+ DEFAULT_MAX_TEXT_OPS,
107
+ RelayPersistence
108
+ };
@@ -0,0 +1,55 @@
1
+ import {
2
+ __esm
3
+ } from "./chunk-KFQGP6VL.js";
4
+
5
+ // src/vcs/ops.ts
6
+ async function hashVcsOp(op) {
7
+ const content = JSON.stringify({
8
+ kind: op.kind,
9
+ timestamp: op.timestamp,
10
+ agentId: op.agentId,
11
+ previousHash: op.previousHash,
12
+ vcs: op.vcs
13
+ });
14
+ const msgUint8 = new TextEncoder().encode(content);
15
+ const hashBuffer = await crypto.subtle.digest("SHA-256", msgUint8);
16
+ const hashArray = Array.from(new Uint8Array(hashBuffer));
17
+ const hashHex = hashArray.map((b) => b.toString(16).padStart(2, "0")).join("");
18
+ return `trellis:op:${hashHex}`;
19
+ }
20
+ async function verifyVcsOpHash(op) {
21
+ return op.hash === await hashVcsOp(op);
22
+ }
23
+ async function createVcsOp(kind, params) {
24
+ const opBase = {
25
+ kind,
26
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
27
+ agentId: params.agentId,
28
+ previousHash: params.previousHash,
29
+ vcs: params.vcs
30
+ };
31
+ return {
32
+ ...opBase,
33
+ hash: await hashVcsOp(opBase)
34
+ };
35
+ }
36
+ function isVcsOp(op) {
37
+ return op.vcs !== void 0 || typeof op.kind === "string" && op.kind.startsWith("vcs:");
38
+ }
39
+ function isVcsOpKind(kind) {
40
+ return kind.startsWith("vcs:");
41
+ }
42
+ var init_ops = __esm({
43
+ "src/vcs/ops.ts"() {
44
+ "use strict";
45
+ }
46
+ });
47
+
48
+ export {
49
+ hashVcsOp,
50
+ verifyVcsOpHash,
51
+ createVcsOp,
52
+ isVcsOp,
53
+ isVcsOpKind,
54
+ init_ops
55
+ };