@unbrained/pm-cli 2026.7.18 → 2026.7.19
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/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +17 -0
- package/dist/cli/commands/claim.js +6 -4
- package/dist/cli/commands/claim.js.map +1 -1
- package/dist/cli/commands/comments.js +5 -2
- package/dist/cli/commands/comments.js.map +1 -1
- package/dist/cli/commands/context.d.ts +10 -1
- package/dist/cli/commands/context.js +44 -6
- package/dist/cli/commands/context.js.map +1 -1
- package/dist/cli/commands/create.js +15 -4
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/cli/commands/next.js +13 -3
- package/dist/cli/commands/next.js.map +1 -1
- package/dist/cli/commands/update.js +14 -3
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/error-guidance.js +23 -4
- package/dist/cli/error-guidance.js.map +1 -1
- package/dist/cli/extension-command-help.d.ts +11 -0
- package/dist/cli/extension-command-help.js +62 -2
- package/dist/cli/extension-command-help.js.map +1 -1
- package/dist/cli/main.d.ts +1 -0
- package/dist/cli/main.js +16 -11
- package/dist/cli/main.js.map +1 -1
- package/dist/cli-bundle/bundle-manifest.json +326 -350
- package/dist/cli-bundle/chunks/{append-5YF3TO7I.js → append-MBXHNWSX.js} +5 -5
- package/dist/cli-bundle/chunks/append-XUYF7NON.js +11 -0
- package/dist/cli-bundle/chunks/{chunk-BIRYX32V.js → chunk-2UCG5H6B.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-VE6ZSTQW.js → chunk-2XPDCXK5.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-I3INI567.js → chunk-3EZZTFL2.js} +909 -124
- package/dist/cli-bundle/chunks/chunk-3EZZTFL2.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-GLZKZON6.js → chunk-3HSRP6T2.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-XWBD6DSR.js → chunk-3KPNOZOH.js} +23 -23
- package/dist/cli-bundle/chunks/{chunk-MR4SHYR4.js → chunk-3QNUDDY2.js} +104 -23
- package/dist/cli-bundle/chunks/chunk-3QNUDDY2.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-SIPOACV5.js → chunk-46Z6FAVP.js} +888 -124
- package/dist/cli-bundle/chunks/chunk-46Z6FAVP.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-HO4DLBNK.js → chunk-4M6RZJXF.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-RXPQ5Q23.js → chunk-4PSJVGRE.js} +11 -11
- package/dist/cli-bundle/chunks/{chunk-ADXDCAKP.js → chunk-5S6IZXK7.js} +146 -32
- package/dist/cli-bundle/chunks/{chunk-IL5SPRMH.js.map → chunk-5S6IZXK7.js.map} +7 -1
- package/dist/cli-bundle/chunks/chunk-66SRNEBK.js +143 -0
- package/dist/cli-bundle/chunks/chunk-66SRNEBK.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-YFE7JHX3.js → chunk-6BNV3G6C.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-43UMFKCK.js → chunk-6V4T4RD3.js} +23 -23
- package/dist/cli-bundle/chunks/chunk-77XFQRTD.js +140 -0
- package/dist/cli-bundle/chunks/chunk-77XFQRTD.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-EHJFUOXL.js → chunk-7B7IHMLH.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-I7DIDUSP.js → chunk-7CHWLT2J.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-L6FVNR7X.js → chunk-A3GAQLBH.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-B57RJHBZ.js → chunk-A4FVWFZY.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-D52ZN3BF.js → chunk-A5EQPNV7.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-TZAE66GQ.js → chunk-AGEBQRBG.js} +15 -15
- package/dist/cli-bundle/chunks/{chunk-WU3KAN6A.js → chunk-AQUNTB7G.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-OGVTB5VO.js → chunk-AR24KW26.js} +237 -36
- package/dist/cli-bundle/chunks/chunk-AR24KW26.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-XWYQ2LT4.js → chunk-BBGR4FKQ.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-HTXXXF45.js → chunk-BDC4TW4B.js} +98 -24
- package/dist/cli-bundle/chunks/chunk-BDC4TW4B.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-2FUOXSRN.js → chunk-BFJP4VYC.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-633PKXLT.js → chunk-BZKE2O5V.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-XPUTSGJU.js → chunk-CZA2DXCV.js} +230 -36
- package/dist/cli-bundle/chunks/chunk-CZA2DXCV.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-KX62NMZC.js → chunk-D35WYXWC.js} +626 -5
- package/dist/cli-bundle/chunks/chunk-D35WYXWC.js.map +1 -0
- package/dist/cli-bundle/chunks/chunk-DOASIOQR.js +289 -0
- package/dist/cli-bundle/chunks/chunk-DOASIOQR.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-L337QKWJ.js → chunk-DUDLSQFG.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-BVLOMU6O.js → chunk-E7KBMWEF.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-3QDR6ZLU.js → chunk-EAV3P54W.js} +9 -9
- package/dist/cli-bundle/chunks/{chunk-3QDR6ZLU.js.map → chunk-EAV3P54W.js.map} +2 -2
- package/dist/cli-bundle/chunks/{chunk-WQXRZMFN.js → chunk-EEECAV5M.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-35FHWD4C.js → chunk-EI3UIMZM.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-RGMWJLXF.js → chunk-EVAN5VJA.js} +8 -5
- package/dist/cli-bundle/chunks/{chunk-RGMWJLXF.js.map → chunk-EVAN5VJA.js.map} +2 -2
- package/dist/cli-bundle/chunks/{chunk-PT7MCCGD.js → chunk-FIUTBFC6.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-7H5NNCJ5.js → chunk-FQF6VVPH.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-6DYOZS6C.js → chunk-FQO5THHM.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-5HGZKQUL.js → chunk-FQODDTE7.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-67RO3H4N.js → chunk-G33XIMRT.js} +6 -6
- package/dist/cli-bundle/chunks/{chunk-D53RTYVI.js → chunk-GFZB5CLP.js} +20 -10
- package/dist/cli-bundle/chunks/chunk-GFZB5CLP.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-QWBKN3QC.js → chunk-GKCEEXMA.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-DG2EQRIH.js → chunk-GRDK25BN.js} +7 -7
- package/dist/cli-bundle/chunks/{chunk-FXFCFL73.js → chunk-H3YKUVDR.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-IL5SPRMH.js → chunk-IEMXESIS.js} +123 -16
- package/dist/cli-bundle/chunks/chunk-IEMXESIS.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-ARGDWQ4J.js → chunk-IGBBTPM5.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-QPGQNLPI.js → chunk-IR3GOO6E.js} +3842 -4109
- package/dist/cli-bundle/chunks/chunk-IR3GOO6E.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-FY4RLHSC.js → chunk-IRJ6F23W.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-66MKH7SZ.js → chunk-IXG5CMBR.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-F3VC3GOV.js → chunk-JBW2S2C6.js} +2090 -253
- package/dist/cli-bundle/chunks/chunk-JBW2S2C6.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-7UCY6DR5.js → chunk-JPWUZOMR.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-FVNWHUME.js → chunk-K2L6FZBX.js} +8 -8
- package/dist/cli-bundle/chunks/chunk-KGPLSHJD.js +286 -0
- package/dist/cli-bundle/chunks/chunk-KGPLSHJD.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-YQEZWI3R.js → chunk-KZ5AC6B5.js} +5 -3
- package/dist/cli-bundle/chunks/chunk-KZ5AC6B5.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-X2MGQMZO.js → chunk-LT5UWU7H.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-KH6QAHME.js → chunk-M4B4RK4J.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-QRZNCRNA.js → chunk-MI3346YW.js} +377 -240
- package/dist/cli-bundle/chunks/chunk-MI3346YW.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-2XOSFSTH.js → chunk-MQOSMBWV.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-YIIIAKCE.js → chunk-MRXAHR4B.js} +28 -22
- package/dist/cli-bundle/chunks/chunk-MRXAHR4B.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-7R6UIHYY.js → chunk-N2TEEOXJ.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-NTRQLE2R.js → chunk-N7FCFJ76.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-37DRDP2B.js → chunk-NPEYH6CE.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-GKPCTQYG.js → chunk-NTS2RKHN.js} +3942 -4216
- package/dist/cli-bundle/chunks/chunk-NTS2RKHN.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-6VHUGVNP.js → chunk-ODEIDKGW.js} +2062 -246
- package/dist/cli-bundle/chunks/chunk-ODEIDKGW.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-2CXL335K.js → chunk-OK7VSX3N.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-NNANAWFH.js → chunk-OKPZDH43.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-G6MYGULG.js → chunk-OKWJUL6F.js} +6 -6
- package/dist/cli-bundle/chunks/{chunk-HPAYDSR2.js → chunk-P24ZU5QV.js} +27 -21
- package/dist/cli-bundle/chunks/chunk-P24ZU5QV.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-TGBTLGPX.js → chunk-Q4PSG2GV.js} +13 -4
- package/dist/cli-bundle/chunks/{chunk-TGBTLGPX.js.map → chunk-Q4PSG2GV.js.map} +1 -1
- package/dist/cli-bundle/chunks/{chunk-5UKQLQM2.js → chunk-Q5NHJ6RO.js} +6 -4
- package/dist/cli-bundle/chunks/chunk-Q5NHJ6RO.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-D5XHO4Q7.js → chunk-Q6JPYR7I.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-P22HGFFI.js → chunk-QFG4MB7P.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-P22HGFFI.js.map → chunk-QFG4MB7P.js.map} +1 -1
- package/dist/cli-bundle/chunks/{chunk-IE5KRAKN.js → chunk-QQ77W23U.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-M7MVOKVV.js → chunk-QYGK2XQ3.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-646MQXFW.js → chunk-RLLOZAM2.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-646MQXFW.js.map → chunk-RLLOZAM2.js.map} +2 -2
- package/dist/cli-bundle/chunks/{chunk-X5YCTFKT.js → chunk-RWAIRGBC.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-W5E2UUSH.js → chunk-RX53WHFI.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-R5XTTZSJ.js → chunk-SBW7EQC4.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-TM5CIO3F.js → chunk-SGJB6PXA.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-DDFGYUCQ.js → chunk-STBCBDKF.js} +7 -7
- package/dist/cli-bundle/chunks/{chunk-EX7OQT3Y.js → chunk-SUNZKVAH.js} +10 -10
- package/dist/cli-bundle/chunks/{chunk-EX7OQT3Y.js.map → chunk-SUNZKVAH.js.map} +1 -1
- package/dist/cli-bundle/chunks/{chunk-FHOBCGQO.js → chunk-SVAWG7EE.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-6O44IN44.js → chunk-T6MOTLOJ.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-HSYV4ZYT.js → chunk-TELI67UP.js} +9 -6
- package/dist/cli-bundle/chunks/{chunk-HSYV4ZYT.js.map → chunk-TELI67UP.js.map} +1 -1
- package/dist/cli-bundle/chunks/{chunk-EWIT5WIC.js → chunk-U6RYD446.js} +11 -11
- package/dist/cli-bundle/chunks/{chunk-E4FXM2XB.js → chunk-UE7LK3RE.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-N33FD2UI.js → chunk-UNNCT5QY.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-2IPNL3DR.js → chunk-UOIFZ66L.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-LSOWTLEM.js → chunk-UU6EP25G.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-HYTOJW2Q.js → chunk-UW6HCMP2.js} +15 -15
- package/dist/cli-bundle/chunks/{chunk-47HXN6RX.js → chunk-UWAQI3B7.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-YKFHF37B.js → chunk-V4QHAMI5.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-VAHZIPWS.js → chunk-VA3H7VVC.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-XC2HEEOV.js → chunk-VFA5EIEN.js} +21 -11
- package/dist/cli-bundle/chunks/chunk-VFA5EIEN.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-TLWJP5BF.js → chunk-VQOG2ETB.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-H5IOT54C.js → chunk-VSQE43NO.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-BDA35QG5.js → chunk-W6IEJXNC.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-WACRQ26A.js → chunk-WCBB6VI3.js} +637 -9
- package/dist/cli-bundle/chunks/chunk-WCBB6VI3.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-OWP6QFBV.js → chunk-XDWXPG2E.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-CKX4WOPC.js → chunk-XKVHL3MB.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-WL3SS45P.js → chunk-XVB6BATY.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-NVZ6NVHJ.js → chunk-XXWDEQ6O.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-ILVOOAT4.js → chunk-Y2VSGFT4.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-NCVT6XEL.js → chunk-YG56M3NE.js} +11 -11
- package/dist/cli-bundle/chunks/{chunk-AFGKSHAM.js → chunk-YGEA4CLH.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-AXRT7K5V.js → chunk-YIC5NGXF.js} +11 -11
- package/dist/cli-bundle/chunks/{chunk-DHNG452T.js → chunk-ZF52NVRT.js} +396 -245
- package/dist/cli-bundle/chunks/chunk-ZF52NVRT.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-XXLXJL7V.js → chunk-ZUCBPXNA.js} +4 -4
- package/dist/cli-bundle/chunks/{close-X3CF6FQP.js → close-7NWA3GLA.js} +5 -5
- package/dist/cli-bundle/chunks/close-ZZCDDWJT.js +12 -0
- package/dist/cli-bundle/chunks/close-many-QCZHFCON.js +23 -0
- package/dist/cli-bundle/chunks/{close-many-J7A5EHOQ.js → close-many-YALQ7AXS.js} +14 -14
- package/dist/cli-bundle/chunks/comments-FMQNYPSZ.js +13 -0
- package/dist/cli-bundle/chunks/{comments-TMHMALA5.js → comments-SQIQ5WYR.js} +7 -7
- package/dist/cli-bundle/chunks/copy-GI3RCVZP.js +9 -0
- package/dist/cli-bundle/chunks/{copy-FWQA5OU4.js → copy-YDAMENCP.js} +4 -4
- package/dist/cli-bundle/chunks/{create-AQ5SIGZC.js → create-JSL6CXU3.js} +11 -9
- package/dist/cli-bundle/chunks/create-LXMLYJNM.js +29 -0
- package/dist/cli-bundle/chunks/delete-5DFAXJNI.js +10 -0
- package/dist/cli-bundle/chunks/{delete-YYYFOSEA.js → delete-IGVOZEU2.js} +4 -4
- package/dist/cli-bundle/chunks/{deps-NIIKXLPB.js → deps-BQAXUQAK.js} +6 -6
- package/dist/cli-bundle/chunks/{deps-MQ4ZIGZB.js → deps-CBPPSS6J.js} +6 -6
- package/dist/cli-bundle/chunks/docs-KCWPLQOV.js +14 -0
- package/dist/cli-bundle/chunks/{docs-53NUGMIQ.js → docs-NS2AZWCN.js} +7 -7
- package/dist/cli-bundle/chunks/{files-3PXGXYDB.js → files-PVWEPT5J.js} +7 -7
- package/dist/cli-bundle/chunks/{files-EGLKHD7O.js → files-XUUBQ76I.js} +7 -7
- package/dist/cli-bundle/chunks/focus-3EJVFI3D.js +10 -0
- package/dist/cli-bundle/chunks/{focus-SRPASFTN.js → focus-DHBHKK3E.js} +5 -5
- package/dist/cli-bundle/chunks/{history-compact-G4DULDCX.js → history-compact-3TNPYVFG.js} +6 -6
- package/dist/cli-bundle/chunks/history-compact-JHYVDYLW.js +16 -0
- package/dist/cli-bundle/chunks/{history-redact-IUSJ6X3E.js → history-redact-ELRL73XN.js} +4 -4
- package/dist/cli-bundle/chunks/{history-redact-THHGRQXV.js → history-redact-KKFDICCF.js} +4 -4
- package/dist/cli-bundle/chunks/{history-repair-LUQWRS7X.js → history-repair-J7WKZFAG.js} +6 -6
- package/dist/cli-bundle/chunks/history-repair-REMI7DDI.js +16 -0
- package/dist/cli-bundle/chunks/learnings-O6V5WDCV.js +13 -0
- package/dist/cli-bundle/chunks/{learnings-2MRNBFJF.js → learnings-X4D6JCCG.js} +7 -7
- package/dist/cli-bundle/chunks/{notes-73JWKWUD.js → notes-UQC6VS6N.js} +7 -7
- package/dist/cli-bundle/chunks/notes-ZSZREWZA.js +13 -0
- package/dist/cli-bundle/chunks/{plan-AZPMCG37.js → plan-5GKRBJJO.js} +12 -10
- package/dist/cli-bundle/chunks/plan-EZW2YDDY.js +26 -0
- package/dist/cli-bundle/chunks/{profile-AVCIIZID.js → profile-5PQAPCLF.js} +10 -10
- package/dist/cli-bundle/chunks/{profile-LFYO3HHX.js → profile-CW4BD3FO.js} +10 -10
- package/dist/cli-bundle/chunks/{register-list-query-UKMF55FT.js → register-list-query-HTDQE6VI.js} +24 -24
- package/dist/cli-bundle/chunks/{register-list-query-MZUF2EEC.js → register-list-query-PHIPDFP2.js} +24 -24
- package/dist/cli-bundle/chunks/{register-mutation-T6RVNJC4.js → register-mutation-BLEWM5I6.js} +32 -32
- package/dist/cli-bundle/chunks/{register-mutation-2PBW2GEX.js → register-mutation-OTYHR7J6.js} +32 -32
- package/dist/cli-bundle/chunks/{register-operations-KHZYR6MG.js → register-operations-AMCUFYEW.js} +38 -40
- package/dist/cli-bundle/chunks/{register-operations-KHZYR6MG.js.map → register-operations-AMCUFYEW.js.map} +1 -1
- package/dist/cli-bundle/chunks/{register-operations-WPQ2LWZJ.js → register-operations-MRLHOZYR.js} +36 -38
- package/dist/cli-bundle/chunks/{register-operations-WPQ2LWZJ.js.map → register-operations-MRLHOZYR.js.map} +1 -1
- package/dist/cli-bundle/chunks/{register-setup-PGDNOXDQ.js → register-setup-N2FOSWAG.js} +15 -17
- package/dist/cli-bundle/chunks/{register-setup-PGDNOXDQ.js.map → register-setup-N2FOSWAG.js.map} +1 -1
- package/dist/cli-bundle/chunks/{register-setup-TDN7WAO6.js → register-setup-ZVKTDL4G.js} +17 -19
- package/dist/cli-bundle/chunks/{register-setup-TDN7WAO6.js.map → register-setup-ZVKTDL4G.js.map} +1 -1
- package/dist/cli-bundle/chunks/restore-A55MLFAI.js +14 -0
- package/dist/cli-bundle/chunks/{restore-E3PRGDN3.js → restore-HEQAG6EK.js} +6 -6
- package/dist/cli-bundle/chunks/{schema-5JNFQFUW.js → schema-MAXAIHEC.js} +6 -6
- package/dist/cli-bundle/chunks/{schema-TMIW4XZC.js → schema-Q5DAWJ2S.js} +6 -6
- package/dist/cli-bundle/chunks/update-5DTSCWVF.js +23 -0
- package/dist/cli-bundle/chunks/{update-SQYZA3ZW.js → update-DWFXXJKP.js} +15 -13
- package/dist/cli-bundle/chunks/update-many-6T4ZLZS7.js +34 -0
- package/dist/cli-bundle/chunks/update-many-MYRK6VBJ.js +38 -0
- package/dist/cli-bundle/main.js +152 -29
- package/dist/cli-bundle/main.js.map +3 -3
- package/dist/cli-bundle/sdk-runtime.js +72 -75
- package/dist/cli-bundle/sdk-testing.js +8 -8
- package/dist/cli-bundle/sdk.js +288 -642
- package/dist/cli-bundle/sdk.js.map +4 -4
- package/dist/core/extensions/activation-summary.d.ts +2 -0
- package/dist/core/extensions/activation-summary.js +7 -2
- package/dist/core/extensions/activation-summary.js.map +1 -1
- package/dist/core/extensions/capability-usage.d.ts +1 -1
- package/dist/core/extensions/capability-usage.js +5 -2
- package/dist/core/extensions/capability-usage.js.map +1 -1
- package/dist/core/extensions/extension-hook-runtime.js +3 -2
- package/dist/core/extensions/extension-hook-runtime.js.map +1 -1
- package/dist/core/extensions/extension-registries.js +3 -2
- package/dist/core/extensions/extension-registries.js.map +1 -1
- package/dist/core/extensions/extension-types.d.ts +38 -1
- package/dist/core/extensions/extension-types.js +3 -2
- package/dist/core/extensions/extension-types.js.map +1 -1
- package/dist/core/extensions/loader.js +36 -2
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/store/item-store.d.ts +4 -1
- package/dist/core/store/item-store.js +3 -3
- package/dist/core/store/item-store.js.map +1 -1
- package/dist/core/store/paths.d.ts +2 -0
- package/dist/core/store/paths.js +26 -3
- package/dist/core/store/paths.js.map +1 -1
- package/dist/sdk/cli-contracts/enum-contracts.d.ts +1 -1
- package/dist/sdk/compose.d.ts +3 -0
- package/dist/sdk/compose.js +14 -2
- package/dist/sdk/compose.js.map +1 -1
- package/dist/sdk/dependencies.js +3 -3
- package/dist/sdk/dependencies.js.map +1 -1
- package/dist/sdk/extension-command-context.d.ts +10 -0
- package/dist/sdk/extension-command-context.js +30 -0
- package/dist/sdk/extension-command-context.js.map +1 -0
- package/dist/sdk/graph/assembly.js +14 -4
- package/dist/sdk/graph/assembly.js.map +1 -1
- package/dist/sdk/graph/index.d.ts +1 -0
- package/dist/sdk/graph/index.js +3 -2
- package/dist/sdk/graph/index.js.map +1 -1
- package/dist/sdk/graph/mutation-advisory.d.ts +20 -0
- package/dist/sdk/graph/mutation-advisory.js +80 -0
- package/dist/sdk/graph/mutation-advisory.js.map +1 -0
- package/dist/sdk/graph/run.d.ts +5 -1
- package/dist/sdk/graph/run.js +11 -3
- package/dist/sdk/graph/run.js.map +1 -1
- package/dist/sdk/index.d.ts +4 -1
- package/dist/sdk/index.js +5 -2
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/ownership-source.d.ts +2 -0
- package/dist/sdk/ownership-source.js +22 -0
- package/dist/sdk/ownership-source.js.map +1 -0
- package/dist/sdk/relationship-history.d.ts +38 -0
- package/dist/sdk/relationship-history.js +60 -2
- package/dist/sdk/relationship-history.js.map +1 -1
- package/dist/sdk/relationships.js +49 -8
- package/dist/sdk/relationships.js.map +1 -1
- package/dist/sdk/runtime-input.js +3 -2
- package/dist/sdk/runtime-input.js.map +1 -1
- package/dist/sdk/runtime.d.ts +2 -0
- package/dist/sdk/runtime.js +19 -2
- package/dist/sdk/runtime.js.map +1 -1
- package/dist/sdk/tracker-root-discovery.d.ts +6 -0
- package/dist/sdk/tracker-root-discovery.js +10 -0
- package/dist/sdk/tracker-root-discovery.js.map +1 -0
- package/dist/sdk/workspace-transaction.d.ts +83 -0
- package/dist/sdk/workspace-transaction.js +364 -0
- package/dist/sdk/workspace-transaction.js.map +1 -0
- package/docs/AGENT_UX_CONTRACTS.md +41 -0
- package/docs/EXTENSIONS.md +4 -4
- package/docs/README.md +1 -0
- package/docs/SDK.md +102 -1
- package/marketplace.json +2 -2
- package/package.json +1 -1
- package/packages/pm-beads/package.json +1 -1
- package/packages/pm-calendar/package.json +1 -1
- package/packages/pm-command-kit/package.json +1 -1
- package/packages/pm-governance-audit/package.json +1 -1
- package/packages/pm-guide-shell/package.json +1 -1
- package/packages/pm-kanban/package.json +1 -1
- package/packages/pm-lifecycle-hooks/package.json +1 -1
- package/packages/pm-linked-test-adapters/package.json +1 -1
- package/packages/pm-search-advanced/package.json +1 -1
- package/packages/pm-templates/package.json +1 -1
- package/packages/pm-todos/package.json +1 -1
- package/packages/pm-vcs/GAP_REPORT.md +31 -0
- package/packages/pm-vcs/README.md +62 -0
- package/packages/pm-vcs/extensions/vcs/index.ts +745 -0
- package/packages/pm-vcs/extensions/vcs/manifest.json +19 -0
- package/packages/pm-vcs/extensions/vcs/package.json +3 -0
- package/packages/pm-vcs/package.json +55 -0
- package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
- package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
- package/dist/cli-bundle/chunks/append-JHO5K6RP.js +0 -11
- package/dist/cli-bundle/chunks/chunk-2BX74BAS.js +0 -125
- package/dist/cli-bundle/chunks/chunk-2BX74BAS.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-3CUQZNQ6.js +0 -672
- package/dist/cli-bundle/chunks/chunk-3CUQZNQ6.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-5UKQLQM2.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-6VHUGVNP.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-74FKFFXO.js +0 -172
- package/dist/cli-bundle/chunks/chunk-74FKFFXO.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-ADXDCAKP.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-BAP7G3N2.js +0 -178
- package/dist/cli-bundle/chunks/chunk-BAP7G3N2.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-D53RTYVI.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-DHNG452T.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-EY7ZE3TG.js +0 -1831
- package/dist/cli-bundle/chunks/chunk-EY7ZE3TG.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-F3VC3GOV.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-FL4D53ND.js +0 -162
- package/dist/cli-bundle/chunks/chunk-FL4D53ND.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-GKPCTQYG.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-HPAYDSR2.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-HTXXXF45.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-I3INI567.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-KX62NMZC.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-L5BTTDU5.js +0 -662
- package/dist/cli-bundle/chunks/chunk-L5BTTDU5.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-MR4SHYR4.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-OGVTB5VO.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-QPGQNLPI.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-QRZNCRNA.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-RC4UOUXA.js +0 -122
- package/dist/cli-bundle/chunks/chunk-RC4UOUXA.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-RTBX3C4C.js +0 -1841
- package/dist/cli-bundle/chunks/chunk-RTBX3C4C.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-SIPOACV5.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-WACRQ26A.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-XC2HEEOV.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-XPUTSGJU.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-YIIIAKCE.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-YJSURTBB.js +0 -175
- package/dist/cli-bundle/chunks/chunk-YJSURTBB.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-YQEZWI3R.js.map +0 -7
- package/dist/cli-bundle/chunks/close-GPD7DTJV.js +0 -12
- package/dist/cli-bundle/chunks/close-many-NQLYGPYW.js +0 -23
- package/dist/cli-bundle/chunks/comments-2AOZQ5D2.js +0 -13
- package/dist/cli-bundle/chunks/copy-N3LCQBMC.js +0 -9
- package/dist/cli-bundle/chunks/create-KOGQ3JKD.js +0 -27
- package/dist/cli-bundle/chunks/delete-6G3MBZ6S.js +0 -10
- package/dist/cli-bundle/chunks/docs-OWRGDMNY.js +0 -14
- package/dist/cli-bundle/chunks/focus-KZLIA6WS.js +0 -10
- package/dist/cli-bundle/chunks/history-compact-HHIUOMZ7.js +0 -16
- package/dist/cli-bundle/chunks/history-repair-KG7SWXI6.js +0 -16
- package/dist/cli-bundle/chunks/learnings-ZVHSALJY.js +0 -13
- package/dist/cli-bundle/chunks/notes-BAKUL5DJ.js +0 -13
- package/dist/cli-bundle/chunks/plan-LEAGLPGP.js +0 -24
- package/dist/cli-bundle/chunks/restore-KIUYTAEJ.js +0 -14
- package/dist/cli-bundle/chunks/update-XZJYS5X7.js +0 -21
- package/dist/cli-bundle/chunks/update-many-R24B3GBK.js +0 -36
- package/dist/cli-bundle/chunks/update-many-WQ3R3J6N.js +0 -32
- /package/dist/cli-bundle/chunks/{append-5YF3TO7I.js.map → append-MBXHNWSX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{append-JHO5K6RP.js.map → append-XUYF7NON.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-BIRYX32V.js.map → chunk-2UCG5H6B.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-VE6ZSTQW.js.map → chunk-2XPDCXK5.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-GLZKZON6.js.map → chunk-3HSRP6T2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-XWBD6DSR.js.map → chunk-3KPNOZOH.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-HO4DLBNK.js.map → chunk-4M6RZJXF.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-RXPQ5Q23.js.map → chunk-4PSJVGRE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-YFE7JHX3.js.map → chunk-6BNV3G6C.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-43UMFKCK.js.map → chunk-6V4T4RD3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-EHJFUOXL.js.map → chunk-7B7IHMLH.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-I7DIDUSP.js.map → chunk-7CHWLT2J.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-L6FVNR7X.js.map → chunk-A3GAQLBH.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-B57RJHBZ.js.map → chunk-A4FVWFZY.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-D52ZN3BF.js.map → chunk-A5EQPNV7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-TZAE66GQ.js.map → chunk-AGEBQRBG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-WU3KAN6A.js.map → chunk-AQUNTB7G.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-XWYQ2LT4.js.map → chunk-BBGR4FKQ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-2FUOXSRN.js.map → chunk-BFJP4VYC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-633PKXLT.js.map → chunk-BZKE2O5V.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-L337QKWJ.js.map → chunk-DUDLSQFG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-BVLOMU6O.js.map → chunk-E7KBMWEF.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-WQXRZMFN.js.map → chunk-EEECAV5M.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-35FHWD4C.js.map → chunk-EI3UIMZM.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-PT7MCCGD.js.map → chunk-FIUTBFC6.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-7H5NNCJ5.js.map → chunk-FQF6VVPH.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-6DYOZS6C.js.map → chunk-FQO5THHM.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-5HGZKQUL.js.map → chunk-FQODDTE7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-67RO3H4N.js.map → chunk-G33XIMRT.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-QWBKN3QC.js.map → chunk-GKCEEXMA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-DG2EQRIH.js.map → chunk-GRDK25BN.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-FXFCFL73.js.map → chunk-H3YKUVDR.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-ARGDWQ4J.js.map → chunk-IGBBTPM5.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-FY4RLHSC.js.map → chunk-IRJ6F23W.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-66MKH7SZ.js.map → chunk-IXG5CMBR.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-7UCY6DR5.js.map → chunk-JPWUZOMR.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-FVNWHUME.js.map → chunk-K2L6FZBX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-X2MGQMZO.js.map → chunk-LT5UWU7H.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-KH6QAHME.js.map → chunk-M4B4RK4J.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-2XOSFSTH.js.map → chunk-MQOSMBWV.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-7R6UIHYY.js.map → chunk-N2TEEOXJ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-NTRQLE2R.js.map → chunk-N7FCFJ76.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-37DRDP2B.js.map → chunk-NPEYH6CE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-2CXL335K.js.map → chunk-OK7VSX3N.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-NNANAWFH.js.map → chunk-OKPZDH43.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-G6MYGULG.js.map → chunk-OKWJUL6F.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-D5XHO4Q7.js.map → chunk-Q6JPYR7I.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-IE5KRAKN.js.map → chunk-QQ77W23U.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-M7MVOKVV.js.map → chunk-QYGK2XQ3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-X5YCTFKT.js.map → chunk-RWAIRGBC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-W5E2UUSH.js.map → chunk-RX53WHFI.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-R5XTTZSJ.js.map → chunk-SBW7EQC4.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-TM5CIO3F.js.map → chunk-SGJB6PXA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-DDFGYUCQ.js.map → chunk-STBCBDKF.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-FHOBCGQO.js.map → chunk-SVAWG7EE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-6O44IN44.js.map → chunk-T6MOTLOJ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-EWIT5WIC.js.map → chunk-U6RYD446.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-E4FXM2XB.js.map → chunk-UE7LK3RE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-N33FD2UI.js.map → chunk-UNNCT5QY.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-2IPNL3DR.js.map → chunk-UOIFZ66L.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-LSOWTLEM.js.map → chunk-UU6EP25G.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-HYTOJW2Q.js.map → chunk-UW6HCMP2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-47HXN6RX.js.map → chunk-UWAQI3B7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-YKFHF37B.js.map → chunk-V4QHAMI5.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-VAHZIPWS.js.map → chunk-VA3H7VVC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-TLWJP5BF.js.map → chunk-VQOG2ETB.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-H5IOT54C.js.map → chunk-VSQE43NO.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-BDA35QG5.js.map → chunk-W6IEJXNC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-OWP6QFBV.js.map → chunk-XDWXPG2E.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-CKX4WOPC.js.map → chunk-XKVHL3MB.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-WL3SS45P.js.map → chunk-XVB6BATY.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-NVZ6NVHJ.js.map → chunk-XXWDEQ6O.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-ILVOOAT4.js.map → chunk-Y2VSGFT4.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-NCVT6XEL.js.map → chunk-YG56M3NE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-AFGKSHAM.js.map → chunk-YGEA4CLH.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-AXRT7K5V.js.map → chunk-YIC5NGXF.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-XXLXJL7V.js.map → chunk-ZUCBPXNA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-X3CF6FQP.js.map → close-7NWA3GLA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-GPD7DTJV.js.map → close-ZZCDDWJT.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-many-NQLYGPYW.js.map → close-many-QCZHFCON.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-many-J7A5EHOQ.js.map → close-many-YALQ7AXS.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{comments-2AOZQ5D2.js.map → comments-FMQNYPSZ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{comments-TMHMALA5.js.map → comments-SQIQ5WYR.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{copy-N3LCQBMC.js.map → copy-GI3RCVZP.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{copy-FWQA5OU4.js.map → copy-YDAMENCP.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{create-AQ5SIGZC.js.map → create-JSL6CXU3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{create-KOGQ3JKD.js.map → create-LXMLYJNM.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{delete-6G3MBZ6S.js.map → delete-5DFAXJNI.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{delete-YYYFOSEA.js.map → delete-IGVOZEU2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{deps-NIIKXLPB.js.map → deps-BQAXUQAK.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{deps-MQ4ZIGZB.js.map → deps-CBPPSS6J.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{docs-OWRGDMNY.js.map → docs-KCWPLQOV.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{docs-53NUGMIQ.js.map → docs-NS2AZWCN.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{files-3PXGXYDB.js.map → files-PVWEPT5J.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{files-EGLKHD7O.js.map → files-XUUBQ76I.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{focus-KZLIA6WS.js.map → focus-3EJVFI3D.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{focus-SRPASFTN.js.map → focus-DHBHKK3E.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-compact-G4DULDCX.js.map → history-compact-3TNPYVFG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-compact-HHIUOMZ7.js.map → history-compact-JHYVDYLW.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-redact-IUSJ6X3E.js.map → history-redact-ELRL73XN.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-redact-THHGRQXV.js.map → history-redact-KKFDICCF.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-repair-LUQWRS7X.js.map → history-repair-J7WKZFAG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-repair-KG7SWXI6.js.map → history-repair-REMI7DDI.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{learnings-ZVHSALJY.js.map → learnings-O6V5WDCV.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{learnings-2MRNBFJF.js.map → learnings-X4D6JCCG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{notes-73JWKWUD.js.map → notes-UQC6VS6N.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{notes-BAKUL5DJ.js.map → notes-ZSZREWZA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{plan-AZPMCG37.js.map → plan-5GKRBJJO.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{plan-LEAGLPGP.js.map → plan-EZW2YDDY.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{profile-AVCIIZID.js.map → profile-5PQAPCLF.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{profile-LFYO3HHX.js.map → profile-CW4BD3FO.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-list-query-UKMF55FT.js.map → register-list-query-HTDQE6VI.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-list-query-MZUF2EEC.js.map → register-list-query-PHIPDFP2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-mutation-T6RVNJC4.js.map → register-mutation-BLEWM5I6.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-mutation-2PBW2GEX.js.map → register-mutation-OTYHR7J6.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{restore-KIUYTAEJ.js.map → restore-A55MLFAI.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{restore-E3PRGDN3.js.map → restore-HEQAG6EK.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{schema-5JNFQFUW.js.map → schema-MAXAIHEC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{schema-TMIW4XZC.js.map → schema-Q5DAWJ2S.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-XZJYS5X7.js.map → update-5DTSCWVF.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-SQYZA3ZW.js.map → update-DWFXXJKP.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-many-WQ3R3J6N.js.map → update-many-6T4ZLZS7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-many-R24B3GBK.js.map → update-many-MYRK6VBJ.js.map} +0 -0
|
@@ -47,6 +47,28 @@ export interface RelationshipEventPage {
|
|
|
47
47
|
/** Opaque continuation cursor when another page exists. */
|
|
48
48
|
nextCursor?: string;
|
|
49
49
|
}
|
|
50
|
+
/** Bounded controls for deterministic relationship-event batch iteration. */
|
|
51
|
+
export interface RelationshipEventStreamOptions {
|
|
52
|
+
/** One-based first event version to include. */
|
|
53
|
+
fromVersion?: number;
|
|
54
|
+
/** One-based final event version to include. */
|
|
55
|
+
toVersion?: number;
|
|
56
|
+
/** Maximum number of events yielded in each immutable batch. */
|
|
57
|
+
batchSize?: number;
|
|
58
|
+
}
|
|
59
|
+
/** Result of folding an immutable relationship-event prefix into domain state. */
|
|
60
|
+
export interface RelationshipEventProjection<State> {
|
|
61
|
+
/** Final projected state returned by the caller-owned reducer. */
|
|
62
|
+
state: State;
|
|
63
|
+
/** Final event sequence included in the projection. */
|
|
64
|
+
version: number;
|
|
65
|
+
/** Number of events processed by this projection. */
|
|
66
|
+
processed: number;
|
|
67
|
+
/** Timestamp of the final included event, when one exists. */
|
|
68
|
+
asOf?: string;
|
|
69
|
+
}
|
|
70
|
+
/** Pure reducer used to derive application state from relationship events. */
|
|
71
|
+
export type RelationshipEventReducer<State> = (state: State, event: RelationshipEvent) => State;
|
|
50
72
|
/** Construction controls for the in-memory reference ledger. */
|
|
51
73
|
export interface RelationshipEventLogOptions {
|
|
52
74
|
/** Registry defining edge semantics and cardinality. */
|
|
@@ -73,6 +95,15 @@ export declare class RelationshipEventLog {
|
|
|
73
95
|
get version(): number;
|
|
74
96
|
/** Return an immutable copy of the full event stream. */
|
|
75
97
|
events(): readonly RelationshipEvent[];
|
|
98
|
+
/**
|
|
99
|
+
* Iterate a stable event prefix in immutable, bounded batches. Consumers can
|
|
100
|
+
* build streaming projections without copying or exposing the mutable ledger.
|
|
101
|
+
* `fromVersion === toVersion + 1` is the intentional empty checkpoint range;
|
|
102
|
+
* larger watermarks are rejected as invalid for the selected prefix.
|
|
103
|
+
*/
|
|
104
|
+
stream(options?: RelationshipEventStreamOptions): Generator<readonly RelationshipEvent[]>;
|
|
105
|
+
/** Fold a selected immutable event prefix into caller-owned domain state. */
|
|
106
|
+
project<State>(initialState: State, reducer: RelationshipEventReducer<State>, options?: Omit<RelationshipEventStreamOptions, "batchSize">): RelationshipEventProjection<State>;
|
|
76
107
|
/** Validate and append one attributable relationship mutation. */
|
|
77
108
|
append(input: RelationshipEventInput): RelationshipEvent;
|
|
78
109
|
/** Materialize an exact point-in-time graph without mutating the ledger. */
|
|
@@ -106,4 +137,11 @@ export declare class RelationshipEventStore {
|
|
|
106
137
|
snapshot(options?: Parameters<RelationshipEventLog["snapshot"]>[0]): Promise<RelationshipSnapshot>;
|
|
107
138
|
/** Refresh from durable history and page immutable events. */
|
|
108
139
|
page(options: Parameters<RelationshipEventLog["page"]>[0]): Promise<RelationshipEventPage>;
|
|
140
|
+
/**
|
|
141
|
+
* Refresh once under the shared store lock, then stream a coherent immutable
|
|
142
|
+
* prefix without holding the writer lock while the consumer processes batches.
|
|
143
|
+
*/
|
|
144
|
+
stream(options?: RelationshipEventStreamOptions): AsyncGenerator<readonly RelationshipEvent[]>;
|
|
145
|
+
/** Refresh once and fold a coherent durable prefix into application state. */
|
|
146
|
+
project<State>(initialState: State, reducer: RelationshipEventReducer<State>, options?: Omit<RelationshipEventStreamOptions, "batchSize">): Promise<RelationshipEventProjection<State>>;
|
|
109
147
|
}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* optimistic concurrency, deterministic replay, snapshots, and cursor pages.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
8
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="b00bbd6d-eb0d-5fbf-8f87-456d479e7807")}catch(e){}}();
|
|
9
9
|
import { createQueryFingerprint, decodeQueryCursorState, paginateQueryRows, } from "./pagination.js";
|
|
10
10
|
import { constants } from "node:fs";
|
|
11
11
|
import { lstat, mkdir, open } from "node:fs/promises";
|
|
@@ -124,6 +124,51 @@ export class RelationshipEventLog {
|
|
|
124
124
|
events() {
|
|
125
125
|
return Object.freeze([...this.#events]);
|
|
126
126
|
}
|
|
127
|
+
/**
|
|
128
|
+
* Iterate a stable event prefix in immutable, bounded batches. Consumers can
|
|
129
|
+
* build streaming projections without copying or exposing the mutable ledger.
|
|
130
|
+
* `fromVersion === toVersion + 1` is the intentional empty checkpoint range;
|
|
131
|
+
* larger watermarks are rejected as invalid for the selected prefix.
|
|
132
|
+
*/
|
|
133
|
+
*stream(options = {}) {
|
|
134
|
+
const fromVersion = options.fromVersion ?? 1;
|
|
135
|
+
const toVersion = options.toVersion ?? this.version;
|
|
136
|
+
const batchSize = options.batchSize ?? 100;
|
|
137
|
+
if (!Number.isInteger(fromVersion) || fromVersion < 1)
|
|
138
|
+
throw new TypeError("Relationship event stream fromVersion must be positive");
|
|
139
|
+
if (!Number.isInteger(toVersion) ||
|
|
140
|
+
toVersion < 0 ||
|
|
141
|
+
toVersion > this.version)
|
|
142
|
+
throw new TypeError(`Relationship event stream toVersion out of range: ${toVersion}`);
|
|
143
|
+
if (!Number.isInteger(batchSize) || batchSize < 1)
|
|
144
|
+
throw new TypeError("Relationship event stream batchSize must be positive");
|
|
145
|
+
if (fromVersion > toVersion + 1)
|
|
146
|
+
throw new TypeError("Relationship event stream fromVersion exceeds the selected prefix");
|
|
147
|
+
for (let offset = fromVersion - 1; offset < toVersion; offset += batchSize) {
|
|
148
|
+
yield Object.freeze(this.#events.slice(offset, Math.min(offset + batchSize, toVersion)));
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/** Fold a selected immutable event prefix into caller-owned domain state. */
|
|
152
|
+
project(initialState, reducer, options = {}) {
|
|
153
|
+
if (typeof reducer !== "function")
|
|
154
|
+
throw new TypeError("Relationship event projection requires a reducer");
|
|
155
|
+
let state = initialState;
|
|
156
|
+
let processed = 0;
|
|
157
|
+
let finalEvent;
|
|
158
|
+
for (const batch of this.stream({ ...options, batchSize: 256 })) {
|
|
159
|
+
for (const event of batch) {
|
|
160
|
+
state = reducer(state, event);
|
|
161
|
+
processed += 1;
|
|
162
|
+
finalEvent = event;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return Object.freeze({
|
|
166
|
+
state,
|
|
167
|
+
version: finalEvent?.sequence ?? Math.max(0, (options.fromVersion ?? 1) - 1),
|
|
168
|
+
processed,
|
|
169
|
+
...(finalEvent === undefined ? {} : { asOf: finalEvent.timestamp }),
|
|
170
|
+
});
|
|
171
|
+
}
|
|
127
172
|
/** Add one active relationship to constant-time validation indexes. */
|
|
128
173
|
#indexActive(relationshipId, edge) {
|
|
129
174
|
const definition = this.#registry.require(edge.kind);
|
|
@@ -385,6 +430,19 @@ export class RelationshipEventStore {
|
|
|
385
430
|
this.#log = await this.#refreshFromDurableHistory();
|
|
386
431
|
return this.#log.page(options);
|
|
387
432
|
}
|
|
433
|
+
/**
|
|
434
|
+
* Refresh once under the shared store lock, then stream a coherent immutable
|
|
435
|
+
* prefix without holding the writer lock while the consumer processes batches.
|
|
436
|
+
*/
|
|
437
|
+
async *stream(options = {}) {
|
|
438
|
+
this.#log = await this.#refreshFromDurableHistory();
|
|
439
|
+
yield* this.#log.stream(options);
|
|
440
|
+
}
|
|
441
|
+
/** Refresh once and fold a coherent durable prefix into application state. */
|
|
442
|
+
async project(initialState, reducer, options = {}) {
|
|
443
|
+
this.#log = await this.#refreshFromDurableHistory();
|
|
444
|
+
return this.#log.project(initialState, reducer, options);
|
|
445
|
+
}
|
|
388
446
|
/** Serialize a durable refresh with writers so readers never observe a torn JSONL tail. */
|
|
389
447
|
async #refreshFromDurableHistory() {
|
|
390
448
|
const release = await acquireRelationshipStoreLock(this.#pmRoot);
|
|
@@ -398,4 +456,4 @@ export class RelationshipEventStore {
|
|
|
398
456
|
}
|
|
399
457
|
}
|
|
400
458
|
//# sourceMappingURL=relationship-history.js.map
|
|
401
|
-
//# debugId=
|
|
459
|
+
//# debugId=b00bbd6d-eb0d-5fbf-8f87-456d479e7807
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relationship-history.js","sources":["sdk/relationship-history.ts"],"sourceRoot":"/","sourcesContent":["/**\n * @module sdk/relationship-history\n *\n * Provides an append-only, storage-independent relationship event ledger with\n * optimistic concurrency, deterministic replay, snapshots, and cursor pages.\n */\nimport {\n createQueryFingerprint,\n decodeQueryCursorState,\n paginateQueryRows,\n} from \"./pagination.js\";\nimport { constants } from \"node:fs\";\nimport { lstat, mkdir, open, type FileHandle } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { acquireLock } from \"../core/lock/lock.js\";\nimport {\n RelationshipGraph,\n RelationshipKindRegistry,\n createRelationshipKindRegistry,\n type RelationshipEdge,\n} from \"./relationships.js\";\n\n/** Mutation kinds retained in the immutable relationship event stream. */\nexport type RelationshipEventAction = \"add\" | \"remove\" | \"supersede\";\n\n/** Caller-authored relationship mutation before its sequence is assigned. */\nexport interface RelationshipEventInput {\n /** Globally unique idempotency key for this event. */\n eventId: string;\n /** Stable logical relationship identifier across superseding events. */\n relationshipId: string;\n /** Append, remove, or replace the logical relationship. */\n action: RelationshipEventAction;\n /** Edge required for add and supersede actions. */\n edge?: RelationshipEdge;\n /** Attributable actor responsible for the mutation. */\n author: string;\n /** Valid event-time timestamp. */\n timestamp: string;\n /** Optional optimistic concurrency precondition. */\n expectedVersion?: number;\n /** Optional human-readable mutation rationale. */\n reason?: string;\n}\n\n/** One immutable sequenced relationship mutation. */\nexport interface RelationshipEvent extends Omit<\n RelationshipEventInput,\n \"expectedVersion\"\n> {\n /** One-based append sequence assigned by the ledger. */\n sequence: number;\n}\n\n/** Point-in-time materialized relationship view. */\nexport interface RelationshipSnapshot {\n /** Final event sequence included in this snapshot. */\n version: number;\n /** Timestamp of the final included event, when one exists. */\n asOf?: string;\n /** Deterministic active edge materialization. */\n edges: readonly RelationshipEdge[];\n /** Immutable graph query view over the active edges. */\n graph: RelationshipGraph;\n}\n\n/** Stable cursor page over a fixed relationship event-log version. */\nexport interface RelationshipEventPage {\n /** Log version against which this page was produced. */\n version: number;\n /** Events in append order. */\n events: RelationshipEvent[];\n /** Whether another event page exists. */\n hasMore: boolean;\n /** Opaque continuation cursor when another page exists. */\n nextCursor?: string;\n}\n\n/** Construction controls for the in-memory reference ledger. */\nexport interface RelationshipEventLogOptions {\n /** Registry defining edge semantics and cardinality. */\n registry?: RelationshipKindRegistry;\n}\n\n/** Filesystem controls for the durable relationship event store. */\nexport interface RelationshipEventStoreOptions extends RelationshipEventLogOptions {\n /** Tracker root that owns the relationship history directory. */\n pmRoot: string;\n /** Fixed node universe validated by every replay and append. */\n nodes: Iterable<string>;\n /** Optional JSONL path relative to the tracker root. */\n relativePath?: string;\n}\n\ninterface RelationshipCardinalityIndexes {\n identities: Map<string, string>;\n outgoingOne: Map<string, string>;\n incomingOne: Map<string, string>;\n}\n\nfunction requiredText(value: unknown, field: string): string {\n if (typeof value !== \"string\" || value.trim().length === 0)\n throw new TypeError(`Relationship event ${field} must be non-empty`);\n return value.trim();\n}\n\nfunction edgeIdentity(\n edge: RelationshipEdge,\n registry: RelationshipKindRegistry,\n): string {\n const definition = registry.require(edge.kind);\n const endpoints =\n definition.direction === \"undirected\"\n ? [edge.source, edge.target].sort().join(\"\\u0000\")\n : `${edge.source}\\u0000${edge.target}`;\n return `${definition.kind}\\u0000${endpoints}`;\n}\n\nfunction freezeEdge(edge: RelationshipEdge): RelationshipEdge {\n return Object.freeze({\n ...edge,\n ...(edge.payload === undefined\n ? {}\n : { payload: Object.freeze(structuredClone(edge.payload)) }),\n });\n}\n\nfunction assertCardinality(\n candidate: RelationshipEdge,\n excludeRelationshipId: string,\n registry: RelationshipKindRegistry,\n indexes: RelationshipCardinalityIndexes,\n): void {\n const definition = registry.require(candidate.kind);\n const outgoingOwner = indexes.outgoingOne.get(\n `${definition.kind}\\u0000${candidate.source}`,\n );\n if (outgoingOwner !== undefined && outgoingOwner !== excludeRelationshipId)\n throw new TypeError(\n `Relationship outgoing cardinality exceeded for ${definition.kind}`,\n );\n const incomingOwner = indexes.incomingOne.get(\n `${definition.kind}\\u0000${candidate.target}`,\n );\n if (incomingOwner !== undefined && incomingOwner !== excludeRelationshipId)\n throw new TypeError(\n `Relationship incoming cardinality exceeded for ${definition.kind}`,\n );\n const identity = edgeIdentity(candidate, registry);\n const identityOwner = indexes.identities.get(identity);\n if (identityOwner !== undefined && identityOwner !== excludeRelationshipId)\n throw new TypeError(`Relationship edge already active: ${identity}`);\n}\n\nfunction replayEvents(\n events: readonly RelationshipEvent[],\n): Map<string, RelationshipEdge> {\n const active = new Map<string, RelationshipEdge>();\n for (const event of events) {\n if (event.action === \"remove\") active.delete(event.relationshipId);\n else active.set(event.relationshipId, event.edge!);\n }\n return active;\n}\n\nfunction normalizeEventHeader(\n input: RelationshipEventInput,\n currentVersion: number,\n eventIds: ReadonlySet<string>,\n): {\n eventId: string;\n relationshipId: string;\n author: string;\n timestamp: string;\n} {\n if (\n input.expectedVersion !== undefined &&\n input.expectedVersion !== currentVersion\n )\n throw new TypeError(\n `Relationship event version conflict: expected ${input.expectedVersion}, current ${currentVersion}`,\n );\n const eventId = requiredText(input.eventId, \"eventId\");\n if (eventIds.has(eventId))\n throw new TypeError(`Relationship event already exists: ${eventId}`);\n if (\n input.action !== \"add\" &&\n input.action !== \"remove\" &&\n input.action !== \"supersede\"\n )\n throw new TypeError(`Unknown relationship event action: ${input.action}`);\n if (!Number.isFinite(Date.parse(input.timestamp)))\n throw new TypeError(\"Relationship event timestamp must be valid\");\n return {\n eventId,\n relationshipId: requiredText(input.relationshipId, \"relationshipId\"),\n author: requiredText(input.author, \"author\"),\n timestamp: new Date(input.timestamp).toISOString(),\n };\n}\n\nfunction resolveMutationEdge(\n input: RelationshipEventInput,\n relationshipId: string,\n active: ReadonlyMap<string, RelationshipEdge>,\n nodes: ReadonlySet<string>,\n registry: RelationshipKindRegistry,\n indexes: RelationshipCardinalityIndexes,\n): RelationshipEdge | undefined {\n const isActive = active.has(relationshipId);\n if (input.action === \"add\" && isActive)\n throw new TypeError(`Relationship is already active: ${relationshipId}`);\n if (input.action !== \"add\" && !isActive)\n throw new TypeError(`Relationship is not active: ${relationshipId}`);\n if (input.action === \"remove\") return undefined;\n if (!input.edge)\n throw new TypeError(`Relationship ${input.action} event requires an edge`);\n const source =\n typeof input.edge.source === \"string\" ? input.edge.source.trim() : \"\";\n const target =\n typeof input.edge.target === \"string\" ? input.edge.target.trim() : \"\";\n if (!nodes.has(source) || !nodes.has(target))\n throw new TypeError(\n `Relationship endpoint not found: ${source} -> ${target}`,\n );\n const canonical = new RelationshipGraph(\n [source, target],\n [input.edge],\n registry,\n ).edges()[0]!;\n assertCardinality(canonical, relationshipId, registry, indexes);\n return freezeEdge(canonical);\n}\n\n/**\n * Append-only in-memory reference ledger. Durable adapters can persist the\n * returned immutable events while reusing the same replay and validation model.\n */\nexport class RelationshipEventLog {\n readonly #nodes: ReadonlySet<string>;\n readonly #registry: RelationshipKindRegistry;\n readonly #events: RelationshipEvent[] = [];\n readonly #eventIds = new Set<string>();\n readonly #active = new Map<string, RelationshipEdge>();\n readonly #cardinalityIndexes: RelationshipCardinalityIndexes = {\n identities: new Map(),\n outgoingOne: new Map(),\n incomingOne: new Map(),\n };\n\n /** Create an empty relationship ledger for a fixed node universe. */\n public constructor(\n nodes: Iterable<string>,\n options: RelationshipEventLogOptions = {},\n ) {\n this.#nodes = new Set(\n [...nodes]\n .filter((node): node is string => typeof node === \"string\")\n .map((node) => node.trim())\n .filter(Boolean),\n );\n this.#registry = options.registry ?? createRelationshipKindRegistry();\n }\n\n /** Current append sequence. */\n public get version(): number {\n return this.#events.length;\n }\n\n /** Return an immutable copy of the full event stream. */\n public events(): readonly RelationshipEvent[] {\n return Object.freeze([...this.#events]);\n }\n\n /** Add one active relationship to constant-time validation indexes. */\n #indexActive(relationshipId: string, edge: RelationshipEdge): void {\n const definition = this.#registry.require(edge.kind);\n this.#cardinalityIndexes.identities.set(\n edgeIdentity(edge, this.#registry),\n relationshipId,\n );\n if (definition.outgoing === \"one\")\n this.#cardinalityIndexes.outgoingOne.set(\n `${definition.kind}\\u0000${edge.source}`,\n relationshipId,\n );\n if (definition.incoming === \"one\")\n this.#cardinalityIndexes.incomingOne.set(\n `${definition.kind}\\u0000${edge.target}`,\n relationshipId,\n );\n }\n\n /** Remove one superseded or deleted relationship from validation indexes. */\n #unindexActive(edge: RelationshipEdge): void {\n const definition = this.#registry.require(edge.kind);\n this.#cardinalityIndexes.identities.delete(\n edgeIdentity(edge, this.#registry),\n );\n if (definition.outgoing === \"one\")\n this.#cardinalityIndexes.outgoingOne.delete(\n `${definition.kind}\\u0000${edge.source}`,\n );\n if (definition.incoming === \"one\")\n this.#cardinalityIndexes.incomingOne.delete(\n `${definition.kind}\\u0000${edge.target}`,\n );\n }\n\n /** Validate and append one attributable relationship mutation. */\n public append(input: RelationshipEventInput): RelationshipEvent {\n const header = normalizeEventHeader(input, this.version, this.#eventIds);\n const previous = this.#active.get(header.relationshipId);\n const edge = resolveMutationEdge(\n input,\n header.relationshipId,\n this.#active,\n this.#nodes,\n this.#registry,\n this.#cardinalityIndexes,\n );\n\n const event = Object.freeze({\n eventId: header.eventId,\n relationshipId: header.relationshipId,\n action: input.action,\n ...(edge === undefined ? {} : { edge }),\n author: header.author,\n timestamp: header.timestamp,\n ...(input.reason?.trim() ? { reason: input.reason.trim() } : {}),\n sequence: this.version + 1,\n }) satisfies RelationshipEvent;\n this.#events.push(event);\n this.#eventIds.add(header.eventId);\n if (previous) this.#unindexActive(previous);\n if (input.action === \"remove\") this.#active.delete(header.relationshipId);\n else {\n this.#active.set(header.relationshipId, edge!);\n this.#indexActive(header.relationshipId, edge!);\n }\n return event;\n }\n\n /** Materialize an exact point-in-time graph without mutating the ledger. */\n public snapshot(\n options: {\n atVersion?: number;\n atTimestamp?: string;\n } = {},\n ): RelationshipSnapshot {\n if (options.atVersion !== undefined && options.atTimestamp !== undefined)\n throw new TypeError(\"Relationship snapshot accepts one target\");\n let included: RelationshipEvent[];\n if (options.atTimestamp !== undefined) {\n const timestamp = Date.parse(options.atTimestamp);\n if (!Number.isFinite(timestamp))\n throw new TypeError(\"Relationship snapshot timestamp must be valid\");\n let lastIndex = -1;\n for (let index = this.#events.length - 1; index >= 0; index -= 1) {\n if (Date.parse(this.#events[index]!.timestamp) > timestamp) continue;\n lastIndex = index;\n break;\n }\n included = lastIndex === -1 ? [] : this.#events.slice(0, lastIndex + 1);\n } else {\n const version = options.atVersion ?? this.version;\n if (!Number.isInteger(version) || version < 0 || version > this.version)\n throw new TypeError(\n `Relationship snapshot version out of range: ${version}`,\n );\n included = this.#events.slice(0, version);\n }\n const active = replayEvents(included);\n const graph = new RelationshipGraph(\n this.#nodes,\n active.values(),\n this.#registry,\n );\n return Object.freeze({\n version: included.length,\n ...(included.at(-1) ? { asOf: included.at(-1)!.timestamp } : {}),\n edges: graph.edges(),\n graph,\n });\n }\n\n /** Page the immutable event stream with a cursor bound to this log version. */\n public page(options: {\n limit: number;\n cursor?: string;\n }): RelationshipEventPage {\n if (!Number.isInteger(options.limit) || options.limit < 1)\n throw new TypeError(\"Relationship event page limit must be positive\");\n const fingerprint = createQueryFingerprint(\"relationship-events\", {\n order: \"append-sequence\",\n });\n const snapshot =\n options.cursor === undefined\n ? this.version\n : Number(decodeQueryCursorState(options.cursor, fingerprint).snapshot);\n if (\n !Number.isSafeInteger(snapshot) ||\n snapshot < 0 ||\n snapshot > this.version\n )\n throw new TypeError(\n \"Relationship event cursor snapshot version is invalid\",\n );\n const page = paginateQueryRows(this.#events.slice(0, snapshot), {\n cursor: options.cursor,\n fingerprint,\n limit: options.limit,\n readId: (event) => event.eventId,\n snapshot: String(snapshot),\n });\n return {\n version: snapshot,\n events: page.rows,\n hasMore: page.has_more,\n ...(page.next_cursor ? { nextCursor: page.next_cursor } : {}),\n };\n }\n}\n\nconst RELATIONSHIP_STORE_LOCK_ID = \"relationship-event-store\";\nconst RELATIONSHIP_NOFOLLOW_FLAG = constants.O_NOFOLLOW;\n\nfunction acquireRelationshipStoreLock(\n pmRoot: string,\n): Promise<() => Promise<void>> {\n return acquireLock(\n pmRoot,\n RELATIONSHIP_STORE_LOCK_ID,\n 30,\n `relationship-store:${process.pid}`,\n false,\n false,\n 3_000,\n );\n}\n\nasync function resolveRelationshipEventStorePath(\n pmRoot: string,\n relativePath = \"relationships/events.jsonl\",\n): Promise<string> {\n const root = path.resolve(pmRoot);\n const target = path.resolve(root, relativePath);\n const relative = path.relative(root, target);\n if (relative.length === 0)\n throw new TypeError(\n \"Relationship event path must name a file within the tracker root\",\n );\n if (\n relative === \"..\" ||\n relative.startsWith(`..${path.sep}`) ||\n path.isAbsolute(relative)\n )\n throw new TypeError(\n \"Relationship event path must stay within the tracker root\",\n );\n await mkdir(root, { recursive: true });\n const rootStats = await lstat(root);\n if (rootStats.isSymbolicLink())\n throw new TypeError(\n \"Relationship event tracker root must not be a symbolic link\",\n );\n let current = root;\n for (const segment of relative.split(path.sep)) {\n current = path.join(current, segment);\n try {\n if ((await lstat(current)).isSymbolicLink())\n throw new TypeError(\n \"Relationship event path must not contain symbolic links\",\n );\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") break;\n throw error;\n }\n }\n return target;\n}\n\nasync function loadRelationshipEventLog(\n target: string,\n nodes: readonly string[],\n registry: RelationshipKindRegistry | undefined,\n): Promise<RelationshipEventLog> {\n const log = new RelationshipEventLog(nodes, { registry });\n let raw: string;\n let handle: FileHandle | undefined;\n try {\n handle = await open(\n target,\n constants.O_RDONLY | RELATIONSHIP_NOFOLLOW_FLAG,\n );\n raw = await handle.readFile(\"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return log;\n throw error;\n } finally {\n await handle?.close();\n }\n const lines = raw.split(\"\\n\");\n for (let index = 0; index < lines.length; index += 1) {\n const line = lines[index]!.trim();\n if (!line) continue;\n let stored: RelationshipEvent;\n try {\n stored = JSON.parse(line) as RelationshipEvent;\n } catch {\n throw new TypeError(\n `Invalid relationship event JSONL at line ${index + 1}`,\n );\n }\n if (stored.sequence !== log.version + 1)\n throw new TypeError(\n `Invalid relationship event sequence at line ${index + 1}`,\n );\n log.append({\n eventId: stored.eventId,\n relationshipId: stored.relationshipId,\n action: stored.action,\n ...(stored.edge === undefined ? {} : { edge: stored.edge }),\n author: stored.author,\n timestamp: stored.timestamp,\n ...(stored.reason === undefined ? {} : { reason: stored.reason }),\n expectedVersion: log.version,\n });\n }\n return log;\n}\n\n/**\n * Lock-serialized durable JSONL adapter for {@link RelationshipEventLog}.\n * Every append replays the current stream while holding the workspace lock, so\n * independent processes share optimistic versions without lost updates.\n */\nexport class RelationshipEventStore {\n readonly #pmRoot: string;\n readonly #nodes: readonly string[];\n readonly #registry: RelationshipKindRegistry | undefined;\n readonly #path: string;\n #log: RelationshipEventLog;\n\n private constructor(\n options: RelationshipEventStoreOptions,\n nodes: readonly string[],\n target: string,\n log: RelationshipEventLog,\n ) {\n this.#pmRoot = options.pmRoot;\n this.#nodes = nodes;\n this.#registry = options.registry;\n this.#path = target;\n this.#log = log;\n }\n\n /** Open and validate an existing stream or create an empty store view. */\n public static async open(\n options: RelationshipEventStoreOptions,\n ): Promise<RelationshipEventStore> {\n const nodes = Object.freeze([...options.nodes]);\n const target = await resolveRelationshipEventStorePath(\n options.pmRoot,\n options.relativePath,\n );\n const release = await acquireRelationshipStoreLock(options.pmRoot);\n try {\n await resolveRelationshipEventStorePath(options.pmRoot, target);\n const log = await loadRelationshipEventLog(\n target,\n nodes,\n options.registry,\n );\n return new RelationshipEventStore(options, nodes, target, log);\n } finally {\n await release();\n }\n }\n\n /** Absolute JSONL path, exposed for diagnostics and backup tooling. */\n public get path(): string {\n return this.#path;\n }\n\n /** Refresh from durable history and return the current validated append sequence. */\n public async currentVersion(): Promise<number> {\n this.#log = await this.#refreshFromDurableHistory();\n return this.#log.version;\n }\n\n /** Append one event after refreshing under the shared workspace lock. */\n public async append(\n input: RelationshipEventInput,\n ): Promise<RelationshipEvent> {\n const release = await acquireRelationshipStoreLock(this.#pmRoot);\n try {\n const target = await resolveRelationshipEventStorePath(\n this.#pmRoot,\n this.#path,\n );\n const refreshed = await loadRelationshipEventLog(\n target,\n this.#nodes,\n this.#registry,\n );\n const event = refreshed.append(input);\n await mkdir(path.dirname(target), { recursive: true });\n await resolveRelationshipEventStorePath(this.#pmRoot, target);\n const handle = await open(\n target,\n constants.O_APPEND |\n constants.O_CREAT |\n constants.O_WRONLY |\n RELATIONSHIP_NOFOLLOW_FLAG,\n );\n try {\n await handle.appendFile(`${JSON.stringify(event)}\\n`, \"utf8\");\n } finally {\n await handle.close();\n }\n this.#log = refreshed;\n return event;\n } finally {\n await release();\n }\n }\n\n /** Refresh from durable history and materialize an exact validated snapshot. */\n public async snapshot(\n options: Parameters<RelationshipEventLog[\"snapshot\"]>[0] = {},\n ): Promise<RelationshipSnapshot> {\n this.#log = await this.#refreshFromDurableHistory();\n return this.#log.snapshot(options);\n }\n\n /** Refresh from durable history and page immutable events. */\n public async page(\n options: Parameters<RelationshipEventLog[\"page\"]>[0],\n ): Promise<RelationshipEventPage> {\n this.#log = await this.#refreshFromDurableHistory();\n return this.#log.page(options);\n }\n\n /** Serialize a durable refresh with writers so readers never observe a torn JSONL tail. */\n async #refreshFromDurableHistory(): Promise<RelationshipEventLog> {\n const release = await acquireRelationshipStoreLock(this.#pmRoot);\n try {\n const target = await resolveRelationshipEventStorePath(\n this.#pmRoot,\n this.#path,\n );\n return await loadRelationshipEventLog(\n target,\n this.#nodes,\n this.#registry,\n );\n } finally {\n await release();\n }\n }\n}\n"],"names":[],"mappings":"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","debugId":"787e8f44-80d5-554f-9232-9675cf6a8637"}
|
|
1
|
+
{"version":3,"file":"relationship-history.js","sources":["sdk/relationship-history.ts"],"sourceRoot":"/","sourcesContent":["/**\n * @module sdk/relationship-history\n *\n * Provides an append-only, storage-independent relationship event ledger with\n * optimistic concurrency, deterministic replay, snapshots, and cursor pages.\n */\nimport {\n createQueryFingerprint,\n decodeQueryCursorState,\n paginateQueryRows,\n} from \"./pagination.js\";\nimport { constants } from \"node:fs\";\nimport { lstat, mkdir, open, type FileHandle } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { acquireLock } from \"../core/lock/lock.js\";\nimport {\n RelationshipGraph,\n RelationshipKindRegistry,\n createRelationshipKindRegistry,\n type RelationshipEdge,\n} from \"./relationships.js\";\n\n/** Mutation kinds retained in the immutable relationship event stream. */\nexport type RelationshipEventAction = \"add\" | \"remove\" | \"supersede\";\n\n/** Caller-authored relationship mutation before its sequence is assigned. */\nexport interface RelationshipEventInput {\n /** Globally unique idempotency key for this event. */\n eventId: string;\n /** Stable logical relationship identifier across superseding events. */\n relationshipId: string;\n /** Append, remove, or replace the logical relationship. */\n action: RelationshipEventAction;\n /** Edge required for add and supersede actions. */\n edge?: RelationshipEdge;\n /** Attributable actor responsible for the mutation. */\n author: string;\n /** Valid event-time timestamp. */\n timestamp: string;\n /** Optional optimistic concurrency precondition. */\n expectedVersion?: number;\n /** Optional human-readable mutation rationale. */\n reason?: string;\n}\n\n/** One immutable sequenced relationship mutation. */\nexport interface RelationshipEvent extends Omit<\n RelationshipEventInput,\n \"expectedVersion\"\n> {\n /** One-based append sequence assigned by the ledger. */\n sequence: number;\n}\n\n/** Point-in-time materialized relationship view. */\nexport interface RelationshipSnapshot {\n /** Final event sequence included in this snapshot. */\n version: number;\n /** Timestamp of the final included event, when one exists. */\n asOf?: string;\n /** Deterministic active edge materialization. */\n edges: readonly RelationshipEdge[];\n /** Immutable graph query view over the active edges. */\n graph: RelationshipGraph;\n}\n\n/** Stable cursor page over a fixed relationship event-log version. */\nexport interface RelationshipEventPage {\n /** Log version against which this page was produced. */\n version: number;\n /** Events in append order. */\n events: RelationshipEvent[];\n /** Whether another event page exists. */\n hasMore: boolean;\n /** Opaque continuation cursor when another page exists. */\n nextCursor?: string;\n}\n\n/** Bounded controls for deterministic relationship-event batch iteration. */\nexport interface RelationshipEventStreamOptions {\n /** One-based first event version to include. */\n fromVersion?: number;\n /** One-based final event version to include. */\n toVersion?: number;\n /** Maximum number of events yielded in each immutable batch. */\n batchSize?: number;\n}\n\n/** Result of folding an immutable relationship-event prefix into domain state. */\nexport interface RelationshipEventProjection<State> {\n /** Final projected state returned by the caller-owned reducer. */\n state: State;\n /** Final event sequence included in the projection. */\n version: number;\n /** Number of events processed by this projection. */\n processed: number;\n /** Timestamp of the final included event, when one exists. */\n asOf?: string;\n}\n\n/** Pure reducer used to derive application state from relationship events. */\nexport type RelationshipEventReducer<State> = (\n state: State,\n event: RelationshipEvent,\n) => State;\n\n/** Construction controls for the in-memory reference ledger. */\nexport interface RelationshipEventLogOptions {\n /** Registry defining edge semantics and cardinality. */\n registry?: RelationshipKindRegistry;\n}\n\n/** Filesystem controls for the durable relationship event store. */\nexport interface RelationshipEventStoreOptions extends RelationshipEventLogOptions {\n /** Tracker root that owns the relationship history directory. */\n pmRoot: string;\n /** Fixed node universe validated by every replay and append. */\n nodes: Iterable<string>;\n /** Optional JSONL path relative to the tracker root. */\n relativePath?: string;\n}\n\ninterface RelationshipCardinalityIndexes {\n identities: Map<string, string>;\n outgoingOne: Map<string, string>;\n incomingOne: Map<string, string>;\n}\n\nfunction requiredText(value: unknown, field: string): string {\n if (typeof value !== \"string\" || value.trim().length === 0)\n throw new TypeError(`Relationship event ${field} must be non-empty`);\n return value.trim();\n}\n\nfunction edgeIdentity(\n edge: RelationshipEdge,\n registry: RelationshipKindRegistry,\n): string {\n const definition = registry.require(edge.kind);\n const endpoints =\n definition.direction === \"undirected\"\n ? [edge.source, edge.target].sort().join(\"\\u0000\")\n : `${edge.source}\\u0000${edge.target}`;\n return `${definition.kind}\\u0000${endpoints}`;\n}\n\nfunction freezeEdge(edge: RelationshipEdge): RelationshipEdge {\n return Object.freeze({\n ...edge,\n ...(edge.payload === undefined\n ? {}\n : { payload: Object.freeze(structuredClone(edge.payload)) }),\n });\n}\n\nfunction assertCardinality(\n candidate: RelationshipEdge,\n excludeRelationshipId: string,\n registry: RelationshipKindRegistry,\n indexes: RelationshipCardinalityIndexes,\n): void {\n const definition = registry.require(candidate.kind);\n const outgoingOwner = indexes.outgoingOne.get(\n `${definition.kind}\\u0000${candidate.source}`,\n );\n if (outgoingOwner !== undefined && outgoingOwner !== excludeRelationshipId)\n throw new TypeError(\n `Relationship outgoing cardinality exceeded for ${definition.kind}`,\n );\n const incomingOwner = indexes.incomingOne.get(\n `${definition.kind}\\u0000${candidate.target}`,\n );\n if (incomingOwner !== undefined && incomingOwner !== excludeRelationshipId)\n throw new TypeError(\n `Relationship incoming cardinality exceeded for ${definition.kind}`,\n );\n const identity = edgeIdentity(candidate, registry);\n const identityOwner = indexes.identities.get(identity);\n if (identityOwner !== undefined && identityOwner !== excludeRelationshipId)\n throw new TypeError(`Relationship edge already active: ${identity}`);\n}\n\nfunction replayEvents(\n events: readonly RelationshipEvent[],\n): Map<string, RelationshipEdge> {\n const active = new Map<string, RelationshipEdge>();\n for (const event of events) {\n if (event.action === \"remove\") active.delete(event.relationshipId);\n else active.set(event.relationshipId, event.edge!);\n }\n return active;\n}\n\nfunction normalizeEventHeader(\n input: RelationshipEventInput,\n currentVersion: number,\n eventIds: ReadonlySet<string>,\n): {\n eventId: string;\n relationshipId: string;\n author: string;\n timestamp: string;\n} {\n if (\n input.expectedVersion !== undefined &&\n input.expectedVersion !== currentVersion\n )\n throw new TypeError(\n `Relationship event version conflict: expected ${input.expectedVersion}, current ${currentVersion}`,\n );\n const eventId = requiredText(input.eventId, \"eventId\");\n if (eventIds.has(eventId))\n throw new TypeError(`Relationship event already exists: ${eventId}`);\n if (\n input.action !== \"add\" &&\n input.action !== \"remove\" &&\n input.action !== \"supersede\"\n )\n throw new TypeError(`Unknown relationship event action: ${input.action}`);\n if (!Number.isFinite(Date.parse(input.timestamp)))\n throw new TypeError(\"Relationship event timestamp must be valid\");\n return {\n eventId,\n relationshipId: requiredText(input.relationshipId, \"relationshipId\"),\n author: requiredText(input.author, \"author\"),\n timestamp: new Date(input.timestamp).toISOString(),\n };\n}\n\nfunction resolveMutationEdge(\n input: RelationshipEventInput,\n relationshipId: string,\n active: ReadonlyMap<string, RelationshipEdge>,\n nodes: ReadonlySet<string>,\n registry: RelationshipKindRegistry,\n indexes: RelationshipCardinalityIndexes,\n): RelationshipEdge | undefined {\n const isActive = active.has(relationshipId);\n if (input.action === \"add\" && isActive)\n throw new TypeError(`Relationship is already active: ${relationshipId}`);\n if (input.action !== \"add\" && !isActive)\n throw new TypeError(`Relationship is not active: ${relationshipId}`);\n if (input.action === \"remove\") return undefined;\n if (!input.edge)\n throw new TypeError(`Relationship ${input.action} event requires an edge`);\n const source =\n typeof input.edge.source === \"string\" ? input.edge.source.trim() : \"\";\n const target =\n typeof input.edge.target === \"string\" ? input.edge.target.trim() : \"\";\n if (!nodes.has(source) || !nodes.has(target))\n throw new TypeError(\n `Relationship endpoint not found: ${source} -> ${target}`,\n );\n const canonical = new RelationshipGraph(\n [source, target],\n [input.edge],\n registry,\n ).edges()[0]!;\n assertCardinality(canonical, relationshipId, registry, indexes);\n return freezeEdge(canonical);\n}\n\n/**\n * Append-only in-memory reference ledger. Durable adapters can persist the\n * returned immutable events while reusing the same replay and validation model.\n */\nexport class RelationshipEventLog {\n readonly #nodes: ReadonlySet<string>;\n readonly #registry: RelationshipKindRegistry;\n readonly #events: RelationshipEvent[] = [];\n readonly #eventIds = new Set<string>();\n readonly #active = new Map<string, RelationshipEdge>();\n readonly #cardinalityIndexes: RelationshipCardinalityIndexes = {\n identities: new Map(),\n outgoingOne: new Map(),\n incomingOne: new Map(),\n };\n\n /** Create an empty relationship ledger for a fixed node universe. */\n public constructor(\n nodes: Iterable<string>,\n options: RelationshipEventLogOptions = {},\n ) {\n this.#nodes = new Set(\n [...nodes]\n .filter((node): node is string => typeof node === \"string\")\n .map((node) => node.trim())\n .filter(Boolean),\n );\n this.#registry = options.registry ?? createRelationshipKindRegistry();\n }\n\n /** Current append sequence. */\n public get version(): number {\n return this.#events.length;\n }\n\n /** Return an immutable copy of the full event stream. */\n public events(): readonly RelationshipEvent[] {\n return Object.freeze([...this.#events]);\n }\n\n /**\n * Iterate a stable event prefix in immutable, bounded batches. Consumers can\n * build streaming projections without copying or exposing the mutable ledger.\n * `fromVersion === toVersion + 1` is the intentional empty checkpoint range;\n * larger watermarks are rejected as invalid for the selected prefix.\n */\n public *stream(\n options: RelationshipEventStreamOptions = {},\n ): Generator<readonly RelationshipEvent[]> {\n const fromVersion = options.fromVersion ?? 1;\n const toVersion = options.toVersion ?? this.version;\n const batchSize = options.batchSize ?? 100;\n if (!Number.isInteger(fromVersion) || fromVersion < 1)\n throw new TypeError(\n \"Relationship event stream fromVersion must be positive\",\n );\n if (\n !Number.isInteger(toVersion) ||\n toVersion < 0 ||\n toVersion > this.version\n )\n throw new TypeError(\n `Relationship event stream toVersion out of range: ${toVersion}`,\n );\n if (!Number.isInteger(batchSize) || batchSize < 1)\n throw new TypeError(\n \"Relationship event stream batchSize must be positive\",\n );\n if (fromVersion > toVersion + 1)\n throw new TypeError(\n \"Relationship event stream fromVersion exceeds the selected prefix\",\n );\n for (let offset = fromVersion - 1; offset < toVersion; offset += batchSize) {\n yield Object.freeze(\n this.#events.slice(offset, Math.min(offset + batchSize, toVersion)),\n );\n }\n }\n\n /** Fold a selected immutable event prefix into caller-owned domain state. */\n public project<State>(\n initialState: State,\n reducer: RelationshipEventReducer<State>,\n options: Omit<RelationshipEventStreamOptions, \"batchSize\"> = {},\n ): RelationshipEventProjection<State> {\n if (typeof reducer !== \"function\")\n throw new TypeError(\"Relationship event projection requires a reducer\");\n let state = initialState;\n let processed = 0;\n let finalEvent: RelationshipEvent | undefined;\n for (const batch of this.stream({ ...options, batchSize: 256 })) {\n for (const event of batch) {\n state = reducer(state, event);\n processed += 1;\n finalEvent = event;\n }\n }\n return Object.freeze({\n state,\n version: finalEvent?.sequence ?? Math.max(0, (options.fromVersion ?? 1) - 1),\n processed,\n ...(finalEvent === undefined ? {} : { asOf: finalEvent.timestamp }),\n });\n }\n\n /** Add one active relationship to constant-time validation indexes. */\n #indexActive(relationshipId: string, edge: RelationshipEdge): void {\n const definition = this.#registry.require(edge.kind);\n this.#cardinalityIndexes.identities.set(\n edgeIdentity(edge, this.#registry),\n relationshipId,\n );\n if (definition.outgoing === \"one\")\n this.#cardinalityIndexes.outgoingOne.set(\n `${definition.kind}\\u0000${edge.source}`,\n relationshipId,\n );\n if (definition.incoming === \"one\")\n this.#cardinalityIndexes.incomingOne.set(\n `${definition.kind}\\u0000${edge.target}`,\n relationshipId,\n );\n }\n\n /** Remove one superseded or deleted relationship from validation indexes. */\n #unindexActive(edge: RelationshipEdge): void {\n const definition = this.#registry.require(edge.kind);\n this.#cardinalityIndexes.identities.delete(\n edgeIdentity(edge, this.#registry),\n );\n if (definition.outgoing === \"one\")\n this.#cardinalityIndexes.outgoingOne.delete(\n `${definition.kind}\\u0000${edge.source}`,\n );\n if (definition.incoming === \"one\")\n this.#cardinalityIndexes.incomingOne.delete(\n `${definition.kind}\\u0000${edge.target}`,\n );\n }\n\n /** Validate and append one attributable relationship mutation. */\n public append(input: RelationshipEventInput): RelationshipEvent {\n const header = normalizeEventHeader(input, this.version, this.#eventIds);\n const previous = this.#active.get(header.relationshipId);\n const edge = resolveMutationEdge(\n input,\n header.relationshipId,\n this.#active,\n this.#nodes,\n this.#registry,\n this.#cardinalityIndexes,\n );\n\n const event = Object.freeze({\n eventId: header.eventId,\n relationshipId: header.relationshipId,\n action: input.action,\n ...(edge === undefined ? {} : { edge }),\n author: header.author,\n timestamp: header.timestamp,\n ...(input.reason?.trim() ? { reason: input.reason.trim() } : {}),\n sequence: this.version + 1,\n }) satisfies RelationshipEvent;\n this.#events.push(event);\n this.#eventIds.add(header.eventId);\n if (previous) this.#unindexActive(previous);\n if (input.action === \"remove\") this.#active.delete(header.relationshipId);\n else {\n this.#active.set(header.relationshipId, edge!);\n this.#indexActive(header.relationshipId, edge!);\n }\n return event;\n }\n\n /** Materialize an exact point-in-time graph without mutating the ledger. */\n public snapshot(\n options: {\n atVersion?: number;\n atTimestamp?: string;\n } = {},\n ): RelationshipSnapshot {\n if (options.atVersion !== undefined && options.atTimestamp !== undefined)\n throw new TypeError(\"Relationship snapshot accepts one target\");\n let included: RelationshipEvent[];\n if (options.atTimestamp !== undefined) {\n const timestamp = Date.parse(options.atTimestamp);\n if (!Number.isFinite(timestamp))\n throw new TypeError(\"Relationship snapshot timestamp must be valid\");\n let lastIndex = -1;\n for (let index = this.#events.length - 1; index >= 0; index -= 1) {\n if (Date.parse(this.#events[index]!.timestamp) > timestamp) continue;\n lastIndex = index;\n break;\n }\n included = lastIndex === -1 ? [] : this.#events.slice(0, lastIndex + 1);\n } else {\n const version = options.atVersion ?? this.version;\n if (!Number.isInteger(version) || version < 0 || version > this.version)\n throw new TypeError(\n `Relationship snapshot version out of range: ${version}`,\n );\n included = this.#events.slice(0, version);\n }\n const active = replayEvents(included);\n const graph = new RelationshipGraph(\n this.#nodes,\n active.values(),\n this.#registry,\n );\n return Object.freeze({\n version: included.length,\n ...(included.at(-1) ? { asOf: included.at(-1)!.timestamp } : {}),\n edges: graph.edges(),\n graph,\n });\n }\n\n /** Page the immutable event stream with a cursor bound to this log version. */\n public page(options: {\n limit: number;\n cursor?: string;\n }): RelationshipEventPage {\n if (!Number.isInteger(options.limit) || options.limit < 1)\n throw new TypeError(\"Relationship event page limit must be positive\");\n const fingerprint = createQueryFingerprint(\"relationship-events\", {\n order: \"append-sequence\",\n });\n const snapshot =\n options.cursor === undefined\n ? this.version\n : Number(decodeQueryCursorState(options.cursor, fingerprint).snapshot);\n if (\n !Number.isSafeInteger(snapshot) ||\n snapshot < 0 ||\n snapshot > this.version\n )\n throw new TypeError(\n \"Relationship event cursor snapshot version is invalid\",\n );\n const page = paginateQueryRows(this.#events.slice(0, snapshot), {\n cursor: options.cursor,\n fingerprint,\n limit: options.limit,\n readId: (event) => event.eventId,\n snapshot: String(snapshot),\n });\n return {\n version: snapshot,\n events: page.rows,\n hasMore: page.has_more,\n ...(page.next_cursor ? { nextCursor: page.next_cursor } : {}),\n };\n }\n}\n\nconst RELATIONSHIP_STORE_LOCK_ID = \"relationship-event-store\";\nconst RELATIONSHIP_NOFOLLOW_FLAG = constants.O_NOFOLLOW;\n\nfunction acquireRelationshipStoreLock(\n pmRoot: string,\n): Promise<() => Promise<void>> {\n return acquireLock(\n pmRoot,\n RELATIONSHIP_STORE_LOCK_ID,\n 30,\n `relationship-store:${process.pid}`,\n false,\n false,\n 3_000,\n );\n}\n\nasync function resolveRelationshipEventStorePath(\n pmRoot: string,\n relativePath = \"relationships/events.jsonl\",\n): Promise<string> {\n const root = path.resolve(pmRoot);\n const target = path.resolve(root, relativePath);\n const relative = path.relative(root, target);\n if (relative.length === 0)\n throw new TypeError(\n \"Relationship event path must name a file within the tracker root\",\n );\n if (\n relative === \"..\" ||\n relative.startsWith(`..${path.sep}`) ||\n path.isAbsolute(relative)\n )\n throw new TypeError(\n \"Relationship event path must stay within the tracker root\",\n );\n await mkdir(root, { recursive: true });\n const rootStats = await lstat(root);\n if (rootStats.isSymbolicLink())\n throw new TypeError(\n \"Relationship event tracker root must not be a symbolic link\",\n );\n let current = root;\n for (const segment of relative.split(path.sep)) {\n current = path.join(current, segment);\n try {\n if ((await lstat(current)).isSymbolicLink())\n throw new TypeError(\n \"Relationship event path must not contain symbolic links\",\n );\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") break;\n throw error;\n }\n }\n return target;\n}\n\nasync function loadRelationshipEventLog(\n target: string,\n nodes: readonly string[],\n registry: RelationshipKindRegistry | undefined,\n): Promise<RelationshipEventLog> {\n const log = new RelationshipEventLog(nodes, { registry });\n let raw: string;\n let handle: FileHandle | undefined;\n try {\n handle = await open(\n target,\n constants.O_RDONLY | RELATIONSHIP_NOFOLLOW_FLAG,\n );\n raw = await handle.readFile(\"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return log;\n throw error;\n } finally {\n await handle?.close();\n }\n const lines = raw.split(\"\\n\");\n for (let index = 0; index < lines.length; index += 1) {\n const line = lines[index]!.trim();\n if (!line) continue;\n let stored: RelationshipEvent;\n try {\n stored = JSON.parse(line) as RelationshipEvent;\n } catch {\n throw new TypeError(\n `Invalid relationship event JSONL at line ${index + 1}`,\n );\n }\n if (stored.sequence !== log.version + 1)\n throw new TypeError(\n `Invalid relationship event sequence at line ${index + 1}`,\n );\n log.append({\n eventId: stored.eventId,\n relationshipId: stored.relationshipId,\n action: stored.action,\n ...(stored.edge === undefined ? {} : { edge: stored.edge }),\n author: stored.author,\n timestamp: stored.timestamp,\n ...(stored.reason === undefined ? {} : { reason: stored.reason }),\n expectedVersion: log.version,\n });\n }\n return log;\n}\n\n/**\n * Lock-serialized durable JSONL adapter for {@link RelationshipEventLog}.\n * Every append replays the current stream while holding the workspace lock, so\n * independent processes share optimistic versions without lost updates.\n */\nexport class RelationshipEventStore {\n readonly #pmRoot: string;\n readonly #nodes: readonly string[];\n readonly #registry: RelationshipKindRegistry | undefined;\n readonly #path: string;\n #log: RelationshipEventLog;\n\n private constructor(\n options: RelationshipEventStoreOptions,\n nodes: readonly string[],\n target: string,\n log: RelationshipEventLog,\n ) {\n this.#pmRoot = options.pmRoot;\n this.#nodes = nodes;\n this.#registry = options.registry;\n this.#path = target;\n this.#log = log;\n }\n\n /** Open and validate an existing stream or create an empty store view. */\n public static async open(\n options: RelationshipEventStoreOptions,\n ): Promise<RelationshipEventStore> {\n const nodes = Object.freeze([...options.nodes]);\n const target = await resolveRelationshipEventStorePath(\n options.pmRoot,\n options.relativePath,\n );\n const release = await acquireRelationshipStoreLock(options.pmRoot);\n try {\n await resolveRelationshipEventStorePath(options.pmRoot, target);\n const log = await loadRelationshipEventLog(\n target,\n nodes,\n options.registry,\n );\n return new RelationshipEventStore(options, nodes, target, log);\n } finally {\n await release();\n }\n }\n\n /** Absolute JSONL path, exposed for diagnostics and backup tooling. */\n public get path(): string {\n return this.#path;\n }\n\n /** Refresh from durable history and return the current validated append sequence. */\n public async currentVersion(): Promise<number> {\n this.#log = await this.#refreshFromDurableHistory();\n return this.#log.version;\n }\n\n /** Append one event after refreshing under the shared workspace lock. */\n public async append(\n input: RelationshipEventInput,\n ): Promise<RelationshipEvent> {\n const release = await acquireRelationshipStoreLock(this.#pmRoot);\n try {\n const target = await resolveRelationshipEventStorePath(\n this.#pmRoot,\n this.#path,\n );\n const refreshed = await loadRelationshipEventLog(\n target,\n this.#nodes,\n this.#registry,\n );\n const event = refreshed.append(input);\n await mkdir(path.dirname(target), { recursive: true });\n await resolveRelationshipEventStorePath(this.#pmRoot, target);\n const handle = await open(\n target,\n constants.O_APPEND |\n constants.O_CREAT |\n constants.O_WRONLY |\n RELATIONSHIP_NOFOLLOW_FLAG,\n );\n try {\n await handle.appendFile(`${JSON.stringify(event)}\\n`, \"utf8\");\n } finally {\n await handle.close();\n }\n this.#log = refreshed;\n return event;\n } finally {\n await release();\n }\n }\n\n /** Refresh from durable history and materialize an exact validated snapshot. */\n public async snapshot(\n options: Parameters<RelationshipEventLog[\"snapshot\"]>[0] = {},\n ): Promise<RelationshipSnapshot> {\n this.#log = await this.#refreshFromDurableHistory();\n return this.#log.snapshot(options);\n }\n\n /** Refresh from durable history and page immutable events. */\n public async page(\n options: Parameters<RelationshipEventLog[\"page\"]>[0],\n ): Promise<RelationshipEventPage> {\n this.#log = await this.#refreshFromDurableHistory();\n return this.#log.page(options);\n }\n\n /**\n * Refresh once under the shared store lock, then stream a coherent immutable\n * prefix without holding the writer lock while the consumer processes batches.\n */\n public async *stream(\n options: RelationshipEventStreamOptions = {},\n ): AsyncGenerator<readonly RelationshipEvent[]> {\n this.#log = await this.#refreshFromDurableHistory();\n yield* this.#log.stream(options);\n }\n\n /** Refresh once and fold a coherent durable prefix into application state. */\n public async project<State>(\n initialState: State,\n reducer: RelationshipEventReducer<State>,\n options: Omit<RelationshipEventStreamOptions, \"batchSize\"> = {},\n ): Promise<RelationshipEventProjection<State>> {\n this.#log = await this.#refreshFromDurableHistory();\n return this.#log.project(initialState, reducer, options);\n }\n\n /** Serialize a durable refresh with writers so readers never observe a torn JSONL tail. */\n async #refreshFromDurableHistory(): Promise<RelationshipEventLog> {\n const release = await acquireRelationshipStoreLock(this.#pmRoot);\n try {\n const target = await resolveRelationshipEventStorePath(\n this.#pmRoot,\n this.#path,\n );\n return await loadRelationshipEventLog(\n target,\n this.#nodes,\n this.#registry,\n );\n } finally {\n await release();\n }\n }\n}\n"],"names":[],"mappings":"AAAA;;;;;GAKG;;;AACH,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAmB,MAAM,kBAAkB,CAAC;AACvE,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EACL,iBAAiB,EAEjB,8BAA8B,GAE/B,MAAM,oBAAoB,CAAC;AA4G5B,SAAS,YAAY,CAAC,KAAc,EAAE,KAAa;IACjD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QACxD,MAAM,IAAI,SAAS,CAAC,sBAAsB,KAAK,oBAAoB,CAAC,CAAC;IACvE,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,SAAS,YAAY,CACnB,IAAsB,EACtB,QAAkC;IAElC,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,SAAS,GACb,UAAU,CAAC,SAAS,KAAK,YAAY;QACnC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;QAClD,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,SAAS,IAAI,CAAC,MAAM,EAAE,CAAC;IAC3C,OAAO,GAAG,UAAU,CAAC,IAAI,SAAS,SAAS,EAAE,CAAC;AAChD,CAAC;AAED,SAAS,UAAU,CAAC,IAAsB;IACxC,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,GAAG,IAAI;QACP,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS;YAC5B,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;KAC/D,CAAC,CAAC;AACL,CAAC;AAED,SAAS,iBAAiB,CACxB,SAA2B,EAC3B,qBAA6B,EAC7B,QAAkC,EAClC,OAAuC;IAEvC,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACpD,MAAM,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAC3C,GAAG,UAAU,CAAC,IAAI,SAAS,SAAS,CAAC,MAAM,EAAE,CAC9C,CAAC;IACF,IAAI,aAAa,KAAK,SAAS,IAAI,aAAa,KAAK,qBAAqB;QACxE,MAAM,IAAI,SAAS,CACjB,kDAAkD,UAAU,CAAC,IAAI,EAAE,CACpE,CAAC;IACJ,MAAM,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAC3C,GAAG,UAAU,CAAC,IAAI,SAAS,SAAS,CAAC,MAAM,EAAE,CAC9C,CAAC;IACF,IAAI,aAAa,KAAK,SAAS,IAAI,aAAa,KAAK,qBAAqB;QACxE,MAAM,IAAI,SAAS,CACjB,kDAAkD,UAAU,CAAC,IAAI,EAAE,CACpE,CAAC;IACJ,MAAM,QAAQ,GAAG,YAAY,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACnD,MAAM,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACvD,IAAI,aAAa,KAAK,SAAS,IAAI,aAAa,KAAK,qBAAqB;QACxE,MAAM,IAAI,SAAS,CAAC,qCAAqC,QAAQ,EAAE,CAAC,CAAC;AACzE,CAAC;AAED,SAAS,YAAY,CACnB,MAAoC;IAEpC,MAAM,MAAM,GAAG,IAAI,GAAG,EAA4B,CAAC;IACnD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ;YAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;;YAC9D,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,IAAK,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,oBAAoB,CAC3B,KAA6B,EAC7B,cAAsB,EACtB,QAA6B;IAO7B,IACE,KAAK,CAAC,eAAe,KAAK,SAAS;QACnC,KAAK,CAAC,eAAe,KAAK,cAAc;QAExC,MAAM,IAAI,SAAS,CACjB,iDAAiD,KAAK,CAAC,eAAe,aAAa,cAAc,EAAE,CACpG,CAAC;IACJ,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACvD,IAAI,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC;QACvB,MAAM,IAAI,SAAS,CAAC,sCAAsC,OAAO,EAAE,CAAC,CAAC;IACvE,IACE,KAAK,CAAC,MAAM,KAAK,KAAK;QACtB,KAAK,CAAC,MAAM,KAAK,QAAQ;QACzB,KAAK,CAAC,MAAM,KAAK,WAAW;QAE5B,MAAM,IAAI,SAAS,CAAC,sCAAsC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5E,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC/C,MAAM,IAAI,SAAS,CAAC,4CAA4C,CAAC,CAAC;IACpE,OAAO;QACL,OAAO;QACP,cAAc,EAAE,YAAY,CAAC,KAAK,CAAC,cAAc,EAAE,gBAAgB,CAAC;QACpE,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC;QAC5C,SAAS,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE;KACnD,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAC1B,KAA6B,EAC7B,cAAsB,EACtB,MAA6C,EAC7C,KAA0B,EAC1B,QAAkC,EAClC,OAAuC;IAEvC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,IAAI,QAAQ;QACpC,MAAM,IAAI,SAAS,CAAC,mCAAmC,cAAc,EAAE,CAAC,CAAC;IAC3E,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,IAAI,CAAC,QAAQ;QACrC,MAAM,IAAI,SAAS,CAAC,+BAA+B,cAAc,EAAE,CAAC,CAAC;IACvE,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChD,IAAI,CAAC,KAAK,CAAC,IAAI;QACb,MAAM,IAAI,SAAS,CAAC,gBAAgB,KAAK,CAAC,MAAM,yBAAyB,CAAC,CAAC;IAC7E,MAAM,MAAM,GACV,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACxE,MAAM,MAAM,GACV,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACxE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;QAC1C,MAAM,IAAI,SAAS,CACjB,oCAAoC,MAAM,OAAO,MAAM,EAAE,CAC1D,CAAC;IACJ,MAAM,SAAS,GAAG,IAAI,iBAAiB,CACrC,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,CAAC,KAAK,CAAC,IAAI,CAAC,EACZ,QAAQ,CACT,CAAC,KAAK,EAAE,CAAC,CAAC,CAAE,CAAC;IACd,iBAAiB,CAAC,SAAS,EAAE,cAAc,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChE,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC;AAC/B,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,oBAAoB;IACtB,MAAM,CAAsB;IAC5B,SAAS,CAA2B;IACpC,OAAO,GAAwB,EAAE,CAAC;IAClC,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,OAAO,GAAG,IAAI,GAAG,EAA4B,CAAC;IAC9C,mBAAmB,GAAmC;QAC7D,UAAU,EAAE,IAAI,GAAG,EAAE;QACrB,WAAW,EAAE,IAAI,GAAG,EAAE;QACtB,WAAW,EAAE,IAAI,GAAG,EAAE;KACvB,CAAC;IAEF,qEAAqE;IACrE,YACE,KAAuB,EACvB,UAAuC,EAAE;QAEzC,IAAI,CAAC,MAAM,GAAG,IAAI,GAAG,CACnB,CAAC,GAAG,KAAK,CAAC;aACP,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC;aAC1D,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;aAC1B,MAAM,CAAC,OAAO,CAAC,CACnB,CAAC;QACF,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,QAAQ,IAAI,8BAA8B,EAAE,CAAC;IACxE,CAAC;IAED,+BAA+B;IAC/B,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,yDAAyD;IAClD,MAAM;QACX,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED;;;;;OAKG;IACI,CAAC,MAAM,CACZ,UAA0C,EAAE;QAE5C,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC;QAC7C,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC;QACpD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,GAAG,CAAC;QAC3C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,WAAW,GAAG,CAAC;YACnD,MAAM,IAAI,SAAS,CACjB,wDAAwD,CACzD,CAAC;QACJ,IACE,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC;YAC5B,SAAS,GAAG,CAAC;YACb,SAAS,GAAG,IAAI,CAAC,OAAO;YAExB,MAAM,IAAI,SAAS,CACjB,qDAAqD,SAAS,EAAE,CACjE,CAAC;QACJ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC;YAC/C,MAAM,IAAI,SAAS,CACjB,sDAAsD,CACvD,CAAC;QACJ,IAAI,WAAW,GAAG,SAAS,GAAG,CAAC;YAC7B,MAAM,IAAI,SAAS,CACjB,mEAAmE,CACpE,CAAC;QACJ,KAAK,IAAI,MAAM,GAAG,WAAW,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,IAAI,SAAS,EAAE,CAAC;YAC3E,MAAM,MAAM,CAAC,MAAM,CACjB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,SAAS,EAAE,SAAS,CAAC,CAAC,CACpE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,6EAA6E;IACtE,OAAO,CACZ,YAAmB,EACnB,OAAwC,EACxC,UAA6D,EAAE;QAE/D,IAAI,OAAO,OAAO,KAAK,UAAU;YAC/B,MAAM,IAAI,SAAS,CAAC,kDAAkD,CAAC,CAAC;QAC1E,IAAI,KAAK,GAAG,YAAY,CAAC;QACzB,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,UAAyC,CAAC;QAC9C,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;YAChE,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;gBAC1B,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBAC9B,SAAS,IAAI,CAAC,CAAC;gBACf,UAAU,GAAG,KAAK,CAAC;YACrB,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,KAAK;YACL,OAAO,EAAE,UAAU,EAAE,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YAC5E,SAAS;YACT,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,SAAS,EAAE,CAAC;SACpE,CAAC,CAAC;IACL,CAAC;IAED,uEAAuE;IACvE,YAAY,CAAC,cAAsB,EAAE,IAAsB;QACzD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrD,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,GAAG,CACrC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAClC,cAAc,CACf,CAAC;QACF,IAAI,UAAU,CAAC,QAAQ,KAAK,KAAK;YAC/B,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,GAAG,CACtC,GAAG,UAAU,CAAC,IAAI,SAAS,IAAI,CAAC,MAAM,EAAE,EACxC,cAAc,CACf,CAAC;QACJ,IAAI,UAAU,CAAC,QAAQ,KAAK,KAAK;YAC/B,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,GAAG,CACtC,GAAG,UAAU,CAAC,IAAI,SAAS,IAAI,CAAC,MAAM,EAAE,EACxC,cAAc,CACf,CAAC;IACN,CAAC;IAED,6EAA6E;IAC7E,cAAc,CAAC,IAAsB;QACnC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrD,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,MAAM,CACxC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CACnC,CAAC;QACF,IAAI,UAAU,CAAC,QAAQ,KAAK,KAAK;YAC/B,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,MAAM,CACzC,GAAG,UAAU,CAAC,IAAI,SAAS,IAAI,CAAC,MAAM,EAAE,CACzC,CAAC;QACJ,IAAI,UAAU,CAAC,QAAQ,KAAK,KAAK;YAC/B,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,MAAM,CACzC,GAAG,UAAU,CAAC,IAAI,SAAS,IAAI,CAAC,MAAM,EAAE,CACzC,CAAC;IACN,CAAC;IAED,kEAAkE;IAC3D,MAAM,CAAC,KAA6B;QACzC,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACzE,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,mBAAmB,CAC9B,KAAK,EACL,MAAM,CAAC,cAAc,EACrB,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,mBAAmB,CACzB,CAAC;QAEF,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;YAC1B,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;YACvC,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChE,QAAQ,EAAE,IAAI,CAAC,OAAO,GAAG,CAAC;SAC3B,CAA6B,CAAC;QAC/B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACnC,IAAI,QAAQ;YAAE,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ;YAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;aACrE,CAAC;YACJ,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,EAAE,IAAK,CAAC,CAAC;YAC/C,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,cAAc,EAAE,IAAK,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,4EAA4E;IACrE,QAAQ,CACb,UAGI,EAAE;QAEN,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS;YACtE,MAAM,IAAI,SAAS,CAAC,0CAA0C,CAAC,CAAC;QAClE,IAAI,QAA6B,CAAC;QAClC,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACtC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YAClD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;gBAC7B,MAAM,IAAI,SAAS,CAAC,+CAA+C,CAAC,CAAC;YACvE,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC;YACnB,KAAK,IAAI,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;gBACjE,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAE,CAAC,SAAS,CAAC,GAAG,SAAS;oBAAE,SAAS;gBACrE,SAAS,GAAG,KAAK,CAAC;gBAClB,MAAM;YACR,CAAC;YACD,QAAQ,GAAG,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;QAC1E,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC;YAClD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO;gBACrE,MAAM,IAAI,SAAS,CACjB,+CAA+C,OAAO,EAAE,CACzD,CAAC;YACJ,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAC5C,CAAC;QACD,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,iBAAiB,CACjC,IAAI,CAAC,MAAM,EACX,MAAM,CAAC,MAAM,EAAE,EACf,IAAI,CAAC,SAAS,CACf,CAAC;QACF,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,OAAO,EAAE,QAAQ,CAAC,MAAM;YACxB,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE;YACpB,KAAK;SACN,CAAC,CAAC;IACL,CAAC;IAED,+EAA+E;IACxE,IAAI,CAAC,OAGX;QACC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,KAAK,GAAG,CAAC;YACvD,MAAM,IAAI,SAAS,CAAC,gDAAgD,CAAC,CAAC;QACxE,MAAM,WAAW,GAAG,sBAAsB,CAAC,qBAAqB,EAAE;YAChE,KAAK,EAAE,iBAAiB;SACzB,CAAC,CAAC;QACH,MAAM,QAAQ,GACZ,OAAO,CAAC,MAAM,KAAK,SAAS;YAC1B,CAAC,CAAC,IAAI,CAAC,OAAO;YACd,CAAC,CAAC,MAAM,CAAC,sBAAsB,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC3E,IACE,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC;YAC/B,QAAQ,GAAG,CAAC;YACZ,QAAQ,GAAG,IAAI,CAAC,OAAO;YAEvB,MAAM,IAAI,SAAS,CACjB,uDAAuD,CACxD,CAAC;QACJ,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE;YAC9D,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,WAAW;YACX,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO;YAChC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;SAC3B,CAAC,CAAC;QACH,OAAO;YACL,OAAO,EAAE,QAAQ;YACjB,MAAM,EAAE,IAAI,CAAC,IAAI;YACjB,OAAO,EAAE,IAAI,CAAC,QAAQ;YACtB,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9D,CAAC;IACJ,CAAC;CACF;AAED,MAAM,0BAA0B,GAAG,0BAA0B,CAAC;AAC9D,MAAM,0BAA0B,GAAG,SAAS,CAAC,UAAU,CAAC;AAExD,SAAS,4BAA4B,CACnC,MAAc;IAEd,OAAO,WAAW,CAChB,MAAM,EACN,0BAA0B,EAC1B,EAAE,EACF,sBAAsB,OAAO,CAAC,GAAG,EAAE,EACnC,KAAK,EACL,KAAK,EACL,KAAK,CACN,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,iCAAiC,CAC9C,MAAc,EACd,YAAY,GAAG,4BAA4B;IAE3C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QACvB,MAAM,IAAI,SAAS,CACjB,kEAAkE,CACnE,CAAC;IACJ,IACE,QAAQ,KAAK,IAAI;QACjB,QAAQ,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC;QACpC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAEzB,MAAM,IAAI,SAAS,CACjB,2DAA2D,CAC5D,CAAC;IACJ,MAAM,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,SAAS,CAAC,cAAc,EAAE;QAC5B,MAAM,IAAI,SAAS,CACjB,6DAA6D,CAC9D,CAAC;IACJ,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,EAAE;gBACzC,MAAM,IAAI,SAAS,CACjB,yDAAyD,CAC1D,CAAC;QACN,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM;YAC9D,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,wBAAwB,CACrC,MAAc,EACd,KAAwB,EACxB,QAA8C;IAE9C,MAAM,GAAG,GAAG,IAAI,oBAAoB,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC1D,IAAI,GAAW,CAAC;IAChB,IAAI,MAA8B,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,IAAI,CACjB,MAAM,EACN,SAAS,CAAC,QAAQ,GAAG,0BAA0B,CAChD,CAAC;QACF,GAAG,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,GAAG,CAAC;QACnE,MAAM,KAAK,CAAC;IACd,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,EAAE,KAAK,EAAE,CAAC;IACxB,CAAC;IACD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAE,CAAC,IAAI,EAAE,CAAC;QAClC,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,IAAI,MAAyB,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAsB,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,SAAS,CACjB,4CAA4C,KAAK,GAAG,CAAC,EAAE,CACxD,CAAC;QACJ,CAAC;QACD,IAAI,MAAM,CAAC,QAAQ,KAAK,GAAG,CAAC,OAAO,GAAG,CAAC;YACrC,MAAM,IAAI,SAAS,CACjB,+CAA+C,KAAK,GAAG,CAAC,EAAE,CAC3D,CAAC;QACJ,GAAG,CAAC,MAAM,CAAC;YACT,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;YAC3D,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;YACjE,eAAe,EAAE,GAAG,CAAC,OAAO;SAC7B,CAAC,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,MAAM,OAAO,sBAAsB;IACxB,OAAO,CAAS;IAChB,MAAM,CAAoB;IAC1B,SAAS,CAAuC;IAChD,KAAK,CAAS;IACvB,IAAI,CAAuB;IAE3B,YACE,OAAsC,EACtC,KAAwB,EACxB,MAAc,EACd,GAAyB;QAEzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;QAC9B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC;QAClC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC;QACpB,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;IAClB,CAAC;IAED,0EAA0E;IACnE,MAAM,CAAC,KAAK,CAAC,IAAI,CACtB,OAAsC;QAEtC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,MAAM,iCAAiC,CACpD,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,YAAY,CACrB,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,4BAA4B,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACnE,IAAI,CAAC;YACH,MAAM,iCAAiC,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAChE,MAAM,GAAG,GAAG,MAAM,wBAAwB,CACxC,MAAM,EACN,KAAK,EACL,OAAO,CAAC,QAAQ,CACjB,CAAC;YACF,OAAO,IAAI,sBAAsB,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QACjE,CAAC;gBAAS,CAAC;YACT,MAAM,OAAO,EAAE,CAAC;QAClB,CAAC;IACH,CAAC;IAED,uEAAuE;IACvE,IAAW,IAAI;QACb,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,qFAAqF;IAC9E,KAAK,CAAC,cAAc;QACzB,IAAI,CAAC,IAAI,GAAG,MAAM,IAAI,CAAC,0BAA0B,EAAE,CAAC;QACpD,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;IAC3B,CAAC;IAED,yEAAyE;IAClE,KAAK,CAAC,MAAM,CACjB,KAA6B;QAE7B,MAAM,OAAO,GAAG,MAAM,4BAA4B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjE,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,iCAAiC,CACpD,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,KAAK,CACX,CAAC;YACF,MAAM,SAAS,GAAG,MAAM,wBAAwB,CAC9C,MAAM,EACN,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,SAAS,CACf,CAAC;YACF,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACtC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACvD,MAAM,iCAAiC,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC9D,MAAM,MAAM,GAAG,MAAM,IAAI,CACvB,MAAM,EACN,SAAS,CAAC,QAAQ;gBAChB,SAAS,CAAC,OAAO;gBACjB,SAAS,CAAC,QAAQ;gBAClB,0BAA0B,CAC7B,CAAC;YACF,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAChE,CAAC;oBAAS,CAAC;gBACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACvB,CAAC;YACD,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;YACtB,OAAO,KAAK,CAAC;QACf,CAAC;gBAAS,CAAC;YACT,MAAM,OAAO,EAAE,CAAC;QAClB,CAAC;IACH,CAAC;IAED,gFAAgF;IACzE,KAAK,CAAC,QAAQ,CACnB,UAA2D,EAAE;QAE7D,IAAI,CAAC,IAAI,GAAG,MAAM,IAAI,CAAC,0BAA0B,EAAE,CAAC;QACpD,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,8DAA8D;IACvD,KAAK,CAAC,IAAI,CACf,OAAoD;QAEpD,IAAI,CAAC,IAAI,GAAG,MAAM,IAAI,CAAC,0BAA0B,EAAE,CAAC;QACpD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,CAAC,MAAM,CAClB,UAA0C,EAAE;QAE5C,IAAI,CAAC,IAAI,GAAG,MAAM,IAAI,CAAC,0BAA0B,EAAE,CAAC;QACpD,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,8EAA8E;IACvE,KAAK,CAAC,OAAO,CAClB,YAAmB,EACnB,OAAwC,EACxC,UAA6D,EAAE;QAE/D,IAAI,CAAC,IAAI,GAAG,MAAM,IAAI,CAAC,0BAA0B,EAAE,CAAC;QACpD,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC3D,CAAC;IAED,2FAA2F;IAC3F,KAAK,CAAC,0BAA0B;QAC9B,MAAM,OAAO,GAAG,MAAM,4BAA4B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjE,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,iCAAiC,CACpD,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,KAAK,CACX,CAAC;YACF,OAAO,MAAM,wBAAwB,CACnC,MAAM,EACN,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,SAAS,CACf,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,MAAM,OAAO,EAAE,CAAC;QAClB,CAAC;IACH,CAAC;CACF","debugId":"b00bbd6d-eb0d-5fbf-8f87-456d479e7807"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="d57e6d37-e489-5e57-b146-bcc9fab2e3d7")}catch(e){}}();
|
|
3
3
|
const BUILTIN_RELATIONSHIP_KINDS = [
|
|
4
4
|
{
|
|
5
5
|
kind: "blocked_by",
|
|
@@ -144,6 +144,49 @@ function assertRelationshipHierarchyDirection(definition, kind) {
|
|
|
144
144
|
if (!definition.hierarchy && definition.hierarchyDirection !== undefined)
|
|
145
145
|
throw new TypeError(`Non-hierarchy relationship kind cannot declare hierarchy direction: ${kind}`);
|
|
146
146
|
}
|
|
147
|
+
/** Validate and normalize the stable identifier and compatibility version. */
|
|
148
|
+
function normalizeRelationshipKindIdentifier(definition) {
|
|
149
|
+
if (typeof definition !== "object" || definition === null)
|
|
150
|
+
throw new TypeError("Relationship kind definition requires an object");
|
|
151
|
+
if (typeof definition.kind !== "string")
|
|
152
|
+
throw new TypeError("Relationship kind requires a string identifier");
|
|
153
|
+
const kind = normalizeKind(definition.kind);
|
|
154
|
+
if (!/^[a-z][a-z0-9_]*$/.test(kind))
|
|
155
|
+
throw new TypeError(`Invalid relationship kind: ${definition.kind}`);
|
|
156
|
+
if (!Number.isInteger(definition.compatibilityVersion) ||
|
|
157
|
+
definition.compatibilityVersion < 1)
|
|
158
|
+
throw new TypeError(`Invalid compatibility version for ${kind}`);
|
|
159
|
+
return kind;
|
|
160
|
+
}
|
|
161
|
+
/** Validate traversal, ordering, hierarchy, cardinality, and lifecycle semantics. */
|
|
162
|
+
function assertRelationshipKindSemantics(definition, kind) {
|
|
163
|
+
if (!["directed", "undirected"].includes(definition.direction))
|
|
164
|
+
throw new TypeError(`Invalid relationship direction for ${kind}`);
|
|
165
|
+
if (typeof definition.ordering !== "boolean")
|
|
166
|
+
throw new TypeError(`Invalid relationship ordering flag for ${kind}`);
|
|
167
|
+
if (![undefined, true, false].includes(definition.hierarchy))
|
|
168
|
+
throw new TypeError(`Invalid relationship hierarchy flag for ${kind}`);
|
|
169
|
+
if (!["one", "many"].includes(definition.outgoing))
|
|
170
|
+
throw new TypeError(`Invalid outgoing relationship cardinality for ${kind}`);
|
|
171
|
+
if (!["one", "many"].includes(definition.incoming))
|
|
172
|
+
throw new TypeError(`Invalid incoming relationship cardinality for ${kind}`);
|
|
173
|
+
if (!["persistent", "supersedable", "ephemeral"].includes(definition.lifecycle))
|
|
174
|
+
throw new TypeError(`Invalid relationship lifecycle for ${kind}`);
|
|
175
|
+
if (typeof definition.allowSelf !== "boolean")
|
|
176
|
+
throw new TypeError(`Invalid relationship self-edge flag for ${kind}`);
|
|
177
|
+
}
|
|
178
|
+
/** Validate application payload-schema and compatibility-alias containers. */
|
|
179
|
+
function assertRelationshipKindPayload(definition, kind) {
|
|
180
|
+
if (definition.payloadSchema !== undefined &&
|
|
181
|
+
(typeof definition.payloadSchema !== "object" ||
|
|
182
|
+
definition.payloadSchema === null ||
|
|
183
|
+
Array.isArray(definition.payloadSchema)))
|
|
184
|
+
throw new TypeError(`Invalid relationship payload schema for ${kind}`);
|
|
185
|
+
if (definition.aliases !== undefined &&
|
|
186
|
+
(!Array.isArray(definition.aliases) ||
|
|
187
|
+
definition.aliases.some((alias) => typeof alias !== "string")))
|
|
188
|
+
throw new TypeError(`Invalid relationship aliases for ${kind}`);
|
|
189
|
+
}
|
|
147
190
|
/** Mutable registry with immutable snapshots and collision-safe extension registration. */
|
|
148
191
|
export class RelationshipKindRegistry {
|
|
149
192
|
#definitions = new Map();
|
|
@@ -155,12 +198,9 @@ export class RelationshipKindRegistry {
|
|
|
155
198
|
}
|
|
156
199
|
/** Register one definition after validating its identifier, version, and aliases. */
|
|
157
200
|
register(definition) {
|
|
158
|
-
const kind =
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
if (!Number.isInteger(definition.compatibilityVersion) ||
|
|
162
|
-
definition.compatibilityVersion < 1)
|
|
163
|
-
throw new TypeError(`Invalid compatibility version for ${kind}`);
|
|
201
|
+
const kind = normalizeRelationshipKindIdentifier(definition);
|
|
202
|
+
assertRelationshipKindSemantics(definition, kind);
|
|
203
|
+
assertRelationshipKindPayload(definition, kind);
|
|
164
204
|
assertRelationshipPrecedence(definition, kind);
|
|
165
205
|
assertRelationshipHierarchyDirection(definition, kind);
|
|
166
206
|
if (this.#definitions.has(kind) || this.#aliases.has(kind))
|
|
@@ -180,6 +220,7 @@ export class RelationshipKindRegistry {
|
|
|
180
220
|
const normalized = Object.freeze({
|
|
181
221
|
...definition,
|
|
182
222
|
kind,
|
|
223
|
+
hierarchy: definition.hierarchy ?? false,
|
|
183
224
|
inverse,
|
|
184
225
|
aliases: Object.freeze(aliases),
|
|
185
226
|
payloadSchema: definition.payloadSchema
|
|
@@ -576,4 +617,4 @@ export function dependencyToRelationship(source, dependency, registry = defaultR
|
|
|
576
617
|
};
|
|
577
618
|
}
|
|
578
619
|
//# sourceMappingURL=relationships.js.map
|
|
579
|
-
//# debugId=
|
|
620
|
+
//# debugId=d57e6d37-e489-5e57-b146-bcc9fab2e3d7
|