trellis 3.1.35 → 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,1078 @@
1
+ import {
2
+ __esm,
3
+ __export,
4
+ __require
5
+ } from "./chunk-2ESYSVXG.js";
6
+
7
+ // src/embeddings/types.ts
8
+ var DEFAULT_MODEL_CONFIG;
9
+ var init_types = __esm({
10
+ "src/embeddings/types.ts"() {
11
+ "use strict";
12
+ DEFAULT_MODEL_CONFIG = {
13
+ modelName: "Xenova/all-MiniLM-L6-v2",
14
+ dimension: 384
15
+ };
16
+ }
17
+ });
18
+
19
+ // src/embeddings/model.ts
20
+ async function importTransformers() {
21
+ try {
22
+ return await import("@huggingface/transformers");
23
+ } catch {
24
+ try {
25
+ return await import("@xenova/transformers");
26
+ } catch {
27
+ throw new Error(
28
+ "No transformers library found. Install @huggingface/transformers (recommended) or @xenova/transformers."
29
+ );
30
+ }
31
+ }
32
+ }
33
+ async function loadModel(config = DEFAULT_MODEL_CONFIG) {
34
+ if (pipeline) return pipeline;
35
+ if (!loadPromise) {
36
+ loadPromise = (async () => {
37
+ const { pipeline: createPipeline } = await importTransformers();
38
+ const opts = {};
39
+ if (config.cacheDir) {
40
+ opts.cache_dir = config.cacheDir;
41
+ }
42
+ pipeline = await createPipeline(
43
+ "feature-extraction",
44
+ config.modelName,
45
+ opts
46
+ );
47
+ return pipeline;
48
+ })();
49
+ }
50
+ return loadPromise;
51
+ }
52
+ async function embed(text, config = DEFAULT_MODEL_CONFIG) {
53
+ const pipe = await loadModel(config);
54
+ const output = await pipe(text, { pooling: "mean", normalize: true });
55
+ return new Float32Array(output.data);
56
+ }
57
+ async function embedBatch(texts, config = DEFAULT_MODEL_CONFIG) {
58
+ if (texts.length === 0) return [];
59
+ const pipe = await loadModel(config);
60
+ const results = [];
61
+ const batchSize = 32;
62
+ for (let i = 0; i < texts.length; i += batchSize) {
63
+ const batch = texts.slice(i, i + batchSize);
64
+ for (const text of batch) {
65
+ const output = await pipe(text, { pooling: "mean", normalize: true });
66
+ results.push(new Float32Array(output.data));
67
+ }
68
+ }
69
+ return results;
70
+ }
71
+ function resetModel() {
72
+ pipeline = null;
73
+ loadPromise = null;
74
+ }
75
+ var pipeline, loadPromise;
76
+ var init_model = __esm({
77
+ "src/embeddings/model.ts"() {
78
+ "use strict";
79
+ init_types();
80
+ pipeline = null;
81
+ loadPromise = null;
82
+ }
83
+ });
84
+
85
+ // src/embeddings/store.ts
86
+ function rowToChunkMeta(row) {
87
+ return {
88
+ id: row.id,
89
+ entityId: row.entity_id,
90
+ content: row.content,
91
+ chunkType: row.chunk_type,
92
+ filePath: row.file_path ?? void 0,
93
+ updatedAt: row.updated_at
94
+ };
95
+ }
96
+ function cosineSimilarity(a, b) {
97
+ if (a.length !== b.length) return 0;
98
+ let dot = 0;
99
+ let normA = 0;
100
+ let normB = 0;
101
+ for (let i = 0; i < a.length; i++) {
102
+ dot += a[i] * b[i];
103
+ normA += a[i] * a[i];
104
+ normB += b[i] * b[i];
105
+ }
106
+ const denom = Math.sqrt(normA) * Math.sqrt(normB);
107
+ return denom === 0 ? 0 : dot / denom;
108
+ }
109
+ var SCHEMA_SQL, VectorStore;
110
+ var init_store = __esm({
111
+ "src/embeddings/store.ts"() {
112
+ "use strict";
113
+ SCHEMA_SQL = `
114
+ CREATE TABLE IF NOT EXISTS chunks (
115
+ id TEXT PRIMARY KEY,
116
+ entity_id TEXT NOT NULL,
117
+ content TEXT NOT NULL,
118
+ chunk_type TEXT NOT NULL,
119
+ file_path TEXT,
120
+ updated_at TEXT NOT NULL
121
+ );
122
+
123
+ CREATE TABLE IF NOT EXISTS vectors (
124
+ id TEXT PRIMARY KEY,
125
+ embedding BLOB NOT NULL,
126
+ FOREIGN KEY (id) REFERENCES chunks(id) ON DELETE CASCADE
127
+ );
128
+
129
+ CREATE INDEX IF NOT EXISTS idx_chunks_entity ON chunks(entity_id);
130
+ CREATE INDEX IF NOT EXISTS idx_chunks_type ON chunks(chunk_type);
131
+ CREATE INDEX IF NOT EXISTS idx_chunks_file ON chunks(file_path);
132
+ `;
133
+ VectorStore = class _VectorStore {
134
+ constructor(dbPath) {
135
+ this.dbPath = dbPath;
136
+ }
137
+ db;
138
+ stmts;
139
+ writes = 0;
140
+ /**
141
+ * Async factory — sql.js WASM init is async, but after bootstrap the store
142
+ * exposes a synchronous-style public API.
143
+ */
144
+ static async create(dbPath) {
145
+ const store = new _VectorStore(dbPath);
146
+ await store.bootstrap();
147
+ return store;
148
+ }
149
+ async bootstrap() {
150
+ let initSqlJs;
151
+ try {
152
+ const mod = await import("sql.js");
153
+ initSqlJs = mod.default ?? mod;
154
+ } catch {
155
+ throw new Error(
156
+ 'VectorStore requires the optional dependency "sql.js". Install it: npm install sql.js'
157
+ );
158
+ }
159
+ let sqljsDistDir = null;
160
+ if (typeof window === "undefined") {
161
+ try {
162
+ const moduleMod = await import("module");
163
+ const pathMod = await import("path");
164
+ const req = moduleMod.createRequire(import.meta.url);
165
+ const sqlJsEntry = req.resolve("sql.js");
166
+ sqljsDistDir = pathMod.dirname(sqlJsEntry);
167
+ } catch {
168
+ sqljsDistDir = null;
169
+ }
170
+ }
171
+ const SQL = await initSqlJs({
172
+ locateFile: (file) => {
173
+ if (typeof window !== "undefined") return `/sql-wasm/${file}`;
174
+ if (sqljsDistDir) return `${sqljsDistDir}/${file}`;
175
+ return file;
176
+ }
177
+ });
178
+ const existing = this.loadFromDisk();
179
+ this.db = existing ? new SQL.Database(existing) : new SQL.Database();
180
+ this.db.run("PRAGMA foreign_keys = ON;");
181
+ this.db.run(SCHEMA_SQL);
182
+ this.prepareStatements();
183
+ }
184
+ loadFromDisk() {
185
+ if (this.dbPath === ":memory:") return null;
186
+ try {
187
+ const fs = __require("fs");
188
+ if (!fs.existsSync(this.dbPath)) return null;
189
+ return new Uint8Array(fs.readFileSync(this.dbPath));
190
+ } catch {
191
+ return null;
192
+ }
193
+ }
194
+ flushToDisk() {
195
+ if (this.dbPath === ":memory:") return;
196
+ try {
197
+ const fs = __require("fs");
198
+ const path = __require("path");
199
+ const data = this.db.export();
200
+ fs.mkdirSync(path.dirname(this.dbPath), { recursive: true });
201
+ const tmp = `${this.dbPath}.tmp`;
202
+ fs.writeFileSync(tmp, Buffer.from(data));
203
+ fs.renameSync(tmp, this.dbPath);
204
+ } catch {
205
+ }
206
+ }
207
+ prepareStatements() {
208
+ this.stmts = {
209
+ upsertChunk: this.db.prepare(`
210
+ INSERT OR REPLACE INTO chunks (id, entity_id, content, chunk_type, file_path, updated_at)
211
+ VALUES ($id, $entityId, $content, $chunkType, $filePath, $updatedAt)
212
+ `),
213
+ upsertVector: this.db.prepare(`
214
+ INSERT OR REPLACE INTO vectors (id, embedding)
215
+ VALUES ($id, $embedding)
216
+ `),
217
+ deleteVector: this.db.prepare("DELETE FROM vectors WHERE id = $id"),
218
+ deleteChunk: this.db.prepare("DELETE FROM chunks WHERE id = $id"),
219
+ getChunkById: this.db.prepare("SELECT * FROM chunks WHERE id = $id"),
220
+ getChunkIdsByEntity: this.db.prepare(
221
+ "SELECT id FROM chunks WHERE entity_id = $entityId"
222
+ ),
223
+ getChunkIdsByFile: this.db.prepare(
224
+ "SELECT id FROM chunks WHERE file_path = $filePath"
225
+ ),
226
+ count: this.db.prepare("SELECT COUNT(*) AS cnt FROM chunks"),
227
+ countByType: this.db.prepare(
228
+ "SELECT chunk_type, COUNT(*) AS cnt FROM chunks GROUP BY chunk_type"
229
+ )
230
+ };
231
+ }
232
+ /**
233
+ * Insert or update a chunk with its embedding vector.
234
+ */
235
+ upsert(record) {
236
+ const embeddingBlob = new Uint8Array(record.embedding.buffer);
237
+ this.db.run("BEGIN");
238
+ try {
239
+ this.stmts.upsertChunk.run({
240
+ $id: record.id,
241
+ $entityId: record.entityId,
242
+ $content: record.content,
243
+ $chunkType: record.chunkType,
244
+ $filePath: record.filePath ?? null,
245
+ $updatedAt: record.updatedAt
246
+ });
247
+ this.stmts.upsertChunk.reset();
248
+ this.stmts.upsertVector.run({ $id: record.id, $embedding: embeddingBlob });
249
+ this.stmts.upsertVector.reset();
250
+ this.db.run("COMMIT");
251
+ } catch (e) {
252
+ this.db.run("ROLLBACK");
253
+ throw e;
254
+ }
255
+ this.tickFlush();
256
+ }
257
+ /**
258
+ * Batch upsert multiple records.
259
+ */
260
+ upsertBatch(records) {
261
+ if (records.length === 0) return;
262
+ this.db.run("BEGIN");
263
+ try {
264
+ for (const record of records) {
265
+ const embeddingBlob = new Uint8Array(record.embedding.buffer);
266
+ this.stmts.upsertChunk.run({
267
+ $id: record.id,
268
+ $entityId: record.entityId,
269
+ $content: record.content,
270
+ $chunkType: record.chunkType,
271
+ $filePath: record.filePath ?? null,
272
+ $updatedAt: record.updatedAt
273
+ });
274
+ this.stmts.upsertChunk.reset();
275
+ this.stmts.upsertVector.run({ $id: record.id, $embedding: embeddingBlob });
276
+ this.stmts.upsertVector.reset();
277
+ }
278
+ this.db.run("COMMIT");
279
+ } catch (e) {
280
+ this.db.run("ROLLBACK");
281
+ throw e;
282
+ }
283
+ this.tickFlush();
284
+ }
285
+ /**
286
+ * Delete a chunk and its vector by ID.
287
+ */
288
+ delete(id) {
289
+ this.stmts.deleteVector.run({ $id: id });
290
+ this.stmts.deleteVector.reset();
291
+ this.stmts.deleteChunk.run({ $id: id });
292
+ this.stmts.deleteChunk.reset();
293
+ this.tickFlush();
294
+ }
295
+ /**
296
+ * Delete all chunks for an entity.
297
+ */
298
+ deleteByEntity(entityId) {
299
+ const ids = this.runAll(this.stmts.getChunkIdsByEntity, {
300
+ $entityId: entityId
301
+ }).map((r) => r.id);
302
+ if (ids.length === 0) return;
303
+ this.db.run("BEGIN");
304
+ try {
305
+ for (const id of ids) {
306
+ this.stmts.deleteVector.run({ $id: id });
307
+ this.stmts.deleteVector.reset();
308
+ this.stmts.deleteChunk.run({ $id: id });
309
+ this.stmts.deleteChunk.reset();
310
+ }
311
+ this.db.run("COMMIT");
312
+ } catch (e) {
313
+ this.db.run("ROLLBACK");
314
+ throw e;
315
+ }
316
+ this.tickFlush();
317
+ }
318
+ /**
319
+ * Delete all chunks associated with a file path.
320
+ */
321
+ deleteByFile(filePath) {
322
+ const ids = this.runAll(this.stmts.getChunkIdsByFile, {
323
+ $filePath: filePath
324
+ }).map((r) => r.id);
325
+ if (ids.length === 0) return;
326
+ this.db.run("BEGIN");
327
+ try {
328
+ for (const id of ids) {
329
+ this.stmts.deleteVector.run({ $id: id });
330
+ this.stmts.deleteVector.reset();
331
+ this.stmts.deleteChunk.run({ $id: id });
332
+ this.stmts.deleteChunk.reset();
333
+ }
334
+ this.db.run("COMMIT");
335
+ } catch (e) {
336
+ this.db.run("ROLLBACK");
337
+ throw e;
338
+ }
339
+ this.tickFlush();
340
+ }
341
+ /**
342
+ * Get a chunk by ID (without vector).
343
+ */
344
+ getChunk(id) {
345
+ const row = this.runOne(this.stmts.getChunkById, { $id: id });
346
+ return row ? rowToChunkMeta(row) : null;
347
+ }
348
+ /**
349
+ * Search for chunks similar to the query vector.
350
+ * Uses brute-force cosine similarity scan.
351
+ */
352
+ search(queryVector, opts = {}) {
353
+ const limit = opts.limit ?? 10;
354
+ const minScore = opts.minScore ?? 0;
355
+ const conditions = [];
356
+ const params = {};
357
+ if (opts.types && opts.types.length > 0) {
358
+ const placeholders = opts.types.map((_, i) => `$type${i}`).join(", ");
359
+ conditions.push(`c.chunk_type IN (${placeholders})`);
360
+ opts.types.forEach((t, i) => {
361
+ params[`$type${i}`] = t;
362
+ });
363
+ }
364
+ if (opts.filePrefix) {
365
+ conditions.push("c.file_path LIKE $filePrefix");
366
+ params.$filePrefix = `${opts.filePrefix}%`;
367
+ }
368
+ const where = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
369
+ const sql = `
370
+ SELECT c.id, c.entity_id, c.content, c.chunk_type, c.file_path, c.updated_at,
371
+ v.embedding
372
+ FROM chunks c
373
+ JOIN vectors v ON c.id = v.id
374
+ ${where}
375
+ `;
376
+ const stmt = this.db.prepare(sql);
377
+ const rows = this.runAll(stmt, params);
378
+ stmt.free();
379
+ const scored = [];
380
+ for (const row of rows) {
381
+ const embeddingBytes = row.embedding;
382
+ const ownedBuf = embeddingBytes.buffer.slice(
383
+ embeddingBytes.byteOffset,
384
+ embeddingBytes.byteOffset + embeddingBytes.byteLength
385
+ );
386
+ const storedVec = new Float32Array(ownedBuf);
387
+ const score = cosineSimilarity(queryVector, storedVec);
388
+ if (score >= minScore) {
389
+ scored.push({ chunk: rowToChunkMeta(row), score });
390
+ }
391
+ }
392
+ scored.sort((a, b) => b.score - a.score);
393
+ return scored.slice(0, limit);
394
+ }
395
+ /**
396
+ * Get total count of chunks in the store.
397
+ */
398
+ count() {
399
+ const row = this.runOne(this.stmts.count);
400
+ return Number(row?.cnt ?? 0);
401
+ }
402
+ /**
403
+ * Get count by chunk type.
404
+ */
405
+ countByType() {
406
+ const rows = this.runAll(this.stmts.countByType);
407
+ const result = {};
408
+ for (const row of rows) {
409
+ result[row.chunk_type] = row.cnt;
410
+ }
411
+ return result;
412
+ }
413
+ /**
414
+ * Clear all data from the store.
415
+ */
416
+ clear() {
417
+ this.db.run("DELETE FROM vectors");
418
+ this.db.run("DELETE FROM chunks");
419
+ this.tickFlush();
420
+ }
421
+ /**
422
+ * Force a write of the in-memory DB image to disk.
423
+ */
424
+ flush() {
425
+ this.flushToDisk();
426
+ }
427
+ /**
428
+ * Close the database connection.
429
+ */
430
+ close() {
431
+ try {
432
+ this.flushToDisk();
433
+ } finally {
434
+ for (const s of Object.values(this.stmts ?? {})) s?.free?.();
435
+ this.db?.close?.();
436
+ }
437
+ }
438
+ // ---------------------------------------------------------------------------
439
+ // Helpers
440
+ // ---------------------------------------------------------------------------
441
+ runAll(stmt, params = {}) {
442
+ stmt.bind(params);
443
+ const rows = [];
444
+ while (stmt.step()) rows.push(stmt.getAsObject());
445
+ stmt.reset();
446
+ return rows;
447
+ }
448
+ runOne(stmt, params = {}) {
449
+ stmt.bind(params);
450
+ const has = stmt.step();
451
+ const row = has ? stmt.getAsObject() : void 0;
452
+ stmt.reset();
453
+ return row;
454
+ }
455
+ tickFlush() {
456
+ if (++this.writes % 50 === 0) this.flushToDisk();
457
+ }
458
+ };
459
+ }
460
+ });
461
+
462
+ // src/embeddings/chunker.ts
463
+ function chunkIssue(issue) {
464
+ const now = (/* @__PURE__ */ new Date()).toISOString();
465
+ const chunks = [];
466
+ if (issue.title) {
467
+ chunks.push({
468
+ id: `issue:${issue.id}:title`,
469
+ entityId: `issue:${issue.id}`,
470
+ content: issue.title,
471
+ chunkType: "issue_title",
472
+ updatedAt: now
473
+ });
474
+ }
475
+ if (issue.description) {
476
+ chunks.push({
477
+ id: `issue:${issue.id}:desc`,
478
+ entityId: `issue:${issue.id}`,
479
+ content: issue.description,
480
+ chunkType: "issue_desc",
481
+ updatedAt: now
482
+ });
483
+ }
484
+ return chunks;
485
+ }
486
+ function chunkDecision(decision) {
487
+ const parts = [];
488
+ parts.push(`Decision ${decision.id}: ${decision.toolName}`);
489
+ if (decision.rationale) parts.push(`Rationale: ${decision.rationale}`);
490
+ if (decision.context) parts.push(`Context: ${decision.context}`);
491
+ if (decision.outputSummary) parts.push(`Output: ${decision.outputSummary}`);
492
+ const content = parts.join("\n");
493
+ if (!content.trim()) return [];
494
+ return [
495
+ {
496
+ id: `decision:${decision.id}:rationale`,
497
+ entityId: `decision:${decision.id}`,
498
+ content,
499
+ chunkType: "decision_rationale",
500
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
501
+ }
502
+ ];
503
+ }
504
+ function chunkMilestone(milestone) {
505
+ if (!milestone.message) return [];
506
+ return [
507
+ {
508
+ id: `milestone:${milestone.id}:msg`,
509
+ entityId: `milestone:${milestone.id}`,
510
+ content: milestone.message,
511
+ chunkType: "milestone_msg",
512
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
513
+ }
514
+ ];
515
+ }
516
+ function chunkMarkdown(filePath, content) {
517
+ if (!content.trim()) return [];
518
+ const entityId = `file:${filePath}`;
519
+ const now = (/* @__PURE__ */ new Date()).toISOString();
520
+ const sections = splitByHeadings(content);
521
+ const chunks = [];
522
+ for (let i = 0; i < sections.length; i++) {
523
+ const section = sections[i];
524
+ if (!section.text.trim()) continue;
525
+ if (section.text.length <= MAX_CHUNK_CHARS) {
526
+ chunks.push({
527
+ id: `${entityId}:section:${i}`,
528
+ entityId,
529
+ content: section.text,
530
+ chunkType: "markdown",
531
+ filePath,
532
+ updatedAt: now
533
+ });
534
+ } else {
535
+ const windows = slidingWindow(section.text);
536
+ for (let w = 0; w < windows.length; w++) {
537
+ chunks.push({
538
+ id: `${entityId}:section:${i}:w${w}`,
539
+ entityId,
540
+ content: windows[w],
541
+ chunkType: "markdown",
542
+ filePath,
543
+ updatedAt: now
544
+ });
545
+ }
546
+ }
547
+ }
548
+ return chunks;
549
+ }
550
+ function chunkCodeEntities(filePath, declarations) {
551
+ const now = (/* @__PURE__ */ new Date()).toISOString();
552
+ const chunks = [];
553
+ for (const decl of declarations) {
554
+ const parts = [];
555
+ if (decl.docComment) parts.push(decl.docComment);
556
+ parts.push(`${decl.kind} ${decl.name}`);
557
+ parts.push(decl.signature);
558
+ const content = parts.join("\n").slice(0, MAX_CHUNK_CHARS);
559
+ chunks.push({
560
+ id: `symbol:${filePath}#${decl.name}`,
561
+ entityId: `symbol:${filePath}#${decl.name}`,
562
+ content,
563
+ chunkType: "code_entity",
564
+ filePath,
565
+ updatedAt: now
566
+ });
567
+ }
568
+ return chunks;
569
+ }
570
+ function chunkDocComments(filePath, comments) {
571
+ if (comments.length === 0) return [];
572
+ const entityId = `file:${filePath}`;
573
+ const now = (/* @__PURE__ */ new Date()).toISOString();
574
+ const chunks = [];
575
+ for (let i = 0; i < comments.length; i++) {
576
+ const comment = comments[i];
577
+ if (!comment.text.trim()) continue;
578
+ chunks.push({
579
+ id: `${entityId}:doc:${i}`,
580
+ entityId,
581
+ content: comment.text.slice(0, MAX_CHUNK_CHARS),
582
+ chunkType: "doc_comment",
583
+ filePath,
584
+ updatedAt: now
585
+ });
586
+ }
587
+ return chunks;
588
+ }
589
+ function chunkSummary(filePath, content) {
590
+ if (!content.trim()) return [];
591
+ const entityId = `file:${filePath}`;
592
+ const now = (/* @__PURE__ */ new Date()).toISOString();
593
+ if (content.length <= MAX_CHUNK_CHARS) {
594
+ return [
595
+ {
596
+ id: `${entityId}:summary`,
597
+ entityId,
598
+ content,
599
+ chunkType: "summary_md",
600
+ filePath,
601
+ updatedAt: now
602
+ }
603
+ ];
604
+ }
605
+ return chunkMarkdown(filePath, content).map((c) => ({
606
+ ...c,
607
+ chunkType: "summary_md"
608
+ }));
609
+ }
610
+ function chunkFile(filePath, content) {
611
+ if (!content.trim()) return [];
612
+ const ext = filePath.split(".").pop()?.toLowerCase() ?? "";
613
+ if (filePath.endsWith("summary.md")) {
614
+ return chunkSummary(filePath, content);
615
+ }
616
+ if (ext === "md") {
617
+ return chunkMarkdown(filePath, content);
618
+ }
619
+ return [];
620
+ }
621
+ function splitByHeadings(content) {
622
+ const lines = content.split("\n");
623
+ const sections = [];
624
+ let currentSection = { text: "" };
625
+ for (const line of lines) {
626
+ if (/^#{1,3}\s/.test(line)) {
627
+ if (currentSection.text.trim()) {
628
+ sections.push(currentSection);
629
+ }
630
+ currentSection = { heading: line, text: line + "\n" };
631
+ } else {
632
+ currentSection.text += line + "\n";
633
+ }
634
+ }
635
+ if (currentSection.text.trim()) {
636
+ sections.push(currentSection);
637
+ }
638
+ return sections;
639
+ }
640
+ function slidingWindow(text) {
641
+ const windows = [];
642
+ let start = 0;
643
+ while (start < text.length) {
644
+ const end = Math.min(start + MAX_CHUNK_CHARS, text.length);
645
+ windows.push(text.slice(start, end));
646
+ if (end >= text.length) break;
647
+ start += MAX_CHUNK_CHARS - OVERLAP_CHARS;
648
+ }
649
+ return windows;
650
+ }
651
+ var MAX_CHUNK_CHARS, OVERLAP_CHARS;
652
+ var init_chunker = __esm({
653
+ "src/embeddings/chunker.ts"() {
654
+ "use strict";
655
+ MAX_CHUNK_CHARS = 512;
656
+ OVERLAP_CHARS = 64;
657
+ }
658
+ });
659
+
660
+ // src/embeddings/search.ts
661
+ import { join } from "path";
662
+ import { readFileSync, existsSync } from "fs";
663
+ var EmbeddingManager;
664
+ var init_search = __esm({
665
+ "src/embeddings/search.ts"() {
666
+ "use strict";
667
+ init_store();
668
+ init_model();
669
+ init_chunker();
670
+ EmbeddingManager = class _EmbeddingManager {
671
+ store;
672
+ embedFn;
673
+ constructor(store, embedFn) {
674
+ this.store = store;
675
+ this.embedFn = embedFn;
676
+ }
677
+ static async create(dbPath, embedFn) {
678
+ const store = await VectorStore.create(dbPath);
679
+ return new _EmbeddingManager(store, embedFn ?? embed);
680
+ }
681
+ /**
682
+ * Full reindex: clear store, re-chunk all entities, embed, and insert.
683
+ */
684
+ async reindex(engine) {
685
+ this.store.clear();
686
+ const allChunks = [];
687
+ const issues = engine.listIssues();
688
+ for (const issue of issues) {
689
+ allChunks.push(...chunkIssue(issue));
690
+ }
691
+ const milestones = engine.listMilestones();
692
+ for (const ms of milestones) {
693
+ allChunks.push(...chunkMilestone(ms));
694
+ }
695
+ if (engine.queryDecisions) {
696
+ const decisions = engine.queryDecisions();
697
+ for (const dec of decisions) {
698
+ allChunks.push(...chunkDecision(dec));
699
+ }
700
+ }
701
+ const rootPath = engine.getRootPath();
702
+ const trackedFiles = engine.trackedFiles();
703
+ for (const tf of trackedFiles) {
704
+ try {
705
+ const absPath = join(rootPath, tf.path);
706
+ if (!existsSync(absPath)) continue;
707
+ const content = readFileSync(absPath, "utf-8");
708
+ allChunks.push(...chunkFile(tf.path, content));
709
+ } catch {
710
+ }
711
+ }
712
+ if (engine.parseFile) {
713
+ for (const tf of trackedFiles) {
714
+ const ext = tf.path.split(".").pop()?.toLowerCase() ?? "";
715
+ if (![
716
+ "ts",
717
+ "js",
718
+ "tsx",
719
+ "jsx",
720
+ "py",
721
+ "go",
722
+ "rs",
723
+ "rb",
724
+ "java",
725
+ "cs"
726
+ ].includes(ext)) {
727
+ continue;
728
+ }
729
+ try {
730
+ const parsed = engine.parseFile(tf.path);
731
+ if (parsed && Array.isArray(parsed.entities)) {
732
+ const declarations = parsed.entities.map((e) => ({
733
+ id: e.id ?? e.name,
734
+ name: e.name,
735
+ kind: e.kind,
736
+ signature: e.signature ?? e.rawText?.split("\n")[0] ?? "",
737
+ docComment: e.docComment
738
+ }));
739
+ allChunks.push(...chunkCodeEntities(tf.path, declarations));
740
+ }
741
+ } catch {
742
+ }
743
+ }
744
+ }
745
+ const records = [];
746
+ for (const chunk of allChunks) {
747
+ try {
748
+ const vector = await this.embedFn(chunk.content);
749
+ records.push({ ...chunk, embedding: vector });
750
+ } catch {
751
+ }
752
+ }
753
+ this.store.upsertBatch(records);
754
+ return { chunks: records.length };
755
+ }
756
+ /**
757
+ * Incrementally index a single file (on file change).
758
+ */
759
+ async indexFile(filePath, content, engine) {
760
+ this.store.deleteByFile(filePath);
761
+ const chunks = chunkFile(filePath, content);
762
+ if (engine?.parseFile) {
763
+ const ext = filePath.split(".").pop()?.toLowerCase() ?? "";
764
+ if ([
765
+ "ts",
766
+ "js",
767
+ "tsx",
768
+ "jsx",
769
+ "py",
770
+ "go",
771
+ "rs",
772
+ "rb",
773
+ "java",
774
+ "cs"
775
+ ].includes(ext)) {
776
+ try {
777
+ const parsed = engine.parseFile(filePath);
778
+ if (parsed && Array.isArray(parsed.entities)) {
779
+ const declarations = parsed.entities.map((e) => ({
780
+ id: e.id ?? e.name,
781
+ name: e.name,
782
+ kind: e.kind,
783
+ signature: e.signature ?? e.rawText?.split("\n")[0] ?? "",
784
+ docComment: e.docComment
785
+ }));
786
+ chunks.push(...chunkCodeEntities(filePath, declarations));
787
+ }
788
+ } catch {
789
+ }
790
+ }
791
+ }
792
+ const records = [];
793
+ for (const chunk of chunks) {
794
+ try {
795
+ const vector = await this.embedFn(chunk.content);
796
+ records.push({ ...chunk, embedding: vector });
797
+ } catch {
798
+ }
799
+ }
800
+ if (records.length > 0) {
801
+ this.store.upsertBatch(records);
802
+ }
803
+ return records.length;
804
+ }
805
+ /**
806
+ * Index an issue (on create/update).
807
+ */
808
+ async indexIssue(issue) {
809
+ this.store.deleteByEntity(`issue:${issue.id}`);
810
+ const chunks = chunkIssue(issue);
811
+ const records = [];
812
+ for (const chunk of chunks) {
813
+ try {
814
+ const vector = await this.embedFn(chunk.content);
815
+ records.push({ ...chunk, embedding: vector });
816
+ } catch {
817
+ }
818
+ }
819
+ if (records.length > 0) {
820
+ this.store.upsertBatch(records);
821
+ }
822
+ return records.length;
823
+ }
824
+ /**
825
+ * Index a milestone (on create).
826
+ */
827
+ async indexMilestone(milestone) {
828
+ this.store.deleteByEntity(`milestone:${milestone.id}`);
829
+ const chunks = chunkMilestone(milestone);
830
+ const records = [];
831
+ for (const chunk of chunks) {
832
+ try {
833
+ const vector = await this.embedFn(chunk.content);
834
+ records.push({ ...chunk, embedding: vector });
835
+ } catch {
836
+ }
837
+ }
838
+ if (records.length > 0) {
839
+ this.store.upsertBatch(records);
840
+ }
841
+ return records.length;
842
+ }
843
+ /**
844
+ * Semantic search: embed query → vector search → ranked results.
845
+ */
846
+ async search(query, opts) {
847
+ const queryVector = await this.embedFn(query);
848
+ return this.store.search(queryVector, opts);
849
+ }
850
+ /**
851
+ * Remove all data for a file.
852
+ */
853
+ removeFile(filePath) {
854
+ this.store.deleteByFile(filePath);
855
+ }
856
+ /**
857
+ * Get store statistics.
858
+ */
859
+ stats() {
860
+ return {
861
+ total: this.store.count(),
862
+ byType: this.store.countByType()
863
+ };
864
+ }
865
+ /**
866
+ * Close the store.
867
+ */
868
+ close() {
869
+ this.store.close();
870
+ }
871
+ };
872
+ }
873
+ });
874
+
875
+ // src/embeddings/auto-embed.ts
876
+ function entitySummaryText(entityId, facts, links) {
877
+ const type = facts.find((f) => f.a === "type")?.v ?? "Entity";
878
+ const name = facts.find((f) => f.a === "name" || f.a === "title")?.v ?? entityId;
879
+ const parts = [`${type}: ${name} (${entityId})`];
880
+ const attrs = facts.filter((f) => !["type", "name", "title", "createdAt", "updatedAt"].includes(f.a));
881
+ if (attrs.length > 0) {
882
+ parts.push(attrs.map((f) => ` ${f.a} = ${f.v}`).join("\n"));
883
+ }
884
+ if (links.length > 0) {
885
+ parts.push("Relations:");
886
+ parts.push(links.map((l) => ` ${l.a} \u2192 ${l.e2}`).join("\n"));
887
+ }
888
+ return parts.join("\n");
889
+ }
890
+ async function createAutoEmbedMiddleware(options) {
891
+ const store = await VectorStore.create(options.dbPath);
892
+ const embedFn = options.embedFn ?? embed;
893
+ const embedIndividual = options.embedIndividualFacts ?? false;
894
+ return {
895
+ name: "auto-embed",
896
+ handleOp: async (op, ctx, next) => {
897
+ await next(op, ctx);
898
+ try {
899
+ await _processOp(op, store, embedFn, embedIndividual);
900
+ } catch {
901
+ }
902
+ },
903
+ close: () => {
904
+ store.close();
905
+ }
906
+ };
907
+ }
908
+ async function _processOp(op, store, embedFn, embedIndividual) {
909
+ const now = (/* @__PURE__ */ new Date()).toISOString();
910
+ const entityIds = /* @__PURE__ */ new Set();
911
+ if (op.facts) for (const f of op.facts) entityIds.add(f.e);
912
+ if (op.links) for (const l of op.links) {
913
+ entityIds.add(l.e1);
914
+ entityIds.add(l.e2);
915
+ }
916
+ if (op.deleteFacts) for (const f of op.deleteFacts) entityIds.add(f.e);
917
+ if (op.deleteLinks) for (const l of op.deleteLinks) {
918
+ entityIds.add(l.e1);
919
+ entityIds.add(l.e2);
920
+ }
921
+ if (op.deleteFacts || op.deleteLinks) {
922
+ for (const eid of entityIds) {
923
+ store.deleteByEntity(eid);
924
+ }
925
+ }
926
+ if (op.facts && op.facts.length > 0) {
927
+ const factsByEntity = /* @__PURE__ */ new Map();
928
+ for (const f of op.facts) {
929
+ const existing = factsByEntity.get(f.e) ?? [];
930
+ existing.push(f);
931
+ factsByEntity.set(f.e, existing);
932
+ }
933
+ const linksByEntity = /* @__PURE__ */ new Map();
934
+ if (op.links) {
935
+ for (const l of op.links) {
936
+ const existing = linksByEntity.get(l.e1) ?? [];
937
+ existing.push(l);
938
+ linksByEntity.set(l.e1, existing);
939
+ }
940
+ }
941
+ const records = [];
942
+ for (const [eid, facts] of factsByEntity) {
943
+ const links = linksByEntity.get(eid) ?? [];
944
+ const summaryText = entitySummaryText(eid, facts, links);
945
+ if (summaryText.trim()) {
946
+ try {
947
+ const vector = await embedFn(summaryText);
948
+ records.push({
949
+ id: `entity:${eid}:summary`,
950
+ entityId: eid,
951
+ content: summaryText,
952
+ chunkType: "summary_md",
953
+ updatedAt: now,
954
+ embedding: vector
955
+ });
956
+ } catch {
957
+ }
958
+ }
959
+ if (embedIndividual) {
960
+ for (const fact of facts) {
961
+ if (["type", "createdAt", "updatedAt"].includes(fact.a)) continue;
962
+ const text = `${fact.a}: ${fact.v}`;
963
+ try {
964
+ const vector = await embedFn(text);
965
+ records.push({
966
+ id: `entity:${eid}:fact:${fact.a}`,
967
+ entityId: eid,
968
+ content: text,
969
+ chunkType: "doc_comment",
970
+ updatedAt: now,
971
+ embedding: vector
972
+ });
973
+ } catch {
974
+ }
975
+ }
976
+ }
977
+ }
978
+ if (records.length > 0) {
979
+ store.upsertBatch(records);
980
+ }
981
+ }
982
+ }
983
+ async function buildRAGContext(query, vectorStore, embedFn = embed, options) {
984
+ const maxChunks = options?.maxChunks ?? 10;
985
+ const maxTokens = options?.maxTokens ?? 4e3;
986
+ const minScore = options?.minScore ?? 0.1;
987
+ const queryVector = await embedFn(query);
988
+ const results = vectorStore.search(queryVector, {
989
+ limit: maxChunks * 2,
990
+ minScore
991
+ });
992
+ const chunks = [];
993
+ let totalChars = 0;
994
+ for (const r of results) {
995
+ if (chunks.length >= maxChunks) break;
996
+ if (totalChars + r.chunk.content.length > maxTokens * 4) break;
997
+ chunks.push({
998
+ content: r.chunk.content,
999
+ entityId: r.chunk.entityId,
1000
+ score: r.score,
1001
+ chunkType: r.chunk.chunkType
1002
+ });
1003
+ totalChars += r.chunk.content.length;
1004
+ }
1005
+ return {
1006
+ query,
1007
+ chunks,
1008
+ estimatedTokens: Math.ceil(totalChars / 4)
1009
+ };
1010
+ }
1011
+ var init_auto_embed = __esm({
1012
+ "src/embeddings/auto-embed.ts"() {
1013
+ "use strict";
1014
+ init_store();
1015
+ init_model();
1016
+ }
1017
+ });
1018
+
1019
+ // src/embeddings/index.ts
1020
+ var embeddings_exports = {};
1021
+ __export(embeddings_exports, {
1022
+ DEFAULT_MODEL_CONFIG: () => DEFAULT_MODEL_CONFIG,
1023
+ EmbeddingManager: () => EmbeddingManager,
1024
+ VectorStore: () => VectorStore,
1025
+ buildRAGContext: () => buildRAGContext,
1026
+ chunkCodeEntities: () => chunkCodeEntities,
1027
+ chunkDecision: () => chunkDecision,
1028
+ chunkDocComments: () => chunkDocComments,
1029
+ chunkFile: () => chunkFile,
1030
+ chunkIssue: () => chunkIssue,
1031
+ chunkMarkdown: () => chunkMarkdown,
1032
+ chunkMilestone: () => chunkMilestone,
1033
+ chunkSummary: () => chunkSummary,
1034
+ cosineSimilarity: () => cosineSimilarity,
1035
+ createAutoEmbedMiddleware: () => createAutoEmbedMiddleware,
1036
+ embed: () => embed,
1037
+ embedBatch: () => embedBatch,
1038
+ loadModel: () => loadModel,
1039
+ resetModel: () => resetModel,
1040
+ slidingWindow: () => slidingWindow
1041
+ });
1042
+ var init_embeddings = __esm({
1043
+ "src/embeddings/index.ts"() {
1044
+ init_types();
1045
+ init_model();
1046
+ init_store();
1047
+ init_search();
1048
+ init_auto_embed();
1049
+ init_chunker();
1050
+ }
1051
+ });
1052
+
1053
+ export {
1054
+ DEFAULT_MODEL_CONFIG,
1055
+ loadModel,
1056
+ embed,
1057
+ embedBatch,
1058
+ resetModel,
1059
+ init_model,
1060
+ VectorStore,
1061
+ cosineSimilarity,
1062
+ init_store,
1063
+ chunkIssue,
1064
+ chunkDecision,
1065
+ chunkMilestone,
1066
+ chunkMarkdown,
1067
+ chunkCodeEntities,
1068
+ chunkDocComments,
1069
+ chunkSummary,
1070
+ chunkFile,
1071
+ slidingWindow,
1072
+ EmbeddingManager,
1073
+ createAutoEmbedMiddleware,
1074
+ buildRAGContext,
1075
+ init_auto_embed,
1076
+ embeddings_exports,
1077
+ init_embeddings
1078
+ };