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.
- package/CHANGELOG.md +16 -5
- package/README.md +19 -2
- package/bin/trellis.mjs +2 -75
- package/dist/better-sqlite-backend-2P4F6AOJ.js +209 -0
- package/dist/{better-sqlite-backend-ahx5p0br.js → better-sqlite-backend-PII64VE6.js} +37 -25
- package/dist/better-sqlite-backend-VUBVQ7SN.js +209 -0
- package/dist/better-sqlite-backend-Y3AQN65E.js +159 -0
- package/dist/better-sqlite-backend-Y3M7DXOX.js +159 -0
- package/dist/boot-middleware-FJDGVUM4.js +9 -0
- package/dist/boot-middleware-MHLHFCUC.js +9 -0
- package/dist/boot-middleware-MLJUTLUM.js +9 -0
- package/dist/boot-middleware-ZZPDZNYR.js +9 -0
- package/dist/{index-wncptktd.js → chunk-276LKLZR.js} +126 -59
- package/dist/chunk-2BRTCEHB.js +143 -0
- package/dist/chunk-2CX5UCRV.js +111 -0
- package/dist/chunk-2ESYSVXG.js +48 -0
- package/dist/{index-yp88he8n.js → chunk-2I5JU73Y.js} +88 -64
- package/dist/{index-w5wccer3.js → chunk-2UNSRRNB.js} +10 -5
- package/dist/{index-4wxa8xz4.js → chunk-335UEHQR.js} +158 -22
- package/dist/chunk-36VSSTL7.js +357 -0
- package/dist/chunk-3ETIIPPB.js +1077 -0
- package/dist/chunk-3GDRZTAW.js +45 -0
- package/dist/chunk-44FFQKQX.js +142 -0
- package/dist/chunk-4CF2L46N.js +29 -0
- package/dist/chunk-4HYPLFJD.js +150 -0
- package/dist/chunk-4XIVMVHC.js +361 -0
- package/dist/chunk-5CINODKT.js +41 -0
- package/dist/chunk-5ESGWJ5L.js +45 -0
- package/dist/chunk-5FGLQGMF.js +1676 -0
- package/dist/chunk-5IQZFITY.js +357 -0
- package/dist/{index-wt8rz4gn.js → chunk-5JWFAQDW.js} +41 -23
- package/dist/{index-7pjz3tsy.js → chunk-62UHTVU3.js} +50 -16
- package/dist/{index-h32txmxe.js → chunk-66UJQT2I.js} +6 -13
- package/dist/chunk-6CTA6MCE.js +340 -0
- package/dist/{index-4cdr7x2x.js → chunk-6RNNVOAS.js} +178 -109
- package/dist/chunk-6X23PZ6H.js +969 -0
- package/dist/chunk-7C7LL6MB.js +315 -0
- package/dist/chunk-7F4HM3JG.js +394 -0
- package/dist/chunk-7KJ7T4D3.js +910 -0
- package/dist/chunk-7QQQNUB5.js +92 -0
- package/dist/{index-53f3b8p8.js → chunk-7QWJBS72.js} +210 -165
- package/dist/chunk-7R36OZK3.js +957 -0
- package/dist/chunk-7UPKCOHE.js +946 -0
- package/dist/chunk-7WQGTFVJ.js +7434 -0
- package/dist/chunk-A3BONW34.js +35 -0
- package/dist/chunk-AHMDVHBL.js +141 -0
- package/dist/chunk-AW6A4OZY.js +171 -0
- package/dist/chunk-B3ZIFA2O.js +2240 -0
- package/dist/chunk-BJ5EKCJ5.js +458 -0
- package/dist/chunk-BJ7EZ7FP.js +145 -0
- package/dist/chunk-BQBUVMRN.js +171 -0
- package/dist/chunk-BRGYDO7D.js +223 -0
- package/dist/chunk-BXSTJVE3.js +67 -0
- package/dist/chunk-C5KPSEDN.js +359 -0
- package/dist/chunk-CCTNYTUC.js +940 -0
- package/dist/chunk-CYQ2OVD2.js +35 -0
- package/dist/chunk-DDAK7YOE.js +299 -0
- package/dist/chunk-DRILKBY6.js +965 -0
- package/dist/chunk-DXE24HNN.js +45 -0
- package/dist/chunk-E7ICUNW7.js +945 -0
- package/dist/chunk-EAL2PUOE.js +10022 -0
- package/dist/chunk-ELT7MLZB.js +109 -0
- package/dist/chunk-EO3J7GRP.js +0 -0
- package/dist/chunk-EWEIRF6G.js +171 -0
- package/dist/chunk-F5VDGQJC.js +120 -0
- package/dist/chunk-FCPL3IEQ.js +98 -0
- package/dist/{index-nq520y6k.js → chunk-FDPKYSV7.js} +43 -31
- package/dist/chunk-FES3TC24.js +171 -0
- package/dist/chunk-FF36CQHZ.js +61 -0
- package/dist/chunk-FKQO5A3H.js +35 -0
- package/dist/chunk-FOWKR5TW.js +129 -0
- package/dist/chunk-FZVCXDYW.js +150 -0
- package/dist/chunk-G3XIHPSQ.js +361 -0
- package/dist/chunk-GD5QJXSS.js +98 -0
- package/dist/chunk-GFZCJ4EH.js +108 -0
- package/dist/chunk-GKJLYLVU.js +359 -0
- package/dist/chunk-GLM4HGN4.js +55 -0
- package/dist/chunk-GNXHXNVQ.js +113 -0
- package/dist/chunk-GSR6ILTM.js +277 -0
- package/dist/chunk-GWRIMRSX.js +45 -0
- package/dist/chunk-H72UW2HJ.js +45 -0
- package/dist/chunk-HGI74PXB.js +7417 -0
- package/dist/chunk-HGRA37LO.js +145 -0
- package/dist/chunk-HO4TURXW.js +1078 -0
- package/dist/chunk-HXSRQO3L.js +145 -0
- package/dist/chunk-IG2X2BVO.js +373 -0
- package/dist/chunk-IIJVDD54.js +373 -0
- package/dist/chunk-IUWVEEOX.js +145 -0
- package/dist/chunk-IX4BBOIT.js +394 -0
- package/dist/{index-yhwjgfvj.js → chunk-IXU4RMQM.js} +67 -60
- package/dist/chunk-J3WYZO3Q.js +211 -0
- package/dist/{index-vkpkfwhq.js → chunk-J6OUIION.js} +234 -194
- package/dist/{index-xzym9w0m.js → chunk-JA7AIHRK.js} +12 -7
- package/dist/chunk-JUEMDWLU.js +233 -0
- package/dist/chunk-K46RNFDE.js +171 -0
- package/dist/chunk-KAGU2XMY.js +359 -0
- package/dist/chunk-KCVYJNVX.js +394 -0
- package/dist/chunk-KFQGP6VL.js +33 -0
- package/dist/chunk-KKDRMIV6.js +419 -0
- package/dist/chunk-KQ4A2D2P.js +910 -0
- package/dist/chunk-KSU2GW22.js +958 -0
- package/dist/chunk-KYLIQ3YI.js +399 -0
- package/dist/chunk-KZYJJIRN.js +946 -0
- package/dist/chunk-LFOX744K.js +96 -0
- package/dist/{index-rv1p47gp.js → chunk-LHOVJEWR.js} +2756 -2307
- package/dist/{index-h9e2efx4.js → chunk-LNUIGRDZ.js} +71 -55
- package/dist/chunk-LOPXTPF3.js +120 -0
- package/dist/chunk-LZR3VIFU.js +907 -0
- package/dist/chunk-MBNBTJCR.js +394 -0
- package/dist/chunk-MCKGQKYU.js +15 -0
- package/dist/{index-skhn0agf.js → chunk-MLC5BUYO.js} +19 -20
- package/dist/chunk-MPXUVGT3.js +104 -0
- package/dist/chunk-MU6EOS6F.js +0 -0
- package/dist/chunk-MWRQ2TXT.js +357 -0
- package/dist/{index-nzb3am4f.js → chunk-NO73OK2I.js} +43 -21
- package/dist/chunk-NPE2YJHK.js +394 -0
- package/dist/{index-xhcp6xrn.js → chunk-NSDXU6QX.js} +654 -500
- package/dist/chunk-NXIRDSZ6.js +145 -0
- package/dist/chunk-NZWFNHCS.js +407 -0
- package/dist/chunk-O2AV5WMN.js +48 -0
- package/dist/{index-h7zxhhhh.js → chunk-OB4CMMX6.js} +46 -38
- package/dist/chunk-OBKU74FU.js +7411 -0
- package/dist/chunk-OQNDWRDE.js +145 -0
- package/dist/chunk-OVWAJMB6.js +394 -0
- package/dist/chunk-PDHLBTTD.js +45 -0
- package/dist/chunk-PEQNRKLG.js +210 -0
- package/dist/chunk-QERIS7QY.js +7403 -0
- package/dist/chunk-QHA2DM3C.js +373 -0
- package/dist/chunk-QLM4HSYC.js +45 -0
- package/dist/chunk-RSWUFTO2.js +857 -0
- package/dist/chunk-S2OT3TQJ.js +283 -0
- package/dist/chunk-S5PHSN5K.js +907 -0
- package/dist/chunk-SIAA4J6H.js +21 -0
- package/dist/chunk-SPSPV5BC.js +390 -0
- package/dist/chunk-SQBNLUIA.js +171 -0
- package/dist/chunk-STLN6A6B.js +355 -0
- package/dist/chunk-TCKXSOBP.js +123 -0
- package/dist/chunk-U7HV7GU2.js +17 -0
- package/dist/chunk-UBGUDMUV.js +59 -0
- package/dist/chunk-UGZHOGRA.js +39 -0
- package/dist/chunk-UICF66FS.js +359 -0
- package/dist/chunk-UK3EQREE.js +1078 -0
- package/dist/chunk-UPKPURVY.js +394 -0
- package/dist/chunk-URC74VCN.js +959 -0
- package/dist/chunk-USEINYUL.js +12 -0
- package/dist/{index-bmyt7k8n.js → chunk-UZRUP7QW.js} +12 -4
- package/dist/chunk-V3G7Q3QQ.js +102 -0
- package/dist/chunk-VDAKEOML.js +857 -0
- package/dist/chunk-VUJ6SA55.js +303 -0
- package/dist/chunk-VUJQLIML.js +141 -0
- package/dist/chunk-VWKLKLYB.js +267 -0
- package/dist/chunk-VYC3RZMK.js +277 -0
- package/dist/chunk-WMERMSWI.js +154 -0
- package/dist/chunk-WMR777PO.js +2213 -0
- package/dist/{index-n9f2qyh5.js → chunk-X46IECAC.js} +55 -33
- package/dist/chunk-X5FLTRUB.js +517 -0
- package/dist/chunk-X762XWVC.js +419 -0
- package/dist/chunk-XEN3OEYY.js +2234 -0
- package/dist/chunk-XMQ7G77X.js +260 -0
- package/dist/chunk-XZQ66K7A.js +124 -0
- package/dist/{index-w7ng765c.js → chunk-YCM7ZYEZ.js} +102 -49
- package/dist/chunk-YY3GF7DH.js +7411 -0
- package/dist/chunk-ZE5R3H4C.js +907 -0
- package/dist/chunk-ZHVI7BQN.js +1077 -0
- package/dist/chunk-ZMN5LUB7.js +7411 -0
- package/dist/chunk-ZUV4MD5U.js +94 -0
- package/dist/cli/errors.d.ts +6 -0
- package/dist/cli/errors.d.ts.map +1 -0
- package/dist/cli/examples.d.ts +23 -0
- package/dist/cli/examples.d.ts.map +1 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +2338 -6190
- package/dist/client/index.d.ts +6 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +41 -21
- package/dist/client/live.d.ts +67 -0
- package/dist/client/live.d.ts.map +1 -0
- package/dist/client/reactive.d.ts +31 -0
- package/dist/client/reactive.d.ts.map +1 -0
- package/dist/client/sdk.d.ts +26 -2
- package/dist/client/sdk.d.ts.map +1 -1
- package/dist/client/sdk.js +9 -0
- package/dist/client/vcs-client.d.ts +129 -0
- package/dist/client/vcs-client.d.ts.map +1 -0
- package/dist/cms/index.js +171 -163
- package/dist/{config-8hczw0rs.js → config-KMY6RRK3.js} +8 -9
- package/dist/config-PFTP67TR.js +19 -0
- package/dist/config-VDMK2DUJ.js +19 -0
- package/dist/core/computation/index.d.ts +5 -0
- package/dist/core/computation/index.d.ts.map +1 -0
- package/dist/core/computation/rollup.d.ts +18 -0
- package/dist/core/computation/rollup.d.ts.map +1 -0
- package/dist/core/index.d.ts +5 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +168 -101
- package/dist/core/kernel/boot-middleware.d.ts +10 -0
- package/dist/core/kernel/boot-middleware.d.ts.map +1 -0
- package/dist/core/kernel/logic-middleware.d.ts +7 -1
- package/dist/core/kernel/logic-middleware.d.ts.map +1 -1
- package/dist/core/kernel/trellis-kernel.d.ts.map +1 -1
- package/dist/core/ontology/types.d.ts +5 -0
- package/dist/core/ontology/types.d.ts.map +1 -1
- package/dist/core/persist/better-sqlite-backend.d.ts +9 -2
- package/dist/core/persist/better-sqlite-backend.d.ts.map +1 -1
- package/dist/core/persist/factory.d.ts +6 -7
- package/dist/core/persist/factory.d.ts.map +1 -1
- package/dist/core/persist/factory.js +2 -3
- package/dist/core/persist/sqljs-backend.js +2 -3
- package/dist/db/index.d.ts +4 -1
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +69 -56
- package/dist/db/inspector.js +11 -19
- package/dist/decisions/index.js +9 -10
- package/dist/deploy-66EC752W.js +9 -0
- package/dist/deploy-SO7AFK6L.js +9 -0
- package/dist/embeddings/auto-embed.d.ts +2 -2
- package/dist/embeddings/auto-embed.d.ts.map +1 -1
- package/dist/embeddings/index.js +20 -22
- package/dist/embeddings/search.d.ts +2 -1
- package/dist/embeddings/search.d.ts.map +1 -1
- package/dist/embeddings/store.d.ts +25 -4
- package/dist/embeddings/store.d.ts.map +1 -1
- package/dist/engine-7GXBM4IT.js +7 -0
- package/dist/engine-NSR6BIF7.js +7 -0
- package/dist/engine.d.ts +32 -12
- package/dist/engine.d.ts.map +1 -1
- package/dist/factory-2P64OC7M.js +34 -0
- package/dist/factory-YP4ZZK5K.js +34 -0
- package/dist/import-AJLYHFIA.js +10 -0
- package/dist/import-UZEKXU3B.js +10 -0
- package/dist/index.js +102 -93
- package/dist/launch-explorer-AI6L2AWJ.js +91 -0
- package/dist/launch-explorer-HZ4ZJA4X.js +95 -0
- package/dist/links/index.js +24 -26
- package/dist/plugins/agent-memory/index.js +316 -0
- package/dist/plugins/idea-garden/index.js +165 -0
- package/dist/plugins/plan-approval/index.js +579 -0
- package/dist/plugins/proactive-watcher/index.js +194 -0
- package/dist/{index-2r4jxwnb.js → query-GJL3CVGN.js} +14 -15
- package/dist/query-MBJSK3EB.js +31 -0
- package/dist/query-TJHEVSKL.js +31 -0
- package/dist/query-WUIKOHPE.js +524 -0
- package/dist/query-XYLTJYSA.js +31 -0
- package/dist/react/index.js +39 -70
- package/dist/react/realtime.js +11 -0
- package/dist/react/schema-hooks.js +87 -0
- package/dist/realtime/broadcast-channel-transport.d.ts +43 -0
- package/dist/realtime/broadcast-channel-transport.d.ts.map +1 -0
- package/dist/realtime/durable-object-relay-transport.d.ts +96 -0
- package/dist/realtime/durable-object-relay-transport.d.ts.map +1 -0
- package/dist/realtime/index.d.ts +44 -0
- package/dist/realtime/index.d.ts.map +1 -0
- package/dist/realtime/index.js +40 -0
- package/dist/realtime/memory-hub.d.ts +32 -0
- package/dist/realtime/memory-hub.d.ts.map +1 -0
- package/dist/realtime/persistent-channel.d.ts +105 -0
- package/dist/realtime/persistent-channel.d.ts.map +1 -0
- package/dist/realtime/presence.d.ts +73 -0
- package/dist/realtime/presence.d.ts.map +1 -0
- package/dist/realtime/relay-persistence.d.ts +37 -0
- package/dist/realtime/relay-persistence.d.ts.map +1 -0
- package/dist/realtime/relay-persistence.js +107 -0
- package/dist/realtime/relay-server.d.ts +103 -0
- package/dist/realtime/relay-server.d.ts.map +1 -0
- package/dist/realtime/room.d.ts +98 -0
- package/dist/realtime/room.d.ts.map +1 -0
- package/dist/realtime/text.d.ts +73 -0
- package/dist/realtime/text.d.ts.map +1 -0
- package/dist/realtime/types.d.ts +89 -0
- package/dist/realtime/types.d.ts.map +1 -0
- package/dist/realtime/websocket-relay-transport.d.ts +28 -0
- package/dist/realtime/websocket-relay-transport.d.ts.map +1 -0
- package/dist/realtime.bundle.js +1100 -0
- package/dist/remote-manager-BLJZ6KF6.js +224 -0
- package/dist/{remote-manager-xvbg4230.js → remote-manager-BPYE46SI.js} +24 -15
- package/dist/remote-manager-FMESEAFA.js +224 -0
- package/dist/remote-manager-K2WZ5RHY.js +223 -0
- package/dist/remote-manager-SG545WNY.js +224 -0
- package/dist/remote-manager-SG5PQKCH.js +224 -0
- package/dist/remote-manager-WGP6MIQZ.js +224 -0
- package/dist/scaffold/write.d.ts.map +1 -1
- package/dist/schema/define.d.ts +137 -0
- package/dist/schema/define.d.ts.map +1 -0
- package/dist/schema/entity-projection.d.ts +34 -0
- package/dist/schema/entity-projection.d.ts.map +1 -0
- package/dist/schema/eql.d.ts +46 -0
- package/dist/schema/eql.d.ts.map +1 -0
- package/dist/schema/index.d.ts +21 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +45 -0
- package/dist/schema/kernel-resolve.d.ts +21 -0
- package/dist/schema/kernel-resolve.d.ts.map +1 -0
- package/dist/schema/mutations.d.ts +20 -0
- package/dist/schema/mutations.d.ts.map +1 -0
- package/dist/schema/resolve.d.ts +21 -0
- package/dist/schema/resolve.d.ts.map +1 -0
- package/dist/sdk-3KBB3E6V.js +16 -0
- package/dist/sdk-4ZQO6UTU.js +16 -0
- package/dist/sdk-6JA6GV3G.js +16 -0
- package/dist/sdk-6VTP5UTZ.js +16 -0
- package/dist/sdk-7VS6TYCD.js +16 -0
- package/dist/sdk-HQ3FTLRT.js +16 -0
- package/dist/sdk-HZ7NU3XE.js +15 -0
- package/dist/sdk-KBQE2OXT.js +16 -0
- package/dist/sdk-LZ7W3EEY.js +9 -0
- package/dist/sdk-MSCDZ7JU.js +15 -0
- package/dist/sdk-WNZOGO3S.js +15 -0
- package/dist/sdk-YLV33ZCW.js +9 -0
- package/dist/sdk-ZSUD2LLJ.js +16 -0
- package/dist/server/index.d.ts +2 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +69 -61
- package/dist/server/node-adapter.js +5 -104
- package/dist/server/realtime.d.ts +10 -2
- package/dist/server/realtime.d.ts.map +1 -1
- package/dist/server/server.d.ts +7 -16
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/sprites.d.ts.map +1 -1
- package/dist/server/tenancy.d.ts.map +1 -1
- package/dist/server-AFXFFBWA.js +11 -0
- package/dist/server-AGHC4VUL.js +11 -0
- package/dist/server-BOH7M4TT.js +13 -0
- package/dist/server-DBUY2KY5.js +11 -0
- package/dist/server-GWBQJPRG.js +11 -0
- package/dist/server-IGBIIJSF.js +13 -0
- package/dist/server-JZZFULVU.js +11 -0
- package/dist/server-L5XAF4M5.js +11 -0
- package/dist/server-NYFUHANA.js +12 -0
- package/dist/server-OABUB2LO.js +12 -0
- package/dist/server-P2CKZWWV.js +12 -0
- package/dist/{sprites-vc4qbrp1.js → sprites-RU3E4XQN.js} +6 -7
- package/dist/sprites-XVSMQLSI.js +15 -0
- package/dist/sql-wasm-FORCZFHZ.js +2148 -0
- package/dist/sql-wasm-JZH76RLO.js +2148 -0
- package/dist/sqljs-backend-CJQOIQYE.js +266 -0
- package/dist/sqljs-backend-KWXBUDUO.js +266 -0
- package/dist/state-demo.bundle.js +1033 -0
- package/dist/svelte/index.d.ts +17 -0
- package/dist/svelte/index.d.ts.map +1 -0
- package/dist/svelte/index.js +51 -0
- package/dist/svelte/schema-hooks.d.ts +45 -0
- package/dist/svelte/schema-hooks.d.ts.map +1 -0
- package/dist/svelte/schema-hooks.js +71 -0
- package/dist/svelte/stores.d.ts +78 -0
- package/dist/svelte/stores.d.ts.map +1 -0
- package/dist/sync/http-transport.d.ts +3 -3
- package/dist/sync/http-transport.d.ts.map +1 -1
- package/dist/sync/index.d.ts +15 -1
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +617 -0
- package/dist/sync/memory-room.d.ts +37 -0
- package/dist/sync/memory-room.d.ts.map +1 -0
- package/dist/sync/memory-transport.d.ts +3 -3
- package/dist/sync/memory-transport.d.ts.map +1 -1
- package/dist/sync/partykit-room.d.ts +40 -0
- package/dist/sync/partykit-room.d.ts.map +1 -0
- package/dist/sync/partykit-transport.d.ts +84 -0
- package/dist/sync/partykit-transport.d.ts.map +1 -0
- package/dist/sync/room-core.d.ts +53 -0
- package/dist/sync/room-core.d.ts.map +1 -0
- package/dist/sync/sync-engine.d.ts +40 -2
- package/dist/sync/sync-engine.d.ts.map +1 -1
- package/dist/sync/sync-room-server.d.ts +39 -0
- package/dist/sync/sync-room-server.d.ts.map +1 -0
- package/dist/sync/types.d.ts +70 -3
- package/dist/sync/types.d.ts.map +1 -1
- package/dist/sync/vcs-sync-peer.d.ts +63 -0
- package/dist/sync/vcs-sync-peer.d.ts.map +1 -0
- package/dist/sync/ws-transport.d.ts +2 -2
- package/dist/sync/ws-transport.d.ts.map +1 -1
- package/dist/tenancy-CBWYEVUB.js +11 -0
- package/dist/tenancy-FO6WVYFN.js +13 -0
- package/dist/tenancy-FWDBESMX.js +14 -0
- package/dist/tenancy-HGPIS5QA.js +13 -0
- package/dist/tenancy-HXFALA37.js +14 -0
- package/dist/tenancy-OP34NFFS.js +14 -0
- package/dist/tenancy-S676GLID.js +14 -0
- package/dist/tenancy-V7ARWNNV.js +14 -0
- package/dist/tenancy-ZDN4GXK5.js +13 -0
- package/dist/tenancy-ZT5VMY7B.js +14 -0
- package/dist/ui/client.html +355 -67
- package/dist/ui/launch-explorer.d.ts +22 -0
- package/dist/ui/launch-explorer.d.ts.map +1 -0
- package/dist/ui/server.d.ts +1 -1
- package/dist/ui/server.d.ts.map +1 -1
- package/dist/vcs/blob-store.d.ts.map +1 -1
- package/dist/vcs/idb-op-log.d.ts +67 -0
- package/dist/vcs/idb-op-log.d.ts.map +1 -0
- package/dist/vcs/index.d.ts +1 -0
- package/dist/vcs/index.d.ts.map +1 -1
- package/dist/vcs/index.js +81 -72
- package/dist/vcs/issue.d.ts +22 -5
- package/dist/vcs/issue.d.ts.map +1 -1
- package/dist/vcs/lane-materialize.d.ts +5 -0
- package/dist/vcs/lane-materialize.d.ts.map +1 -1
- package/dist/vcs/op-log.d.ts +28 -2
- package/dist/vcs/op-log.d.ts.map +1 -1
- package/dist/vcs/ops.d.ts +10 -0
- package/dist/vcs/ops.d.ts.map +1 -1
- package/dist/{vm-config-6xhsj6b3.js → vm-config-JI4OXKDQ.js} +9 -10
- package/dist/vm-config-YZRJ3KUB.js +21 -0
- package/dist/vue/hooks.d.ts +64 -0
- package/dist/vue/hooks.d.ts.map +1 -0
- package/dist/vue/index.d.ts +19 -0
- package/dist/vue/index.d.ts.map +1 -0
- package/dist/vue/index.js +59 -0
- package/dist/vue/schema-hooks.d.ts +41 -0
- package/dist/vue/schema-hooks.d.ts.map +1 -0
- package/dist/vue/schema-hooks.js +64 -0
- package/package.json +118 -16
- package/dist/deploy-999q207z.js +0 -10
- package/dist/engine-y0724kjq.js +0 -8
- package/dist/import-s2b8e0ft.js +0 -11
- package/dist/index-a76rekgs.js +0 -67
- package/dist/index-c9h37r6h.js +0 -1
- package/dist/index-hr9qvv77.js +0 -860
- package/dist/index-k5b0xskw.js +0 -1
- package/dist/index-y6a4kj0p.js +0 -43
- package/dist/sdk-bepky0xs.js +0 -16
- package/dist/server-szdjx0nt.js +0 -13
- package/dist/sqlite-backend-0vsmc6qj.js +0 -8
- package/dist/tenancy-pjm32b4v.js +0 -14
|
@@ -1,39 +1,46 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
import {
|
|
3
|
-
readConfig
|
|
4
|
-
} from "./index-xzym9w0m.js";
|
|
5
1
|
import {
|
|
6
2
|
TenantPool
|
|
7
|
-
} from "./
|
|
3
|
+
} from "./chunk-AHMDVHBL.js";
|
|
8
4
|
import {
|
|
9
|
-
|
|
10
|
-
} from "./
|
|
5
|
+
readConfig
|
|
6
|
+
} from "./chunk-JA7AIHRK.js";
|
|
11
7
|
|
|
12
8
|
// src/client/sdk.ts
|
|
13
9
|
function isRemote(opts) {
|
|
14
10
|
return "url" in opts;
|
|
15
11
|
}
|
|
16
|
-
|
|
17
|
-
class TrellisDb {
|
|
12
|
+
var TrellisDb = class _TrellisDb {
|
|
18
13
|
opts;
|
|
19
14
|
_pool = null;
|
|
20
15
|
_ws = null;
|
|
21
|
-
_subCallbacks = new Map;
|
|
16
|
+
_subCallbacks = /* @__PURE__ */ new Map();
|
|
22
17
|
constructor(opts) {
|
|
23
18
|
this.opts = opts;
|
|
24
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* Create a TrellisDb instance from `.trellis-db.json` in the given directory.
|
|
22
|
+
*/
|
|
25
23
|
static fromConfig(dir = ".") {
|
|
26
24
|
const config = readConfig(dir);
|
|
27
25
|
if (!config)
|
|
28
|
-
throw new Error(
|
|
26
|
+
throw new Error(
|
|
27
|
+
"No .trellis-db.json found. Run `trellis db init` first."
|
|
28
|
+
);
|
|
29
29
|
if (config.mode === "remote" && config.url) {
|
|
30
|
-
return new
|
|
30
|
+
return new _TrellisDb({ url: config.url, apiKey: config.apiKey });
|
|
31
31
|
}
|
|
32
32
|
if (config.dbPath) {
|
|
33
|
-
return new
|
|
33
|
+
return new _TrellisDb({ path: config.dbPath });
|
|
34
34
|
}
|
|
35
35
|
throw new Error("Invalid .trellis-db.json: missing url or dbPath.");
|
|
36
36
|
}
|
|
37
|
+
// -------------------------------------------------------------------------
|
|
38
|
+
// CRUD
|
|
39
|
+
// -------------------------------------------------------------------------
|
|
40
|
+
/**
|
|
41
|
+
* Create a new entity.
|
|
42
|
+
* Returns the generated entity ID.
|
|
43
|
+
*/
|
|
37
44
|
async create(type, attributes = {}, links) {
|
|
38
45
|
if (isRemote(this.opts)) {
|
|
39
46
|
const res = await this._fetch("POST", "/entities", {
|
|
@@ -50,13 +57,19 @@ class TrellisDb {
|
|
|
50
57
|
await kernel.createEntity(entityId, type, attributes, links);
|
|
51
58
|
return entityId;
|
|
52
59
|
}
|
|
60
|
+
/**
|
|
61
|
+
* Read an entity by ID.
|
|
62
|
+
* Returns null if not found.
|
|
63
|
+
*/
|
|
53
64
|
async read(id) {
|
|
54
65
|
if (isRemote(this.opts)) {
|
|
55
66
|
try {
|
|
56
|
-
return await this._fetch(
|
|
67
|
+
return await this._fetch(
|
|
68
|
+
"GET",
|
|
69
|
+
`/entities/${encodeURIComponent(id)}`
|
|
70
|
+
);
|
|
57
71
|
} catch (err) {
|
|
58
|
-
if (err?.status === 404)
|
|
59
|
-
return null;
|
|
72
|
+
if (err?.status === 404) return null;
|
|
60
73
|
throw err;
|
|
61
74
|
}
|
|
62
75
|
}
|
|
@@ -64,13 +77,19 @@ class TrellisDb {
|
|
|
64
77
|
const tenantId = this.opts.tenantId ?? null;
|
|
65
78
|
const kernel = pool.get(tenantId);
|
|
66
79
|
const entity = kernel.getEntity(id);
|
|
67
|
-
if (!entity)
|
|
68
|
-
return null;
|
|
80
|
+
if (!entity) return null;
|
|
69
81
|
return entityToPlain(entity);
|
|
70
82
|
}
|
|
83
|
+
/**
|
|
84
|
+
* Update an entity's attributes (partial update).
|
|
85
|
+
*/
|
|
71
86
|
async update(id, attributes) {
|
|
72
87
|
if (isRemote(this.opts)) {
|
|
73
|
-
await this._fetch(
|
|
88
|
+
await this._fetch(
|
|
89
|
+
"PUT",
|
|
90
|
+
`/entities/${encodeURIComponent(id)}`,
|
|
91
|
+
attributes
|
|
92
|
+
);
|
|
74
93
|
return;
|
|
75
94
|
}
|
|
76
95
|
const pool = this._getPool();
|
|
@@ -78,6 +97,9 @@ class TrellisDb {
|
|
|
78
97
|
const kernel = pool.get(tenantId);
|
|
79
98
|
await kernel.updateEntity(id, attributes);
|
|
80
99
|
}
|
|
100
|
+
/**
|
|
101
|
+
* Delete an entity by ID.
|
|
102
|
+
*/
|
|
81
103
|
async delete(id) {
|
|
82
104
|
if (isRemote(this.opts)) {
|
|
83
105
|
await this._fetch("DELETE", `/entities/${encodeURIComponent(id)}`);
|
|
@@ -88,15 +110,15 @@ class TrellisDb {
|
|
|
88
110
|
const kernel = pool.get(tenantId);
|
|
89
111
|
await kernel.deleteEntity(id);
|
|
90
112
|
}
|
|
113
|
+
/**
|
|
114
|
+
* List entities of a given type.
|
|
115
|
+
*/
|
|
91
116
|
async list(type, opts = {}) {
|
|
92
117
|
if (isRemote(this.opts)) {
|
|
93
|
-
const params = new URLSearchParams;
|
|
94
|
-
if (type)
|
|
95
|
-
|
|
96
|
-
if (opts.
|
|
97
|
-
params.set("limit", String(opts.limit));
|
|
98
|
-
if (opts.offset)
|
|
99
|
-
params.set("offset", String(opts.offset));
|
|
118
|
+
const params = new URLSearchParams();
|
|
119
|
+
if (type) params.set("type", type);
|
|
120
|
+
if (opts.limit) params.set("limit", String(opts.limit));
|
|
121
|
+
if (opts.offset) params.set("offset", String(opts.offset));
|
|
100
122
|
const qs = params.toString() ? `?${params}` : "";
|
|
101
123
|
return await this._fetch("GET", `/entities${qs}`);
|
|
102
124
|
}
|
|
@@ -114,14 +136,20 @@ class TrellisDb {
|
|
|
114
136
|
offset
|
|
115
137
|
};
|
|
116
138
|
}
|
|
139
|
+
// -------------------------------------------------------------------------
|
|
140
|
+
// Query
|
|
141
|
+
// -------------------------------------------------------------------------
|
|
142
|
+
/**
|
|
143
|
+
* Run an EQL-S query string.
|
|
144
|
+
*/
|
|
117
145
|
async query(eql) {
|
|
118
146
|
if (isRemote(this.opts)) {
|
|
119
147
|
return await this._fetch("POST", "/query", {
|
|
120
148
|
query: eql
|
|
121
149
|
});
|
|
122
150
|
}
|
|
123
|
-
const { parseSimple } = await import("./
|
|
124
|
-
const { QueryEngine } = await import("./engine-
|
|
151
|
+
const { parseSimple } = await import("./query-TJHEVSKL.js");
|
|
152
|
+
const { QueryEngine } = await import("./engine-NSR6BIF7.js");
|
|
125
153
|
const pool = this._getPool();
|
|
126
154
|
const tenantId = this.opts.tenantId ?? null;
|
|
127
155
|
const kernel = pool.get(tenantId);
|
|
@@ -129,9 +157,19 @@ class TrellisDb {
|
|
|
129
157
|
const engine = new QueryEngine(kernel.getStore());
|
|
130
158
|
return engine.execute(parsed);
|
|
131
159
|
}
|
|
160
|
+
// -------------------------------------------------------------------------
|
|
161
|
+
// File upload
|
|
162
|
+
// -------------------------------------------------------------------------
|
|
163
|
+
/**
|
|
164
|
+
* Upload a file to the blob store.
|
|
165
|
+
* Returns a content-addressed hash.
|
|
166
|
+
*/
|
|
132
167
|
async upload(data, contentType = "application/octet-stream") {
|
|
133
168
|
const raw = data instanceof ArrayBuffer ? new Uint8Array(data) : data;
|
|
134
|
-
const cleanBuf = raw.buffer.slice(
|
|
169
|
+
const cleanBuf = raw.buffer.slice(
|
|
170
|
+
raw.byteOffset,
|
|
171
|
+
raw.byteOffset + raw.byteLength
|
|
172
|
+
);
|
|
135
173
|
const buffer = new Uint8Array(cleanBuf);
|
|
136
174
|
if (isRemote(this.opts)) {
|
|
137
175
|
const res = await fetch(`${this.opts.url}/upload`, {
|
|
@@ -142,8 +180,7 @@ class TrellisDb {
|
|
|
142
180
|
},
|
|
143
181
|
body: cleanBuf
|
|
144
182
|
});
|
|
145
|
-
if (!res.ok)
|
|
146
|
-
throw new FetchError(res.status, await res.text());
|
|
183
|
+
if (!res.ok) throw new FetchError(res.status, await res.text());
|
|
147
184
|
return await res.json();
|
|
148
185
|
}
|
|
149
186
|
const hashBuf = await crypto.subtle.digest("SHA-256", buffer);
|
|
@@ -152,19 +189,22 @@ class TrellisDb {
|
|
|
152
189
|
const tenantId = this.opts.tenantId ?? null;
|
|
153
190
|
const kernel = pool.get(tenantId);
|
|
154
191
|
const backend = kernel.getBackend();
|
|
155
|
-
if (!backend.hasBlob(hash))
|
|
156
|
-
backend.putBlob(hash, buffer);
|
|
192
|
+
if (!backend.hasBlob(hash)) backend.putBlob(hash, buffer);
|
|
157
193
|
return { hash, size: buffer.length, contentType };
|
|
158
194
|
}
|
|
195
|
+
/**
|
|
196
|
+
* Download a file by its blob hash.
|
|
197
|
+
*/
|
|
159
198
|
async getFile(hash) {
|
|
160
199
|
if (isRemote(this.opts)) {
|
|
161
|
-
const res = await fetch(
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
200
|
+
const res = await fetch(
|
|
201
|
+
`${this.opts.url}/files/${encodeURIComponent(hash)}`,
|
|
202
|
+
{
|
|
203
|
+
headers: this.opts.apiKey ? { Authorization: `Bearer ${this.opts.apiKey}` } : {}
|
|
204
|
+
}
|
|
205
|
+
);
|
|
206
|
+
if (res.status === 404) return null;
|
|
207
|
+
if (!res.ok) throw new FetchError(res.status, await res.text());
|
|
168
208
|
return new Uint8Array(await res.arrayBuffer());
|
|
169
209
|
}
|
|
170
210
|
const pool = this._getPool();
|
|
@@ -173,6 +213,9 @@ class TrellisDb {
|
|
|
173
213
|
const backend = kernel.getBackend();
|
|
174
214
|
return backend.getBlob(hash) ?? null;
|
|
175
215
|
}
|
|
216
|
+
// -------------------------------------------------------------------------
|
|
217
|
+
// Auth helpers
|
|
218
|
+
// -------------------------------------------------------------------------
|
|
176
219
|
async register(email, password, name) {
|
|
177
220
|
if (!isRemote(this.opts))
|
|
178
221
|
throw new Error("register() requires remote mode");
|
|
@@ -183,21 +226,33 @@ class TrellisDb {
|
|
|
183
226
|
});
|
|
184
227
|
}
|
|
185
228
|
async login(email, password) {
|
|
186
|
-
if (!isRemote(this.opts))
|
|
187
|
-
throw new Error("login() requires remote mode");
|
|
229
|
+
if (!isRemote(this.opts)) throw new Error("login() requires remote mode");
|
|
188
230
|
return await this._fetch("POST", "/auth/login", {
|
|
189
231
|
email,
|
|
190
232
|
password
|
|
191
233
|
});
|
|
192
234
|
}
|
|
235
|
+
/**
|
|
236
|
+
* Set the active API key / JWT token for subsequent requests.
|
|
237
|
+
*/
|
|
193
238
|
setToken(token) {
|
|
194
|
-
if (!isRemote(this.opts))
|
|
195
|
-
return;
|
|
239
|
+
if (!isRemote(this.opts)) return;
|
|
196
240
|
this.opts.apiKey = token;
|
|
197
241
|
}
|
|
242
|
+
// -------------------------------------------------------------------------
|
|
243
|
+
// Realtime
|
|
244
|
+
// -------------------------------------------------------------------------
|
|
245
|
+
/**
|
|
246
|
+
* Subscribe to a live EQL-S query.
|
|
247
|
+
* Callback is fired immediately with the initial result, then on every update.
|
|
248
|
+
*
|
|
249
|
+
* Requires remote mode (WebSocket to server).
|
|
250
|
+
*/
|
|
198
251
|
subscribe(eql, callback) {
|
|
199
252
|
if (!isRemote(this.opts)) {
|
|
200
|
-
throw new Error(
|
|
253
|
+
throw new Error(
|
|
254
|
+
"subscribe() requires remote mode (connect to a running server)"
|
|
255
|
+
);
|
|
201
256
|
}
|
|
202
257
|
const subId = `sub_${crypto.randomUUID()}`;
|
|
203
258
|
this._subCallbacks.set(subId, callback);
|
|
@@ -211,15 +266,24 @@ class TrellisDb {
|
|
|
211
266
|
}
|
|
212
267
|
};
|
|
213
268
|
}
|
|
269
|
+
/**
|
|
270
|
+
* Close the WebSocket connection.
|
|
271
|
+
*/
|
|
214
272
|
disconnect() {
|
|
215
273
|
this._ws?.close();
|
|
216
274
|
this._ws = null;
|
|
217
275
|
}
|
|
276
|
+
/**
|
|
277
|
+
* Close local kernel pool connections.
|
|
278
|
+
*/
|
|
218
279
|
close() {
|
|
219
280
|
this._pool?.closeAll();
|
|
220
281
|
this._pool = null;
|
|
221
282
|
this.disconnect();
|
|
222
283
|
}
|
|
284
|
+
// -------------------------------------------------------------------------
|
|
285
|
+
// Private
|
|
286
|
+
// -------------------------------------------------------------------------
|
|
223
287
|
_getPool() {
|
|
224
288
|
if (!this._pool) {
|
|
225
289
|
const path = this.opts.path;
|
|
@@ -236,16 +300,19 @@ class TrellisDb {
|
|
|
236
300
|
"Content-Type": "application/json",
|
|
237
301
|
...opts.apiKey ? { Authorization: `Bearer ${opts.apiKey}` } : {}
|
|
238
302
|
},
|
|
239
|
-
body: body !==
|
|
303
|
+
body: body !== void 0 ? JSON.stringify(body) : void 0
|
|
240
304
|
});
|
|
241
305
|
const data = await res.json();
|
|
242
306
|
if (!res.ok)
|
|
243
|
-
throw new FetchError(
|
|
307
|
+
throw new FetchError(
|
|
308
|
+
res.status,
|
|
309
|
+
data?.message ?? res.statusText,
|
|
310
|
+
data
|
|
311
|
+
);
|
|
244
312
|
return data;
|
|
245
313
|
}
|
|
246
314
|
async _ensureWs() {
|
|
247
|
-
if (this._ws && this._ws.readyState === WebSocket.OPEN)
|
|
248
|
-
return this._ws;
|
|
315
|
+
if (this._ws && this._ws.readyState === WebSocket.OPEN) return this._ws;
|
|
249
316
|
const opts = this.opts;
|
|
250
317
|
const wsUrl = opts.url.replace(/^https?/, opts.url.startsWith("https") ? "wss" : "ws") + "/realtime";
|
|
251
318
|
return new Promise((resolve, reject) => {
|
|
@@ -261,32 +328,32 @@ class TrellisDb {
|
|
|
261
328
|
if (msg.type === "data" && this._subCallbacks.has(msg.id)) {
|
|
262
329
|
this._subCallbacks.get(msg.id)(msg.result, msg.diff);
|
|
263
330
|
}
|
|
264
|
-
} catch {
|
|
331
|
+
} catch {
|
|
332
|
+
}
|
|
265
333
|
};
|
|
266
334
|
ws.onclose = () => {
|
|
267
335
|
this._ws = null;
|
|
268
336
|
};
|
|
269
337
|
});
|
|
270
338
|
}
|
|
271
|
-
}
|
|
339
|
+
};
|
|
272
340
|
function entityToPlain(entity) {
|
|
273
341
|
const obj = { id: entity.id, type: entity.type };
|
|
274
342
|
for (const f of entity.facts) {
|
|
275
|
-
if (f.a !== "type")
|
|
276
|
-
obj[f.a] = f.v;
|
|
343
|
+
if (f.a !== "type") obj[f.a] = f.v;
|
|
277
344
|
}
|
|
278
345
|
return obj;
|
|
279
346
|
}
|
|
280
|
-
|
|
281
|
-
class FetchError extends Error {
|
|
282
|
-
status;
|
|
283
|
-
body;
|
|
347
|
+
var FetchError = class extends Error {
|
|
284
348
|
constructor(status, message, body) {
|
|
285
349
|
super(`HTTP ${status}: ${message}`);
|
|
286
350
|
this.status = status;
|
|
287
351
|
this.body = body;
|
|
288
352
|
this.name = "FetchError";
|
|
289
353
|
}
|
|
290
|
-
}
|
|
354
|
+
};
|
|
291
355
|
|
|
292
|
-
export {
|
|
356
|
+
export {
|
|
357
|
+
TrellisDb,
|
|
358
|
+
FetchError
|
|
359
|
+
};
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import {
|
|
2
|
+
RelayPersistence
|
|
3
|
+
} from "./chunk-GFZCJ4EH.js";
|
|
4
|
+
|
|
5
|
+
// src/realtime/relay-server.ts
|
|
6
|
+
var REPLAY_GRACE_MS = 250;
|
|
7
|
+
var DEFAULT_ROOM = "default";
|
|
8
|
+
function roomFromPath(reqPath, basePath) {
|
|
9
|
+
const normalized = reqPath.replace(/\/+$/, "") || "/";
|
|
10
|
+
const base = basePath.replace(/\/+$/, "") || "/";
|
|
11
|
+
if (normalized === base) return DEFAULT_ROOM;
|
|
12
|
+
const prefix = base === "/" ? "/" : `${base}/`;
|
|
13
|
+
if (!reqPath.startsWith(prefix)) return null;
|
|
14
|
+
const rest = reqPath.slice(prefix.length).split("?")[0].replace(/\/+$/, "");
|
|
15
|
+
return rest ? decodeURIComponent(rest) : DEFAULT_ROOM;
|
|
16
|
+
}
|
|
17
|
+
async function attachRealtimeRelay(server, opts = {}) {
|
|
18
|
+
const path = opts.path ?? "/rt";
|
|
19
|
+
const graceMs = opts.replayGraceMs ?? REPLAY_GRACE_MS;
|
|
20
|
+
const makePersistence = opts.persistence === false ? null : opts.persistence ?? (() => new RelayPersistence());
|
|
21
|
+
const Wss = opts.WebSocketServerImpl ?? (await import("ws")).WebSocketServer;
|
|
22
|
+
const wss = new Wss({ noServer: true });
|
|
23
|
+
const rooms = /* @__PURE__ */ new Map();
|
|
24
|
+
const pendingRoom = /* @__PURE__ */ new WeakMap();
|
|
25
|
+
const roomState = (room) => {
|
|
26
|
+
let st = rooms.get(room);
|
|
27
|
+
if (!st) {
|
|
28
|
+
st = { clients: /* @__PURE__ */ new Set(), persistence: makePersistence?.() ?? null };
|
|
29
|
+
rooms.set(room, st);
|
|
30
|
+
}
|
|
31
|
+
return st;
|
|
32
|
+
};
|
|
33
|
+
const sendReplay = (ws, st) => {
|
|
34
|
+
if (!st.persistence) return;
|
|
35
|
+
const messages = st.persistence.buildReplay();
|
|
36
|
+
if (messages.length === 0) return;
|
|
37
|
+
const frame = { v: 1, t: "replay", from: "relay", messages };
|
|
38
|
+
ws.send(JSON.stringify(frame));
|
|
39
|
+
};
|
|
40
|
+
wss.on("connection", (ws) => {
|
|
41
|
+
const room = pendingRoom.get(ws) ?? DEFAULT_ROOM;
|
|
42
|
+
pendingRoom.delete(ws);
|
|
43
|
+
const st = roomState(room);
|
|
44
|
+
st.clients.add(ws);
|
|
45
|
+
const replaySent = { value: false };
|
|
46
|
+
const deliverReplay = () => {
|
|
47
|
+
if (replaySent.value) return;
|
|
48
|
+
replaySent.value = true;
|
|
49
|
+
sendReplay(ws, st);
|
|
50
|
+
};
|
|
51
|
+
const graceTimer = graceMs > 0 ? setTimeout(deliverReplay, graceMs) : null;
|
|
52
|
+
graceTimer?.unref?.();
|
|
53
|
+
ws.on("message", (data, isBinary) => {
|
|
54
|
+
const raw = isBinary ? data : String(data);
|
|
55
|
+
let message;
|
|
56
|
+
try {
|
|
57
|
+
message = JSON.parse(String(raw));
|
|
58
|
+
} catch {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (message?.v === 1) {
|
|
62
|
+
if (message.t === "hello") deliverReplay();
|
|
63
|
+
st.persistence?.record(message);
|
|
64
|
+
}
|
|
65
|
+
for (const peer of st.clients) {
|
|
66
|
+
if (peer === ws || peer.readyState !== peer.OPEN) continue;
|
|
67
|
+
peer.send(String(raw));
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
ws.on("close", () => {
|
|
71
|
+
if (graceTimer) clearTimeout(graceTimer);
|
|
72
|
+
st.clients.delete(ws);
|
|
73
|
+
if (st.clients.size === 0) rooms.delete(room);
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
const onUpgrade = (req, socket, head) => {
|
|
77
|
+
const reqPath = (req.url ?? "").split("?")[0];
|
|
78
|
+
const room = roomFromPath(reqPath, path);
|
|
79
|
+
if (room === null) return;
|
|
80
|
+
wss.handleUpgrade(req, socket, head, (ws) => {
|
|
81
|
+
pendingRoom.set(ws, room);
|
|
82
|
+
wss.emit("connection", ws, req);
|
|
83
|
+
});
|
|
84
|
+
};
|
|
85
|
+
server.on("upgrade", onUpgrade);
|
|
86
|
+
return {
|
|
87
|
+
clientCount: (room) => {
|
|
88
|
+
if (room !== void 0) return rooms.get(room)?.clients.size ?? 0;
|
|
89
|
+
let total = 0;
|
|
90
|
+
for (const st of rooms.values()) total += st.clients.size;
|
|
91
|
+
return total;
|
|
92
|
+
},
|
|
93
|
+
rooms: () => [...rooms.keys()],
|
|
94
|
+
persistenceFor: (room) => rooms.get(room)?.persistence ?? null,
|
|
95
|
+
close: () => new Promise((resolve) => {
|
|
96
|
+
server.off("upgrade", onUpgrade);
|
|
97
|
+
for (const st of rooms.values()) {
|
|
98
|
+
for (const ws of st.clients) {
|
|
99
|
+
try {
|
|
100
|
+
ws.close();
|
|
101
|
+
} catch {
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
st.clients.clear();
|
|
105
|
+
}
|
|
106
|
+
rooms.clear();
|
|
107
|
+
wss.close(() => resolve());
|
|
108
|
+
})
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
async function createRealtimeRelay(opts = {}) {
|
|
112
|
+
const { createServer } = await import("node:http");
|
|
113
|
+
const path = opts.path ?? "/rt";
|
|
114
|
+
const port = opts.port ?? 8231;
|
|
115
|
+
const hostname = opts.hostname ?? "0.0.0.0";
|
|
116
|
+
const server = createServer((req, res) => {
|
|
117
|
+
const reqPath = (req.url ?? "/").split("?")[0];
|
|
118
|
+
if (reqPath === "/" || reqPath === "/health") {
|
|
119
|
+
res.writeHead(200, { "content-type": "application/json" });
|
|
120
|
+
res.end(JSON.stringify({ ok: true, relay: path }));
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
res.writeHead(404).end("not found");
|
|
124
|
+
});
|
|
125
|
+
const relay = await attachRealtimeRelay(server, opts);
|
|
126
|
+
await new Promise((resolve) => server.listen(port, hostname, resolve));
|
|
127
|
+
const addr = server.address();
|
|
128
|
+
const boundPort = typeof addr === "object" && addr ? addr.port : port;
|
|
129
|
+
return {
|
|
130
|
+
...relay,
|
|
131
|
+
port: boundPort,
|
|
132
|
+
server,
|
|
133
|
+
close: async () => {
|
|
134
|
+
await relay.close();
|
|
135
|
+
await new Promise((resolve) => server.close(() => resolve()));
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
export {
|
|
141
|
+
attachRealtimeRelay,
|
|
142
|
+
createRealtimeRelay
|
|
143
|
+
};
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import {
|
|
2
|
+
entitiesQuery,
|
|
3
|
+
resolveRelations
|
|
4
|
+
} from "./chunk-7QQQNUB5.js";
|
|
5
|
+
import {
|
|
6
|
+
Signal
|
|
7
|
+
} from "./chunk-UBGUDMUV.js";
|
|
8
|
+
|
|
9
|
+
// src/client/live.ts
|
|
10
|
+
function liveQuery(client, eql) {
|
|
11
|
+
const signal = new Signal({
|
|
12
|
+
data: [],
|
|
13
|
+
loading: true,
|
|
14
|
+
error: null
|
|
15
|
+
});
|
|
16
|
+
let sub = null;
|
|
17
|
+
return {
|
|
18
|
+
signal,
|
|
19
|
+
start() {
|
|
20
|
+
if (sub) return () => stop();
|
|
21
|
+
try {
|
|
22
|
+
sub = client.subscribe(eql, (rows) => {
|
|
23
|
+
signal.value = { data: rows, loading: false, error: null };
|
|
24
|
+
});
|
|
25
|
+
} catch (err) {
|
|
26
|
+
signal.value = {
|
|
27
|
+
data: [],
|
|
28
|
+
loading: false,
|
|
29
|
+
error: err instanceof Error ? err : new Error(String(err))
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
return () => stop();
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
function stop() {
|
|
36
|
+
sub?.unsubscribe();
|
|
37
|
+
sub = null;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function normalizeLiveEntitiesOpts(whereOrOpts) {
|
|
41
|
+
if (!whereOrOpts) return {};
|
|
42
|
+
if ("resolve" in whereOrOpts) return whereOrOpts;
|
|
43
|
+
return { where: whereOrOpts };
|
|
44
|
+
}
|
|
45
|
+
function liveEntities(client, typeOrSchema, whereOrOpts) {
|
|
46
|
+
const schema = typeof typeOrSchema === "string" ? void 0 : typeOrSchema;
|
|
47
|
+
const type = typeof typeOrSchema === "string" ? typeOrSchema : typeOrSchema.type;
|
|
48
|
+
const { where, resolve } = normalizeLiveEntitiesOpts(whereOrOpts);
|
|
49
|
+
const signal = new Signal({
|
|
50
|
+
data: [],
|
|
51
|
+
loading: true,
|
|
52
|
+
error: null
|
|
53
|
+
});
|
|
54
|
+
let sub = null;
|
|
55
|
+
let token = 0;
|
|
56
|
+
return {
|
|
57
|
+
signal,
|
|
58
|
+
start() {
|
|
59
|
+
if (sub) return () => stop();
|
|
60
|
+
try {
|
|
61
|
+
sub = client.subscribe(
|
|
62
|
+
entitiesQuery(type, where),
|
|
63
|
+
(rows) => {
|
|
64
|
+
const turn = ++token;
|
|
65
|
+
const ids = rows.map((r) => r.e).filter(Boolean);
|
|
66
|
+
Promise.all(ids.map((id) => client.read(id))).then(async (entities) => {
|
|
67
|
+
if (turn !== token) return;
|
|
68
|
+
let data = entities.filter(
|
|
69
|
+
(e) => e != null
|
|
70
|
+
);
|
|
71
|
+
if (schema && resolve && Object.keys(resolve).length > 0) {
|
|
72
|
+
data = await resolveRelations(
|
|
73
|
+
client,
|
|
74
|
+
schema,
|
|
75
|
+
data,
|
|
76
|
+
resolve
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
if (turn !== token) return;
|
|
80
|
+
signal.value = { data, loading: false, error: null };
|
|
81
|
+
}).catch((err) => {
|
|
82
|
+
if (turn !== token) return;
|
|
83
|
+
signal.value = {
|
|
84
|
+
data: signal.peek().data,
|
|
85
|
+
loading: false,
|
|
86
|
+
error: err instanceof Error ? err : new Error(String(err))
|
|
87
|
+
};
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
);
|
|
91
|
+
} catch (err) {
|
|
92
|
+
signal.value = {
|
|
93
|
+
data: [],
|
|
94
|
+
loading: false,
|
|
95
|
+
error: err instanceof Error ? err : new Error(String(err))
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
return () => stop();
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
function stop() {
|
|
102
|
+
token++;
|
|
103
|
+
sub?.unsubscribe();
|
|
104
|
+
sub = null;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export {
|
|
109
|
+
liveQuery,
|
|
110
|
+
liveEntities
|
|
111
|
+
};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
8
|
+
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
9
|
+
}) : x)(function(x) {
|
|
10
|
+
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
11
|
+
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
12
|
+
});
|
|
13
|
+
var __esm = (fn, res) => function __init() {
|
|
14
|
+
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
15
|
+
};
|
|
16
|
+
var __commonJS = (cb, mod) => function __require2() {
|
|
17
|
+
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
18
|
+
};
|
|
19
|
+
var __export = (target, all) => {
|
|
20
|
+
for (var name in all)
|
|
21
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
22
|
+
};
|
|
23
|
+
var __copyProps = (to, from, except, desc) => {
|
|
24
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
25
|
+
for (let key of __getOwnPropNames(from))
|
|
26
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
27
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
28
|
+
}
|
|
29
|
+
return to;
|
|
30
|
+
};
|
|
31
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
32
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
33
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
34
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
35
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
36
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
37
|
+
mod
|
|
38
|
+
));
|
|
39
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
40
|
+
|
|
41
|
+
export {
|
|
42
|
+
__require,
|
|
43
|
+
__esm,
|
|
44
|
+
__commonJS,
|
|
45
|
+
__export,
|
|
46
|
+
__toESM,
|
|
47
|
+
__toCommonJS
|
|
48
|
+
};
|