@tier0/sdk-v2 0.9.2 → 0.9.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/README.md +8 -4
  2. package/dist/cjs/data/bootstrap.js +4 -0
  3. package/dist/cjs/data/bootstrap.js.map +1 -1
  4. package/dist/cjs/data/client.d.ts +9 -4
  5. package/dist/cjs/data/client.js +26 -13
  6. package/dist/cjs/data/client.js.map +1 -1
  7. package/dist/cjs/data/collection.d.ts +8 -7
  8. package/dist/cjs/data/collection.js +4 -3
  9. package/dist/cjs/data/collection.js.map +1 -1
  10. package/dist/cjs/data/declarations.d.ts +1 -1
  11. package/dist/cjs/data/declarations.js.map +1 -1
  12. package/dist/cjs/data/define.d.ts +7 -0
  13. package/dist/cjs/data/define.js +4 -0
  14. package/dist/cjs/data/define.js.map +1 -1
  15. package/dist/cjs/data/schema.d.ts +4 -4
  16. package/dist/cjs/data/schema.js +26 -5
  17. package/dist/cjs/data/schema.js.map +1 -1
  18. package/dist/cjs/data/subscribe.d.ts +9 -8
  19. package/dist/cjs/data/subscribe.js +5 -11
  20. package/dist/cjs/data/subscribe.js.map +1 -1
  21. package/dist/cjs/uns-v2/generated.d.ts +17 -17
  22. package/dist/cjs/uns-v2/generated.js +16 -16
  23. package/dist/cjs/uns-v2/generated.js.map +1 -1
  24. package/dist/esm/data/bootstrap.js +4 -0
  25. package/dist/esm/data/bootstrap.js.map +1 -1
  26. package/dist/esm/data/client.d.ts +9 -4
  27. package/dist/esm/data/client.js +26 -13
  28. package/dist/esm/data/client.js.map +1 -1
  29. package/dist/esm/data/collection.d.ts +8 -7
  30. package/dist/esm/data/collection.js +4 -3
  31. package/dist/esm/data/collection.js.map +1 -1
  32. package/dist/esm/data/declarations.d.ts +1 -1
  33. package/dist/esm/data/declarations.js.map +1 -1
  34. package/dist/esm/data/define.d.ts +7 -0
  35. package/dist/esm/data/define.js +3 -0
  36. package/dist/esm/data/define.js.map +1 -1
  37. package/dist/esm/data/schema.d.ts +4 -4
  38. package/dist/esm/data/schema.js +27 -6
  39. package/dist/esm/data/schema.js.map +1 -1
  40. package/dist/esm/data/subscribe.d.ts +9 -8
  41. package/dist/esm/data/subscribe.js +5 -11
  42. package/dist/esm/data/subscribe.js.map +1 -1
  43. package/dist/esm/uns-v2/generated.d.ts +17 -17
  44. package/dist/esm/uns-v2/generated.js +16 -16
  45. package/dist/esm/uns-v2/generated.js.map +1 -1
  46. package/package.json +1 -1
  47. package/skills/tier0-sdk-v2/tier0-sdk-v2-data/SKILL.md +3 -1
  48. package/skills/tier0-sdk-v2/tier0-sdk-v2-data/references/modeling.md +16 -0
  49. package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/SKILL.md +3 -6
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/data/schema.ts"],"names":[],"mappings":";;;AAyVA,sCAEC;AAGD,wCAmBC;AAGD,wCAaC;AAkHD,8CAwBC;AA8DD,4CAaC;AAOD,4CA4BC;AAOD,wCAgEC;AAhsBD;;;;;;;;;;GAUG;AACH,6BAAwB;AACxB,2CAA6G;AA0C7G,MAAa,qBAAsB,SAAQ,KAAK;IACrC,KAAK,CAAS;IACd,MAAM,CAAgB;IAE/B,YAAY,KAAa,EAAE,MAAqB;QAC9C,KAAK,CACH;YACE,eAAe,KAAK,4BAA4B;YAChD,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,CAAC,IAAI,IAAI,QAAQ,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;SAC5E,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;QACpC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAfD,sDAeC;AAED,sGAAsG;AACzF,QAAA,aAAa,GAAG;IAC3B,KAAK,EAAE,CAAC;IACR,UAAU,EAAE,GAAG;IACf,UAAU,EAAE,GAAG;IACf,KAAK,EAAE,GAAG;IACV,WAAW,EAAE,IAAI;IACjB,OAAO,EAAE,EAAE;IACX,UAAU,EAAE,CAAC;IACb,UAAU,EAAE,CAAC;IACb,qBAAqB,EAAE,EAAE;IACzB,qBAAqB,EAAE,UAAU;CACzB,CAAC;AAEX,MAAM,kBAAkB,GAAG,MAAM,CAAC,gBAAgB,CAAC;AACnD,mCAAmC;AACnC,MAAM,sBAAsB,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAW,CAAC;AAC/E,MAAM,YAAY,GAAG,IAAI,GAAG,CAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AACpG,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;IAC5B,MAAM;IACN,QAAQ;IACR,OAAO;IACP,aAAa;IACb,YAAY;IACZ,UAAU;IACV,sBAAsB;IACtB,OAAO;IACP,MAAM;IACN,SAAS;IACT,SAAS;CACV,CAAC,CAAC;AACH,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;AAElD,MAAM,aAAa,GACjB,qMAAqM,CAAC;AACxM,MAAM,cAAc,GAAG,iFAAiF,CAAC;AACzG,MAAM,gBAAgB,GACpB,6KAA6K,CAAC;AAEhL,MAAM,aAAa,GAA2B;IAC5C,KAAK,EAAE,aAAa;IACpB,KAAK,EAAE,aAAa;IACpB,KAAK,EAAE,oFAAoF;IAC3F,GAAG,EAAE,mCAAmC;IACxC,OAAO,EAAE,sHAAsH;IAC/H,MAAM,EAAE,wMAAwM,cAAc,EAAE;IAChO,OAAO,EAAE,8FAA8F,cAAc,EAAE;IACvH,SAAS,EAAE,8DAA8D,cAAc,EAAE;IACzF,SAAS,EAAE,8DAA8D,cAAc,EAAE;IACzF,eAAe,EAAE,2DAA2D;IAC5E,KAAK,EAAE,qDAAqD;IAC5D,gBAAgB,EAAE,yHAAyH;IAC3I,gBAAgB,EAAE,mEAAmE;IACrF,UAAU,EAAE,oDAAoD,cAAc,EAAE;IAChF,QAAQ,EAAE,yCAAyC,cAAc,EAAE;IACnE,QAAQ,EAAE,yCAAyC,cAAc,EAAE;IACnE,WAAW,EAAE,qCAAqC,cAAc,EAAE;IAClE,WAAW,EAAE,+DAA+D;IAC5E,aAAa,EAAE,gBAAgB;IAC/B,iBAAiB,EAAE,gBAAgB;IACnC,aAAa,EAAE,gBAAgB;IAC/B,aAAa,EAAE,gBAAgB;IAC/B,IAAI,EAAE,0HAA0H;IAChI,KAAK,EAAE,0HAA0H;IACjI,QAAQ,EAAE,sEAAsE;CACjF,CAAC;AAIF,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;AAElC,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;AACtC,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY,EAAE,GAAoB;IAClD,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,IAAI,IAAI,GAAG,GAAG,CAAC;IACtD,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;AACvC,CAAC;AAED,SAAS,cAAc,CAAC,GAAW;IACjC,IAAI,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,GAAG,6CAA6C,CAAC;IAC1F,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,eAAe,GAAG,gBAAgB,CAAC;IAChF,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,eAAe,GAAG,sCAAsC,CAAC;IACxF,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,aAAa,CAAC,MAAiB;IACtC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IACxE,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IAC1E,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,EAAE,CAAC;QACvD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;IACjF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,aAAa,CAAC,IAAa,EAAE,IAAY,EAAE,KAAa,EAAE,MAAqB;IACtF,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,2BAA2B,EAAE,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,KAAK,GAAG,qBAAa,CAAC,KAAK,EAAE,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,uBAAuB,qBAAa,CAAC,KAAK,iDAAiD,EAAE,CAAC,CAAC;QAC5H,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,KAAK,GAAG,IAAI,CAAC;IACjB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,IAAI,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,GAAG,KAAK,SAAS,CAAC;YAAE,SAAS;QAC3E,KAAK,GAAG,KAAK,CAAC;QACd,MAAM,CAAC,IAAI,CAAC;YACV,IAAI;YACJ,OAAO,EAAE,KAAK,GAAG,wBAAwB,aAAa,CAAC,GAAG,CAAC,IAAI,+JAA+J,EAAE;SACjO,CAAC,CAAC;IACL,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IACjE,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACrB,IAAI,IAAI,KAAK,SAAS,IAAI,OAAO;QAAE,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC;IAC9E,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,oCAAoC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,aAAa,EAAE,EAAE,CAAC,CAAC;QACzG,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,uEAAuE,EAAE,CAAC,CAAC;QACxG,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACxD,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC,EAAE,CAAC;YACzF,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI;gBACJ,OAAO,EAAE,wHAAwH;aAClI,CAAC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,GAAG,GAAiB,EAAE,IAAI,EAAE,IAAwB,EAAE,CAAC;IAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,QAAQ,CAAC;QACnF,CAAC,CAAC,sBAAsB,CAAC,IAAI,CAAC;QAC9B,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;IAChB,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,KAAK,WAAW,CAAC,EAAE,CAAC;YACtK,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI;gBACJ,OAAO,EAAE,IAAI,KAAK,QAAQ;oBACxB,CAAC,CAAC,aAAa,CAAC,MAAM;oBACtB,CAAC,CAAC,6JAA6J;aAClK,CAAC,CAAC;YACH,KAAK,GAAG,KAAK,CAAC;QAChB,CAAC;IACH,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa,CAAU,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAClC,MAAM,KAAK,GAAG,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,qBAAa,CAAC,KAAK,CAAC,CAAC,CAAC,qBAAa,CAAC,WAAW,CAAC;QAChF,mFAAmF;QACnF,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,SAAS,CAAC,KAAK,CAAC,GAAG,KAAK,EAAE,CAAC;YAC1D,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,GAAG,kCAAkC,KAAK,eAAe,EAAE,CAAC,CAAC;YAC/F,KAAK,GAAG,KAAK,CAAC;QAChB,CAAC;aAAM,IAAI,KAAK,EAAE,CAAC;YACjB,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACnB,CAAC;IACH,CAAC;IAED,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,IAAI,IAAI,CAAC,oBAAoB,KAAK,SAAS,IAAI,IAAI,CAAC,oBAAoB,KAAK,KAAK,EAAE,CAAC;YACnF,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;YACjD,KAAK,GAAG,KAAK,CAAC;QAChB,CAAC;QACD,MAAM,aAAa,GAAG,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACzC,IAAI,KAAK,CAAC,MAAM,GAAG,qBAAa,CAAC,UAAU,EAAE,CAAC;YAC5C,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,qBAAa,CAAC,UAAU,gDAAgD,EAAE,CAAC,CAAC;YACtH,KAAK,GAAG,KAAK,CAAC;QAChB,CAAC;QACD,MAAM,UAAU,GAAiC,EAAE,CAAC;QACpD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACvC,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;YACzC,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;gBACvD,KAAK,GAAG,KAAK,CAAC;gBACd,SAAS;YACX,CAAC;YACD,MAAM,KAAK,GAAG,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,KAAK,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;YAC/E,IAAI,KAAK;gBAAE,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;;gBAC/B,KAAK,GAAG,KAAK,CAAC;QACrB,CAAC;QACD,GAAG,CAAC,UAAU,GAAG,UAAU,CAAC;QAC5B,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC3C,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;YACxH,CAAC,CAAC,EAAE,CAAC;QACP,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;YAAE,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACjD,GAAG,CAAC,oBAAoB,GAAG,KAAK,CAAC;IACnC,CAAC;SAAM,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,oBAAoB,KAAK,SAAS,EAAE,CAAC;QACnH,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,sCAAsC,EAAE,CAAC,CAAC;QACvE,KAAK,GAAG,KAAK,CAAC;IAChB,CAAC;IAED,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,gDAAgD,EAAE,CAAC,CAAC;YACjF,KAAK,GAAG,KAAK,CAAC;QAChB,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,EAAE,GAAG,IAAI,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;YACnE,IAAI,KAAK;gBAAE,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC;;gBACxB,KAAK,GAAG,KAAK,CAAC;QACrB,CAAC;IACH,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,MAAM,GAAgB,EAAE,CAAC;QAC/B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAG,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,CAAC;YACpG,MAAM,IAAI,GACR,MAAM;gBACN,CAAC,IAAI,KAAK,QAAQ;oBAChB,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ;oBAC3B,CAAC,CAAC,IAAI,KAAK,SAAS;wBAClB,CAAC,CAAC,OAAO,KAAK,KAAK,SAAS;wBAC5B,CAAC,CAAC,IAAI,KAAK,SAAS;4BAClB,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC;4BACzB,CAAC,CAAC,IAAI,KAAK,QAAQ;gCACjB,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ;gCAC3B,CAAC,CAAC,KAAK,CAAC,CAAC;YACnB,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,wBAAwB,IAAI,GAAG,EAAE,CAAC,CAAC;gBACnG,KAAK,GAAG,KAAK,CAAC;YAChB,CAAC;iBAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,KAAK,KAAK,CAAC,EAAE,CAAC;gBAC1D,MAAM,CAAC,IAAI,CAAC,KAAkB,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,GAAG,qBAAa,CAAC,UAAU,EAAE,CAAC;YAC7C,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,qBAAa,CAAC,UAAU,2DAA2D,EAAE,CAAC,CAAC;YACjI,KAAK,GAAG,KAAK,CAAC;QAChB,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;YAAE,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC;IAC3C,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,SAAS,CAAU,EAAE,CAAC;QAClD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAClC,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5C,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,GAAG,8BAA8B,EAAE,CAAC,CAAC;YACvE,KAAK,GAAG,KAAK,CAAC;YACd,SAAS;QACX,CAAC;QACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACzD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,GAAG,6BAA6B,EAAE,CAAC,CAAC;YACtE,KAAK,GAAG,KAAK,CAAC;YACd,SAAS;QACX,CAAC;QACD,oFAAoF;QACpF,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,kBAAkB;YAAE,SAAS;QAC3E,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACnB,CAAC;IACD,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,IAAI,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;QACxF,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,sCAAsC,EAAE,CAAC,CAAC;QACvE,KAAK,GAAG,KAAK,CAAC;IAChB,CAAC;IAED,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5B,CAAC;AAED,oEAAoE;AACpE,SAAgB,aAAa,CAAC,MAAiB;IAC7C,OAAO,OAAC,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAa,CAAC;AACzG,CAAC;AAED,sGAAsG;AACtG,SAAgB,cAAc,CAAC,KAAa,EAAE,MAAiB;IAC7D,IAAI,GAAa,CAAC;IAClB,IAAI,CAAC;QACH,GAAG,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,qBAAqB,CAAC,KAAK,EAAE;YACrC;gBACE,IAAI,EAAE,EAAE;gBACR,OAAO,EAAE,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,kRAAkR;aACrV;SACF,CAAC,CAAC;IACL,CAAC;IACD,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IACrD,IAAI,UAAU,IAAI,UAAU,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,gDAAgD,EAAE,CAAC,CAAC;IACvF,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU;QAAE,MAAM,IAAI,qBAAqB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACrF,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,8FAA8F;AAC9F,SAAgB,cAAc,CAAC,MAAoB,EAAE,IAAY;IAC/D,IAAI,OAAO,GAA6B,MAAM,CAAC;IAC/C,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACtC,IAAI,CAAC,OAAO;YAAE,OAAO,SAAS,CAAC;QAC/B,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,IAAI,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;YACxD,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC;QAC1B,CAAC;aAAM,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrC,OAAO,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,cAAc,CAAC,OAAe;IACrC,OAAO,kCAAkC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC1D,CAAC;AAED;;;;GAIG;AACH,SAAS,gBAAgB,CAAC,KAAa,EAAE,MAAoB,EAAE,IAAY,EAAE,IAAqB;IAChG,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,OAAO,GAA6B,MAAM,CAAC;IAC/C,KAAK,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;QACrD,IAAI,OAAO,EAAE,IAAI,KAAK,OAAO,EAAE,CAAC;YAC9B,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACxD,OAAO,IAAI,IAAI,sCAAsC,SAAS,qFAAqF,CAAC;QACtJ,CAAC;QACD,OAAO,GAAG,OAAO,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACjF,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,IAAI,iCAAiC,KAAK,IAAI,CAAC;IAC1E,CAAC;IACD,MAAM,MAAM,GAAG,OAAuB,CAAC;IACvC,IAAI,IAAI,KAAK,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,EAAE,CAAC;QAC9E,OAAO,IAAI,IAAI,WAAW,MAAM,CAAC,IAAI,4CAA4C,CAAC;IACpF,CAAC;IACD,IAAI,IAAI,KAAK,KAAK,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC1E,OAAO,IAAI,IAAI,UAAU,MAAM,CAAC,IAAI,gDAAgD,CAAC;IACvF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,6EAA6E;AAC7E,SAAS,UAAU,CAAC,KAAa,EAAE,MAAoB,EAAE,KAAgB,EAAE,IAAqB;IAC9F,MAAM,OAAO,GAAG,KAAK,CAAC,kBAA4B,CAAC;IACnD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,qBAAa,CAAC,qBAAqB,IAAI,OAAO,GAAG,qBAAa,CAAC,qBAAqB,EAAE,CAAC;QACjI,OAAO,6CAA6C,qBAAa,CAAC,qBAAqB,OAAO,qBAAa,CAAC,qBAAqB,cAAc,CAAC;IAClJ,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,MAAM;QAAE,OAAO,mEAAmE,CAAC;IAC7I,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAClD,IAAI,MAAM,EAAE,IAAI,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,cAAc,KAAK,CAAC,IAAI,SAAS,KAAK,0FAA0F,CAAC;IAC1I,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa,EAAE,OAA6B,EAAE,MAAoB,EAAE,MAAqB;IACjH,MAAM,GAAG,GAAsB,EAAE,CAAC;IAClC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,OAAO,CAAC,MAAM,GAAG,qBAAa,CAAC,OAAO,EAAE,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,qBAAa,CAAC,OAAO,0BAA0B,EAAE,CAAC,CAAC;IACxG,CAAC;IACD,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;QAClC,MAAM,EAAE,GAAG,WAAW,QAAQ,GAAG,CAAC;QAClC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC5E,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,EAAE,CAAC;YAC/D,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,uCAAuC,EAAE,CAAC,CAAC;YAC5E,OAAO;QACT,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,qBAAa,CAAC,UAAU,EAAE,CAAC;YAClE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,0BAA0B,qBAAa,CAAC,UAAU,SAAS,EAAE,CAAC,CAAC;YAChG,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,OAAO,CAAC;QACnC,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YACvC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,6BAA6B,EAAE,CAAC,CAAC;YAClE,OAAO;QACT,CAAC;QACD,IAAI,IAAI,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3D,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,gEAAgE,EAAE,CAAC,CAAC;YACrG,OAAO;QACT,CAAC;QACD,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;YACzC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,wCAAwC,EAAE,CAAC,CAAC;YAC7E,OAAO;QACT,CAAC;QACD,KAAK,MAAM,SAAS,IAAI,KAAK,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;YACjE,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;gBAC5C,OAAO;YACT,CAAC;QACH,CAAC;QACD,IAAI,KAAK,CAAC,kBAAkB,KAAK,SAAS,EAAE,CAAC;YAC3C,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YACvD,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;gBAC5C,OAAO;YACT,CAAC;YACD,GAAG,IAAI,CAAC,CAAC;YACT,IAAI,GAAG,GAAG,qBAAa,CAAC,UAAU,EAAE,CAAC;gBACnC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,gEAAgE,EAAE,CAAC,CAAC;gBACrG,OAAO;YACT,CAAC;QACH,CAAC;QACD,MAAM,UAAU,GAAoB,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7F,IAAI,KAAK,CAAC,MAAM;YAAE,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC;QAC3C,IAAI,IAAI,KAAK,KAAK;YAAE,UAAU,CAAC,IAAI,GAAG,KAAK,CAAC;QAC5C,IAAI,KAAK,CAAC,kBAAkB,KAAK,SAAS;YAAE,UAAU,CAAC,kBAAkB,GAAG,KAAK,CAAC,kBAAkB,CAAC;QACrG,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACnB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;IACH,4GAA4G;IAC5G,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,kBAAkB,KAAK,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACnH,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,kBAAkB,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AAClI,CAAC;AAED,MAAM,QAAQ,GAAG,IAAI,OAAO,EAA4C,CAAC;AAEzE,0EAA0E;AAC1E,SAAgB,iBAAiB,CAAC,UAAgC;IAChE,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACxC,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,IAAI,CAAC,yBAAa,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,qBAAqB,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,oBAAoB,yBAAa,GAAG,EAAE,CAAC,CAAC,CAAC;IACxH,CAAC;IACD,IAAI,CAAC;QACH,IAAA,gCAAoB,EAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,qBAAqB,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IACzI,CAAC;IACD,MAAM,YAAY,GAAG,cAAc,CAAC,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IACzE,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,MAAM,OAAO,GAAG,gBAAgB,CAAC,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;IAC7F,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,qBAAqB,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACjF,MAAM,MAAM,GAAuB;QACjC,KAAK,EAAE,UAAU,CAAC,KAAK;QACvB,IAAI,EAAE,UAAU,CAAC,IAAI;QACrB,YAAY;QACZ,OAAO;QACP,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC3E,CAAC;IACF,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,MAAM,CAAC;AAChB,CAAC;AAQD,SAAS,gBAAgB,CAAC,MAAgC,EAAE,KAAc,EAAE,IAAe,EAAE,GAAuB;IAClH,IAAI,CAAC,MAAM;QAAE,OAAO;IACpB,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QACrD,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC;QACzE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,GAAG,CAAC,IAAI,CAAC;gBACP,IAAI,EAAE,mBAAmB;gBACzB,IAAI,EAAE,OAAO;gBACb,IAAI;gBACJ,OAAO,EAAE,gBAAgB,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,kCAAkC;gBACtL,KAAK,EAAE,KAAK;aACO,CAAC,CAAC;QACzB,CAAC;QACD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACjD,IAAI,GAAG,IAAI,UAAU;gBAAE,gBAAgB,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;QACvF,CAAC;IACH,CAAC;SAAM,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3D,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAC9F,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAI,SAAuB,EAAE,YAAsC,EAAE,KAAc,EAAE,IAAe;IACtH,MAAM,MAAM,GAAuB,EAAE,CAAC;IACtC,gBAAgB,CAAC,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,EAAsB,CAAC,CAAC;IACzH,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,OAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACpD,OAAO,MAAM,CAAC,IAAS,CAAC;AAC1B,CAAC;AAED,SAAS,KAAK,CAAC,MAAiB,EAAE,IAAY;IAC5C,IAAI,OAAO,GAA0B,MAAM,CAAC;IAC5C,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACtC,OAAO,OAAO,YAAY,OAAC,CAAC,WAAW;YAAE,OAAO,GAAG,OAAO,CAAC,MAAM,EAAe,CAAC;QACjF,IAAI,OAAO,YAAY,OAAC,CAAC,SAAS,EAAE,CAAC;YACnC,OAAO,GAAI,OAAO,CAAC,KAAmC,CAAC,OAAO,CAAC,CAAC;QAClE,CAAC;aAAM,IAAI,OAAO,YAAY,OAAC,CAAC,QAAQ,IAAI,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;YACpE,OAAO,GAAG,OAAO,CAAC,OAAoB,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,CAAC,OAAO;YAAE,OAAO,SAAS,CAAC;IACjC,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,eAAe,CAAC,IAAe,EAAE,OAAe,EAAE,KAAc;IACvE,OAAO,IAAI,OAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAsB,CAAC,CAAC,CAAC;AACxF,CAAC;AAED,6EAA6E;AAC7E,SAAgB,gBAAgB,CAC9B,UAAgC,EAChC,QAAiC;IAEjC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC;QAAE,MAAM,eAAe,CAAC,EAAE,EAAE,6BAA6B,EAAE,QAAQ,CAAC,CAAC;IACjG,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,QAAQ,CAAC;IACzC,KAAK,KAAK,CAAC;IACX,IAAI,GAAG,KAAK,SAAS,IAAI,CAAC,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC;QAC3F,MAAM,eAAe,CAAC,CAAC,KAAK,CAAC,EAAE,6CAA6C,EAAE,GAAG,CAAC,CAAC;IACrF,CAAC;IACD,MAAM,EAAE,YAAY,EAAE,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;IACvD,MAAM,IAAI,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,CAA4B,CAAC;IAC/F,OAAO,EAAE,GAAG,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;AACnE,CAAC;AAED;;;;GAIG;AACH,SAAgB,gBAAgB,CAC9B,UAAgC,EAChC,IAA6B,EAC7B,WAA8B;IAE9B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;QAAE,MAAM,eAAe,CAAC,CAAC,MAAM,CAAC,EAAE,6BAA6B,EAAE,IAAI,CAAC,CAAC;IAC/F,IAAI,KAAK,IAAI,IAAI,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;QACrC,MAAM,eAAe,CAAC,CAAC,MAAM,EAAE,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,wFAAwF,EAAE,IAAI,CAAC,CAAC;IACnK,CAAC;IACD,MAAM,EAAE,YAAY,EAAE,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;IACvD,MAAM,UAAU,GAAG,YAAY,CAAC,UAAU,IAAI,EAAE,CAAC;IACjD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,IAAI,UAAU,CAAC,CAAC,CAAC;IAC1E,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,UAAU,CAAC,CAAC,CAAC;IAC3E,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,eAAe,CAAC,CAAC,UAAU,CAAC,EAAE,cAAc,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,UAAU,CAAC,KAAK,IAAI,EAAE,WAAW,CAAC,CAAC;IACzK,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,CAA4B,CAAC;IAErH,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC5F,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,IAAa,CAAC,CAAC,CAAC,CAAC;IACnF,MAAM,aAAa,GAAiB;QAClC,GAAG,YAAY;QACf,UAAU,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7F,QAAQ,EAAE,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;KAClE,CAAC;IACF,MAAM,MAAM,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAa,CAAC,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,CAA4B,CAAC;IAC/H,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC/F,OAAO,EAAE,GAAG,MAAM,EAAE,GAAG,WAAW,EAAE,CAAC;AACvC,CAAC;AAED,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;AAC1D,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;AAC1D,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAEpD,sFAAsF;AACtF,SAAgB,cAAc,CAAC,UAAgC,EAAE,MAA+B;IAC9F,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/D,MAAM,eAAe,CAAC,EAAE,EAAE,uDAAuD,EAAE,MAAM,CAAC,CAAC;IAC7F,CAAC;IACD,MAAM,EAAE,YAAY,EAAE,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;IACvD,MAAM,GAAG,GAA4B,EAAE,CAAC;IAExC,KAAK,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACxD,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,eAAe,CAAC,CAAC,QAAQ,CAAC,EAAE,yGAAyG,EAAE,MAAM,CAAC,CAAC;QACvJ,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;YAAE,MAAM,eAAe,CAAC,CAAC,QAAQ,CAAC,EAAE,KAAK,QAAQ,oCAAoC,EAAE,MAAM,CAAC,CAAC;QACzH,MAAM,IAAI,GAA4B,EAAE,CAAC;QAEzC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACnD,MAAM,SAAS,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YACnC,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACpE,MAAM,eAAe,CAAC,SAAS,EAAE,kCAAkC,EAAE,KAAK,CAAC,CAAC;YAC9E,CAAC;YACD,MAAM,MAAM,GAAG,cAAc,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;YAClD,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACjD,IAAI,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;gBAC1B,MAAM,eAAe,CAAC,SAAS,EAAE,IAAI,IAAI,iCAAiC,UAAU,CAAC,KAAK,IAAI,EAAE,KAAK,CAAC,CAAC;YACzG,CAAC;YAED,IAAI,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAClC,IAAI,KAAK,KAAK,SAAS;oBAAE,SAAS;gBAClC,IAAI,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;YAChE,CAAC;iBAAM,IAAI,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC3C,MAAM,OAAO,GAAG,SAAS,YAAY,OAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;gBACpF,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,OAAO,YAAY,OAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAChE,MAAM,eAAe,CAAC,SAAS,EAAE,KAAK,QAAQ,6BAA6B,IAAI,QAAQ,MAAM,CAAC,IAAI,GAAG,EAAE,KAAK,CAAC,CAAC;gBAChH,CAAC;gBACD,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAChE,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAE,KAA8B,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;gBACvE,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACvC,WAAW,CAAC,OAAO,CAAC,OAAoB,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CACjH,CAAC;gBACF,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,GAAI,KAAiC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC3F,CAAC;iBAAM,IAAI,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC3C,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;oBAC1D,MAAM,eAAe,CAAC,SAAS,EAAE,KAAK,QAAQ,8BAA8B,IAAI,QAAQ,MAAM,CAAC,IAAI,GAAG,EAAE,KAAK,CAAC,CAAC;gBACjH,CAAC;gBACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;oBACzD,MAAM,eAAe,CAAC,SAAS,EAAE,KAAK,QAAQ,2BAA2B,EAAE,KAAK,CAAC,CAAC;gBACpF,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;YACrB,CAAC;iBAAM,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAClC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC;oBACtE,MAAM,eAAe,CAAC,SAAS,EAAE,uBAAuB,MAAM,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;gBAC5G,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACN,uEAAuE;gBACvE,kDAAkD;gBAClD,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;YACrB,CAAC;QACH,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;YAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;IACzD,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClC,MAAM,eAAe,CAAC,EAAE,EAAE,+EAA+E,EAAE,MAAM,CAAC,CAAC;IACrH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC","sourcesContent":["/**\n * Zod 4 → UNS record schema normalizer, plus write-time validation.\n *\n * UNS stores one closed JSON-schema subset per collection: `type`,\n * `properties`, `required`, `additionalProperties: false`, `items`, `enum`,\n * `minimum`, `maximum`, declared `format`, `title`, `description`. `toRecordSchema` converts the\n * `z.toJSONSchema` output into exactly that subset and rejects every other\n * keyword with a concrete replacement, so a declaration that cannot be stored\n * fails when it is compiled (an App can compile its declarations at build\n * time) instead of on the first request.\n */\nimport { z } from 'zod';\nimport { ALIAS_PATTERN, assertCollectionName, type CollectionDefinition, type IndexSpec } from './define.js';\n\nexport type RecordSchemaType = 'object' | 'array' | 'string' | 'number' | 'integer' | 'boolean';\nexport type EnumValue = string | number | boolean;\n\nexport interface RecordSchema {\n type: RecordSchemaType;\n /** Display annotation; does not add range/date checks or convert stored values. */\n format?: 'int32' | 'float' | 'double' | 'date-time';\n title?: string;\n description?: string;\n properties?: Record<string, RecordSchema>;\n required?: string[];\n additionalProperties?: false;\n items?: RecordSchema;\n enum?: EnumValue[];\n minimum?: number;\n maximum?: number;\n}\n\nexport interface NormalizedIndex {\n path?: string;\n paths?: string[];\n unique?: true;\n kind?: 'gin';\n expireAfterSeconds?: number;\n}\n\n/** One ensure item, exactly as it is sent to `/uns/app/collections/ensure`. */\nexport interface CompiledCollection {\n alias: string;\n name: string;\n recordSchema: RecordSchema;\n indexes: NormalizedIndex[];\n description?: string;\n}\n\nexport interface SchemaIssue {\n path: string;\n message: string;\n}\n\nexport class CollectionSchemaError extends Error {\n readonly alias: string;\n readonly issues: SchemaIssue[];\n\n constructor(alias: string, issues: SchemaIssue[]) {\n super(\n [\n `Collection \"${alias}\" cannot be stored in UNS:`,\n ...issues.map((issue) => ` - ${issue.path || '(root)'}: ${issue.message}`),\n ].join('\\n'),\n );\n this.name = 'CollectionSchemaError';\n this.alias = alias;\n this.issues = issues;\n }\n}\n\n/** UNS limits (unsmeta Schema.validate and collection indexes); title/description are UTF-8 bytes. */\nexport const SCHEMA_LIMITS = {\n depth: 8,\n properties: 128,\n enumValues: 100,\n title: 512,\n description: 2048,\n indexes: 16,\n indexPaths: 3,\n ttlIndexes: 1,\n minExpireAfterSeconds: 60,\n maxExpireAfterSeconds: 31_536_000,\n} as const;\n\nconst SAFE_INTEGER_BOUND = Number.MAX_SAFE_INTEGER;\n// 新声明必须携带明确数值格式;只补注解,不改变范围校验或已有集合。\nconst DEFAULT_NUMERIC_FORMAT = { integer: 'int32', number: 'double' } as const;\nconst SCHEMA_TYPES = new Set<string>(['object', 'array', 'string', 'number', 'integer', 'boolean']);\nconst KEPT_KEYWORDS = new Set([\n 'type',\n 'format',\n 'title',\n 'description',\n 'properties',\n 'required',\n 'additionalProperties',\n 'items',\n 'enum',\n 'minimum',\n 'maximum',\n]);\nconst RESERVED_FIELDS = new Set(['_id', '_meta']);\n\nconst NULLABLE_HINT =\n '`.nullable()`, `.nullish()` and `z.union()` are not storable. Make the field `.optional()` and leave it out instead of storing null; model alternatives as one type or as separate optional fields.';\nconst API_INPUT_HINT = 'Keep the collection schema plain and enforce this rule in the API input schema.';\nconst OPEN_OBJECT_HINT =\n '`z.record()`, `z.looseObject()` and `.catchall()` are not storable: every stored object is closed. Declare fixed properties, or store an array of `{ key, value }` objects.';\n\nconst KEYWORD_HINTS: Record<string, string> = {\n anyOf: NULLABLE_HINT,\n oneOf: NULLABLE_HINT,\n allOf: '`z.intersection()` / `.and()` is not storable. Merge the objects with `.extend()`.',\n not: 'Negated schemas are not storable.',\n default: '`.default()` / `.prefault()` / `.catch()` is not storable. Apply defaults in the service when building the document.',\n format: `Strings only support the declaration \\`z.string().meta({ format: 'date-time' })\\`, which does not validate or convert dates. Other string formats (\\`z.email()\\`, \\`z.uuid()\\`...) are not storable. ${API_INPUT_HINT}`,\n pattern: `\\`.regex()\\`, \\`.startsWith()\\` and similar patterns are not storable. Use \\`z.string()\\`. ${API_INPUT_HINT}`,\n minLength: `String length limits are not storable. Use \\`z.string()\\`. ${API_INPUT_HINT}`,\n maxLength: `String length limits are not storable. Use \\`z.string()\\`. ${API_INPUT_HINT}`,\n contentEncoding: 'Encoded string content is not storable. Use `z.string()`.',\n const: '`z.literal()` is not storable. Use `z.enum([...])`.',\n exclusiveMinimum: '`.gt()` / `.positive()` (exclusive bounds) are not storable. Use inclusive `.min()` (`.min(1)` for a positive integer).',\n exclusiveMaximum: '`.lt()` / `.negative()` are not storable. Use inclusive `.max()`.',\n multipleOf: `\\`.multipleOf()\\` / \\`.step()\\` is not storable. ${API_INPUT_HINT}`,\n minItems: `Array length limits are not storable. ${API_INPUT_HINT}`,\n maxItems: `Array length limits are not storable. ${API_INPUT_HINT}`,\n uniqueItems: `Array uniqueness is not storable. ${API_INPUT_HINT}`,\n prefixItems: '`z.tuple()` is not storable. Use an object with named fields.',\n propertyNames: OPEN_OBJECT_HINT,\n patternProperties: OPEN_OBJECT_HINT,\n minProperties: OPEN_OBJECT_HINT,\n maxProperties: OPEN_OBJECT_HINT,\n $ref: 'Recursive or shared `$ref` schemas are not storable. Inline the structure or keep child records in their own collection.',\n $defs: 'Recursive or shared `$ref` schemas are not storable. Inline the structure or keep child records in their own collection.',\n readOnly: '`.readonly()` is not storable; remove it from the collection schema.',\n};\n\ntype JsonNode = Record<string, unknown>;\n\nconst encoder = new TextEncoder();\n\nfunction utf8Bytes(value: string): number {\n return encoder.encode(value).length;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction joinPath(base: string, key: string | number): string {\n if (typeof key === 'number') return `${base}[${key}]`;\n return base ? `${base}.${key}` : key;\n}\n\nfunction validFieldName(key: string): string | null {\n if (RESERVED_FIELDS.has(key)) return `\"${key}\" is a system field and cannot be declared.`;\n if (key.length === 0 || key === '[]') return `Field name \"${key}\" is reserved.`;\n if (/[.$\\\\]/.test(key)) return `Field name \"${key}\" must not contain \".\", \"$\" or \"\\\\\".`;\n return null;\n}\n\nfunction inferEnumType(values: unknown[]): RecordSchemaType | null {\n if (values.length === 0) return null;\n if (values.every((value) => typeof value === 'string')) return 'string';\n if (values.every((value) => typeof value === 'boolean')) return 'boolean';\n if (values.every((value) => typeof value === 'number')) {\n return values.every((value) => Number.isInteger(value)) ? 'integer' : 'number';\n }\n return null;\n}\n\nfunction normalizeNode(node: unknown, path: string, depth: number, issues: SchemaIssue[]): RecordSchema | null {\n if (!isPlainObject(node)) {\n issues.push({ path, message: 'Expected a schema object.' });\n return null;\n }\n if (depth > SCHEMA_LIMITS.depth) {\n issues.push({ path, message: `Nesting deeper than ${SCHEMA_LIMITS.depth} levels is not storable. Flatten the structure.` });\n return null;\n }\n\n let valid = true;\n for (const key of Object.keys(node)) {\n if (KEPT_KEYWORDS.has(key) || (depth === 0 && key === '$schema')) continue;\n valid = false;\n issues.push({\n path,\n message: `\\`${key}\\` is not supported. ${KEYWORD_HINTS[key] ?? 'Only type, properties, items, enum, minimum, maximum, declared format, title and description are storable; remove this constraint from the collection schema.'}`,\n });\n }\n\n const rawEnum = Array.isArray(node.enum) ? node.enum : undefined;\n let type = node.type;\n if (type === undefined && rawEnum) type = inferEnumType(rawEnum) ?? undefined;\n if (Array.isArray(type)) {\n issues.push({ path, message: `A field must have one type, got [${type.join(', ')}]. ${NULLABLE_HINT}` });\n return null;\n }\n if (type === 'null') {\n issues.push({ path, message: '`z.null()` is not storable. Make the field optional and leave it out.' });\n return null;\n }\n if (typeof type !== 'string' || !SCHEMA_TYPES.has(type)) {\n if (type === undefined && !('anyOf' in node) && !('oneOf' in node) && !('allOf' in node)) {\n issues.push({\n path,\n message: 'Every field needs a concrete type; `z.any()`, `z.unknown()` and `z.json()` are not storable. Declare the actual shape.',\n });\n }\n return null;\n }\n\n const out: RecordSchema = { type: type as RecordSchemaType };\n const format = node.format === undefined && (type === 'integer' || type === 'number')\n ? DEFAULT_NUMERIC_FORMAT[type]\n : node.format;\n if (format !== undefined) {\n if ((type === 'integer' && format === 'int32') || (type === 'number' && (format === 'float' || format === 'double')) || (type === 'string' && format === 'date-time')) {\n out.format = format;\n } else {\n issues.push({\n path,\n message: type === 'string'\n ? KEYWORD_HINTS.format\n : '`format` must be \"int32\" on integer fields, \"float\" / \"double\" on number fields, or \"date-time\" on string fields. Other types and formats are not storable.',\n });\n valid = false;\n }\n }\n for (const key of ['title', 'description'] as const) {\n const value = node[key];\n if (value === undefined) continue;\n const limit = key === 'title' ? SCHEMA_LIMITS.title : SCHEMA_LIMITS.description;\n // UNS measures these with Go len(): UTF-8 bytes, so CJK text uses 3 per character.\n if (typeof value !== 'string' || utf8Bytes(value) > limit) {\n issues.push({ path, message: `\\`${key}\\` must be a string of at most ${limit} UTF-8 bytes.` });\n valid = false;\n } else if (value) {\n out[key] = value;\n }\n }\n\n if (type === 'object') {\n if (node.additionalProperties !== undefined && node.additionalProperties !== false) {\n issues.push({ path, message: OPEN_OBJECT_HINT });\n valid = false;\n }\n const rawProperties = isPlainObject(node.properties) ? node.properties : {};\n const names = Object.keys(rawProperties);\n if (names.length > SCHEMA_LIMITS.properties) {\n issues.push({ path, message: `More than ${SCHEMA_LIMITS.properties} properties is not storable. Split the object.` });\n valid = false;\n }\n const properties: Record<string, RecordSchema> = {};\n for (const name of names) {\n const fieldPath = joinPath(path, name);\n const nameProblem = validFieldName(name);\n if (nameProblem) {\n issues.push({ path: fieldPath, message: nameProblem });\n valid = false;\n continue;\n }\n const child = normalizeNode(rawProperties[name], fieldPath, depth + 1, issues);\n if (child) properties[name] = child;\n else valid = false;\n }\n out.properties = properties;\n const required = Array.isArray(node.required)\n ? [...new Set(node.required.filter((name): name is string => typeof name === 'string' && name in rawProperties))].sort()\n : [];\n if (required.length > 0) out.required = required;\n out.additionalProperties = false;\n } else if (node.properties !== undefined || node.required !== undefined || node.additionalProperties !== undefined) {\n issues.push({ path, message: 'Only objects may declare properties.' });\n valid = false;\n }\n\n if (type === 'array') {\n const items = node.items;\n if (!isPlainObject(items)) {\n issues.push({ path, message: 'Arrays need one item schema (`z.array(item)`).' });\n valid = false;\n } else {\n const child = normalizeNode(items, `${path}[]`, depth + 1, issues);\n if (child) out.items = child;\n else valid = false;\n }\n }\n\n if (rawEnum) {\n const values: EnumValue[] = [];\n for (const value of rawEnum) {\n const scalar = typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';\n const fits =\n scalar &&\n (type === 'string'\n ? typeof value === 'string'\n : type === 'boolean'\n ? typeof value === 'boolean'\n : type === 'integer'\n ? Number.isInteger(value)\n : type === 'number'\n ? typeof value === 'number'\n : false);\n if (!fits) {\n issues.push({ path, message: `Enum value ${JSON.stringify(value)} does not match type ${type}.` });\n valid = false;\n } else if (!values.some((existing) => existing === value)) {\n values.push(value as EnumValue);\n }\n }\n if (values.length > SCHEMA_LIMITS.enumValues) {\n issues.push({ path, message: `More than ${SCHEMA_LIMITS.enumValues} enum values is not storable. Use a reference collection.` });\n valid = false;\n }\n if (values.length > 0) out.enum = values;\n }\n\n for (const key of ['minimum', 'maximum'] as const) {\n const value = node[key];\n if (value === undefined) continue;\n if (type !== 'number' && type !== 'integer') {\n issues.push({ path, message: `\\`${key}\\` is only valid on numbers.` });\n valid = false;\n continue;\n }\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n issues.push({ path, message: `\\`${key}\\` must be a finite number.` });\n valid = false;\n continue;\n }\n // z.number().int() always emits the safe-integer range; it is not a business bound.\n if (type === 'integer' && Math.abs(value) === SAFE_INTEGER_BOUND) continue;\n out[key] = value;\n }\n if (out.minimum !== undefined && out.maximum !== undefined && out.minimum > out.maximum) {\n issues.push({ path, message: '`minimum` is greater than `maximum`.' });\n valid = false;\n }\n\n return valid ? out : null;\n}\n\n/** Raw `z.toJSONSchema` output; exported for the snapshot tests. */\nexport function zodJsonSchema(schema: z.ZodType): JsonNode {\n return z.toJSONSchema(schema, { io: 'output', unrepresentable: 'throw', cycles: 'throw' }) as JsonNode;\n}\n\n/** Converts a Zod object schema to the UNS record-schema subset or throws `CollectionSchemaError`. */\nexport function toRecordSchema(alias: string, schema: z.ZodType): RecordSchema {\n let raw: JsonNode;\n try {\n raw = zodJsonSchema(schema);\n } catch (error) {\n throw new CollectionSchemaError(alias, [\n {\n path: '',\n message: `${error instanceof Error ? error.message : String(error)}. \\`z.date()\\`, \\`z.bigint()\\`, \\`.transform()\\`, \\`z.map()\\`, \\`z.set()\\`, \\`z.custom()\\` and recursive schemas are not storable; store instants as ISO-8601 UTC strings from \\`toISOString()\\` and dates as \"YYYY-MM-DD\" strings, and keep transforms in the API input schema.`,\n },\n ]);\n }\n const issues: SchemaIssue[] = [];\n const normalized = normalizeNode(raw, '', 0, issues);\n if (normalized && normalized.type !== 'object') {\n issues.push({ path: '', message: 'A collection schema must be `z.object({...})`.' });\n }\n if (issues.length > 0 || !normalized) throw new CollectionSchemaError(alias, issues);\n return normalized;\n}\n\n/** Resolves a dotted business path in a record schema; array levels accept index segments. */\nexport function recordSchemaAt(schema: RecordSchema, path: string): RecordSchema | undefined {\n let current: RecordSchema | undefined = schema;\n for (const segment of path.split('.')) {\n if (!current) return undefined;\n if (current.type === 'array' && isArraySegment(segment)) {\n current = current.items;\n } else if (current.type === 'object') {\n current = current.properties?.[segment];\n } else {\n return undefined;\n }\n }\n return current;\n}\n\nfunction isArraySegment(segment: string): boolean {\n return /^(?:\\d+|\\$|\\$\\[[A-Za-z0-9_]*\\])$/.test(segment);\n}\n\n/**\n * Index paths follow object properties only: a path that continues past an\n * array (`items.sku`) would index values inside array items, which UNS\n * expression indexes cannot do.\n */\nfunction indexPathProblem(alias: string, schema: RecordSchema, path: string, kind: 'btree' | 'gin'): string | null {\n const segments = path.split('.');\n let current: RecordSchema | undefined = schema;\n for (const [position, segment] of segments.entries()) {\n if (current?.type === 'array') {\n const arrayPath = segments.slice(0, position).join('.');\n return `\"${path}\" reaches into the items of array \"${arrayPath}\"; index the array itself with kind: \"gin\", or copy the value to a top-level field.`;\n }\n current = current?.type === 'object' ? current.properties?.[segment] : undefined;\n if (!current) return `\"${path}\" is not a declared field of \"${alias}\".`;\n }\n const target = current as RecordSchema;\n if (kind === 'btree' && (target.type === 'object' || target.type === 'array')) {\n return `\"${path}\" is an ${target.type}; index a scalar field or use kind: \"gin\".`;\n }\n if (kind === 'gin' && target.type !== 'object' && target.type !== 'array') {\n return `\"${path}\" is a ${target.type}; a GIN index covers an object or array field.`;\n }\n return null;\n}\n\n/** A TTL index expires records by one integer field of Unix milliseconds. */\nfunction ttlProblem(alias: string, schema: RecordSchema, index: IndexSpec, kind: 'btree' | 'gin'): string | null {\n const seconds = index.expireAfterSeconds as number;\n if (!Number.isInteger(seconds) || seconds < SCHEMA_LIMITS.minExpireAfterSeconds || seconds > SCHEMA_LIMITS.maxExpireAfterSeconds) {\n return `\\`expireAfterSeconds\\` is an integer from ${SCHEMA_LIMITS.minExpireAfterSeconds} to ${SCHEMA_LIMITS.maxExpireAfterSeconds} (one year).`;\n }\n if (index.path === undefined || kind !== 'btree' || index.unique) return 'A TTL index covers a single `path` and is neither unique nor GIN.';\n const target = recordSchemaAt(schema, index.path);\n if (target?.type !== 'integer') {\n return `TTL field \"${index.path}\" of \"${alias}\" must be declared \\`z.number().int()\\` holding Unix milliseconds (e.g. \\`Date.now()\\`).`;\n }\n return null;\n}\n\nfunction normalizeIndexes(alias: string, indexes: readonly IndexSpec[], schema: RecordSchema, issues: SchemaIssue[]): NormalizedIndex[] {\n const out: NormalizedIndex[] = [];\n const seen = new Set<string>();\n let ttl = 0;\n if (indexes.length > SCHEMA_LIMITS.indexes) {\n issues.push({ path: 'indexes', message: `At most ${SCHEMA_LIMITS.indexes} indexes per collection.` });\n }\n indexes.forEach((index, position) => {\n const at = `indexes[${position}]`;\n const paths = index.paths ?? (index.path !== undefined ? [index.path] : []);\n if ((index.path !== undefined) === (index.paths !== undefined)) {\n issues.push({ path: at, message: 'Set exactly one of `path` or `paths`.' });\n return;\n }\n if (paths.length === 0 || paths.length > SCHEMA_LIMITS.indexPaths) {\n issues.push({ path: at, message: `A compound index has 1–${SCHEMA_LIMITS.indexPaths} paths.` });\n return;\n }\n const kind = index.kind ?? 'btree';\n if (kind !== 'btree' && kind !== 'gin') {\n issues.push({ path: at, message: '`kind` is \"btree\" or \"gin\".' });\n return;\n }\n if (kind === 'gin' && (paths.length !== 1 || index.unique)) {\n issues.push({ path: at, message: 'A GIN index covers one object/array path and cannot be unique.' });\n return;\n }\n if (new Set(paths).size !== paths.length) {\n issues.push({ path: at, message: 'A compound index lists each path once.' });\n return;\n }\n for (const fieldPath of paths) {\n const problem = indexPathProblem(alias, schema, fieldPath, kind);\n if (problem) {\n issues.push({ path: at, message: problem });\n return;\n }\n }\n if (index.expireAfterSeconds !== undefined) {\n const problem = ttlProblem(alias, schema, index, kind);\n if (problem) {\n issues.push({ path: at, message: problem });\n return;\n }\n ttl += 1;\n if (ttl > SCHEMA_LIMITS.ttlIndexes) {\n issues.push({ path: at, message: 'A collection has at most one TTL index (`expireAfterSeconds`).' });\n return;\n }\n }\n const normalized: NormalizedIndex = index.paths ? { paths: [...paths] } : { path: paths[0] };\n if (index.unique) normalized.unique = true;\n if (kind === 'gin') normalized.kind = 'gin';\n if (index.expireAfterSeconds !== undefined) normalized.expireAfterSeconds = index.expireAfterSeconds;\n const key = JSON.stringify(normalized);\n if (!seen.has(key)) {\n seen.add(key);\n out.push(normalized);\n }\n });\n // A TTL index is an ordinary B-tree on its path as well: a plain index on the same path would duplicate it.\n const ttlPaths = new Set(out.filter((index) => index.expireAfterSeconds !== undefined).map((index) => index.path));\n return out.filter((index) => index.expireAfterSeconds !== undefined || index.unique || index.kind || !ttlPaths.has(index.path));\n}\n\nconst compiled = new WeakMap<CollectionDefinition, CompiledCollection>();\n\n/** Ensure payload for one declaration; memoized per definition object. */\nexport function compileCollection(definition: CollectionDefinition): CompiledCollection {\n const cached = compiled.get(definition);\n if (cached) return cached;\n if (!ALIAS_PATTERN.test(definition.alias)) {\n throw new CollectionSchemaError(definition.alias, [{ path: 'alias', message: `Alias must match ${ALIAS_PATTERN}.` }]);\n }\n try {\n assertCollectionName(definition.name);\n } catch (error) {\n throw new CollectionSchemaError(definition.alias, [{ path: 'name', message: error instanceof Error ? error.message : String(error) }]);\n }\n const recordSchema = toRecordSchema(definition.alias, definition.schema);\n const issues: SchemaIssue[] = [];\n const indexes = normalizeIndexes(definition.alias, definition.indexes, recordSchema, issues);\n if (issues.length > 0) throw new CollectionSchemaError(definition.alias, issues);\n const result: CompiledCollection = {\n alias: definition.alias,\n name: definition.name,\n recordSchema,\n indexes,\n ...(definition.description ? { description: definition.description } : {}),\n };\n compiled.set(definition, result);\n return result;\n}\n\n/* ------------------------------------------------------------------ */\n/* Write validation */\n/* ------------------------------------------------------------------ */\n\ntype IssuePath = (string | number)[];\n\nfunction unknownKeyIssues(schema: RecordSchema | undefined, value: unknown, path: IssuePath, out: z.core.$ZodIssue[]) {\n if (!schema) return;\n if (schema.type === 'object' && isPlainObject(value)) {\n const properties = schema.properties ?? {};\n const unknown = Object.keys(value).filter((key) => !(key in properties));\n if (unknown.length > 0) {\n out.push({\n code: 'unrecognized_keys',\n keys: unknown,\n path,\n message: `Unknown field${unknown.length > 1 ? 's' : ''} ${unknown.map((key) => `\"${key}\"`).join(', ')}: declare ${unknown.length > 1 ? 'them' : 'it'} in the collection schema first.`,\n input: value,\n } as z.core.$ZodIssue);\n }\n for (const [key, child] of Object.entries(value)) {\n if (key in properties) unknownKeyIssues(properties[key], child, [...path, key], out);\n }\n } else if (schema.type === 'array' && Array.isArray(value)) {\n value.forEach((item, index) => unknownKeyIssues(schema.items, item, [...path, index], out));\n }\n}\n\nfunction strictParse<T>(zodSchema: z.ZodType<T>, recordSchema: RecordSchema | undefined, value: unknown, path: IssuePath): T {\n const issues: z.core.$ZodIssue[] = [];\n unknownKeyIssues(recordSchema, value, path, issues);\n const result = zodSchema.safeParse(value);\n if (!result.success) {\n for (const issue of result.error.issues) issues.push({ ...issue, path: [...path, ...issue.path] } as z.core.$ZodIssue);\n }\n if (issues.length > 0) throw new z.ZodError(issues);\n return result.data as T;\n}\n\nfunction zodAt(schema: z.ZodType, path: string): z.ZodType | undefined {\n let current: z.ZodType | undefined = schema;\n for (const segment of path.split('.')) {\n while (current instanceof z.ZodOptional) current = current.unwrap() as z.ZodType;\n if (current instanceof z.ZodObject) {\n current = (current.shape as Record<string, z.ZodType>)[segment];\n } else if (current instanceof z.ZodArray && isArraySegment(segment)) {\n current = current.element as z.ZodType;\n } else {\n return undefined;\n }\n if (!current) return undefined;\n }\n return current;\n}\n\nfunction validationError(path: IssuePath, message: string, input: unknown): z.ZodError {\n return new z.ZodError([{ code: 'custom', path, message, input } as z.core.$ZodIssue]);\n}\n\n/** Splits `_id` / `_meta` off a document and strictly validates the body. */\nexport function validateDocument(\n definition: CollectionDefinition,\n document: Record<string, unknown>,\n): { id?: string; data: Record<string, unknown> } {\n if (!isPlainObject(document)) throw validationError([], 'Expected a document object.', document);\n const { _id, _meta, ...body } = document;\n void _meta;\n if (_id !== undefined && (typeof _id !== 'string' || _id.length === 0 || _id.length > 128)) {\n throw validationError(['_id'], '`_id` must be a string of 1–128 characters.', _id);\n }\n const { recordSchema } = compileCollection(definition);\n const data = strictParse(definition.schema, recordSchema, body, []) as Record<string, unknown>;\n return { ...(typeof _id === 'string' ? { id: _id } : {}), data };\n}\n\n/**\n * Validates `data` of a transaction step. Fields filled by `bindings`\n * (`data.<field>...`) are checked only for being declared; every literal\n * field is strictly validated, and other required fields must be present.\n */\nexport function validateStepData(\n definition: CollectionDefinition,\n data: Record<string, unknown>,\n boundFields: readonly string[],\n): Record<string, unknown> {\n if (!isPlainObject(data)) throw validationError(['data'], 'Expected a document object.', data);\n if ('_id' in data || '_meta' in data) {\n throw validationError(['data', '_id' in data ? '_id' : '_meta'], 'A transaction step sets the record ID with `id`, not `data._id`; `_meta` is read-only.', data);\n }\n const { recordSchema } = compileCollection(definition);\n const properties = recordSchema.properties ?? {};\n const bound = new Set(boundFields.filter((field) => field in properties));\n const unknownBound = boundFields.filter((field) => !(field in properties));\n if (unknownBound.length > 0) {\n throw validationError(['bindings'], `Bound field${unknownBound.length > 1 ? 's' : ''} ${unknownBound.join(', ')} not declared in \"${definition.alias}\".`, boundFields);\n }\n if (bound.size === 0) return strictParse(definition.schema, recordSchema, data, ['data']) as Record<string, unknown>;\n\n const literal = Object.fromEntries(Object.entries(data).filter(([key]) => !bound.has(key)));\n const omit = Object.fromEntries([...bound].map((field) => [field, true as const]));\n const literalSchema: RecordSchema = {\n ...recordSchema,\n properties: Object.fromEntries(Object.entries(properties).filter(([key]) => !bound.has(key))),\n required: recordSchema.required?.filter((key) => !bound.has(key)),\n };\n const parsed = strictParse(definition.schema.omit(omit as never), literalSchema, literal, ['data']) as Record<string, unknown>;\n const boundValues = Object.fromEntries(Object.entries(data).filter(([key]) => bound.has(key)));\n return { ...parsed, ...boundValues };\n}\n\nconst VALUE_OPERATORS = new Set(['$set', '$setOnInsert']);\nconst ELEMENT_OPERATORS = new Set(['$push', '$addToSet']);\nconst NUMERIC_OPERATORS = new Set(['$inc', '$mul']);\n\n/** Validates update-operator documents against the declaration (paths and values). */\nexport function validateUpdate(definition: CollectionDefinition, update: Record<string, unknown>): Record<string, unknown> {\n if (!isPlainObject(update) || Object.keys(update).length === 0) {\n throw validationError([], 'An update needs at least one operator such as `$set`.', update);\n }\n const { recordSchema } = compileCollection(definition);\n const out: Record<string, unknown> = {};\n\n for (const [operator, fields] of Object.entries(update)) {\n if (!operator.startsWith('$')) {\n throw validationError([operator], \"Updates use operators (`{ $set: { status: \\\"DONE\\\" } }`); use replaceOne() to replace a whole document.\", update);\n }\n if (!isPlainObject(fields)) throw validationError([operator], `\\`${operator}\\` takes an object of field paths.`, fields);\n const next: Record<string, unknown> = {};\n\n for (const [path, value] of Object.entries(fields)) {\n const issuePath = [operator, path];\n if (path === '_id' || path === '_meta' || path.startsWith('_meta.')) {\n throw validationError(issuePath, '`_id` and `_meta` are read-only.', value);\n }\n const target = recordSchemaAt(recordSchema, path);\n const zodTarget = zodAt(definition.schema, path);\n if (!target || !zodTarget) {\n throw validationError(issuePath, `\"${path}\" is not a declared field of \"${definition.alias}\".`, value);\n }\n\n if (VALUE_OPERATORS.has(operator)) {\n if (value === undefined) continue;\n next[path] = strictParse(zodTarget, target, value, issuePath);\n } else if (ELEMENT_OPERATORS.has(operator)) {\n const element = zodTarget instanceof z.ZodOptional ? zodTarget.unwrap() : zodTarget;\n if (target.type !== 'array' || !(element instanceof z.ZodArray)) {\n throw validationError(issuePath, `\\`${operator}\\` needs an array field; \"${path}\" is ${target.type}.`, value);\n }\n const each = isPlainObject(value) && Array.isArray(value.$each);\n const items = each ? ((value as { $each: unknown[] }).$each) : [value];\n const parsed = items.map((item, index) =>\n strictParse(element.element as z.ZodType, target.items, item, each ? [...issuePath, '$each', index] : issuePath),\n );\n next[path] = each ? { ...(value as Record<string, unknown>), $each: parsed } : parsed[0];\n } else if (NUMERIC_OPERATORS.has(operator)) {\n if (target.type !== 'number' && target.type !== 'integer') {\n throw validationError(issuePath, `\\`${operator}\\` needs a numeric field; \"${path}\" is ${target.type}.`, value);\n }\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n throw validationError(issuePath, `\\`${operator}\\` needs a finite number.`, value);\n }\n next[path] = value;\n } else if (operator === '$rename') {\n if (typeof value !== 'string' || !recordSchemaAt(recordSchema, value)) {\n throw validationError(issuePath, `\\`$rename\\` target \"${String(value)}\" is not a declared field.`, value);\n }\n next[path] = value;\n } else {\n // $unset, $min, $max, $currentDate, $pop, $pull, $pullAll: the path is\n // declared; UNS validates the resulting document.\n next[path] = value;\n }\n }\n if (Object.keys(next).length > 0) out[operator] = next;\n }\n if (Object.keys(out).length === 0) {\n throw validationError([], 'Nothing to update: undefined values are dropped; clear a field with `$unset`.', update);\n }\n return out;\n}\n"]}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/data/schema.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Zod 4 → UNS record schema normalizer, plus write-time validation.\n *\n * UNS stores one closed JSON-schema subset per collection: `type`,\n * `properties`, `required`, `additionalProperties: false`, `items`, `enum`,\n * `minimum`, `maximum`, declared `format`, `title`, `description`. `toRecordSchema` converts the\n * `z.toJSONSchema` output into exactly that subset and rejects every other\n * keyword with a concrete replacement, so a declaration that cannot be stored\n * fails when it is compiled (an App can compile its declarations at build\n * time) instead of on the first request.\n */\nimport { z } from 'zod';\nimport { ALIAS_PATTERN, assertCollectionName, collectionLabel, type CollectionDefinition, type CollectionReference, type CollectionTarget, type IndexSpec } from './define.js';\n\nexport type RecordSchemaType = 'object' | 'array' | 'string' | 'number' | 'integer' | 'boolean';\nexport type EnumValue = string | number | boolean;\n\nexport interface RecordSchema {\n type: RecordSchemaType;\n /** Display annotation; does not add range/date checks or convert stored values. */\n format?: 'int32' | 'float' | 'double' | 'date-time';\n title?: string;\n description?: string;\n properties?: Record<string, RecordSchema>;\n required?: string[];\n additionalProperties?: false;\n items?: RecordSchema;\n enum?: EnumValue[];\n minimum?: number;\n maximum?: number;\n}\n\nexport interface NormalizedIndex {\n path?: string;\n paths?: string[];\n unique?: true;\n kind?: 'gin';\n expireAfterSeconds?: number;\n}\n\n/** One ensure item, exactly as it is sent to `/uns/app/collections/ensure`. */\nexport interface CompiledCollection {\n alias: string;\n name: string;\n recordSchema: RecordSchema;\n indexes: NormalizedIndex[];\n description?: string;\n}\n\nexport interface SchemaIssue {\n path: string;\n message: string;\n}\n\nexport class CollectionSchemaError extends Error {\n readonly alias: string;\n readonly issues: SchemaIssue[];\n\n constructor(alias: string, issues: SchemaIssue[]) {\n super(\n [\n `Collection \"${alias}\" cannot be stored in UNS:`,\n ...issues.map((issue) => ` - ${issue.path || '(root)'}: ${issue.message}`),\n ].join('\\n'),\n );\n this.name = 'CollectionSchemaError';\n this.alias = alias;\n this.issues = issues;\n }\n}\n\n/** UNS limits (unsmeta Schema.validate and collection indexes); title/description are UTF-8 bytes. */\nexport const SCHEMA_LIMITS = {\n depth: 8,\n properties: 128,\n enumValues: 100,\n title: 512,\n description: 2048,\n indexes: 16,\n indexPaths: 3,\n ttlIndexes: 1,\n minExpireAfterSeconds: 60,\n maxExpireAfterSeconds: 31_536_000,\n} as const;\n\nconst SAFE_INTEGER_BOUND = Number.MAX_SAFE_INTEGER;\n// 新声明必须携带明确数值格式;只补注解,不改变范围校验或已有集合。\nconst DEFAULT_NUMERIC_FORMAT = { integer: 'int32', number: 'double' } as const;\nconst SCHEMA_TYPES = new Set<string>(['object', 'array', 'string', 'number', 'integer', 'boolean']);\nconst KEPT_KEYWORDS = new Set([\n 'type',\n 'format',\n 'title',\n 'description',\n 'properties',\n 'required',\n 'additionalProperties',\n 'items',\n 'enum',\n 'minimum',\n 'maximum',\n]);\nconst RESERVED_FIELDS = new Set(['_id', '_meta']);\n\nconst NULLABLE_HINT =\n '`.nullable()`, `.nullish()` and `z.union()` are not storable. Make the field `.optional()` and leave it out instead of storing null; model alternatives as one type or as separate optional fields.';\nconst API_INPUT_HINT = 'Keep the collection schema plain and enforce this rule in the API input schema.';\nconst OPEN_OBJECT_HINT =\n '`z.record()`, `z.looseObject()` and `.catchall()` are not storable: every stored object is closed. Declare fixed properties, or store an array of `{ key, value }` objects.';\n\nconst KEYWORD_HINTS: Record<string, string> = {\n anyOf: NULLABLE_HINT,\n oneOf: NULLABLE_HINT,\n allOf: '`z.intersection()` / `.and()` is not storable. Merge the objects with `.extend()`.',\n not: 'Negated schemas are not storable.',\n default: '`.default()` / `.prefault()` / `.catch()` is not storable. Apply defaults in the service when building the document.',\n format: `Strings only support the declaration \\`z.string().meta({ format: 'date-time' })\\`, which does not validate or convert dates. Other string formats (\\`z.email()\\`, \\`z.uuid()\\`...) are not storable. ${API_INPUT_HINT}`,\n pattern: `\\`.regex()\\`, \\`.startsWith()\\` and similar patterns are not storable. Use \\`z.string()\\`. ${API_INPUT_HINT}`,\n minLength: `String length limits are not storable. Use \\`z.string()\\`. ${API_INPUT_HINT}`,\n maxLength: `String length limits are not storable. Use \\`z.string()\\`. ${API_INPUT_HINT}`,\n contentEncoding: 'Encoded string content is not storable. Use `z.string()`.',\n const: '`z.literal()` is not storable. Use `z.enum([...])`.',\n exclusiveMinimum: '`.gt()` / `.positive()` (exclusive bounds) are not storable. Use inclusive `.min()` (`.min(1)` for a positive integer).',\n exclusiveMaximum: '`.lt()` / `.negative()` are not storable. Use inclusive `.max()`.',\n multipleOf: `\\`.multipleOf()\\` / \\`.step()\\` is not storable. ${API_INPUT_HINT}`,\n minItems: `Array length limits are not storable. ${API_INPUT_HINT}`,\n maxItems: `Array length limits are not storable. ${API_INPUT_HINT}`,\n uniqueItems: `Array uniqueness is not storable. ${API_INPUT_HINT}`,\n prefixItems: '`z.tuple()` is not storable. Use an object with named fields.',\n propertyNames: OPEN_OBJECT_HINT,\n patternProperties: OPEN_OBJECT_HINT,\n minProperties: OPEN_OBJECT_HINT,\n maxProperties: OPEN_OBJECT_HINT,\n $ref: 'Recursive or shared `$ref` schemas are not storable. Inline the structure or keep child records in their own collection.',\n $defs: 'Recursive or shared `$ref` schemas are not storable. Inline the structure or keep child records in their own collection.',\n readOnly: '`.readonly()` is not storable; remove it from the collection schema.',\n};\n\ntype JsonNode = Record<string, unknown>;\n\nconst encoder = new TextEncoder();\n\nfunction utf8Bytes(value: string): number {\n return encoder.encode(value).length;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction joinPath(base: string, key: string | number): string {\n if (typeof key === 'number') return `${base}[${key}]`;\n return base ? `${base}.${key}` : key;\n}\n\nfunction validFieldName(key: string): string | null {\n if (RESERVED_FIELDS.has(key)) return `\"${key}\" is a system field and cannot be declared.`;\n if (key.length === 0 || key === '[]') return `Field name \"${key}\" is reserved.`;\n if (/[.$\\\\]/.test(key)) return `Field name \"${key}\" must not contain \".\", \"$\" or \"\\\\\".`;\n return null;\n}\n\nfunction inferEnumType(values: unknown[]): RecordSchemaType | null {\n if (values.length === 0) return null;\n if (values.every((value) => typeof value === 'string')) return 'string';\n if (values.every((value) => typeof value === 'boolean')) return 'boolean';\n if (values.every((value) => typeof value === 'number')) {\n return values.every((value) => Number.isInteger(value)) ? 'integer' : 'number';\n }\n return null;\n}\n\nfunction normalizeNode(node: unknown, path: string, depth: number, issues: SchemaIssue[]): RecordSchema | null {\n if (!isPlainObject(node)) {\n issues.push({ path, message: 'Expected a schema object.' });\n return null;\n }\n if (depth > SCHEMA_LIMITS.depth) {\n issues.push({ path, message: `Nesting deeper than ${SCHEMA_LIMITS.depth} levels is not storable. Flatten the structure.` });\n return null;\n }\n\n let valid = true;\n for (const key of Object.keys(node)) {\n if (KEPT_KEYWORDS.has(key) || (depth === 0 && key === '$schema')) continue;\n valid = false;\n issues.push({\n path,\n message: `\\`${key}\\` is not supported. ${KEYWORD_HINTS[key] ?? 'Only type, properties, items, enum, minimum, maximum, declared format, title and description are storable; remove this constraint from the collection schema.'}`,\n });\n }\n\n const rawEnum = Array.isArray(node.enum) ? node.enum : undefined;\n let type = node.type;\n if (type === undefined && rawEnum) type = inferEnumType(rawEnum) ?? undefined;\n if (Array.isArray(type)) {\n issues.push({ path, message: `A field must have one type, got [${type.join(', ')}]. ${NULLABLE_HINT}` });\n return null;\n }\n if (type === 'null') {\n issues.push({ path, message: '`z.null()` is not storable. Make the field optional and leave it out.' });\n return null;\n }\n if (typeof type !== 'string' || !SCHEMA_TYPES.has(type)) {\n if (type === undefined && !('anyOf' in node) && !('oneOf' in node) && !('allOf' in node)) {\n issues.push({\n path,\n message: 'Every field needs a concrete type; `z.any()`, `z.unknown()` and `z.json()` are not storable. Declare the actual shape.',\n });\n }\n return null;\n }\n\n const out: RecordSchema = { type: type as RecordSchemaType };\n const format = node.format === undefined && (type === 'integer' || type === 'number')\n ? DEFAULT_NUMERIC_FORMAT[type]\n : node.format;\n if (format !== undefined) {\n if ((type === 'integer' && format === 'int32') || (type === 'number' && (format === 'float' || format === 'double')) || (type === 'string' && format === 'date-time')) {\n out.format = format;\n } else {\n issues.push({\n path,\n message: type === 'string'\n ? KEYWORD_HINTS.format\n : '`format` must be \"int32\" on integer fields, \"float\" / \"double\" on number fields, or \"date-time\" on string fields. Other types and formats are not storable.',\n });\n valid = false;\n }\n }\n for (const key of ['title', 'description'] as const) {\n const value = node[key];\n if (value === undefined) continue;\n const limit = key === 'title' ? SCHEMA_LIMITS.title : SCHEMA_LIMITS.description;\n // UNS measures these with Go len(): UTF-8 bytes, so CJK text uses 3 per character.\n if (typeof value !== 'string' || utf8Bytes(value) > limit) {\n issues.push({ path, message: `\\`${key}\\` must be a string of at most ${limit} UTF-8 bytes.` });\n valid = false;\n } else if (value) {\n out[key] = value;\n }\n }\n\n if (type === 'object') {\n if (node.additionalProperties !== undefined && node.additionalProperties !== false) {\n issues.push({ path, message: OPEN_OBJECT_HINT });\n valid = false;\n }\n const rawProperties = isPlainObject(node.properties) ? node.properties : {};\n const names = Object.keys(rawProperties);\n if (names.length > SCHEMA_LIMITS.properties) {\n issues.push({ path, message: `More than ${SCHEMA_LIMITS.properties} properties is not storable. Split the object.` });\n valid = false;\n }\n const properties: Record<string, RecordSchema> = {};\n for (const name of names) {\n const fieldPath = joinPath(path, name);\n const nameProblem = validFieldName(name);\n if (nameProblem) {\n issues.push({ path: fieldPath, message: nameProblem });\n valid = false;\n continue;\n }\n const child = normalizeNode(rawProperties[name], fieldPath, depth + 1, issues);\n if (child) properties[name] = child;\n else valid = false;\n }\n out.properties = properties;\n const required = Array.isArray(node.required)\n ? [...new Set(node.required.filter((name): name is string => typeof name === 'string' && name in rawProperties))].sort()\n : [];\n if (required.length > 0) out.required = required;\n out.additionalProperties = false;\n } else if (node.properties !== undefined || node.required !== undefined || node.additionalProperties !== undefined) {\n issues.push({ path, message: 'Only objects may declare properties.' });\n valid = false;\n }\n\n if (type === 'array') {\n const items = node.items;\n if (!isPlainObject(items)) {\n issues.push({ path, message: 'Arrays need one item schema (`z.array(item)`).' });\n valid = false;\n } else {\n const child = normalizeNode(items, `${path}[]`, depth + 1, issues);\n if (child) out.items = child;\n else valid = false;\n }\n }\n\n if (rawEnum) {\n const values: EnumValue[] = [];\n for (const value of rawEnum) {\n const scalar = typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';\n const fits =\n scalar &&\n (type === 'string'\n ? typeof value === 'string'\n : type === 'boolean'\n ? typeof value === 'boolean'\n : type === 'integer'\n ? Number.isInteger(value)\n : type === 'number'\n ? typeof value === 'number'\n : false);\n if (!fits) {\n issues.push({ path, message: `Enum value ${JSON.stringify(value)} does not match type ${type}.` });\n valid = false;\n } else if (!values.some((existing) => existing === value)) {\n values.push(value as EnumValue);\n }\n }\n if (values.length > SCHEMA_LIMITS.enumValues) {\n issues.push({ path, message: `More than ${SCHEMA_LIMITS.enumValues} enum values is not storable. Use a reference collection.` });\n valid = false;\n }\n if (values.length > 0) out.enum = values;\n }\n\n for (const key of ['minimum', 'maximum'] as const) {\n const value = node[key];\n if (value === undefined) continue;\n if (type !== 'number' && type !== 'integer') {\n issues.push({ path, message: `\\`${key}\\` is only valid on numbers.` });\n valid = false;\n continue;\n }\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n issues.push({ path, message: `\\`${key}\\` must be a finite number.` });\n valid = false;\n continue;\n }\n // z.number().int() always emits the safe-integer range; it is not a business bound.\n if (type === 'integer' && Math.abs(value) === SAFE_INTEGER_BOUND) continue;\n out[key] = value;\n }\n if (out.minimum !== undefined && out.maximum !== undefined && out.minimum > out.maximum) {\n issues.push({ path, message: '`minimum` is greater than `maximum`.' });\n valid = false;\n }\n\n return valid ? out : null;\n}\n\n/** Raw `z.toJSONSchema` output; exported for the snapshot tests. */\nexport function zodJsonSchema(schema: z.ZodType): JsonNode {\n return z.toJSONSchema(schema, { io: 'output', unrepresentable: 'throw', cycles: 'throw' }) as JsonNode;\n}\n\n/** Converts a Zod object schema to the UNS record-schema subset or throws `CollectionSchemaError`. */\nexport function toRecordSchema(alias: string, schema: z.ZodType): RecordSchema {\n let raw: JsonNode;\n try {\n raw = zodJsonSchema(schema);\n } catch (error) {\n throw new CollectionSchemaError(alias, [\n {\n path: '',\n message: `${error instanceof Error ? error.message : String(error)}. \\`z.date()\\`, \\`z.bigint()\\`, \\`.transform()\\`, \\`z.map()\\`, \\`z.set()\\`, \\`z.custom()\\` and recursive schemas are not storable; store instants as ISO-8601 UTC strings from \\`toISOString()\\` and dates as \"YYYY-MM-DD\" strings, and keep transforms in the API input schema.`,\n },\n ]);\n }\n const issues: SchemaIssue[] = [];\n const normalized = normalizeNode(raw, '', 0, issues);\n if (normalized && normalized.type !== 'object') {\n issues.push({ path: '', message: 'A collection schema must be `z.object({...})`.' });\n }\n if (issues.length > 0 || !normalized) throw new CollectionSchemaError(alias, issues);\n return normalized;\n}\n\n/** Resolves a dotted business path in a record schema; array levels accept index segments. */\nexport function recordSchemaAt(schema: RecordSchema, path: string): RecordSchema | undefined {\n let current: RecordSchema | undefined = schema;\n for (const segment of path.split('.')) {\n if (!current) return undefined;\n if (current.type === 'array' && isArraySegment(segment)) {\n current = current.items;\n } else if (current.type === 'object') {\n current = current.properties?.[segment];\n } else {\n return undefined;\n }\n }\n return current;\n}\n\nfunction isArraySegment(segment: string): boolean {\n return /^(?:\\d+|\\$|\\$\\[[A-Za-z0-9_]*\\])$/.test(segment);\n}\n\n/**\n * Index paths follow object properties only: a path that continues past an\n * array (`items.sku`) would index values inside array items, which UNS\n * expression indexes cannot do.\n */\nfunction indexPathProblem(alias: string, schema: RecordSchema, path: string, kind: 'btree' | 'gin'): string | null {\n const segments = path.split('.');\n let current: RecordSchema | undefined = schema;\n for (const [position, segment] of segments.entries()) {\n if (current?.type === 'array') {\n const arrayPath = segments.slice(0, position).join('.');\n return `\"${path}\" reaches into the items of array \"${arrayPath}\"; index the array itself with kind: \"gin\", or copy the value to a top-level field.`;\n }\n current = current?.type === 'object' ? current.properties?.[segment] : undefined;\n if (!current) return `\"${path}\" is not a declared field of \"${alias}\".`;\n }\n const target = current as RecordSchema;\n if (kind === 'btree' && (target.type === 'object' || target.type === 'array')) {\n return `\"${path}\" is an ${target.type}; index a scalar field or use kind: \"gin\".`;\n }\n if (kind === 'gin' && target.type !== 'object' && target.type !== 'array') {\n return `\"${path}\" is a ${target.type}; a GIN index covers an object or array field.`;\n }\n return null;\n}\n\n/** A TTL index expires records by one integer field of Unix milliseconds. */\nfunction ttlProblem(alias: string, schema: RecordSchema, index: IndexSpec, kind: 'btree' | 'gin'): string | null {\n const seconds = index.expireAfterSeconds as number;\n if (!Number.isInteger(seconds) || seconds < SCHEMA_LIMITS.minExpireAfterSeconds || seconds > SCHEMA_LIMITS.maxExpireAfterSeconds) {\n return `\\`expireAfterSeconds\\` is an integer from ${SCHEMA_LIMITS.minExpireAfterSeconds} to ${SCHEMA_LIMITS.maxExpireAfterSeconds} (one year).`;\n }\n if (index.path === undefined || kind !== 'btree' || index.unique) return 'A TTL index covers a single `path` and is neither unique nor GIN.';\n const target = recordSchemaAt(schema, index.path);\n if (target?.type !== 'integer') {\n return `TTL field \"${index.path}\" of \"${alias}\" must be declared \\`z.number().int()\\` holding Unix milliseconds (e.g. \\`Date.now()\\`).`;\n }\n return null;\n}\n\nfunction normalizeIndexes(alias: string, indexes: readonly IndexSpec[], schema: RecordSchema, issues: SchemaIssue[]): NormalizedIndex[] {\n const out: NormalizedIndex[] = [];\n const seen = new Set<string>();\n let ttl = 0;\n if (indexes.length > SCHEMA_LIMITS.indexes) {\n issues.push({ path: 'indexes', message: `At most ${SCHEMA_LIMITS.indexes} indexes per collection.` });\n }\n indexes.forEach((index, position) => {\n const at = `indexes[${position}]`;\n const paths = index.paths ?? (index.path !== undefined ? [index.path] : []);\n if ((index.path !== undefined) === (index.paths !== undefined)) {\n issues.push({ path: at, message: 'Set exactly one of `path` or `paths`.' });\n return;\n }\n if (paths.length === 0 || paths.length > SCHEMA_LIMITS.indexPaths) {\n issues.push({ path: at, message: `A compound index has 1–${SCHEMA_LIMITS.indexPaths} paths.` });\n return;\n }\n const kind = index.kind ?? 'btree';\n if (kind !== 'btree' && kind !== 'gin') {\n issues.push({ path: at, message: '`kind` is \"btree\" or \"gin\".' });\n return;\n }\n if (kind === 'gin' && (paths.length !== 1 || index.unique)) {\n issues.push({ path: at, message: 'A GIN index covers one object/array path and cannot be unique.' });\n return;\n }\n if (new Set(paths).size !== paths.length) {\n issues.push({ path: at, message: 'A compound index lists each path once.' });\n return;\n }\n for (const fieldPath of paths) {\n const problem = indexPathProblem(alias, schema, fieldPath, kind);\n if (problem) {\n issues.push({ path: at, message: problem });\n return;\n }\n }\n if (index.expireAfterSeconds !== undefined) {\n const problem = ttlProblem(alias, schema, index, kind);\n if (problem) {\n issues.push({ path: at, message: problem });\n return;\n }\n ttl += 1;\n if (ttl > SCHEMA_LIMITS.ttlIndexes) {\n issues.push({ path: at, message: 'A collection has at most one TTL index (`expireAfterSeconds`).' });\n return;\n }\n }\n const normalized: NormalizedIndex = index.paths ? { paths: [...paths] } : { path: paths[0] };\n if (index.unique) normalized.unique = true;\n if (kind === 'gin') normalized.kind = 'gin';\n if (index.expireAfterSeconds !== undefined) normalized.expireAfterSeconds = index.expireAfterSeconds;\n const key = JSON.stringify(normalized);\n if (!seen.has(key)) {\n seen.add(key);\n out.push(normalized);\n }\n });\n // A TTL index is an ordinary B-tree on its path as well: a plain index on the same path would duplicate it.\n const ttlPaths = new Set(out.filter((index) => index.expireAfterSeconds !== undefined).map((index) => index.path));\n return out.filter((index) => index.expireAfterSeconds !== undefined || index.unique || index.kind || !ttlPaths.has(index.path));\n}\n\nconst compiled = new WeakMap<CollectionDefinition, CompiledCollection>();\n\n/** Ensure payload for one declaration; memoized per definition object. */\nexport function compileCollection(definition: CollectionDefinition): CompiledCollection {\n const cached = compiled.get(definition);\n if (cached) return cached;\n if (!ALIAS_PATTERN.test(definition.alias)) {\n throw new CollectionSchemaError(definition.alias, [{ path: 'alias', message: `Alias must match ${ALIAS_PATTERN}.` }]);\n }\n try {\n assertCollectionName(definition.name);\n } catch (error) {\n throw new CollectionSchemaError(definition.alias, [{ path: 'name', message: error instanceof Error ? error.message : String(error) }]);\n }\n const recordSchema = toRecordSchema(definition.alias, definition.schema);\n const issues: SchemaIssue[] = [];\n const indexes = normalizeIndexes(definition.alias, definition.indexes, recordSchema, issues);\n if (issues.length > 0) throw new CollectionSchemaError(definition.alias, issues);\n const result: CompiledCollection = {\n alias: definition.alias,\n name: definition.name,\n recordSchema,\n indexes,\n ...(definition.description ? { description: definition.description } : {}),\n };\n compiled.set(definition, result);\n return result;\n}\n\n/* ------------------------------------------------------------------ */\n/* Write validation */\n/* ------------------------------------------------------------------ */\n\ntype IssuePath = (string | number)[];\n\nconst referenceSchemas = new WeakMap<CollectionReference, RecordSchema>();\n\nfunction validationSchema(target: CollectionTarget): RecordSchema | undefined {\n if (!('collectionId' in target)) return compileCollection(target).recordSchema;\n if (!target.schema) return undefined;\n let schema = referenceSchemas.get(target);\n if (!schema) {\n schema = toRecordSchema(target.collectionId, target.schema);\n referenceSchemas.set(target, schema);\n }\n return schema;\n}\n\nfunction unknownKeyIssues(schema: RecordSchema | undefined, value: unknown, path: IssuePath, out: z.core.$ZodIssue[]) {\n if (!schema) return;\n if (schema.type === 'object' && isPlainObject(value)) {\n const properties = schema.properties ?? {};\n const unknown = Object.keys(value).filter((key) => !(key in properties));\n if (unknown.length > 0) {\n out.push({\n code: 'unrecognized_keys',\n keys: unknown,\n path,\n message: `Unknown field${unknown.length > 1 ? 's' : ''} ${unknown.map((key) => `\"${key}\"`).join(', ')}: declare ${unknown.length > 1 ? 'them' : 'it'} in the collection schema first.`,\n input: value,\n } as z.core.$ZodIssue);\n }\n for (const [key, child] of Object.entries(value)) {\n if (key in properties) unknownKeyIssues(properties[key], child, [...path, key], out);\n }\n } else if (schema.type === 'array' && Array.isArray(value)) {\n value.forEach((item, index) => unknownKeyIssues(schema.items, item, [...path, index], out));\n }\n}\n\nfunction strictParse<T>(zodSchema: z.ZodType<T>, recordSchema: RecordSchema | undefined, value: unknown, path: IssuePath): T {\n const issues: z.core.$ZodIssue[] = [];\n unknownKeyIssues(recordSchema, value, path, issues);\n const result = zodSchema.safeParse(value);\n if (!result.success) {\n for (const issue of result.error.issues) issues.push({ ...issue, path: [...path, ...issue.path] } as z.core.$ZodIssue);\n }\n if (issues.length > 0) throw new z.ZodError(issues);\n return result.data as T;\n}\n\nfunction zodAt(schema: z.ZodType, path: string): z.ZodType | undefined {\n let current: z.ZodType | undefined = schema;\n for (const segment of path.split('.')) {\n while (current instanceof z.ZodOptional) current = current.unwrap() as z.ZodType;\n if (current instanceof z.ZodObject) {\n current = (current.shape as Record<string, z.ZodType>)[segment];\n } else if (current instanceof z.ZodArray && isArraySegment(segment)) {\n current = current.element as z.ZodType;\n } else {\n return undefined;\n }\n if (!current) return undefined;\n }\n return current;\n}\n\nfunction validationError(path: IssuePath, message: string, input: unknown): z.ZodError {\n return new z.ZodError([{ code: 'custom', path, message, input } as z.core.$ZodIssue]);\n}\n\n/** Splits `_id` / `_meta` off a document and strictly validates the body. */\nexport function validateDocument(\n definition: CollectionTarget,\n document: Record<string, unknown>,\n): { id?: string; data: Record<string, unknown> } {\n if (!isPlainObject(document)) throw validationError([], 'Expected a document object.', document);\n const { _id, _meta, ...body } = document;\n void _meta;\n if (_id !== undefined && (typeof _id !== 'string' || _id.length === 0 || _id.length > 128)) {\n throw validationError(['_id'], '`_id` must be a string of 1–128 characters.', _id);\n }\n if (!definition.schema) return { ...(typeof _id === 'string' ? { id: _id } : {}), data: body };\n const recordSchema = validationSchema(definition);\n const data = strictParse(definition.schema, recordSchema, body, []) as Record<string, unknown>;\n return { ...(typeof _id === 'string' ? { id: _id } : {}), data };\n}\n\n/**\n * Validates `data` of a transaction step. Fields filled by `bindings`\n * (`data.<field>...`) are checked only for being declared; every literal\n * field is strictly validated, and other required fields must be present.\n */\nexport function validateStepData(\n definition: CollectionTarget,\n data: Record<string, unknown>,\n boundFields: readonly string[],\n): Record<string, unknown> {\n if (!isPlainObject(data)) throw validationError(['data'], 'Expected a document object.', data);\n if ('_id' in data || '_meta' in data) {\n throw validationError(['data', '_id' in data ? '_id' : '_meta'], 'A transaction step sets the record ID with `id`, not `data._id`; `_meta` is read-only.', data);\n }\n if (!definition.schema) return data;\n const recordSchema = validationSchema(definition)!;\n const properties = recordSchema.properties ?? {};\n const bound = new Set(boundFields.filter((field) => field in properties));\n const unknownBound = boundFields.filter((field) => !(field in properties));\n if (unknownBound.length > 0) {\n throw validationError(['bindings'], `Bound field${unknownBound.length > 1 ? 's' : ''} ${unknownBound.join(', ')} not declared in \"${collectionLabel(definition)}\".`, boundFields);\n }\n if (bound.size === 0) return strictParse(definition.schema, recordSchema, data, ['data']) as Record<string, unknown>;\n\n const literal = Object.fromEntries(Object.entries(data).filter(([key]) => !bound.has(key)));\n const omit = Object.fromEntries([...bound].map((field) => [field, true as const]));\n const literalSchema: RecordSchema = {\n ...recordSchema,\n properties: Object.fromEntries(Object.entries(properties).filter(([key]) => !bound.has(key))),\n required: recordSchema.required?.filter((key) => !bound.has(key)),\n };\n const parsed = strictParse(definition.schema.omit(omit as never), literalSchema, literal, ['data']) as Record<string, unknown>;\n const boundValues = Object.fromEntries(Object.entries(data).filter(([key]) => bound.has(key)));\n return { ...parsed, ...boundValues };\n}\n\nconst VALUE_OPERATORS = new Set(['$set', '$setOnInsert']);\nconst ELEMENT_OPERATORS = new Set(['$push', '$addToSet']);\nconst NUMERIC_OPERATORS = new Set(['$inc', '$mul']);\n\n/** Validates update-operator documents against the declaration (paths and values). */\nexport function validateUpdate(definition: CollectionTarget, update: Record<string, unknown>): Record<string, unknown> {\n if (!isPlainObject(update) || Object.keys(update).length === 0) {\n throw validationError([], 'An update needs at least one operator such as `$set`.', update);\n }\n const recordSchema = validationSchema(definition);\n const out: Record<string, unknown> = {};\n\n for (const [operator, fields] of Object.entries(update)) {\n if (!operator.startsWith('$')) {\n throw validationError([operator], \"Updates use operators (`{ $set: { status: \\\"DONE\\\" } }`); use replaceOne() to replace a whole document.\", update);\n }\n if (!isPlainObject(fields)) throw validationError([operator], `\\`${operator}\\` takes an object of field paths.`, fields);\n const next: Record<string, unknown> = {};\n\n for (const [path, value] of Object.entries(fields)) {\n const issuePath = [operator, path];\n if (path === '_id' || path === '_meta' || path.startsWith('_meta.')) {\n throw validationError(issuePath, '`_id` and `_meta` are read-only.', value);\n }\n if (!definition.schema || !recordSchema) {\n next[path] = value;\n continue;\n }\n const target = recordSchemaAt(recordSchema, path);\n const zodTarget = zodAt(definition.schema, path);\n if (!target || !zodTarget) {\n throw validationError(issuePath, `\"${path}\" is not a declared field of \"${collectionLabel(definition)}\".`, value);\n }\n\n if (VALUE_OPERATORS.has(operator)) {\n if (value === undefined) continue;\n next[path] = strictParse(zodTarget, target, value, issuePath);\n } else if (ELEMENT_OPERATORS.has(operator)) {\n const element = zodTarget instanceof z.ZodOptional ? zodTarget.unwrap() : zodTarget;\n if (target.type !== 'array' || !(element instanceof z.ZodArray)) {\n throw validationError(issuePath, `\\`${operator}\\` needs an array field; \"${path}\" is ${target.type}.`, value);\n }\n const each = isPlainObject(value) && Array.isArray(value.$each);\n const items = each ? ((value as { $each: unknown[] }).$each) : [value];\n const parsed = items.map((item, index) =>\n strictParse(element.element as z.ZodType, target.items, item, each ? [...issuePath, '$each', index] : issuePath),\n );\n next[path] = each ? { ...(value as Record<string, unknown>), $each: parsed } : parsed[0];\n } else if (NUMERIC_OPERATORS.has(operator)) {\n if (target.type !== 'number' && target.type !== 'integer') {\n throw validationError(issuePath, `\\`${operator}\\` needs a numeric field; \"${path}\" is ${target.type}.`, value);\n }\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n throw validationError(issuePath, `\\`${operator}\\` needs a finite number.`, value);\n }\n next[path] = value;\n } else if (operator === '$rename') {\n if (typeof value !== 'string' || !recordSchemaAt(recordSchema, value)) {\n throw validationError(issuePath, `\\`$rename\\` target \"${String(value)}\" is not a declared field.`, value);\n }\n next[path] = value;\n } else {\n // $unset, $min, $max, $currentDate, $pop, $pull, $pullAll: the path is\n // declared; UNS validates the resulting document.\n next[path] = value;\n }\n }\n if (Object.keys(next).length > 0) out[operator] = next;\n }\n if (Object.keys(out).length === 0) {\n throw validationError([], 'Nothing to update: undefined values are dropped; clear a field with `$unset`.', update);\n }\n return out;\n}\n"]}
@@ -31,13 +31,13 @@
31
31
  */
