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
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
import {
|
|
2
|
+
__require
|
|
3
|
+
} from "./chunk-KFQGP6VL.js";
|
|
4
|
+
|
|
5
|
+
// src/core/persist/sqlite-backend.ts
|
|
6
|
+
var _DatabaseCtor = null;
|
|
7
|
+
function loadDatabaseCtor() {
|
|
8
|
+
if (_DatabaseCtor) return _DatabaseCtor;
|
|
9
|
+
try {
|
|
10
|
+
const { createRequire } = __require("module");
|
|
11
|
+
const requireCJS = createRequire(import.meta.url);
|
|
12
|
+
_DatabaseCtor = requireCJS("bun:sqlite").Database;
|
|
13
|
+
return _DatabaseCtor;
|
|
14
|
+
} catch {
|
|
15
|
+
throw new Error(
|
|
16
|
+
"SqliteKernelBackend requires the Bun runtime (built-in `bun:sqlite`). In Node / WebContainer use `createKernelBackend()` from `trellis/core` \u2014 it auto-selects better-sqlite3 or sql.js."
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
var SCHEMA_SQL = `
|
|
21
|
+
CREATE TABLE IF NOT EXISTS ops (
|
|
22
|
+
hash TEXT PRIMARY KEY,
|
|
23
|
+
kind TEXT NOT NULL,
|
|
24
|
+
timestamp TEXT NOT NULL,
|
|
25
|
+
agent_id TEXT NOT NULL,
|
|
26
|
+
previous_hash TEXT,
|
|
27
|
+
payload TEXT NOT NULL
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
CREATE TABLE IF NOT EXISTS snapshots (
|
|
31
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
32
|
+
last_op_hash TEXT NOT NULL,
|
|
33
|
+
data TEXT NOT NULL,
|
|
34
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
CREATE TABLE IF NOT EXISTS blobs (
|
|
38
|
+
hash TEXT PRIMARY KEY,
|
|
39
|
+
content BLOB NOT NULL
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
CREATE INDEX IF NOT EXISTS idx_ops_kind ON ops(kind);
|
|
43
|
+
CREATE INDEX IF NOT EXISTS idx_ops_timestamp ON ops(timestamp);
|
|
44
|
+
CREATE INDEX IF NOT EXISTS idx_ops_agent ON ops(agent_id);
|
|
45
|
+
CREATE INDEX IF NOT EXISTS idx_ops_previous ON ops(previous_hash);
|
|
46
|
+
CREATE INDEX IF NOT EXISTS idx_snapshots_op ON snapshots(last_op_hash);
|
|
47
|
+
`;
|
|
48
|
+
var SqliteKernelBackend = class {
|
|
49
|
+
constructor(dbPath) {
|
|
50
|
+
this.dbPath = dbPath;
|
|
51
|
+
const DatabaseCtor = loadDatabaseCtor();
|
|
52
|
+
this.db = new DatabaseCtor(dbPath);
|
|
53
|
+
}
|
|
54
|
+
db;
|
|
55
|
+
_stmts = null;
|
|
56
|
+
init() {
|
|
57
|
+
this.db.exec("PRAGMA journal_mode=WAL;");
|
|
58
|
+
this.db.exec("PRAGMA foreign_keys=ON;");
|
|
59
|
+
this.db.exec("PRAGMA synchronous=NORMAL;");
|
|
60
|
+
this.db.exec(SCHEMA_SQL);
|
|
61
|
+
this._prepareStatements();
|
|
62
|
+
}
|
|
63
|
+
_prepareStatements() {
|
|
64
|
+
this._stmts = {
|
|
65
|
+
insert: this.db.prepare(`
|
|
66
|
+
INSERT OR IGNORE INTO ops (hash, kind, timestamp, agent_id, previous_hash, payload)
|
|
67
|
+
VALUES ($hash, $kind, $timestamp, $agentId, $previousHash, $payload)
|
|
68
|
+
`),
|
|
69
|
+
readAll: this.db.prepare(`
|
|
70
|
+
SELECT hash, kind, timestamp, agent_id, previous_hash, payload
|
|
71
|
+
FROM ops ORDER BY rowid ASC
|
|
72
|
+
`),
|
|
73
|
+
readUntil: this.db.prepare(`
|
|
74
|
+
SELECT hash, kind, timestamp, agent_id, previous_hash, payload
|
|
75
|
+
FROM ops WHERE rowid <= (SELECT rowid FROM ops WHERE hash = $hash)
|
|
76
|
+
ORDER BY rowid ASC
|
|
77
|
+
`),
|
|
78
|
+
readAfter: this.db.prepare(`
|
|
79
|
+
SELECT hash, kind, timestamp, agent_id, previous_hash, payload
|
|
80
|
+
FROM ops WHERE rowid > (SELECT rowid FROM ops WHERE hash = $hash)
|
|
81
|
+
ORDER BY rowid ASC
|
|
82
|
+
`),
|
|
83
|
+
getByHash: this.db.prepare(`
|
|
84
|
+
SELECT hash, kind, timestamp, agent_id, previous_hash, payload
|
|
85
|
+
FROM ops WHERE hash = $hash
|
|
86
|
+
`),
|
|
87
|
+
getLast: this.db.prepare(`
|
|
88
|
+
SELECT hash, kind, timestamp, agent_id, previous_hash, payload
|
|
89
|
+
FROM ops ORDER BY rowid DESC LIMIT 1
|
|
90
|
+
`),
|
|
91
|
+
count: this.db.prepare("SELECT COUNT(*) as cnt FROM ops"),
|
|
92
|
+
saveSnapshot: this.db.prepare(`
|
|
93
|
+
INSERT INTO snapshots (last_op_hash, data)
|
|
94
|
+
VALUES ($lastOpHash, $data)
|
|
95
|
+
`),
|
|
96
|
+
loadSnapshot: this.db.prepare(`
|
|
97
|
+
SELECT last_op_hash, data FROM snapshots
|
|
98
|
+
ORDER BY id DESC LIMIT 1
|
|
99
|
+
`),
|
|
100
|
+
putBlob: this.db.prepare(`
|
|
101
|
+
INSERT OR IGNORE INTO blobs (hash, content) VALUES ($hash, $content)
|
|
102
|
+
`),
|
|
103
|
+
getBlob: this.db.prepare(`
|
|
104
|
+
SELECT content FROM blobs WHERE hash = $hash
|
|
105
|
+
`),
|
|
106
|
+
hasBlob: this.db.prepare(`
|
|
107
|
+
SELECT 1 FROM blobs WHERE hash = $hash
|
|
108
|
+
`)
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
// -------------------------------------------------------------------------
|
|
112
|
+
// Op operations
|
|
113
|
+
// -------------------------------------------------------------------------
|
|
114
|
+
append(op) {
|
|
115
|
+
const payload = JSON.stringify({
|
|
116
|
+
facts: op.facts,
|
|
117
|
+
links: op.links,
|
|
118
|
+
...op.deleteFacts?.length ? { deleteFacts: op.deleteFacts } : {},
|
|
119
|
+
...op.deleteLinks?.length ? { deleteLinks: op.deleteLinks } : {},
|
|
120
|
+
...op.vcs ? { vcs: op.vcs } : {},
|
|
121
|
+
...op.signature ? { signature: op.signature } : {}
|
|
122
|
+
});
|
|
123
|
+
this._stmts.insert.run({
|
|
124
|
+
$hash: op.hash,
|
|
125
|
+
$kind: op.kind,
|
|
126
|
+
$timestamp: op.timestamp,
|
|
127
|
+
$agentId: op.agentId,
|
|
128
|
+
$previousHash: op.previousHash ?? null,
|
|
129
|
+
$payload: payload
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
appendBatch(ops) {
|
|
133
|
+
if (ops.length === 0) return;
|
|
134
|
+
this.db.transaction(() => {
|
|
135
|
+
for (const op of ops) {
|
|
136
|
+
this.append(op);
|
|
137
|
+
}
|
|
138
|
+
})();
|
|
139
|
+
}
|
|
140
|
+
readAll() {
|
|
141
|
+
const rows = this._stmts.readAll.all();
|
|
142
|
+
return rows.map(rowToOp);
|
|
143
|
+
}
|
|
144
|
+
readUntil(hash) {
|
|
145
|
+
const rows = this._stmts.readUntil.all({ $hash: hash });
|
|
146
|
+
return rows.map(rowToOp);
|
|
147
|
+
}
|
|
148
|
+
readAfter(hash) {
|
|
149
|
+
const rows = this._stmts.readAfter.all({ $hash: hash });
|
|
150
|
+
return rows.map(rowToOp);
|
|
151
|
+
}
|
|
152
|
+
readUntilTimestamp(isoTimestamp) {
|
|
153
|
+
const rows = this.db.prepare(
|
|
154
|
+
`SELECT hash, kind, timestamp, agent_id, previous_hash, payload
|
|
155
|
+
FROM ops WHERE timestamp <= $ts ORDER BY rowid ASC`
|
|
156
|
+
).all({ $ts: isoTimestamp });
|
|
157
|
+
return rows.map(rowToOp);
|
|
158
|
+
}
|
|
159
|
+
getLastOp() {
|
|
160
|
+
const row = this._stmts.getLast.get();
|
|
161
|
+
return row ? rowToOp(row) : void 0;
|
|
162
|
+
}
|
|
163
|
+
getByHash(hash) {
|
|
164
|
+
return this.getOpByHash(hash);
|
|
165
|
+
}
|
|
166
|
+
getOpCount() {
|
|
167
|
+
return this.count();
|
|
168
|
+
}
|
|
169
|
+
getOpByHash(hash) {
|
|
170
|
+
const row = this._stmts.getByHash.get({ $hash: hash });
|
|
171
|
+
return row ? rowToOp(row) : void 0;
|
|
172
|
+
}
|
|
173
|
+
count() {
|
|
174
|
+
const row = this._stmts.count.get();
|
|
175
|
+
return row?.cnt ?? 0;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Find the common ancestor op of two op hashes by walking
|
|
179
|
+
* previousHash chains until they converge.
|
|
180
|
+
*/
|
|
181
|
+
findCommonAncestor(hashA, hashB) {
|
|
182
|
+
const ancestorsA = /* @__PURE__ */ new Set();
|
|
183
|
+
let cursor = hashA;
|
|
184
|
+
while (cursor) {
|
|
185
|
+
ancestorsA.add(cursor);
|
|
186
|
+
const op = this.getOpByHash(cursor);
|
|
187
|
+
cursor = op?.previousHash;
|
|
188
|
+
}
|
|
189
|
+
cursor = hashB;
|
|
190
|
+
while (cursor) {
|
|
191
|
+
if (ancestorsA.has(cursor)) {
|
|
192
|
+
return this.getOpByHash(cursor);
|
|
193
|
+
}
|
|
194
|
+
const op = this.getOpByHash(cursor);
|
|
195
|
+
cursor = op?.previousHash;
|
|
196
|
+
}
|
|
197
|
+
return void 0;
|
|
198
|
+
}
|
|
199
|
+
// -------------------------------------------------------------------------
|
|
200
|
+
// Snapshot operations
|
|
201
|
+
// -------------------------------------------------------------------------
|
|
202
|
+
saveSnapshot(lastOpHash, data) {
|
|
203
|
+
this._stmts.saveSnapshot.run({
|
|
204
|
+
$lastOpHash: lastOpHash,
|
|
205
|
+
$data: JSON.stringify(data)
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
loadLatestSnapshot() {
|
|
209
|
+
const row = this._stmts.loadSnapshot.get();
|
|
210
|
+
if (!row) return void 0;
|
|
211
|
+
return {
|
|
212
|
+
lastOpHash: row.last_op_hash,
|
|
213
|
+
data: JSON.parse(row.data)
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
// -------------------------------------------------------------------------
|
|
217
|
+
// Blob operations
|
|
218
|
+
// -------------------------------------------------------------------------
|
|
219
|
+
putBlob(hash, content) {
|
|
220
|
+
this._stmts.putBlob.run({
|
|
221
|
+
$hash: hash,
|
|
222
|
+
$content: Buffer.from(content)
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
getBlob(hash) {
|
|
226
|
+
const row = this._stmts.getBlob.get({ $hash: hash });
|
|
227
|
+
if (!row) return void 0;
|
|
228
|
+
return new Uint8Array(row.content);
|
|
229
|
+
}
|
|
230
|
+
hasBlob(hash) {
|
|
231
|
+
return !!this._stmts.hasBlob.get({ $hash: hash });
|
|
232
|
+
}
|
|
233
|
+
// -------------------------------------------------------------------------
|
|
234
|
+
// Lifecycle
|
|
235
|
+
// -------------------------------------------------------------------------
|
|
236
|
+
close() {
|
|
237
|
+
this.db.close();
|
|
238
|
+
}
|
|
239
|
+
};
|
|
240
|
+
function rowToOp(row) {
|
|
241
|
+
const payload = JSON.parse(row.payload);
|
|
242
|
+
const op = {
|
|
243
|
+
hash: row.hash,
|
|
244
|
+
kind: row.kind,
|
|
245
|
+
timestamp: row.timestamp,
|
|
246
|
+
agentId: row.agent_id
|
|
247
|
+
};
|
|
248
|
+
if (row.previous_hash) op.previousHash = row.previous_hash;
|
|
249
|
+
if (payload.facts) op.facts = payload.facts;
|
|
250
|
+
if (payload.links) op.links = payload.links;
|
|
251
|
+
if (payload.deleteFacts) op.deleteFacts = payload.deleteFacts;
|
|
252
|
+
if (payload.deleteLinks) op.deleteLinks = payload.deleteLinks;
|
|
253
|
+
if (payload.vcs) op.vcs = payload.vcs;
|
|
254
|
+
if (payload.signature) op.signature = payload.signature;
|
|
255
|
+
return op;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
export {
|
|
259
|
+
SqliteKernelBackend
|
|
260
|
+
};
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import {
|
|
2
|
+
entitiesQuery,
|
|
3
|
+
resolveRelations
|
|
4
|
+
} from "./chunk-FOWKR5TW.js";
|
|
5
|
+
import {
|
|
6
|
+
bindingEntityId,
|
|
7
|
+
bindingToEntity,
|
|
8
|
+
isSparseBinding
|
|
9
|
+
} from "./chunk-5CINODKT.js";
|
|
10
|
+
import {
|
|
11
|
+
Signal
|
|
12
|
+
} from "./chunk-UBGUDMUV.js";
|
|
13
|
+
|
|
14
|
+
// src/client/live.ts
|
|
15
|
+
function liveQuery(client, eql) {
|
|
16
|
+
const signal = new Signal({
|
|
17
|
+
data: [],
|
|
18
|
+
loading: true,
|
|
19
|
+
error: null
|
|
20
|
+
});
|
|
21
|
+
let sub = null;
|
|
22
|
+
return {
|
|
23
|
+
signal,
|
|
24
|
+
start() {
|
|
25
|
+
if (sub) return () => stop();
|
|
26
|
+
try {
|
|
27
|
+
sub = client.subscribe(eql, (rows) => {
|
|
28
|
+
signal.value = { data: rows, loading: false, error: null };
|
|
29
|
+
});
|
|
30
|
+
} catch (err) {
|
|
31
|
+
signal.value = {
|
|
32
|
+
data: [],
|
|
33
|
+
loading: false,
|
|
34
|
+
error: err instanceof Error ? err : new Error(String(err))
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
return () => stop();
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
function stop() {
|
|
41
|
+
sub?.unsubscribe();
|
|
42
|
+
sub = null;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function normalizeLiveEntitiesOpts(whereOrOpts) {
|
|
46
|
+
if (!whereOrOpts) return {};
|
|
47
|
+
if ("resolve" in whereOrOpts || "where" in whereOrOpts) {
|
|
48
|
+
return whereOrOpts;
|
|
49
|
+
}
|
|
50
|
+
return { where: whereOrOpts };
|
|
51
|
+
}
|
|
52
|
+
function liveEntities(client, typeOrSchema, whereOrOpts) {
|
|
53
|
+
const schema = typeof typeOrSchema === "string" ? void 0 : typeOrSchema;
|
|
54
|
+
const type = typeof typeOrSchema === "string" ? typeOrSchema : typeOrSchema.type;
|
|
55
|
+
const { where, resolve } = normalizeLiveEntitiesOpts(whereOrOpts);
|
|
56
|
+
const signal = new Signal({
|
|
57
|
+
data: [],
|
|
58
|
+
loading: true,
|
|
59
|
+
error: null
|
|
60
|
+
});
|
|
61
|
+
let sub = null;
|
|
62
|
+
let token = 0;
|
|
63
|
+
return {
|
|
64
|
+
signal,
|
|
65
|
+
start() {
|
|
66
|
+
if (sub) return () => stop();
|
|
67
|
+
try {
|
|
68
|
+
sub = client.subscribe(
|
|
69
|
+
entitiesQuery(type, where),
|
|
70
|
+
(rows) => {
|
|
71
|
+
const turn = ++token;
|
|
72
|
+
const hydrate = async () => {
|
|
73
|
+
if (rows.length === 0) return [];
|
|
74
|
+
if (rows.some((r) => isSparseBinding(r))) {
|
|
75
|
+
const ids = rows.map((r) => bindingEntityId(r)).filter((id) => Boolean(id));
|
|
76
|
+
const loaded = await Promise.all(ids.map((id) => client.read(id)));
|
|
77
|
+
return loaded.filter((e) => e != null);
|
|
78
|
+
}
|
|
79
|
+
return rows.map((r) => bindingToEntity(r));
|
|
80
|
+
};
|
|
81
|
+
hydrate().then(async (entities) => {
|
|
82
|
+
if (turn !== token) return;
|
|
83
|
+
let data = entities;
|
|
84
|
+
if (schema && resolve && Object.keys(resolve).length > 0) {
|
|
85
|
+
data = await resolveRelations(
|
|
86
|
+
client,
|
|
87
|
+
schema,
|
|
88
|
+
data,
|
|
89
|
+
resolve
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
if (turn !== token) return;
|
|
93
|
+
signal.value = { data, loading: false, error: null };
|
|
94
|
+
}).catch((err) => {
|
|
95
|
+
if (turn !== token) return;
|
|
96
|
+
signal.value = {
|
|
97
|
+
data: signal.peek().data,
|
|
98
|
+
loading: false,
|
|
99
|
+
error: err instanceof Error ? err : new Error(String(err))
|
|
100
|
+
};
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
);
|
|
104
|
+
} catch (err) {
|
|
105
|
+
signal.value = {
|
|
106
|
+
data: [],
|
|
107
|
+
loading: false,
|
|
108
|
+
error: err instanceof Error ? err : new Error(String(err))
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
return () => stop();
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
function stop() {
|
|
115
|
+
token++;
|
|
116
|
+
sub?.unsubscribe();
|
|
117
|
+
sub = null;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export {
|
|
122
|
+
liveQuery,
|
|
123
|
+
liveEntities
|
|
124
|
+
};
|
|
@@ -1,21 +1,30 @@
|
|
|
1
|
-
// @bun
|
|
2
1
|
// src/core/ontology/registry.ts
|
|
3
|
-
|
|
4
|
-
schemas = new Map;
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
var OntologyRegistry = class {
|
|
3
|
+
schemas = /* @__PURE__ */ new Map();
|
|
4
|
+
/** Resolved entity defs (with inherited attributes merged). */
|
|
5
|
+
resolvedEntities = /* @__PURE__ */ new Map();
|
|
6
|
+
/** Resolved relation defs. */
|
|
7
|
+
resolvedRelations = /* @__PURE__ */ new Map();
|
|
8
|
+
/**
|
|
9
|
+
* Register an ontology schema.
|
|
10
|
+
* Throws if an ontology with the same ID is already registered at the same version.
|
|
11
|
+
*/
|
|
7
12
|
register(schema) {
|
|
8
13
|
const existing = this.schemas.get(schema.id);
|
|
9
14
|
if (existing && existing.version === schema.version) {
|
|
10
|
-
throw new Error(
|
|
15
|
+
throw new Error(
|
|
16
|
+
`Ontology "${schema.id}" v${schema.version} is already registered.`
|
|
17
|
+
);
|
|
11
18
|
}
|
|
12
19
|
this.schemas.set(schema.id, schema);
|
|
13
20
|
this._resolve(schema);
|
|
14
21
|
}
|
|
22
|
+
/**
|
|
23
|
+
* Unregister an ontology by ID.
|
|
24
|
+
*/
|
|
15
25
|
unregister(id) {
|
|
16
26
|
const schema = this.schemas.get(id);
|
|
17
|
-
if (!schema)
|
|
18
|
-
return;
|
|
27
|
+
if (!schema) return;
|
|
19
28
|
for (const [name, entry] of this.resolvedEntities) {
|
|
20
29
|
if (entry.ontologyId === id) {
|
|
21
30
|
this.resolvedEntities.delete(name);
|
|
@@ -31,21 +40,41 @@ class OntologyRegistry {
|
|
|
31
40
|
}
|
|
32
41
|
this.schemas.delete(id);
|
|
33
42
|
}
|
|
43
|
+
/**
|
|
44
|
+
* Get a registered ontology schema by ID.
|
|
45
|
+
*/
|
|
34
46
|
get(id) {
|
|
35
47
|
return this.schemas.get(id);
|
|
36
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* List all registered ontology schemas.
|
|
51
|
+
*/
|
|
37
52
|
list() {
|
|
38
53
|
return [...this.schemas.values()];
|
|
39
54
|
}
|
|
55
|
+
/**
|
|
56
|
+
* Get the resolved entity definition for an entity type name.
|
|
57
|
+
* Returns the entity def with inherited attributes merged in.
|
|
58
|
+
*/
|
|
40
59
|
getEntityDef(typeName) {
|
|
41
60
|
return this.resolvedEntities.get(typeName)?.def;
|
|
42
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* Get the ontology ID that defines a given entity type.
|
|
64
|
+
*/
|
|
43
65
|
getEntityOntology(typeName) {
|
|
44
66
|
return this.resolvedEntities.get(typeName)?.ontologyId;
|
|
45
67
|
}
|
|
68
|
+
/**
|
|
69
|
+
* List all known entity type names.
|
|
70
|
+
*/
|
|
46
71
|
listEntityTypes() {
|
|
47
72
|
return [...this.resolvedEntities.keys()];
|
|
48
73
|
}
|
|
74
|
+
/**
|
|
75
|
+
* Get all relation definitions involving a given entity type
|
|
76
|
+
* (either as source or target).
|
|
77
|
+
*/
|
|
49
78
|
getRelationsForType(typeName) {
|
|
50
79
|
const results = [];
|
|
51
80
|
for (const [, entries] of this.resolvedRelations) {
|
|
@@ -57,22 +86,36 @@ class OntologyRegistry {
|
|
|
57
86
|
}
|
|
58
87
|
return results;
|
|
59
88
|
}
|
|
89
|
+
/**
|
|
90
|
+
* Get a specific relation definition by name.
|
|
91
|
+
*/
|
|
60
92
|
getRelationDef(name) {
|
|
61
93
|
const entries = this.resolvedRelations.get(name);
|
|
62
94
|
return entries?.[0]?.def;
|
|
63
95
|
}
|
|
96
|
+
/**
|
|
97
|
+
* List all known relation names.
|
|
98
|
+
*/
|
|
64
99
|
listRelationNames() {
|
|
65
100
|
return [...this.resolvedRelations.keys()];
|
|
66
101
|
}
|
|
102
|
+
/**
|
|
103
|
+
* Check if an entity type is known to any registered ontology.
|
|
104
|
+
*/
|
|
67
105
|
hasEntityType(typeName) {
|
|
68
106
|
return this.resolvedEntities.has(typeName);
|
|
69
107
|
}
|
|
108
|
+
/**
|
|
109
|
+
* Get the required attributes for an entity type.
|
|
110
|
+
*/
|
|
70
111
|
getRequiredAttributes(typeName) {
|
|
71
112
|
const def = this.getEntityDef(typeName);
|
|
72
|
-
if (!def)
|
|
73
|
-
return [];
|
|
113
|
+
if (!def) return [];
|
|
74
114
|
return def.attributes.filter((a) => a.required);
|
|
75
115
|
}
|
|
116
|
+
// -------------------------------------------------------------------------
|
|
117
|
+
// Resolution (inheritance)
|
|
118
|
+
// -------------------------------------------------------------------------
|
|
76
119
|
_resolve(schema) {
|
|
77
120
|
for (const entity of schema.entities) {
|
|
78
121
|
const resolved = this._resolveEntity(entity, schema);
|
|
@@ -88,15 +131,16 @@ class OntologyRegistry {
|
|
|
88
131
|
}
|
|
89
132
|
}
|
|
90
133
|
_resolveEntity(entity, schema) {
|
|
91
|
-
if (!entity.extends)
|
|
92
|
-
return entity;
|
|
134
|
+
if (!entity.extends) return entity;
|
|
93
135
|
let parent = schema.entities.find((e) => e.name === entity.extends);
|
|
94
136
|
if (!parent) {
|
|
95
137
|
const resolved = this.resolvedEntities.get(entity.extends);
|
|
96
138
|
parent = resolved?.def;
|
|
97
139
|
}
|
|
98
140
|
if (!parent) {
|
|
99
|
-
throw new Error(
|
|
141
|
+
throw new Error(
|
|
142
|
+
`Entity "${entity.name}" extends "${entity.extends}" which is not defined.`
|
|
143
|
+
);
|
|
100
144
|
}
|
|
101
145
|
const resolvedParent = this._resolveEntity(parent, schema);
|
|
102
146
|
const childAttrNames = new Set(entity.attributes.map((a) => a.name));
|
|
@@ -109,7 +153,7 @@ class OntologyRegistry {
|
|
|
109
153
|
attributes: mergedAttrs
|
|
110
154
|
};
|
|
111
155
|
}
|
|
112
|
-
}
|
|
156
|
+
};
|
|
113
157
|
|
|
114
158
|
// src/core/ontology/builtins.ts
|
|
115
159
|
var projectOntology = {
|
|
@@ -386,8 +430,7 @@ function validateEntity(entityId, store, registry) {
|
|
|
386
430
|
}
|
|
387
431
|
}
|
|
388
432
|
for (const fact of facts) {
|
|
389
|
-
if (fact.a === "type" || fact.a === "createdAt" || fact.a === "updatedAt")
|
|
390
|
-
continue;
|
|
433
|
+
if (fact.a === "type" || fact.a === "createdAt" || fact.a === "updatedAt") continue;
|
|
391
434
|
const attrDef = def.attributes.find((a) => a.name === fact.a);
|
|
392
435
|
if (!attrDef) {
|
|
393
436
|
warnings.push({
|
|
@@ -429,7 +472,7 @@ function validateEntity(entityId, store, registry) {
|
|
|
429
472
|
});
|
|
430
473
|
}
|
|
431
474
|
}
|
|
432
|
-
if (attrDef.min !==
|
|
475
|
+
if (attrDef.min !== void 0) {
|
|
433
476
|
if (typeof fact.v === "number" && fact.v < attrDef.min) {
|
|
434
477
|
errors.push({
|
|
435
478
|
entityId,
|
|
@@ -449,7 +492,7 @@ function validateEntity(entityId, store, registry) {
|
|
|
449
492
|
});
|
|
450
493
|
}
|
|
451
494
|
}
|
|
452
|
-
if (attrDef.max !==
|
|
495
|
+
if (attrDef.max !== void 0) {
|
|
453
496
|
if (typeof fact.v === "number" && fact.v > attrDef.max) {
|
|
454
497
|
errors.push({
|
|
455
498
|
entityId,
|
|
@@ -472,11 +515,9 @@ function validateEntity(entityId, store, registry) {
|
|
|
472
515
|
}
|
|
473
516
|
const links = store.getLinksByEntity(entityId);
|
|
474
517
|
for (const link of links) {
|
|
475
|
-
if (link.e1 !== entityId)
|
|
476
|
-
continue;
|
|
518
|
+
if (link.e1 !== entityId) continue;
|
|
477
519
|
const relDef = registry.getRelationDef(link.a);
|
|
478
|
-
if (!relDef)
|
|
479
|
-
continue;
|
|
520
|
+
if (!relDef) continue;
|
|
480
521
|
if (!relDef.sourceTypes.includes(entityType)) {
|
|
481
522
|
errors.push({
|
|
482
523
|
entityId,
|
|
@@ -521,32 +562,26 @@ function validateStore(store, registry) {
|
|
|
521
562
|
};
|
|
522
563
|
}
|
|
523
564
|
function validateAttrType(value, def) {
|
|
524
|
-
if (def.type === "any")
|
|
525
|
-
return null;
|
|
565
|
+
if (def.type === "any") return null;
|
|
526
566
|
switch (def.type) {
|
|
527
567
|
case "string":
|
|
528
|
-
if (typeof value !== "string")
|
|
529
|
-
return `Expected string, got ${typeof value}.`;
|
|
568
|
+
if (typeof value !== "string") return `Expected string, got ${typeof value}.`;
|
|
530
569
|
break;
|
|
531
570
|
case "number":
|
|
532
|
-
if (typeof value !== "number")
|
|
533
|
-
return `Expected number, got ${typeof value}.`;
|
|
571
|
+
if (typeof value !== "number") return `Expected number, got ${typeof value}.`;
|
|
534
572
|
break;
|
|
535
573
|
case "boolean":
|
|
536
|
-
if (typeof value !== "boolean")
|
|
537
|
-
return `Expected boolean, got ${typeof value}.`;
|
|
574
|
+
if (typeof value !== "boolean") return `Expected boolean, got ${typeof value}.`;
|
|
538
575
|
break;
|
|
539
576
|
case "date":
|
|
540
577
|
if (typeof value === "string") {
|
|
541
|
-
if (isNaN(Date.parse(value)))
|
|
542
|
-
return `Expected ISO date string, got "${value}".`;
|
|
578
|
+
if (isNaN(Date.parse(value))) return `Expected ISO date string, got "${value}".`;
|
|
543
579
|
} else if (!(value instanceof Date)) {
|
|
544
580
|
return `Expected date, got ${typeof value}.`;
|
|
545
581
|
}
|
|
546
582
|
break;
|
|
547
583
|
case "ref":
|
|
548
|
-
if (typeof value !== "string")
|
|
549
|
-
return `Expected entity reference (string), got ${typeof value}.`;
|
|
584
|
+
if (typeof value !== "string") return `Expected entity reference (string), got ${typeof value}.`;
|
|
550
585
|
break;
|
|
551
586
|
}
|
|
552
587
|
return null;
|
|
@@ -558,45 +593,53 @@ function createValidationMiddleware(registry, options) {
|
|
|
558
593
|
handleOp: (op, ctx, next) => {
|
|
559
594
|
if (op.facts && op.facts.length > 0) {
|
|
560
595
|
for (const fact of op.facts) {
|
|
561
|
-
if (fact.a === "type")
|
|
562
|
-
|
|
563
|
-
if (fact.a === "createdAt" || fact.a === "updatedAt")
|
|
564
|
-
continue;
|
|
596
|
+
if (fact.a === "type") continue;
|
|
597
|
+
if (fact.a === "createdAt" || fact.a === "updatedAt") continue;
|
|
565
598
|
const typeFact = op.facts.find((f) => f.e === fact.e && f.a === "type");
|
|
566
|
-
if (!typeFact)
|
|
567
|
-
continue;
|
|
599
|
+
if (!typeFact) continue;
|
|
568
600
|
const entityType = String(typeFact.v);
|
|
569
601
|
const def = registry.getEntityDef(entityType);
|
|
570
602
|
if (!def) {
|
|
571
603
|
if (strict) {
|
|
572
|
-
throw new Error(
|
|
604
|
+
throw new Error(
|
|
605
|
+
`[ontology-validator] Unknown entity type "${entityType}" for entity "${fact.e}".`
|
|
606
|
+
);
|
|
573
607
|
}
|
|
574
608
|
continue;
|
|
575
609
|
}
|
|
576
610
|
const attrDef = def.attributes.find((a) => a.name === fact.a);
|
|
577
611
|
if (!attrDef) {
|
|
578
612
|
if (strict) {
|
|
579
|
-
throw new Error(
|
|
613
|
+
throw new Error(
|
|
614
|
+
`[ontology-validator] Unknown attribute "${fact.a}" for type "${entityType}".`
|
|
615
|
+
);
|
|
580
616
|
}
|
|
581
617
|
continue;
|
|
582
618
|
}
|
|
583
619
|
const typeErr = validateAttrType(fact.v, attrDef);
|
|
584
620
|
if (typeErr) {
|
|
585
|
-
throw new Error(
|
|
621
|
+
throw new Error(
|
|
622
|
+
`[ontology-validator] Entity "${fact.e}" attribute "${fact.a}": ${typeErr}`
|
|
623
|
+
);
|
|
586
624
|
}
|
|
587
625
|
if (attrDef.enum && !attrDef.enum.includes(fact.v)) {
|
|
588
|
-
throw new Error(
|
|
626
|
+
throw new Error(
|
|
627
|
+
`[ontology-validator] Entity "${fact.e}" attribute "${fact.a}": value "${fact.v}" not in [${attrDef.enum.join(", ")}].`
|
|
628
|
+
);
|
|
589
629
|
}
|
|
590
630
|
}
|
|
591
631
|
}
|
|
592
632
|
if (op.links && op.links.length > 0) {
|
|
593
633
|
for (const link of op.links) {
|
|
594
634
|
const relDef = registry.getRelationDef(link.a);
|
|
595
|
-
if (!relDef)
|
|
596
|
-
|
|
597
|
-
|
|
635
|
+
if (!relDef) continue;
|
|
636
|
+
const sourceTypeFact = op.facts?.find(
|
|
637
|
+
(f) => f.e === link.e1 && f.a === "type"
|
|
638
|
+
);
|
|
598
639
|
if (sourceTypeFact && !relDef.sourceTypes.includes(String(sourceTypeFact.v))) {
|
|
599
|
-
throw new Error(
|
|
640
|
+
throw new Error(
|
|
641
|
+
`[ontology-validator] Relation "${link.a}": source type "${sourceTypeFact.v}" not allowed (expected: ${relDef.sourceTypes.join(", ")}).`
|
|
642
|
+
);
|
|
600
643
|
}
|
|
601
644
|
}
|
|
602
645
|
}
|
|
@@ -604,4 +647,14 @@ function createValidationMiddleware(registry, options) {
|
|
|
604
647
|
}
|
|
605
648
|
};
|
|
606
649
|
}
|
|
607
|
-
|
|
650
|
+
|
|
651
|
+
export {
|
|
652
|
+
OntologyRegistry,
|
|
653
|
+
projectOntology,
|
|
654
|
+
teamOntology,
|
|
655
|
+
agentOntology,
|
|
656
|
+
builtinOntologies,
|
|
657
|
+
validateEntity,
|
|
658
|
+
validateStore,
|
|
659
|
+
createValidationMiddleware
|
|
660
|
+
};
|