@getmarrow/mcp 3.9.102 → 3.9.103

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 (109) hide show
  1. package/README.md +49 -23
  2. package/dist/cli.js +41 -10
  3. package/dist/cli.js.map +1 -1
  4. package/dist/codex-plugin-pins.d.ts +19 -0
  5. package/dist/codex-plugin-pins.d.ts.map +1 -0
  6. package/dist/codex-plugin-pins.js +43 -0
  7. package/dist/codex-plugin-pins.js.map +1 -0
  8. package/dist/codex-plugins.d.ts +34 -0
  9. package/dist/codex-plugins.d.ts.map +1 -0
  10. package/dist/codex-plugins.js +240 -0
  11. package/dist/codex-plugins.js.map +1 -0
  12. package/dist/hook-contract.d.ts +2 -2
  13. package/dist/hook-contract.d.ts.map +1 -1
  14. package/dist/hook-contract.js +8 -3
  15. package/dist/hook-contract.js.map +1 -1
  16. package/dist/hook-pre-action.d.ts +48 -2
  17. package/dist/hook-pre-action.d.ts.map +1 -1
  18. package/dist/hook-pre-action.js +195 -22
  19. package/dist/hook-pre-action.js.map +1 -1
  20. package/dist/hook.d.ts +1 -1
  21. package/dist/hook.d.ts.map +1 -1
  22. package/dist/hook.js +12 -6
  23. package/dist/hook.js.map +1 -1
  24. package/dist/host-session.d.ts +11 -0
  25. package/dist/host-session.d.ts.map +1 -1
  26. package/dist/host-session.js +49 -0
  27. package/dist/host-session.js.map +1 -1
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +15 -10
  30. package/dist/index.js.map +1 -1
  31. package/dist/normalized-action.d.ts +29 -6
  32. package/dist/normalized-action.d.ts.map +1 -1
  33. package/dist/normalized-action.js +492 -102
  34. package/dist/normalized-action.js.map +1 -1
  35. package/dist/own-server-identity.d.ts +123 -0
  36. package/dist/own-server-identity.d.ts.map +1 -0
  37. package/dist/own-server-identity.js +1052 -0
  38. package/dist/own-server-identity.js.map +1 -0
  39. package/dist/own-tool.d.ts +7 -3
  40. package/dist/own-tool.d.ts.map +1 -1
  41. package/dist/own-tool.js +7 -3
  42. package/dist/own-tool.js.map +1 -1
  43. package/dist/redact.d.ts +23 -0
  44. package/dist/redact.d.ts.map +1 -1
  45. package/dist/redact.js +181 -8
  46. package/dist/redact.js.map +1 -1
  47. package/dist/seatbelt/classifier-pin.d.ts +15 -0
  48. package/dist/seatbelt/classifier-pin.d.ts.map +1 -0
  49. package/dist/seatbelt/classifier-pin.js +26 -0
  50. package/dist/seatbelt/classifier-pin.js.map +1 -0
  51. package/dist/seatbelt/guards.d.ts +10 -0
  52. package/dist/seatbelt/guards.d.ts.map +1 -0
  53. package/dist/seatbelt/guards.js +509 -0
  54. package/dist/seatbelt/guards.js.map +1 -0
  55. package/dist/seatbelt/hook.d.ts +72 -0
  56. package/dist/seatbelt/hook.d.ts.map +1 -0
  57. package/dist/seatbelt/hook.js +362 -0
  58. package/dist/seatbelt/hook.js.map +1 -0
  59. package/dist/seatbelt/longopts.d.ts +68 -0
  60. package/dist/seatbelt/longopts.d.ts.map +1 -0
  61. package/dist/seatbelt/longopts.js +377 -0
  62. package/dist/seatbelt/longopts.js.map +1 -0
  63. package/dist/seatbelt/mapper.d.ts +83 -0
  64. package/dist/seatbelt/mapper.d.ts.map +1 -0
  65. package/dist/seatbelt/mapper.js +10248 -0
  66. package/dist/seatbelt/mapper.js.map +1 -0
  67. package/dist/seatbelt/record.d.ts +94 -0
  68. package/dist/seatbelt/record.d.ts.map +1 -0
  69. package/dist/seatbelt/record.js +776 -0
  70. package/dist/seatbelt/record.js.map +1 -0
  71. package/dist/seatbelt/tables.d.ts +82 -0
  72. package/dist/seatbelt/tables.d.ts.map +1 -0
  73. package/dist/seatbelt/tables.js +359 -0
  74. package/dist/seatbelt/tables.js.map +1 -0
  75. package/dist/seatbelt-deploy.d.ts +100 -0
  76. package/dist/seatbelt-deploy.d.ts.map +1 -0
  77. package/dist/seatbelt-deploy.js +393 -0
  78. package/dist/seatbelt-deploy.js.map +1 -0
  79. package/dist/seatbelt-fs.d.ts +30 -0
  80. package/dist/seatbelt-fs.d.ts.map +1 -0
  81. package/dist/seatbelt-fs.js +94 -0
  82. package/dist/seatbelt-fs.js.map +1 -0
  83. package/dist/seatbelt-git.d.ts +212 -0
  84. package/dist/seatbelt-git.d.ts.map +1 -0
  85. package/dist/seatbelt-git.js +844 -0
  86. package/dist/seatbelt-git.js.map +1 -0
  87. package/dist/seatbelt-mode.d.ts +77 -0
  88. package/dist/seatbelt-mode.d.ts.map +1 -0
  89. package/dist/seatbelt-mode.js +496 -0
  90. package/dist/seatbelt-mode.js.map +1 -0
  91. package/dist/seatbelt-path.d.ts +123 -0
  92. package/dist/seatbelt-path.d.ts.map +1 -0
  93. package/dist/seatbelt-path.js +482 -0
  94. package/dist/seatbelt-path.js.map +1 -0
  95. package/dist/seatbelt-scripts.d.ts +109 -0
  96. package/dist/seatbelt-scripts.d.ts.map +1 -0
  97. package/dist/seatbelt-scripts.js +1060 -0
  98. package/dist/seatbelt-scripts.js.map +1 -0
  99. package/dist/tool-catalog.js +2 -2
  100. package/dist/tool-catalog.js.map +1 -1
  101. package/dist/types.d.ts +2 -1
  102. package/dist/types.d.ts.map +1 -1
  103. package/package.json +2 -1
  104. package/server.json +3 -3
  105. package/vendor/classifier/MANIFEST.json +25 -0
  106. package/vendor/classifier/classifier.js +1356 -0
  107. package/vendor/classifier/policy-baseline.js +187 -0
  108. package/vendor/classifier/redact.js +59 -0
  109. package/vendor/classifier/shell-parse.js +455 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seatbelt-mode.js","sourceRoot":"","sources":["../src/seatbelt-mode.ts"],"names":[],"mappings":";;;AAyGA,8BAUC;AAiJD,wCAoBC;AAuDD,kDAsFC;AA6BD,8DAsDC;AAxfD,qCAAmC;AACnC,+BAAyC;AACzC,+CAAgE;AAChE,mDAA2C;AAoB9B,QAAA,gBAAgB,GAAG;IAC9B,UAAU;IACV,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,sBAAsB;IACtB,WAAW;IACX,mBAAmB;IACnB,qBAAqB;IACrB,YAAY;IACZ,uHAAuH;IACvH,eAAe;CACP,CAAC;AA2CX,qGAAqG;AACxF,QAAA,iBAAiB,GAAG;IAC/B,uBAAuB;IACvB,mBAAmB;IACnB,oBAAoB;IACpB,uBAAuB;IACvB,8BAA8B;IAC9B,yBAAyB;IACzB,6BAA6B;IAC7B,oBAAoB;CACrB,CAAC;AAEF;;;;GAIG;AACU,QAAA,gBAAgB,GAAG,CAAC,uBAAuB,EAAE,cAAc,CAAC,CAAC;AAC1E,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEhC,wGAAwG;AACxG,MAAM,aAAa,GAAG,CAAC,gBAAgB,EAAE,wBAAwB,EAAE,eAAe,EAAE,sBAAsB,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,mBAAmB,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,iBAAiB,EAAE,GAAG,wBAAgB,EAAE,QAAQ,CAAC,CAAC;AAE/Q,MAAM,qBAAqB,GAAG,IAAI,GAAG,IAAI,CAAC;AAC1C,MAAM,aAAa,GAAG,wCAAwC,CAAC;AAE/D,0GAA0G;AAC1G,SAAgB,SAAS,CAAC,IAAc;IACtC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YACrB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAC5B,CAAC,IAAI,CAAC,CAAC;QACT,CAAC;aAAM,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,WAAW,CAAC,IAAc;IACjC,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,WAAW,IAAI,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC;AACjF,CAAC;AAED,SAAS,MAAM,CAAC,EAAc,EAAE,IAAY;IAC1C,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,KAAK,CAAC,CAAgB,EAAE,CAAgB;IAC/C,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACzD,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACzD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,UAAU,CAAC,EAAc,EAAE,GAAW;IAC7C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,CAAC,KAAK;YAAE,OAAO,QAAQ,CAAC;QAC5B,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK;YAAE,OAAO,SAAS,CAAC;QAC3C,OAAO,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC7F,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,EAAc,EAAE,IAAY,EAAE,YAAY,GAAG,KAAK;IACzE,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,KAAK;YAAE,OAAO,QAAQ,CAAC;QAC5B,IAAI,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK;YAAE,OAAO,QAAQ,CAAC;QAC1D,IAAI,MAAM,GAAG,IAAI,CAAC;QAClB,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,IAAA,wBAAQ,EAAC,EAAE,EAAE,IAAI,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;YACvD,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,IAAI,CAAC,IAAI,CAAC,MAAM;gBAAE,OAAO,SAAS,CAAC;YACjE,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC;QACrB,CAAC;QACD,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;QACxD,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,SAAS,CAAC;QACpC,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,EAAc,EAAE,GAAW;IAC/C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAA,wBAAQ,EAAC,EAAE,EAAE,GAAG,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU;YAAE,OAAO,SAAS,CAAC;QACjD,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,QAAQ,CAAC;QAClC,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK;YAAE,OAAO,QAAQ,CAAC;QAC5B,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK;YAAE,OAAO,SAAS,CAAC;QAC3C,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,KAAK,CAAC,MAAM,GAAG,oBAAoB;YAAE,OAAO,SAAS,CAAC;QAC1D,IAAI,KAAK,GAAkB,QAAQ,CAAC;QACpC,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,eAAe,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;QAClG,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,SAAS,eAAe,CAAC,EAAc,EAAE,GAAW,EAAE,GAAkB,EAAE,UAA+B;IACvG,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAA,wBAAQ,EAAC,EAAE,EAAE,GAAG,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU;YAAE,OAAO,SAAS,CAAC;QACjD,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,QAAQ,CAAC;QAClC,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK;YAAE,OAAO,QAAQ,CAAC;QAC5B,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK;YAAE,OAAO,SAAS,CAAC;QAC3C,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG;YAAE,OAAO,SAAS,CAAC;QACxD,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QACjD,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,IAAI,GAAG,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,GAAG,IAAI,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ;gBAAE,OAAO,SAAS,CAAC;YACzF,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;YACzB,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG;gBAAE,OAAO,SAAS,CAAC;QAC1D,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,oBAAoB,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAC7C,yFAAyF;AACzF,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;AAElE,uFAAuF;AACvF,SAAS,cAAc,CAAC,EAAc,EAAE,IAAY;IAClD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAClG,OAAO,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,4HAA4H;AAC5H,SAAS,oBAAoB,CAAC,IAAY;IACxC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrD,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACzF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IACnH,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACjD,CAAC;AAED,4IAA4I;AAC5I,SAAS,OAAO,CAAC,IAAY,EAAE,MAAc;IAC3C,MAAM,GAAG,GAAe,EAAE,CAAC;IAC3B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACpC,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,SAAS;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QACzI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,cAAc,CAAC,EAAc,EAAE,GAAkB;IAC/D,IAAI,GAAG,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACpE,MAAM,GAAG,GAAG,cAAc,CAAC,EAAE,EAAE,oBAAoB,CAAC,CAAC;IACrD,IAAI,GAAG,KAAK,IAAI,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5D,MAAM,UAAU,GAAG,cAAc,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,cAAc,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;IACnD,IAAI,UAAU,KAAK,IAAI,IAAI,SAAS,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC3D,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IACpC,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACnD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;IAC/D,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAClC,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvB,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9B,IAAI,CAAC,IAAI,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACtF,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;IAClE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACxF,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AACjE,CAAC;AAED,6EAA6E;AAC7E,8EAA8E;AAC9E,8FAA8F;AAC9F,SAAS,cAAc,CAAC,EAAc,EAAE,GAAW,EAAE,GAAkB;IACrE,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,CAAC,KAAK;YAAE,OAAO,QAAQ,CAAC;QAC5B,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK;YAAE,OAAO,SAAS,CAAC;QAC3C,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG;YAAE,OAAO,SAAS,CAAC;QACxD,sEAAsE;QACtE,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QACjD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,EAAc,EAAE,IAAY,EAAE,GAAkB,EAAE,UAA+B;IAClG,MAAM,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC;IACjC,IAAI,KAAK,GAAkB,QAAQ,CAAC;IACpC,KAAK,MAAM,IAAI,IAAI,yBAAiB;QAAE,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,eAAe,CAAC,EAAE,EAAE,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;IACnG,KAAK,MAAM,GAAG,IAAI,wBAAgB;QAAE,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,YAAY,CAAC,EAAE,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;IAC7F,IAAI,IAAI,GAAG,eAAe,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;IACtD,KAAK,MAAM,GAAG,IAAI,aAAa;QAAE,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC;IAC5G,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,MAAM,MAAM,CAAC;QACrC,cAAc,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,MAAM,YAAY,CAAC;QACjD,cAAc,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,MAAM,sBAAsB,CAAC;QAC3D,cAAc,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,MAAM,UAAU,CAAC;QAC/C,8EAA8E;QAC9E,yEAAyE;QACzE,oBAAoB,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,MAAM,4BAA4B,CAAC;QACvE,SAAS,EAAE,UAAU,CAAC,EAAE,EAAE,GAAG,MAAM,QAAQ,CAAC;QAC5C,iBAAiB,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,MAAM,qBAAqB,CAAC;QAC7D,mBAAmB,EAAE,KAAK;QAC1B,UAAU,EAAE,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC;QAC3C,aAAa,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;KACrD,CAAC;AACJ,CAAC;AAED,2GAA2G;AAC3G,SAAS,WAAW,CAAC,EAAc,EAAE,KAAgC;IACnE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACvI,MAAM,IAAI,GAAG,IAAA,wBAAQ,EAAC,EAAE,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,sEAAsE;IACtE,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IACjF,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAgB,mBAAmB,CAAC,KAAwB;IAC1D,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;IACvD,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,wBAAgB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,CAA2C,CAAC;IAC5H,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC;QAAE,QAAQ,CAAC,mBAAmB,GAAG,SAAS,CAAC;IAEtE,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,UAAU,GAAG,CAAC,GAAG,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACxF,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,IAAI,KAAK,CAAC,UAAU,KAAK,IAAI,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpD,WAAW,GAAG,IAAI,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC/B,CAAC;IACD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QAC9C,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,WAAW,GAAG,IAAI,CAAC;YACnB,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAC9B,SAAS;QACX,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,WAAW,GAAG,IAAI,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAChC,CAAC;IACD,2EAA2E;IAC3E,kEAAkE;IAClE,MAAM,UAAU,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IAC9B,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAC1C,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,WAAW,GAAG,IAAI,CAAC;YACnB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YAC9E,SAAS;QACX,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,WAAW,GAAG,IAAI,CAAC;YACnB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACxE,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxD,CAAC;IACD,0FAA0F;IAC1F,IAAI,eAA0C,CAAC;IAC/C,MAAM,UAAU,GAAG,GAAkB,EAAE;QACrC,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC;YAChC,IAAI,KAAK,GAAY,IAAI,CAAC;YAC1B,IAAI,CAAC;gBACH,KAAK,GAAG,OAAO,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;YAC3D,CAAC;YAAC,MAAM,CAAC;gBACP,KAAK,GAAG,IAAI,CAAC;YACf,CAAC;YACD,eAAe,GAAG,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QACrG,CAAC;QACD,OAAO,eAAe,CAAC;IACzB,CAAC,CAAC;IACF,uEAAuE;IACvE,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;QAC1D,KAAK,MAAM,EAAE,IAAI,wBAAgB;YAAE,QAAQ,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACpF,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,gBAAgB,IAAI,EAAE,EAAE,CAAC;QAChD,QAAQ,CAAC,mBAAmB,GAAG,KAAK,CAAC,QAAQ,CAAC,mBAAmB,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACzI,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,aAAa,IAAI,EAAE,EAAE,CAAC;QAC5C,QAAQ,CAAC,mBAAmB,GAAG,KAAK,CAAC,QAAQ,CAAC,mBAAmB,EAAE,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACpI,CAAC;IAED,MAAM,OAAO,GAAG,wBAAgB,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,SAAS,CAAC,CAAC;IAC5E,MAAM,OAAO,GAAG,wBAAgB,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,SAAS,CAAC,CAAC;IAC5E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACzD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAEzD,IAAI,IAAkB,CAAC;IACvB,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS;QAAE,IAAI,GAAG,SAAS,CAAC;SACzC,IAAI,KAAK,CAAC,GAAG,KAAK,UAAU,EAAE,CAAC;QAClC,IAAI,GAAG,gBAAgB,CAAC;QACxB,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC/B,CAAC;SAAM,IAAI,WAAW,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,IAAI,GAAG,gBAAgB,CAAC;SACvF,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACtB,IAAI,GAAG,gBAAgB,CAAC;QACxB,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC;;QAAM,IAAI,GAAG,UAAU,CAAC;IACzB,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AAC5C,CAAC;AAED,6IAA6I;AAC7I,MAAM,aAAa,GAAG,CAAC,gBAAgB,EAAE,YAAY,EAAE,iBAAiB,EAAE,mBAAmB,CAAC,CAAC;AAC/F,2EAA2E;AAC3E,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AAC/C,wGAAwG;AACxG,MAAM,cAAc,GAA6B;IAC/C,UAAU,EAAE,CAAC,YAAY,EAAE,aAAa,CAAC;IACzC,iBAAiB,EAAE,CAAC,eAAe,EAAE,qBAAqB,CAAC;IAC3D,+BAA+B,EAAE,CAAC,EAAE,CAAC;CACtC,CAAC;AACF,MAAM,aAAa,GAA2B,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;AACxD,QAAA,cAAc,GAAG,CAAC,GAAG,aAAa,EAAE,wBAAwB,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;AAE7J,SAAS,mBAAmB;IAC1B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAA,kBAAQ,GAAE,CAAC,OAAO,CAAC;QAChC,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAgB,yBAAyB,CAAC,UAStC,EAAE;IACJ,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACvC,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,IAAI,IAAA,4BAAc,GAAE,CAAC;IAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;IACjG,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,OAAO,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;IACvH,wEAAwE;IACxE,uEAAuE;IACvE,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;QACxB,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;IACtD,CAAC;IACD,MAAM,MAAM,GAAG,GAAG,CAAC,sBAAsB,KAAK,GAAG,CAAC;IAClD,MAAM,KAAK,GAAG,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACxE,IAAI,GAAG,GAAa,MAAM,CAAC;IAC3B,IAAI,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,UAAU;QAAE,GAAG,GAAG,SAAS,CAAC;IAChE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,GAAG,KAAK,SAAS;YAAE,MAAM;QAC7B,MAAM,IAAI,GAAG,WAAW,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,IAAI,IAAA,sBAAgB,EAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM;YAAE,GAAG,GAAG,SAAS,CAAC;IAC/F,CAAC;IACD,IAAI,GAAG,KAAK,SAAS,IAAI,OAAO,CAAC,WAAW;QAAE,GAAG,GAAG,UAAU,CAAC;IAC/D,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;QACxB,4EAA4E;QAC5E,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,EAAE;YAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtE,CAAC;IACD,MAAM,gBAAgB,GAAa,EAAE,CAAC;IACtC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;QAC3D,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;QACxB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,SAAS;QAC/D,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACzG,CAAC;IACD,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QACxD,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;QACxB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,aAAa,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IAClH,CAAC;IACD,+GAA+G;IAC/G,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU;QACtE,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACxE,OAAO,mBAAmB,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,CAAC;AAChI,CAAC"}