32
32
  import { type EnsureState } from './bootstrap.js';
33
33
  import type { DataOpenStream } from './call.js';
34
- import type { CollectionDefinition } from './define.js';
34
+ import { type CollectionTarget } from './define.js';
35
35
  import { DataError } from './error.js';
36
36
  /** Three missed 15 s heartbeats. */
37
37
  export declare const SUBSCRIBE_IDLE_TIMEOUT_MS = 45000;
38
38
  export interface SubscribeOptions {
39
- /** Declarations or aliases to watch (at most 64); defaults to every declared collection. */
40
- collections?: readonly (CollectionDefinition | string)[];
39
+ /** Declarations, aliases, or existing-ID references (at most 64); defaults to every declared collection. */
40
+ collections?: readonly (CollectionTarget | string)[];
41
41
  /** Only changes of these record IDs (1–100, duplicates ignored), when exactly one collection is watched. */
42
42
  recordIds?: readonly string[];
43
43
  /**
@@ -57,7 +57,7 @@ export interface SubscribeOptions {
57
57
  interface ChangeBase {
58
58
  type: 'change';
59
59
  eventId: string;
60
- /** Alias of the declared collection. */
60
+ /** Alias of a declared collection, or the ID of an existing collection reference. */
61
61
  collection: string;
62
62
  collectionId: string;
63
63
  occurredAt: number;
@@ -98,10 +98,11 @@ export type SubscriptionEvent = ChangeEvent | {
98
98
  export declare function redactRestricted<E extends SubscriptionEvent>(event: E): E | CollectionChange;
99
99
  export interface SubscribeRuntime {
100
100
  openStream: DataOpenStream;
101
- ensure(): Promise<EnsureState>;
102
- rebuild(before: EnsureState, cause: DataError): Promise<boolean>;
103
- lookup(target: CollectionDefinition | string): CollectionDefinition;
104
- declared: readonly CollectionDefinition[];
101
+ ensure(targets: readonly CollectionTarget[]): Promise<EnsureState>;
102
+ rebuild(before: EnsureState, cause: DataError, targets: readonly CollectionTarget[]): Promise<boolean>;
103
+ resolve(target: CollectionTarget): Promise<string>;
104
+ lookup(target: CollectionTarget | string): CollectionTarget;
105
+ declared: readonly CollectionTarget[];
105
106
  subject(): string | undefined;
106
107
  }
107
108
  export declare function createSubscribe(runtime: SubscribeRuntime): (options?: SubscribeOptions) => AsyncGenerator<SubscriptionEvent, void, undefined>;
@@ -36,6 +36,7 @@ exports.createSubscribe = createSubscribe;
36
36
  */
37
37
  const bootstrap_js_1 = require("./bootstrap.js");
38
38
  const client_js_1 = require("../uns-v2/client.js");
39
+ const define_js_1 = require("./define.js");
39
40
  const error_js_1 = require("./error.js");
40
41
  /** Three missed 15 s heartbeats. */
41
42
  exports.SUBSCRIBE_IDLE_TIMEOUT_MS = 45_000;
@@ -142,7 +143,7 @@ function createSubscribe(runtime) {
142
143
  while (!stop.signal.aborted) {
143
144
  let state;
144
145
  try {
145
- state = await runtime.ensure();
146
+ state = await runtime.ensure(definitions);
146
147
  }
147
148
  catch (error) {
148
149
  // A freshly imported App answers APP_NOT_READY for a while: keep waiting for it.
@@ -153,15 +154,8 @@ function createSubscribe(runtime) {
153
154
  }
154
155
  const aliases = new Map();
155
156
  for (const definition of definitions) {
156
- const id = state.collectionIds.get(definition.alias.toLowerCase());
157
- if (!id) {
158
- throw new error_js_1.DataError({
159
- message: `Collection "${definition.alias}" is unavailable: ensure did not return it (see the server log).`,
160
- status: 503,
161
- code: 'COLLECTION_UNAVAILABLE',
162
- });
163
- }
164
- aliases.set(id, definition.alias);
157
+ const id = await runtime.resolve(definition);
158
+ aliases.set(id, (0, define_js_1.collectionLabel)(definition));
165
159
  }
166
160
  const connection = new AbortController();
167
161
  const closeConnection = () => connection.abort();
@@ -222,7 +216,7 @@ function createSubscribe(runtime) {
222
216
  if ((0, bootstrap_js_1.isStaleCollectionError)(error)) {
223
217
  let changed;
224
218
  try {
225
- changed = await runtime.rebuild(state, error);
219
+ changed = await runtime.rebuild(state, error, definitions);
226
220
  }
227
221
  catch (cause) {
228
222
  if (!(cause instanceof error_js_1.DataError) || !cause.retry.safe)
@@ -1 +1 @@
1
- {"version":3,"file":"subscribe.js","sourceRoot":"","sources":["../../../src/data/subscribe.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * `data.subscribe`: committed record changes of declared collections over\n * UNS `records:subscribe` (server-sent events), as one async iterable that\n * outlives single connections.\n *\n * - Reconnects with `Last-Event-ID` when the stream ends, breaks, or stays\n * silent for `idleTimeoutMs` (UNS sends a heartbeat every 15 s). A stream\n * that dies young without a change backs off, so a server dropping every\n * connection is not hammered.\n * - Failures marked `retry.safe` (429 over the subscription limit, 503,\n * `APP_NOT_READY` from ensure …) are retried after `retry.afterMs` or a\n * backoff of up to 30 s, without end; any other failure ends the\n * iteration with that DataError.\n * - `reset` is passed on: `CURSOR_EXPIRED` (the position was cleaned up after\n * 24 h, cannot be decoded after a key rotation, or the tenant database\n * moved) or `SCOPE_CHANGED` (access changed, e.g. a collection is no longer\n * readable). The consumer reloads what it shows; the next connection\n * starts from now, without a resume position. A collection recreated\n * under a new ID (see bootstrap self-healing) yields `COLLECTION_RECREATED`.\n * - UNS delivers changes in write-transaction order, not commit order, so\n * revisions of one record may arrive out of order. A non-delete change at\n * or below the revision already passed on for its record is dropped; a\n * `delete` always passes, a late one too, and forgets the record's\n * revision, since a record written again under the same ID may start\n * over at revision 1.\n * - Changes in collections with employee data rules (`restricted`) come as\n * collection-level notices unless `restricted: \"record\"` is asked for.\n * - Aborting `signal` or leaving the loop ends the iteration without error.\n *\n * Events carry identities only, never record data; read the record to show it.\n */\nimport { isStaleCollectionError, type EnsureState } from './bootstrap.js';\nimport type { CallOptions, DataOpenStream } from './call.js';\nimport { assertEventId, UNS_V2_SUBSCRIBE_MAX_COLLECTIONS, UNS_V2_SUBSCRIBE_MAX_RECORD_IDS } from '../uns-v2/client.js';\nimport type { CollectionDefinition } from './define.js';\nimport { DataError } from './error.js';\n\n/** Three missed 15 s heartbeats. */\nexport const SUBSCRIBE_IDLE_TIMEOUT_MS = 45_000;\nconst RECONNECT_BASE_MS = 500;\nconst RECONNECT_MAX_MS = 30_000;\n/** After a reset, the next connection waits at least this long. */\nconst RESET_PAUSE_MS = 1_000;\n/** A connection alive this long counts as healthy even without changes. */\nconst HEALTHY_CONNECTION_MS = 30_000;\n/** Records whose last revision is remembered; beyond this the oldest is forgotten (a stale change may then pass, which only costs a reread). */\nconst SUBSCRIBE_SEEN_RECORDS_MAX = 10_000;\n\nexport interface SubscribeOptions {\n /** Declarations or aliases to watch (at most 64); defaults to every declared collection. */\n collections?: readonly (CollectionDefinition | string)[];\n /** Only changes of these record IDs (1–100, duplicates ignored), when exactly one collection is watched. */\n recordIds?: readonly string[];\n /**\n * How changes in collections with employee data rules arrive.\n * `collection` (default): as a collection-level notice without record ID\n * or revision, safe to forward to any employee. `record`: the full event,\n * for server-side consumers that do not forward it to browsers, or that\n * redact per recipient with `redactRestricted`.\n */\n restricted?: 'collection' | 'record';\n /** Resume after this event (e.g. a browser's `Last-Event-ID`). */\n lastEventId?: string;\n signal?: AbortSignal;\n /** Reconnect when nothing, not even a heartbeat, arrives for this long. */\n idleTimeoutMs?: number;\n}\n\ninterface ChangeBase {\n type: 'change';\n eventId: string;\n /** Alias of the declared collection. */\n collection: string;\n collectionId: string;\n occurredAt: number;\n /**\n * The collection has employee data rules: whether an employee may see this\n * record depends on who they are. Such changes arrive as `CollectionChange`\n * unless the subscription asked for `restricted: \"record\"`.\n */\n restricted: boolean;\n}\n\n/**\n * One record committed (`record`) or deleted (`delete`) at `revision`. A\n * `record` change is never at or below a revision already passed on for the\n * same record since its last delete; a `delete` may be.\n */\nexport interface RecordChange extends ChangeBase {\n change: 'record' | 'delete';\n recordId: string;\n revision: number;\n}\n\n/** Something in the collection changed; which record is not disclosed. Reload through the data rules. */\nexport interface CollectionChange extends ChangeBase {\n change: 'collection';\n}\n\nexport type ChangeEvent = RecordChange | CollectionChange;\n/** `reason`: `CURSOR_EXPIRED`, `SCOPE_CHANGED` (from UNS) or `COLLECTION_RECREATED`. */\nexport type SubscriptionEvent = ChangeEvent | { type: 'reset'; reason: string; message?: string };\n\n/**\n * The event as an employee's browser may see it: a change in a collection\n * with employee data rules becomes a collection-level notice without record\n * ID or revision, so it does not reveal records the employee may not read.\n * Other events pass unchanged.\n */\nexport function redactRestricted<E extends SubscriptionEvent>(event: E): E | CollectionChange {\n if (event.type !== 'change' || !event.restricted || event.change === 'collection') return event;\n const { eventId, collection, collectionId, occurredAt, restricted } = event;\n return { type: 'change', eventId, collection, collectionId, occurredAt, restricted, change: 'collection' };\n}\n\nexport interface SubscribeRuntime {\n openStream: DataOpenStream;\n ensure(): Promise<EnsureState>;\n rebuild(before: EnsureState, cause: DataError): Promise<boolean>;\n lookup(target: CollectionDefinition | string): CollectionDefinition;\n declared: readonly CollectionDefinition[];\n subject(): string | undefined;\n}\n\nfunction reconnectDelay(failures: number, afterMs: number | undefined): number {\n if (afterMs !== undefined) return Math.min(afterMs, RECONNECT_MAX_MS);\n const ceiling = Math.min(RECONNECT_MAX_MS, RECONNECT_BASE_MS * 2 ** Math.max(0, failures - 1));\n return ceiling / 2 + Math.random() * (ceiling / 2);\n}\n\n/**\n * The highest revision passed on per record, so changes delivered out of\n * order are dropped (UNS orders by write transaction, not by commit).\n */\nclass SeenRevisions {\n private readonly revisions = new Map<string, number>();\n\n constructor(private readonly max: number) {}\n\n /** Whether the change is new; remembers its revision, or forgets the record on delete. */\n admit(collectionId: string, recordId: string, revision: number, change: 'record' | 'delete'): boolean {\n const key = `${collectionId}\\u0000${recordId}`;\n const seen = this.revisions.get(key);\n // A delete always passes, a late one too: the record may be written again under the same ID, from revision 1.\n if (change === 'delete') {\n this.revisions.delete(key);\n return true;\n }\n if (seen !== undefined && revision <= seen) return false;\n this.revisions.delete(key);\n this.revisions.set(key, revision);\n if (this.revisions.size > this.max) this.revisions.delete(this.revisions.keys().next().value!);\n return true;\n }\n\n clear() {\n this.revisions.clear();\n }\n}\n\nfunction pause(ms: number, signal: AbortSignal): Promise<void> {\n return new Promise((resolve) => {\n if (signal.aborted) return resolve();\n const done = () => {\n clearTimeout(timer);\n signal.removeEventListener('abort', done);\n resolve();\n };\n const timer = setTimeout(done, ms);\n signal.addEventListener('abort', done, { once: true });\n });\n}\n\nexport function createSubscribe(runtime: SubscribeRuntime) {\n return async function* subscribe(options: SubscribeOptions = {}): AsyncGenerator<SubscriptionEvent, void, undefined> {\n const definitions = [...new Set((options.collections ?? runtime.declared).map(runtime.lookup))];\n if (definitions.length < 1 || definitions.length > UNS_V2_SUBSCRIBE_MAX_COLLECTIONS) {\n throw new TypeError(`data.subscribe watches 1–${UNS_V2_SUBSCRIBE_MAX_COLLECTIONS} collections; got ${definitions.length}.`);\n }\n const recordIds = options.recordIds === undefined ? undefined : [...new Set(options.recordIds)];\n if (recordIds && (recordIds.length < 1 || recordIds.length > UNS_V2_SUBSCRIBE_MAX_RECORD_IDS || definitions.length !== 1)) {\n throw new TypeError(`data.subscribe takes 1–${UNS_V2_SUBSCRIBE_MAX_RECORD_IDS} recordIds, of exactly one collection.`);\n }\n if (options.lastEventId !== undefined) assertEventId(options.lastEventId);\n const redact = (options.restricted ?? 'collection') === 'collection';\n const idleMs = options.idleTimeoutMs ?? SUBSCRIBE_IDLE_TIMEOUT_MS;\n // The subject of the request that subscribed; an App-level subscription carries none.\n const call: CallOptions = { dataSubject: runtime.subject() };\n const stop = new AbortController();\n const onAbort = () => stop.abort();\n options.signal?.addEventListener('abort', onAbort, { once: true });\n if (options.signal?.aborted) stop.abort();\n let lastEventId = options.lastEventId;\n let failures = 0;\n const seen = new SeenRevisions(SUBSCRIBE_SEEN_RECORDS_MAX);\n /** Waits, longer each time, before the next attempt. */\n const backOff = async (afterMs?: number) => {\n failures += 1;\n await pause(reconnectDelay(failures, afterMs), stop.signal);\n };\n try {\n while (!stop.signal.aborted) {\n let state: EnsureState;\n try {\n state = await runtime.ensure();\n } catch (error) {\n // A freshly imported App answers APP_NOT_READY for a while: keep waiting for it.\n if (!(error instanceof DataError) || !error.retry.safe || stop.signal.aborted) throw error;\n await backOff(error.retry.afterMs);\n continue;\n }\n const aliases = new Map<string, string>();\n for (const definition of definitions) {\n const id = state.collectionIds.get(definition.alias.toLowerCase());\n if (!id) {\n throw new DataError({\n message: `Collection \"${definition.alias}\" is unavailable: ensure did not return it (see the server log).`,\n status: 503,\n code: 'COLLECTION_UNAVAILABLE',\n });\n }\n aliases.set(id, definition.alias);\n }\n\n const connection = new AbortController();\n const closeConnection = () => connection.abort();\n stop.signal.addEventListener('abort', closeConnection, { once: true });\n let idle: ReturnType<typeof setTimeout> | undefined;\n const arm = () => {\n clearTimeout(idle);\n idle = setTimeout(closeConnection, idleMs);\n };\n const openedAt = Date.now();\n let healthy = false;\n let reset = false;\n try {\n arm();\n const stream = runtime.openStream(\n { collectionIds: [...aliases.keys()], ...(recordIds ? { recordIds } : {}) },\n { ...call, lastEventId, signal: connection.signal },\n );\n for await (const event of stream) {\n arm();\n if (Date.now() - openedAt >= HEALTHY_CONNECTION_MS) healthy = true;\n if (event.type === 'heartbeat') {\n // The connect heartbeat names the current position: resuming from it loses nothing.\n if (event.eventId !== undefined) lastEventId = event.eventId;\n continue;\n }\n if (event.type === 'reset') {\n lastEventId = undefined;\n reset = true;\n // The consumer rereads everything; revisions seen before mean nothing for what follows.\n seen.clear();\n yield event.message === undefined ? { type: 'reset', reason: event.reason } : { type: 'reset', reason: event.reason, message: event.message };\n continue;\n }\n healthy = true;\n // A dropped change is still a resume position.\n lastEventId = event.eventId;\n if (!seen.admit(event.collectionId, event.recordId, event.revision, event.change)) continue;\n const change: RecordChange = {\n type: 'change',\n eventId: event.eventId,\n collection: aliases.get(event.collectionId) ?? event.collectionId,\n collectionId: event.collectionId,\n occurredAt: event.occurredAt,\n restricted: event.restricted,\n change: event.change,\n recordId: event.recordId,\n revision: event.revision,\n };\n yield redact ? redactRestricted(change) : change;\n }\n } catch (error) {\n if (stop.signal.aborted) return;\n if (!(error instanceof DataError)) throw error;\n if (isStaleCollectionError(error)) {\n let changed: boolean;\n try {\n changed = await runtime.rebuild(state, error);\n } catch (cause) {\n if (!(cause instanceof DataError) || !cause.retry.safe) throw cause;\n await backOff(cause.retry.afterMs);\n continue;\n }\n if (!changed) throw error;\n // Recreated collections have new IDs; their old cursor means nothing.\n lastEventId = undefined;\n seen.clear();\n yield { type: 'reset', reason: 'COLLECTION_RECREATED' };\n continue;\n }\n if (!error.retry.safe) throw error;\n await backOff(error.retry.afterMs);\n continue;\n } finally {\n clearTimeout(idle);\n connection.abort();\n stop.signal.removeEventListener('abort', closeConnection);\n }\n // The stream ended or went silent. Reconnect at once after a healthy connection, else back off.\n if (Date.now() - openedAt >= HEALTHY_CONNECTION_MS) healthy = true;\n if (healthy) failures = 0;\n else failures += 1;\n // A reset always waits a moment: a server resetting in a loop is not reconnected to in a loop.\n const wait = Math.max(reset ? RESET_PAUSE_MS : 0, healthy ? 0 : reconnectDelay(failures, undefined));\n if (wait > 0) await pause(wait, stop.signal);\n }\n } finally {\n stop.abort();\n options.signal?.removeEventListener('abort', onAbort);\n }\n };\n}\n"]}
1
+ {"version":3,"file":"subscribe.js","sourceRoot":"","sources":["../../../src/data/subscribe.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * `data.subscribe`: committed record changes of declared collections over\n * UNS `records:subscribe` (server-sent events), as one async iterable that\n * outlives single connections.\n *\n * - Reconnects with `Last-Event-ID` when the stream ends, breaks, or stays\n * silent for `idleTimeoutMs` (UNS sends a heartbeat every 15 s). A stream\n * that dies young without a change backs off, so a server dropping every\n * connection is not hammered.\n * - Failures marked `retry.safe` (429 over the subscription limit, 503,\n * `APP_NOT_READY` from ensure …) are retried after `retry.afterMs` or a\n * backoff of up to 30 s, without end; any other failure ends the\n * iteration with that DataError.\n * - `reset` is passed on: `CURSOR_EXPIRED` (the position was cleaned up after\n * 24 h, cannot be decoded after a key rotation, or the tenant database\n * moved) or `SCOPE_CHANGED` (access changed, e.g. a collection is no longer\n * readable). The consumer reloads what it shows; the next connection\n * starts from now, without a resume position. A collection recreated\n * under a new ID (see bootstrap self-healing) yields `COLLECTION_RECREATED`.\n * - UNS delivers changes in write-transaction order, not commit order, so\n * revisions of one record may arrive out of order. A non-delete change at\n * or below the revision already passed on for its record is dropped; a\n * `delete` always passes, a late one too, and forgets the record's\n * revision, since a record written again under the same ID may start\n * over at revision 1.\n * - Changes in collections with employee data rules (`restricted`) come as\n * collection-level notices unless `restricted: \"record\"` is asked for.\n * - Aborting `signal` or leaving the loop ends the iteration without error.\n *\n * Events carry identities only, never record data; read the record to show it.\n */\nimport { isStaleCollectionError, type EnsureState } from './bootstrap.js';\nimport type { CallOptions, DataOpenStream } from './call.js';\nimport { assertEventId, UNS_V2_SUBSCRIBE_MAX_COLLECTIONS, UNS_V2_SUBSCRIBE_MAX_RECORD_IDS } from '../uns-v2/client.js';\nimport { collectionLabel, type CollectionTarget } from './define.js';\nimport { DataError } from './error.js';\n\n/** Three missed 15 s heartbeats. */\nexport const SUBSCRIBE_IDLE_TIMEOUT_MS = 45_000;\nconst RECONNECT_BASE_MS = 500;\nconst RECONNECT_MAX_MS = 30_000;\n/** After a reset, the next connection waits at least this long. */\nconst RESET_PAUSE_MS = 1_000;\n/** A connection alive this long counts as healthy even without changes. */\nconst HEALTHY_CONNECTION_MS = 30_000;\n/** Records whose last revision is remembered; beyond this the oldest is forgotten (a stale change may then pass, which only costs a reread). */\nconst SUBSCRIBE_SEEN_RECORDS_MAX = 10_000;\n\nexport interface SubscribeOptions {\n /** Declarations, aliases, or existing-ID references (at most 64); defaults to every declared collection. */\n collections?: readonly (CollectionTarget | string)[];\n /** Only changes of these record IDs (1–100, duplicates ignored), when exactly one collection is watched. */\n recordIds?: readonly string[];\n /**\n * How changes in collections with employee data rules arrive.\n * `collection` (default): as a collection-level notice without record ID\n * or revision, safe to forward to any employee. `record`: the full event,\n * for server-side consumers that do not forward it to browsers, or that\n * redact per recipient with `redactRestricted`.\n */\n restricted?: 'collection' | 'record';\n /** Resume after this event (e.g. a browser's `Last-Event-ID`). */\n lastEventId?: string;\n signal?: AbortSignal;\n /** Reconnect when nothing, not even a heartbeat, arrives for this long. */\n idleTimeoutMs?: number;\n}\n\ninterface ChangeBase {\n type: 'change';\n eventId: string;\n /** Alias of a declared collection, or the ID of an existing collection reference. */\n collection: string;\n collectionId: string;\n occurredAt: number;\n /**\n * The collection has employee data rules: whether an employee may see this\n * record depends on who they are. Such changes arrive as `CollectionChange`\n * unless the subscription asked for `restricted: \"record\"`.\n */\n restricted: boolean;\n}\n\n/**\n * One record committed (`record`) or deleted (`delete`) at `revision`. A\n * `record` change is never at or below a revision already passed on for the\n * same record since its last delete; a `delete` may be.\n */\nexport interface RecordChange extends ChangeBase {\n change: 'record' | 'delete';\n recordId: string;\n revision: number;\n}\n\n/** Something in the collection changed; which record is not disclosed. Reload through the data rules. */\nexport interface CollectionChange extends ChangeBase {\n change: 'collection';\n}\n\nexport type ChangeEvent = RecordChange | CollectionChange;\n/** `reason`: `CURSOR_EXPIRED`, `SCOPE_CHANGED` (from UNS) or `COLLECTION_RECREATED`. */\nexport type SubscriptionEvent = ChangeEvent | { type: 'reset'; reason: string; message?: string };\n\n/**\n * The event as an employee's browser may see it: a change in a collection\n * with employee data rules becomes a collection-level notice without record\n * ID or revision, so it does not reveal records the employee may not read.\n * Other events pass unchanged.\n */\nexport function redactRestricted<E extends SubscriptionEvent>(event: E): E | CollectionChange {\n if (event.type !== 'change' || !event.restricted || event.change === 'collection') return event;\n const { eventId, collection, collectionId, occurredAt, restricted } = event;\n return { type: 'change', eventId, collection, collectionId, occurredAt, restricted, change: 'collection' };\n}\n\nexport interface SubscribeRuntime {\n openStream: DataOpenStream;\n ensure(targets: readonly CollectionTarget[]): Promise<EnsureState>;\n rebuild(before: EnsureState, cause: DataError, targets: readonly CollectionTarget[]): Promise<boolean>;\n resolve(target: CollectionTarget): Promise<string>;\n lookup(target: CollectionTarget | string): CollectionTarget;\n declared: readonly CollectionTarget[];\n subject(): string | undefined;\n}\n\nfunction reconnectDelay(failures: number, afterMs: number | undefined): number {\n if (afterMs !== undefined) return Math.min(afterMs, RECONNECT_MAX_MS);\n const ceiling = Math.min(RECONNECT_MAX_MS, RECONNECT_BASE_MS * 2 ** Math.max(0, failures - 1));\n return ceiling / 2 + Math.random() * (ceiling / 2);\n}\n\n/**\n * The highest revision passed on per record, so changes delivered out of\n * order are dropped (UNS orders by write transaction, not by commit).\n */\nclass SeenRevisions {\n private readonly revisions = new Map<string, number>();\n\n constructor(private readonly max: number) {}\n\n /** Whether the change is new; remembers its revision, or forgets the record on delete. */\n admit(collectionId: string, recordId: string, revision: number, change: 'record' | 'delete'): boolean {\n const key = `${collectionId}\\u0000${recordId}`;\n const seen = this.revisions.get(key);\n // A delete always passes, a late one too: the record may be written again under the same ID, from revision 1.\n if (change === 'delete') {\n this.revisions.delete(key);\n return true;\n }\n if (seen !== undefined && revision <= seen) return false;\n this.revisions.delete(key);\n this.revisions.set(key, revision);\n if (this.revisions.size > this.max) this.revisions.delete(this.revisions.keys().next().value!);\n return true;\n }\n\n clear() {\n this.revisions.clear();\n }\n}\n\nfunction pause(ms: number, signal: AbortSignal): Promise<void> {\n return new Promise((resolve) => {\n if (signal.aborted) return resolve();\n const done = () => {\n clearTimeout(timer);\n signal.removeEventListener('abort', done);\n resolve();\n };\n const timer = setTimeout(done, ms);\n signal.addEventListener('abort', done, { once: true });\n });\n}\n\nexport function createSubscribe(runtime: SubscribeRuntime) {\n return async function* subscribe(options: SubscribeOptions = {}): AsyncGenerator<SubscriptionEvent, void, undefined> {\n const definitions = [...new Set((options.collections ?? runtime.declared).map(runtime.lookup))];\n if (definitions.length < 1 || definitions.length > UNS_V2_SUBSCRIBE_MAX_COLLECTIONS) {\n throw new TypeError(`data.subscribe watches 1–${UNS_V2_SUBSCRIBE_MAX_COLLECTIONS} collections; got ${definitions.length}.`);\n }\n const recordIds = options.recordIds === undefined ? undefined : [...new Set(options.recordIds)];\n if (recordIds && (recordIds.length < 1 || recordIds.length > UNS_V2_SUBSCRIBE_MAX_RECORD_IDS || definitions.length !== 1)) {\n throw new TypeError(`data.subscribe takes 1–${UNS_V2_SUBSCRIBE_MAX_RECORD_IDS} recordIds, of exactly one collection.`);\n }\n if (options.lastEventId !== undefined) assertEventId(options.lastEventId);\n const redact = (options.restricted ?? 'collection') === 'collection';\n const idleMs = options.idleTimeoutMs ?? SUBSCRIBE_IDLE_TIMEOUT_MS;\n // The subject of the request that subscribed; an App-level subscription carries none.\n const call: CallOptions = { dataSubject: runtime.subject() };\n const stop = new AbortController();\n const onAbort = () => stop.abort();\n options.signal?.addEventListener('abort', onAbort, { once: true });\n if (options.signal?.aborted) stop.abort();\n let lastEventId = options.lastEventId;\n let failures = 0;\n const seen = new SeenRevisions(SUBSCRIBE_SEEN_RECORDS_MAX);\n /** Waits, longer each time, before the next attempt. */\n const backOff = async (afterMs?: number) => {\n failures += 1;\n await pause(reconnectDelay(failures, afterMs), stop.signal);\n };\n try {\n while (!stop.signal.aborted) {\n let state: EnsureState;\n try {\n state = await runtime.ensure(definitions);\n } catch (error) {\n // A freshly imported App answers APP_NOT_READY for a while: keep waiting for it.\n if (!(error instanceof DataError) || !error.retry.safe || stop.signal.aborted) throw error;\n await backOff(error.retry.afterMs);\n continue;\n }\n const aliases = new Map<string, string>();\n for (const definition of definitions) {\n const id = await runtime.resolve(definition);\n aliases.set(id, collectionLabel(definition));\n }\n\n const connection = new AbortController();\n const closeConnection = () => connection.abort();\n stop.signal.addEventListener('abort', closeConnection, { once: true });\n let idle: ReturnType<typeof setTimeout> | undefined;\n const arm = () => {\n clearTimeout(idle);\n idle = setTimeout(closeConnection, idleMs);\n };\n const openedAt = Date.now();\n let healthy = false;\n let reset = false;\n try {\n arm();\n const stream = runtime.openStream(\n { collectionIds: [...aliases.keys()], ...(recordIds ? { recordIds } : {}) },\n { ...call, lastEventId, signal: connection.signal },\n );\n for await (const event of stream) {\n arm();\n if (Date.now() - openedAt >= HEALTHY_CONNECTION_MS) healthy = true;\n if (event.type === 'heartbeat') {\n // The connect heartbeat names the current position: resuming from it loses nothing.\n if (event.eventId !== undefined) lastEventId = event.eventId;\n continue;\n }\n if (event.type === 'reset') {\n lastEventId = undefined;\n reset = true;\n // The consumer rereads everything; revisions seen before mean nothing for what follows.\n seen.clear();\n yield event.message === undefined ? { type: 'reset', reason: event.reason } : { type: 'reset', reason: event.reason, message: event.message };\n continue;\n }\n healthy = true;\n // A dropped change is still a resume position.\n lastEventId = event.eventId;\n if (!seen.admit(event.collectionId, event.recordId, event.revision, event.change)) continue;\n const change: RecordChange = {\n type: 'change',\n eventId: event.eventId,\n collection: aliases.get(event.collectionId) ?? event.collectionId,\n collectionId: event.collectionId,\n occurredAt: event.occurredAt,\n restricted: event.restricted,\n change: event.change,\n recordId: event.recordId,\n revision: event.revision,\n };\n yield redact ? redactRestricted(change) : change;\n }\n } catch (error) {\n if (stop.signal.aborted) return;\n if (!(error instanceof DataError)) throw error;\n if (isStaleCollectionError(error)) {\n let changed: boolean;\n try {\n changed = await runtime.rebuild(state, error, definitions);\n } catch (cause) {\n if (!(cause instanceof DataError) || !cause.retry.safe) throw cause;\n await backOff(cause.retry.afterMs);\n continue;\n }\n if (!changed) throw error;\n // Recreated collections have new IDs; their old cursor means nothing.\n lastEventId = undefined;\n seen.clear();\n yield { type: 'reset', reason: 'COLLECTION_RECREATED' };\n continue;\n }\n if (!error.retry.safe) throw error;\n await backOff(error.retry.afterMs);\n continue;\n } finally {\n clearTimeout(idle);\n connection.abort();\n stop.signal.removeEventListener('abort', closeConnection);\n }\n // The stream ended or went silent. Reconnect at once after a healthy connection, else back off.\n if (Date.now() - openedAt >= HEALTHY_CONNECTION_MS) healthy = true;\n if (healthy) failures = 0;\n else failures += 1;\n // A reset always waits a moment: a server resetting in a loop is not reconnected to in a loop.\n const wait = Math.max(reset ? RESET_PAUSE_MS : 0, healthy ? 0 : reconnectDelay(failures, undefined));\n if (wait > 0) await pause(wait, stop.signal);\n }\n } finally {\n stop.abort();\n options.signal?.removeEventListener('abort', onAbort);\n }\n };\n}\n"]}
@@ -1896,7 +1896,7 @@ export type CloudStreamSampleTestResponse = {
1896
1896
  });
1897
1897
  };
1898
1898
  export type CloudAppDataGrant = {
1899
- "alias": string;
1899
+ "alias"?: string;
1900
1900
  "collectionId": string;
1901
1901
  "permissions": Array<"record:read" | "record:write" | "record:delete" | "sample:read" | "sample:write">;
1902
1902
  "dataRule"?: CloudAppDataRule;
@@ -9824,11 +9824,11 @@ export declare const UNS_V2_CODEC_SCHEMAS: {
9824
9824
  };
9825
9825
  export declare const UNS_V2_CONTRACT_PROVENANCE: {
9826
9826
  readonly repository: "FREEZONEX/Tier0-Backend";
9827
- readonly revision: "8c3967611cb7f28bfb8e6dc7063affef3d0b5210";
9827
+ readonly revision: "0d8cb6dd7c72fb794dd1d63f5c7efb5017804545";
9828
9828
  readonly version: "5.0.0";
9829
9829
  readonly source: "service/unssvr/internal/domain/unsv2/contract_generated.go#ContractJSON";
9830
- readonly cloudRevision: "8c3967611cb7f28bfb8e6dc7063affef3d0b5210";
9831
- readonly cloudContractRevision: "cloud-source-impact/2+source-vendor/2+app-create-capability/1+data/3+record-reads/1+stream-receipt/1+stream-run-error/1+stream-deploy-guard/1+collection-namespace/1+business-name/1+http-acquisition/2+http-source-role/1+http-source-request/1+sql-inline-credentials/1+app-collection/2+collection-ownership/1+metadata/1+app-context/3+collection-ttl/1+error-model/1+crud-consolidation/1+record-insert-return/1+lifecycle-consolidation/1+mutation-defaults/1+api-surface/2+source-stream-single-model+app-data/2+hosted-control/1+source-bindings/1+record-notifications/1+record-delete-samples/1+stream-history/1+app-collections/1+http-in/1+app-resource-access/2+stream-control-probe-retirement/1+http-push-retirement/1";
9830
+ readonly cloudRevision: "0d8cb6dd7c72fb794dd1d63f5c7efb5017804545";
9831
+ readonly cloudContractRevision: "cloud-source-impact/2+source-vendor/2+app-create-capability/1+data/3+record-reads/1+stream-receipt/1+stream-run-error/1+stream-deploy-guard/1+collection-namespace/1+business-name/1+http-acquisition/2+http-source-role/1+http-source-request/1+sql-inline-credentials/1+app-collection/2+collection-ownership/1+metadata/1+app-context/3+collection-ttl/1+error-model/1+crud-consolidation/1+record-insert-return/1+lifecycle-consolidation/1+mutation-defaults/1+api-surface/2+source-stream-single-model+app-data/3+hosted-control/1+source-bindings/1+record-notifications/1+record-delete-samples/1+stream-history/1+app-collections/1+http-in/1+app-resource-access/2+stream-control-probe-retirement/1+http-push-retirement/1";
9832
9832
  readonly resolvedCloudContract: true;
9833
9833
  readonly enterpriseBase: {
9834
9834
  readonly repository: "FREEZONEX/Tier0-Enterprise-New";
@@ -9844,37 +9844,37 @@ export declare const UNS_V2_CONTRACT_PROVENANCE: {
9844
9844
  readonly capability: "x-tier0-opcua-server: static available=false; online availability is workspace/registry authoritative";
9845
9845
  };
9846
9846
  };
9847
- readonly sourceDerivedContractSHA256: "5970027acf0b13b0db628aa0faf42bb1dba9934f4ac81220262e577956b49577";
9847
+ readonly sourceDerivedContractSHA256: "8ebf585ff96fdffae9fa1e9ddd77a7b2e73431ebba0052fdaedf4ede6efddfe5";
9848
9848
  readonly schemaUpdates: readonly [{
9849
9849
  readonly scope: "source-stream-acquisition";
9850
9850
  readonly repository: "FREEZONEX/Tier0-Backend";
9851
- readonly revision: "8c3967611cb7f28bfb8e6dc7063affef3d0b5210";
9851
+ readonly revision: "0d8cb6dd7c72fb794dd1d63f5c7efb5017804545";
9852
9852
  readonly sourceKind: "committed";
9853
9853
  readonly source: "share/unscontract/manifest.json";
9854
- readonly sourceSHA256: "a945c4eaf4d01052859fa050643d61285a49a12897cc84e7c39fa0127a3193eb";
9855
- readonly sourceContractRevision: "cloud-source-impact/2+source-vendor/2+app-create-capability/1+data/3+record-reads/1+stream-receipt/1+stream-run-error/1+stream-deploy-guard/1+collection-namespace/1+business-name/1+http-acquisition/2+http-source-role/1+http-source-request/1+sql-inline-credentials/1+app-collection/2+collection-ownership/1+metadata/1+app-context/3+collection-ttl/1+error-model/1+crud-consolidation/1+record-insert-return/1+lifecycle-consolidation/1+mutation-defaults/1+api-surface/2+source-stream-single-model+app-data/2+hosted-control/1+source-bindings/1+record-notifications/1+record-delete-samples/1+stream-history/1+app-collections/1+http-in/1+app-resource-access/2+stream-control-probe-retirement/1+http-push-retirement/1";
9854
+ readonly sourceSHA256: "a96cac51c46f1cfdd6a60a54c694999b9e5cc9f9ffb498fc912af6426c51d110";
9855
+ readonly sourceContractRevision: "cloud-source-impact/2+source-vendor/2+app-create-capability/1+data/3+record-reads/1+stream-receipt/1+stream-run-error/1+stream-deploy-guard/1+collection-namespace/1+business-name/1+http-acquisition/2+http-source-role/1+http-source-request/1+sql-inline-credentials/1+app-collection/2+collection-ownership/1+metadata/1+app-context/3+collection-ttl/1+error-model/1+crud-consolidation/1+record-insert-return/1+lifecycle-consolidation/1+mutation-defaults/1+api-surface/2+source-stream-single-model+app-data/3+hosted-control/1+source-bindings/1+record-notifications/1+record-delete-samples/1+stream-history/1+app-collections/1+http-in/1+app-resource-access/2+stream-control-probe-retirement/1+http-push-retirement/1";
9856
9856
  readonly schemas: readonly ["CloudSourceCreateCredentials", "CloudSourceDocumentCreateReq", "CloudSourceDocumentUpdateReq", "UnsV2SourceStateUpdateReq", "CloudStreamDocumentCreateReq", "CloudStreamDocumentUpdateReq", "UnsV2StreamProgramDeployReq"];
9857
9857
  readonly inputs: {
9858
9858
  readonly "contracts/uns-v2/manifest.json": {
9859
9859
  readonly path: "share/unscontract/manifest.json";
9860
- readonly sourceSHA256: "a945c4eaf4d01052859fa050643d61285a49a12897cc84e7c39fa0127a3193eb";
9861
- readonly baseSHA256: "a945c4eaf4d01052859fa050643d61285a49a12897cc84e7c39fa0127a3193eb";
9862
- readonly resultSHA256: "a945c4eaf4d01052859fa050643d61285a49a12897cc84e7c39fa0127a3193eb";
9860
+ readonly sourceSHA256: "a96cac51c46f1cfdd6a60a54c694999b9e5cc9f9ffb498fc912af6426c51d110";
9861
+ readonly baseSHA256: "a96cac51c46f1cfdd6a60a54c694999b9e5cc9f9ffb498fc912af6426c51d110";
9862
+ readonly resultSHA256: "a96cac51c46f1cfdd6a60a54c694999b9e5cc9f9ffb498fc912af6426c51d110";
9863
9863
  };
9864
9864
  readonly "contracts/uns-v2/contract.json": {
9865
9865
  readonly path: "share/unscontract/manifest.json";
9866
- readonly sourceSHA256: "a945c4eaf4d01052859fa050643d61285a49a12897cc84e7c39fa0127a3193eb";
9867
- readonly baseSHA256: "5970027acf0b13b0db628aa0faf42bb1dba9934f4ac81220262e577956b49577";
9868
- readonly resultSHA256: "5970027acf0b13b0db628aa0faf42bb1dba9934f4ac81220262e577956b49577";
9866
+ readonly sourceSHA256: "a96cac51c46f1cfdd6a60a54c694999b9e5cc9f9ffb498fc912af6426c51d110";
9867
+ readonly baseSHA256: "8ebf585ff96fdffae9fa1e9ddd77a7b2e73431ebba0052fdaedf4ede6efddfe5";
9868
+ readonly resultSHA256: "8ebf585ff96fdffae9fa1e9ddd77a7b2e73431ebba0052fdaedf4ede6efddfe5";
9869
9869
  };
9870
9870
  };
9871
9871
  }];
9872
9872
  readonly note: "Pinned base with reviewed acquisition schema updates; schemaUpdates records the exact source revision and hashes. Other data-model inputs remain pinned.";
9873
9873
  readonly hashes: {
9874
- readonly contract: "5970027acf0b13b0db628aa0faf42bb1dba9934f4ac81220262e577956b49577";
9874
+ readonly contract: "8ebf585ff96fdffae9fa1e9ddd77a7b2e73431ebba0052fdaedf4ede6efddfe5";
9875
9875
  readonly cloudSupport: "4ff9d5ff69e35e38459287cf15df45ab627684e2e2294dfd1e076ebc4fc34b46";
9876
- readonly manifest: "a945c4eaf4d01052859fa050643d61285a49a12897cc84e7c39fa0127a3193eb";
9877
- readonly provenance: "b5ea7feb17b5ae8eec66eb80a35c477218cb8bbe199a9de5aaf5880fd7e076ff";
9876
+ readonly manifest: "a96cac51c46f1cfdd6a60a54c694999b9e5cc9f9ffb498fc912af6426c51d110";
9877
+ readonly provenance: "7c994e15d8910be30794d99d5e2b10ff2535fda6d7495717c499119890fd1fc4";
9878
9878
  readonly registry: "c74313c217742d50391a94c09e60d5c5bd1a89c305fa4145cbf23b35ba7dbcdb";
9879
9879
  };
9880
9880
  readonly publicOperationCount: 82;