trellis 3.1.34 → 3.2.0

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 (422) hide show
  1. package/CHANGELOG.md +16 -5
  2. package/README.md +19 -2
  3. package/bin/trellis.mjs +2 -75
  4. package/dist/better-sqlite-backend-2P4F6AOJ.js +209 -0
  5. package/dist/{better-sqlite-backend-ahx5p0br.js → better-sqlite-backend-PII64VE6.js} +37 -25
  6. package/dist/better-sqlite-backend-VUBVQ7SN.js +209 -0
  7. package/dist/better-sqlite-backend-Y3AQN65E.js +159 -0
  8. package/dist/better-sqlite-backend-Y3M7DXOX.js +159 -0
  9. package/dist/boot-middleware-FJDGVUM4.js +9 -0
  10. package/dist/boot-middleware-MHLHFCUC.js +9 -0
  11. package/dist/boot-middleware-MLJUTLUM.js +9 -0
  12. package/dist/boot-middleware-ZZPDZNYR.js +9 -0
  13. package/dist/{index-wncptktd.js → chunk-276LKLZR.js} +126 -59
  14. package/dist/chunk-2BRTCEHB.js +143 -0
  15. package/dist/chunk-2CX5UCRV.js +111 -0
  16. package/dist/chunk-2ESYSVXG.js +48 -0
  17. package/dist/{index-yp88he8n.js → chunk-2I5JU73Y.js} +88 -64
  18. package/dist/{index-w5wccer3.js → chunk-2UNSRRNB.js} +10 -5
  19. package/dist/{index-4wxa8xz4.js → chunk-335UEHQR.js} +158 -22
  20. package/dist/chunk-36VSSTL7.js +357 -0
  21. package/dist/chunk-3ETIIPPB.js +1077 -0
  22. package/dist/chunk-3GDRZTAW.js +45 -0
  23. package/dist/chunk-44FFQKQX.js +142 -0
  24. package/dist/chunk-4CF2L46N.js +29 -0
  25. package/dist/chunk-4HYPLFJD.js +150 -0
  26. package/dist/chunk-4XIVMVHC.js +361 -0
  27. package/dist/chunk-5CINODKT.js +41 -0
  28. package/dist/chunk-5ESGWJ5L.js +45 -0
  29. package/dist/chunk-5FGLQGMF.js +1676 -0
  30. package/dist/chunk-5IQZFITY.js +357 -0
  31. package/dist/{index-wt8rz4gn.js → chunk-5JWFAQDW.js} +41 -23
  32. package/dist/{index-7pjz3tsy.js → chunk-62UHTVU3.js} +50 -16
  33. package/dist/{index-h32txmxe.js → chunk-66UJQT2I.js} +6 -13
  34. package/dist/chunk-6CTA6MCE.js +340 -0
  35. package/dist/{index-4cdr7x2x.js → chunk-6RNNVOAS.js} +178 -109
  36. package/dist/chunk-6X23PZ6H.js +969 -0
  37. package/dist/chunk-7C7LL6MB.js +315 -0
  38. package/dist/chunk-7F4HM3JG.js +394 -0
  39. package/dist/chunk-7KJ7T4D3.js +910 -0
  40. package/dist/chunk-7QQQNUB5.js +92 -0
  41. package/dist/{index-53f3b8p8.js → chunk-7QWJBS72.js} +210 -165
  42. package/dist/chunk-7R36OZK3.js +957 -0
  43. package/dist/chunk-7UPKCOHE.js +946 -0
  44. package/dist/chunk-7WQGTFVJ.js +7434 -0
  45. package/dist/chunk-A3BONW34.js +35 -0
  46. package/dist/chunk-AHMDVHBL.js +141 -0
  47. package/dist/chunk-AW6A4OZY.js +171 -0
  48. package/dist/chunk-B3ZIFA2O.js +2240 -0
  49. package/dist/chunk-BJ5EKCJ5.js +458 -0
  50. package/dist/chunk-BJ7EZ7FP.js +145 -0
  51. package/dist/chunk-BQBUVMRN.js +171 -0
  52. package/dist/chunk-BRGYDO7D.js +223 -0
  53. package/dist/chunk-BXSTJVE3.js +67 -0
  54. package/dist/chunk-C5KPSEDN.js +359 -0
  55. package/dist/chunk-CCTNYTUC.js +940 -0
  56. package/dist/chunk-CYQ2OVD2.js +35 -0
  57. package/dist/chunk-DDAK7YOE.js +299 -0
  58. package/dist/chunk-DRILKBY6.js +965 -0
  59. package/dist/chunk-DXE24HNN.js +45 -0
  60. package/dist/chunk-E7ICUNW7.js +945 -0
  61. package/dist/chunk-EAL2PUOE.js +10022 -0
  62. package/dist/chunk-ELT7MLZB.js +109 -0
  63. package/dist/chunk-EO3J7GRP.js +0 -0
  64. package/dist/chunk-EWEIRF6G.js +171 -0
  65. package/dist/chunk-F5VDGQJC.js +120 -0
  66. package/dist/chunk-FCPL3IEQ.js +98 -0
  67. package/dist/{index-nq520y6k.js → chunk-FDPKYSV7.js} +43 -31
  68. package/dist/chunk-FES3TC24.js +171 -0
  69. package/dist/chunk-FF36CQHZ.js +61 -0
  70. package/dist/chunk-FKQO5A3H.js +35 -0
  71. package/dist/chunk-FOWKR5TW.js +129 -0
  72. package/dist/chunk-FZVCXDYW.js +150 -0
  73. package/dist/chunk-G3XIHPSQ.js +361 -0
  74. package/dist/chunk-GD5QJXSS.js +98 -0
  75. package/dist/chunk-GFZCJ4EH.js +108 -0
  76. package/dist/chunk-GKJLYLVU.js +359 -0
  77. package/dist/chunk-GLM4HGN4.js +55 -0
  78. package/dist/chunk-GNXHXNVQ.js +113 -0
  79. package/dist/chunk-GSR6ILTM.js +277 -0
  80. package/dist/chunk-GWRIMRSX.js +45 -0
  81. package/dist/chunk-H72UW2HJ.js +45 -0
  82. package/dist/chunk-HGI74PXB.js +7417 -0
  83. package/dist/chunk-HGRA37LO.js +145 -0
  84. package/dist/chunk-HO4TURXW.js +1078 -0
  85. package/dist/chunk-HXSRQO3L.js +145 -0
  86. package/dist/chunk-IG2X2BVO.js +373 -0
  87. package/dist/chunk-IIJVDD54.js +373 -0
  88. package/dist/chunk-IUWVEEOX.js +145 -0
  89. package/dist/chunk-IX4BBOIT.js +394 -0
  90. package/dist/{index-yhwjgfvj.js → chunk-IXU4RMQM.js} +67 -60
  91. package/dist/chunk-J3WYZO3Q.js +211 -0
  92. package/dist/{index-vkpkfwhq.js → chunk-J6OUIION.js} +234 -194
  93. package/dist/{index-xzym9w0m.js → chunk-JA7AIHRK.js} +12 -7
  94. package/dist/chunk-JUEMDWLU.js +233 -0
  95. package/dist/chunk-K46RNFDE.js +171 -0
  96. package/dist/chunk-KAGU2XMY.js +359 -0
  97. package/dist/chunk-KCVYJNVX.js +394 -0
  98. package/dist/chunk-KFQGP6VL.js +33 -0
  99. package/dist/chunk-KKDRMIV6.js +419 -0
  100. package/dist/chunk-KQ4A2D2P.js +910 -0
  101. package/dist/chunk-KSU2GW22.js +958 -0
  102. package/dist/chunk-KYLIQ3YI.js +399 -0
  103. package/dist/chunk-KZYJJIRN.js +946 -0
  104. package/dist/chunk-LFOX744K.js +96 -0
  105. package/dist/{index-rv1p47gp.js → chunk-LHOVJEWR.js} +2756 -2307
  106. package/dist/{index-h9e2efx4.js → chunk-LNUIGRDZ.js} +71 -55
  107. package/dist/chunk-LOPXTPF3.js +120 -0
  108. package/dist/chunk-LZR3VIFU.js +907 -0
  109. package/dist/chunk-MBNBTJCR.js +394 -0
  110. package/dist/chunk-MCKGQKYU.js +15 -0
  111. package/dist/{index-skhn0agf.js → chunk-MLC5BUYO.js} +19 -20
  112. package/dist/chunk-MPXUVGT3.js +104 -0
  113. package/dist/chunk-MU6EOS6F.js +0 -0
  114. package/dist/chunk-MWRQ2TXT.js +357 -0
  115. package/dist/{index-nzb3am4f.js → chunk-NO73OK2I.js} +43 -21
  116. package/dist/chunk-NPE2YJHK.js +394 -0
  117. package/dist/{index-xhcp6xrn.js → chunk-NSDXU6QX.js} +654 -500
  118. package/dist/chunk-NXIRDSZ6.js +145 -0
  119. package/dist/chunk-NZWFNHCS.js +407 -0
  120. package/dist/chunk-O2AV5WMN.js +48 -0
  121. package/dist/{index-h7zxhhhh.js → chunk-OB4CMMX6.js} +46 -38
  122. package/dist/chunk-OBKU74FU.js +7411 -0
  123. package/dist/chunk-OQNDWRDE.js +145 -0
  124. package/dist/chunk-OVWAJMB6.js +394 -0
  125. package/dist/chunk-PDHLBTTD.js +45 -0
  126. package/dist/chunk-PEQNRKLG.js +210 -0
  127. package/dist/chunk-QERIS7QY.js +7403 -0
  128. package/dist/chunk-QHA2DM3C.js +373 -0
  129. package/dist/chunk-QLM4HSYC.js +45 -0
  130. package/dist/chunk-RSWUFTO2.js +857 -0
  131. package/dist/chunk-S2OT3TQJ.js +283 -0
  132. package/dist/chunk-S5PHSN5K.js +907 -0
  133. package/dist/chunk-SIAA4J6H.js +21 -0
  134. package/dist/chunk-SPSPV5BC.js +390 -0
  135. package/dist/chunk-SQBNLUIA.js +171 -0
  136. package/dist/chunk-STLN6A6B.js +355 -0
  137. package/dist/chunk-TCKXSOBP.js +123 -0
  138. package/dist/chunk-U7HV7GU2.js +17 -0
  139. package/dist/chunk-UBGUDMUV.js +59 -0
  140. package/dist/chunk-UGZHOGRA.js +39 -0
  141. package/dist/chunk-UICF66FS.js +359 -0
  142. package/dist/chunk-UK3EQREE.js +1078 -0
  143. package/dist/chunk-UPKPURVY.js +394 -0
  144. package/dist/chunk-URC74VCN.js +959 -0
  145. package/dist/chunk-USEINYUL.js +12 -0
  146. package/dist/{index-bmyt7k8n.js → chunk-UZRUP7QW.js} +12 -4
  147. package/dist/chunk-V3G7Q3QQ.js +102 -0
  148. package/dist/chunk-VDAKEOML.js +857 -0
  149. package/dist/chunk-VUJ6SA55.js +303 -0
  150. package/dist/chunk-VUJQLIML.js +141 -0
  151. package/dist/chunk-VWKLKLYB.js +267 -0
  152. package/dist/chunk-VYC3RZMK.js +277 -0
  153. package/dist/chunk-WMERMSWI.js +154 -0
  154. package/dist/chunk-WMR777PO.js +2213 -0
  155. package/dist/{index-n9f2qyh5.js → chunk-X46IECAC.js} +55 -33
  156. package/dist/chunk-X5FLTRUB.js +517 -0
  157. package/dist/chunk-X762XWVC.js +419 -0
  158. package/dist/chunk-XEN3OEYY.js +2234 -0
  159. package/dist/chunk-XMQ7G77X.js +260 -0
  160. package/dist/chunk-XZQ66K7A.js +124 -0
  161. package/dist/{index-w7ng765c.js → chunk-YCM7ZYEZ.js} +102 -49
  162. package/dist/chunk-YY3GF7DH.js +7411 -0
  163. package/dist/chunk-ZE5R3H4C.js +907 -0
  164. package/dist/chunk-ZHVI7BQN.js +1077 -0
  165. package/dist/chunk-ZMN5LUB7.js +7411 -0
  166. package/dist/chunk-ZUV4MD5U.js +94 -0
  167. package/dist/cli/errors.d.ts +6 -0
  168. package/dist/cli/errors.d.ts.map +1 -0
  169. package/dist/cli/examples.d.ts +23 -0
  170. package/dist/cli/examples.d.ts.map +1 -0
  171. package/dist/cli/index.d.ts.map +1 -1
  172. package/dist/cli/index.js +2338 -6190
  173. package/dist/client/index.d.ts +6 -1
  174. package/dist/client/index.d.ts.map +1 -1
  175. package/dist/client/index.js +41 -21
  176. package/dist/client/live.d.ts +67 -0
  177. package/dist/client/live.d.ts.map +1 -0
  178. package/dist/client/reactive.d.ts +31 -0
  179. package/dist/client/reactive.d.ts.map +1 -0
  180. package/dist/client/sdk.d.ts +26 -2
  181. package/dist/client/sdk.d.ts.map +1 -1
  182. package/dist/client/sdk.js +9 -0
  183. package/dist/client/vcs-client.d.ts +129 -0
  184. package/dist/client/vcs-client.d.ts.map +1 -0
  185. package/dist/cms/index.js +171 -163
  186. package/dist/{config-8hczw0rs.js → config-KMY6RRK3.js} +8 -9
  187. package/dist/config-PFTP67TR.js +19 -0
  188. package/dist/config-VDMK2DUJ.js +19 -0
  189. package/dist/core/computation/index.d.ts +5 -0
  190. package/dist/core/computation/index.d.ts.map +1 -0
  191. package/dist/core/computation/rollup.d.ts +18 -0
  192. package/dist/core/computation/rollup.d.ts.map +1 -0
  193. package/dist/core/index.d.ts +5 -0
  194. package/dist/core/index.d.ts.map +1 -1
  195. package/dist/core/index.js +168 -101
  196. package/dist/core/kernel/boot-middleware.d.ts +10 -0
  197. package/dist/core/kernel/boot-middleware.d.ts.map +1 -0
  198. package/dist/core/kernel/logic-middleware.d.ts +7 -1
  199. package/dist/core/kernel/logic-middleware.d.ts.map +1 -1
  200. package/dist/core/kernel/trellis-kernel.d.ts.map +1 -1
  201. package/dist/core/ontology/types.d.ts +5 -0
  202. package/dist/core/ontology/types.d.ts.map +1 -1
  203. package/dist/core/persist/better-sqlite-backend.d.ts +9 -2
  204. package/dist/core/persist/better-sqlite-backend.d.ts.map +1 -1
  205. package/dist/core/persist/factory.d.ts +6 -7
  206. package/dist/core/persist/factory.d.ts.map +1 -1
  207. package/dist/core/persist/factory.js +2 -3
  208. package/dist/core/persist/sqljs-backend.js +2 -3
  209. package/dist/db/index.d.ts +4 -1
  210. package/dist/db/index.d.ts.map +1 -1
  211. package/dist/db/index.js +69 -56
  212. package/dist/db/inspector.js +11 -19
  213. package/dist/decisions/index.js +9 -10
  214. package/dist/deploy-66EC752W.js +9 -0
  215. package/dist/deploy-SO7AFK6L.js +9 -0
  216. package/dist/embeddings/auto-embed.d.ts +2 -2
  217. package/dist/embeddings/auto-embed.d.ts.map +1 -1
  218. package/dist/embeddings/index.js +20 -22
  219. package/dist/embeddings/search.d.ts +2 -1
  220. package/dist/embeddings/search.d.ts.map +1 -1
  221. package/dist/embeddings/store.d.ts +25 -4
  222. package/dist/embeddings/store.d.ts.map +1 -1
  223. package/dist/engine-7GXBM4IT.js +7 -0
  224. package/dist/engine-NSR6BIF7.js +7 -0
  225. package/dist/engine.d.ts +32 -12
  226. package/dist/engine.d.ts.map +1 -1
  227. package/dist/factory-2P64OC7M.js +34 -0
  228. package/dist/factory-YP4ZZK5K.js +34 -0
  229. package/dist/import-AJLYHFIA.js +10 -0
  230. package/dist/import-UZEKXU3B.js +10 -0
  231. package/dist/index.js +102 -93
  232. package/dist/launch-explorer-AI6L2AWJ.js +91 -0
  233. package/dist/launch-explorer-HZ4ZJA4X.js +95 -0
  234. package/dist/links/index.js +24 -26
  235. package/dist/plugins/agent-memory/index.js +316 -0
  236. package/dist/plugins/idea-garden/index.js +165 -0
  237. package/dist/plugins/plan-approval/index.js +579 -0
  238. package/dist/plugins/proactive-watcher/index.js +194 -0
  239. package/dist/{index-2r4jxwnb.js → query-GJL3CVGN.js} +14 -15
  240. package/dist/query-MBJSK3EB.js +31 -0
  241. package/dist/query-TJHEVSKL.js +31 -0
  242. package/dist/query-WUIKOHPE.js +524 -0
  243. package/dist/query-XYLTJYSA.js +31 -0
  244. package/dist/react/index.js +39 -70
  245. package/dist/react/realtime.js +11 -0
  246. package/dist/react/schema-hooks.js +87 -0
  247. package/dist/realtime/broadcast-channel-transport.d.ts +43 -0
  248. package/dist/realtime/broadcast-channel-transport.d.ts.map +1 -0
  249. package/dist/realtime/durable-object-relay-transport.d.ts +96 -0
  250. package/dist/realtime/durable-object-relay-transport.d.ts.map +1 -0
  251. package/dist/realtime/index.d.ts +44 -0
  252. package/dist/realtime/index.d.ts.map +1 -0
  253. package/dist/realtime/index.js +40 -0
  254. package/dist/realtime/memory-hub.d.ts +32 -0
  255. package/dist/realtime/memory-hub.d.ts.map +1 -0
  256. package/dist/realtime/persistent-channel.d.ts +105 -0
  257. package/dist/realtime/persistent-channel.d.ts.map +1 -0
  258. package/dist/realtime/presence.d.ts +73 -0
  259. package/dist/realtime/presence.d.ts.map +1 -0
  260. package/dist/realtime/relay-persistence.d.ts +37 -0
  261. package/dist/realtime/relay-persistence.d.ts.map +1 -0
  262. package/dist/realtime/relay-persistence.js +107 -0
  263. package/dist/realtime/relay-server.d.ts +103 -0
  264. package/dist/realtime/relay-server.d.ts.map +1 -0
  265. package/dist/realtime/room.d.ts +98 -0
  266. package/dist/realtime/room.d.ts.map +1 -0
  267. package/dist/realtime/text.d.ts +73 -0
  268. package/dist/realtime/text.d.ts.map +1 -0
  269. package/dist/realtime/types.d.ts +89 -0
  270. package/dist/realtime/types.d.ts.map +1 -0
  271. package/dist/realtime/websocket-relay-transport.d.ts +28 -0
  272. package/dist/realtime/websocket-relay-transport.d.ts.map +1 -0
  273. package/dist/realtime.bundle.js +1100 -0
  274. package/dist/remote-manager-BLJZ6KF6.js +224 -0
  275. package/dist/{remote-manager-xvbg4230.js → remote-manager-BPYE46SI.js} +24 -15
  276. package/dist/remote-manager-FMESEAFA.js +224 -0
  277. package/dist/remote-manager-K2WZ5RHY.js +223 -0
  278. package/dist/remote-manager-SG545WNY.js +224 -0
  279. package/dist/remote-manager-SG5PQKCH.js +224 -0
  280. package/dist/remote-manager-WGP6MIQZ.js +224 -0
  281. package/dist/scaffold/write.d.ts.map +1 -1
  282. package/dist/schema/define.d.ts +137 -0
  283. package/dist/schema/define.d.ts.map +1 -0
  284. package/dist/schema/entity-projection.d.ts +34 -0
  285. package/dist/schema/entity-projection.d.ts.map +1 -0
  286. package/dist/schema/eql.d.ts +46 -0
  287. package/dist/schema/eql.d.ts.map +1 -0
  288. package/dist/schema/index.d.ts +21 -0
  289. package/dist/schema/index.d.ts.map +1 -0
  290. package/dist/schema/index.js +45 -0
  291. package/dist/schema/kernel-resolve.d.ts +21 -0
  292. package/dist/schema/kernel-resolve.d.ts.map +1 -0
  293. package/dist/schema/mutations.d.ts +20 -0
  294. package/dist/schema/mutations.d.ts.map +1 -0
  295. package/dist/schema/resolve.d.ts +21 -0
  296. package/dist/schema/resolve.d.ts.map +1 -0
  297. package/dist/sdk-3KBB3E6V.js +16 -0
  298. package/dist/sdk-4ZQO6UTU.js +16 -0
  299. package/dist/sdk-6JA6GV3G.js +16 -0
  300. package/dist/sdk-6VTP5UTZ.js +16 -0
  301. package/dist/sdk-7VS6TYCD.js +16 -0
  302. package/dist/sdk-HQ3FTLRT.js +16 -0
  303. package/dist/sdk-HZ7NU3XE.js +15 -0
  304. package/dist/sdk-KBQE2OXT.js +16 -0
  305. package/dist/sdk-LZ7W3EEY.js +9 -0
  306. package/dist/sdk-MSCDZ7JU.js +15 -0
  307. package/dist/sdk-WNZOGO3S.js +15 -0
  308. package/dist/sdk-YLV33ZCW.js +9 -0
  309. package/dist/sdk-ZSUD2LLJ.js +16 -0
  310. package/dist/server/index.d.ts +2 -0
  311. package/dist/server/index.d.ts.map +1 -1
  312. package/dist/server/index.js +69 -61
  313. package/dist/server/node-adapter.js +5 -104
  314. package/dist/server/realtime.d.ts +10 -2
  315. package/dist/server/realtime.d.ts.map +1 -1
  316. package/dist/server/server.d.ts +7 -16
  317. package/dist/server/server.d.ts.map +1 -1
  318. package/dist/server/sprites.d.ts.map +1 -1
  319. package/dist/server/tenancy.d.ts.map +1 -1
  320. package/dist/server-AFXFFBWA.js +11 -0
  321. package/dist/server-AGHC4VUL.js +11 -0
  322. package/dist/server-BOH7M4TT.js +13 -0
  323. package/dist/server-DBUY2KY5.js +11 -0
  324. package/dist/server-GWBQJPRG.js +11 -0
  325. package/dist/server-IGBIIJSF.js +13 -0
  326. package/dist/server-JZZFULVU.js +11 -0
  327. package/dist/server-L5XAF4M5.js +11 -0
  328. package/dist/server-NYFUHANA.js +12 -0
  329. package/dist/server-OABUB2LO.js +12 -0
  330. package/dist/server-P2CKZWWV.js +12 -0
  331. package/dist/{sprites-vc4qbrp1.js → sprites-RU3E4XQN.js} +6 -7
  332. package/dist/sprites-XVSMQLSI.js +15 -0
  333. package/dist/sql-wasm-FORCZFHZ.js +2148 -0
  334. package/dist/sql-wasm-JZH76RLO.js +2148 -0
  335. package/dist/sqljs-backend-CJQOIQYE.js +266 -0
  336. package/dist/sqljs-backend-KWXBUDUO.js +266 -0
  337. package/dist/state-demo.bundle.js +1033 -0
  338. package/dist/svelte/index.d.ts +17 -0
  339. package/dist/svelte/index.d.ts.map +1 -0
  340. package/dist/svelte/index.js +51 -0
  341. package/dist/svelte/schema-hooks.d.ts +45 -0
  342. package/dist/svelte/schema-hooks.d.ts.map +1 -0
  343. package/dist/svelte/schema-hooks.js +71 -0
  344. package/dist/svelte/stores.d.ts +78 -0
  345. package/dist/svelte/stores.d.ts.map +1 -0
  346. package/dist/sync/http-transport.d.ts +3 -3
  347. package/dist/sync/http-transport.d.ts.map +1 -1
  348. package/dist/sync/index.d.ts +15 -1
  349. package/dist/sync/index.d.ts.map +1 -1
  350. package/dist/sync/index.js +617 -0
  351. package/dist/sync/memory-room.d.ts +37 -0
  352. package/dist/sync/memory-room.d.ts.map +1 -0
  353. package/dist/sync/memory-transport.d.ts +3 -3
  354. package/dist/sync/memory-transport.d.ts.map +1 -1
  355. package/dist/sync/partykit-room.d.ts +40 -0
  356. package/dist/sync/partykit-room.d.ts.map +1 -0
  357. package/dist/sync/partykit-transport.d.ts +84 -0
  358. package/dist/sync/partykit-transport.d.ts.map +1 -0
  359. package/dist/sync/room-core.d.ts +53 -0
  360. package/dist/sync/room-core.d.ts.map +1 -0
  361. package/dist/sync/sync-engine.d.ts +40 -2
  362. package/dist/sync/sync-engine.d.ts.map +1 -1
  363. package/dist/sync/sync-room-server.d.ts +39 -0
  364. package/dist/sync/sync-room-server.d.ts.map +1 -0
  365. package/dist/sync/types.d.ts +70 -3
  366. package/dist/sync/types.d.ts.map +1 -1
  367. package/dist/sync/vcs-sync-peer.d.ts +63 -0
  368. package/dist/sync/vcs-sync-peer.d.ts.map +1 -0
  369. package/dist/sync/ws-transport.d.ts +2 -2
  370. package/dist/sync/ws-transport.d.ts.map +1 -1
  371. package/dist/tenancy-CBWYEVUB.js +11 -0
  372. package/dist/tenancy-FO6WVYFN.js +13 -0
  373. package/dist/tenancy-FWDBESMX.js +14 -0
  374. package/dist/tenancy-HGPIS5QA.js +13 -0
  375. package/dist/tenancy-HXFALA37.js +14 -0
  376. package/dist/tenancy-OP34NFFS.js +14 -0
  377. package/dist/tenancy-S676GLID.js +14 -0
  378. package/dist/tenancy-V7ARWNNV.js +14 -0
  379. package/dist/tenancy-ZDN4GXK5.js +13 -0
  380. package/dist/tenancy-ZT5VMY7B.js +14 -0
  381. package/dist/ui/client.html +355 -67
  382. package/dist/ui/launch-explorer.d.ts +22 -0
  383. package/dist/ui/launch-explorer.d.ts.map +1 -0
  384. package/dist/ui/server.d.ts +1 -1
  385. package/dist/ui/server.d.ts.map +1 -1
  386. package/dist/vcs/blob-store.d.ts.map +1 -1
  387. package/dist/vcs/idb-op-log.d.ts +67 -0
  388. package/dist/vcs/idb-op-log.d.ts.map +1 -0
  389. package/dist/vcs/index.d.ts +1 -0
  390. package/dist/vcs/index.d.ts.map +1 -1
  391. package/dist/vcs/index.js +81 -72
  392. package/dist/vcs/issue.d.ts +22 -5
  393. package/dist/vcs/issue.d.ts.map +1 -1
  394. package/dist/vcs/lane-materialize.d.ts +5 -0
  395. package/dist/vcs/lane-materialize.d.ts.map +1 -1
  396. package/dist/vcs/op-log.d.ts +28 -2
  397. package/dist/vcs/op-log.d.ts.map +1 -1
  398. package/dist/vcs/ops.d.ts +10 -0
  399. package/dist/vcs/ops.d.ts.map +1 -1
  400. package/dist/{vm-config-6xhsj6b3.js → vm-config-JI4OXKDQ.js} +9 -10
  401. package/dist/vm-config-YZRJ3KUB.js +21 -0
  402. package/dist/vue/hooks.d.ts +64 -0
  403. package/dist/vue/hooks.d.ts.map +1 -0
  404. package/dist/vue/index.d.ts +19 -0
  405. package/dist/vue/index.d.ts.map +1 -0
  406. package/dist/vue/index.js +59 -0
  407. package/dist/vue/schema-hooks.d.ts +41 -0
  408. package/dist/vue/schema-hooks.d.ts.map +1 -0
  409. package/dist/vue/schema-hooks.js +64 -0
  410. package/package.json +118 -16
  411. package/dist/deploy-999q207z.js +0 -10
  412. package/dist/engine-y0724kjq.js +0 -8
  413. package/dist/import-s2b8e0ft.js +0 -11
  414. package/dist/index-a76rekgs.js +0 -67
  415. package/dist/index-c9h37r6h.js +0 -1
  416. package/dist/index-hr9qvv77.js +0 -860
  417. package/dist/index-k5b0xskw.js +0 -1
  418. package/dist/index-y6a4kj0p.js +0 -43
  419. package/dist/sdk-bepky0xs.js +0 -16
  420. package/dist/server-szdjx0nt.js +0 -13
  421. package/dist/sqlite-backend-0vsmc6qj.js +0 -8
  422. package/dist/tenancy-pjm32b4v.js +0 -14