@@ -0,0 +1,123 @@
1
+ import type { SeatbeltFs } from './seatbelt-fs';
2
+ export declare const MAX_SYMLINK_HOPS = 40;
3
+ export type RealPathResult = {
4
+ status: 'resolved';
5
+ path: string;
6
+ exists: boolean;
7
+ } | {
8
+ status: 'unknown';
9
+ reason: 'not_absolute' | 'loop' | 'unreadable' | 'proc_handle';
10
+ };
11
+ /**
12
+ * realpath of the longest existing prefix, with the remainder appended
13
+ * lexically. followFinal=false leaves a final symlink unresolved (rm -r on a
14
+ * link removes the link, not its target).
15
+ */
16
+ export declare function realPath(fs: SeatbeltFs, input: string, options?: {
17
+ followFinal?: boolean;
18
+ }): RealPathResult;
19
+ /** Comparison key: case-folded (and NFC-normalised) on case-insensitive volumes. */
20
+ export declare function pathKey(fs: SeatbeltFs, value: string): string;
21
+ /** True when child is root itself or below it. */
22
+ export declare function isWithinOrEqual(fs: SeatbeltFs, root: string, child: string): boolean;
23
+ export interface PathContext {
24
+ /** Trusted home: passwd or the hook's --home value, never $HOME from the agent's environment. */
25
+ home: string | null;
26
+ /** The event's cwd (absolute), or null when the harness gave none. */
27
+ cwd: string | null;
28
+ /**
29
+ * Shell variables whose value is known when this command's words are
30
+ * expanded: set by an earlier, unconditional statement (`DIR=x; rm -rf
31
+ * "$DIR"`, `DIR=x && rm -rf "$DIR"`). Bash semantics: a prefix assignment
32
+ * (`DIR=x rm -rf "$DIR"`) only goes to the command's environment and is NOT
33
+ * seen by its own argument expansion, which uses the shell's prior value.
34
+ * Never put prefix assignments here; a name not listed is unknown. Values
35
+ * are what the shell holds: tilde-expanded at assignment (a value that still
36
+ * starts with `~` is unknown). A `PWD` set here that is not `cwd` makes
37
+ * `$PWD` and `~+` unknown; `~-`, `~N` and `$OLDPWD` are unknown unless set.
38
+ */
39
+ variables?: Record<string, string>;
40
+ /**
41
+ * The command's own prefix assignments. Accepted only so a caller can pass
42
+ * them without them leaking into expansion: they are never substituted, and
43
+ * a name assigned here and not in `variables` stays unknown.
44
+ */
45
+ prefixAssignments?: Record<string, string>;
46
+ /**
47
+ * The $HOME the agent's shell expands for `~` and `$HOME`. When given and
48
+ * not exactly `home`, both expansions are unknown. (U4 gives
49
+ * `claimed_no_key` whenever env HOME is not the trusted home.)
50
+ */
51
+ shellHome?: string | null;
52
+ /** passwd lookup for ~user. */
53
+ userHome?: (user: string) => string | null;
54
+ }
55
+ export type ExpandedOperand = {
56
+ kind: 'path';
57
+ path: string;
58
+ trailingFollow: boolean;
59
+ nonAscii: boolean;
60
+ } | {
61
+ kind: 'glob';
62
+ path: string;
63
+ staticPrefix: string;
64
+ trailingFollow: boolean;
65
+ nonAscii: boolean;
66
+ } | {
67
+ kind: 'dynamic';
68
+ reason: 'empty' | 'substitution' | 'brace' | 'variable' | 'tilde' | 'user_home' | 'no_home' | 'no_cwd' | 'glob_parent' | 'backslash' | 'pattern';
69
+ };
70
+ /**
71
+ * Expands one path operand the way the shell would, using only trusted values.
72
+ * `raw` is the word with quotes removed; any `$` left in it is treated as an
73
+ * expansion, so a literal `$` can only make the answer stricter.
74
+ */
75
+ export declare function expandPathOperand(raw: string, context: PathContext): ExpandedOperand;
76
+ export type ResolvedOperand = {
77
+ kind: 'path';
78
+ real: string;
79
+ exists: boolean;
80
+ nonAscii: boolean;
81
+ }
82
+ /**
83
+ * matches: the real path of every name the glob can reach (followed through
84
+ * links where the shell follows them). parents: the real dirs whose
85
+ * children a final wildcard deletes, judged like a static prefix.
86
+ */
87
+ | {
88
+ kind: 'glob';
89
+ staticReal: string;
90
+ matches: string[];
91
+ parents: string[];
92
+ nonAscii: boolean;
93
+ } | {
94
+ kind: 'unknown';
95
+ reason: string;
96
+ };
97
+ /** Bound on directory entries a glob may enumerate; over it the operand is unknown. */
98
+ export declare const MAX_GLOB_ENTRIES = 1024;
99
+ /**
100
+ * Expands and realpaths one operand. use='read' follows a final symlink (cat
101
+ * reads the target); use='delete' follows it only after a trailing '/' or '/.'.
102
+ */
103
+ export declare function resolveOperand(fs: SeatbeltFs, context: PathContext, raw: string, use: 'read' | 'delete'): ResolvedOperand;
104
+ export interface Workspace {
105
+ /** False when the event gave no usable cwd: every recursive delete target is then unknown (A19). */
106
+ known: boolean;
107
+ /** Real project roots (git toplevel of the event cwd, or the cwd). Children only. */
108
+ roots: string[];
109
+ /** Real temp roots (/tmp, /var/tmp, a system TMPDIR). Children only. */
110
+ tempRoots: string[];
111
+ home: string | null;
112
+ reason?: 'no_cwd' | 'cwd_unresolved' | 'home_or_ancestor';
113
+ }
114
+ /** WS from the event cwd (fixes F3: never the hook process's cwd). */
115
+ export declare function resolveWorkspace(fs: SeatbeltFs, input: {
116
+ eventCwd: unknown;
117
+ home: string | null;
118
+ tmpdir?: string | null;
119
+ }): Workspace;
120
+ export type DeleteTargetClass = 'in_workspace' | 'outside_workspace' | 'workspace_root' | 'home' | 'root' | 'unknown';
121
+ /** Where a recursive-delete target falls (S5). Only 'in_workspace' is safe. A glob is the worst of its static prefix and every reachable match. */
122
+ export declare function classifyDeleteTarget(fs: SeatbeltFs, workspace: Workspace, target: ResolvedOperand): DeleteTargetClass;
123
+ //# sourceMappingURL=seatbelt-path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seatbelt-path.d.ts","sourceRoot":"","sources":["../src/seatbelt-path.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,482 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MAX_GLOB_ENTRIES = exports.MAX_SYMLINK_HOPS = void 0;
4
+ exports.realPath = realPath;
5
+ exports.pathKey = pathKey;
6
+ exports.isWithinOrEqual = isWithinOrEqual;
7
+ exports.expandPathOperand = expandPathOperand;
8
+ exports.resolveOperand = resolveOperand;
9
+ exports.resolveWorkspace = resolveWorkspace;
10
+ exports.classifyDeleteTarget = classifyDeleteTarget;
11
+ // Seatbelt path resolution (spec §1.2 S4/S5, abuse rows A13/A19). Every
12
+ // answer that cannot be made exactly is 'dynamic' or 'unknown'; the category
13
+ // mapper treats those as the dangerous value (§2.1 rule 2).
14
+ exports.MAX_SYMLINK_HOPS = 40;
15
+ function parts(value) {
16
+ return value.split('/').filter((part) => part !== '' && part !== '.');
17
+ }
18
+ // /proc/<pid>/root names the root directory; the other per-process handles
19
+ // (cwd, fd, exe ...) point at the hook process, not the agent's shell.
20
+ const PROC_HANDLE = new Set(['cwd', 'fd', 'fdinfo', 'exe', 'map_files', 'task', 'environ']);
21
+ /**
22
+ * realpath of the longest existing prefix, with the remainder appended
23
+ * lexically. followFinal=false leaves a final symlink unresolved (rm -r on a
24
+ * link removes the link, not its target).
25
+ */
26
+ function realPath(fs, input, options = {}) {
27
+ if (!input.startsWith('/'))
28
+ return { status: 'unknown', reason: 'not_absolute' };
29
+ const follow = options.followFinal !== false;
30
+ let pending = parts(input);
31
+ let current = [];
32
+ let exists = true;
33
+ let hops = 0;
34
+ while (pending.length > 0) {
35
+ const name = pending.shift();
36
+ if (name === '..') {
37
+ current.pop();
38
+ continue;
39
+ }
40
+ if (current.length === 2 && current[0] === 'proc') {
41
+ if (name === 'root') {
42
+ current = [];
43
+ exists = true;
44
+ continue;
45
+ }
46
+ if (PROC_HANDLE.has(name))
47
+ return { status: 'unknown', reason: 'proc_handle' };
48
+ }
49
+ if (current.length === 1 && current[0] === 'dev' && name === 'fd')
50
+ return { status: 'unknown', reason: 'proc_handle' };
51
+ if (!exists) {
52
+ current.push(name);
53
+ continue;
54
+ }
55
+ const candidate = `/${[...current, name].join('/')}`;
56
+ let entry;
57
+ try {
58
+ entry = fs.lstat(candidate);
59
+ }
60
+ catch {
61
+ return { status: 'unknown', reason: 'unreadable' };
62
+ }
63
+ if (!entry) {
64
+ exists = false;
65
+ current.push(name);
66
+ continue;
67
+ }
68
+ const final = pending.length === 0;
69
+ if (entry.type === 'symlink' && (!final || follow)) {
70
+ hops += 1;
71
+ if (hops > exports.MAX_SYMLINK_HOPS)
72
+ return { status: 'unknown', reason: 'loop' };
73
+ let target;
74
+ try {
75
+ target = fs.readlink(candidate);
76
+ }
77
+ catch {
78
+ return { status: 'unknown', reason: 'unreadable' };
79
+ }
80
+ if (target.startsWith('/'))
81
+ current = [];
82
+ pending = [...parts(target), ...pending];
83
+ continue;
84
+ }
85
+ if (entry.type !== 'dir' && !final)
86
+ exists = false;
87
+ current.push(name);
88
+ }
89
+ return { status: 'resolved', path: `/${current.join('/')}`, exists };
90
+ }
91
+ /** Comparison key: case-folded (and NFC-normalised) on case-insensitive volumes. */
92
+ function pathKey(fs, value) {
93
+ return fs.caseInsensitive(value) ? value.normalize('NFC').toLowerCase() : value;
94
+ }
95
+ /** True when child is root itself or below it. */
96
+ function isWithinOrEqual(fs, root, child) {
97
+ const r = pathKey(fs, root);
98
+ const c = pathKey(fs, child);
99
+ if (r === '/')
100
+ return c.startsWith('/');
101
+ return c === r || c.startsWith(`${r}/`);
102
+ }
103
+ /**
104
+ * Folded comparison used for the danger checks (root, home, a workspace root
105
+ * or its ancestor). It folds on every volume, so an unproven case-sensitivity
106
+ * can only make a target look more dangerous, never less.
107
+ */
108
+ function dangerWithinOrEqual(root, child) {
109
+ const fold = (v) => v.normalize('NFC').toLowerCase();
110
+ const r = fold(root);
111
+ const c = fold(child);
112
+ if (r === '/')
113
+ return c.startsWith('/');
114
+ return c === r || c.startsWith(`${r}/`);
115
+ }
116
+ function isStrictlyWithin(fs, root, child) {
117
+ return isWithinOrEqual(fs, root, child) && pathKey(fs, root) !== pathKey(fs, child);
118
+ }
119
+ const VARIABLE = /\$(?:\{([^}]*)\}|([A-Za-z_][A-Za-z0-9_]*)|([0-9@*#?$!-]))/g;
120
+ /**
121
+ * Expands one path operand the way the shell would, using only trusted values.
122
+ * `raw` is the word with quotes removed; any `$` left in it is treated as an
123
+ * expansion, so a literal `$` can only make the answer stricter.
124
+ */
125
+ function expandPathOperand(raw, context) {
126
+ let value = String(raw ?? '');
127
+ if (value === '')
128
+ return { kind: 'dynamic', reason: 'empty' };
129
+ // A `\` left after quote removal is a literal name character on POSIX and a
130
+ // separator on Windows: either reading can move the target, so it is unknown.
131
+ if (value.includes('\\'))
132
+ return { kind: 'dynamic', reason: 'backslash' };
133
+ // The shell's $HOME, when known to differ from the trusted home, makes ~ and $HOME unknown.
134
+ // So does an earlier statement that set HOME (or PWD) in the shell.
135
+ const setEarlier = (name) => context.variables !== undefined && Object.prototype.hasOwnProperty.call(context.variables, name);
136
+ const homeForShell = (context.shellHome !== undefined && context.shellHome !== context.home) || (setEarlier('HOME') && context.variables?.HOME !== context.home) ? null : context.home;
137
+ const cwdForShell = setEarlier('PWD') && context.variables?.PWD !== context.cwd ? null : context.cwd;
138
+ // Judged on the operand and substituted values only: a non-ASCII home or cwd is not the agent's choice.
139
+ let nonAscii = /[^\x20-\x7e]/.test(value);
140
+ if (/\$\(|`|<\(|>\(/.test(value))
141
+ return { kind: 'dynamic', reason: 'substitution' };
142
+ if (value.includes('}') && /\{[^{}]*(?:,|\.\.)/.test(value))
143
+ return { kind: 'dynamic', reason: 'brace' };
144
+ // Patterns this resolver does not enumerate: bash globstar/extglob and zsh's
145
+ // default `**`, `(a|b)`, `<1-9>` and qualifiers, plus extendedglob `^`/`#`.
146
+ if (/\*\*|[()|<>^#]/.test(value))
147
+ return { kind: 'dynamic', reason: 'pattern' };
148
+ if (value.startsWith('~')) {
149
+ const slash = value.indexOf('/');
150
+ const prefix = slash < 0 ? value.slice(1) : value.slice(1, slash);
151
+ const rest = slash < 0 ? '' : value.slice(slash);
152
+ let base;
153
+ if (prefix === '') {
154
+ if (!homeForShell)
155
+ return { kind: 'dynamic', reason: 'no_home' };
156
+ base = homeForShell;
157
+ }
158
+ else if (prefix === '+') {
159
+ // `~+` is the shell's $PWD, which an earlier `PWD=…` statement may have changed.
160
+ if (!cwdForShell)
161
+ return { kind: 'dynamic', reason: 'no_cwd' };
162
+ base = cwdForShell;
163
+ }
164
+ else if (/^[0-9]+$/.test(prefix)) {
165
+ // `~N` is the Nth entry of the directory stack, which this resolver does not track (`~-` and `~+N`/`~-N` fall to the branch below).
166
+ return { kind: 'dynamic', reason: 'tilde' };
167
+ }
168
+ else if (/^[A-Za-z0-9._][A-Za-z0-9._-]*$/.test(prefix)) {
169
+ base = context.userHome ? context.userHome(prefix) : null;
170
+ if (!base)
171
+ return { kind: 'dynamic', reason: 'user_home' };
172
+ }
173
+ else {
174
+ return { kind: 'dynamic', reason: 'tilde' };
175
+ }
176
+ value = `${base}${rest}`;
177
+ }
178
+ let unresolved = null;
179
+ value = value.replace(VARIABLE, (_match, braced, plain) => {
180
+ const name = braced ?? plain;
181
+ if (name === undefined || !/^[A-Za-z_][A-Za-z0-9_]*$/.test(name)) {
182
+ unresolved = { kind: 'dynamic', reason: 'variable' };
183
+ return '';
184
+ }
185
+ if (name === 'HOME') {
186
+ if (!homeForShell)
187
+ unresolved = { kind: 'dynamic', reason: 'no_home' };
188
+ return homeForShell || '';
189
+ }
190
+ if (name === 'PWD') {
191
+ if (!cwdForShell)
192
+ unresolved = { kind: 'dynamic', reason: 'no_cwd' };
193
+ return cwdForShell || '';
194
+ }
195
+ // Only values set before this command count; prefixAssignments never do.
196
+ const assigned = context.variables && Object.prototype.hasOwnProperty.call(context.variables, name)
197
+ ? context.variables[name]
198
+ : undefined;
199
+ if (assigned === undefined)
200
+ unresolved = { kind: 'dynamic', reason: 'variable' };
201
+ // The shell tilde-expands an assignment's value when it is assigned: a value that still
202
+ // starts with `~` was not expanded by the caller, and bash never expands it later.
203
+ else if (assigned.startsWith('~'))
204
+ unresolved = { kind: 'dynamic', reason: 'tilde' };
205
+ else if (/[^\x20-\x7e]/.test(assigned))
206
+ nonAscii = true;
207
+ return assigned ?? '';
208
+ });
209
+ if (unresolved)
210
+ return unresolved;
211
+ // Any `$` left ($'..', $"..", a lone $) is an expansion this resolver does not model.
212
+ if (value.includes('$'))
213
+ return { kind: 'dynamic', reason: 'variable' };
214
+ if (value === '')
215
+ return { kind: 'dynamic', reason: 'empty' };
216
+ if (!value.startsWith('/')) {
217
+ if (!context.cwd || !context.cwd.startsWith('/'))
218
+ return { kind: 'dynamic', reason: 'no_cwd' };
219
+ value = `${context.cwd}/${value}`;
220
+ }
221
+ const trailingFollow = /\/\.?$/.test(value);
222
+ const normalized = `/${parts(value).join('/')}`;
223
+ if (/[*?[]/.test(normalized)) {
224
+ const segments = parts(normalized);
225
+ const firstGlob = segments.findIndex((part) => /[*?[]/.test(part));
226
+ // `..` after a wildcard climbs out of whatever the wildcard matched.
227
+ if (segments.slice(firstGlob).includes('..'))
228
+ return { kind: 'dynamic', reason: 'glob_parent' };
229
+ return { kind: 'glob', path: normalized, staticPrefix: `/${segments.slice(0, firstGlob).join('/')}`, trailingFollow, nonAscii };
230
+ }
231
+ return { kind: 'path', path: normalized, trailingFollow, nonAscii };
232
+ }
233
+ /**
234
+ * Whether a name can match one glob segment. `*` and `?` as in the shell; a
235
+ * bracket expression counts as any one character, and a leading dot is not
236
+ * special, so the answer is a superset of the shell's. Dynamic programming,
237
+ * linear in pattern × name: no backtracking blow-up.
238
+ */
239
+ function segmentMayMatch(pattern, name) {
240
+ const tokens = [];
241
+ for (let i = 0; i < pattern.length; i += 1) {
242
+ const ch = pattern[i];
243
+ if (ch === '[') {
244
+ // A bracket expression: an optional `!`/`^`, a leading `]` is a member, and
245
+ // `[:class:]`, `[.x.]`, `[=x=]` hold a `]` of their own.
246
+ let j = i + 1;
247
+ if (pattern[j] === '!' || pattern[j] === '^')
248
+ j += 1;
249
+ if (pattern[j] === ']')
250
+ j += 1;
251
+ let close = -1;
252
+ while (j < pattern.length) {
253
+ if (pattern[j] === '[' && (pattern[j + 1] === ':' || pattern[j + 1] === '.' || pattern[j + 1] === '=')) {
254
+ const end = pattern.indexOf(`${pattern[j + 1]}]`, j + 2);
255
+ if (end < 0)
256
+ break;
257
+ j = end + 2;
258
+ continue;
259
+ }
260
+ if (pattern[j] === ']') {
261
+ close = j;
262
+ break;
263
+ }
264
+ j += 1;
265
+ }
266
+ if (close < 0)
267
+ tokens.push('[');
268
+ else {
269
+ tokens.push('?');
270
+ i = close;
271
+ }
272
+ }
273
+ else if (ch === '*') {
274
+ if (tokens[tokens.length - 1] !== '*')
275
+ tokens.push('*');
276
+ }
277
+ else
278
+ tokens.push(ch === '?' ? '?' : `=${ch}`);
279
+ }
280
+ let row = new Array(name.length + 1).fill(false);
281
+ row[0] = true;
282
+ for (const token of tokens) {
283
+ const next = new Array(name.length + 1).fill(false);
284
+ if (token === '*') {
285
+ let any = false;
286
+ for (let j = 0; j <= name.length; j += 1) {
287
+ any = any || row[j];
288
+ next[j] = any;
289
+ }
290
+ }
291
+ else {
292
+ for (let j = 1; j <= name.length; j += 1) {
293
+ const ch = name[j - 1];
294
+ next[j] = row[j - 1] && (token === '?' || (token === '[' ? ch === '[' : ch === token.slice(1)));
295
+ }
296
+ }
297
+ row = next;
298
+ }
299
+ return row[name.length];
300
+ }
301
+ /** Bound on directory entries a glob may enumerate; over it the operand is unknown. */
302
+ exports.MAX_GLOB_ENTRIES = 1024;
303
+ /**
304
+ * The real target of every path a glob can name, as far as the filesystem
305
+ * shows it. Each wildcard segment is matched against every entry of the
306
+ * directory (a superset of what the shell matches, dotfiles included, so it
307
+ * can only add targets). A name the shell resolves through a link (a further
308
+ * segment, a trailing `/` or `/.`, or use='read') is realpath-ed; a final name
309
+ * without one is the link itself. Null when it cannot be enumerated for certain.
310
+ */
311
+ function globTargets(fs, path, trailingFollow, use) {
312
+ const segments = parts(path);
313
+ let current = ['/'];
314
+ let budget = exports.MAX_GLOB_ENTRIES;
315
+ const out = [];
316
+ const parents = [];
317
+ for (let i = 0; i < segments.length; i += 1) {
318
+ const segment = segments[i];
319
+ const final = i === segments.length - 1;
320
+ const next = [];
321
+ for (const dir of current) {
322
+ let names;
323
+ if (/[*?[]/.test(segment)) {
324
+ const real = realPath(fs, dir, { followFinal: true });
325
+ if (real.status !== 'resolved')
326
+ return null;
327
+ if (!real.exists)
328
+ continue;
329
+ let entry;
330
+ try {
331
+ entry = fs.lstat(real.path);
332
+ }
333
+ catch {
334
+ return null;
335
+ }
336
+ if (!entry || entry.type !== 'dir')
337
+ continue;
338
+ if (final)
339
+ parents.push(real.path);
340
+ try {
341
+ names = fs.readdir(real.path);
342
+ }
343
+ catch {
344
+ return null;
345
+ }
346
+ budget -= names.length;
347
+ if (budget < 0)
348
+ return null;
349
+ names = names.filter((name) => segmentMayMatch(segment, name));
350
+ // bash before 5.2 lets a pattern with a leading `.` match `.` and `..`.
351
+ if (segment.startsWith('.'))
352
+ for (const dot of ['.', '..'])
353
+ if (segmentMayMatch(segment, dot))
354
+ names.push(dot);
355
+ }
356
+ else
357
+ names = [segment];
358
+ for (const name of names)
359
+ next.push(dir === '/' ? `/${name}` : `${dir}/${name}`);
360
+ }
361
+ current = next;
362
+ if (final) {
363
+ for (const candidate of current) {
364
+ const real = realPath(fs, candidate, { followFinal: use === 'read' || trailingFollow });
365
+ if (real.status !== 'resolved')
366
+ return null;
367
+ out.push(real.path);
368
+ }
369
+ }
370
+ }
371
+ return { matches: out, parents };
372
+ }
373
+ /**
374
+ * Expands and realpaths one operand. use='read' follows a final symlink (cat
375
+ * reads the target); use='delete' follows it only after a trailing '/' or '/.'.
376
+ */
377
+ function resolveOperand(fs, context, raw, use) {
378
+ const expanded = expandPathOperand(raw, context);
379
+ if (expanded.kind === 'dynamic')
380
+ return { kind: 'unknown', reason: expanded.reason };
381
+ if (expanded.kind === 'glob') {
382
+ const real = realPath(fs, expanded.staticPrefix, { followFinal: true });
383
+ if (real.status !== 'resolved')
384
+ return { kind: 'unknown', reason: real.reason };
385
+ const targets = globTargets(fs, expanded.path, expanded.trailingFollow, use);
386
+ if (targets === null)
387
+ return { kind: 'unknown', reason: 'glob_unresolved' };
388
+ return { kind: 'glob', staticReal: real.path, matches: targets.matches, parents: targets.parents, nonAscii: expanded.nonAscii };
389
+ }
390
+ const real = realPath(fs, expanded.path, { followFinal: use === 'read' || expanded.trailingFollow });
391
+ if (real.status !== 'resolved')
392
+ return { kind: 'unknown', reason: real.reason };
393
+ return { kind: 'path', real: real.path, exists: real.exists, nonAscii: expanded.nonAscii };
394
+ }
395
+ // TMPDIR comes from the environment, which may not widen the workspace
396
+ // (§2.1 rule 5): it is used only when its real path is under a system temp dir.
397
+ const SYSTEM_TEMP = ['/tmp', '/var/tmp', '/private/tmp', '/private/var/tmp', '/private/var/folders', '/var/folders'];
398
+ function realOrNull(fs, value) {
399
+ const real = realPath(fs, value, { followFinal: true });
400
+ return real.status === 'resolved' && real.exists ? real.path : null;
401
+ }
402
+ function gitToplevel(fs, start) {
403
+ let dir = start;
404
+ for (;;) {
405
+ let entry;
406
+ try {
407
+ entry = fs.lstat(dir === '/' ? '/.git' : `${dir}/.git`);
408
+ }
409
+ catch {
410
+ entry = null;
411
+ }
412
+ if (entry && (entry.type === 'dir' || entry.type === 'file'))
413
+ return dir;
414
+ if (dir === '/')
415
+ return null;
416
+ dir = dir.slice(0, dir.lastIndexOf('/')) || '/';
417
+ }
418
+ }
419
+ /** WS from the event cwd (fixes F3: never the hook process's cwd). */
420
+ function resolveWorkspace(fs, input) {
421
+ const realHome = input.home ? realOrNull(fs, input.home) || input.home : null;
422
+ const tempRoots = [];
423
+ for (const candidate of ['/tmp', '/var/tmp', input.tmpdir || '']) {
424
+ if (!candidate || !candidate.startsWith('/'))
425
+ continue;
426
+ const real = realOrNull(fs, candidate);
427
+ if (!real || !SYSTEM_TEMP.some((root) => isWithinOrEqual(fs, root, real)))
428
+ continue;
429
+ if (realHome && dangerWithinOrEqual(real, realHome))
430
+ continue;
431
+ if (!tempRoots.some((root) => pathKey(fs, root) === pathKey(fs, real)))
432
+ tempRoots.push(real);
433
+ }
434
+ const base = { tempRoots, home: realHome };
435
+ if (typeof input.eventCwd !== 'string' || !input.eventCwd.startsWith('/'))
436
+ return { known: false, roots: [], ...base, reason: 'no_cwd' };
437
+ const cwd = realPath(fs, input.eventCwd, { followFinal: true });
438
+ if (cwd.status !== 'resolved' || !cwd.exists)
439
+ return { known: false, roots: [], ...base, reason: 'cwd_unresolved' };
440
+ const dangerous = (dir) => dir === '/' || (realHome !== null && dangerWithinOrEqual(dir, realHome));
441
+ const top = gitToplevel(fs, cwd.path);
442
+ // A repo at $HOME (dotfiles) or a project dir that is really $HOME never makes home the workspace.
443
+ const root = top && !dangerous(top) ? top : cwd.path;
444
+ if (dangerous(root))
445
+ return { known: true, roots: [], ...base, reason: 'home_or_ancestor' };
446
+ return { known: true, roots: [root], ...base };
447
+ }
448
+ const DELETE_CLASS_ORDER = ['unknown', 'root', 'home', 'workspace_root', 'outside_workspace', 'in_workspace'];
449
+ /** Where a recursive-delete target falls (S5). Only 'in_workspace' is safe. A glob is the worst of its static prefix and every reachable match. */
450
+ function classifyDeleteTarget(fs, workspace, target) {
451
+ if (!workspace.known || target.kind === 'unknown' || target.nonAscii)
452
+ return 'unknown';
453
+ if (target.kind === 'glob') {
454
+ const classes = [classifyReal(fs, workspace, target.staticReal, true)];
455
+ for (const parent of target.parents)
456
+ classes.push(classifyReal(fs, workspace, parent, true));
457
+ for (const match of target.matches)
458
+ classes.push(classifyReal(fs, workspace, match, false));
459
+ return DELETE_CLASS_ORDER.find((c) => classes.includes(c));
460
+ }
461
+ return classifyReal(fs, workspace, target.real, false);
462
+ }
463
+ function classifyReal(fs, workspace, real, children) {
464
+ if (real === '/')
465
+ return 'root';
466
+ const home = workspace.home;
467
+ if (home && dangerWithinOrEqual(real, home))
468
+ return 'home';
469
+ for (const root of [...workspace.roots, ...workspace.tempRoots]) {
470
+ if (dangerWithinOrEqual(real, root))
471
+ return 'workspace_root';
472
+ }
473
+ // A glob deletes children of its static prefix; a path deletes itself.
474
+ const inside = (root) => (children ? isWithinOrEqual(fs, root, real) : isStrictlyWithin(fs, root, real));
475
+ if (workspace.roots.some(inside))
476
+ return 'in_workspace';
477
+ // Temp roots never cover anything inside home (a home under /tmp stays protected).
478
+ if (workspace.tempRoots.some(inside) && !(home && dangerWithinOrEqual(home, real)))
479
+ return 'in_workspace';
480
+ return 'outside_workspace';
481
+ }
482
+ //# sourceMappingURL=seatbelt-path.js.map