@@ -0,0 +1,14 @@
1
+ import {
2
+ DEFAULT_TENANT,
3
+ TenantPool
4
+ } from "./chunk-NXIRDSZ6.js";
5
+ import "./chunk-GSR6ILTM.js";
6
+ import "./chunk-XMQ7G77X.js";
7
+ import "./chunk-335UEHQR.js";
8
+ import "./chunk-2I5JU73Y.js";
9
+ import "./chunk-4XIVMVHC.js";
10
+ import "./chunk-KFQGP6VL.js";
11
+ export {
12
+ DEFAULT_TENANT,
13
+ TenantPool
14
+ };
@@ -0,0 +1,13 @@
1
+ import {
2
+ DEFAULT_TENANT,
3
+ TenantPool
4
+ } from "./chunk-AHMDVHBL.js";
5
+ import "./chunk-XMQ7G77X.js";
6
+ import "./chunk-LZR3VIFU.js";
7
+ import "./chunk-4XIVMVHC.js";
8
+ import "./chunk-2I5JU73Y.js";
9
+ import "./chunk-KFQGP6VL.js";
10
+ export {
11
+ DEFAULT_TENANT,
12
+ TenantPool
13
+ };
@@ -0,0 +1,14 @@
1
+ import {
2
+ DEFAULT_TENANT,
3
+ TenantPool
4
+ } from "./chunk-HXSRQO3L.js";
5
+ import "./chunk-VYC3RZMK.js";
6
+ import "./chunk-XMQ7G77X.js";
7
+ import "./chunk-335UEHQR.js";
8
+ import "./chunk-2I5JU73Y.js";
9
+ import "./chunk-4XIVMVHC.js";
10
+ import "./chunk-KFQGP6VL.js";
11
+ export {
12
+ DEFAULT_TENANT,
13
+ TenantPool
14
+ };
@@ -80,14 +80,44 @@ body{font-family:var(--font);background:var(--bg);color:var(--text);overflow:hid
80
80
  .cmd-item .ci-type{font:500 9px var(--mono);color:var(--text3);text-transform:uppercase;width:48px;flex-shrink:0}
81
81
  .cmd-item .ci-label{font:400 13px var(--font);color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
82
82
 
83
- /* ─── Graph Panel ─── */
84
- #graph-panel svg{width:100%;height:100%}
85
- .graph-controls{position:absolute;bottom:16px;right:16px;display:flex;flex-direction:column;gap:4px}
86
- .graph-controls button{width:32px;height:32px;background:var(--surface);border:1px solid var(--border);border-radius:6px;color:var(--text2);font-size:14px;cursor:pointer;display:flex;align-items:center;justify-content:center}
87
- .graph-controls button:hover{background:var(--surface2);color:var(--text)}
88
- .graph-legend{position:absolute;bottom:16px;left:16px;display:flex;gap:12px;font:400 11px var(--font);color:var(--text3)}
89
- .legend-item{display:flex;align-items:center;gap:5px}
90
- .legend-dot{width:7px;height:7px;border-radius:50%}
83
+ /* ─── Graph Panel (Studio GraphView parity) ─── */
84
+ #graph-panel.panel.active{display:flex;flex-direction:column;padding:0;overflow:hidden}
85
+ .graph-layout{display:flex;flex:1;min-height:0;overflow:hidden}
86
+ .graph-sidebar{width:200px;flex-shrink:0;border-right:1px solid var(--border);background:var(--surface);display:flex;flex-direction:column;overflow:hidden}
87
+ .graph-sidebar-head{padding:10px 12px;border-bottom:1px solid var(--border);font:600 10px var(--font);letter-spacing:.08em;text-transform:uppercase;color:var(--text3)}
88
+ .graph-sidebar-meta{padding:8px 12px;font:400 11px var(--mono);color:var(--text3);border-bottom:1px solid var(--border)}
89
+ .graph-filter-list{flex:1;overflow-y:auto;padding:8px;display:flex;flex-direction:column;gap:4px}
90
+ .graph-type-pill{display:flex;align-items:center;gap:8px;width:100%;padding:6px 8px;border:1px solid transparent;border-radius:8px;background:transparent;color:var(--text2);font:500 11px var(--font);cursor:pointer;text-align:left;transition:background .12s,border-color .12s,opacity .12s}
91
+ .graph-type-pill:hover{background:var(--surface2)}
92
+ .graph-type-pill.active{background:var(--accent-glow);border-color:rgba(109,91,250,.35);color:var(--text)}
93
+ .graph-type-pill.dimmed{opacity:.35}
94
+ .graph-type-pill .dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}
95
+ .graph-type-pill .name{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
96
+ .graph-type-pill .count{font:500 10px var(--mono);color:var(--text3)}
97
+ .graph-canvas-wrap{position:relative;flex:1;min-width:0;min-height:0;background:var(--bg2)}
98
+ .graph-canvas-wrap svg{width:100%;height:100%;display:block;touch-action:none}
99
+ .graph-tooltip{position:absolute;pointer-events:none;z-index:20;display:none;padding:8px 10px;border-radius:8px;font:400 11px/1.4 var(--font);background:color-mix(in srgb,var(--surface) 88%,transparent);backdrop-filter:blur(8px);border:1px solid var(--border2);color:var(--text);box-shadow:0 6px 20px rgba(0,0,0,.4);max-width:min(360px,90vw);opacity:0;transform:translateY(2px);transition:opacity 80ms ease-out,transform 80ms ease-out}
100
+ .graph-tooltip.visible{display:block;opacity:1;transform:translateY(0)}
101
+ .graph-tooltip .gt-type{font:600 9px var(--mono);text-transform:uppercase;letter-spacing:.06em;color:var(--text3);margin-bottom:2px}
102
+ .graph-tooltip .gt-label{font-weight:500}
103
+ .graph-minimap{position:absolute;left:12px;bottom:12px;z-index:15;border:1px solid var(--border);border-radius:6px;background:color-mix(in srgb,var(--surface) 90%,transparent);box-shadow:0 2px 10px rgba(0,0,0,.35);cursor:pointer;transition:opacity .18s}
104
+ .graph-chrome{position:absolute;left:12px;bottom:144px;z-index:16;width:180px;border:1px solid var(--border);border-radius:8px;background:color-mix(in srgb,var(--surface) 90%,transparent);backdrop-filter:blur(10px);box-shadow:0 4px 16px rgba(0,0,0,.35);overflow:hidden;transition:opacity .18s}
105
+ .graph-chrome.dimmed,.graph-minimap.dimmed{opacity:.12;pointer-events:none}
106
+ .graph-chrome-head{display:flex;align-items:center;justify-content:space-between;padding:6px 8px;border-bottom:1px solid var(--border);font:600 10px var(--font);letter-spacing:.06em;text-transform:uppercase;color:var(--text3)}
107
+ .graph-chrome-head button{background:none;border:none;color:var(--text3);font:500 10px var(--font);cursor:pointer;padding:2px 6px;border-radius:4px}
108
+ .graph-chrome-head button:hover{color:var(--text);background:var(--surface2)}
109
+ .graph-chrome-body{padding:6px 8px 8px;display:flex;flex-direction:column;gap:6px}
110
+ .graph-chrome-body button{width:100%;padding:6px 8px;border-radius:6px;border:1px solid var(--border);background:var(--bg);color:var(--text2);font:500 11px var(--font);cursor:pointer}
111
+ .graph-chrome-body button:hover{border-color:var(--accent);color:var(--accent2)}
112
+ .graph-beacon{position:absolute;z-index:25;display:none;align-items:center;justify-content:center;width:40px;height:40px;padding:0;border-radius:999px;border:1px solid var(--border2);background:color-mix(in srgb,var(--surface) 92%,transparent);color:var(--text);box-shadow:0 4px 16px rgba(0,0,0,.4);cursor:pointer;transform:translate(-50%,-50%);transition:opacity .12s}
113
+ .graph-beacon.visible{display:flex}
114
+ .graph-controls{position:absolute;bottom:12px;right:12px;z-index:14;display:flex;flex-direction:column;gap:4px}
115
+ .graph-controls button{width:32px;height:32px;background:color-mix(in srgb,var(--surface) 92%,transparent);backdrop-filter:blur(8px);border:1px solid var(--border);border-radius:6px;color:var(--text2);font-size:14px;cursor:pointer;display:flex;align-items:center;justify-content:center}
116
+ .graph-controls button:hover{background:var(--surface2);color:var(--text);border-color:var(--border2)}
117
+ .graph-links line{stroke-linecap:round}
118
+ .graph-edge-labels text{font-family:var(--font);pointer-events:none}
119
+ @keyframes edgeFlow{to{stroke-dashoffset:-16}}
120
+ .graph-links line.edge-flow{animation:edgeFlow .5s linear infinite}
91
121
 
92
122
  /* ─── Timeline Panel ─── */
93
123
  #timeline-panel{padding:0}
@@ -194,8 +224,13 @@ body{font-family:var(--font);background:var(--bg);color:var(--text);overflow:hid
194
224
  // ─── State ───
195
225
  const S = { panel: 'graph', graph: null, timeline: null, store: null, system: null, cmdOpen: false, drawerOpen: false };
196
226
  const $ = id => document.getElementById(id);
197
- const TYPE_COLORS = { file:'#60a5fa', milestone:'#34d399', issue:'#fbbf24', branch:'#a78bfa', default:'#63637a' };
198
- const TYPE_RADIUS = { file:4, milestone:8, issue:7, branch:6, default:4 };
227
+ // Aligned with turtlecode/ide entity-theme (GraphView)
228
+ const ENTITY_COLORS = { file:'#14b8a6', milestone:'#3b82f6', issue:'#e879f9', branch:'#fde047', default:'#94a3b8' };
229
+ const GRAPH_LABEL_MIN_ZOOM = 0.65;
230
+ const GRAPH_MINIMAP_W = 180, GRAPH_MINIMAP_H = 120, GRAPH_MINIMAP_PAD = 6;
231
+ const EDGE_LABELS = { milestone_file:'includes', issue_branch:'branch', wikilink:'wikilink', causal:'causal' };
232
+ function nodeRadius(d){ if(d.type==='issue')return 12; if(d.type==='milestone')return 11; if(d.type==='branch')return 8; if(d.type==='file')return 7; return 6; }
233
+ function nodeColor(d){ return ENTITY_COLORS[d.type]||ENTITY_COLORS.default; }
199
234
 
200
235
  // ─── Panel Switching ───
201
236
  const tabs = document.querySelectorAll('.tab');
@@ -260,7 +295,7 @@ body{font-family:var(--font);background:var(--bg);color:var(--text);overflow:hid
260
295
  try{
261
296
  const res = await fetch('/api/node/'+encodeURIComponent(nodeId));
262
297
  const d = await res.json();
263
- let h = `<div class="d-section"><span class="d-badge" style="background:${TYPE_COLORS[d.type]||TYPE_COLORS.default}22;color:${TYPE_COLORS[d.type]||TYPE_COLORS.default}">${d.type}</span></div>`;
298
+ let h = `<div class="d-section"><span class="d-badge" style="background:${ENTITY_COLORS[d.type]||ENTITY_COLORS.default}22;color:${ENTITY_COLORS[d.type]||ENTITY_COLORS.default}">${d.type}</span></div>`;
264
299
  if(d.type==='file'){
265
300
  h += `<div class="d-section"><h4>Path</h4><div class="d-meta"><strong>${esc(d.path)}</strong></div></div>`;
266
301
  if(d.contentHash) h += `<div class="d-section"><h4>Hash</h4><div style="font:11px var(--mono);color:var(--text3);word-break:break-all">${d.contentHash}</div></div>`;
@@ -298,9 +333,120 @@ body{font-family:var(--font);background:var(--bg);color:var(--text);overflow:hid
298
333
  }
299
334
 
300
335
  // ═══════════════════════════════════════════════════════════════════════════
301
- // GRAPH PANEL
336
+ // GRAPH PANEL (Studio GraphView-style)
302
337
  // ═══════════════════════════════════════════════════════════════════════════
303
- let graphSim, graphZoom, graphSvg, graphG, graphNodes, graphLinks, graphLabels, graphNodeMap;
338
+ let graphSim, graphZoom, graphSvg, graphG, graphNodeGroups, graphLinks, graphLabels, graphEdgeLabels, graphNodeMap;
339
+ let graphCanvasWrap, graphZoomState = { k: 1, x: 0, y: 0 }, graphActiveFilters = null, graphMinimap, graphMinimapCtx, graphBeacon;
340
+
341
+ function buildGraphSidebar(nodes){
342
+ const counts = {};
343
+ nodes.forEach(n => { counts[n.type] = (counts[n.type]||0)+1; });
344
+ const types = Object.keys(counts).sort();
345
+ graphActiveFilters = new Set(types);
346
+ const sidebar = document.createElement('aside');
347
+ sidebar.className = 'graph-sidebar';
348
+ sidebar.innerHTML = `<div class="graph-sidebar-head">Entity types</div><div class="graph-sidebar-meta" id="graph-sidebar-meta"></div><div class="graph-filter-list" id="graph-filter-list"></div>`;
349
+ const list = sidebar.querySelector('#graph-filter-list');
350
+ const meta = sidebar.querySelector('#graph-sidebar-meta');
351
+ function refreshMeta(visible){
352
+ meta.textContent = visible + ' / ' + nodes.length + ' nodes';
353
+ }
354
+ function applyFilters(){
355
+ const on = graphActiveFilters;
356
+ let visible = 0;
357
+ graphNodeGroups?.attr('display', n => { const show = on.has(n.type); if(show) visible++; return show ? null : 'none'; });
358
+ graphLinks?.attr('stroke-opacity', l => {
359
+ const sid = typeof l.source==='object'?l.source.id:l.source;
360
+ const tid = typeof l.target==='object'?l.target.id:l.target;
361
+ const st = graphNodeMap?.get(sid)?.type;
362
+ const tt = graphNodeMap?.get(tid)?.type;
363
+ return (st && tt && on.has(st) && on.has(tt)) ? 0.18 : 0.02;
364
+ });
365
+ list.querySelectorAll('.graph-type-pill').forEach(p => p.classList.toggle('dimmed', !on.has(p.dataset.type)));
366
+ refreshMeta(visible);
367
+ }
368
+ types.forEach(t => {
369
+ const btn = document.createElement('button');
370
+ btn.type = 'button';
371
+ btn.className = 'graph-type-pill active';
372
+ btn.dataset.type = t;
373
+ btn.innerHTML = `<span class="dot" style="background:${ENTITY_COLORS[t]||ENTITY_COLORS.default}"></span><span class="name">${t}</span><span class="count">${counts[t]}</span>`;
374
+ btn.onclick = () => {
375
+ if(on.has(t) && on.size>1) on.delete(t); else on.add(t);
376
+ btn.classList.toggle('active', on.has(t));
377
+ applyFilters();
378
+ };
379
+ list.append(btn);
380
+ });
381
+ refreshMeta(nodes.length);
382
+ return { sidebar, applyFilters };
383
+ }
384
+
385
+ function paintGraphMinimap(simNodes){
386
+ if(!graphMinimapCtx) return;
387
+ const MAP_W = GRAPH_MINIMAP_W, MAP_H = GRAPH_MINIMAP_H, PAD = GRAPH_MINIMAP_PAD;
388
+ const mctx = graphMinimapCtx;
389
+ const wrap = graphCanvasWrap;
390
+ const w = wrap.clientWidth, h = wrap.clientHeight;
391
+ const zoom = graphZoomState;
392
+ mctx.clearRect(0, 0, MAP_W, MAP_H);
393
+ let minX=Infinity,minY=Infinity,maxX=-Infinity,maxY=-Infinity;
394
+ simNodes.forEach(n => {
395
+ const x=n.x??0,y=n.y??0;
396
+ if(x<minX)minX=x; if(y<minY)minY=y; if(x>maxX)maxX=x; if(y>maxY)maxY=y;
397
+ });
398
+ const vx0=-zoom.x/zoom.k, vy0=-zoom.y/zoom.k, vx1=(w-zoom.x)/zoom.k, vy1=(h-zoom.y)/zoom.k;
399
+ minX=Math.min(minX,vx0); minY=Math.min(minY,vy0); maxX=Math.max(maxX,vx1); maxY=Math.max(maxY,vy1);
400
+ if(!Number.isFinite(minX)){ minX=0;minY=0;maxX=w;maxY=h; }
401
+ const dx=maxX-minX||1, dy=maxY-minY||1;
402
+ const scale=Math.min((MAP_W-PAD*2)/dx,(MAP_H-PAD*2)/dy);
403
+ const toMap=(x,y)=>[PAD+(x-minX)*scale,PAD+(y-minY)*scale];
404
+ mctx.globalAlpha=.75;
405
+ simNodes.forEach(n => {
406
+ if(graphActiveFilters && !graphActiveFilters.has(n.type)) return;
407
+ const [mx,my]=toMap(n.x??0,n.y??0);
408
+ mctx.fillStyle=nodeColor(n);
409
+ mctx.beginPath(); mctx.arc(mx,my,1.2,0,Math.PI*2); mctx.fill();
410
+ });
411
+ mctx.globalAlpha=1;
412
+ const [rx,ry]=toMap(vx0,vy0), rw=(vx1-vx0)*scale, rh=(vy1-vy0)*scale;
413
+ mctx.fillStyle='rgba(0,0,0,.45)';
414
+ const mask=new Path2D();
415
+ mask.rect(0,0,MAP_W,MAP_H); mask.rect(rx,ry,rw,rh);
416
+ mctx.fill(mask,'evenodd');
417
+ mctx.strokeStyle='rgba(255,255,255,.85)'; mctx.lineWidth=1;
418
+ mctx.strokeRect(rx+.5,ry+.5,rw-1,rh-1);
419
+ updateGraphBeacon(simNodes, w, h);
420
+ }
421
+
422
+ function updateGraphBeacon(simNodes, w, h){
423
+ if(!graphBeacon) return;
424
+ const zoom=graphZoomState;
425
+ let minX=Infinity,minY=Infinity,maxX=-Infinity,maxY=-Infinity,cx=0,cy=0,n=0;
426
+ simNodes.forEach(nd => {
427
+ if(graphActiveFilters && !graphActiveFilters.has(nd.type)) return;
428
+ const x=nd.x??0,y=nd.y??0; cx+=x; cy+=y; n++;
429
+ if(x<minX)minX=x; if(y<minY)minY=y; if(x>maxX)maxX=x; if(y>maxY)maxY=y;
430
+ });
431
+ if(!n){ graphBeacon.classList.remove('visible'); return; }
432
+ cx/=n; cy/=n;
433
+ const vx0=-zoom.x/zoom.k, vy0=-zoom.y/zoom.k, vx1=(w-zoom.x)/zoom.k, vy1=(h-zoom.y)/zoom.k;
434
+ const offscreen = maxX<vx0||minX>vx1||maxY<vy0||minY>vy1;
435
+ if(!offscreen){ graphBeacon.classList.remove('visible'); return; }
436
+ const sx=cx*zoom.k+zoom.x, sy=cy*zoom.k+zoom.y;
437
+ const pad=56, hw=Math.max(24,w/2-pad), hh=Math.max(24,h/2-pad);
438
+ const dx=sx-w/2, dy=sy-h/2;
439
+ const sc=Math.min(Math.abs(hw/(dx||1e-6)),Math.abs(hh/(dy||1e-6)));
440
+ graphBeacon.style.left=(w/2+dx*sc)+'px';
441
+ graphBeacon.style.top=(h/2+dy*sc)+'px';
442
+ graphBeacon.classList.add('visible');
443
+ }
444
+
445
+ function updateLabelVisibility(){
446
+ const show = graphZoomState.k >= GRAPH_LABEL_MIN_ZOOM;
447
+ graphLabels?.attr('opacity', show ? 0.85 : 0);
448
+ graphEdgeLabels?.attr('opacity', show ? 0.35 : 0);
449
+ }
304
450
 
305
451
  async function initGraph(){
306
452
  try{ const r = await fetch('/api/graph'); S.graph = await r.json(); }
@@ -310,75 +456,217 @@ body{font-family:var(--font);background:var(--bg);color:var(--text);overflow:hid
310
456
  buildCmdItems();
311
457
 
312
458
  const container = $('graph-panel');
313
- const w = container.clientWidth, h = container.clientHeight;
314
-
315
- const svg = d3.select('#graph-panel').append('svg').attr('width', w).attr('height', h);
459
+ container.innerHTML = '';
460
+ const layout = document.createElement('div');
461
+ layout.className = 'graph-layout';
462
+ const { sidebar, applyFilters } = buildGraphSidebar(nodes);
463
+ graphCanvasWrap = document.createElement('div');
464
+ graphCanvasWrap.className = 'graph-canvas-wrap';
465
+ graphCanvasWrap.id = 'graph-canvas-wrap';
466
+ layout.append(sidebar, graphCanvasWrap);
467
+ container.append(layout);
468
+
469
+ const w = graphCanvasWrap.clientWidth || 800, h = graphCanvasWrap.clientHeight || 600;
470
+ const svg = d3.select(graphCanvasWrap).append('svg').attr('width', w).attr('height', h);
316
471
  graphSvg = svg;
317
472
  const g = svg.append('g');
318
473
  graphG = g;
319
- graphZoom = d3.zoom().scaleExtent([0.1,8]).on('zoom', e => g.attr('transform', e.transform));
474
+ graphZoom = d3.zoom().scaleExtent([0.05, 4]).on('zoom', e => {
475
+ g.attr('transform', e.transform);
476
+ graphZoomState = { k: e.transform.k, x: e.transform.x, y: e.transform.y };
477
+ updateLabelVisibility();
478
+ paintGraphMinimap(simNodes);
479
+ });
320
480
  svg.call(graphZoom);
481
+ svg.on('click', () => { clearGraphHighlight(); drawer.classList.remove('open'); });
321
482
 
322
483
  const simLinks = edges.map(e => ({...e}));
323
484
  const simNodes = nodes.map(n => ({...n}));
324
485
  graphNodeMap = new Map(); simNodes.forEach(n => graphNodeMap.set(n.id, n));
325
486
 
487
+ const size = simNodes.length;
488
+ const dist = size > 800 ? 45 : size > 300 ? 60 : 90;
489
+ const charge = size > 800 ? -90 : size > 300 ? -130 : -220;
490
+
326
491
  graphSim = d3.forceSimulation(simNodes)
327
- .force('link', d3.forceLink(simLinks).id(d=>d.id).distance(55).strength(0.3))
328
- .force('charge', d3.forceManyBody().strength(-70).distanceMax(280))
492
+ .force('link', d3.forceLink(simLinks).id(d=>d.id).distance(dist).strength(0.35))
493
+ .force('charge', d3.forceManyBody().strength(charge).distanceMax(400))
329
494
  .force('center', d3.forceCenter(w/2, h/2))
330
- .force('collision', d3.forceCollide().radius(d=>(TYPE_RADIUS[d.type]||4)+2))
331
- .force('x', d3.forceX(w/2).strength(0.03))
332
- .force('y', d3.forceY(h/2).strength(0.03));
495
+ .force('collision', d3.forceCollide().radius(d => nodeRadius(d) + 4))
496
+ .alphaDecay(0.04).alphaMin(0.02);
497
+
498
+ graphLinks = g.append('g').attr('class','graph-links').selectAll('line').data(simLinks).join('line')
499
+ .attr('stroke', 'var(--text3)')
500
+ .attr('stroke-width', 1)
501
+ .attr('stroke-opacity', 0.18)
502
+ .attr('stroke-dasharray', d => d.type==='wikilink' ? '3,3' : null);
503
+
504
+ graphEdgeLabels = g.append('g').attr('class','graph-edge-labels').selectAll('text').data(simLinks).join('text')
505
+ .text(d => EDGE_LABELS[d.type] || d.type)
506
+ .attr('font-size', 9).attr('font-weight', 500).attr('fill', 'var(--text2)')
507
+ .attr('stroke', 'var(--bg)').attr('stroke-width', 3).attr('paint-order', 'stroke')
508
+ .attr('text-anchor', 'middle').attr('dy', '0.35em').attr('opacity', 0);
509
+
510
+ graphNodeGroups = g.append('g').attr('class','graph-nodes').selectAll('g').data(simNodes).join('g')
511
+ .attr('cursor', 'pointer')
512
+ .call(d3.drag().on('start',(e,d)=>{if(!e.active)graphSim.alphaTarget(.25).restart();d.fx=d.x;d.fy=d.y})
513
+ .on('drag',(e,d)=>{d.fx=e.x;d.fy=e.y})
514
+ .on('end',(e,d)=>{if(!e.active)graphSim.alphaTarget(0);d.fx=null;d.fy=null}));
515
+
516
+ graphNodeGroups.append('circle')
517
+ .attr('r', d => nodeRadius(d))
518
+ .attr('fill', d => nodeColor(d))
519
+ .attr('stroke', 'transparent').attr('stroke-width', 2);
520
+
521
+ graphLabels = graphNodeGroups.append('text')
522
+ .text(d => d.label.length > 24 ? d.label.slice(0, 24) + '…' : d.label)
523
+ .attr('font-size', 10).attr('fill', 'var(--text2)')
524
+ .attr('x', d => nodeRadius(d) + 5).attr('dy', 4)
525
+ .attr('pointer-events', 'none').attr('opacity', 0)
526
+ .attr('font-family', 'Inter,sans-serif');
527
+
528
+ const graphTip = document.createElement('div');
529
+ graphTip.className = 'graph-tooltip';
530
+ graphCanvasWrap.appendChild(graphTip);
531
+
532
+ graphNodeGroups.on('mouseenter', (e, d) => {
533
+ graphTip.innerHTML = `<div class="gt-type">${d.type}</div><div class="gt-label">${esc(d.label)}</div>`;
534
+ graphTip.classList.add('visible');
535
+ graphTip.style.left = (e.offsetX + 14) + 'px';
536
+ graphTip.style.top = (e.offsetY + 10) + 'px';
537
+ $('tooltip').style.display = 'none';
538
+ }).on('mousemove', (e) => {
539
+ graphTip.style.left = (e.offsetX + 14) + 'px';
540
+ graphTip.style.top = (e.offsetY + 10) + 'px';
541
+ }).on('mouseleave', () => graphTip.classList.remove('visible'))
542
+ .on('click', (e, d) => { e.stopPropagation(); highlightGraphNode(d); loadNodeDetail(d.id); });
333
543
 
334
- graphLinks = g.append('g').selectAll('line').data(simLinks).join('line')
335
- .attr('stroke', d => d.type==='wikilink'?'#60a5fa33':d.type==='milestone_file'?'#34d39933':d.type==='issue_branch'?'#fbbf2433':'#25262e')
336
- .attr('stroke-width', d => d.type==='wikilink'?1.2:0.7);
544
+ graphSim.on('tick', () => {
545
+ graphLinks
546
+ .attr('x1', d => d.source.x).attr('y1', d => d.source.y)
547
+ .attr('x2', d => d.target.x).attr('y2', d => d.target.y);
548
+ graphNodeGroups.attr('transform', d => `translate(${d.x},${d.y})`);
549
+ graphEdgeLabels
550
+ .attr('x', d => (d.source.x + d.target.x) / 2)
551
+ .attr('y', d => (d.source.y + d.target.y) / 2);
552
+ paintGraphMinimap(simNodes);
553
+ });
337
554
 
338
- graphNodes = g.append('g').selectAll('circle').data(simNodes).join('circle')
339
- .attr('r', d => TYPE_RADIUS[d.type]||4)
340
- .attr('fill', d => TYPE_COLORS[d.type]||TYPE_COLORS.default)
341
- .attr('cursor','pointer')
342
- .call(d3.drag().on('start',(e,d)=>{if(!e.active)graphSim.alphaTarget(.3).restart();d.fx=d.x;d.fy=d.y}).on('drag',(e,d)=>{d.fx=e.x;d.fy=e.y}).on('end',(e,d)=>{if(!e.active)graphSim.alphaTarget(0);d.fx=null;d.fy=null}));
555
+ // Minimap
556
+ graphMinimap = document.createElement('canvas');
557
+ graphMinimap.className = 'graph-minimap';
558
+ graphMinimap.width = GRAPH_MINIMAP_W * (devicePixelRatio||1);
559
+ graphMinimap.height = GRAPH_MINIMAP_H * (devicePixelRatio||1);
560
+ graphMinimap.style.width = GRAPH_MINIMAP_W + 'px';
561
+ graphMinimap.style.height = GRAPH_MINIMAP_H + 'px';
562
+ graphMinimapCtx = graphMinimap.getContext('2d');
563
+ graphMinimapCtx.scale(devicePixelRatio||1, devicePixelRatio||1);
564
+ graphCanvasWrap.appendChild(graphMinimap);
565
+
566
+ function panToWorld(wx, wy){
567
+ const k = graphZoomState.k;
568
+ svg.transition().duration(280).call(graphZoom.transform, d3.zoomIdentity.translate(w/2 - wx*k, h/2 - wy*k).scale(k));
569
+ }
570
+ function minimapPoint(evt){
571
+ const rect = graphMinimap.getBoundingClientRect();
572
+ const mx = evt.clientX - rect.left, my = evt.clientY - rect.top;
573
+ let minX=Infinity,minY=Infinity,maxX=-Infinity,maxY=-Infinity;
574
+ simNodes.forEach(n => { const x=n.x??0,y=n.y??0; if(x<minX)minX=x; if(y<minY)minY=y; if(x>maxX)maxX=x; if(y>maxY)maxY=y; });
575
+ const dx=maxX-minX||1, dy=maxY-minY||1;
576
+ const scale=Math.min((GRAPH_MINIMAP_W-GRAPH_MINIMAP_PAD*2)/dx,(GRAPH_MINIMAP_H-GRAPH_MINIMAP_PAD*2)/dy);
577
+ return [(mx-GRAPH_MINIMAP_PAD)/scale+minX, (my-GRAPH_MINIMAP_PAD)/scale+minY];
578
+ }
579
+ graphMinimap.addEventListener('mousedown', e => { e.preventDefault(); panToWorld(...minimapPoint(e)); });
580
+ graphMinimap.addEventListener('mousemove', e => { if(e.buttons===1) panToWorld(...minimapPoint(e)); });
581
+
582
+ // Return-to-graph beacon
583
+ graphBeacon = document.createElement('button');
584
+ graphBeacon.type = 'button';
585
+ graphBeacon.className = 'graph-beacon';
586
+ graphBeacon.setAttribute('aria-label', 'Return to graph');
587
+ graphBeacon.innerHTML = '<svg viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2"><path d="M5 12h14"/><path d="m12 5 7 7-7 7"/></svg>';
588
+ graphBeacon.onclick = e => { e.stopPropagation(); fitGraph(); };
589
+ graphCanvasWrap.appendChild(graphBeacon);
590
+
591
+ // Graph chrome (fit / reset)
592
+ const chrome = document.createElement('div');
593
+ chrome.className = 'graph-chrome';
594
+ chrome.innerHTML = '<div class="graph-chrome-head"><span>Graph</span><button type="button" id="graph-chrome-reset">Reset</button></div><div class="graph-chrome-body"><button type="button" id="graph-chrome-fit">Fit to view</button></div>';
595
+ graphCanvasWrap.appendChild(chrome);
596
+ chrome.querySelector('#graph-chrome-fit').onclick = () => fitGraph();
597
+ chrome.querySelector('#graph-chrome-reset').onclick = () => { simNodes.forEach(n => { n.fx=null; n.fy=null; }); graphSim.alpha(0.6).restart(); };
598
+
599
+ const ctrlDiv = document.createElement('div');
600
+ ctrlDiv.className = 'graph-controls';
601
+ ctrlDiv.innerHTML = '<button id="gz-in" title="Zoom in">+</button><button id="gz-out" title="Zoom out">−</button><button id="gz-fit" title="Fit">⊙</button>';
602
+ graphCanvasWrap.appendChild(ctrlDiv);
603
+ $('gz-in').onclick = () => svg.transition().duration(200).call(graphZoom.scaleBy, 1.4);
604
+ $('gz-out').onclick = () => svg.transition().duration(200).call(graphZoom.scaleBy, 0.72);
605
+ $('gz-fit').onclick = () => fitGraph();
606
+
607
+ applyFilters();
608
+ graphSim.on('end', () => { fitGraph(); updateLabelVisibility(); });
609
+
610
+ const onResize = () => {
611
+ const nw = graphCanvasWrap.clientWidth, nh = graphCanvasWrap.clientHeight;
612
+ svg.attr('width', nw).attr('height', nh);
613
+ graphSim.force('center', d3.forceCenter(nw/2, nh/2));
614
+ paintGraphMinimap(simNodes);
615
+ };
616
+ window.addEventListener('resize', onResize);
617
+ }
343
618
 
344
- graphLabels = g.append('g').selectAll('text').data(simNodes.filter(d=>d.type!=='file')).join('text')
345
- .text(d => d.label.length>22?d.label.slice(0,22)+'…':d.label)
346
- .attr('font-size',10).attr('fill',d=>TYPE_COLORS[d.type]||'#63637a').attr('dx',d=>(TYPE_RADIUS[d.type]||4)+4).attr('dy',3).attr('pointer-events','none').attr('opacity',.8).attr('font-family','Inter,sans-serif');
619
+ function fitGraph(){
620
+ if(!graphG?.node()) return;
621
+ const b = graphG.node().getBBox();
622
+ if(!b.width) return;
623
+ const w = graphCanvasWrap?.clientWidth || 800, h = graphCanvasWrap?.clientHeight || 600, p = 80;
624
+ const s = Math.min((w - p*2)/b.width, (h - p*2)/b.height, 2);
625
+ graphSvg.transition().duration(500).call(graphZoom.transform,
626
+ d3.zoomIdentity.translate(w/2, h/2).scale(s).translate(-b.x - b.width/2, -b.y - b.height/2));
627
+ }
347
628
 
348
- graphSim.on('tick', () => {
349
- graphLinks.attr('x1',d=>d.source.x).attr('y1',d=>d.source.y).attr('x2',d=>d.target.x).attr('y2',d=>d.target.y);
350
- graphNodes.attr('cx',d=>d.x).attr('cy',d=>d.y);
351
- graphLabels.attr('x',d=>d.x).attr('y',d=>d.y);
629
+ function highlightGraphNode(d){
630
+ const c = new Set([d.id]);
631
+ graphLinks.each(function(l){
632
+ const s = typeof l.source==='object'?l.source.id:l.source;
633
+ const t = typeof l.target==='object'?l.target.id:l.target;
634
+ if(s===d.id) c.add(t); if(t===d.id) c.add(s);
635
+ });
636
+ graphNodeGroups.attr('opacity', n => c.has(n.id) ? 1 : 0.15);
637
+ graphNodeGroups.select('circle').attr('stroke', n => c.has(n.id) ? '#fff' : 'transparent').attr('stroke-width', n => c.has(n.id) ? 2.5 : 0);
638
+ graphLinks.each(function(l){
639
+ const s = typeof l.source==='object'?l.source.id:l.source;
640
+ const t = typeof l.target==='object'?l.target.id:l.target;
641
+ const on = (s===d.id||t===d.id);
642
+ d3.select(this).classed('edge-flow', on).attr('stroke-opacity', on ? 0.75 : 0.04);
643
+ });
644
+ graphLabels.attr('opacity', n => c.has(n.id) ? 1 : 0.1);
645
+ graphEdgeLabels.attr('opacity', l => {
646
+ const s = typeof l.source==='object'?l.source.id:l.source;
647
+ const t = typeof l.target==='object'?l.target.id:l.target;
648
+ return (s===d.id||t===d.id) && graphZoomState.k >= GRAPH_LABEL_MIN_ZOOM ? 0.9 : 0;
352
649
  });
650
+ }
651
+
652
+ function clearGraphHighlight(){
653
+ graphNodeGroups?.attr('opacity', 1);
654
+ graphNodeGroups?.select('circle').attr('stroke', 'transparent');
655
+ graphLinks?.attr('stroke-opacity', 0.18).classed('edge-flow', false);
656
+ graphLabels?.attr('opacity', graphZoomState.k >= GRAPH_LABEL_MIN_ZOOM ? 0.85 : 0);
657
+ graphEdgeLabels?.attr('opacity', graphZoomState.k >= GRAPH_LABEL_MIN_ZOOM ? 0.35 : 0);
658
+ }
353
659
 
354
- // Tooltip
355
- const tip = $('tooltip');
356
- graphNodes.on('mouseover',(e,d)=>{tip.textContent=d.label;tip.style.display='block';tip.style.left=(e.clientX+12)+'px';tip.style.top=(e.clientY-8)+'px'})
357
- .on('mousemove',e=>{tip.style.left=(e.clientX+12)+'px';tip.style.top=(e.clientY-8)+'px'})
358
- .on('mouseout',()=>{tip.style.display='none'});
359
-
360
- // Click detail
361
- graphNodes.on('click',(e,d)=>{e.stopPropagation();highlightGraphNode(d);loadNodeDetail(d.id)});
362
- svg.on('click',()=>{clearGraphHighlight();drawer.classList.remove('open')});
363
-
364
- // Legend
365
- const legendHtml = Object.entries(TYPE_COLORS).filter(([k])=>k!=='default').map(([k,c])=>`<div class="legend-item"><div class="legend-dot" style="background:${c}"></div>${k}</div>`).join('');
366
- const legendDiv = document.createElement('div'); legendDiv.className='graph-legend'; legendDiv.innerHTML=legendHtml; container.appendChild(legendDiv);
367
-
368
- // Zoom controls
369
- const ctrlDiv = document.createElement('div'); ctrlDiv.className='graph-controls';
370
- ctrlDiv.innerHTML='<button id="gz-in">+</button><button id="gz-out">−</button><button id="gz-fit">⊙</button>';
371
- container.appendChild(ctrlDiv);
372
- $('gz-in').onclick=()=>svg.transition().duration(300).call(graphZoom.scaleBy,1.5);
373
- $('gz-out').onclick=()=>svg.transition().duration(300).call(graphZoom.scaleBy,0.67);
374
- $('gz-fit').onclick=()=>fitGraph();
375
-
376
- graphSim.on('end', fitGraph);
660
+ function focusGraphNode(id){
661
+ const n = graphNodeMap?.get(id);
662
+ if(!n) return;
663
+ switchPanel('graph');
664
+ highlightGraphNode(n);
665
+ loadNodeDetail(id);
666
+ const w = graphCanvasWrap?.clientWidth || 800, h = graphCanvasWrap?.clientHeight || 600;
667
+ graphSvg.transition().duration(450).call(graphZoom.transform,
668
+ d3.zoomIdentity.translate(w/2, h/2).scale(Math.max(graphZoomState.k, 1)).translate(-n.x, -n.y));
377
669
  }
378
- function fitGraph(){ const b=graphG.node().getBBox();if(!b.width)return;const w=$('graph-panel').clientWidth,h=$('graph-panel').clientHeight,p=50;const s=Math.min((w-p*2)/b.width,(h-p*2)/b.height,2);graphSvg.transition().duration(600).call(graphZoom.transform,d3.zoomIdentity.translate(w/2,h/2).scale(s).translate(-b.x-b.width/2,-b.y-b.height/2)); }
379
- function highlightGraphNode(d){ const c=new Set([d.id]);graphLinks.each(function(l){const s=typeof l.source==='object'?l.source.id:l.source;const t=typeof l.target==='object'?l.target.id:l.target;if(s===d.id)c.add(t);if(t===d.id)c.add(s)});graphNodes.attr('opacity',n=>c.has(n.id)?1:.12);graphLinks.attr('opacity',l=>{const s=typeof l.source==='object'?l.source.id:l.source;const t=typeof l.target==='object'?l.target.id:l.target;return(s===d.id||t===d.id)?1:.04});graphLabels.attr('opacity',n=>c.has(n.id)?1:.08); }
380
- function clearGraphHighlight(){ graphNodes?.attr('opacity',1); graphLinks?.attr('opacity',1); graphLabels?.attr('opacity',.8); }
381
- function focusGraphNode(id){ const n=graphNodeMap?.get(id);if(!n)return;highlightGraphNode(n);loadNodeDetail(id);graphSvg.transition().duration(500).call(graphZoom.translateTo,n.x,n.y); }
382
670
 
383
671
  // ═══════════════════════════════════════════════════════════════════════════
384
672
  // TIMELINE PANEL
@@ -394,7 +682,7 @@ body{font-family:var(--font);background:var(--bg);color:var(--text);overflow:hid
394
682
  if(!ops.length){ $('tl-body').innerHTML='<div class="tl-empty">No operations yet</div>'; return; }
395
683
  const body = $('tl-body');
396
684
  const W = Math.max(body.clientWidth, ops.length*14+120), H = body.clientHeight-20;
397
- const KIND_COLORS = {'vcs:fileAdd':TYPE_COLORS.file,'vcs:fileModify':'#38bdf8','vcs:fileDelete':TYPE_COLORS.issue,'vcs:fileRename':'#fb923c','vcs:branchCreate':TYPE_COLORS.branch,'vcs:branchDelete':'#f472b6','vcs:milestoneCreate':TYPE_COLORS.milestone,'vcs:checkpointCreate':'#6b7280'};
685
+ const KIND_COLORS = {'vcs:fileAdd':ENTITY_COLORS.file,'vcs:fileModify':'#38bdf8','vcs:fileDelete':ENTITY_COLORS.issue,'vcs:fileRename':'#fb923c','vcs:branchCreate':ENTITY_COLORS.branch,'vcs:branchDelete':'#f472b6','vcs:milestoneCreate':ENTITY_COLORS.milestone,'vcs:checkpointCreate':'#6b7280'};
398
686
  const svg = d3.select('#tl-body').append('svg').attr('width',W).attr('height',H);
399
687
  const x = d3.scaleLinear().domain([0,ops.length-1||1]).range([40,W-40]);
400
688
  const laneY = H/2;
@@ -412,9 +700,9 @@ body{font-family:var(--font);background:var(--bg);color:var(--text);overflow:hid
412
700
  .on('click',(e,d)=>{e.stopPropagation();openDrawer('Op: '+d.kind,`<div class="d-section"><div class="d-kv"><span class="k">kind</span><span class="v">${d.kind}</span><span class="k">hash</span><span class="v">${d.hash}</span><span class="k">time</span><span class="v">${d.timestamp||''}</span><span class="k">agent</span><span class="v">${d.agentId||''}</span>${d.filePath?'<span class="k">file</span><span class="v">'+esc(d.filePath)+'</span>':''}${d.branchName?'<span class="k">branch</span><span class="v">'+esc(d.branchName)+'</span>':''}</div></div>`)});
413
701
 
414
702
  // Milestone markers
415
- milestones.forEach(m=>{const mx=x(m.atOpIndex);svg.append('polygon').attr('points',`${mx},${laneY-18} ${mx+6},${laneY-10} ${mx},${laneY-2} ${mx-6},${laneY-10}`).attr('fill',TYPE_COLORS.milestone).attr('opacity',.85).attr('cursor','pointer')
703
+ milestones.forEach(m=>{const mx=x(m.atOpIndex);svg.append('polygon').attr('points',`${mx},${laneY-18} ${mx+6},${laneY-10} ${mx},${laneY-2} ${mx-6},${laneY-10}`).attr('fill',ENTITY_COLORS.milestone).attr('opacity',.85).attr('cursor','pointer')
416
704
  .on('click',()=>openDrawer('Milestone',`<div class="d-section"><h4>Message</h4><div class="d-meta"><strong>${esc(m.message||'')}</strong></div></div><div class="d-section"><div class="d-kv"><span class="k">ID</span><span class="v">${m.id}</span><span class="k">at op</span><span class="v">#${m.atOpIndex}</span><span class="k">files</span><span class="v">${m.affectedFiles}</span></div></div>`));
417
- svg.append('text').attr('x',mx).attr('y',laneY-22).attr('text-anchor','middle').attr('font-size',9).attr('fill',TYPE_COLORS.milestone).attr('font-family','Inter').text(m.message?.slice(0,20)||m.id)});
705
+ svg.append('text').attr('x',mx).attr('y',laneY-22).attr('text-anchor','middle').attr('font-size',9).attr('fill',ENTITY_COLORS.milestone).attr('font-family','Inter').text(m.message?.slice(0,20)||m.id)});
418
706
 
419
707
  // Checkpoint ticks
420
708
  checkpoints.forEach(c=>{const cx=x(c.atOpIndex);svg.append('line').attr('x1',cx).attr('y1',laneY+8).attr('x2',cx).attr('y2',laneY+18).attr('stroke','#6b7280').attr('stroke-width',1).attr('opacity',.5)});
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Launch the SvelteKit realtime explorer (demo/realtime-app).
3
+ * Replaces the legacy client.html System Visualizer for `trellis ui`.
4
+ */
5
+ export type LaunchExplorerOptions = {
6
+ /** Repo root — ensures .trellis exists; explorer DB lives in demo/realtime-app */
7
+ rootPath: string;
8
+ /** SvelteKit dev port (default 4000) */
9
+ appPort?: number;
10
+ /** Trellis graph sidecar port (default 3920) */
11
+ trellisPort?: number;
12
+ };
13
+ export type LaunchExplorerHandle = {
14
+ appPort: number;
15
+ trellisPort: number;
16
+ appUrl: string;
17
+ trellisUrl: string;
18
+ stop: () => void;
19
+ };
20
+ export declare function resolveExplorerAppDir(): string;
21
+ export declare function launchRealtimeExplorer(opts: LaunchExplorerOptions): Promise<LaunchExplorerHandle>;
22
+ //# sourceMappingURL=launch-explorer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launch-explorer.d.ts","sourceRoot":"","sources":["../../src/ui/launch-explorer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,MAAM,MAAM,qBAAqB,GAAG;IAClC,kFAAkF;IAClF,QAAQ,EAAE,MAAM,CAAC;IACjB,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gDAAgD;IAChD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,IAAI,CAAC;CAClB,CAAC;AAIF,wBAAgB,qBAAqB,IAAI,MAAM,CAY9C;AAMD,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,qBAAqB,GAC1B,OAAO,CAAC,oBAAoB,CAAC,CA0D/B"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Trellis UI Server
3
3
  *
4
- * Lightweight Bun HTTP server that exposes the TrellisVCS engine
4
+ * Lightweight HTTP server that exposes the TrellisVCS engine
5
5
  * as a JSON API and serves the System Visualizer client.
6
6
  *
7
7
  * Endpoints:
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/ui/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAiBH,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,OAAO,GAAG,QAAQ,CAAC;IAChD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,gBAAgB,GAAG,cAAc,GAAG,UAAU,GAAG,QAAQ,CAAC;IAChE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB;AAqZD,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,IAAI,CAAC;CAClB,CAAC,CAyLD"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/ui/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAmBH,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,OAAO,GAAG,QAAQ,CAAC;IAChD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,gBAAgB,GAAG,cAAc,GAAG,UAAU,GAAG,QAAQ,CAAC;IAChE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB;AAqZD,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,IAAI,CAAC;CAClB,CAAC,CAsOD"}
@@ -1 +1 @@
1
- {"version":3,"file":"blob-store.d.ts","sourceRoot":"","sources":["../../src/vcs/blob-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAS;gBAEZ,UAAU,EAAE,MAAM;IAO9B;;;OAGG;IACG,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IASxD;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM;IAS7C;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQhC;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAQzD;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM;IAW9C;;OAEG;IACH,KAAK,IAAI,MAAM;IASf;;OAEG;IACH,SAAS,IAAI,MAAM;IAgBnB,OAAO,CAAC,aAAa;CAKtB"}
1
+ {"version":3,"file":"blob-store.d.ts","sourceRoot":"","sources":["../../src/vcs/blob-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAS;gBAEZ,UAAU,EAAE,MAAM;IAO9B;;;OAGG;IACG,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IASxD;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM;IAS7C;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQhC;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAQzD;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM;IAK9C;;OAEG;IACH,KAAK,IAAI,MAAM;IASf;;OAEG;IACH,SAAS,IAAI,MAAM;IAgBnB,OAAO,CAAC,aAAa;CAKtB"}