openplanr 2.2640.8 → 2.2640.9

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 (186) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/dashboard/.vite/manifest.json +1 -1
  3. package/dist/dashboard/assets/{index-COZ36pFn.js → index-D7R6tnlX.js} +2 -2
  4. package/dist/dashboard/assets/{index-COZ36pFn.js.map → index-D7R6tnlX.js.map} +1 -1
  5. package/dist/dashboard/dashboard-manifest.json +8 -8
  6. package/dist/dashboard/index.html +1 -1
  7. package/lib/host-packages/adapter-registry.json +5 -5
  8. package/lib/host-packages/capability-map.json +1 -1
  9. package/lib/host-packages/claude/.claude-plugin/marketplace.json +2 -2
  10. package/lib/host-packages/claude/openplanr/.claude-plugin/plugin.json +1 -1
  11. package/lib/host-packages/claude/openplanr/.openplanr-content.json +165 -33
  12. package/lib/host-packages/claude/openplanr/README.md +22 -1
  13. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-artifact-shell.mjs +3 -11
  14. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-chunked-workspace-client.mjs +555 -0
  15. package/lib/host-packages/claude/openplanr/runtime/design/scripts/{design-pako-esm.mjs → design-compression.mjs} +2 -1521
  16. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-document.mjs +133 -12
  17. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-encrypted-workspace-client.mjs +647 -0
  18. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-entities.mjs +17 -67
  19. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-handoff.mjs +14 -16
  20. package/lib/host-packages/claude/openplanr/runtime/design/scripts/{design-planr-home.mjs → design-loopback-server.mjs} +15 -36
  21. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-owner-custody.mjs +121 -0
  22. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-resource-pack.mjs +698 -0
  23. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-review.mjs +798 -796
  24. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-runtime-home.mjs +39 -0
  25. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-runtime-support-5cb7531bede8.mjs +24 -0
  26. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-share.mjs +138 -765
  27. package/lib/host-packages/claude/openplanr/runtime/design/scripts/{design-escape.mjs → design-shared-artifact-support-dependencies-design-support-protocol-contracts-3d9b1a86.mjs} +158 -156
  28. package/lib/host-packages/{openai/openplanr/runtime/design/scripts/design-artifact-sources.mjs → claude/openplanr/runtime/design/scripts/design-shared-artifact-support-protocol-contracts-ea2cd15e.mjs} +1 -1
  29. package/lib/host-packages/{openai/openplanr/runtime/design/scripts/design-bounded-json-data.mjs → claude/openplanr/runtime/design/scripts/design-shared-protocol-contracts-31a760fc.mjs} +241 -454
  30. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-shared-protocol-contracts-75a938cc.mjs +222 -0
  31. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-upload-spool.mjs +198 -0
  32. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design.mjs +12 -5
  33. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/01-module-runtime.js +18 -0
  34. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/02-artifact-review-ui.js +809 -0
  35. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/03-protocol-contracts.js +5193 -0
  36. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/04-compression.js +4175 -0
  37. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/05-artifact-sharing.js +65 -0
  38. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/06-artifact-review-ui.js +1755 -0
  39. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/07-artifact-sharing.js +62 -0
  40. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/08-artifact-review-ui.js +2600 -0
  41. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources.json +123 -0
  42. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/package.json +3 -3
  43. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/01-module-runtime.js +34 -0
  44. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/02-react.js +992 -0
  45. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/03-react-dom-client-fiber-foundations.js +2513 -0
  46. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/04-react-dom-client-reconciliation-hooks.js +1919 -0
  47. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/05-react-dom-client-render-phases.js +1759 -0
  48. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/06-react-dom-client-commit-effects.js +1551 -0
  49. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/07-react-dom-client-work-loop-scheduling.js +1121 -0
  50. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/08-react-dom-client-dom-events-properties-hydration.js +2183 -0
  51. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/09-react-dom-client-public-roots.js +705 -0
  52. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/10-react.js +27 -0
  53. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/11-artifact-review-ui.js +13 -0
  54. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/12-design-review-experience.js +3561 -0
  55. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/13-studio-shell.js +184 -0
  56. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/14-interface-primitives.js +5045 -0
  57. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/15-interface-primitives.js +1698 -0
  58. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/16-studio-shell.js +455 -0
  59. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/17-design-studio.js +1844 -0
  60. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources.json +257 -0
  61. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/protocol/package.json +1 -1
  62. package/lib/host-packages/claude/openplanr/runtime/plan/scripts/design-protocol-contracts.mjs +4966 -0
  63. package/lib/host-packages/claude/openplanr/runtime/plan/scripts/design.mjs +240 -5192
  64. package/lib/host-packages/claude/openplanr/runtime/plan/scripts/runtime/packages/protocol/package.json +1 -1
  65. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/backend-diagnostics.mjs +6 -2
  66. package/lib/host-packages/cursor/openplanr/.openplanr-content.json +164 -32
  67. package/lib/host-packages/cursor/openplanr/manifest.json +1 -1
  68. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/backend-diagnostics.mjs +6 -2
  69. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-artifact-shell.mjs +3 -11
  70. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-chunked-workspace-client.mjs +555 -0
  71. package/lib/host-packages/{openai/openplanr/runtime/design/scripts/design-pako-esm.mjs → cursor/openplanr/runtime/design/scripts/design-compression.mjs} +2 -1521
  72. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-document.mjs +133 -12
  73. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-encrypted-workspace-client.mjs +647 -0
  74. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-entities.mjs +17 -67
  75. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-handoff.mjs +14 -16
  76. package/lib/host-packages/{openai/openplanr/runtime/design/scripts/design-planr-home.mjs → cursor/openplanr/runtime/design/scripts/design-loopback-server.mjs} +15 -36
  77. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-owner-custody.mjs +121 -0
  78. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-resource-pack.mjs +698 -0
  79. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-review.mjs +798 -796
  80. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-runtime-home.mjs +39 -0
  81. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-runtime-support-5cb7531bede8.mjs +24 -0
  82. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-share.mjs +138 -765
  83. package/lib/host-packages/{openai/openplanr/runtime/design/scripts/design-escape.mjs → cursor/openplanr/runtime/design/scripts/design-shared-artifact-support-dependencies-design-support-protocol-contracts-3d9b1a86.mjs} +158 -156
  84. package/lib/host-packages/{claude/openplanr/runtime/design/scripts/design-artifact-sources.mjs → cursor/openplanr/runtime/design/scripts/design-shared-artifact-support-protocol-contracts-ea2cd15e.mjs} +1 -1
  85. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/{design-bounded-json-data.mjs → design-shared-protocol-contracts-31a760fc.mjs} +241 -454
  86. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-shared-protocol-contracts-75a938cc.mjs +222 -0
  87. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-upload-spool.mjs +198 -0
  88. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design.mjs +12 -5
  89. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/01-module-runtime.js +18 -0
  90. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/02-artifact-review-ui.js +809 -0
  91. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/03-protocol-contracts.js +5193 -0
  92. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/04-compression.js +4175 -0
  93. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/05-artifact-sharing.js +65 -0
  94. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/06-artifact-review-ui.js +1755 -0
  95. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/07-artifact-sharing.js +62 -0
  96. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/08-artifact-review-ui.js +2600 -0
  97. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources.json +123 -0
  98. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/package.json +3 -3
  99. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/01-module-runtime.js +34 -0
  100. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/02-react.js +992 -0
  101. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/03-react-dom-client-fiber-foundations.js +2513 -0
  102. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/04-react-dom-client-reconciliation-hooks.js +1919 -0
  103. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/05-react-dom-client-render-phases.js +1759 -0
  104. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/06-react-dom-client-commit-effects.js +1551 -0
  105. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/07-react-dom-client-work-loop-scheduling.js +1121 -0
  106. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/08-react-dom-client-dom-events-properties-hydration.js +2183 -0
  107. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/09-react-dom-client-public-roots.js +705 -0
  108. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/10-react.js +27 -0
  109. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/11-artifact-review-ui.js +13 -0
  110. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/12-design-review-experience.js +3561 -0
  111. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/13-studio-shell.js +184 -0
  112. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/14-interface-primitives.js +5045 -0
  113. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/15-interface-primitives.js +1698 -0
  114. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/16-studio-shell.js +455 -0
  115. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/17-design-studio.js +1844 -0
  116. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources.json +257 -0
  117. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/protocol/package.json +1 -1
  118. package/lib/host-packages/cursor/openplanr/runtime/plan/scripts/design-protocol-contracts.mjs +4966 -0
  119. package/lib/host-packages/cursor/openplanr/runtime/plan/scripts/design.mjs +240 -5192
  120. package/lib/host-packages/cursor/openplanr/runtime/plan/scripts/runtime/packages/protocol/package.json +1 -1
  121. package/lib/host-packages/openai/.claude-plugin/marketplace.json +2 -2
  122. package/lib/host-packages/openai/openplanr/.codex-plugin/plugin.json +1 -1
  123. package/lib/host-packages/openai/openplanr/.openplanr-content.json +164 -32
  124. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-artifact-shell.mjs +3 -11
  125. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-chunked-workspace-client.mjs +555 -0
  126. package/lib/host-packages/{cursor/openplanr/runtime/design/scripts/design-pako-esm.mjs → openai/openplanr/runtime/design/scripts/design-compression.mjs} +2 -1521
  127. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-document.mjs +133 -12
  128. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-encrypted-workspace-client.mjs +647 -0
  129. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-entities.mjs +17 -67
  130. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-handoff.mjs +14 -16
  131. package/lib/host-packages/{cursor/openplanr/runtime/design/scripts/design-planr-home.mjs → openai/openplanr/runtime/design/scripts/design-loopback-server.mjs} +15 -36
  132. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-owner-custody.mjs +121 -0
  133. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-resource-pack.mjs +698 -0
  134. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-review.mjs +798 -796
  135. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-runtime-home.mjs +39 -0
  136. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-runtime-support-5cb7531bede8.mjs +24 -0
  137. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-share.mjs +138 -765
  138. package/lib/host-packages/{cursor/openplanr/runtime/design/scripts/design-escape.mjs → openai/openplanr/runtime/design/scripts/design-shared-artifact-support-dependencies-design-support-protocol-contracts-3d9b1a86.mjs} +158 -156
  139. package/lib/host-packages/{cursor/openplanr/runtime/design/scripts/design-artifact-sources.mjs → openai/openplanr/runtime/design/scripts/design-shared-artifact-support-protocol-contracts-ea2cd15e.mjs} +1 -1
  140. package/lib/host-packages/{claude/openplanr/runtime/design/scripts/design-bounded-json-data.mjs → openai/openplanr/runtime/design/scripts/design-shared-protocol-contracts-31a760fc.mjs} +241 -454
  141. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-shared-protocol-contracts-75a938cc.mjs +222 -0
  142. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-upload-spool.mjs +198 -0
  143. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design.mjs +12 -5
  144. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/01-module-runtime.js +18 -0
  145. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/02-artifact-review-ui.js +809 -0
  146. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/03-protocol-contracts.js +5193 -0
  147. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/04-compression.js +4175 -0
  148. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/05-artifact-sharing.js +65 -0
  149. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/06-artifact-review-ui.js +1755 -0
  150. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/07-artifact-sharing.js +62 -0
  151. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/08-artifact-review-ui.js +2600 -0
  152. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources.json +123 -0
  153. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/package.json +3 -3
  154. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/01-module-runtime.js +34 -0
  155. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/02-react.js +992 -0
  156. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/03-react-dom-client-fiber-foundations.js +2513 -0
  157. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/04-react-dom-client-reconciliation-hooks.js +1919 -0
  158. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/05-react-dom-client-render-phases.js +1759 -0
  159. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/06-react-dom-client-commit-effects.js +1551 -0
  160. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/07-react-dom-client-work-loop-scheduling.js +1121 -0
  161. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/08-react-dom-client-dom-events-properties-hydration.js +2183 -0
  162. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/09-react-dom-client-public-roots.js +705 -0
  163. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/10-react.js +27 -0
  164. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/11-artifact-review-ui.js +13 -0
  165. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/12-design-review-experience.js +3561 -0
  166. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/13-studio-shell.js +184 -0
  167. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/14-interface-primitives.js +5045 -0
  168. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/15-interface-primitives.js +1698 -0
  169. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/16-studio-shell.js +455 -0
  170. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/17-design-studio.js +1844 -0
  171. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources.json +257 -0
  172. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/protocol/package.json +1 -1
  173. package/lib/host-packages/openai/openplanr/runtime/plan/scripts/design-protocol-contracts.mjs +4966 -0
  174. package/lib/host-packages/openai/openplanr/runtime/plan/scripts/design.mjs +240 -5192
  175. package/lib/host-packages/openai/openplanr/runtime/plan/scripts/runtime/packages/protocol/package.json +1 -1
  176. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/backend-diagnostics.mjs +6 -2
  177. package/package.json +2 -2
  178. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-generated-b0798298053515fd.mjs +0 -18
  179. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js +0 -5
  180. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js +0 -25597
  181. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-generated-b0798298053515fd.mjs +0 -18
  182. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js +0 -5
  183. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js +0 -25597
  184. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-generated-b0798298053515fd.mjs +0 -18
  185. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js +0 -5
  186. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js +0 -25597
@@ -1,5 +0,0 @@
1
- // generated by packages/artifact/scripts/generate-artifact-shell.mjs
2
- var OpenPlanrArtifactStage=(()=>{var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __hasOwnProp=Object.prototype.hasOwnProperty;var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&typeof from=="object"||typeof from=="function")for(let key of __getOwnPropNames(from))!__hasOwnProp.call(to,key)&&key!==except&&__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to};var __toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod);var stage_exports={};__export(stage_exports,{ARTIFACT_STAGE_EVENTS:()=>ARTIFACT_STAGE_EVENTS,ARTIFACT_STAGE_LIMITS:()=>ARTIFACT_STAGE_LIMITS,bootstrapArtifactStage:()=>bootstrapArtifactStage,clientPointToNormalized:()=>clientPointToNormalized,createArtifactStagePayload:()=>createArtifactStagePayload,createArtifactStageState:()=>createArtifactStageState,mountArtifactStage:()=>mountArtifactStage,normalizedPointToClient:()=>normalizedPointToClient,reduceArtifactStageState:()=>reduceArtifactStageState,resolveArtifactPresentation:()=>resolveArtifactPresentation,visibleArtifactIds:()=>visibleArtifactIds});function resolveArtifactPresentation(value,{mode,viewMode=mode??"single",artifactCount=1}={}){return value==="document"||value==="canvas"?value:artifactCount>1||viewMode==="variants"||viewMode==="split"?"canvas":"document"}var ARTIFACT_ANNOTATION_EVENTS=Object.freeze({draft:"planr:artifact-annotation-draft",focus:"planr:artifact-annotation-focus"}),ARTIFACT_ANNOTATION_LIMITS=Object.freeze({dragThreshold:4,maxCommentLength:65536,maxIdentityLength:256}),INTENTS=Object.freeze(["fix","improve","question"]);function finite(value,fallback=0){return typeof value=="number"&&Number.isFinite(value)?value:fallback}function clamp(value,min=0,max=1){return Math.min(max,Math.max(min,finite(value)))}function normalized(value){return Math.round(clamp(value)*1e6)/1e6}function assertRect(rect){if(!rect||!Number.isFinite(rect.left)||!Number.isFinite(rect.top)||!Number.isFinite(rect.width)||!Number.isFinite(rect.height)||rect.width<=0||rect.height<=0)throw new RangeError("Artifact bounds must have positive finite dimensions.")}function clientSelectionToNormalized(rect,start,end=start,{dragThreshold=ARTIFACT_ANNOTATION_LIMITS.dragThreshold}={}){assertRect(rect);let startX=clamp(finite(start?.x??start?.clientX,rect.left),rect.left,rect.left+rect.width),startY=clamp(finite(start?.y??start?.clientY,rect.top),rect.top,rect.top+rect.height),endX=clamp(finite(end?.x??end?.clientX,startX),rect.left,rect.left+rect.width),endY=clamp(finite(end?.y??end?.clientY,startY),rect.top,rect.top+rect.height),dragged=Math.hypot(endX-startX,endY-startY)>=Math.max(0,finite(dragThreshold,4)),left=dragged?Math.min(startX,endX):startX,top=dragged?Math.min(startY,endY):startY,right=dragged?Math.max(startX,endX):startX,bottom=dragged?Math.max(startY,endY):startY;return Object.freeze({x:normalized((left-rect.left)/rect.width),y:normalized((top-rect.top)/rect.height),w:normalized((right-left)/rect.width),h:normalized((bottom-top)/rect.height)})}function artifactAnchorPoint(region,viewport){let width=Number.isInteger(viewport?.width)&&viewport.width>0?viewport.width:1,height=Number.isInteger(viewport?.height)&&viewport.height>0?viewport.height:1;return Object.freeze({x:Math.round(clamp(region?.x+finite(region?.w)/2)*width),y:Math.round(clamp(region?.y+finite(region?.h)/2)*height)})}function annotationStyle(region){let percent=value=>`${Math.round(clamp(value)*1e6)/1e4}%`;return Object.freeze({left:percent(region?.x),top:percent(region?.y),width:percent(region?.w),height:percent(region?.h)})}function viewportRegionToAnchorRegion(region,viewport,anchorRect){let width=Number.isInteger(viewport?.width)&&viewport.width>0?viewport.width:1,height=Number.isInteger(viewport?.height)&&viewport.height>0?viewport.height:1,anchorWidth=Math.max(1,finite(anchorRect?.width,1)),anchorHeight=Math.max(1,finite(anchorRect?.height,1)),left=clamp(region?.x)*width,top=clamp(region?.y)*height,right=left+clamp(region?.w)*width,bottom=top+clamp(region?.h)*height,x=clamp((left-finite(anchorRect?.x))/anchorWidth),y=clamp((top-finite(anchorRect?.y))/anchorHeight);return Object.freeze({x:normalized(x),y:normalized(y),w:normalized(Math.max(0,Math.min(1-x,(right-left)/anchorWidth))),h:normalized(Math.max(0,Math.min(1-y,(bottom-top)/anchorHeight)))})}function anchorRegionToViewportRegion(region,viewport,anchorRect){let width=Number.isInteger(viewport?.width)&&viewport.width>0?viewport.width:1,height=Number.isInteger(viewport?.height)&&viewport.height>0?viewport.height:1,anchorWidth=Math.max(0,finite(anchorRect?.width)),anchorHeight=Math.max(0,finite(anchorRect?.height));return Object.freeze({x:normalized((finite(anchorRect?.x)+clamp(region?.x)*anchorWidth)/width),y:normalized((finite(anchorRect?.y)+clamp(region?.y)*anchorHeight)/height),w:normalized(clamp(region?.w)*anchorWidth/width),h:normalized(clamp(region?.h)*anchorHeight/height)})}function domToken(value){let source=String(value),token3="";for(let index2=0;index2<source.length;index2+=1)token3+=source.charCodeAt(index2).toString(16).padStart(4,"0");return token3}function annotationDomIds(pinId){let suffix=domToken(pinId);return Object.freeze({pin:`planr-pin-${suffix}`,thread:`planr-thread-${suffix}`})}function text(value,max=ARTIFACT_ANNOTATION_LIMITS.maxCommentLength){return typeof value=="string"?value.trim().slice(0,max):""}function make(document2,tag,{className,textContent,attributes={}}={}){let node2=document2.createElement(tag);className&&(node2.className=className),textContent!==void 0&&(node2.textContent=textContent);for(let[name,value]of Object.entries(attributes))value!=null&&node2.setAttribute(name,String(value));return node2}function setRegionStyle(node2,region){let style=annotationStyle(region);node2.style.left!==style.left&&(node2.style.left=style.left),node2.style.top!==style.top&&(node2.style.top=style.top),(region.w>0||region.h>0)&&(node2.style.width!==style.width&&(node2.style.width=style.width),node2.style.height!==style.height&&(node2.style.height=style.height))}function announce(document2,value){let node2=document2.querySelector('[data-planr-slot="review-announcer"]');node2&&(node2.textContent=value)}function identityName(reviewController){return text(reviewController?.getIdentity?.()?.name,ARTIFACT_ANNOTATION_LIMITS.maxIdentityLength)}function createIntentPicker(document2){let group=make(document2,"div",{className:"planr-intent-picker",attributes:{role:"radiogroup","aria-label":"Feedback intent"}});for(let[index2,intent]of INTENTS.entries()){let button=make(document2,"button",{textContent:intent[0].toUpperCase()+intent.slice(1),attributes:{type:"button",role:"radio","aria-checked":String(index2===0),tabindex:index2===0?0:-1,"data-planr-intent":intent}});group.append(button)}return group}function mountArtifactAnnotations({document:document2=globalThis.document,window=document2?.defaultView,root=document2?.querySelector?.(".planr-shell"),stageController,reviewController,onFocusPin}={}){if(!document2||!window||!root||!stageController||!reviewController)return null;let cleanup=[],draft=null,suspendedDraft=null,draftToken=0,draftFieldCleanup=null,composerLayoutCleanup=null,composerReturnFocus=null,pinRecords=new Map,anchorRequests=new Map,destroyed=!1;function listen(target,type,handler,options){target.addEventListener(type,handler,options),cleanup.push(()=>target.removeEventListener(type,handler,options))}function review(){return reviewController.getReview?.()??reviewController.getState?.()?.review??reviewController.getState?.()}function layerFor(artifactId){return[...document2.querySelectorAll("[data-planr-annotation-layer]")].find(node2=>node2.dataset.planrAnnotationLayer===artifactId)??null}function frameFor(artifactId){return[...document2.querySelectorAll("[data-planr-artifact-frame]")].find(node2=>node2.dataset.planrArtifactFrame===artifactId)??null}function focusThread(pinId){let pin=review()?.pins?.find(item2=>item2.id===pinId);if(!pin)return;reviewController.selectPin?.(pinId),stageController.getState().activeArtifactId!==pin.artifactId&&stageController.dispatch({type:"set-active",artifactId:pin.artifactId}),stageController.dispatch({type:"set-rail-open",railOpen:!0}),queueMicrotask(()=>document2.getElementById(annotationDomIds(pinId).thread)?.focus())}function focusPin(pinId){let pin=review()?.pins?.find(item2=>item2.id===pinId);if(!pin)return;reviewController.selectPin?.(pinId),stageController.getState().activeArtifactId!==pin.artifactId&&stageController.dispatch({type:"set-active",artifactId:pin.artifactId}),queueMicrotask(()=>{let marker=document2.getElementById(annotationDomIds(pinId).pin);if(marker?.hidden){announce(document2,"This pin’s element is not currently visible. The original comment remains in Review.");return}onFocusPin?onFocusPin(pin):marker?.scrollIntoView?.({block:"center",inline:"center",behavior:"smooth"}),marker?.focus?.({preventScroll:!0}),marker?.classList.add("planr-pin-highlight"),window.setTimeout(()=>marker?.classList.remove("planr-pin-highlight"),1200)})}function pinGeometryKey(pin){return JSON.stringify([reviewController.getReviewOf?.()??review()?.reviewOf,pin.artifactId,pin.anchor,pin.region,pin.viewport])}function setPinPosition(record2,region){let point2={x:region.x+region.w/2,y:region.y+region.h/2,w:0,h:0};setRegionStyle(record2.button,point2),record2.region&&setRegionStyle(record2.region,region),record2.button.hidden&&(record2.button.hidden=!1),record2.region?.hidden&&(record2.region.hidden=!1)}function hidePin(record2){record2.button.hidden||(record2.button.hidden=!0),record2.region&&!record2.region.hidden&&(record2.region.hidden=!0)}function removePin(record2){record2.pending=null,record2.button.remove(),record2.region?.remove()}function refreshAnchors(){if(destroyed)return;let now=window.performance.now(),frames=new Map([...document2.querySelectorAll("[data-planr-artifact-frame]")].map(frame=>[frame.dataset.planrArtifactFrame,frame])),records=[...pinRecords.values()].flatMap(records2=>[...records2.values()]).filter(record2=>record2.pin.anchor?.planrId).sort((a,b)=>a.requestedAt-b.requestedAt);for(let record2 of records){if(record2.pending||now-record2.requestedAt<200||!record2.button.isConnected)continue;let frame=frames.get(record2.pin.artifactId),bridge=frame?.__openPlanrBridge;if(!bridge?.resolve||frame.closest("[hidden]")||frame.dataset.planrBridgeTrusted==="false"||(anchorRequests.get(frame)??0)>=8)continue;let request={},key=record2.geometryKey,pin=record2.pin;record2.pending=request,record2.requestedAt=now,anchorRequests.set(frame,(anchorRequests.get(frame)??0)+1),Promise.resolve().then(()=>bridge.resolve(pin.anchor.planrId,pin.anchor.screen)).then(anchor2=>{if(destroyed||record2.pending!==request||record2.geometryKey!==key||!record2.button.isConnected||frame.__openPlanrBridge!==bridge)return;if(!anchor2||anchor2.rect.width<=0||anchor2.rect.height<=0){hidePin(record2),record2.button.dataset.planrAnchorStatus!=="unavailable"&&(record2.button.dataset.planrAnchorStatus="unavailable");return}let projected=anchorRegionToViewportRegion(pin.region,anchor2.viewport??pin.viewport,anchor2.rect);setPinPosition(record2,projected),record2.button.dataset.planrAnchorStatus!=="resolved"&&(record2.button.dataset.planrAnchorStatus="resolved")}).catch(()=>{}).finally(()=>{let remaining=(anchorRequests.get(frame)??1)-1;remaining>0?anchorRequests.set(frame,remaining):anchorRequests.delete(frame),record2.pending===request&&(record2.pending=null)})}}function renderPins(){if(destroyed)return;let pins=Array.isArray(review()?.pins)?review().pins:[],layers=new Set(document2.querySelectorAll("[data-planr-annotation-layer]"));for(let[layer,records]of pinRecords)if(!layers.has(layer)){for(let record2 of records.values())removePin(record2);pinRecords.delete(layer)}for(let layer of layers){let records=pinRecords.get(layer);records||(records=new Map,pinRecords.set(layer,records));let current=new Set;for(let[index2,pin]of pins.entries()){if(pin.artifactId!==layer.dataset.planrAnnotationLayer)continue;current.add(pin.id);let ids2=annotationDomIds(pin.id),ordinal=index2+1,hasRegion=pin.region.w>0||pin.region.h>0,record2=records.get(pin.id);if(!record2){let button=make(document2,"button",{attributes:{type:"button",id:ids2.pin,"data-planr-pin-id":pin.id,"aria-controls":ids2.thread}});button.addEventListener("click",()=>focusThread(pin.id)),layer.append(button),record2={button,region:null,pin,geometryKey:null,pending:null,requestedAt:-1/0},records.set(pin.id,record2)}record2.pin=pin,hasRegion&&!record2.region?(record2.region=make(document2,"span",{attributes:{"data-planr-pin-region-id":pin.id,"aria-hidden":"true"}}),layer.insertBefore(record2.region,record2.button)):!hasRegion&&record2.region&&(record2.region.remove(),record2.region=null);let buttonClass=`planr-pin planr-pin-${pin.intent} planr-pin-${pin.status}${hasRegion?" planr-pin-region-handle":""}${record2.button.classList.contains("planr-pin-highlight")?" planr-pin-highlight":""}`;record2.button.className!==buttonClass&&(record2.button.className=buttonClass),record2.button.textContent!==String(ordinal)&&(record2.button.textContent=String(ordinal));for(let[name,value]of Object.entries({"data-planr-intent":pin.intent,"data-planr-status":pin.status,"aria-label":`${pin.intent} comment ${ordinal}: ${pin.comment}`}))record2.button.getAttribute(name)!==value&&record2.button.setAttribute(name,value);if(record2.region){let regionClass=`planr-pin-region planr-pin-region-${pin.intent} planr-pin-region-${pin.status}`;record2.region.className!==regionClass&&(record2.region.className=regionClass)}let key=pinGeometryKey(pin);record2.geometryKey!==key&&(record2.geometryKey=key,record2.pending=null,record2.requestedAt=-1/0,pin.anchor?.planrId?hidePin(record2):(delete record2.button.dataset.planrAnchorStatus,setPinPosition(record2,pin.region)))}for(let[id7,record2]of records)current.has(id7)||(removePin(record2),records.delete(id7))}refreshAnchors()}function closeComposer({restoreFocus=!1,preserveDraft=!1}={}){let snapshot2=preserveDraft?snapshotDraft():null;draftFieldCleanup?.(),draftFieldCleanup=null,composerLayoutCleanup?.(),composerLayoutCleanup=null;let activeLayer=draft?layerFor(draft.artifactId):null,composer=root.querySelector("[data-planr-annotation-composer]");try{composer?.matches(":popover-open")&&composer.hidePopover()}catch{}composer?.remove(),draft=null,suspendedDraft=snapshot2,draftToken+=1,activeLayer&&stageController.getState().reviewMode!=="comment"&&activeLayer.setAttribute("aria-disabled","true"),restoreFocus&&(composerReturnFocus?.isConnected&&composerReturnFocus!==document2.body?composerReturnFocus:activeLayer)?.focus?.({preventScroll:!0}),composerReturnFocus=null}async function resolveAnchor(token3,candidate){let frame=frameFor(candidate.artifactId),point2=artifactAnchorPoint(candidate.region,candidate.viewport),result=null;try{let anchor2=frame?.__openPlanrBridge?.hitTest?.(point2.x,point2.y);anchor2&&(result=await Promise.race([anchor2,new Promise(resolve=>window.setTimeout(()=>resolve(null),800))]))}catch{result=null}token3!==draftToken||!draft||draft.artifactId!==candidate.artifactId||result?.planrId&&(draft.anchor=Object.freeze({planrId:String(result.planrId).slice(0,512),...result.screen?{screen:String(result.screen).slice(0,128)}:{}}),draft.region=viewportRegionToAnchorRegion(draft.region,draft.viewport,result.rect))}function positionComposer(){let composer=root.querySelector("[data-planr-annotation-composer]"),layer=draft&&layerFor(draft.artifactId);if(!composer||!layer)return;let visual=window.visualViewport,viewport={x:finite(visual?.offsetLeft),y:finite(visual?.offsetTop),width:finite(visual?.width,window.innerWidth),height:finite(visual?.height,window.innerHeight)},margin=Math.min(12,viewport.width/8,viewport.height/8),availableWidth=Math.max(1,viewport.width-margin*2),availableHeight=Math.max(1,viewport.height-margin*2);composer.style.width=`${Math.min(360,availableWidth)}px`,composer.style.maxHeight=`${Math.min(620,availableHeight)}px`;let bounds2=layer.getBoundingClientRect(),point2={x:bounds2.left+clamp(draft.displayRegion.x+draft.displayRegion.w/2)*bounds2.width,y:bounds2.top+clamp(draft.displayRegion.y+draft.displayRegion.h/2)*bounds2.height},size=composer.getBoundingClientRect(),width=Math.min(size.width||360,availableWidth),height=Math.min(size.height||360,availableHeight),left=point2.x+16+width<=viewport.x+viewport.width-margin?point2.x+16:point2.x-width-16;composer.style.left=`${clamp(left,viewport.x+margin,viewport.x+viewport.width-width-margin)}px`,composer.style.top=`${clamp(point2.y+16,viewport.y+margin,viewport.y+viewport.height-height-margin)}px`}function openComposer(detail,{restoredDraft=null}={}){let opener=document2.activeElement;if(closeComposer(),composerReturnFocus=opener,!layerFor(detail.artifactId))return;draftToken+=1;let token3=draftToken;draft={artifactId:detail.artifactId,region:Object.freeze({...detail.region}),viewport:Object.freeze({...detail.viewport}),variant:typeof detail.variant=="string"&&detail.variant.length>0?detail.variant:detail.artifactId,anchor:restoredDraft?.anchor??null,displayRegion:Object.freeze({...restoredDraft?.displayRegion??detail.region})};let composer=make(document2,"form",{className:"planr-annotation-composer",attributes:{"data-planr-annotation-composer":"",role:"dialog",popover:"manual","aria-label":"Add artifact comment"}}),header=make(document2,"header",{className:"planr-composer-header"}),heading=make(document2,"strong",{textContent:"New comment"}),close=make(document2,"button",{textContent:"×",attributes:{type:"button","data-planr-composer-close":"","aria-label":"Close new comment",title:"Close new comment (Escape)"}});header.append(heading,close);let identityLabel=make(document2,"label",{textContent:"Your name"}),identity=make(document2,"input",{attributes:{type:"text",maxlength:ARTIFACT_ANNOTATION_LIMITS.maxIdentityLength,autocomplete:"name",value:identityName(reviewController),"data-planr-composer-identity":"","aria-describedby":"planr-composer-error"}});identityLabel.append(identity);let intentPicker=createIntentPicker(document2),commentLabel=make(document2,"label",{textContent:"Comment"}),comment=make(document2,"textarea",{attributes:{maxlength:ARTIFACT_ANNOTATION_LIMITS.maxCommentLength,required:"",placeholder:"Describe what the coding agent should change or consider…","data-planr-composer-comment":"","aria-describedby":"planr-composer-error"}});commentLabel.append(comment);let error=make(document2,"p",{className:"planr-field-error",attributes:{id:"planr-composer-error",role:"alert","data-planr-composer-error":""}}),actions=make(document2,"div",{className:"planr-composer-actions"});actions.append(make(document2,"button",{textContent:"Cancel",attributes:{type:"button","data-planr-composer-cancel":""}}),make(document2,"button",{textContent:"Add comment",attributes:{type:"submit","data-planr-composer-submit":""}})),composer.append(header,identityLabel,intentPicker,commentLabel,error,actions),root.append(composer);try{typeof composer.showPopover=="function"?composer.showPopover():composer.removeAttribute("popover")}catch{composer.removeAttribute("popover")}positionComposer();let observer=typeof window.ResizeObserver=="function"?new window.ResizeObserver(positionComposer):null;observer?.observe(composer),composerLayoutCleanup=()=>observer?.disconnect();let selectedIntent="fix";if(listen(intentPicker,"click",event=>{let button=event.target.closest?.("[data-planr-intent]");if(!(!button||!INTENTS.includes(button.dataset.planrIntent))){selectedIntent=button.dataset.planrIntent;for(let option of intentPicker.querySelectorAll("[data-planr-intent]"))option.setAttribute("aria-checked",String(option===button)),option.tabIndex=option===button?0:-1}}),listen(intentPicker,"keydown",event=>{if(!["ArrowLeft","ArrowRight","ArrowUp","ArrowDown","Home","End"].includes(event.key))return;let options=[...intentPicker.querySelectorAll("[data-planr-intent]")],current=options.findIndex(option=>option.getAttribute("aria-checked")==="true"),delta=["ArrowRight","ArrowDown"].includes(event.key)?1:-1,nextIndex=event.key==="Home"?0:event.key==="End"?options.length-1:(Math.max(0,current)+delta+options.length)%options.length;event.preventDefault(),options[nextIndex].click(),options[nextIndex].focus()}),listen(close,"click",()=>closeComposer({restoreFocus:!0})),listen(composer.querySelector("[data-planr-composer-cancel]"),"click",()=>{closeComposer({restoreFocus:!0})},{once:!0}),listen(composer,"keydown",event=>{event.key==="Escape"?(event.preventDefault(),event.stopPropagation(),closeComposer({restoreFocus:!0})):event.key==="Enter"&&!event.isComposing&&(event.metaKey||event.ctrlKey)&&(event.preventDefault(),composer.requestSubmit())}),listen(composer,"submit",event=>{if(event.preventDefault(),!draft)return;let author=text(identity.value,ARTIFACT_ANNOTATION_LIMITS.maxIdentityLength),body=text(comment.value);if(identity.setAttribute("aria-invalid",String(!author)),comment.setAttribute("aria-invalid",String(!body)),!author||!body){error.textContent=author?"Enter a comment before submitting.":"Enter your name before adding a comment.",(author?comment:identity).focus();return}reviewController.setIdentity?.({name:author});let existingIds=new Set(review()?.pins?.map(({id:id7})=>id7)??[]),action={type:"add-pin",pin:{artifactId:draft.artifactId,region:draft.region,viewport:draft.viewport,variant:draft.variant,...draft.anchor?{anchor:draft.anchor}:{},intent:selectedIntent,comment:body}},next=reviewController.dispatch(action),created=(next?.review??next)?.pins?.find?.(({id:id7})=>!existingIds.has(id7));closeComposer(),renderPins(),announce(document2,`${selectedIntent} comment added.`),created?.id&&queueMicrotask(()=>focusThread(created.id))}),comment.focus(),root.dispatchEvent(new window.CustomEvent(ARTIFACT_ANNOTATION_EVENTS.draft,{bubbles:!0,detail:Object.freeze({...draft})})),restoredDraft){identity.value=restoredDraft.identity,comment.value=restoredDraft.comment,selectedIntent=restoredDraft.intent;for(let option of intentPicker.querySelectorAll("[data-planr-intent]")){let selected=option.dataset.planrIntent===selectedIntent;option.setAttribute("aria-checked",String(selected)),option.tabIndex=selected?0:-1}Number.isInteger(restoredDraft.selectionStart)&&comment.setSelectionRange(restoredDraft.selectionStart,restoredDraft.selectionEnd,restoredDraft.selectionDirection);let fields=new Map(Object.entries(restoredDraft.fields??{}).slice(0,32).filter(([key,value])=>key.length<=128&&typeof value=="string"&&value.length<=ARTIFACT_ANNOTATION_LIMITS.maxCommentLength));if(fields.size){let restoreFields=function(){if(token3!==draftToken||!composer.isConnected){finish();return}for(let field of composer.querySelectorAll("[data-planr-draft-key]")){let key=field.dataset.planrDraftKey;!fields.has(key)||typeof field.value!="string"||(field.value=fields.get(key),fields.delete(key),field.dispatchEvent(new window.Event("change",{bubbles:!0})))}fields.size||finish()},timer,observer2=new window.MutationObserver(restoreFields),finish=()=>{observer2.disconnect(),window.clearTimeout(timer)};observer2.observe(composer,{childList:!0,subtree:!0}),timer=window.setTimeout(finish,1500),draftFieldCleanup=finish,restoreFields()}}else resolveAnchor(token3,draft)}function snapshotDraft(){let composer=document2.querySelector("[data-planr-annotation-composer]");if(!draft||!composer)return suspendedDraft;let comment=composer.querySelector("[data-planr-composer-comment]");return Object.freeze({...draft,reviewOf:reviewController.getReviewOf?.()??review()?.reviewOf??null,identity:composer.querySelector("[data-planr-composer-identity]").value,fields:Object.fromEntries([...composer.querySelectorAll("[data-planr-draft-key]")].slice(0,32).filter(field=>field.dataset.planrDraftKey.length<=128&&typeof field.value=="string").map(field=>[field.dataset.planrDraftKey,field.value.slice(0,ARTIFACT_ANNOTATION_LIMITS.maxCommentLength)])),comment:comment.value,intent:composer.querySelector('[data-planr-intent][aria-checked="true"]')?.dataset.planrIntent??"fix",selectionStart:comment.selectionStart,selectionEnd:comment.selectionEnd,selectionDirection:comment.selectionDirection})}function restoreDraft(snapshot2){if(!snapshot2||snapshot2.reviewOf!==(reviewController.getReviewOf?.()??review()?.reviewOf??null))return!1;let artifact=stageController.getState().artifacts.find(entry=>entry.id===snapshot2.artifactId);return!artifact||artifact.viewport.width!==snapshot2.viewport?.width||artifact.viewport.height!==snapshot2.viewport?.height||!["x","y","w","h"].every(key=>Number.isFinite(snapshot2.region?.[key])&&snapshot2.region[key]>=0&&snapshot2.region[key]<=1)||!["x","y","w","h"].every(key=>Number.isFinite(snapshot2.displayRegion?.[key])&&snapshot2.displayRegion[key]>=0&&snapshot2.displayRegion[key]<=1)||typeof snapshot2.comment!="string"||snapshot2.comment.length>ARTIFACT_ANNOTATION_LIMITS.maxCommentLength||typeof snapshot2.identity!="string"||snapshot2.identity.length>ARTIFACT_ANNOTATION_LIMITS.maxIdentityLength||!INTENTS.includes(snapshot2.intent)||snapshot2.anchor&&(typeof snapshot2.anchor.planrId!="string"||snapshot2.anchor.planrId.length>512)?!1:(openComposer(snapshot2,{restoredDraft:snapshot2}),!!draft)}listen(window,"resize",positionComposer),window.visualViewport&&(listen(window.visualViewport,"resize",positionComposer),listen(window.visualViewport,"scroll",positionComposer)),listen(root,"planr:artifact-region",event=>openComposer(event.detail)),listen(root,"planr:stage-change",()=>{let state=stageController.getState(),visible=state.viewMode==="split"?[state.activeArtifactId,state.comparisonArtifactId]:[state.activeArtifactId];if(!draft){suspendedDraft&&state.status==="ready"&&state.reviewMode==="comment"&&visible.includes(suspendedDraft.artifactId)&&restoreDraft(suspendedDraft);return}if(state.status!=="ready"||state.presentation!=="document"&&state.reviewMode!=="comment"){closeComposer({preserveDraft:!0});return}visible.includes(draft.artifactId)?(draftToken+=1,positionComposer()):closeComposer({preserveDraft:!0})}),listen(root,"planr:artifact-review-change",renderPins);let anchorRefresh=window.setInterval(refreshAnchors,250);cleanup.push(()=>window.clearInterval(anchorRefresh)),listen(root,ARTIFACT_ANNOTATION_EVENTS.focus,event=>{event.detail?.target==="pin"&&focusPin(event.detail.pinId),event.detail?.target==="thread"&&focusThread(event.detail.pinId)}),listen(root,"planr:artifact-review-select",event=>{event.detail?.source==="thread"&&typeof event.detail?.pinId=="string"&&focusPin(event.detail.pinId)}),renderPins();let controller=Object.freeze({render:renderPins,openComposer,closeComposer,snapshotDraft,restoreDraft,focusPin,focusThread,destroy(){destroyed=!0,closeComposer();for(let remove of cleanup.splice(0))remove();for(let records of pinRecords.values())for(let record2 of records.values())removePin(record2);pinRecords.clear(),anchorRequests.clear()}});return window.__openPlanrArtifactAnnotations=controller,controller}var ARTIFACT_ERROR_CODES=Object.freeze({INPUT_INVALID:"E_ARTIFACT_INPUT_INVALID",FILE_MISSING:"E_ARTIFACT_FILE_MISSING",ROOT_MISSING:"E_ARTIFACT_ROOT_MISSING",PATH_TRAVERSAL:"E_ARTIFACT_PATH_TRAVERSAL",SYMLINK_ESCAPE:"E_ARTIFACT_SYMLINK_ESCAPE",EXTERNAL_ASSET:"E_ARTIFACT_EXTERNAL_ASSET",UNRESOLVED_ASSET:"E_ARTIFACT_UNRESOLVED_ASSET",UNSUPPORTED_MODULE:"E_ARTIFACT_UNSUPPORTED_MODULE",UNSAFE_HTML:"E_ARTIFACT_UNSAFE_HTML",FILE_LIMIT:"E_ARTIFACT_FILE_LIMIT",BYTE_LIMIT:"E_ARTIFACT_BYTE_LIMIT",OUTPUT_LIMIT:"E_ARTIFACT_OUTPUT_LIMIT",REDACTION:"E_ARTIFACT_REDACTION",ENVELOPE_INVALID:"E_ARTIFACT_ENVELOPE_INVALID",SCHEMA_UNSUPPORTED:"E_ARTIFACT_SCHEMA_UNSUPPORTED",LOOPBACK_BIND:"E_ARTIFACT_LOOPBACK_BIND",LOOPBACK_STATE:"E_ARTIFACT_LOOPBACK_STATE",PORT_IN_USE:"E_ARTIFACT_PORT_IN_USE",SESSION_TOKEN:"E_ARTIFACT_SESSION_TOKEN",SESSION_NOT_FOUND:"E_ARTIFACT_SESSION_NOT_FOUND",REQUEST_INVALID:"E_ARTIFACT_REQUEST_INVALID",REQUEST_LIMIT:"E_ARTIFACT_REQUEST_LIMIT",SANDBOX_POLICY:"E_ARTIFACT_SANDBOX_POLICY",BRIDGE_INVALID:"E_ARTIFACT_BRIDGE_INVALID",REVIEW_INVALID:"E_ARTIFACT_REVIEW_INVALID",REVIEW_WRITE:"E_ARTIFACT_REVIEW_WRITE",REVIEW_IMPORT:"E_ARTIFACT_REVIEW_IMPORT",REVIEW_DECODER_REQUIRED:"E_ARTIFACT_REVIEW_DECODER_REQUIRED",REVIEW_EXPORT:"E_ARTIFACT_REVIEW_EXPORT",DIGEST_MISMATCH:"E_ARTIFACT_DIGEST_MISMATCH",STALE_REVIEW:"E_ARTIFACT_STALE_REVIEW",MERGE_CONFLICT:"E_ARTIFACT_MERGE_CONFLICT",CODEC_INVALID:"E_ARTIFACT_CODEC_INVALID",CODEC_UNAVAILABLE:"E_ARTIFACT_CODEC_UNAVAILABLE",CODEC_FAILED:"E_ARTIFACT_CODEC_FAILED",FRAGMENT_INVALID:"E_ARTIFACT_FRAGMENT_INVALID",FRAGMENT_VERSION_UNSUPPORTED:"E_ARTIFACT_FRAGMENT_VERSION_UNSUPPORTED",FRAGMENT_TOO_LARGE:"E_ARTIFACT_FRAGMENT_TOO_LARGE",DECOMPRESSION_LIMIT:"E_ARTIFACT_DECOMPRESSION_LIMIT",BROWSER_UNSUPPORTED:"E_ARTIFACT_BROWSER_UNSUPPORTED",ENCRYPTION_FAILED:"E_ARTIFACT_ENCRYPTION_FAILED",DECRYPTION_FAILED:"E_ARTIFACT_DECRYPTION_FAILED",CONFIRMATION_REQUIRED:"E_ARTIFACT_CONFIRMATION_REQUIRED",SHORT_CONFIRMATION_REQUIRED:"E_ARTIFACT_SHORT_CONFIRMATION_REQUIRED",PASTE_INVALID:"E_ARTIFACT_PASTE_INVALID",PASTE_UNAVAILABLE:"E_ARTIFACT_PASTE_UNAVAILABLE",PASTE_EXPIRED:"E_ARTIFACT_PASTE_EXPIRED",PASTE_LIMIT:"E_ARTIFACT_PASTE_LIMIT",SHARE_NETWORK:"E_ARTIFACT_SHARE_NETWORK",ROOM_CREATE_AMBIGUOUS:"E_ARTIFACT_ROOM_CREATE_AMBIGUOUS",ROOM_INVALID:"E_ARTIFACT_ROOM_INVALID",ROOM_UNAVAILABLE:"E_ARTIFACT_ROOM_UNAVAILABLE",ROOM_EXPIRED:"E_ARTIFACT_ROOM_EXPIRED",ROOM_CLOSED:"E_ARTIFACT_ROOM_CLOSED",ROOM_LEGACY_READ_ONLY:"E_ARTIFACT_ROOM_LEGACY_READ_ONLY",ROOM_FORBIDDEN:"E_ARTIFACT_ROOM_FORBIDDEN",ROOM_EVENT_INVALID:"E_ARTIFACT_ROOM_EVENT_INVALID",ROOM_EVENT_REPLAY:"E_ARTIFACT_ROOM_EVENT_REPLAY"}),PROTOCOL_ERROR_CODES=Object.freeze({ASSET_NOT_FOUND:"E_PROTOCOL_ASSET_NOT_FOUND",DIGEST_MISMATCH:"E_PROTOCOL_DIGEST_MISMATCH",DOCUMENT_INVALID:"E_PROTOCOL_DOCUMENT_INVALID",DOCUMENT_VERSION_UNSUPPORTED:"E_PROTOCOL_DOCUMENT_VERSION_UNSUPPORTED",DUPLICATE_ID:"E_PROTOCOL_DUPLICATE_ID",REFERENCE_INVALID:"E_PROTOCOL_REFERENCE_INVALID",REGISTRY_INVALID:"E_PROTOCOL_REGISTRY_INVALID",SCHEMA_INVALID:"E_PROTOCOL_SCHEMA_INVALID",SCHEMA_UNKNOWN:"E_SCHEMA_UNKNOWN",SCHEMA_VERSION_UNSUPPORTED:"E_SCHEMA_VERSION_UNSUPPORTED",SORT_ORDER_INVALID:"E_PROTOCOL_SORT_ORDER_INVALID"});var PipelineError=class extends Error{constructor(code,message,fix="",details=void 0){super(message),this.name="PipelineError",this.code=code,this.fix=fix,details!==void 0&&(this.details=details)}toJSON(){return{ok:!1,code:this.code,problem:this.message,...this.fix?{fix:this.fix}:{},...this.details===void 0?{}:{details:this.details}}}};var hasOwn=(value,key)=>Object.hasOwn(value,key);function assertUnicodeScalarString(value,path){for(let index2=0;index2<value.length;index2+=1){let code=value.charCodeAt(index2);if(code>=55296&&code<=56319){let next=value.charCodeAt(index2+1);if(!(next>=56320&&next<=57343))throw new TypeError(`JCS cannot canonicalize a lone high surrogate at ${path}.`);index2+=1}else if(code>=56320&&code<=57343)throw new TypeError(`JCS cannot canonicalize a lone low surrogate at ${path}.`)}}function serialize(value,path,seen){if(value===null)return"null";if(typeof value=="boolean")return value?"true":"false";if(typeof value=="string")return assertUnicodeScalarString(value,path),JSON.stringify(value);if(typeof value=="number"){if(!Number.isFinite(value))throw new TypeError(`JCS requires a finite number at ${path}.`);return JSON.stringify(value)}if(typeof value!="object")throw new TypeError(`JCS cannot canonicalize ${typeof value} at ${path}.`);if(seen.has(value))throw new TypeError(`JCS cannot canonicalize a cycle at ${path}.`);seen.add(value);try{if(Array.isArray(value)){let entries2=[];for(let index2=0;index2<value.length;index2+=1){if(!hasOwn(value,index2))throw new TypeError(`JCS cannot canonicalize a sparse array at ${path}[${index2}].`);entries2.push(serialize(value[index2],`${path}[${index2}]`,seen))}return`[${entries2.join(",")}]`}let prototype=Object.getPrototypeOf(value);if(prototype!==Object.prototype&&prototype!==null)throw new TypeError(`JCS requires a plain JSON object at ${path}.`);return`{${Object.keys(value).sort().map(key=>(assertUnicodeScalarString(key,`${path} key`),`${JSON.stringify(key)}:${serialize(value[key],`${path}.${key}`,seen)}`)).join(",")}}`}finally{seen.delete(value)}}function canonicalizeJson(value){return serialize(value,"$",new Set)}function deepFreeze(value){if(value&&typeof value=="object"&&!Object.isFrozen(value)){for(let nested of Object.values(value))deepFreeze(nested);Object.freeze(value)}return value}function assertPlainDataAt(value,label,depth,seen){if(depth>64)throw new TypeError(`${label} exceeds the maximum nesting depth.`);if(!(value===null||["string","boolean"].includes(typeof value))&&!(typeof value=="number"&&Number.isFinite(value))){if(typeof value!="object"||seen.has(value))throw new TypeError(`${label} must be finite, acyclic JSON.`);if(!Array.isArray(value)&&![Object.prototype,null].includes(Object.getPrototypeOf(value)))throw new TypeError(`${label} must contain only plain JSON objects.`);seen.add(value);for(let[key,descriptor]of Object.entries(Object.getOwnPropertyDescriptors(value))){if(["__proto__","prototype","constructor"].includes(key)||!Object.hasOwn(descriptor,"value"))throw new TypeError(`${label} contains a forbidden property.`);assertPlainDataAt(descriptor.value,label,depth+1,seen)}seen.delete(value)}}function assertPlainData(value,label){assertPlainDataAt(value,label,0,new Set)}function assertLargeObjectData(value){let pending=[[value,0]],visited=new Set,nodes=0;for(let next=pending.pop();next;next=pending.pop()){let[item2,depth,exit]=next;if(exit){visited.delete(item2);continue}if(++nodes>25e4||depth>40)throw new RangeError("Large object complexity exceeds its limit.");if(item2&&typeof item2=="object"){if(visited.has(item2))throw new TypeError("Large objects require acyclic plain data.");visited.add(item2),pending.push([item2,depth,!0]);let array=Array.isArray(item2),prototype=Object.getPrototypeOf(item2);if(array?prototype!==Array.prototype:prototype!==Object.prototype&&prototype!==null)throw new TypeError("Large objects require plain data.");let descriptors=Object.getOwnPropertyDescriptors(item2),keys=Reflect.ownKeys(descriptors),length=array?descriptors.length.value:null;if(array&&keys.length!==length+1)throw new TypeError("Large objects require dense JSON arrays.");for(let key of keys){if(typeof key!="string"||["__proto__","constructor","prototype"].includes(key))throw new TypeError("Large objects cannot contain unsafe or symbolic keys.");let descriptor=descriptors[key];if(!("value"in descriptor))throw new TypeError("Large objects cannot contain accessors.");if(!(array&&key==="length")&&!descriptor.enumerable)throw new TypeError("Large objects require enumerable JSON fields.");if(array&&key!=="length"&&(!Number.isSafeInteger(Number(key))||Number(key)<0||Number(key)>=length||String(Number(key))!==key))throw new TypeError("Large objects require numeric JSON array indices.");pending.push([descriptor.value,depth+1])}}}return assertPlainData(value,"Large object data"),value}var typeOf=v=>v===null?"null":Array.isArray(v)?"array":Number.isInteger(v)?"integer":typeof v=="number"?"number":typeof v,matchesType=(v,t)=>t==="integer"?Number.isInteger(v):t==="number"?typeof v=="number":t==="string"?typeof v=="string":t==="boolean"?typeof v=="boolean":t==="null"?v===null:t==="array"?Array.isArray(v):t==="object"?v!==null&&typeof v=="object"&&!Array.isArray(v):!1,FORMAT_DATE=/^\d{4}-\d{2}-\d{2}$/,FORMAT_DATETIME=/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})$/;function resolveJsonPointer(root,reference){return reference==="#"?root:reference.startsWith("#/")?reference.slice(2).split("/").map(part=>part.replaceAll("~1","/").replaceAll("~0","~")).reduce((value,part)=>value?.[part],root):null}var validateNode=(value,schema6,path,errs,context)=>{if(schema6!==!0){if(schema6===!1){errs.push({path,rule:"schema:false",detail:"value not allowed"});return}if(typeof schema6?.$ref=="string"){let reference=schema6.$ref,resolved,nextRoot=context.rootSchema,resolvedBase=context.base;if(reference.startsWith("#"))resolved=resolveJsonPointer(context.rootSchema,reference);else if(typeof context.resolveRef=="function"){let result=context.resolveRef(reference,{base:context.base});resolved=result?.schema??result,nextRoot=result?.rootSchema??resolved,resolvedBase=result?.base??resolved?.$id??context.base}if(!resolved){errs.push({path,rule:"$ref",detail:`could not resolve schema reference ${reference}`});return}let referenceKey=`${context.base??"<root>"}:${reference}`;if(context.referenceStack.includes(referenceKey)){errs.push({path,rule:"$ref",detail:`circular schema reference ${reference}`});return}validateNode(value,resolved,path,errs,{...context,rootSchema:nextRoot,base:resolvedBase,referenceStack:[...context.referenceStack,referenceKey]})}if(schema6.type!==void 0){let types=Array.isArray(schema6.type)?schema6.type:[schema6.type];if(!types.some(t=>matchesType(value,t))){errs.push({path,rule:"type",detail:`expected ${types.join("|")}, got ${typeOf(value)}`});return}}if(schema6.const!==void 0&&value!==schema6.const&&errs.push({path,rule:"const",detail:`expected ${JSON.stringify(schema6.const)}, got ${JSON.stringify(value)}`}),Array.isArray(schema6.enum)&&(schema6.enum.includes(value)||errs.push({path,rule:"enum",detail:`value ${JSON.stringify(value)} not in enum [${schema6.enum.map(x=>JSON.stringify(x)).join(", ")}]`})),typeof value=="string"){if(typeof schema6.minLength=="number"&&value.length<schema6.minLength&&errs.push({path,rule:"minLength",detail:`length ${value.length} < ${schema6.minLength}`}),typeof schema6.maxLength=="number"&&value.length>schema6.maxLength&&errs.push({path,rule:"maxLength",detail:`length ${value.length} > ${schema6.maxLength}`}),typeof schema6.pattern=="string")try{new RegExp(schema6.pattern).test(value)||errs.push({path,rule:"pattern",detail:`value ${JSON.stringify(value)} does not match /${schema6.pattern}/`})}catch(e){errs.push({path,rule:"pattern",detail:`invalid regex /${schema6.pattern}/: ${e instanceof Error?e.message:String(e)}`})}typeof schema6.format=="string"&&(schema6.format==="date"&&!FORMAT_DATE.test(value)?errs.push({path,rule:"format:date",detail:`value ${JSON.stringify(value)} is not YYYY-MM-DD`}):schema6.format==="date-time"&&!FORMAT_DATETIME.test(value)&&errs.push({path,rule:"format:date-time",detail:`value ${JSON.stringify(value)} is not ISO 8601 date-time`}))}if(typeof value=="number"&&(typeof schema6.minimum=="number"&&value<schema6.minimum&&errs.push({path,rule:"minimum",detail:`value ${value} < ${schema6.minimum}`}),typeof schema6.maximum=="number"&&value>schema6.maximum&&errs.push({path,rule:"maximum",detail:`value ${value} > ${schema6.maximum}`})),Array.isArray(value)){typeof schema6.minItems=="number"&&value.length<schema6.minItems&&errs.push({path,rule:"minItems",detail:`length ${value.length} < ${schema6.minItems}`}),typeof schema6.maxItems=="number"&&value.length>schema6.maxItems&&errs.push({path,rule:"maxItems",detail:`length ${value.length} > ${schema6.maxItems}`});let prefixLength=Array.isArray(schema6.prefixItems)?schema6.prefixItems.length:0;if(prefixLength>0)for(let i=0;i<Math.min(value.length,prefixLength);i++)validateNode(value[i],schema6.prefixItems[i],`${path}[${i}]`,errs,context);if(schema6.items!==void 0)for(let i=prefixLength;i<value.length;i++)validateNode(value[i],schema6.items,`${path}[${i}]`,errs,context);if(schema6.uniqueItems===!0){let seen=new Set;for(let item2 of value){let key=JSON.stringify(item2);if(seen.has(key)){errs.push({path,rule:"uniqueItems",detail:`duplicate item ${key}`});break}seen.add(key)}}if(schema6.contains!==void 0){let matches=0;for(let index2=0;index2<value.length;index2+=1){let containedErrors=[];validateNode(value[index2],schema6.contains,`${path}[${index2}]`,containedErrors,context),containedErrors.length===0&&(matches+=1)}let minimum=Number.isSafeInteger(schema6.minContains)?schema6.minContains:1,maximum=Number.isSafeInteger(schema6.maxContains)?schema6.maxContains:null;matches<minimum&&errs.push({path,rule:"contains",detail:`matched ${matches} contained items; expected at least ${minimum}`}),maximum!==null&&matches>maximum&&errs.push({path,rule:"contains",detail:`matched ${matches} contained items; expected at most ${maximum}`})}}if(value!==null&&typeof value=="object"&&!Array.isArray(value)){if(Array.isArray(schema6.required))for(let req of schema6.required)Object.hasOwn(value,req)||errs.push({path,rule:"required",detail:`missing required property '${req}'`});let props=schema6.properties||{};for(let[k,v]of Object.entries(value))Object.hasOwn(props,k)||(schema6.additionalProperties===!1?errs.push({path,rule:"additionalProperties",detail:`unknown property '${k}'`}):(schema6.additionalProperties===!0||schema6.additionalProperties!==null&&typeof schema6.additionalProperties=="object")&&validateNode(v,schema6.additionalProperties,`${path}.${k}`,errs,context));for(let[k,v]of Object.entries(value))Object.hasOwn(props,k)&&validateNode(v,props[k],`${path}.${k}`,errs,context)}if(Array.isArray(schema6.oneOf)){let matched=0;for(let sub of schema6.oneOf){let e=[];validateNode(value,sub,path,e,context),e.length===0&&matched++}if(matched!==1){let titles=schema6.oneOf.map(s=>s.title||"(unnamed)").join(" | ");errs.push({path,rule:"oneOf",detail:`matched ${matched}/${schema6.oneOf.length} branches (expected exactly 1). Branches: ${titles}`})}}if(Array.isArray(schema6.anyOf)){let matched=0;for(let sub of schema6.anyOf){let candidateErrors=[];validateNode(value,sub,path,candidateErrors,context),candidateErrors.length===0&&(matched+=1)}if(matched===0){let titles=schema6.anyOf.map(sub=>sub.title||"(unnamed)").join(" | ");errs.push({path,rule:"anyOf",detail:`matched 0/${schema6.anyOf.length} branches (expected at least 1). Branches: ${titles}`})}}if(Array.isArray(schema6.allOf))for(let sub of schema6.allOf)validateNode(value,sub,path,errs,context);if(schema6.if!==void 0){let conditionErrors=[];validateNode(value,schema6.if,path,conditionErrors,context);let branch=conditionErrors.length===0?schema6.then:schema6.else;branch!==void 0&&validateNode(value,branch,path,errs,context)}if(schema6.not!==void 0){let e=[];validateNode(value,schema6.not,path,e,context),e.length===0&&errs.push({path,rule:"not",detail:"value matched a forbidden subschema"})}}},validateJson=(value,schema6,{resolveRef,base=schema6?.$id??null}={})=>{let errs=[];return validateNode(value,schema6,"$",errs,{rootSchema:schema6,resolveRef,base,referenceStack:[]}),errs};var ROOM_V3_READ_LIMITS=Object.freeze({pageBytes:8*1024*1024,eventPageBytes:1024*1024,eventPageCount:100,aggregateBytes:128*1024*1024,projectionBytes:128*1024*1024,retainedEvents:1e4}),ROOM_V3_VERSION="3.0.0";var ROOM_V3_GENESIS_HASH=`sha256:${"0".repeat(64)}`,ROOM_V3_CAPABILITIES=Object.freeze({read:"room-read",reviewer:"reviewer-write",owner:"owner-verdict",management:"room-management"});var id={type:"string",pattern:"^[A-Za-z0-9_-]{16,128}$"},token={type:"string",pattern:"^[A-Za-z0-9_-]{43}$"},sha={type:"string",pattern:"^sha256:[a-f0-9]{64}$"},digest={type:"string",pattern:"^[a-f0-9]{64}$"},integer={type:"integer",minimum:0,maximum:Number.MAX_SAFE_INTEGER},iso={type:"string",format:"date-time",maxLength:40},signature={type:"string",pattern:"^[A-Za-z0-9_-]{86}$"},closed=(properties,required=Object.keys(properties))=>({type:"object",additionalProperties:!1,properties,required}),schema=(name,properties,required)=>({$schema:"https://json-schema.org/draft/2020-12/schema",$id:`https://openplanr.dev/schemas/v1.17.0/${name}.schema.json`,"x-openplanr-contract":{id:name,version:"1.17.0"},...closed(properties,required)}),ownerKey=closed({algorithm:{const:"ECDSA-P256-SHA256"},encoding:{const:"spki-base64url"},keyId:sha,value:{type:"string",pattern:"^[A-Za-z0-9_-]+$",minLength:86,maxLength:342}}),cipher=limit=>({iv:{type:"string",pattern:"^[A-Za-z0-9_-]{16}$"},ciphertext:{type:"string",pattern:"^[A-Za-z0-9_-]+$",minLength:22,maxLength:Math.ceil(limit*4/3)}}),ROOM_V3_DESCRIPTOR_SCHEMA=schema("artifact-room-descriptor-v3",{schemaVersion:{const:ROOM_V3_VERSION},protocolVersion:{const:ROOM_V3_VERSION},roomId:id,reviewCommitment:digest,ownerKey,capabilities:closed(Object.fromEntries(Object.entries(ROOM_V3_CAPABILITIES).map(([key,value])=>[key,{const:value}]))),createdAt:iso}),ROOM_V3_CREATE_SCHEMA=schema("artifact-room-create-v3",{schemaVersion:{const:ROOM_V3_VERSION},operation:{const:"create"},roomId:id,creationId:token,ttl:{enum:["1d","7d","30d"]},reviewCommitment:digest,...cipher(5*1024*1024),ownerKey,readCapability:token,reviewerCapability:token,ownerCapability:token,manageCapability:token,signature}),ROOM_V3_EVENT_SCHEMA=schema("artifact-room-event-v3",{schemaVersion:{const:ROOM_V3_VERSION},protocolVersion:{const:ROOM_V3_VERSION},roomId:id,eventId:{type:"string",pattern:"^[A-Za-z0-9._:-]{1,128}$"},sequence:{...integer,minimum:1},predecessor:sha,kind:{enum:["pin","reply","pin_status","recommendation","owner_decision","review_snapshot"]},reviewCommitment:digest,authorRole:{enum:["owner","reviewer"]},authorKey:ownerKey,capability:{enum:["reviewer-write","owner-verdict"]},createdAt:iso,...cipher(256*1024),ciphertextDigest:sha,signature}),ROOM_V3_APPEND_SCHEMA=schema("artifact-room-append-v3",{schemaVersion:{const:ROOM_V3_VERSION},operation:{const:"append"},expectedGeneration:integer,record:ROOM_V3_EVENT_SCHEMA}),ROOM_V3_READ_PAGE_SCHEMA=schema("artifact-room-read-page-v3",{version:{const:"v3"},descriptor:ROOM_V3_DESCRIPTOR_SCHEMA,expiresAt:iso,commentsEnabled:{type:"boolean"},generation:integer,sequence:{...integer,maximum:ROOM_V3_READ_LIMITS.retainedEvents},head:sha,cursor:{...integer,maximum:ROOM_V3_READ_LIMITS.retainedEvents},eventBytes:{...integer,maximum:ROOM_V3_READ_LIMITS.eventPageBytes},events:{type:"array",maxItems:ROOM_V3_READ_LIMITS.eventPageCount,items:ROOM_V3_EVENT_SCHEMA},nextCursor:{oneOf:[{...integer,minimum:1,maximum:ROOM_V3_READ_LIMITS.retainedEvents},{type:"null"}]},...cipher(5*1024*1024)},["version","descriptor","expiresAt","commentsEnabled","generation","sequence","head","cursor","eventBytes","events","nextCursor"]),ROOM_V3_MANAGEMENT_SCHEMA=schema("artifact-room-management-v3",{schemaVersion:{const:ROOM_V3_VERSION},roomId:id,operation:{enum:["pause","resume","delete"]},operationId:id,expectedGeneration:integer,signature}),PASTE_V2_SCHEMA=schema("artifact-paste-v2",{schemaVersion:{const:"2.0.0"},operation:{const:"create"},id,creationId:token,ttl:{enum:["1d","7d","30d"]},...cipher(5*1024*1024)}),SHARING_CRYPTO_AAD_SCHEMA=schema("sharing-crypto-aad",{version:{const:"2.0.0"},purpose:{enum:["artifact-paste","room-envelope","room-event"]},objectId:id,recordId:{type:"string",pattern:"^[A-Za-z0-9._:-]{1,128}$"}}),PREVIEW_BRIDGE_MESSAGE_SCHEMA={$schema:"https://json-schema.org/draft/2020-12/schema",$id:"https://openplanr.dev/schemas/v1.17.0/preview-bridge-message.schema.json","x-openplanr-contract":{id:"preview-bridge-message",version:"1.17.0"},oneOf:[schema("preview-bridge-ready",{schemaVersion:{const:"1.0.0"},channel:token,type:{const:"ready"},viewId:id}),schema("preview-bridge-navigate",{schemaVersion:{const:"1.0.0"},channel:token,type:{const:"navigate"},viewId:id,screenId:id}),schema("preview-bridge-select",{schemaVersion:{const:"1.0.0"},channel:token,type:{const:"select"},viewId:id,elementId:id}),schema("preview-bridge-state",{schemaVersion:{const:"1.0.0"},channel:token,type:{const:"state"},viewId:id,state:closed({session:{type:"object"},forms:{type:"object"}})}),schema("preview-bridge-failed",{schemaVersion:{const:"1.0.0"},channel:token,type:{const:"failed"},viewId:id})]};for(let alternative of PREVIEW_BRIDGE_MESSAGE_SCHEMA.oneOf)for(let key of["viewId","screenId","elementId"])alternative.properties[key]&&(alternative.properties[key]={type:"string",pattern:"^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"});function assertPreviewBridgeMessage(value){if(assertLargeObjectData(value),validateJson(value,PREVIEW_BRIDGE_MESSAGE_SCHEMA).length)throw new TypeError("Invalid preview bridge message.");if(value.type==="state"){let keys=0,pending=[[value.state,0]],seen=new Set;for(let entry=pending.pop();entry;entry=pending.pop()){let[item2,depth]=entry;if(depth>6)throw new RangeError("Preview state exceeds its depth limit.");if(!(item2===null||typeof item2=="boolean")){if(typeof item2=="number"){if(!Number.isFinite(item2))throw new TypeError("Preview state numbers must be finite.");continue}if(typeof item2=="string"){if(item2.length>8192)throw new RangeError("Preview state string is too long.");continue}if(!item2||typeof item2!="object"||seen.has(item2))throw new TypeError("Preview state must be acyclic JSON.");if(seen.add(item2),Array.isArray(item2)){if(item2.length>128)throw new RangeError("Preview state array is too long.");for(let child of item2)pending.push([child,depth+1])}else{if(Object.getPrototypeOf(item2)!==Object.prototype&&Object.getPrototypeOf(item2)!==null)throw new TypeError("Preview state must be plain JSON.");for(let[key,descriptor]of Object.entries(Object.getOwnPropertyDescriptors(item2))){if(++keys>128||key.length>256||["__proto__","constructor","prototype"].includes(key)||!("value"in descriptor))throw new TypeError("Preview state key is invalid.");pending.push([descriptor.value,depth+1])}}}}if(new TextEncoder().encode(canonicalizeJson(value.state)).byteLength>16384)throw new RangeError("Preview state exceeds its byte limit.")}return value}var SHARING_SECURITY_SCHEMAS=Object.freeze({"preview-bridge-message":PREVIEW_BRIDGE_MESSAGE_SCHEMA,"artifact-room-descriptor-v3":ROOM_V3_DESCRIPTOR_SCHEMA,"artifact-room-create-v3":ROOM_V3_CREATE_SCHEMA,"artifact-room-read-page-v3":ROOM_V3_READ_PAGE_SCHEMA,"artifact-room-append-v3":ROOM_V3_APPEND_SCHEMA,"artifact-room-event-v3":ROOM_V3_EVENT_SCHEMA,"artifact-room-management-v3":ROOM_V3_MANAGEMENT_SCHEMA,"artifact-paste-v2":PASTE_V2_SCHEMA,"sharing-crypto-aad":SHARING_CRYPTO_AAD_SCHEMA});function decode(value,limit){if(!/^[A-Za-z0-9_-]+$/u.test(value)||value.length>Math.ceil(limit*4/3))throw new TypeError("Invalid room encoding.");let bytes=Uint8Array.from(atob(value.replaceAll("-","+").replaceAll("_","/")),char=>char.charCodeAt(0)),binary="";for(let offset=0;offset<bytes.length;offset+=8192)binary+=String.fromCharCode(...bytes.subarray(offset,offset+8192));if(btoa(binary).replaceAll("+","-").replaceAll("/","_").replace(/=+$/u,"")!==value||bytes.byteLength>limit)throw new TypeError("Noncanonical room encoding.");return bytes}function assertSharingSecurityContract(value,kind){if(kind==="preview-bridge-message")return assertPreviewBridgeMessage(value);assertLargeObjectData(value);let selected=Object.hasOwn(SHARING_SECURITY_SCHEMAS,kind)?SHARING_SECURITY_SCHEMAS[kind]:null;if(!selected||validateJson(value,selected).length)throw new TypeError(`Invalid ${kind}.`);if(kind==="artifact-room-append-v3"&&assertSharingSecurityContract(value.record,"artifact-room-event-v3"),kind==="artifact-room-read-page-v3"){let actual=new TextEncoder().encode(canonicalizeJson(value.events)).byteLength;if(actual!==value.eventBytes||actual>ROOM_V3_READ_LIMITS.eventPageBytes||new TextEncoder().encode(canonicalizeJson(value)).byteLength>ROOM_V3_READ_LIMITS.pageBytes||value.cursor>value.sequence||value.generation<value.sequence)throw new TypeError("Room page byte accounting or snapshot is invalid.");if(value.cursor===0?!value.iv||!value.ciphertext:Object.hasOwn(value,"iv")||Object.hasOwn(value,"ciphertext"))throw new TypeError("Only the first room page carries its envelope.");let last=value.cursor;for(let event of value.events){if(event.sequence!==last+1)throw new TypeError("Room page skips event history.");last=event.sequence}if(last>value.sequence||(value.nextCursor===null?last!==value.sequence:!value.events.length||value.nextCursor!==last||last>=value.sequence))throw new TypeError("Room page continuation is incomplete.")}if(value.ciphertext&&decode(value.ciphertext,kind==="artifact-room-event-v3"?262144:5242880).byteLength<16)throw new TypeError("Room ciphertext is too small.");if(kind==="artifact-room-create-v3"&&new Set([value.readCapability,value.reviewerCapability,value.ownerCapability,value.manageCapability]).size!==4)throw new TypeError("Room capabilities must be distinct.");if(kind==="artifact-room-event-v3"){let ownerKind=["owner_decision","review_snapshot"].includes(value.kind);if(value.authorRole==="owner"!==ownerKind||value.capability!==ROOM_V3_CAPABILITIES[value.authorRole])throw new TypeError("Room event role is invalid.")}return value}var ENTERPRISE_CONTRACT_VERSION="1.0.0",ENTERPRISE_PROTOCOL_VERSION="1.12.0";var ENTERPRISE_ID_PATTERN="^[A-Za-z0-9][A-Za-z0-9_-]{0,127}(?![\\s\\S])",ENTERPRISE_REVIEW_CATEGORIES=Object.freeze(["question","suggestion","change-request","blocker"]),ENTERPRISE_ACTIONS=Object.freeze(["organization.manage","ownership.transfer","billing.manage","audit.read","project.create","project.manage","artifact.read","artifact.author","artifact.export","review.write","review.resolve"]),id2={type:"string",pattern:ENTERPRISE_ID_PATTERN},semanticId={type:"string",minLength:1,maxLength:512,pattern:"^[^\\s\\u0000-\\u001f\\u007f]+$"},nullableId={anyOf:[id2,{type:"null"}]},digest2={type:"string",minLength:64,maxLength:64,pattern:"^[a-f0-9]{64}$"},timestamp={type:"string",format:"date-time",pattern:"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{3})?Z$"},text2={type:"string",minLength:1,maxLength:16384},title={...text2,maxLength:240},closed2=(properties,required=Object.keys(properties))=>({type:"object",additionalProperties:!1,properties,required}),list=(items,maxItems=1e3)=>({type:"array",items,maxItems}),schema2=(name,properties,required)=>({$schema:"https://json-schema.org/draft/2020-12/schema",$id:`https://openplanr.dev/schemas/v1.12.0/${name}.schema.json`,"x-openplanr-contract":{id:name,version:ENTERPRISE_PROTOCOL_VERSION},...closed2(properties,required)}),envelope=kind=>({kind:{const:`openplanr-${kind}`},schemaVersion:{const:ENTERPRISE_CONTRACT_VERSION}}),scoped={organizationId:id2,projectId:id2},versionedArtifact={...scoped,artifactId:id2,revisionId:id2},activeStatus={enum:["active","revoked"]},projectRole={enum:["maintainer","author","reviewer","viewer"]},ENTERPRISE_ACCESS_CONTEXT_SCHEMA=schema2("enterprise-access-context",{actor:closed2({id:id2,verified:{type:"boolean"}}),organization:closed2({id:id2,status:{enum:["active","suspended"]}}),membership:closed2({organizationId:id2,actorId:id2,role:{enum:["owner","admin","member"]},status:activeStatus}),projectMembership:closed2({...scoped,actorId:id2,role:projectRole,status:activeStatus}),guestGrant:closed2({...scoped,artifactId:id2,actorId:id2,role:{enum:["reviewer","viewer"]},status:activeStatus,expiresAt:timestamp}),resource:closed2({organizationId:id2,projectId:id2,artifactId:id2},["organizationId"]),action:{enum:ENTERPRISE_ACTIONS},now:timestamp},["actor","organization","resource","action","now"]),ENTERPRISE_ARTIFACT_REVISION_SCHEMA=schema2("enterprise-artifact-revision",{...envelope("enterprise-artifact-revision"),id:id2,...scoped,artifactId:id2,parentRevisionId:nullableId,contentDigest:digest2,contentType:{enum:["application/json","text/markdown","image/svg+xml","text/html"]},byteLength:{type:"integer",minimum:0,maximum:5*1024*1024},createdAt:timestamp,actorId:id2}),ENTERPRISE_REVIEW_ANCHOR_SCHEMA={...closed2({revisionId:id2,elementId:semanticId,screenId:semanticId,frameId:semanticId,x:{type:"number",minimum:0,maximum:1},y:{type:"number",minimum:0,maximum:1}},["revisionId"]),anyOf:[{required:["elementId"]},{required:["screenId","frameId"]},{required:["x","y"]}],allOf:[{if:{required:["x"]},then:{required:["y"]}},{if:{required:["y"]},then:{required:["x"]}},{if:{required:["frameId"]},then:{required:["screenId"]}}]},reply=closed2({id:id2,authorId:id2,body:text2,createdAt:timestamp}),ENTERPRISE_REVIEW_THREAD_SCHEMA={...schema2("enterprise-review-thread",{...envelope("enterprise-review-thread"),id:id2,...scoped,artifactId:id2,anchor:ENTERPRISE_REVIEW_ANCHOR_SCHEMA,category:{enum:ENTERPRISE_REVIEW_CATEGORIES},status:{enum:["open","addressed","resolved"]},authorId:id2,body:text2,createdAt:timestamp,updatedAt:timestamp,replies:list(reply,1e4),assigneeId:nullableId,addressedRevisionId:id2,resolvedAt:timestamp},["kind","schemaVersion","id","organizationId","projectId","artifactId","anchor","category","status","authorId","body","createdAt","updatedAt","replies"]),allOf:[{if:{properties:{status:{const:"addressed"}}},then:{required:["addressedRevisionId"],not:{required:["resolvedAt"]}}},{if:{properties:{status:{const:"resolved"}}},then:{required:["resolvedAt"]},else:{not:{required:["resolvedAt"]}}}]},collection={enum:["nodes","relations","groups","events","items"]},ENTERPRISE_CHANGE_OPERATION_SCHEMA={oneOf:[closed2({op:{const:"replace-document"},content:{type:"object"}}),closed2({op:{const:"set-field"},targetId:semanticId,field:{enum:["label","description","status","title"]},value:{type:"string",maxLength:16384}}),closed2({op:{const:"add-element"},collection,element:{type:"object",required:["id"],properties:{id:semanticId},additionalProperties:!0}}),closed2({op:{const:"remove-element"},collection,targetId:semanticId}),closed2({op:{const:"set-layout"},targetId:semanticId,x:{type:"number",minimum:-1e7,maximum:1e7},y:{type:"number",minimum:-1e7,maximum:1e7}})]},ENTERPRISE_CHANGE_PROPOSAL_SCHEMA={...schema2("enterprise-change-proposal",{...envelope("enterprise-change-proposal"),id:id2,...scoped,artifactId:id2,baseRevisionId:id2,authorId:id2,createdAt:timestamp,status:{enum:["draft","proposed","accepted","rejected","applied","conflicted"]},summary:title,operations:{...list(ENTERPRISE_CHANGE_OPERATION_SCHEMA,1e3),minItems:1},validation:closed2({status:{enum:["pending","passed","failed"]},issues:list(closed2({code:id2,message:text2,targetId:semanticId},["code","message"]))}),application:closed2({revisionId:id2,appliedAt:timestamp,actorId:id2,gitCommit:{type:"string",pattern:"^(?:[a-f0-9]{40}|[a-f0-9]{64})$"}},["revisionId","appliedAt","actorId"])},["kind","schemaVersion","id","organizationId","projectId","artifactId","baseRevisionId","authorId","createdAt","status","summary","operations","validation"]),allOf:[{if:{properties:{status:{const:"applied"}}},then:{required:["application"],properties:{validation:{properties:{status:{const:"passed"}}}}},else:{not:{required:["application"]}}},{if:{properties:{status:{const:"accepted"}}},then:{properties:{validation:{properties:{status:{const:"passed"}}}}}}]},ENTERPRISE_EVIDENCE_REFERENCE_SCHEMA=schema2("enterprise-evidence-reference",{...envelope("enterprise-evidence-reference"),id:id2,...scoped,source:{oneOf:[closed2({kind:{const:"repository"},repositoryId:id2,path:text2,commit:{type:"string",pattern:"^(?:[a-f0-9]{40}|[a-f0-9]{64})$"},line:{type:"integer",minimum:1,maximum:1e9}},["kind","repositoryId","path","commit"]),closed2({kind:{const:"artifact"},artifactId:id2,revisionId:id2,elementId:semanticId},["kind","artifactId","revisionId"]),closed2({kind:{const:"url"},url:{type:"string",minLength:1,maxLength:2048}})]},capturedAt:timestamp,freshness:{enum:["current","stale","unknown"]},label:title,contentDigest:digest2},["kind","schemaVersion","id","organizationId","projectId","source","capturedAt","freshness","label"]),ENTERPRISE_SYNC_STATE_SCHEMA=schema2("enterprise-sync-state",{...envelope("enterprise-sync-state"),...scoped,repositoryId:id2,direction:{enum:["push","pull"]},status:{enum:["preview","pending","synchronized","failed","conflicted"]},scope:{...list(id2,1e4),uniqueItems:!0},cursor:{type:["string","null"],maxLength:2048},operationId:id2,updatedAt:timestamp,items:list(closed2({artifactId:id2,baseRevisionId:nullableId,revisionId:nullableId,contentDigest:digest2,action:{enum:["create","update","unchanged","conflict"]}}),1e4),issues:list(closed2({code:id2,artifactId:id2,message:text2},["code","message"]))}),ENTERPRISE_AGENT_HANDOFF_SCHEMA=schema2("enterprise-agent-handoff",{...envelope("enterprise-agent-handoff"),...versionedArtifact,generatedAt:timestamp,authority:{const:"feedback-only"},contentTrust:{const:"untrusted"},threads:list(ENTERPRISE_REVIEW_THREAD_SCHEMA,1e4),evidence:list(ENTERPRISE_EVIDENCE_REFERENCE_SCHEMA,1e4),unresolvedUncertainties:list(text2),contentDigest:digest2}),ENTERPRISE_SCHEMAS=deepFreeze({"enterprise-access-context":ENTERPRISE_ACCESS_CONTEXT_SCHEMA,"enterprise-artifact-revision":ENTERPRISE_ARTIFACT_REVISION_SCHEMA,"enterprise-review-thread":ENTERPRISE_REVIEW_THREAD_SCHEMA,"enterprise-change-proposal":ENTERPRISE_CHANGE_PROPOSAL_SCHEMA,"enterprise-evidence-reference":ENTERPRISE_EVIDENCE_REFERENCE_SCHEMA,"enterprise-sync-state":ENTERPRISE_SYNC_STATE_SCHEMA,"enterprise-agent-handoff":ENTERPRISE_AGENT_HANDOFF_SCHEMA});var projectCapabilities=deepFreeze({maintainer:["project.manage","artifact.read","artifact.author","artifact.export","review.write","review.resolve"],author:["artifact.read","artifact.author","artifact.export","review.write","review.resolve"],reviewer:["artifact.read","artifact.export","review.write"],viewer:["artifact.read","artifact.export"]}),noCapabilities=Object.freeze([]);var organizationCapabilities=deepFreeze({owner:["organization.manage","ownership.transfer","billing.manage","audit.read","project.create"],admin:["organization.manage","billing.manage","audit.read","project.create"],member:[]});var editableCollections=Object.freeze(["nodes","relations","groups","events","items"]),identityCollections=Object.freeze([...editableCollections,"lanes","series","axes","sets","annotations"]);var opaqueRevisionId={type:"string",pattern:"^[A-Za-z0-9_-]{22,64}$"};function copySchema(value){return structuredClone(value)}var anchor=copySchema(ENTERPRISE_REVIEW_ANCHOR_SCHEMA),revisionId={anyOf:[opaqueRevisionId,anchor.properties.revisionId]},nullableRevisionId={anyOf:[revisionId,{type:"null"}]};function successor(source,name){let value=structuredClone(source);return value.$id=`https://openplanr.dev/schemas/v1.17.0/${name}.schema.json`,value["x-openplanr-contract"]={id:name,version:"1.17.0"},value.properties.schemaVersion={const:"1.1.0"},value.properties.protocolVersion={const:"1.17.0"},value.required.push("protocolVersion"),value}var ENTERPRISE_REVIEW_ANCHOR_V11_SCHEMA=deepFreeze({...anchor,properties:{...anchor.properties,revisionId}}),thread=successor(ENTERPRISE_REVIEW_THREAD_SCHEMA,"enterprise-review-thread");thread.properties.anchor=ENTERPRISE_REVIEW_ANCHOR_V11_SCHEMA;thread.properties.addressedRevisionId=revisionId;var ENTERPRISE_REVIEW_THREAD_V11_SCHEMA=deepFreeze(thread),proposal=successor(ENTERPRISE_CHANGE_PROPOSAL_SCHEMA,"enterprise-change-proposal");proposal.properties.baseRevisionId=revisionId;proposal.properties.application.properties.revisionId=revisionId;var ENTERPRISE_CHANGE_PROPOSAL_V11_SCHEMA=deepFreeze(proposal),evidence=successor(ENTERPRISE_EVIDENCE_REFERENCE_SCHEMA,"enterprise-evidence-reference");evidence.properties.source.oneOf.find(branch=>branch.properties.kind.const==="artifact").properties.revisionId=revisionId;var ENTERPRISE_EVIDENCE_REFERENCE_V11_SCHEMA=deepFreeze(evidence),sync=successor(ENTERPRISE_SYNC_STATE_SCHEMA,"enterprise-sync-state");sync.properties.items.items.properties.baseRevisionId=nullableRevisionId;sync.properties.items.items.properties.revisionId=nullableRevisionId;var ENTERPRISE_SYNC_STATE_V11_SCHEMA=deepFreeze(sync),handoff=successor(ENTERPRISE_AGENT_HANDOFF_SCHEMA,"enterprise-agent-handoff");handoff.properties.revisionId=revisionId;handoff.properties.threads.items={oneOf:[ENTERPRISE_REVIEW_THREAD_SCHEMA,ENTERPRISE_REVIEW_THREAD_V11_SCHEMA]};handoff.properties.evidence.items={oneOf:[ENTERPRISE_EVIDENCE_REFERENCE_SCHEMA,ENTERPRISE_EVIDENCE_REFERENCE_V11_SCHEMA]};var ENTERPRISE_AGENT_HANDOFF_V11_SCHEMA=deepFreeze(handoff),ENTERPRISE_RESOURCE_SCHEMAS=deepFreeze({"enterprise-review-thread":ENTERPRISE_REVIEW_THREAD_V11_SCHEMA,"enterprise-change-proposal":ENTERPRISE_CHANGE_PROPOSAL_V11_SCHEMA,"enterprise-evidence-reference":ENTERPRISE_EVIDENCE_REFERENCE_V11_SCHEMA,"enterprise-sync-state":ENTERPRISE_SYNC_STATE_V11_SCHEMA,"enterprise-agent-handoff":ENTERPRISE_AGENT_HANDOFF_V11_SCHEMA});var deepFreeze2=value=>{if(value&&typeof value=="object"&&!Object.isFrozen(value)){for(let nested of Object.values(value))deepFreeze2(nested);Object.freeze(value)}return value},DIAGRAM_REGISTRIES=deepFreeze2({"diagram-grammars.json":{kind:"diagram-type-registry",schemaVersion:"1.0.0",protocolVersion:"1.6.0",documentVersion:"1.0.0",digestAlgorithm:"sha256",canonicalization:"rfc8785",registryVersion:"1.0.0",primitives:["node","relation","group","lane","event","series","axis","set","annotation","emphasis"],layoutFamilies:["cause-effect","chart","chronology","containment","entity","graph","hierarchy","lanes","sankey","wardley"],grammars:[{grammarId:"architecture",grammarVersion:"1.0.0",title:"Architecture",summary:"Architecture semantic grammar using the graph layout family.",layoutFamily:"graph",aliases:["system architecture","software architecture","components"],requiredPrimitives:["node"],allowedPrimitives:["node","relation","group","annotation","emphasis"],directions:["top-down","left-right","right-left","bottom-up","radial"],detailLimits:{simplified:7,balanced:12,faithful:24,hard:24},readability:{maxLabelCharacters:80,maxCrossings:12,maxFanIn:6,minTextSize:12,aspectRatios:["fit","doc-wide","slide-16x9"]},projections:{mermaid:"partial",excalidraw:"editable"},fixture:"fixtures/diagram/grammars/architecture.planr-diagram.json",reference:"references/diagram/architecture.md",rendererContract:{layoutFamily:"graph",contractVersion:"1.0.0",staticByDefault:!0},accessibilityTemplate:{title:"Architecture diagram",description:"Diagram content for the architecture grammar in semantic reading order."}},{grammarId:"it-current-state",grammarVersion:"1.0.0",title:"IT current state",summary:"IT current state semantic grammar using the graph layout family.",layoutFamily:"graph",aliases:["legacy landscape","current state","modernization"],requiredPrimitives:["node"],allowedPrimitives:["node","relation","group","annotation","emphasis"],directions:["top-down","left-right","right-left","bottom-up","radial"],detailLimits:{simplified:7,balanced:12,faithful:24,hard:24},readability:{maxLabelCharacters:80,maxCrossings:12,maxFanIn:6,minTextSize:12,aspectRatios:["fit","doc-wide","slide-16x9"]},projections:{mermaid:"partial",excalidraw:"editable"},fixture:"fixtures/diagram/grammars/it-current-state.planr-diagram.json",reference:"references/diagram/it-current-state.md",rendererContract:{layoutFamily:"graph",contractVersion:"1.0.0",staticByDefault:!0},accessibilityTemplate:{title:"IT current state diagram",description:"Diagram content for the it current state grammar in semantic reading order."}},{grammarId:"flowchart",grammarVersion:"1.0.0",title:"Flowchart",summary:"Flowchart semantic grammar using the graph layout family.",layoutFamily:"graph",aliases:["decision flow","workflow","process flow"],requiredPrimitives:["node"],allowedPrimitives:["node","relation","group","annotation","emphasis"],directions:["top-down","left-right","right-left","bottom-up","radial"],detailLimits:{simplified:7,balanced:12,faithful:24,hard:24},readability:{maxLabelCharacters:80,maxCrossings:12,maxFanIn:6,minTextSize:12,aspectRatios:["fit","doc-wide","slide-16x9"]},projections:{mermaid:"editable",excalidraw:"editable"},fixture:"fixtures/diagram/grammars/flowchart.planr-diagram.json",reference:"references/diagram/flowchart.md",rendererContract:{layoutFamily:"graph",contractVersion:"1.0.0",staticByDefault:!0},accessibilityTemplate:{title:"Flowchart diagram",description:"Diagram content for the flowchart grammar in semantic reading order."}},{grammarId:"sequence",grammarVersion:"1.0.0",title:"Sequence",summary:"Sequence semantic grammar using the chronology layout family.",layoutFamily:"chronology",aliases:["message sequence","interaction sequence","request trace"],requiredPrimitives:["node","relation","event"],allowedPrimitives:["node","relation","event","annotation","emphasis"],directions:["top-down","left-right","right-left","bottom-up","radial"],detailLimits:{simplified:7,balanced:12,faithful:24,hard:24},readability:{maxLabelCharacters:80,maxCrossings:12,maxFanIn:6,minTextSize:12,aspectRatios:["fit","doc-wide","slide-16x9"]},projections:{mermaid:"editable",excalidraw:"editable"},fixture:"fixtures/diagram/grammars/sequence.planr-diagram.json",reference:"references/diagram/sequence.md",rendererContract:{layoutFamily:"chronology",contractVersion:"1.0.0",staticByDefault:!0},accessibilityTemplate:{title:"Sequence diagram",description:"Diagram content for the sequence grammar in semantic reading order."}},{grammarId:"state-machine",grammarVersion:"1.0.0",title:"State machine",summary:"State machine semantic grammar using the graph layout family.",layoutFamily:"graph",aliases:["state diagram","lifecycle states","transitions"],requiredPrimitives:["node"],allowedPrimitives:["node","relation","group","annotation","emphasis"],directions:["top-down","left-right","right-left","bottom-up","radial"],detailLimits:{simplified:7,balanced:12,faithful:24,hard:24},readability:{maxLabelCharacters:80,maxCrossings:12,maxFanIn:6,minTextSize:12,aspectRatios:["fit","doc-wide","slide-16x9"]},projections:{mermaid:"editable",excalidraw:"editable"},fixture:"fixtures/diagram/grammars/state-machine.planr-diagram.json",reference:"references/diagram/state-machine.md",rendererContract:{layoutFamily:"graph",contractVersion:"1.0.0",staticByDefault:!0},accessibilityTemplate:{title:"State machine diagram",description:"Diagram content for the state machine grammar in semantic reading order."}},{grammarId:"er-data-model",grammarVersion:"1.0.0",title:"ER data model",summary:"ER data model semantic grammar using the entity layout family.",layoutFamily:"entity",aliases:["entity relationship","logical data model","er diagram"],requiredPrimitives:["node"],allowedPrimitives:["node","relation","group","annotation","emphasis"],directions:["top-down","left-right","right-left","bottom-up","radial"],detailLimits:{simplified:7,balanced:12,faithful:24,hard:24},readability:{maxLabelCharacters:80,maxCrossings:12,maxFanIn:6,minTextSize:12,aspectRatios:["fit","doc-wide","slide-16x9"]},projections:{mermaid:"editable",excalidraw:"editable"},fixture:"fixtures/diagram/grammars/er-data-model.planr-diagram.json",reference:"references/diagram/er-data-model.md",rendererContract:{layoutFamily:"entity",contractVersion:"1.0.0",staticByDefault:!0},accessibilityTemplate:{title:"ER data model diagram",description:"Diagram content for the er data model grammar in semantic reading order."}},{grammarId:"timeline",grammarVersion:"1.0.0",title:"Timeline",summary:"Timeline semantic grammar using the chronology layout family.",layoutFamily:"chronology",aliases:["milestones","history","roadmap"],requiredPrimitives:["event"],allowedPrimitives:["node","relation","event","annotation","emphasis"],directions:["top-down","left-right","right-left","bottom-up","radial"],detailLimits:{simplified:7,balanced:12,faithful:24,hard:24},readability:{maxLabelCharacters:80,maxCrossings:12,maxFanIn:6,minTextSize:12,aspectRatios:["fit","doc-wide","slide-16x9"]},projections:{mermaid:"partial",excalidraw:"editable"},fixture:"fixtures/diagram/grammars/timeline.planr-diagram.json",reference:"references/diagram/timeline.md",rendererContract:{layoutFamily:"chronology",contractVersion:"1.0.0",staticByDefault:!0},accessibilityTemplate:{title:"Timeline diagram",description:"Diagram content for the timeline grammar in semantic reading order."}},{grammarId:"swimlane",grammarVersion:"1.0.0",title:"Swimlane",summary:"Swimlane semantic grammar using the lanes layout family.",layoutFamily:"lanes",aliases:["cross functional","handoff flow","responsibility lanes"],requiredPrimitives:["node","lane"],allowedPrimitives:["node","relation","lane","event","annotation","emphasis"],directions:["top-down","left-right","right-left","bottom-up","radial"],detailLimits:{simplified:7,balanced:12,faithful:24,hard:24},readability:{maxLabelCharacters:80,maxCrossings:12,maxFanIn:6,minTextSize:12,aspectRatios:["fit","doc-wide","slide-16x9"]},projections:{mermaid:"partial",excalidraw:"editable"},fixture:"fixtures/diagram/grammars/swimlane.planr-diagram.json",reference:"references/diagram/swimlane.md",rendererContract:{layoutFamily:"lanes",contractVersion:"1.0.0",staticByDefault:!0},accessibilityTemplate:{title:"Swimlane diagram",description:"Diagram content for the swimlane grammar in semantic reading order."}},{grammarId:"quadrant",grammarVersion:"1.0.0",title:"Quadrant",summary:"Quadrant semantic grammar using the chart layout family.",layoutFamily:"chart",aliases:["two axis matrix","impact effort","four quadrants"],requiredPrimitives:["node","axis"],allowedPrimitives:["node","series","axis","annotation","emphasis"],directions:["radial"],detailLimits:{simplified:7,balanced:12,faithful:24,hard:24},readability:{maxLabelCharacters:80,maxCrossings:12,maxFanIn:6,minTextSize:12,aspectRatios:["fit","doc-wide","slide-16x9"]},projections:{mermaid:"partial",excalidraw:"editable"},fixture:"fixtures/diagram/grammars/quadrant.planr-diagram.json",reference:"references/diagram/quadrant.md",rendererContract:{layoutFamily:"chart",contractVersion:"1.0.0",staticByDefault:!0},accessibilityTemplate:{title:"Quadrant diagram",description:"Diagram content for the quadrant grammar in semantic reading order."}},{grammarId:"radar",grammarVersion:"1.0.0",title:"Radar chart",summary:"Radar chart semantic grammar using the chart layout family.",layoutFamily:"chart",aliases:["spider chart","multi axis comparison"],requiredPrimitives:["series","axis"],allowedPrimitives:["node","series","axis","annotation","emphasis"],directions:["radial"],detailLimits:{simplified:7,balanced:12,faithful:24,hard:24},readability:{maxLabelCharacters:80,maxCrossings:12,maxFanIn:6,minTextSize:12,aspectRatios:["fit","doc-wide","slide-16x9"]},projections:{mermaid:"unsupported",excalidraw:"editable"},fixture:"fixtures/diagram/grammars/radar.planr-diagram.json",reference:"references/diagram/radar.md",rendererContract:{layoutFamily:"chart",contractVersion:"1.0.0",staticByDefault:!0},accessibilityTemplate:{title:"Radar chart diagram",description:"Diagram content for the radar chart grammar in semantic reading order."}},{grammarId:"polar",grammarVersion:"1.0.0",title:"Polar chart",summary:"Polar chart semantic grammar using the chart layout family.",layoutFamily:"chart",aliases:["polar area","cyclic magnitude"],requiredPrimitives:["series","axis"],allowedPrimitives:["node","series","axis","annotation","emphasis"],directions:["radial"],detailLimits:{simplified:7,balanced:12,faithful:24,hard:24},readability:{maxLabelCharacters:80,maxCrossings:12,maxFanIn:6,minTextSize:12,aspectRatios:["fit","doc-wide","slide-16x9"]},projections:{mermaid:"unsupported",excalidraw:"editable"},fixture:"fixtures/diagram/grammars/polar.planr-diagram.json",reference:"references/diagram/polar.md",rendererContract:{layoutFamily:"chart",contractVersion:"1.0.0",staticByDefault:!0},accessibilityTemplate:{title:"Polar chart diagram",description:"Diagram content for the polar chart grammar in semantic reading order."}},{grammarId:"loop-flywheel",grammarVersion:"1.0.0",title:"Loop and flywheel",summary:"Loop and flywheel semantic grammar using the graph layout family.",layoutFamily:"graph",aliases:["flywheel","reinforcing loop","feedback loop"],requiredPrimitives:["node"],allowedPrimitives:["node","relation","group","annotation","emphasis"],directions:["radial"],detailLimits:{simplified:7,balanced:12,faithful:24,hard:24},readability:{maxLabelCharacters:80,maxCrossings:12,maxFanIn:6,minTextSize:12,aspectRatios:["fit","doc-wide","slide-16x9"]},projections:{mermaid:"partial",excalidraw:"editable"},fixture:"fixtures/diagram/grammars/loop-flywheel.planr-diagram.json",reference:"references/diagram/loop-flywheel.md",rendererContract:{layoutFamily:"graph",contractVersion:"1.0.0",staticByDefault:!0},accessibilityTemplate:{title:"Loop and flywheel diagram",description:"Diagram content for the loop and flywheel grammar in semantic reading order."}},{grammarId:"nested",grammarVersion:"1.0.0",title:"Nested containment",summary:"Nested containment semantic grammar using the containment layout family.",layoutFamily:"containment",aliases:["nested boxes","containment map"],requiredPrimitives:["node","group"],allowedPrimitives:["node","relation","group","set","annotation","emphasis"],directions:["top-down","left-right","right-left","bottom-up","radial"],detailLimits:{simplified:7,balanced:12,faithful:24,hard:24},readability:{maxLabelCharacters:80,maxCrossings:12,maxFanIn:6,minTextSize:12,aspectRatios:["fit","doc-wide","slide-16x9"]},projections:{mermaid:"partial",excalidraw:"editable"},fixture:"fixtures/diagram/grammars/nested.planr-diagram.json",reference:"references/diagram/nested.md",rendererContract:{layoutFamily:"containment",contractVersion:"1.0.0",staticByDefault:!0},accessibilityTemplate:{title:"Nested containment diagram",description:"Diagram content for the nested containment grammar in semantic reading order."}},{grammarId:"tree",grammarVersion:"1.0.0",title:"Tree",summary:"Tree semantic grammar using the hierarchy layout family.",layoutFamily:"hierarchy",aliases:["hierarchy tree","parent child"],requiredPrimitives:["node"],allowedPrimitives:["node","relation","group","annotation","emphasis"],directions:["top-down","left-right","right-left","bottom-up","radial"],detailLimits:{simplified:7,balanced:12,faithful:24,hard:24},readability:{maxLabelCharacters:80,maxCrossings:12,maxFanIn:6,minTextSize:12,aspectRatios:["fit","doc-wide","slide-16x9"]},projections:{mermaid:"editable",excalidraw:"editable"},fixture:"fixtures/diagram/grammars/tree.planr-diagram.json",reference:"references/diagram/tree.md",rendererContract:{layoutFamily:"hierarchy",contractVersion:"1.0.0",staticByDefault:!0},accessibilityTemplate:{title:"Tree diagram",description:"Diagram content for the tree grammar in semantic reading order."}},{grammarId:"org-chart",grammarVersion:"1.0.0",title:"Organization chart",summary:"Organization chart semantic grammar using the hierarchy layout family.",layoutFamily:"hierarchy",aliases:["org chart","reporting lines","team structure"],requiredPrimitives:["node"],allowedPrimitives:["node","relation","group","annotation","emphasis"],directions:["top-down","left-right","right-left","bottom-up","radial"],detailLimits:{simplified:7,balanced:12,faithful:24,hard:24},readability:{maxLabelCharacters:80,maxCrossings:12,maxFanIn:6,minTextSize:12,aspectRatios:["fit","doc-wide","slide-16x9"]},projections:{mermaid:"partial",excalidraw:"editable"},fixture:"fixtures/diagram/grammars/org-chart.planr-diagram.json",reference:"references/diagram/org-chart.md",rendererContract:{layoutFamily:"hierarchy",contractVersion:"1.0.0",staticByDefault:!0},accessibilityTemplate:{title:"Organization chart diagram",description:"Diagram content for the organization chart grammar in semantic reading order."}},{grammarId:"layer-stack",grammarVersion:"1.0.0",title:"Layer stack",summary:"Layer stack semantic grammar using the hierarchy layout family.",layoutFamily:"hierarchy",aliases:["layered architecture","stacked abstractions"],requiredPrimitives:["node"],allowedPrimitives:["node","relation","group","annotation","emphasis"],directions:["top-down","left-right","right-left","bottom-up","radial"],detailLimits:{simplified:7,balanced:12,faithful:24,hard:24},readability:{maxLabelCharacters:80,maxCrossings:12,maxFanIn:6,minTextSize:12,aspectRatios:["fit","doc-wide","slide-16x9"]},projections:{mermaid:"partial",excalidraw:"editable"},fixture:"fixtures/diagram/grammars/layer-stack.planr-diagram.json",reference:"references/diagram/layer-stack.md",rendererContract:{layoutFamily:"hierarchy",contractVersion:"1.0.0",staticByDefault:!0},accessibilityTemplate:{title:"Layer stack diagram",description:"Diagram content for the layer stack grammar in semantic reading order."}},{grammarId:"venn",grammarVersion:"1.0.0",title:"Venn",summary:"Venn semantic grammar using the containment layout family.",layoutFamily:"containment",aliases:["set overlap","venn diagram"],requiredPrimitives:["set"],allowedPrimitives:["node","relation","group","set","annotation","emphasis"],directions:["radial"],detailLimits:{simplified:7,balanced:12,faithful:24,hard:24},readability:{maxLabelCharacters:80,maxCrossings:12,maxFanIn:6,minTextSize:12,aspectRatios:["fit","doc-wide","slide-16x9"]},projections:{mermaid:"unsupported",excalidraw:"editable"},fixture:"fixtures/diagram/grammars/venn.planr-diagram.json",reference:"references/diagram/venn.md",rendererContract:{layoutFamily:"containment",contractVersion:"1.0.0",staticByDefault:!0},accessibilityTemplate:{title:"Venn diagram",description:"Diagram content for the venn grammar in semantic reading order."}},{grammarId:"pyramid-funnel",grammarVersion:"1.0.0",title:"Pyramid and funnel",summary:"Pyramid and funnel semantic grammar using the hierarchy layout family.",layoutFamily:"hierarchy",aliases:["pyramid","funnel","ranked hierarchy"],requiredPrimitives:["node"],allowedPrimitives:["node","relation","group","annotation","emphasis"],directions:["top-down","left-right","right-left","bottom-up","radial"],detailLimits:{simplified:7,balanced:12,faithful:24,hard:24},readability:{maxLabelCharacters:80,maxCrossings:12,maxFanIn:6,minTextSize:12,aspectRatios:["fit","doc-wide","slide-16x9"]},projections:{mermaid:"partial",excalidraw:"editable"},fixture:"fixtures/diagram/grammars/pyramid-funnel.planr-diagram.json",reference:"references/diagram/pyramid-funnel.md",rendererContract:{layoutFamily:"hierarchy",contractVersion:"1.0.0",staticByDefault:!0},accessibilityTemplate:{title:"Pyramid and funnel diagram",description:"Diagram content for the pyramid and funnel grammar in semantic reading order."}},{grammarId:"bar",grammarVersion:"1.0.0",title:"Bar chart",summary:"Bar chart semantic grammar using the chart layout family.",layoutFamily:"chart",aliases:["bar graph","categorical comparison"],requiredPrimitives:["series","axis"],allowedPrimitives:["node","series","axis","annotation","emphasis"],directions:["top-down","left-right","right-left","bottom-up","radial"],detailLimits:{simplified:7,balanced:12,faithful:24,hard:24},readability:{maxLabelCharacters:80,maxCrossings:12,maxFanIn:6,minTextSize:12,aspectRatios:["fit","doc-wide","slide-16x9"]},projections:{mermaid:"unsupported",excalidraw:"editable"},fixture:"fixtures/diagram/grammars/bar.planr-diagram.json",reference:"references/diagram/bar.md",rendererContract:{layoutFamily:"chart",contractVersion:"1.0.0",staticByDefault:!0},accessibilityTemplate:{title:"Bar chart diagram",description:"Diagram content for the bar chart grammar in semantic reading order."}},{grammarId:"treemap",grammarVersion:"1.0.0",title:"Treemap",summary:"Treemap semantic grammar using the containment layout family.",layoutFamily:"containment",aliases:["part of whole","area hierarchy"],requiredPrimitives:["node","group"],allowedPrimitives:["node","relation","group","set","annotation","emphasis"],directions:["top-down","left-right","right-left","bottom-up","radial"],detailLimits:{simplified:7,balanced:12,faithful:24,hard:24},readability:{maxLabelCharacters:80,maxCrossings:12,maxFanIn:6,minTextSize:12,aspectRatios:["fit","doc-wide","slide-16x9"]},projections:{mermaid:"unsupported",excalidraw:"editable"},fixture:"fixtures/diagram/grammars/treemap.planr-diagram.json",reference:"references/diagram/treemap.md",rendererContract:{layoutFamily:"containment",contractVersion:"1.0.0",staticByDefault:!0},accessibilityTemplate:{title:"Treemap diagram",description:"Diagram content for the treemap grammar in semantic reading order."}},{grammarId:"line",grammarVersion:"1.0.0",title:"Line chart",summary:"Line chart semantic grammar using the chart layout family.",layoutFamily:"chart",aliases:["line graph","trend chart"],requiredPrimitives:["series","axis"],allowedPrimitives:["node","series","axis","annotation","emphasis"],directions:["top-down","left-right","right-left","bottom-up","radial"],detailLimits:{simplified:7,balanced:12,faithful:24,hard:24},readability:{maxLabelCharacters:80,maxCrossings:12,maxFanIn:6,minTextSize:12,aspectRatios:["fit","doc-wide","slide-16x9"]},projections:{mermaid:"unsupported",excalidraw:"editable"},fixture:"fixtures/diagram/grammars/line.planr-diagram.json",reference:"references/diagram/line.md",rendererContract:{layoutFamily:"chart",contractVersion:"1.0.0",staticByDefault:!0},accessibilityTemplate:{title:"Line chart diagram",description:"Diagram content for the line chart grammar in semantic reading order."}},{grammarId:"gantt",grammarVersion:"1.0.0",title:"Gantt",summary:"Gantt semantic grammar using the chronology layout family.",layoutFamily:"chronology",aliases:["gantt chart","project schedule","task timeline"],requiredPrimitives:["event"],allowedPrimitives:["node","relation","event","annotation","emphasis"],directions:["top-down","left-right","right-left","bottom-up","radial"],detailLimits:{simplified:7,balanced:12,faithful:24,hard:24},readability:{maxLabelCharacters:80,maxCrossings:12,maxFanIn:6,minTextSize:12,aspectRatios:["fit","doc-wide","slide-16x9"]},projections:{mermaid:"editable",excalidraw:"editable"},fixture:"fixtures/diagram/grammars/gantt.planr-diagram.json",reference:"references/diagram/gantt.md",rendererContract:{layoutFamily:"chronology",contractVersion:"1.0.0",staticByDefault:!0},accessibilityTemplate:{title:"Gantt diagram",description:"Diagram content for the gantt grammar in semantic reading order."}},{grammarId:"scatter",grammarVersion:"1.0.0",title:"Scatter plot",summary:"Scatter plot semantic grammar using the chart layout family.",layoutFamily:"chart",aliases:["scatter chart","correlation","distribution plot"],requiredPrimitives:["series","axis"],allowedPrimitives:["node","series","axis","annotation","emphasis"],directions:["top-down","left-right","right-left","bottom-up","radial"],detailLimits:{simplified:7,balanced:12,faithful:24,hard:24},readability:{maxLabelCharacters:80,maxCrossings:12,maxFanIn:6,minTextSize:12,aspectRatios:["fit","doc-wide","slide-16x9"]},projections:{mermaid:"unsupported",excalidraw:"editable"},fixture:"fixtures/diagram/grammars/scatter.planr-diagram.json",reference:"references/diagram/scatter.md",rendererContract:{layoutFamily:"chart",contractVersion:"1.0.0",staticByDefault:!0},accessibilityTemplate:{title:"Scatter plot diagram",description:"Diagram content for the scatter plot grammar in semantic reading order."}},{grammarId:"high-level",grammarVersion:"1.0.0",title:"High-level system view",summary:"High-level system view semantic grammar using the graph layout family.",layoutFamily:"graph",aliases:["high level architecture","end to end stack"],requiredPrimitives:["node"],allowedPrimitives:["node","relation","group","annotation","emphasis"],directions:["top-down","left-right","right-left","bottom-up","radial"],detailLimits:{simplified:7,balanced:12,faithful:24,hard:24},readability:{maxLabelCharacters:80,maxCrossings:12,maxFanIn:6,minTextSize:12,aspectRatios:["fit","doc-wide","slide-16x9"]},projections:{mermaid:"partial",excalidraw:"editable"},fixture:"fixtures/diagram/grammars/high-level.planr-diagram.json",reference:"references/diagram/high-level.md",rendererContract:{layoutFamily:"graph",contractVersion:"1.0.0",staticByDefault:!0},accessibilityTemplate:{title:"High-level system view diagram",description:"Diagram content for the high-level system view grammar in semantic reading order."}},{grammarId:"process",grammarVersion:"1.0.0",title:"Process",summary:"Process semantic grammar using the lanes layout family.",layoutFamily:"lanes",aliases:["business process","multi actor process"],requiredPrimitives:["node","relation","lane"],allowedPrimitives:["node","relation","lane","event","annotation","emphasis"],directions:["top-down","left-right","right-left","bottom-up","radial"],detailLimits:{simplified:7,balanced:12,faithful:24,hard:24},readability:{maxLabelCharacters:80,maxCrossings:12,maxFanIn:6,minTextSize:12,aspectRatios:["fit","doc-wide","slide-16x9"]},projections:{mermaid:"partial",excalidraw:"editable"},fixture:"fixtures/diagram/grammars/process.planr-diagram.json",reference:"references/diagram/process.md",rendererContract:{layoutFamily:"lanes",contractVersion:"1.0.0",staticByDefault:!0},accessibilityTemplate:{title:"Process diagram",description:"Diagram content for the process grammar in semantic reading order."}},{grammarId:"medallion",grammarVersion:"1.0.0",title:"Medallion",summary:"Medallion semantic grammar using the hierarchy layout family.",layoutFamily:"hierarchy",aliases:["bronze silver gold","data lakehouse tiers"],requiredPrimitives:["node"],allowedPrimitives:["node","relation","group","annotation","emphasis"],directions:["top-down","left-right","right-left","bottom-up","radial"],detailLimits:{simplified:7,balanced:12,faithful:24,hard:24},readability:{maxLabelCharacters:80,maxCrossings:12,maxFanIn:6,minTextSize:12,aspectRatios:["fit","doc-wide","slide-16x9"]},projections:{mermaid:"partial",excalidraw:"editable"},fixture:"fixtures/diagram/grammars/medallion.planr-diagram.json",reference:"references/diagram/medallion.md",rendererContract:{layoutFamily:"hierarchy",contractVersion:"1.0.0",staticByDefault:!0},accessibilityTemplate:{title:"Medallion diagram",description:"Diagram content for the medallion grammar in semantic reading order."}},{grammarId:"data-flow",grammarVersion:"1.0.0",title:"Data flow",summary:"Data flow semantic grammar using the graph layout family.",layoutFamily:"graph",aliases:["data pipeline","information flow"],requiredPrimitives:["node"],allowedPrimitives:["node","relation","group","annotation","emphasis"],directions:["top-down","left-right","right-left","bottom-up","radial"],detailLimits:{simplified:7,balanced:12,faithful:24,hard:24},readability:{maxLabelCharacters:80,maxCrossings:12,maxFanIn:6,minTextSize:12,aspectRatios:["fit","doc-wide","slide-16x9"]},projections:{mermaid:"partial",excalidraw:"editable"},fixture:"fixtures/diagram/grammars/data-flow.planr-diagram.json",reference:"references/diagram/data-flow.md",rendererContract:{layoutFamily:"graph",contractVersion:"1.0.0",staticByDefault:!0},accessibilityTemplate:{title:"Data flow diagram",description:"Diagram content for the data flow grammar in semantic reading order."}},{grammarId:"dp-integration",grammarVersion:"1.0.0",title:"Data platform integration",summary:"Data platform integration semantic grammar using the graph layout family.",layoutFamily:"graph",aliases:["sources core consumers","integration landscape"],requiredPrimitives:["node"],allowedPrimitives:["node","relation","group","annotation","emphasis"],directions:["top-down","left-right","right-left","bottom-up","radial"],detailLimits:{simplified:7,balanced:12,faithful:24,hard:24},readability:{maxLabelCharacters:80,maxCrossings:12,maxFanIn:6,minTextSize:12,aspectRatios:["fit","doc-wide","slide-16x9"]},projections:{mermaid:"partial",excalidraw:"editable"},fixture:"fixtures/diagram/grammars/dp-integration.planr-diagram.json",reference:"references/diagram/dp-integration.md",rendererContract:{layoutFamily:"graph",contractVersion:"1.0.0",staticByDefault:!0},accessibilityTemplate:{title:"Data platform integration diagram",description:"Diagram content for the data platform integration grammar in semantic reading order."}},{grammarId:"dp-security-matrix",grammarVersion:"1.0.0",title:"Data platform security matrix",summary:"Data platform security matrix semantic grammar using the lanes layout family.",layoutFamily:"lanes",aliases:["access matrix","role permissions"],requiredPrimitives:["node","lane"],allowedPrimitives:["node","relation","lane","event","annotation","emphasis"],directions:["top-down","left-right","right-left","bottom-up","radial"],detailLimits:{simplified:7,balanced:12,faithful:24,hard:24},readability:{maxLabelCharacters:80,maxCrossings:12,maxFanIn:6,minTextSize:12,aspectRatios:["fit","doc-wide","slide-16x9"]},projections:{mermaid:"partial",excalidraw:"editable"},fixture:"fixtures/diagram/grammars/dp-security-matrix.planr-diagram.json",reference:"references/diagram/dp-security-matrix.md",rendererContract:{layoutFamily:"lanes",contractVersion:"1.0.0",staticByDefault:!0},accessibilityTemplate:{title:"Data platform security matrix diagram",description:"Diagram content for the data platform security matrix grammar in semantic reading order."}},{grammarId:"sankey",grammarVersion:"1.0.0",title:"Sankey",summary:"Sankey semantic grammar using the sankey layout family.",layoutFamily:"sankey",aliases:["flow quantities","split and merge"],requiredPrimitives:["node","relation","series"],allowedPrimitives:["node","relation","series","annotation","emphasis"],directions:["top-down","left-right","right-left","bottom-up","radial"],detailLimits:{simplified:7,balanced:12,faithful:24,hard:24},readability:{maxLabelCharacters:80,maxCrossings:12,maxFanIn:8,minTextSize:12,aspectRatios:["fit","doc-wide","slide-16x9"]},projections:{mermaid:"unsupported",excalidraw:"editable"},fixture:"fixtures/diagram/grammars/sankey.planr-diagram.json",reference:"references/diagram/sankey.md",rendererContract:{layoutFamily:"sankey",contractVersion:"1.0.0",staticByDefault:!0},accessibilityTemplate:{title:"Sankey diagram",description:"Diagram content for the sankey grammar in semantic reading order."}},{grammarId:"fishbone",grammarVersion:"1.0.0",title:"Fishbone",summary:"Fishbone semantic grammar using the cause-effect layout family.",layoutFamily:"cause-effect",aliases:["ishikawa","cause and effect","root causes"],requiredPrimitives:["node","relation","group"],allowedPrimitives:["node","relation","group","annotation","emphasis"],directions:["top-down","left-right","right-left","bottom-up","radial"],detailLimits:{simplified:7,balanced:12,faithful:24,hard:24},readability:{maxLabelCharacters:80,maxCrossings:12,maxFanIn:6,minTextSize:12,aspectRatios:["fit","doc-wide","slide-16x9"]},projections:{mermaid:"unsupported",excalidraw:"editable"},fixture:"fixtures/diagram/grammars/fishbone.planr-diagram.json",reference:"references/diagram/fishbone.md",rendererContract:{layoutFamily:"cause-effect",contractVersion:"1.0.0",staticByDefault:!0},accessibilityTemplate:{title:"Fishbone diagram",description:"Diagram content for the fishbone grammar in semantic reading order."}},{grammarId:"wardley",grammarVersion:"1.0.0",title:"Wardley map",summary:"Wardley map semantic grammar using the wardley layout family.",layoutFamily:"wardley",aliases:["value chain evolution","wardley"],requiredPrimitives:["node","relation","axis"],allowedPrimitives:["node","relation","axis","annotation","emphasis"],directions:["top-down","left-right","right-left","bottom-up","radial"],detailLimits:{simplified:7,balanced:12,faithful:24,hard:24},readability:{maxLabelCharacters:80,maxCrossings:12,maxFanIn:6,minTextSize:12,aspectRatios:["fit","doc-wide","slide-16x9"]},projections:{mermaid:"unsupported",excalidraw:"editable"},fixture:"fixtures/diagram/grammars/wardley.planr-diagram.json",reference:"references/diagram/wardley.md",rendererContract:{layoutFamily:"wardley",contractVersion:"1.0.0",staticByDefault:!0},accessibilityTemplate:{title:"Wardley map diagram",description:"Diagram content for the wardley map grammar in semantic reading order."}},{grammarId:"kanban",grammarVersion:"1.0.0",title:"Kanban",summary:"Kanban semantic grammar using the lanes layout family.",layoutFamily:"lanes",aliases:["kanban board","work in progress"],requiredPrimitives:["node","lane"],allowedPrimitives:["node","relation","lane","event","annotation","emphasis"],directions:["top-down","left-right","right-left","bottom-up","radial"],detailLimits:{simplified:7,balanced:12,faithful:24,hard:24},readability:{maxLabelCharacters:80,maxCrossings:12,maxFanIn:6,minTextSize:12,aspectRatios:["fit","doc-wide","slide-16x9"]},projections:{mermaid:"unsupported",excalidraw:"editable"},fixture:"fixtures/diagram/grammars/kanban.planr-diagram.json",reference:"references/diagram/kanban.md",rendererContract:{layoutFamily:"lanes",contractVersion:"1.0.0",staticByDefault:!0},accessibilityTemplate:{title:"Kanban diagram",description:"Diagram content for the kanban grammar in semantic reading order."}},{grammarId:"user-journey",grammarVersion:"1.0.0",title:"User journey",summary:"User journey semantic grammar using the lanes layout family.",layoutFamily:"lanes",aliases:["customer journey","experience map"],requiredPrimitives:["event","lane"],allowedPrimitives:["node","relation","lane","event","annotation","emphasis"],directions:["top-down","left-right","right-left","bottom-up","radial"],detailLimits:{simplified:7,balanced:12,faithful:24,hard:24},readability:{maxLabelCharacters:80,maxCrossings:12,maxFanIn:6,minTextSize:12,aspectRatios:["fit","doc-wide","slide-16x9"]},projections:{mermaid:"partial",excalidraw:"editable"},fixture:"fixtures/diagram/grammars/user-journey.planr-diagram.json",reference:"references/diagram/user-journey.md",rendererContract:{layoutFamily:"lanes",contractVersion:"1.0.0",staticByDefault:!0},accessibilityTemplate:{title:"User journey diagram",description:"Diagram content for the user journey grammar in semantic reading order."}},{grammarId:"deployment",grammarVersion:"1.0.0",title:"Deployment",summary:"Deployment semantic grammar using the containment layout family.",layoutFamily:"containment",aliases:["deployment diagram","zones hosts artifacts"],requiredPrimitives:["node","group"],allowedPrimitives:["node","relation","group","set","annotation","emphasis"],directions:["top-down","left-right","right-left","bottom-up","radial"],detailLimits:{simplified:7,balanced:12,faithful:24,hard:24},readability:{maxLabelCharacters:80,maxCrossings:12,maxFanIn:6,minTextSize:12,aspectRatios:["fit","doc-wide","slide-16x9"]},projections:{mermaid:"partial",excalidraw:"editable"},fixture:"fixtures/diagram/grammars/deployment.planr-diagram.json",reference:"references/diagram/deployment.md",rendererContract:{layoutFamily:"containment",contractVersion:"1.0.0",staticByDefault:!0},accessibilityTemplate:{title:"Deployment diagram",description:"Diagram content for the deployment grammar in semantic reading order."}},{grammarId:"dependency-graph",grammarVersion:"1.0.0",title:"Dependency graph",summary:"Dependency graph semantic grammar using the graph layout family.",layoutFamily:"graph",aliases:["dependencies","fan in graph","package graph"],requiredPrimitives:["node"],allowedPrimitives:["node","relation","group","annotation","emphasis"],directions:["top-down","left-right","right-left","bottom-up","radial"],detailLimits:{simplified:7,balanced:12,faithful:24,hard:24},readability:{maxLabelCharacters:80,maxCrossings:12,maxFanIn:10,minTextSize:12,aspectRatios:["fit","doc-wide","slide-16x9"]},projections:{mermaid:"editable",excalidraw:"editable"},fixture:"fixtures/diagram/grammars/dependency-graph.planr-diagram.json",reference:"references/diagram/dependency-graph.md",rendererContract:{layoutFamily:"graph",contractVersion:"1.0.0",staticByDefault:!0},accessibilityTemplate:{title:"Dependency graph diagram",description:"Diagram content for the dependency graph grammar in semantic reading order."}},{grammarId:"uml-class",grammarVersion:"1.0.0",title:"UML class",summary:"UML class semantic grammar using the entity layout family.",layoutFamily:"entity",aliases:["class diagram","typed relations"],requiredPrimitives:["node"],allowedPrimitives:["node","relation","group","annotation","emphasis"],directions:["top-down","left-right","right-left","bottom-up","radial"],detailLimits:{simplified:7,balanced:12,faithful:24,hard:24},readability:{maxLabelCharacters:80,maxCrossings:12,maxFanIn:6,minTextSize:12,aspectRatios:["fit","doc-wide","slide-16x9"]},projections:{mermaid:"editable",excalidraw:"editable"},fixture:"fixtures/diagram/grammars/uml-class.planr-diagram.json",reference:"references/diagram/uml-class.md",rendererContract:{layoutFamily:"entity",contractVersion:"1.0.0",staticByDefault:!0},accessibilityTemplate:{title:"UML class diagram",description:"Diagram content for the uml class grammar in semantic reading order."}},{grammarId:"story-map",grammarVersion:"1.0.0",title:"Story map",summary:"Story map semantic grammar using the lanes layout family.",layoutFamily:"lanes",aliases:["user story map","release slices"],requiredPrimitives:["node","lane"],allowedPrimitives:["node","relation","lane","event","annotation","emphasis"],directions:["top-down","left-right","right-left","bottom-up","radial"],detailLimits:{simplified:7,balanced:12,faithful:24,hard:24},readability:{maxLabelCharacters:80,maxCrossings:12,maxFanIn:6,minTextSize:12,aspectRatios:["fit","doc-wide","slide-16x9"]},projections:{mermaid:"unsupported",excalidraw:"editable"},fixture:"fixtures/diagram/grammars/story-map.planr-diagram.json",reference:"references/diagram/story-map.md",rendererContract:{layoutFamily:"lanes",contractVersion:"1.0.0",staticByDefault:!0},accessibilityTemplate:{title:"Story map diagram",description:"Diagram content for the story map grammar in semantic reading order."}},{grammarId:"database-schema",grammarVersion:"1.0.0",title:"Database schema",summary:"Database schema semantic grammar using the entity layout family.",layoutFamily:"entity",aliases:["physical schema","database tables","foreign keys"],requiredPrimitives:["node"],allowedPrimitives:["node","relation","group","annotation","emphasis"],directions:["top-down","left-right","right-left","bottom-up","radial"],detailLimits:{simplified:7,balanced:12,faithful:24,hard:24},readability:{maxLabelCharacters:80,maxCrossings:12,maxFanIn:6,minTextSize:12,aspectRatios:["fit","doc-wide","slide-16x9"]},projections:{mermaid:"editable",excalidraw:"editable"},fixture:"fixtures/diagram/grammars/database-schema.planr-diagram.json",reference:"references/diagram/database-schema.md",rendererContract:{layoutFamily:"entity",contractVersion:"1.0.0",staticByDefault:!0},accessibilityTemplate:{title:"Database schema diagram",description:"Diagram content for the database schema grammar in semantic reading order."}}],documentDigest:"sha256:f78d668b7cf01ba9c0dacbe64b6e7a1b19c6dc7e5855c9861594beb3d6984653"},"diagram-semantic-patterns.json":{kind:"diagram-semantic-pattern-registry",schemaVersion:"1.0.0",protocolVersion:"1.6.0",documentVersion:"1.0.0",digestAlgorithm:"sha256",canonicalization:"rfc8785",patterns:[{patternId:"fan-in-bottleneck",patternVersion:"1.0.0",triggers:["queue","bottleneck","fan in"],candidateGrammars:["dependency-graph","sankey","data-flow"],selection:"rank-only"},{patternId:"repeated-stages",patternVersion:"1.0.0",triggers:["stages","pipeline slots","repeat"],candidateGrammars:["process","swimlane","data-flow"],selection:"rank-only"},{patternId:"unstructured-transformation",patternVersion:"1.0.0",triggers:["unstructured input","transform","normalize"],candidateGrammars:["data-flow","dp-integration"],selection:"rank-only"},{patternId:"paired-policy-trace",patternVersion:"1.0.0",triggers:["policy trace","allow deny","decision path"],candidateGrammars:["sequence","flowchart"],selection:"rank-only"},{patternId:"secure-paved-road",patternVersion:"1.0.0",triggers:["secure path","paved road","guardrails"],candidateGrammars:["architecture","deployment"],selection:"rank-only"},{patternId:"governance-catalog",patternVersion:"1.0.0",triggers:["catalog","governance","ownership"],candidateGrammars:["tree","org-chart","layer-stack"],selection:"rank-only"},{patternId:"compensating-layers",patternVersion:"1.0.0",triggers:["defense in depth","compensating controls"],candidateGrammars:["layer-stack","dp-security-matrix"],selection:"rank-only"}],documentDigest:"sha256:36a925bd1be54ef9a80ccd44039c9390dd7c4cc00185dbc03ba01be8997e222f"}});var DIAGRAM_EDIT_OPERATION_CLASSES=deepFreeze(["insert-elements","update-semantics","remove-elements","set-membership-order","set-geometry","set-appearance-locks"]),DIAGRAM_AUTHORING_LIMITS=deepFreeze({depth:48,values:5e5,textCodeUnits:8388608,sourceBytes:1048576,elements:1e4,operations:256,coordinate:1e6}),closed3=(properties,required=Object.keys(properties))=>({type:"object",additionalProperties:!1,properties,required}),arr=(items,maxItems,minItems=0,uniqueItems=!1)=>({type:"array",items,minItems,maxItems,...uniqueItems?{uniqueItems}:{}}),nullable=schema6=>({anyOf:[{type:"null"},schema6]}),str=(maxLength=4096,minLength=0)=>({type:"string",minLength,maxLength}),enumOf=(...values)=>({enum:values}),id3={type:"string",pattern:"^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$",minLength:1,maxLength:128},digest3={type:"string",pattern:"^sha256:[a-f0-9]{64}$"},token2={type:"string",pattern:"^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$",maxLength:64},relativePath={type:"string",minLength:1,maxLength:1024,pattern:"^[A-Za-z0-9][A-Za-z0-9._/-]*$"},coordinate={type:"number",minimum:-1e6,maximum:1e6},positiveSize={type:"number",minimum:.01,maximum:1e6},index={type:"integer",minimum:0,maximum:1e4},ids=arr(id3,1e4,0,!0),semanticKinds=["process","start","end","decision","data-store","component"],relationKinds=["association","dependency","flow","message","transition"],node=closed3({id:id3,label:str(),kind:enumOf(...semanticKinds),description:nullable(str())}),relation=closed3({id:id3,from:id3,to:id3,kind:enumOf(...relationKinds),direction:enumOf("forward","both","none"),label:nullable(str()),weight:nullable({type:"number",minimum:0,maximum:1e6})}),container=closed3({id:id3,label:str(),members:ids}),annotation=closed3({id:id3,text:str(),targetId:nullable(id3)}),emphasis=closed3({targetId:id3,level:enumOf("primary","secondary","muted")}),semanticCollections={nodes:arr(node,4096),relations:arr(relation,8192),groups:arr(container,1024),lanes:arr(container,256),events:arr(!1,0),series:arr(!1,0),axes:arr(!1,0),sets:arr(!1,0),annotations:arr(annotation,1024),emphasis:arr(emphasis,1024)},bounds=closed3({x:coordinate,y:coordinate,width:positiveSize,height:positiveSize}),point=closed3({x:coordinate,y:coordinate}),attachment=closed3({side:enumOf("top","right","bottom","left"),offset:{type:"number",minimum:0,maximum:1}}),route=closed3({mode:enumOf("automatic","manual"),strategy:enumOf("straight","orthogonal"),from:attachment,to:attachment,points:arr(point,256)}),labelPlacement=closed3({x:coordinate,y:coordinate,width:positiveSize}),appearance=closed3({shape:enumOf("rectangle","rounded-rectangle","ellipse","diamond","cylinder","text","container","connector"),fill:enumOf("surface","accent","success","warning","danger","transparent"),stroke:enumOf("default","accent","muted","danger","none"),strokeWidth:{type:"number",minimum:0,maximum:16},strokeStyle:enumOf("solid","dashed","dotted"),fontSize:{type:"integer",minimum:8,maximum:72},textAlign:enumOf("left","center","right")}),locks=closed3({position:{type:"boolean"},size:{type:"boolean"},route:{type:"boolean"}}),placement=closed3({elementId:id3,bounds:nullable(bounds),route:nullable(route),label:nullable(labelPlacement),zIndex:index,appearance,locks}),snapshot=closed3({bundleDigest:digest3,semanticDigest:digest3,presentationDigest:digest3}),schema3=(name,kind,properties)=>({$schema:"https://json-schema.org/draft/2020-12/schema",$id:`https://openplanr.dev/schemas/v1.13.0/${name}.schema.json`,"x-openplanr-contract":{id:name,version:"1.13.0"},...closed3({kind:{const:kind},schemaVersion:{const:"1.0.0"},protocolVersion:{const:"1.13.0"},...properties})}),documentSchema=schema3("diagram-document","planr-diagram",{diagramId:id3,title:str(),summary:str(),audience:enumOf("engineer","executive","mixed"),grammar:closed3({id:enumOf("flowchart","process","swimlane","architecture"),version:{const:"1.0.0"}}),...semanticCollections,laneOrder:ids,accessibility:closed3({title:str(),description:str(),readingOrder:ids}),documentDigest:digest3}),presentationSchema=schema3("diagram-presentation","diagram-presentation",{diagramId:id3,semanticDigest:digest3,coordinateSystem:{const:"global-canvas"},layout:closed3({direction:enumOf("top-down","left-right","right-left","bottom-up"),detailTier:enumOf("simplified","balanced","faithful")}),theme:closed3({themeId:enumOf("paper","slate","midnight"),mode:enumOf("light","dark","auto")}),elements:arr(placement,1e4),presentationDigest:digest3}),range=closed3({startByte:{type:"integer",minimum:0,maximum:1048576},endByte:{type:"integer",minimum:0,maximum:1048576}}),sourceMapSchema=schema3("diagram-source-map","diagram-source-map",{diagramId:id3,semanticDigest:digest3,sourceDigest:digest3,sourceByteLength:{type:"integer",minimum:0,maximum:1048576},encoding:{const:"utf-8"},parser:closed3({id:token2,version:str(64,1)}),certificationVersion:{const:"flowchart-copy-v1"},entries:arr(closed3({sourceId:nullable(str(128,1)),elementIds:ids,range:nullable(range),construct:token2,confidence:enumOf("exact","ambiguous"),losses:arr(str(512,1),64)}),1e4)}),fidelityValue=enumOf("lossless","partial","unsupported"),fidelitySchema=schema3("diagram-fidelity-report","diagram-fidelity-report",{diagramId:id3,basis:snapshot,sourceDigest:nullable(digest3),sourceFormat:enumOf("mermaid","planr-diagram-bundle"),targetFormat:enumOf("mermaid","planr-diagram-bundle","svg","html","png"),semantic:fidelityValue,presentation:fidelityValue,sourceText:fidelityValue,losses:arr(closed3({dimension:enumOf("semantic","presentation","sourceText"),code:token2,elementIds:ids,message:str(512,1)}),1024)}),bundleSchema=schema3("diagram-authoring-bundle","diagram-authoring-bundle",{diagramId:id3,document:documentSchema,presentation:presentationSchema,originalSource:nullable(closed3({format:{const:"mermaid"},text:str(1048576),sourceDigest:digest3})),sourceMap:nullable(sourceMapSchema),bundleDigest:digest3}),semanticEntry={oneOf:[closed3({collection:{const:"nodes"},value:node}),closed3({collection:{const:"relations"},value:relation}),closed3({collection:{const:"groups"},value:container}),closed3({collection:{const:"lanes"},value:container}),closed3({collection:{const:"annotations"},value:annotation})]},editableSemanticValue=(collection2,properties)=>closed3({type:{const:"update-semantics"},collection:{const:collection2},elementId:id3,before:closed3(properties),after:closed3(properties)}),updateSchemas=[editableSemanticValue("nodes",{label:str(),kind:enumOf(...semanticKinds),description:nullable(str())}),editableSemanticValue("relations",{from:id3,to:id3,kind:enumOf(...relationKinds),direction:enumOf("forward","both","none"),label:nullable(str()),weight:nullable({type:"number",minimum:0,maximum:1e6})}),editableSemanticValue("groups",{label:str()}),editableSemanticValue("lanes",{label:str()}),editableSemanticValue("annotations",{text:str(),targetId:nullable(id3)}),closed3({type:{const:"update-semantics"},collection:{const:"emphasis"},elementId:id3,before:nullable(enumOf("primary","secondary","muted")),after:nullable(enumOf("primary","secondary","muted")),index:{type:"integer",minimum:0,maximum:1024}},["type","collection","elementId","before","after"]),closed3({type:{const:"update-semantics"},collection:{const:"document"},before:closed3({title:str(),summary:str(),audience:enumOf("engineer","executive","mixed"),accessibility:documentSchema.properties.accessibility}),after:closed3({title:str(),summary:str(),audience:enumOf("engineer","executive","mixed"),accessibility:documentSchema.properties.accessibility})}),closed3({type:{const:"update-semantics"},collection:{const:"source-map"},before:nullable(sourceMapSchema),after:nullable(sourceMapSchema)})],membershipState=closed3({groups:arr(closed3({id:id3,members:ids}),1024),lanes:arr(closed3({id:id3,members:ids}),256),laneOrder:ids}),geometryValue=closed3({bounds:nullable(bounds),route:nullable(route),label:nullable(labelPlacement),zIndex:index}),appearanceValue=closed3({appearance,locks}),operation={oneOf:[closed3({type:{const:"insert-elements"},elements:arr(semanticEntry,1e4,1),presentation:arr(placement,1e4,1),positions:arr(closed3({elementId:id3,semanticIndex:index,presentationIndex:index}),1e4,1)},["type","elements","presentation"]),...updateSchemas,closed3({type:{const:"remove-elements"},elements:arr(semanticEntry,1e4,1),presentation:arr(placement,1e4,1)}),closed3({type:{const:"set-membership-order"},before:membershipState,after:membershipState}),closed3({type:{const:"set-geometry"},changes:arr(closed3({elementId:id3,before:geometryValue,after:geometryValue}),1e4,1)}),closed3({type:{const:"set-appearance-locks"},changes:arr(closed3({elementId:id3,before:appearanceValue,after:appearanceValue}),1e4,1)})]},transactionSchema=schema3("diagram-edit-transaction","diagram-edit-transaction",{transactionId:id3,diagramId:id3,base:snapshot,operations:arr(operation,256,1),undoOf:nullable(id3)}),proposalSchema=schema3("diagram-change-proposal","diagram-change-proposal",{proposalId:id3,diagramId:id3,base:snapshot,transaction:transactionSchema,summary:str(4096,1),author:closed3({kind:enumOf("human","agent"),id:id3}),status:enumOf("proposed","accepted","rejected","stale")}),publicationSchema=schema3("diagram-publication-state","diagram-publication-state",{diagramId:id3,draft:nullable(snapshot),published:nullable(snapshot),audience:enumOf("private","company","public"),capabilitySemantics:{const:"descriptive-only-requires-host-authorization"}}),manifestSchema=schema3("diagram-manifest","diagram-manifest",{diagramId:id3,basis:snapshot,bundle:closed3({path:relativePath,transportDigest:digest3}),renderer:closed3({id:token2,version:str(64,1)}),outputs:arr(closed3({path:relativePath,mediaType:enumOf("image/svg+xml","text/html","image/png"),transportDigest:digest3,fidelity:fidelitySchema}),32,1)});manifestSchema.properties.theme=closed3({id:token2,version:str(64,1)});var mermaidConstruct=closed3({construct:token2,import:fidelityValue,export:fidelityValue,semanticRoundTrip:fidelityValue,mapping:str(512,1)}),capabilityProfile=closed3({grammarId:enumOf("flowchart","process","swimlane","architecture"),authoring:{const:!0},primitives:arr(enumOf("node","relation","group","lane","annotation","emphasis"),6,1,!0),nodeKinds:arr(enumOf(...semanticKinds),6,1,!0),relationKinds:arr(enumOf(...relationKinds),5,1,!0),operations:arr(enumOf(...DIAGRAM_EDIT_OPERATION_CLASSES),6,6,!0),mermaid:closed3({mode:{const:"copy"},certificationVersion:{const:"flowchart-copy-v1"},constructs:arr(mermaidConstruct,32,1),linkedSource:{const:!1}})}),capabilitiesSchema=schema3("diagram-authoring-capabilities","diagram-authoring-capabilities",{version:{const:"1.0.0"},liveCollaboration:{const:!1},profiles:arr(capabilityProfile,4,4),unsupportedGrammars:arr(token2,128,0,!0)}),schemas={"diagram-document":documentSchema,"diagram-presentation":presentationSchema,"diagram-authoring-bundle":bundleSchema,"diagram-edit-transaction":transactionSchema,"diagram-source-map":sourceMapSchema,"diagram-fidelity-report":fidelitySchema,"diagram-manifest":manifestSchema,"diagram-change-proposal":proposalSchema,"diagram-publication-state":publicationSchema,"diagram-authoring-capabilities":capabilitiesSchema},DIAGRAM_AUTHORING_SCHEMAS=deepFreeze(schemas),DIAGRAM_AUTHORING_CONTRACT_FILES=deepFreeze(Object.fromEntries(Object.keys(schemas).map(name=>[name,`${name}.schema.json`]))),mermaidConstructs=[["flowchart-direction","lossless","lossless","lossless","flowchart TB/TD/LR/RL/BT maps to presentation layout direction"],["explicit-node-id","lossless","lossless","lossless","Explicit source ID maps through source-map to stable semantic node ID; labels never establish identity"],["plain-node-label","lossless","lossless","lossless","Escaped plain text maps to node label; HTML is inert text and is not executed"],["rectangle-node","lossless","lossless","lossless","node.kind process and presentation shape rectangle"],["rounded-node","lossless","lossless","lossless","node.kind process and presentation shape rounded-rectangle"],["decision-node","lossless","lossless","lossless","node.kind decision and presentation shape diamond"],["cylinder-node","lossless","lossless","lossless","node.kind data-store and presentation shape cylinder"],["directed-edge","lossless","lossless","lossless","relation.kind flow and direction forward; source and target IDs are semantic endpoints"],["bidirectional-edge","lossless","lossless","lossless","relation.kind flow and direction both"],["undirected-edge","lossless","lossless","lossless","relation.kind association and direction none"],["plain-edge-label","lossless","lossless","lossless","Escaped plain text maps to relation label"],["subgraph","lossless","lossless","lossless","Explicit subgraph ID maps to one semantic group in an acyclic single-parent forest"],["lane-semantics","unsupported","partial","partial","Mermaid subgraphs do not encode lane identity or explicit lane order"],["manual-geometry","unsupported","partial","partial","Standard Mermaid does not preserve coordinates, routes, attachments, stacking or locks"],["styles-and-directives","unsupported","unsupported","unsupported","CSS, classDef, init directives, links, callbacks and HTML labels are outside this certified subset"],["unsupported-construct","unsupported","unsupported","unsupported","Unrecognized syntax is retained as original source with explicit loss diagnostics"]].map(([construct,input,output,roundTrip,mapping])=>({construct,import:input,export:output,semanticRoundTrip:roundTrip,mapping})),profileIds=["flowchart","process","swimlane","architecture"],DIAGRAM_AUTHORING_CAPABILITIES=deepFreeze({kind:"diagram-authoring-capabilities",schemaVersion:"1.0.0",protocolVersion:"1.13.0",version:"1.0.0",liveCollaboration:!1,profiles:profileIds.map(grammarId=>({grammarId,authoring:!0,primitives:["node","relation","group",...grammarId==="process"||grammarId==="swimlane"?["lane"]:[],"annotation","emphasis"],nodeKinds:[...semanticKinds],relationKinds:[...relationKinds],operations:[...DIAGRAM_EDIT_OPERATION_CLASSES],mermaid:{mode:"copy",certificationVersion:"flowchart-copy-v1",constructs:mermaidConstructs.map(entry=>({...entry})),linkedSource:!1}})),unsupportedGrammars:DIAGRAM_REGISTRIES["diagram-grammars.json"].grammars.map(entry=>entry.grammarId).filter(value=>!profileIds.includes(value))});var DESIGN_DOCUMENT_VERSION="1.0.0",freeze=value=>{if(value&&typeof value=="object"){for(let nested of Object.values(value))freeze(nested);Object.freeze(value)}return value},DESIGN_DOCUMENT_SCHEMA=freeze({$schema:"https://json-schema.org/draft/2020-12/schema",$id:"https://openplanr.dev/schemas/v1.9.0/design-document.schema.json","x-openplanr-contract":{id:"design-document",version:"1.9.0"},title:"OpenPlanr authored design document",type:"object",additionalProperties:!1,required:["kind","schemaVersion","id","title","brief","frames","screens","screenOrder","variants","selectedVariant","defaultView"],properties:{kind:{const:"openplanr-design-document"},schemaVersion:{const:DESIGN_DOCUMENT_VERSION},id:{$ref:"#/$defs/id"},title:{$ref:"#/$defs/text"},brief:{type:"object",additionalProperties:!1,required:["text","source","provenance"],properties:{text:{$ref:"#/$defs/text"},source:{enum:["spec","png","describe"]},provenance:{enum:["spec","inferred"]},references:{type:"array",items:{$ref:"#/$defs/text"},uniqueItems:!0}}},designSystem:{type:"object",additionalProperties:!1,properties:{path:{$ref:"#/$defs/localPath"},tokens:{$ref:"#/$defs/localPath"},spacing:{type:"array",minItems:1,uniqueItems:!0,items:{type:"number",minimum:0,maximum:16384}}}},assets:{$ref:"#/$defs/paths"},frames:{type:"array",minItems:1,items:{type:"object",additionalProperties:!1,required:["id","label","width","height"],properties:{id:{$ref:"#/$defs/id"},label:{$ref:"#/$defs/text"},width:{type:"integer",minimum:1,maximum:16384},height:{type:"integer",minimum:1,maximum:16384}}}},screens:{type:"array",minItems:1,items:{type:"object",additionalProperties:!1,required:["id","title","source"],properties:{id:{$ref:"#/$defs/id"},title:{$ref:"#/$defs/text"},description:{$ref:"#/$defs/text"},source:{$ref:"#/$defs/source"},anchors:{$ref:"#/$defs/ids"}}}},screenOrder:{type:"array",minItems:1,items:{$ref:"#/$defs/id"},uniqueItems:!0},flows:{type:"array",items:{type:"object",additionalProperties:!1,required:["id","title","screens"],properties:{id:{$ref:"#/$defs/id"},title:{$ref:"#/$defs/text"},screens:{type:"array",minItems:1,items:{$ref:"#/$defs/id"}}}}},variants:{type:"array",minItems:1,items:{type:"object",additionalProperties:!1,required:["id","label","status"],properties:{id:{$ref:"#/$defs/id"},label:{$ref:"#/$defs/text"},description:{$ref:"#/$defs/text"},status:{enum:["ready","failed"]},issue:{$ref:"#/$defs/text"},sources:{type:"object",additionalProperties:{$ref:"#/$defs/source"}}},if:{properties:{status:{const:"failed"}}},then:{required:["issue"]}}},selectedVariant:{$ref:"#/$defs/id"},defaultView:{enum:["canvas","prototype","walkthrough"]}},$defs:{id:{type:"string",minLength:1,maxLength:128,pattern:"^[A-Za-z][A-Za-z0-9_-]*$"},text:{type:"string",minLength:1,pattern:"\\S"},ids:{type:"array",items:{$ref:"#/$defs/id"},uniqueItems:!0},localPath:{type:"string",minLength:1,description:"Path relative to the authored document directory. No URL, traversal, encoded path, query or fragment.",pattern:"^(?!/)(?!.*(?:^|/)\\.{1,2}(?:/|$))(?!.*//)(?!.*[/ ]$)[^\\\\:\\u0000-\\u001F%?#]+$"},paths:{type:"array",items:{$ref:"#/$defs/localPath"},uniqueItems:!0},source:{type:"object",additionalProperties:!1,required:["html"],properties:{html:{$ref:"#/$defs/localPath"},styles:{$ref:"#/$defs/paths"},scripts:{$ref:"#/$defs/paths"}}}}});var DESIGN_WORKSPACE_VERSION="1.0.0";var DESIGN_WORKSPACE_MAX_BYTES=5*1024*1024,DESIGN_WORKSPACE_MAX_EVENT_BYTES=256*1024,DESIGN_WORKSPACE_ID_PATTERN="^[A-Za-z0-9_-]{22,64}$",id4={type:"string",pattern:DESIGN_WORKSPACE_ID_PATTERN},digest4={type:"string",pattern:"^[a-f0-9]{64}$"},b64={type:"string",pattern:"^[A-Za-z0-9_-]+$"},epoch={type:"integer",minimum:1,maximum:2147483647},cipherProperties={iv:{...b64,minLength:16,maxLength:16},ciphertext:{...b64,minLength:22,maxLength:Math.ceil(DESIGN_WORKSPACE_MAX_BYTES*4/3)}},signature2={...b64,minLength:86,maxLength:86},publicKey={type:"object",additionalProperties:!1,required:["kty","crv","x","y"],properties:{kty:{const:"EC"},crv:{const:"P-256"},x:{...b64,minLength:43,maxLength:43},y:{...b64,minLength:43,maxLength:43},ext:{type:"boolean"},key_ops:{type:"array",items:{const:"verify"},maxItems:1}}},schema4=(name,properties,required=Object.keys(properties))=>({$schema:"https://json-schema.org/draft/2020-12/schema",$id:`https://openplanr.dev/schemas/v1.9.0/${name}.schema.json`,"x-openplanr-contract":{id:name,version:"1.9.0"},type:"object",additionalProperties:!1,properties,required}),DESIGN_WORKSPACE_REVISION_SCHEMA=schema4("design-workspace-revision",{id:id4,epoch,reviewOf:digest4,createdAt:{type:"string",format:"date-time"},...cipherProperties,signature:signature2}),DESIGN_WORKSPACE_EVENT_SCHEMA=schema4("design-workspace-event",{id:id4,revisionId:id4,reviewOf:digest4,epoch,...cipherProperties,publicKey,signature:signature2}),sealed={type:"object",additionalProperties:!1,required:["iv","ciphertext"],properties:cipherProperties},DESIGN_WORKSPACE_CREATE_SCHEMA=schema4("design-workspace-create",{schemaVersion:{const:DESIGN_WORKSPACE_VERSION},id:id4,ownerPublicKey:publicKey,ownerAuthHash:digest4,reviewerAuthHash:digest4,epoch:{const:1},keyring:sealed,revision:DESIGN_WORKSPACE_REVISION_SCHEMA,operationId:id4,signature:signature2}),DESIGN_WORKSPACE_SCHEMA=schema4("design-review-workspace",{schemaVersion:{const:DESIGN_WORKSPACE_VERSION},id:id4,version:epoch,epoch,currentRevision:id4,commentsPaused:{type:"boolean"},ownerPublicKey:publicKey,keyring:sealed}),designProperties=structuredClone(DESIGN_DOCUMENT_SCHEMA.properties);for(let key of["kind","schemaVersion","brief","assets","designSystem"])delete designProperties[key];delete designProperties.screens.items.properties.source;designProperties.screens.items.required=["id","title"];delete designProperties.variants.items.properties.sources;var DESIGN_REVIEW_BUNDLE_SCHEMA={...schema4("design-review-bundle",{kind:{const:"openplanr-design-review-bundle"},schemaVersion:{const:DESIGN_WORKSPACE_VERSION},design:{type:"object",additionalProperties:!1,properties:designProperties,required:["id","title","frames","screens","screenOrder","variants","selectedVariant","defaultView"]},envelope:{type:"object",required:["schemaVersion","artifacts","viewer"]},entries:{type:"array",minItems:1,maxItems:256,items:{type:"object",additionalProperties:!1,required:["artifactId","screenId","variantId","frameId"],properties:Object.fromEntries(["artifactId","screenId","variantId","frameId"].map(key=>[key,{type:"string",minLength:1,maxLength:128}]))}},state:{type:["object","null"],additionalProperties:!1,properties:{positions:{type:"object",additionalProperties:{type:"object",additionalProperties:!1,required:["x","y"],properties:{x:{type:"number",minimum:-1e7,maximum:1e7},y:{type:"number",minimum:-1e7,maximum:1e7}}}}}},revision:{type:"string",minLength:1,maxLength:128},verification:{type:["object","null"],additionalProperties:!1,properties:{status:{enum:["verified","unverified","failed","pending"]}}}},["kind","schemaVersion","design","envelope","entries","revision"]),$defs:structuredClone(DESIGN_DOCUMENT_SCHEMA.$defs)};var DESIGN_WORKSPACE_SCHEMAS=Object.freeze({"design-review-workspace":DESIGN_WORKSPACE_SCHEMA,"design-workspace-create":DESIGN_WORKSPACE_CREATE_SCHEMA,"design-workspace-revision":DESIGN_WORKSPACE_REVISION_SCHEMA,"design-workspace-event":DESIGN_WORKSPACE_EVENT_SCHEMA,"design-review-bundle":DESIGN_REVIEW_BUNDLE_SCHEMA});var DIAGRAM_WORKSPACE_MAX_BYTES=5*1024*1024,DIAGRAM_WORKSPACE_MAX_EVENT_BYTES=256*1024;var text3={type:"string",maxLength:8192},id5={type:"string",minLength:1,maxLength:160},digest5={type:"string",pattern:"^[a-f0-9]{64}$"},shaDigest={type:"string",pattern:"^sha256:[a-f0-9]{64}$"},coord={type:"number",minimum:0,maximum:1},closed4=(properties,required=Object.keys(properties))=>({type:"object",properties,required,additionalProperties:!1}),list2=(items,maxItems=1e4)=>({type:"array",items,maxItems}),contract=(name,shape)=>({$schema:"https://json-schema.org/draft/2020-12/schema",$id:`https://openplanr.dev/schemas/v1.15.0/${name}.schema.json`,"x-openplanr-contract":{id:name,version:"1.15.0"},...shape}),item=closed4({id:id5,label:text3,kind:id5,x:{type:"number"},y:{type:"number"}}),relation2=closed4({id:id5,from:id5,to:id5,label:text3,kind:id5}),DIAGRAM_REVIEW_BUNDLE_SCHEMA=contract("diagram-review-bundle",closed4({kind:{const:"openplanr-diagram-review-bundle"},schemaVersion:{const:"1.0.0"},diagramId:id5,title:text3,source:closed4({kind:{enum:["manifest","authoring"]},digest:shaDigest}),rendering:closed4({id:id5,version:id5,fontFamily:{const:"Inter"}}),summary:text3,grammar:id5,colorScheme:{enum:["light","dark"]},scene:closed4({svg:{type:"string",minLength:1,maxLength:5*1024*1024},width:{type:"number",exclusiveMinimum:0,maximum:16384},height:{type:"number",exclusiveMinimum:0,maximum:16384},items:list2(item),relations:list2(relation2)}),authored:DIAGRAM_AUTHORING_SCHEMAS["diagram-authoring-bundle"]},["kind","schemaVersion","diagramId","title","source","rendering","scene"])),feedbackBase={kind:{enum:["comment","reply","resolve"]},author:{...id5,maxLength:160},reviewOf:digest5,createdAt:{type:"string",format:"date-time"},commentId:id5},DIAGRAM_REVIEW_FEEDBACK_SCHEMA=contract("diagram-review-feedback",{oneOf:[closed4({...feedbackBase,kind:{const:"comment"},body:{...text3,minLength:1},target:closed4({elementId:id5,x:coord,y:coord},[])}),closed4({...feedbackBase,kind:{const:"reply"},body:{...text3,minLength:1},parentId:id5}),closed4({...feedbackBase,kind:{const:"resolve"},resolved:{type:"boolean"}})]});function workspaceSchema(name,original){return contract(name,{...structuredClone(original),$id:`https://openplanr.dev/schemas/v1.15.0/${name}.schema.json`,"x-openplanr-contract":{id:name,version:"1.15.0"}})}var DIAGRAM_WORKSPACE_SCHEMA=workspaceSchema("diagram-review-workspace",DESIGN_WORKSPACE_SCHEMAS["design-review-workspace"]),DIAGRAM_WORKSPACE_CREATE_SCHEMA=workspaceSchema("diagram-workspace-create",DESIGN_WORKSPACE_SCHEMAS["design-workspace-create"]),DIAGRAM_WORKSPACE_REVISION_SCHEMA=workspaceSchema("diagram-workspace-revision",DESIGN_WORKSPACE_SCHEMAS["design-workspace-revision"]),DIAGRAM_WORKSPACE_EVENT_SCHEMA=workspaceSchema("diagram-workspace-event",DESIGN_WORKSPACE_SCHEMAS["design-workspace-event"]),DIAGRAM_REVIEW_SCHEMAS=Object.freeze({"diagram-review-bundle":DIAGRAM_REVIEW_BUNDLE_SCHEMA,"diagram-review-feedback":DIAGRAM_REVIEW_FEEDBACK_SCHEMA,"diagram-review-workspace":DIAGRAM_WORKSPACE_SCHEMA,"diagram-workspace-create":DIAGRAM_WORKSPACE_CREATE_SCHEMA,"diagram-workspace-revision":DIAGRAM_WORKSPACE_REVISION_SCHEMA,"diagram-workspace-event":DIAGRAM_WORKSPACE_EVENT_SCHEMA});var DIAGRAM_PRESENTATION_SCHEMA={$schema:"https://json-schema.org/draft/2020-12/schema",$id:"https://openplanr.dev/schemas/v1.17.0/diagram-presentation.schema.json","x-openplanr-contract":{id:"diagram-presentation",version:"1.17.0"},type:"object",additionalProperties:!1,required:["kind","schemaVersion","palette","theme","fontFamily"],properties:{kind:{const:"openplanr-diagram-presentation"},schemaVersion:{const:"2.0.0"},palette:{const:"openplanr-brand-v2"},theme:{enum:["light","dark"]},fontFamily:{const:"Inter"}}},DIAGRAM_REVIEW_BUNDLE_V11_SCHEMA=structuredClone(DIAGRAM_REVIEW_BUNDLE_SCHEMA);Object.assign(DIAGRAM_REVIEW_BUNDLE_V11_SCHEMA,{$id:"https://openplanr.dev/schemas/v1.17.0/diagram-review-bundle.schema.json","x-openplanr-contract":{id:"diagram-review-bundle",version:"1.17.0"}});DIAGRAM_REVIEW_BUNDLE_V11_SCHEMA.properties.schemaVersion={const:"1.1.0"};DIAGRAM_REVIEW_BUNDLE_V11_SCHEMA.properties.presentation=DIAGRAM_PRESENTATION_SCHEMA;DIAGRAM_REVIEW_BUNDLE_V11_SCHEMA.required.push("presentation");var DIAGRAM_AUTHORING_BUNDLE_V11_SCHEMA=structuredClone(DIAGRAM_AUTHORING_SCHEMAS["diagram-authoring-bundle"]);Object.assign(DIAGRAM_AUTHORING_BUNDLE_V11_SCHEMA,{$id:"https://openplanr.dev/schemas/v1.17.0/diagram-authoring-bundle.schema.json","x-openplanr-contract":{id:"diagram-authoring-bundle",version:"1.17.0"}});Object.assign(DIAGRAM_AUTHORING_BUNDLE_V11_SCHEMA.properties,{schemaVersion:{const:"1.1.0"},protocolVersion:{const:"1.17.0"},studioPresentation:DIAGRAM_PRESENTATION_SCHEMA});DIAGRAM_AUTHORING_BUNDLE_V11_SCHEMA.required.push("studioPresentation");var DIAGRAM_EDIT_TRANSACTION_V11_SCHEMA=structuredClone(DIAGRAM_AUTHORING_SCHEMAS["diagram-edit-transaction"]);Object.assign(DIAGRAM_EDIT_TRANSACTION_V11_SCHEMA,{$id:"https://openplanr.dev/schemas/v1.17.0/diagram-edit-transaction.schema.json","x-openplanr-contract":{id:"diagram-edit-transaction",version:"1.17.0"}});Object.assign(DIAGRAM_EDIT_TRANSACTION_V11_SCHEMA.properties,{schemaVersion:{const:"1.1.0"},protocolVersion:{const:"1.17.0"}});DIAGRAM_EDIT_TRANSACTION_V11_SCHEMA.properties.operations.items.oneOf.push({type:"object",additionalProperties:!1,required:["type","before","after"],properties:{type:{const:"set-studio-presentation"},before:{anyOf:[DIAGRAM_PRESENTATION_SCHEMA,{type:"null"}]},after:{anyOf:[DIAGRAM_PRESENTATION_SCHEMA,{type:"null"}]}}});DIAGRAM_REVIEW_BUNDLE_V11_SCHEMA.properties.authored={oneOf:[DIAGRAM_REVIEW_BUNDLE_V11_SCHEMA.properties.authored,DIAGRAM_AUTHORING_BUNDLE_V11_SCHEMA]};var LARGE_OBJECT_LIMITS=Object.freeze({uniqueHtmlBytes:104857600,decodedBytes:134217728,catalogBytes:8388608,manifestBytes:65536,chunkBytes:1048576,chunkPlaintextBytes:1048560,chunks:129,ciphertextBytes:134219792,sources:256,views:4096,resources:1024,eventBytes:262144,eventPageBytes:1048576,eventPageCount:100});var LARGE_OBJECT_VERSION="2.0.0";var RESOURCE_HTML_SEGMENT_ENCODING="openplanr.html-segments.utf8-v1",id6={type:"string",pattern:"^[A-Za-z0-9_-]{22,64}$"},digest6={type:"string",pattern:"^[a-f0-9]{64}$"},signature3={type:"string",pattern:"^[A-Za-z0-9_-]{86}$"},integer2=(max,min=0)=>({type:"integer",minimum:min,maximum:max}),closed5=(properties,required=Object.keys(properties))=>({type:"object",additionalProperties:!1,properties,required}),iso2={type:"string",format:"date-time",maxLength:40},codec={enum:["identity","deflate-raw"]},publicKey2=closed5({kty:{const:"EC"},crv:{const:"P-256"},x:{type:"string",pattern:"^[A-Za-z0-9_-]{43}$"},y:{type:"string",pattern:"^[A-Za-z0-9_-]{43}$"}}),keyring=closed5({iv:{type:"string",pattern:"^[A-Za-z0-9_-]{16}$"},ciphertext:{type:"string",pattern:"^[A-Za-z0-9_-]+$",maxLength:65536}}),chunk=closed5({index:integer2(128),byteLength:integer2(LARGE_OBJECT_LIMITS.chunkBytes,17),iv:{type:"string",pattern:"^[A-Za-z0-9_-]{16}$"},sha256:digest6}),catalogSpan=closed5({offset:integer2(LARGE_OBJECT_LIMITS.decodedBytes),encodedBytes:integer2(LARGE_OBJECT_LIMITS.catalogBytes,1),decodedBytes:integer2(LARGE_OBJECT_LIMITS.catalogBytes,1),codec}),schema5=(name,properties,required)=>({$schema:"https://json-schema.org/draft/2020-12/schema",$id:`https://openplanr.dev/schemas/v1.17.0/${name}.schema.json`,"x-openplanr-contract":{id:name,version:"1.17.0"},...closed5(properties,required)}),ENCRYPTED_RESOURCE_MANIFEST_SCHEMA=schema5("encrypted-resource-manifest",{schemaVersion:{const:LARGE_OBJECT_VERSION},kind:{const:"openplanr-encrypted-resource-manifest"},workspaceId:id6,revisionId:id6,epoch:integer2(Number.MAX_SAFE_INTEGER,1),createdAt:iso2,plaintextBytes:integer2(LARGE_OBJECT_LIMITS.decodedBytes,1),ciphertextBytes:integer2(LARGE_OBJECT_LIMITS.ciphertextBytes,17),catalog:catalogSpan,chunks:{type:"array",minItems:1,maxItems:LARGE_OBJECT_LIMITS.chunks,items:chunk},signature:signature3}),ENCRYPTED_UPLOAD_PREPARE_SCHEMA=schema5("encrypted-upload-prepare",{schemaVersion:{const:LARGE_OBJECT_VERSION},workspaceId:id6,operationId:id6,expectedVersion:integer2(Number.MAX_SAFE_INTEGER),epoch:integer2(Number.MAX_SAFE_INTEGER,1),ownerPublicKey:publicKey2,ownerAuthHash:digest6,reviewerAuthHash:digest6,keyring,manifest:ENCRYPTED_RESOURCE_MANIFEST_SCHEMA,signature:signature3}),ENCRYPTED_UPLOAD_COMMIT_SCHEMA=schema5("encrypted-upload-commit",{schemaVersion:{const:LARGE_OBJECT_VERSION},workspaceId:id6,operationId:id6,manifestSha256:digest6,signature:signature3}),ENCRYPTED_UPLOAD_RECEIPT_SCHEMA=schema5("encrypted-upload-receipt",{schemaVersion:{const:LARGE_OBJECT_VERSION},workspaceId:id6,operationId:id6,revisionId:id6,manifestSha256:digest6,status:{const:"committed"},version:integer2(Number.MAX_SAFE_INTEGER,1),committedAt:iso2}),ENCRYPTED_UPLOAD_STATUS_SCHEMA=schema5("encrypted-upload-status",{schemaVersion:{const:LARGE_OBJECT_VERSION},workspaceId:id6,operationId:id6,revisionId:id6,manifestSha256:digest6,status:{enum:["prepared","committed"]},receivedChunks:{type:"array",maxItems:LARGE_OBJECT_LIMITS.chunks,items:closed5({index:integer2(128),sha256:digest6,byteLength:integer2(LARGE_OBJECT_LIMITS.chunkBytes,17)})},receipt:ENCRYPTED_UPLOAD_RECEIPT_SCHEMA},["schemaVersion","workspaceId","operationId","revisionId","manifestSha256","status","receivedChunks"]),ENCRYPTED_WORKSPACE_V2_SCHEMA=schema5("encrypted-workspace-v2",{schemaVersion:{const:LARGE_OBJECT_VERSION},id:id6,version:integer2(Number.MAX_SAFE_INTEGER,1),epoch:integer2(Number.MAX_SAFE_INTEGER,1),currentRevision:id6,ownerPublicKey:publicKey2,keyring,commentsPaused:{type:"boolean"}}),ENCRYPTED_WORKSPACE_EVENT_V2_SCHEMA=schema5("encrypted-workspace-event-v2",{id:id6,epoch:integer2(Number.MAX_SAFE_INTEGER,1),revisionId:id6,createdAt:iso2,iv:{type:"string",pattern:"^[A-Za-z0-9_-]{16}$"},ciphertext:{type:"string",pattern:"^[A-Za-z0-9_-]+$",maxLength:Math.ceil(LARGE_OBJECT_LIMITS.eventBytes*4/3)},authorPublicKey:publicKey2,signature:signature3}),resource=closed5({id:{type:"string",pattern:"^r[0-9]{1,4}$"},type:{enum:["html-segments","shared-block","asset"]},offset:integer2(LARGE_OBJECT_LIMITS.decodedBytes),encodedBytes:integer2(LARGE_OBJECT_LIMITS.decodedBytes,1),decodedBytes:integer2(LARGE_OBJECT_LIMITS.decodedBytes,1),codec,sha256:digest6}),RESOURCE_CATALOG_SCHEMA=schema5("resource-catalog",{schemaVersion:{const:"1.0.0"},kind:{const:"openplanr-resource-catalog"},bundle:{type:"object"},uniqueHtmlBytes:integer2(LARGE_OBJECT_LIMITS.uniqueHtmlBytes),totalDecodedBytes:integer2(LARGE_OBJECT_LIMITS.decodedBytes,1),resources:{type:"array",minItems:1,maxItems:LARGE_OBJECT_LIMITS.resources,items:resource},sources:{type:"array",minItems:1,maxItems:LARGE_OBJECT_LIMITS.sources,items:closed5({id:{type:"string",minLength:1,maxLength:128},resourceId:resource.properties.id,htmlBytes:integer2(LARGE_OBJECT_LIMITS.uniqueHtmlBytes,1),sha256:digest6})},viewSources:{type:"object",maxProperties:LARGE_OBJECT_LIMITS.views,additionalProperties:{type:"string",minLength:1,maxLength:128}}});RESOURCE_CATALOG_SCHEMA.properties.reviewOf=digest6;var companyId={type:"string",pattern:"^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"},companyScope={organizationId:companyId,projectId:companyId,artifactId:companyId},COMPANY_RESOURCE_MANIFEST_SCHEMA=schema5("company-resource-manifest",{schemaVersion:{const:"2.0.0"},kind:{const:"openplanr-company-resource-manifest"},...companyScope,revisionId:id6,contentDigest:{type:"string",pattern:"^sha256:[a-f0-9]{64}$"},contentType:{const:"application/json"},byteLength:integer2(LARGE_OBJECT_LIMITS.decodedBytes,1),decodedBytes:integer2(LARGE_OBJECT_LIMITS.decodedBytes,1),catalog:catalogSpan,chunks:{type:"array",minItems:1,maxItems:128,items:closed5({index:integer2(127),byteLength:integer2(LARGE_OBJECT_LIMITS.chunkBytes,1),sha256:digest6})}}),COMPANY_RESOURCE_UPLOAD_PREPARE_SCHEMA=schema5("company-resource-upload-prepare",{schemaVersion:{const:"2.0.0"},operationId:id6,baseRevisionId:{oneOf:[id6,{type:"null"}]},manifest:COMPANY_RESOURCE_MANIFEST_SCHEMA}),COMPANY_RESOURCE_UPLOAD_RECEIPT_SCHEMA=schema5("company-resource-upload-receipt",{schemaVersion:{const:"2.0.0"},...companyScope,operationId:id6,revisionId:id6,manifestSha256:digest6,contentDigest:{type:"string",pattern:"^sha256:[a-f0-9]{64}$"},status:{const:"committed"},committedAt:iso2}),COMPANY_RESOURCE_UPLOAD_STATUS_SCHEMA=schema5("company-resource-upload-status",{schemaVersion:{const:"2.0.0"},operationId:id6,status:{enum:["prepared","committed"]},receivedChunks:{type:"array",maxItems:128,items:closed5({index:integer2(127),sha256:digest6,byteLength:integer2(LARGE_OBJECT_LIMITS.chunkBytes,1)})},receipt:COMPANY_RESOURCE_UPLOAD_RECEIPT_SCHEMA},["schemaVersion","operationId","status","receivedChunks"]),ENTERPRISE_ARTIFACT_REVISION_V11_SCHEMA=structuredClone(ENTERPRISE_ARTIFACT_REVISION_SCHEMA);Object.assign(ENTERPRISE_ARTIFACT_REVISION_V11_SCHEMA,{$id:"https://openplanr.dev/schemas/v1.17.0/enterprise-artifact-revision.schema.json","x-openplanr-contract":{id:"enterprise-artifact-revision",version:"1.17.0"}});Object.assign(ENTERPRISE_ARTIFACT_REVISION_V11_SCHEMA.properties,{id:id6,parentRevisionId:{anyOf:[id6,structuredClone(ENTERPRISE_ARTIFACT_REVISION_SCHEMA.properties.parentRevisionId)]},schemaVersion:{const:"1.1.0"},protocolVersion:{const:"1.17.0"},contentDigest:{type:"string",pattern:"^sha256:[a-f0-9]{64}$"},byteLength:integer2(LARGE_OBJECT_LIMITS.decodedBytes,1),contentReference:closed5({transport:{const:"resources-v2"},manifestSha256:digest6})});ENTERPRISE_ARTIFACT_REVISION_V11_SCHEMA.required.push("contentReference","protocolVersion");var WORKSPACE_MANAGEMENT_V2_SCHEMA=schema5("workspace-management-v2",{operationId:id6,expectedVersion:integer2(Number.MAX_SAFE_INTEGER,1),epoch:integer2(Number.MAX_SAFE_INTEGER,1),action:{enum:["pause","resume","revoke","delete"]},signature:signature3}),WORKSPACE_ROTATION_V2_SCHEMA=schema5("workspace-rotation-v2",{operationId:id6,expectedVersion:integer2(Number.MAX_SAFE_INTEGER,1),epoch:integer2(Number.MAX_SAFE_INTEGER,2),reviewerAuthHash:digest6,keyring,signature:signature3}),LARGE_OBJECT_SCHEMAS=Object.freeze({...ENTERPRISE_RESOURCE_SCHEMAS,...SHARING_SECURITY_SCHEMAS,"diagram-authoring-bundle":DIAGRAM_AUTHORING_BUNDLE_V11_SCHEMA,"diagram-edit-transaction":DIAGRAM_EDIT_TRANSACTION_V11_SCHEMA,"diagram-presentation":DIAGRAM_PRESENTATION_SCHEMA,"diagram-review-bundle":DIAGRAM_REVIEW_BUNDLE_V11_SCHEMA,"encrypted-resource-manifest":ENCRYPTED_RESOURCE_MANIFEST_SCHEMA,"encrypted-upload-prepare":ENCRYPTED_UPLOAD_PREPARE_SCHEMA,"encrypted-upload-commit":ENCRYPTED_UPLOAD_COMMIT_SCHEMA,"encrypted-upload-receipt":ENCRYPTED_UPLOAD_RECEIPT_SCHEMA,"encrypted-upload-status":ENCRYPTED_UPLOAD_STATUS_SCHEMA,"encrypted-workspace-v2":ENCRYPTED_WORKSPACE_V2_SCHEMA,"encrypted-workspace-event-v2":ENCRYPTED_WORKSPACE_EVENT_V2_SCHEMA,"resource-catalog":RESOURCE_CATALOG_SCHEMA,"company-resource-manifest":COMPANY_RESOURCE_MANIFEST_SCHEMA,"company-resource-upload-prepare":COMPANY_RESOURCE_UPLOAD_PREPARE_SCHEMA,"company-resource-upload-receipt":COMPANY_RESOURCE_UPLOAD_RECEIPT_SCHEMA,"company-resource-upload-status":COMPANY_RESOURCE_UPLOAD_STATUS_SCHEMA,"enterprise-artifact-revision":ENTERPRISE_ARTIFACT_REVISION_V11_SCHEMA,"workspace-management-v2":WORKSPACE_MANAGEMENT_V2_SCHEMA,"workspace-rotation-v2":WORKSPACE_ROTATION_V2_SCHEMA});/*! pako 2.1.0 https://github.com/nodeca/pako @license (MIT AND Zlib) */function zero$1(buf){let len=buf.length;for(;--len>=0;)buf[len]=0}var STORED_BLOCK=0,STATIC_TREES=1,DYN_TREES=2,MIN_MATCH$1=3,MAX_MATCH$1=258,LENGTH_CODES$1=29,LITERALS$1=256,L_CODES$1=LITERALS$1+1+LENGTH_CODES$1,D_CODES$1=30,BL_CODES$1=19,HEAP_SIZE$1=2*L_CODES$1+1,MAX_BITS$1=15,Buf_size=16,MAX_BL_BITS=7,END_BLOCK=256,REP_3_6=16,REPZ_3_10=17,REPZ_11_138=18,extra_lbits=new Uint8Array([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]),extra_dbits=new Uint8Array([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]),extra_blbits=new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]),bl_order=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),DIST_CODE_LEN=512,static_ltree=new Array((L_CODES$1+2)*2);zero$1(static_ltree);var static_dtree=new Array(D_CODES$1*2);zero$1(static_dtree);var _dist_code=new Array(DIST_CODE_LEN);zero$1(_dist_code);var _length_code=new Array(MAX_MATCH$1-MIN_MATCH$1+1);zero$1(_length_code);var base_length=new Array(LENGTH_CODES$1);zero$1(base_length);var base_dist=new Array(D_CODES$1);zero$1(base_dist);function StaticTreeDesc(static_tree,extra_bits,extra_base,elems,max_length){this.static_tree=static_tree,this.extra_bits=extra_bits,this.extra_base=extra_base,this.elems=elems,this.max_length=max_length,this.has_stree=static_tree&&static_tree.length}var static_l_desc,static_d_desc,static_bl_desc;function TreeDesc(dyn_tree,stat_desc){this.dyn_tree=dyn_tree,this.max_code=0,this.stat_desc=stat_desc}var d_code=dist=>dist<256?_dist_code[dist]:_dist_code[256+(dist>>>7)],put_short=(s,w)=>{s.pending_buf[s.pending++]=w&255,s.pending_buf[s.pending++]=w>>>8&255},send_bits=(s,value,length)=>{s.bi_valid>Buf_size-length?(s.bi_buf|=value<<s.bi_valid&65535,put_short(s,s.bi_buf),s.bi_buf=value>>Buf_size-s.bi_valid,s.bi_valid+=length-Buf_size):(s.bi_buf|=value<<s.bi_valid&65535,s.bi_valid+=length)},send_code=(s,c,tree)=>{send_bits(s,tree[c*2],tree[c*2+1])},bi_reverse=(code,len)=>{let res=0;do res|=code&1,code>>>=1,res<<=1;while(--len>0);return res>>>1},bi_flush=s=>{s.bi_valid===16?(put_short(s,s.bi_buf),s.bi_buf=0,s.bi_valid=0):s.bi_valid>=8&&(s.pending_buf[s.pending++]=s.bi_buf&255,s.bi_buf>>=8,s.bi_valid-=8)},gen_bitlen=(s,desc)=>{let tree=desc.dyn_tree,max_code=desc.max_code,stree=desc.stat_desc.static_tree,has_stree=desc.stat_desc.has_stree,extra=desc.stat_desc.extra_bits,base=desc.stat_desc.extra_base,max_length=desc.stat_desc.max_length,h,n,m,bits,xbits,f,overflow=0;for(bits=0;bits<=MAX_BITS$1;bits++)s.bl_count[bits]=0;for(tree[s.heap[s.heap_max]*2+1]=0,h=s.heap_max+1;h<HEAP_SIZE$1;h++)n=s.heap[h],bits=tree[tree[n*2+1]*2+1]+1,bits>max_length&&(bits=max_length,overflow++),tree[n*2+1]=bits,!(n>max_code)&&(s.bl_count[bits]++,xbits=0,n>=base&&(xbits=extra[n-base]),f=tree[n*2],s.opt_len+=f*(bits+xbits),has_stree&&(s.static_len+=f*(stree[n*2+1]+xbits)));if(overflow!==0){do{for(bits=max_length-1;s.bl_count[bits]===0;)bits--;s.bl_count[bits]--,s.bl_count[bits+1]+=2,s.bl_count[max_length]--,overflow-=2}while(overflow>0);for(bits=max_length;bits!==0;bits--)for(n=s.bl_count[bits];n!==0;)m=s.heap[--h],!(m>max_code)&&(tree[m*2+1]!==bits&&(s.opt_len+=(bits-tree[m*2+1])*tree[m*2],tree[m*2+1]=bits),n--)}},gen_codes=(tree,max_code,bl_count)=>{let next_code=new Array(MAX_BITS$1+1),code=0,bits,n;for(bits=1;bits<=MAX_BITS$1;bits++)code=code+bl_count[bits-1]<<1,next_code[bits]=code;for(n=0;n<=max_code;n++){let len=tree[n*2+1];len!==0&&(tree[n*2]=bi_reverse(next_code[len]++,len))}},tr_static_init=()=>{let n,bits,length,code,dist,bl_count=new Array(MAX_BITS$1+1);for(length=0,code=0;code<LENGTH_CODES$1-1;code++)for(base_length[code]=length,n=0;n<1<<extra_lbits[code];n++)_length_code[length++]=code;for(_length_code[length-1]=code,dist=0,code=0;code<16;code++)for(base_dist[code]=dist,n=0;n<1<<extra_dbits[code];n++)_dist_code[dist++]=code;for(dist>>=7;code<D_CODES$1;code++)for(base_dist[code]=dist<<7,n=0;n<1<<extra_dbits[code]-7;n++)_dist_code[256+dist++]=code;for(bits=0;bits<=MAX_BITS$1;bits++)bl_count[bits]=0;for(n=0;n<=143;)static_ltree[n*2+1]=8,n++,bl_count[8]++;for(;n<=255;)static_ltree[n*2+1]=9,n++,bl_count[9]++;for(;n<=279;)static_ltree[n*2+1]=7,n++,bl_count[7]++;for(;n<=287;)static_ltree[n*2+1]=8,n++,bl_count[8]++;for(gen_codes(static_ltree,L_CODES$1+1,bl_count),n=0;n<D_CODES$1;n++)static_dtree[n*2+1]=5,static_dtree[n*2]=bi_reverse(n,5);static_l_desc=new StaticTreeDesc(static_ltree,extra_lbits,LITERALS$1+1,L_CODES$1,MAX_BITS$1),static_d_desc=new StaticTreeDesc(static_dtree,extra_dbits,0,D_CODES$1,MAX_BITS$1),static_bl_desc=new StaticTreeDesc(new Array(0),extra_blbits,0,BL_CODES$1,MAX_BL_BITS)},init_block=s=>{let n;for(n=0;n<L_CODES$1;n++)s.dyn_ltree[n*2]=0;for(n=0;n<D_CODES$1;n++)s.dyn_dtree[n*2]=0;for(n=0;n<BL_CODES$1;n++)s.bl_tree[n*2]=0;s.dyn_ltree[END_BLOCK*2]=1,s.opt_len=s.static_len=0,s.sym_next=s.matches=0},bi_windup=s=>{s.bi_valid>8?put_short(s,s.bi_buf):s.bi_valid>0&&(s.pending_buf[s.pending++]=s.bi_buf),s.bi_buf=0,s.bi_valid=0},smaller=(tree,n,m,depth)=>{let _n2=n*2,_m2=m*2;return tree[_n2]<tree[_m2]||tree[_n2]===tree[_m2]&&depth[n]<=depth[m]},pqdownheap=(s,tree,k)=>{let v=s.heap[k],j=k<<1;for(;j<=s.heap_len&&(j<s.heap_len&&smaller(tree,s.heap[j+1],s.heap[j],s.depth)&&j++,!smaller(tree,v,s.heap[j],s.depth));)s.heap[k]=s.heap[j],k=j,j<<=1;s.heap[k]=v},compress_block=(s,ltree,dtree)=>{let dist,lc,sx=0,code,extra;if(s.sym_next!==0)do dist=s.pending_buf[s.sym_buf+sx++]&255,dist+=(s.pending_buf[s.sym_buf+sx++]&255)<<8,lc=s.pending_buf[s.sym_buf+sx++],dist===0?send_code(s,lc,ltree):(code=_length_code[lc],send_code(s,code+LITERALS$1+1,ltree),extra=extra_lbits[code],extra!==0&&(lc-=base_length[code],send_bits(s,lc,extra)),dist--,code=d_code(dist),send_code(s,code,dtree),extra=extra_dbits[code],extra!==0&&(dist-=base_dist[code],send_bits(s,dist,extra)));while(sx<s.sym_next);send_code(s,END_BLOCK,ltree)},build_tree=(s,desc)=>{let tree=desc.dyn_tree,stree=desc.stat_desc.static_tree,has_stree=desc.stat_desc.has_stree,elems=desc.stat_desc.elems,n,m,max_code=-1,node2;for(s.heap_len=0,s.heap_max=HEAP_SIZE$1,n=0;n<elems;n++)tree[n*2]!==0?(s.heap[++s.heap_len]=max_code=n,s.depth[n]=0):tree[n*2+1]=0;for(;s.heap_len<2;)node2=s.heap[++s.heap_len]=max_code<2?++max_code:0,tree[node2*2]=1,s.depth[node2]=0,s.opt_len--,has_stree&&(s.static_len-=stree[node2*2+1]);for(desc.max_code=max_code,n=s.heap_len>>1;n>=1;n--)pqdownheap(s,tree,n);node2=elems;do n=s.heap[1],s.heap[1]=s.heap[s.heap_len--],pqdownheap(s,tree,1),m=s.heap[1],s.heap[--s.heap_max]=n,s.heap[--s.heap_max]=m,tree[node2*2]=tree[n*2]+tree[m*2],s.depth[node2]=(s.depth[n]>=s.depth[m]?s.depth[n]:s.depth[m])+1,tree[n*2+1]=tree[m*2+1]=node2,s.heap[1]=node2++,pqdownheap(s,tree,1);while(s.heap_len>=2);s.heap[--s.heap_max]=s.heap[1],gen_bitlen(s,desc),gen_codes(tree,max_code,s.bl_count)},scan_tree=(s,tree,max_code)=>{let n,prevlen=-1,curlen,nextlen=tree[1],count2=0,max_count=7,min_count=4;for(nextlen===0&&(max_count=138,min_count=3),tree[(max_code+1)*2+1]=65535,n=0;n<=max_code;n++)curlen=nextlen,nextlen=tree[(n+1)*2+1],!(++count2<max_count&&curlen===nextlen)&&(count2<min_count?s.bl_tree[curlen*2]+=count2:curlen!==0?(curlen!==prevlen&&s.bl_tree[curlen*2]++,s.bl_tree[REP_3_6*2]++):count2<=10?s.bl_tree[REPZ_3_10*2]++:s.bl_tree[REPZ_11_138*2]++,count2=0,prevlen=curlen,nextlen===0?(max_count=138,min_count=3):curlen===nextlen?(max_count=6,min_count=3):(max_count=7,min_count=4))},send_tree=(s,tree,max_code)=>{let n,prevlen=-1,curlen,nextlen=tree[1],count2=0,max_count=7,min_count=4;for(nextlen===0&&(max_count=138,min_count=3),n=0;n<=max_code;n++)if(curlen=nextlen,nextlen=tree[(n+1)*2+1],!(++count2<max_count&&curlen===nextlen)){if(count2<min_count)do send_code(s,curlen,s.bl_tree);while(--count2!==0);else curlen!==0?(curlen!==prevlen&&(send_code(s,curlen,s.bl_tree),count2--),send_code(s,REP_3_6,s.bl_tree),send_bits(s,count2-3,2)):count2<=10?(send_code(s,REPZ_3_10,s.bl_tree),send_bits(s,count2-3,3)):(send_code(s,REPZ_11_138,s.bl_tree),send_bits(s,count2-11,7));count2=0,prevlen=curlen,nextlen===0?(max_count=138,min_count=3):curlen===nextlen?(max_count=6,min_count=3):(max_count=7,min_count=4)}},build_bl_tree=s=>{let max_blindex;for(scan_tree(s,s.dyn_ltree,s.l_desc.max_code),scan_tree(s,s.dyn_dtree,s.d_desc.max_code),build_tree(s,s.bl_desc),max_blindex=BL_CODES$1-1;max_blindex>=3&&s.bl_tree[bl_order[max_blindex]*2+1]===0;max_blindex--);return s.opt_len+=3*(max_blindex+1)+5+5+4,max_blindex},send_all_trees=(s,lcodes,dcodes,blcodes)=>{let rank2;for(send_bits(s,lcodes-257,5),send_bits(s,dcodes-1,5),send_bits(s,blcodes-4,4),rank2=0;rank2<blcodes;rank2++)send_bits(s,s.bl_tree[bl_order[rank2]*2+1],3);send_tree(s,s.dyn_ltree,lcodes-1),send_tree(s,s.dyn_dtree,dcodes-1)},detect_data_type=s=>{let block_mask=4093624447,n;for(n=0;n<=31;n++,block_mask>>>=1)if(block_mask&1&&s.dyn_ltree[n*2]!==0)return 0;if(s.dyn_ltree[18]!==0||s.dyn_ltree[20]!==0||s.dyn_ltree[26]!==0)return 1;for(n=32;n<LITERALS$1;n++)if(s.dyn_ltree[n*2]!==0)return 1;return 0},static_init_done=!1,_tr_init$1=s=>{static_init_done||(tr_static_init(),static_init_done=!0),s.l_desc=new TreeDesc(s.dyn_ltree,static_l_desc),s.d_desc=new TreeDesc(s.dyn_dtree,static_d_desc),s.bl_desc=new TreeDesc(s.bl_tree,static_bl_desc),s.bi_buf=0,s.bi_valid=0,init_block(s)},_tr_stored_block$1=(s,buf,stored_len,last)=>{send_bits(s,(STORED_BLOCK<<1)+(last?1:0),3),bi_windup(s),put_short(s,stored_len),put_short(s,~stored_len),stored_len&&s.pending_buf.set(s.window.subarray(buf,buf+stored_len),s.pending),s.pending+=stored_len},_tr_align$1=s=>{send_bits(s,STATIC_TREES<<1,3),send_code(s,END_BLOCK,static_ltree),bi_flush(s)},_tr_flush_block$1=(s,buf,stored_len,last)=>{let opt_lenb,static_lenb,max_blindex=0;s.level>0?(s.strm.data_type===2&&(s.strm.data_type=detect_data_type(s)),build_tree(s,s.l_desc),build_tree(s,s.d_desc),max_blindex=build_bl_tree(s),opt_lenb=s.opt_len+3+7>>>3,static_lenb=s.static_len+3+7>>>3,static_lenb<=opt_lenb&&(opt_lenb=static_lenb)):opt_lenb=static_lenb=stored_len+5,stored_len+4<=opt_lenb&&buf!==-1?_tr_stored_block$1(s,buf,stored_len,last):s.strategy===4||static_lenb===opt_lenb?(send_bits(s,(STATIC_TREES<<1)+(last?1:0),3),compress_block(s,static_ltree,static_dtree)):(send_bits(s,(DYN_TREES<<1)+(last?1:0),3),send_all_trees(s,s.l_desc.max_code+1,s.d_desc.max_code+1,max_blindex+1),compress_block(s,s.dyn_ltree,s.dyn_dtree)),init_block(s),last&&bi_windup(s)},_tr_tally$1=(s,dist,lc)=>(s.pending_buf[s.sym_buf+s.sym_next++]=dist,s.pending_buf[s.sym_buf+s.sym_next++]=dist>>8,s.pending_buf[s.sym_buf+s.sym_next++]=lc,dist===0?s.dyn_ltree[lc*2]++:(s.matches++,dist--,s.dyn_ltree[(_length_code[lc]+LITERALS$1+1)*2]++,s.dyn_dtree[d_code(dist)*2]++),s.sym_next===s.sym_end),_tr_init_1=_tr_init$1,_tr_stored_block_1=_tr_stored_block$1,_tr_flush_block_1=_tr_flush_block$1,_tr_tally_1=_tr_tally$1,_tr_align_1=_tr_align$1,trees={_tr_init:_tr_init_1,_tr_stored_block:_tr_stored_block_1,_tr_flush_block:_tr_flush_block_1,_tr_tally:_tr_tally_1,_tr_align:_tr_align_1},adler32=(adler,buf,len,pos)=>{let s1=adler&65535|0,s2=adler>>>16&65535|0,n=0;for(;len!==0;){n=len>2e3?2e3:len,len-=n;do s1=s1+buf[pos++]|0,s2=s2+s1|0;while(--n);s1%=65521,s2%=65521}return s1|s2<<16|0},adler32_1=adler32,makeTable=()=>{let c,table=[];for(var n=0;n<256;n++){c=n;for(var k=0;k<8;k++)c=c&1?3988292384^c>>>1:c>>>1;table[n]=c}return table},crcTable=new Uint32Array(makeTable()),crc32=(crc,buf,len,pos)=>{let t=crcTable,end=pos+len;crc^=-1;for(let i=pos;i<end;i++)crc=crc>>>8^t[(crc^buf[i])&255];return crc^-1},crc32_1=crc32,messages={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"},constants$2={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8},{_tr_init,_tr_stored_block,_tr_flush_block,_tr_tally,_tr_align}=trees,{Z_NO_FLUSH:Z_NO_FLUSH$2,Z_PARTIAL_FLUSH,Z_FULL_FLUSH:Z_FULL_FLUSH$1,Z_FINISH:Z_FINISH$3,Z_BLOCK:Z_BLOCK$1,Z_OK:Z_OK$3,Z_STREAM_END:Z_STREAM_END$3,Z_STREAM_ERROR:Z_STREAM_ERROR$2,Z_DATA_ERROR:Z_DATA_ERROR$2,Z_BUF_ERROR:Z_BUF_ERROR$1,Z_DEFAULT_COMPRESSION:Z_DEFAULT_COMPRESSION$1,Z_FILTERED,Z_HUFFMAN_ONLY,Z_RLE,Z_FIXED,Z_DEFAULT_STRATEGY:Z_DEFAULT_STRATEGY$1,Z_UNKNOWN,Z_DEFLATED:Z_DEFLATED$2}=constants$2,MAX_MEM_LEVEL=9,MAX_WBITS$1=15,DEF_MEM_LEVEL=8,LENGTH_CODES=29,LITERALS=256,L_CODES=LITERALS+1+LENGTH_CODES,D_CODES=30,BL_CODES=19,HEAP_SIZE=2*L_CODES+1,MAX_BITS=15,MIN_MATCH=3,MAX_MATCH=258,MIN_LOOKAHEAD=MAX_MATCH+MIN_MATCH+1,PRESET_DICT=32,INIT_STATE=42,GZIP_STATE=57,EXTRA_STATE=69,NAME_STATE=73,COMMENT_STATE=91,HCRC_STATE=103,BUSY_STATE=113,FINISH_STATE=666,BS_NEED_MORE=1,BS_BLOCK_DONE=2,BS_FINISH_STARTED=3,BS_FINISH_DONE=4,OS_CODE=3,err=(strm,errorCode)=>(strm.msg=messages[errorCode],errorCode),rank=f=>f*2-(f>4?9:0),zero=buf=>{let len=buf.length;for(;--len>=0;)buf[len]=0},slide_hash=s=>{let n,m,p,wsize=s.w_size;n=s.hash_size,p=n;do m=s.head[--p],s.head[p]=m>=wsize?m-wsize:0;while(--n);n=wsize,p=n;do m=s.prev[--p],s.prev[p]=m>=wsize?m-wsize:0;while(--n)},HASH_ZLIB=(s,prev,data)=>(prev<<s.hash_shift^data)&s.hash_mask,HASH=HASH_ZLIB,flush_pending=strm=>{let s=strm.state,len=s.pending;len>strm.avail_out&&(len=strm.avail_out),len!==0&&(strm.output.set(s.pending_buf.subarray(s.pending_out,s.pending_out+len),strm.next_out),strm.next_out+=len,s.pending_out+=len,strm.total_out+=len,strm.avail_out-=len,s.pending-=len,s.pending===0&&(s.pending_out=0))},flush_block_only=(s,last)=>{_tr_flush_block(s,s.block_start>=0?s.block_start:-1,s.strstart-s.block_start,last),s.block_start=s.strstart,flush_pending(s.strm)},put_byte=(s,b)=>{s.pending_buf[s.pending++]=b},putShortMSB=(s,b)=>{s.pending_buf[s.pending++]=b>>>8&255,s.pending_buf[s.pending++]=b&255},read_buf=(strm,buf,start,size)=>{let len=strm.avail_in;return len>size&&(len=size),len===0?0:(strm.avail_in-=len,buf.set(strm.input.subarray(strm.next_in,strm.next_in+len),start),strm.state.wrap===1?strm.adler=adler32_1(strm.adler,buf,len,start):strm.state.wrap===2&&(strm.adler=crc32_1(strm.adler,buf,len,start)),strm.next_in+=len,strm.total_in+=len,len)},longest_match=(s,cur_match)=>{let chain_length=s.max_chain_length,scan=s.strstart,match,len,best_len=s.prev_length,nice_match=s.nice_match,limit=s.strstart>s.w_size-MIN_LOOKAHEAD?s.strstart-(s.w_size-MIN_LOOKAHEAD):0,_win=s.window,wmask=s.w_mask,prev=s.prev,strend=s.strstart+MAX_MATCH,scan_end1=_win[scan+best_len-1],scan_end=_win[scan+best_len];s.prev_length>=s.good_match&&(chain_length>>=2),nice_match>s.lookahead&&(nice_match=s.lookahead);do if(match=cur_match,!(_win[match+best_len]!==scan_end||_win[match+best_len-1]!==scan_end1||_win[match]!==_win[scan]||_win[++match]!==_win[scan+1])){scan+=2,match++;do;while(_win[++scan]===_win[++match]&&_win[++scan]===_win[++match]&&_win[++scan]===_win[++match]&&_win[++scan]===_win[++match]&&_win[++scan]===_win[++match]&&_win[++scan]===_win[++match]&&_win[++scan]===_win[++match]&&_win[++scan]===_win[++match]&&scan<strend);if(len=MAX_MATCH-(strend-scan),scan=strend-MAX_MATCH,len>best_len){if(s.match_start=cur_match,best_len=len,len>=nice_match)break;scan_end1=_win[scan+best_len-1],scan_end=_win[scan+best_len]}}while((cur_match=prev[cur_match&wmask])>limit&&--chain_length!==0);return best_len<=s.lookahead?best_len:s.lookahead},fill_window=s=>{let _w_size=s.w_size,n,more,str2;do{if(more=s.window_size-s.lookahead-s.strstart,s.strstart>=_w_size+(_w_size-MIN_LOOKAHEAD)&&(s.window.set(s.window.subarray(_w_size,_w_size+_w_size-more),0),s.match_start-=_w_size,s.strstart-=_w_size,s.block_start-=_w_size,s.insert>s.strstart&&(s.insert=s.strstart),slide_hash(s),more+=_w_size),s.strm.avail_in===0)break;if(n=read_buf(s.strm,s.window,s.strstart+s.lookahead,more),s.lookahead+=n,s.lookahead+s.insert>=MIN_MATCH)for(str2=s.strstart-s.insert,s.ins_h=s.window[str2],s.ins_h=HASH(s,s.ins_h,s.window[str2+1]);s.insert&&(s.ins_h=HASH(s,s.ins_h,s.window[str2+MIN_MATCH-1]),s.prev[str2&s.w_mask]=s.head[s.ins_h],s.head[s.ins_h]=str2,str2++,s.insert--,!(s.lookahead+s.insert<MIN_MATCH)););}while(s.lookahead<MIN_LOOKAHEAD&&s.strm.avail_in!==0)},deflate_stored=(s,flush)=>{let min_block=s.pending_buf_size-5>s.w_size?s.w_size:s.pending_buf_size-5,len,left,have,last=0,used=s.strm.avail_in;do{if(len=65535,have=s.bi_valid+42>>3,s.strm.avail_out<have||(have=s.strm.avail_out-have,left=s.strstart-s.block_start,len>left+s.strm.avail_in&&(len=left+s.strm.avail_in),len>have&&(len=have),len<min_block&&(len===0&&flush!==Z_FINISH$3||flush===Z_NO_FLUSH$2||len!==left+s.strm.avail_in)))break;last=flush===Z_FINISH$3&&len===left+s.strm.avail_in?1:0,_tr_stored_block(s,0,0,last),s.pending_buf[s.pending-4]=len,s.pending_buf[s.pending-3]=len>>8,s.pending_buf[s.pending-2]=~len,s.pending_buf[s.pending-1]=~len>>8,flush_pending(s.strm),left&&(left>len&&(left=len),s.strm.output.set(s.window.subarray(s.block_start,s.block_start+left),s.strm.next_out),s.strm.next_out+=left,s.strm.avail_out-=left,s.strm.total_out+=left,s.block_start+=left,len-=left),len&&(read_buf(s.strm,s.strm.output,s.strm.next_out,len),s.strm.next_out+=len,s.strm.avail_out-=len,s.strm.total_out+=len)}while(last===0);return used-=s.strm.avail_in,used&&(used>=s.w_size?(s.matches=2,s.window.set(s.strm.input.subarray(s.strm.next_in-s.w_size,s.strm.next_in),0),s.strstart=s.w_size,s.insert=s.strstart):(s.window_size-s.strstart<=used&&(s.strstart-=s.w_size,s.window.set(s.window.subarray(s.w_size,s.w_size+s.strstart),0),s.matches<2&&s.matches++,s.insert>s.strstart&&(s.insert=s.strstart)),s.window.set(s.strm.input.subarray(s.strm.next_in-used,s.strm.next_in),s.strstart),s.strstart+=used,s.insert+=used>s.w_size-s.insert?s.w_size-s.insert:used),s.block_start=s.strstart),s.high_water<s.strstart&&(s.high_water=s.strstart),last?BS_FINISH_DONE:flush!==Z_NO_FLUSH$2&&flush!==Z_FINISH$3&&s.strm.avail_in===0&&s.strstart===s.block_start?BS_BLOCK_DONE:(have=s.window_size-s.strstart,s.strm.avail_in>have&&s.block_start>=s.w_size&&(s.block_start-=s.w_size,s.strstart-=s.w_size,s.window.set(s.window.subarray(s.w_size,s.w_size+s.strstart),0),s.matches<2&&s.matches++,have+=s.w_size,s.insert>s.strstart&&(s.insert=s.strstart)),have>s.strm.avail_in&&(have=s.strm.avail_in),have&&(read_buf(s.strm,s.window,s.strstart,have),s.strstart+=have,s.insert+=have>s.w_size-s.insert?s.w_size-s.insert:have),s.high_water<s.strstart&&(s.high_water=s.strstart),have=s.bi_valid+42>>3,have=s.pending_buf_size-have>65535?65535:s.pending_buf_size-have,min_block=have>s.w_size?s.w_size:have,left=s.strstart-s.block_start,(left>=min_block||(left||flush===Z_FINISH$3)&&flush!==Z_NO_FLUSH$2&&s.strm.avail_in===0&&left<=have)&&(len=left>have?have:left,last=flush===Z_FINISH$3&&s.strm.avail_in===0&&len===left?1:0,_tr_stored_block(s,s.block_start,len,last),s.block_start+=len,flush_pending(s.strm)),last?BS_FINISH_STARTED:BS_NEED_MORE)},deflate_fast=(s,flush)=>{let hash_head,bflush;for(;;){if(s.lookahead<MIN_LOOKAHEAD){if(fill_window(s),s.lookahead<MIN_LOOKAHEAD&&flush===Z_NO_FLUSH$2)return BS_NEED_MORE;if(s.lookahead===0)break}if(hash_head=0,s.lookahead>=MIN_MATCH&&(s.ins_h=HASH(s,s.ins_h,s.window[s.strstart+MIN_MATCH-1]),hash_head=s.prev[s.strstart&s.w_mask]=s.head[s.ins_h],s.head[s.ins_h]=s.strstart),hash_head!==0&&s.strstart-hash_head<=s.w_size-MIN_LOOKAHEAD&&(s.match_length=longest_match(s,hash_head)),s.match_length>=MIN_MATCH)if(bflush=_tr_tally(s,s.strstart-s.match_start,s.match_length-MIN_MATCH),s.lookahead-=s.match_length,s.match_length<=s.max_lazy_match&&s.lookahead>=MIN_MATCH){s.match_length--;do s.strstart++,s.ins_h=HASH(s,s.ins_h,s.window[s.strstart+MIN_MATCH-1]),hash_head=s.prev[s.strstart&s.w_mask]=s.head[s.ins_h],s.head[s.ins_h]=s.strstart;while(--s.match_length!==0);s.strstart++}else s.strstart+=s.match_length,s.match_length=0,s.ins_h=s.window[s.strstart],s.ins_h=HASH(s,s.ins_h,s.window[s.strstart+1]);else bflush=_tr_tally(s,0,s.window[s.strstart]),s.lookahead--,s.strstart++;if(bflush&&(flush_block_only(s,!1),s.strm.avail_out===0))return BS_NEED_MORE}return s.insert=s.strstart<MIN_MATCH-1?s.strstart:MIN_MATCH-1,flush===Z_FINISH$3?(flush_block_only(s,!0),s.strm.avail_out===0?BS_FINISH_STARTED:BS_FINISH_DONE):s.sym_next&&(flush_block_only(s,!1),s.strm.avail_out===0)?BS_NEED_MORE:BS_BLOCK_DONE},deflate_slow=(s,flush)=>{let hash_head,bflush,max_insert;for(;;){if(s.lookahead<MIN_LOOKAHEAD){if(fill_window(s),s.lookahead<MIN_LOOKAHEAD&&flush===Z_NO_FLUSH$2)return BS_NEED_MORE;if(s.lookahead===0)break}if(hash_head=0,s.lookahead>=MIN_MATCH&&(s.ins_h=HASH(s,s.ins_h,s.window[s.strstart+MIN_MATCH-1]),hash_head=s.prev[s.strstart&s.w_mask]=s.head[s.ins_h],s.head[s.ins_h]=s.strstart),s.prev_length=s.match_length,s.prev_match=s.match_start,s.match_length=MIN_MATCH-1,hash_head!==0&&s.prev_length<s.max_lazy_match&&s.strstart-hash_head<=s.w_size-MIN_LOOKAHEAD&&(s.match_length=longest_match(s,hash_head),s.match_length<=5&&(s.strategy===Z_FILTERED||s.match_length===MIN_MATCH&&s.strstart-s.match_start>4096)&&(s.match_length=MIN_MATCH-1)),s.prev_length>=MIN_MATCH&&s.match_length<=s.prev_length){max_insert=s.strstart+s.lookahead-MIN_MATCH,bflush=_tr_tally(s,s.strstart-1-s.prev_match,s.prev_length-MIN_MATCH),s.lookahead-=s.prev_length-1,s.prev_length-=2;do++s.strstart<=max_insert&&(s.ins_h=HASH(s,s.ins_h,s.window[s.strstart+MIN_MATCH-1]),hash_head=s.prev[s.strstart&s.w_mask]=s.head[s.ins_h],s.head[s.ins_h]=s.strstart);while(--s.prev_length!==0);if(s.match_available=0,s.match_length=MIN_MATCH-1,s.strstart++,bflush&&(flush_block_only(s,!1),s.strm.avail_out===0))return BS_NEED_MORE}else if(s.match_available){if(bflush=_tr_tally(s,0,s.window[s.strstart-1]),bflush&&flush_block_only(s,!1),s.strstart++,s.lookahead--,s.strm.avail_out===0)return BS_NEED_MORE}else s.match_available=1,s.strstart++,s.lookahead--}return s.match_available&&(bflush=_tr_tally(s,0,s.window[s.strstart-1]),s.match_available=0),s.insert=s.strstart<MIN_MATCH-1?s.strstart:MIN_MATCH-1,flush===Z_FINISH$3?(flush_block_only(s,!0),s.strm.avail_out===0?BS_FINISH_STARTED:BS_FINISH_DONE):s.sym_next&&(flush_block_only(s,!1),s.strm.avail_out===0)?BS_NEED_MORE:BS_BLOCK_DONE},deflate_rle=(s,flush)=>{let bflush,prev,scan,strend,_win=s.window;for(;;){if(s.lookahead<=MAX_MATCH){if(fill_window(s),s.lookahead<=MAX_MATCH&&flush===Z_NO_FLUSH$2)return BS_NEED_MORE;if(s.lookahead===0)break}if(s.match_length=0,s.lookahead>=MIN_MATCH&&s.strstart>0&&(scan=s.strstart-1,prev=_win[scan],prev===_win[++scan]&&prev===_win[++scan]&&prev===_win[++scan])){strend=s.strstart+MAX_MATCH;do;while(prev===_win[++scan]&&prev===_win[++scan]&&prev===_win[++scan]&&prev===_win[++scan]&&prev===_win[++scan]&&prev===_win[++scan]&&prev===_win[++scan]&&prev===_win[++scan]&&scan<strend);s.match_length=MAX_MATCH-(strend-scan),s.match_length>s.lookahead&&(s.match_length=s.lookahead)}if(s.match_length>=MIN_MATCH?(bflush=_tr_tally(s,1,s.match_length-MIN_MATCH),s.lookahead-=s.match_length,s.strstart+=s.match_length,s.match_length=0):(bflush=_tr_tally(s,0,s.window[s.strstart]),s.lookahead--,s.strstart++),bflush&&(flush_block_only(s,!1),s.strm.avail_out===0))return BS_NEED_MORE}return s.insert=0,flush===Z_FINISH$3?(flush_block_only(s,!0),s.strm.avail_out===0?BS_FINISH_STARTED:BS_FINISH_DONE):s.sym_next&&(flush_block_only(s,!1),s.strm.avail_out===0)?BS_NEED_MORE:BS_BLOCK_DONE},deflate_huff=(s,flush)=>{let bflush;for(;;){if(s.lookahead===0&&(fill_window(s),s.lookahead===0)){if(flush===Z_NO_FLUSH$2)return BS_NEED_MORE;break}if(s.match_length=0,bflush=_tr_tally(s,0,s.window[s.strstart]),s.lookahead--,s.strstart++,bflush&&(flush_block_only(s,!1),s.strm.avail_out===0))return BS_NEED_MORE}return s.insert=0,flush===Z_FINISH$3?(flush_block_only(s,!0),s.strm.avail_out===0?BS_FINISH_STARTED:BS_FINISH_DONE):s.sym_next&&(flush_block_only(s,!1),s.strm.avail_out===0)?BS_NEED_MORE:BS_BLOCK_DONE};function Config(good_length,max_lazy,nice_length,max_chain,func){this.good_length=good_length,this.max_lazy=max_lazy,this.nice_length=nice_length,this.max_chain=max_chain,this.func=func}var configuration_table=[new Config(0,0,0,0,deflate_stored),new Config(4,4,8,4,deflate_fast),new Config(4,5,16,8,deflate_fast),new Config(4,6,32,32,deflate_fast),new Config(4,4,16,16,deflate_slow),new Config(8,16,32,32,deflate_slow),new Config(8,16,128,128,deflate_slow),new Config(8,32,128,256,deflate_slow),new Config(32,128,258,1024,deflate_slow),new Config(32,258,258,4096,deflate_slow)],lm_init=s=>{s.window_size=2*s.w_size,zero(s.head),s.max_lazy_match=configuration_table[s.level].max_lazy,s.good_match=configuration_table[s.level].good_length,s.nice_match=configuration_table[s.level].nice_length,s.max_chain_length=configuration_table[s.level].max_chain,s.strstart=0,s.block_start=0,s.lookahead=0,s.insert=0,s.match_length=s.prev_length=MIN_MATCH-1,s.match_available=0,s.ins_h=0};function DeflateState(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=Z_DEFLATED$2,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new Uint16Array(HEAP_SIZE*2),this.dyn_dtree=new Uint16Array((2*D_CODES+1)*2),this.bl_tree=new Uint16Array((2*BL_CODES+1)*2),zero(this.dyn_ltree),zero(this.dyn_dtree),zero(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new Uint16Array(MAX_BITS+1),this.heap=new Uint16Array(2*L_CODES+1),zero(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new Uint16Array(2*L_CODES+1),zero(this.depth),this.sym_buf=0,this.lit_bufsize=0,this.sym_next=0,this.sym_end=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}var deflateStateCheck=strm=>{if(!strm)return 1;let s=strm.state;return!s||s.strm!==strm||s.status!==INIT_STATE&&s.status!==GZIP_STATE&&s.status!==EXTRA_STATE&&s.status!==NAME_STATE&&s.status!==COMMENT_STATE&&s.status!==HCRC_STATE&&s.status!==BUSY_STATE&&s.status!==FINISH_STATE?1:0},deflateResetKeep=strm=>{if(deflateStateCheck(strm))return err(strm,Z_STREAM_ERROR$2);strm.total_in=strm.total_out=0,strm.data_type=Z_UNKNOWN;let s=strm.state;return s.pending=0,s.pending_out=0,s.wrap<0&&(s.wrap=-s.wrap),s.status=s.wrap===2?GZIP_STATE:s.wrap?INIT_STATE:BUSY_STATE,strm.adler=s.wrap===2?0:1,s.last_flush=-2,_tr_init(s),Z_OK$3},deflateReset=strm=>{let ret=deflateResetKeep(strm);return ret===Z_OK$3&&lm_init(strm.state),ret},deflateSetHeader=(strm,head)=>deflateStateCheck(strm)||strm.state.wrap!==2?Z_STREAM_ERROR$2:(strm.state.gzhead=head,Z_OK$3),deflateInit2=(strm,level,method,windowBits,memLevel,strategy)=>{if(!strm)return Z_STREAM_ERROR$2;let wrap=1;if(level===Z_DEFAULT_COMPRESSION$1&&(level=6),windowBits<0?(wrap=0,windowBits=-windowBits):windowBits>15&&(wrap=2,windowBits-=16),memLevel<1||memLevel>MAX_MEM_LEVEL||method!==Z_DEFLATED$2||windowBits<8||windowBits>15||level<0||level>9||strategy<0||strategy>Z_FIXED||windowBits===8&&wrap!==1)return err(strm,Z_STREAM_ERROR$2);windowBits===8&&(windowBits=9);let s=new DeflateState;return strm.state=s,s.strm=strm,s.status=INIT_STATE,s.wrap=wrap,s.gzhead=null,s.w_bits=windowBits,s.w_size=1<<s.w_bits,s.w_mask=s.w_size-1,s.hash_bits=memLevel+7,s.hash_size=1<<s.hash_bits,s.hash_mask=s.hash_size-1,s.hash_shift=~~((s.hash_bits+MIN_MATCH-1)/MIN_MATCH),s.window=new Uint8Array(s.w_size*2),s.head=new Uint16Array(s.hash_size),s.prev=new Uint16Array(s.w_size),s.lit_bufsize=1<<memLevel+6,s.pending_buf_size=s.lit_bufsize*4,s.pending_buf=new Uint8Array(s.pending_buf_size),s.sym_buf=s.lit_bufsize,s.sym_end=(s.lit_bufsize-1)*3,s.level=level,s.strategy=strategy,s.method=method,deflateReset(strm)},deflateInit=(strm,level)=>deflateInit2(strm,level,Z_DEFLATED$2,MAX_WBITS$1,DEF_MEM_LEVEL,Z_DEFAULT_STRATEGY$1),deflate$2=(strm,flush)=>{if(deflateStateCheck(strm)||flush>Z_BLOCK$1||flush<0)return strm?err(strm,Z_STREAM_ERROR$2):Z_STREAM_ERROR$2;let s=strm.state;if(!strm.output||strm.avail_in!==0&&!strm.input||s.status===FINISH_STATE&&flush!==Z_FINISH$3)return err(strm,strm.avail_out===0?Z_BUF_ERROR$1:Z_STREAM_ERROR$2);let old_flush=s.last_flush;if(s.last_flush=flush,s.pending!==0){if(flush_pending(strm),strm.avail_out===0)return s.last_flush=-1,Z_OK$3}else if(strm.avail_in===0&&rank(flush)<=rank(old_flush)&&flush!==Z_FINISH$3)return err(strm,Z_BUF_ERROR$1);if(s.status===FINISH_STATE&&strm.avail_in!==0)return err(strm,Z_BUF_ERROR$1);if(s.status===INIT_STATE&&s.wrap===0&&(s.status=BUSY_STATE),s.status===INIT_STATE){let header=Z_DEFLATED$2+(s.w_bits-8<<4)<<8,level_flags=-1;if(s.strategy>=Z_HUFFMAN_ONLY||s.level<2?level_flags=0:s.level<6?level_flags=1:s.level===6?level_flags=2:level_flags=3,header|=level_flags<<6,s.strstart!==0&&(header|=PRESET_DICT),header+=31-header%31,putShortMSB(s,header),s.strstart!==0&&(putShortMSB(s,strm.adler>>>16),putShortMSB(s,strm.adler&65535)),strm.adler=1,s.status=BUSY_STATE,flush_pending(strm),s.pending!==0)return s.last_flush=-1,Z_OK$3}if(s.status===GZIP_STATE){if(strm.adler=0,put_byte(s,31),put_byte(s,139),put_byte(s,8),s.gzhead)put_byte(s,(s.gzhead.text?1:0)+(s.gzhead.hcrc?2:0)+(s.gzhead.extra?4:0)+(s.gzhead.name?8:0)+(s.gzhead.comment?16:0)),put_byte(s,s.gzhead.time&255),put_byte(s,s.gzhead.time>>8&255),put_byte(s,s.gzhead.time>>16&255),put_byte(s,s.gzhead.time>>24&255),put_byte(s,s.level===9?2:s.strategy>=Z_HUFFMAN_ONLY||s.level<2?4:0),put_byte(s,s.gzhead.os&255),s.gzhead.extra&&s.gzhead.extra.length&&(put_byte(s,s.gzhead.extra.length&255),put_byte(s,s.gzhead.extra.length>>8&255)),s.gzhead.hcrc&&(strm.adler=crc32_1(strm.adler,s.pending_buf,s.pending,0)),s.gzindex=0,s.status=EXTRA_STATE;else if(put_byte(s,0),put_byte(s,0),put_byte(s,0),put_byte(s,0),put_byte(s,0),put_byte(s,s.level===9?2:s.strategy>=Z_HUFFMAN_ONLY||s.level<2?4:0),put_byte(s,OS_CODE),s.status=BUSY_STATE,flush_pending(strm),s.pending!==0)return s.last_flush=-1,Z_OK$3}if(s.status===EXTRA_STATE){if(s.gzhead.extra){let beg=s.pending,left=(s.gzhead.extra.length&65535)-s.gzindex;for(;s.pending+left>s.pending_buf_size;){let copy=s.pending_buf_size-s.pending;if(s.pending_buf.set(s.gzhead.extra.subarray(s.gzindex,s.gzindex+copy),s.pending),s.pending=s.pending_buf_size,s.gzhead.hcrc&&s.pending>beg&&(strm.adler=crc32_1(strm.adler,s.pending_buf,s.pending-beg,beg)),s.gzindex+=copy,flush_pending(strm),s.pending!==0)return s.last_flush=-1,Z_OK$3;beg=0,left-=copy}let gzhead_extra=new Uint8Array(s.gzhead.extra);s.pending_buf.set(gzhead_extra.subarray(s.gzindex,s.gzindex+left),s.pending),s.pending+=left,s.gzhead.hcrc&&s.pending>beg&&(strm.adler=crc32_1(strm.adler,s.pending_buf,s.pending-beg,beg)),s.gzindex=0}s.status=NAME_STATE}if(s.status===NAME_STATE){if(s.gzhead.name){let beg=s.pending,val;do{if(s.pending===s.pending_buf_size){if(s.gzhead.hcrc&&s.pending>beg&&(strm.adler=crc32_1(strm.adler,s.pending_buf,s.pending-beg,beg)),flush_pending(strm),s.pending!==0)return s.last_flush=-1,Z_OK$3;beg=0}s.gzindex<s.gzhead.name.length?val=s.gzhead.name.charCodeAt(s.gzindex++)&255:val=0,put_byte(s,val)}while(val!==0);s.gzhead.hcrc&&s.pending>beg&&(strm.adler=crc32_1(strm.adler,s.pending_buf,s.pending-beg,beg)),s.gzindex=0}s.status=COMMENT_STATE}if(s.status===COMMENT_STATE){if(s.gzhead.comment){let beg=s.pending,val;do{if(s.pending===s.pending_buf_size){if(s.gzhead.hcrc&&s.pending>beg&&(strm.adler=crc32_1(strm.adler,s.pending_buf,s.pending-beg,beg)),flush_pending(strm),s.pending!==0)return s.last_flush=-1,Z_OK$3;beg=0}s.gzindex<s.gzhead.comment.length?val=s.gzhead.comment.charCodeAt(s.gzindex++)&255:val=0,put_byte(s,val)}while(val!==0);s.gzhead.hcrc&&s.pending>beg&&(strm.adler=crc32_1(strm.adler,s.pending_buf,s.pending-beg,beg))}s.status=HCRC_STATE}if(s.status===HCRC_STATE){if(s.gzhead.hcrc){if(s.pending+2>s.pending_buf_size&&(flush_pending(strm),s.pending!==0))return s.last_flush=-1,Z_OK$3;put_byte(s,strm.adler&255),put_byte(s,strm.adler>>8&255),strm.adler=0}if(s.status=BUSY_STATE,flush_pending(strm),s.pending!==0)return s.last_flush=-1,Z_OK$3}if(strm.avail_in!==0||s.lookahead!==0||flush!==Z_NO_FLUSH$2&&s.status!==FINISH_STATE){let bstate=s.level===0?deflate_stored(s,flush):s.strategy===Z_HUFFMAN_ONLY?deflate_huff(s,flush):s.strategy===Z_RLE?deflate_rle(s,flush):configuration_table[s.level].func(s,flush);if((bstate===BS_FINISH_STARTED||bstate===BS_FINISH_DONE)&&(s.status=FINISH_STATE),bstate===BS_NEED_MORE||bstate===BS_FINISH_STARTED)return strm.avail_out===0&&(s.last_flush=-1),Z_OK$3;if(bstate===BS_BLOCK_DONE&&(flush===Z_PARTIAL_FLUSH?_tr_align(s):flush!==Z_BLOCK$1&&(_tr_stored_block(s,0,0,!1),flush===Z_FULL_FLUSH$1&&(zero(s.head),s.lookahead===0&&(s.strstart=0,s.block_start=0,s.insert=0))),flush_pending(strm),strm.avail_out===0))return s.last_flush=-1,Z_OK$3}return flush!==Z_FINISH$3?Z_OK$3:s.wrap<=0?Z_STREAM_END$3:(s.wrap===2?(put_byte(s,strm.adler&255),put_byte(s,strm.adler>>8&255),put_byte(s,strm.adler>>16&255),put_byte(s,strm.adler>>24&255),put_byte(s,strm.total_in&255),put_byte(s,strm.total_in>>8&255),put_byte(s,strm.total_in>>16&255),put_byte(s,strm.total_in>>24&255)):(putShortMSB(s,strm.adler>>>16),putShortMSB(s,strm.adler&65535)),flush_pending(strm),s.wrap>0&&(s.wrap=-s.wrap),s.pending!==0?Z_OK$3:Z_STREAM_END$3)},deflateEnd=strm=>{if(deflateStateCheck(strm))return Z_STREAM_ERROR$2;let status=strm.state.status;return strm.state=null,status===BUSY_STATE?err(strm,Z_DATA_ERROR$2):Z_OK$3},deflateSetDictionary=(strm,dictionary)=>{let dictLength=dictionary.length;if(deflateStateCheck(strm))return Z_STREAM_ERROR$2;let s=strm.state,wrap=s.wrap;if(wrap===2||wrap===1&&s.status!==INIT_STATE||s.lookahead)return Z_STREAM_ERROR$2;if(wrap===1&&(strm.adler=adler32_1(strm.adler,dictionary,dictLength,0)),s.wrap=0,dictLength>=s.w_size){wrap===0&&(zero(s.head),s.strstart=0,s.block_start=0,s.insert=0);let tmpDict=new Uint8Array(s.w_size);tmpDict.set(dictionary.subarray(dictLength-s.w_size,dictLength),0),dictionary=tmpDict,dictLength=s.w_size}let avail=strm.avail_in,next=strm.next_in,input=strm.input;for(strm.avail_in=dictLength,strm.next_in=0,strm.input=dictionary,fill_window(s);s.lookahead>=MIN_MATCH;){let str2=s.strstart,n=s.lookahead-(MIN_MATCH-1);do s.ins_h=HASH(s,s.ins_h,s.window[str2+MIN_MATCH-1]),s.prev[str2&s.w_mask]=s.head[s.ins_h],s.head[s.ins_h]=str2,str2++;while(--n);s.strstart=str2,s.lookahead=MIN_MATCH-1,fill_window(s)}return s.strstart+=s.lookahead,s.block_start=s.strstart,s.insert=s.lookahead,s.lookahead=0,s.match_length=s.prev_length=MIN_MATCH-1,s.match_available=0,strm.next_in=next,strm.input=input,strm.avail_in=avail,s.wrap=wrap,Z_OK$3},deflateInit_1=deflateInit,deflateInit2_1=deflateInit2,deflateReset_1=deflateReset,deflateResetKeep_1=deflateResetKeep,deflateSetHeader_1=deflateSetHeader,deflate_2$1=deflate$2,deflateEnd_1=deflateEnd,deflateSetDictionary_1=deflateSetDictionary,deflateInfo="pako deflate (from Nodeca project)",deflate_1$2={deflateInit:deflateInit_1,deflateInit2:deflateInit2_1,deflateReset:deflateReset_1,deflateResetKeep:deflateResetKeep_1,deflateSetHeader:deflateSetHeader_1,deflate:deflate_2$1,deflateEnd:deflateEnd_1,deflateSetDictionary:deflateSetDictionary_1,deflateInfo},_has=(obj,key)=>Object.prototype.hasOwnProperty.call(obj,key),assign=function(obj){let sources=Array.prototype.slice.call(arguments,1);for(;sources.length;){let source=sources.shift();if(source){if(typeof source!="object")throw new TypeError(source+"must be non-object");for(let p in source)_has(source,p)&&(obj[p]=source[p])}}return obj},flattenChunks=chunks=>{let len=0;for(let i=0,l=chunks.length;i<l;i++)len+=chunks[i].length;let result=new Uint8Array(len);for(let i=0,pos=0,l=chunks.length;i<l;i++){let chunk2=chunks[i];result.set(chunk2,pos),pos+=chunk2.length}return result},common={assign,flattenChunks},STR_APPLY_UIA_OK=!0;try{String.fromCharCode.apply(null,new Uint8Array(1))}catch{STR_APPLY_UIA_OK=!1}var _utf8len=new Uint8Array(256);for(let q=0;q<256;q++)_utf8len[q]=q>=252?6:q>=248?5:q>=240?4:q>=224?3:q>=192?2:1;_utf8len[254]=_utf8len[254]=1;var string2buf=str2=>{if(typeof TextEncoder=="function"&&TextEncoder.prototype.encode)return new TextEncoder().encode(str2);let buf,c,c2,m_pos,i,str_len=str2.length,buf_len=0;for(m_pos=0;m_pos<str_len;m_pos++)c=str2.charCodeAt(m_pos),(c&64512)===55296&&m_pos+1<str_len&&(c2=str2.charCodeAt(m_pos+1),(c2&64512)===56320&&(c=65536+(c-55296<<10)+(c2-56320),m_pos++)),buf_len+=c<128?1:c<2048?2:c<65536?3:4;for(buf=new Uint8Array(buf_len),i=0,m_pos=0;i<buf_len;m_pos++)c=str2.charCodeAt(m_pos),(c&64512)===55296&&m_pos+1<str_len&&(c2=str2.charCodeAt(m_pos+1),(c2&64512)===56320&&(c=65536+(c-55296<<10)+(c2-56320),m_pos++)),c<128?buf[i++]=c:c<2048?(buf[i++]=192|c>>>6,buf[i++]=128|c&63):c<65536?(buf[i++]=224|c>>>12,buf[i++]=128|c>>>6&63,buf[i++]=128|c&63):(buf[i++]=240|c>>>18,buf[i++]=128|c>>>12&63,buf[i++]=128|c>>>6&63,buf[i++]=128|c&63);return buf},buf2binstring=(buf,len)=>{if(len<65534&&buf.subarray&&STR_APPLY_UIA_OK)return String.fromCharCode.apply(null,buf.length===len?buf:buf.subarray(0,len));let result="";for(let i=0;i<len;i++)result+=String.fromCharCode(buf[i]);return result},buf2string=(buf,max)=>{let len=max||buf.length;if(typeof TextDecoder=="function"&&TextDecoder.prototype.decode)return new TextDecoder().decode(buf.subarray(0,max));let i,out,utf16buf=new Array(len*2);for(out=0,i=0;i<len;){let c=buf[i++];if(c<128){utf16buf[out++]=c;continue}let c_len=_utf8len[c];if(c_len>4){utf16buf[out++]=65533,i+=c_len-1;continue}for(c&=c_len===2?31:c_len===3?15:7;c_len>1&&i<len;)c=c<<6|buf[i++]&63,c_len--;if(c_len>1){utf16buf[out++]=65533;continue}c<65536?utf16buf[out++]=c:(c-=65536,utf16buf[out++]=55296|c>>10&1023,utf16buf[out++]=56320|c&1023)}return buf2binstring(utf16buf,out)},utf8border=(buf,max)=>{max=max||buf.length,max>buf.length&&(max=buf.length);let pos=max-1;for(;pos>=0&&(buf[pos]&192)===128;)pos--;return pos<0||pos===0?max:pos+_utf8len[buf[pos]]>max?pos:max},strings={string2buf,buf2string,utf8border};function ZStream(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}var zstream=ZStream,toString$1=Object.prototype.toString,{Z_NO_FLUSH:Z_NO_FLUSH$1,Z_SYNC_FLUSH,Z_FULL_FLUSH,Z_FINISH:Z_FINISH$2,Z_OK:Z_OK$2,Z_STREAM_END:Z_STREAM_END$2,Z_DEFAULT_COMPRESSION,Z_DEFAULT_STRATEGY,Z_DEFLATED:Z_DEFLATED$1}=constants$2;function Deflate$1(options){this.options=common.assign({level:Z_DEFAULT_COMPRESSION,method:Z_DEFLATED$1,chunkSize:16384,windowBits:15,memLevel:8,strategy:Z_DEFAULT_STRATEGY},options||{});let opt=this.options;opt.raw&&opt.windowBits>0?opt.windowBits=-opt.windowBits:opt.gzip&&opt.windowBits>0&&opt.windowBits<16&&(opt.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new zstream,this.strm.avail_out=0;let status=deflate_1$2.deflateInit2(this.strm,opt.level,opt.method,opt.windowBits,opt.memLevel,opt.strategy);if(status!==Z_OK$2)throw new Error(messages[status]);if(opt.header&&deflate_1$2.deflateSetHeader(this.strm,opt.header),opt.dictionary){let dict;if(typeof opt.dictionary=="string"?dict=strings.string2buf(opt.dictionary):toString$1.call(opt.dictionary)==="[object ArrayBuffer]"?dict=new Uint8Array(opt.dictionary):dict=opt.dictionary,status=deflate_1$2.deflateSetDictionary(this.strm,dict),status!==Z_OK$2)throw new Error(messages[status]);this._dict_set=!0}}Deflate$1.prototype.push=function(data,flush_mode){let strm=this.strm,chunkSize=this.options.chunkSize,status,_flush_mode;if(this.ended)return!1;for(flush_mode===~~flush_mode?_flush_mode=flush_mode:_flush_mode=flush_mode===!0?Z_FINISH$2:Z_NO_FLUSH$1,typeof data=="string"?strm.input=strings.string2buf(data):toString$1.call(data)==="[object ArrayBuffer]"?strm.input=new Uint8Array(data):strm.input=data,strm.next_in=0,strm.avail_in=strm.input.length;;){if(strm.avail_out===0&&(strm.output=new Uint8Array(chunkSize),strm.next_out=0,strm.avail_out=chunkSize),(_flush_mode===Z_SYNC_FLUSH||_flush_mode===Z_FULL_FLUSH)&&strm.avail_out<=6){this.onData(strm.output.subarray(0,strm.next_out)),strm.avail_out=0;continue}if(status=deflate_1$2.deflate(strm,_flush_mode),status===Z_STREAM_END$2)return strm.next_out>0&&this.onData(strm.output.subarray(0,strm.next_out)),status=deflate_1$2.deflateEnd(this.strm),this.onEnd(status),this.ended=!0,status===Z_OK$2;if(strm.avail_out===0){this.onData(strm.output);continue}if(_flush_mode>0&&strm.next_out>0){this.onData(strm.output.subarray(0,strm.next_out)),strm.avail_out=0;continue}if(strm.avail_in===0)break}return!0};Deflate$1.prototype.onData=function(chunk2){this.chunks.push(chunk2)};Deflate$1.prototype.onEnd=function(status){status===Z_OK$2&&(this.result=common.flattenChunks(this.chunks)),this.chunks=[],this.err=status,this.msg=this.strm.msg};function deflate$1(input,options){let deflator=new Deflate$1(options);if(deflator.push(input,!0),deflator.err)throw deflator.msg||messages[deflator.err];return deflator.result}function deflateRaw$1(input,options){return options=options||{},options.raw=!0,deflate$1(input,options)}function gzip$1(input,options){return options=options||{},options.gzip=!0,deflate$1(input,options)}var Deflate_1$1=Deflate$1,deflate_2=deflate$1,deflateRaw_1$1=deflateRaw$1,gzip_1$1=gzip$1,constants$1=constants$2,deflate_1$1={Deflate:Deflate_1$1,deflate:deflate_2,deflateRaw:deflateRaw_1$1,gzip:gzip_1$1,constants:constants$1},BAD$1=16209,TYPE$1=16191,inffast=function(strm,start){let _in,last,_out,beg,end,dmax,wsize,whave,wnext,s_window,hold,bits,lcode,dcode,lmask,dmask,here,op,len,dist,from,from_source,input,output,state=strm.state;_in=strm.next_in,input=strm.input,last=_in+(strm.avail_in-5),_out=strm.next_out,output=strm.output,beg=_out-(start-strm.avail_out),end=_out+(strm.avail_out-257),dmax=state.dmax,wsize=state.wsize,whave=state.whave,wnext=state.wnext,s_window=state.window,hold=state.hold,bits=state.bits,lcode=state.lencode,dcode=state.distcode,lmask=(1<<state.lenbits)-1,dmask=(1<<state.distbits)-1;top:do{bits<15&&(hold+=input[_in++]<<bits,bits+=8,hold+=input[_in++]<<bits,bits+=8),here=lcode[hold&lmask];dolen:for(;;){if(op=here>>>24,hold>>>=op,bits-=op,op=here>>>16&255,op===0)output[_out++]=here&65535;else if(op&16){len=here&65535,op&=15,op&&(bits<op&&(hold+=input[_in++]<<bits,bits+=8),len+=hold&(1<<op)-1,hold>>>=op,bits-=op),bits<15&&(hold+=input[_in++]<<bits,bits+=8,hold+=input[_in++]<<bits,bits+=8),here=dcode[hold&dmask];dodist:for(;;){if(op=here>>>24,hold>>>=op,bits-=op,op=here>>>16&255,op&16){if(dist=here&65535,op&=15,bits<op&&(hold+=input[_in++]<<bits,bits+=8,bits<op&&(hold+=input[_in++]<<bits,bits+=8)),dist+=hold&(1<<op)-1,dist>dmax){strm.msg="invalid distance too far back",state.mode=BAD$1;break top}if(hold>>>=op,bits-=op,op=_out-beg,dist>op){if(op=dist-op,op>whave&&state.sane){strm.msg="invalid distance too far back",state.mode=BAD$1;break top}if(from=0,from_source=s_window,wnext===0){if(from+=wsize-op,op<len){len-=op;do output[_out++]=s_window[from++];while(--op);from=_out-dist,from_source=output}}else if(wnext<op){if(from+=wsize+wnext-op,op-=wnext,op<len){len-=op;do output[_out++]=s_window[from++];while(--op);if(from=0,wnext<len){op=wnext,len-=op;do output[_out++]=s_window[from++];while(--op);from=_out-dist,from_source=output}}}else if(from+=wnext-op,op<len){len-=op;do output[_out++]=s_window[from++];while(--op);from=_out-dist,from_source=output}for(;len>2;)output[_out++]=from_source[from++],output[_out++]=from_source[from++],output[_out++]=from_source[from++],len-=3;len&&(output[_out++]=from_source[from++],len>1&&(output[_out++]=from_source[from++]))}else{from=_out-dist;do output[_out++]=output[from++],output[_out++]=output[from++],output[_out++]=output[from++],len-=3;while(len>2);len&&(output[_out++]=output[from++],len>1&&(output[_out++]=output[from++]))}}else if((op&64)===0){here=dcode[(here&65535)+(hold&(1<<op)-1)];continue dodist}else{strm.msg="invalid distance code",state.mode=BAD$1;break top}break}}else if((op&64)===0){here=lcode[(here&65535)+(hold&(1<<op)-1)];continue dolen}else if(op&32){state.mode=TYPE$1;break top}else{strm.msg="invalid literal/length code",state.mode=BAD$1;break top}break}}while(_in<last&&_out<end);len=bits>>3,_in-=len,bits-=len<<3,hold&=(1<<bits)-1,strm.next_in=_in,strm.next_out=_out,strm.avail_in=_in<last?5+(last-_in):5-(_in-last),strm.avail_out=_out<end?257+(end-_out):257-(_out-end),state.hold=hold,state.bits=bits},MAXBITS=15,ENOUGH_LENS$1=852,ENOUGH_DISTS$1=592,CODES$1=0,LENS$1=1,DISTS$1=2,lbase=new Uint16Array([3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0]),lext=new Uint8Array([16,16,16,16,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,16,72,78]),dbase=new Uint16Array([1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0]),dext=new Uint8Array([16,16,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,64,64]),inflate_table=(type,lens,lens_index,codes,table,table_index,work,opts)=>{let bits=opts.bits,len=0,sym=0,min=0,max=0,root=0,curr=0,drop=0,left=0,used=0,huff=0,incr,fill,low,mask,next,base=null,match,count2=new Uint16Array(MAXBITS+1),offs=new Uint16Array(MAXBITS+1),extra=null,here_bits,here_op,here_val;for(len=0;len<=MAXBITS;len++)count2[len]=0;for(sym=0;sym<codes;sym++)count2[lens[lens_index+sym]]++;for(root=bits,max=MAXBITS;max>=1&&count2[max]===0;max--);if(root>max&&(root=max),max===0)return table[table_index++]=1<<24|64<<16|0,table[table_index++]=1<<24|64<<16|0,opts.bits=1,0;for(min=1;min<max&&count2[min]===0;min++);for(root<min&&(root=min),left=1,len=1;len<=MAXBITS;len++)if(left<<=1,left-=count2[len],left<0)return-1;if(left>0&&(type===CODES$1||max!==1))return-1;for(offs[1]=0,len=1;len<MAXBITS;len++)offs[len+1]=offs[len]+count2[len];for(sym=0;sym<codes;sym++)lens[lens_index+sym]!==0&&(work[offs[lens[lens_index+sym]]++]=sym);if(type===CODES$1?(base=extra=work,match=20):type===LENS$1?(base=lbase,extra=lext,match=257):(base=dbase,extra=dext,match=0),huff=0,sym=0,len=min,next=table_index,curr=root,drop=0,low=-1,used=1<<root,mask=used-1,type===LENS$1&&used>ENOUGH_LENS$1||type===DISTS$1&&used>ENOUGH_DISTS$1)return 1;for(;;){here_bits=len-drop,work[sym]+1<match?(here_op=0,here_val=work[sym]):work[sym]>=match?(here_op=extra[work[sym]-match],here_val=base[work[sym]-match]):(here_op=96,here_val=0),incr=1<<len-drop,fill=1<<curr,min=fill;do fill-=incr,table[next+(huff>>drop)+fill]=here_bits<<24|here_op<<16|here_val|0;while(fill!==0);for(incr=1<<len-1;huff&incr;)incr>>=1;if(incr!==0?(huff&=incr-1,huff+=incr):huff=0,sym++,--count2[len]===0){if(len===max)break;len=lens[lens_index+work[sym]]}if(len>root&&(huff&mask)!==low){for(drop===0&&(drop=root),next+=min,curr=len-drop,left=1<<curr;curr+drop<max&&(left-=count2[curr+drop],!(left<=0));)curr++,left<<=1;if(used+=1<<curr,type===LENS$1&&used>ENOUGH_LENS$1||type===DISTS$1&&used>ENOUGH_DISTS$1)return 1;low=huff&mask,table[low]=root<<24|curr<<16|next-table_index|0}}return huff!==0&&(table[next+huff]=len-drop<<24|64<<16|0),opts.bits=root,0},inftrees=inflate_table,CODES=0,LENS=1,DISTS=2,{Z_FINISH:Z_FINISH$1,Z_BLOCK,Z_TREES,Z_OK:Z_OK$1,Z_STREAM_END:Z_STREAM_END$1,Z_NEED_DICT:Z_NEED_DICT$1,Z_STREAM_ERROR:Z_STREAM_ERROR$1,Z_DATA_ERROR:Z_DATA_ERROR$1,Z_MEM_ERROR:Z_MEM_ERROR$1,Z_BUF_ERROR,Z_DEFLATED}=constants$2,HEAD=16180,FLAGS=16181,TIME=16182,OS=16183,EXLEN=16184,EXTRA=16185,NAME=16186,COMMENT=16187,HCRC=16188,DICTID=16189,DICT=16190,TYPE=16191,TYPEDO=16192,STORED=16193,COPY_=16194,COPY=16195,TABLE=16196,LENLENS=16197,CODELENS=16198,LEN_=16199,LEN=16200,LENEXT=16201,DIST=16202,DISTEXT=16203,MATCH=16204,LIT=16205,CHECK=16206,LENGTH=16207,DONE=16208,BAD=16209,MEM=16210,SYNC=16211,ENOUGH_LENS=852,ENOUGH_DISTS=592,MAX_WBITS=15,DEF_WBITS=MAX_WBITS,zswap32=q=>(q>>>24&255)+(q>>>8&65280)+((q&65280)<<8)+((q&255)<<24);function InflateState(){this.strm=null,this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new Uint16Array(320),this.work=new Uint16Array(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}var inflateStateCheck=strm=>{if(!strm)return 1;let state=strm.state;return!state||state.strm!==strm||state.mode<HEAD||state.mode>SYNC?1:0},inflateResetKeep=strm=>{if(inflateStateCheck(strm))return Z_STREAM_ERROR$1;let state=strm.state;return strm.total_in=strm.total_out=state.total=0,strm.msg="",state.wrap&&(strm.adler=state.wrap&1),state.mode=HEAD,state.last=0,state.havedict=0,state.flags=-1,state.dmax=32768,state.head=null,state.hold=0,state.bits=0,state.lencode=state.lendyn=new Int32Array(ENOUGH_LENS),state.distcode=state.distdyn=new Int32Array(ENOUGH_DISTS),state.sane=1,state.back=-1,Z_OK$1},inflateReset=strm=>{if(inflateStateCheck(strm))return Z_STREAM_ERROR$1;let state=strm.state;return state.wsize=0,state.whave=0,state.wnext=0,inflateResetKeep(strm)},inflateReset2=(strm,windowBits)=>{let wrap;if(inflateStateCheck(strm))return Z_STREAM_ERROR$1;let state=strm.state;return windowBits<0?(wrap=0,windowBits=-windowBits):(wrap=(windowBits>>4)+5,windowBits<48&&(windowBits&=15)),windowBits&&(windowBits<8||windowBits>15)?Z_STREAM_ERROR$1:(state.window!==null&&state.wbits!==windowBits&&(state.window=null),state.wrap=wrap,state.wbits=windowBits,inflateReset(strm))},inflateInit2=(strm,windowBits)=>{if(!strm)return Z_STREAM_ERROR$1;let state=new InflateState;strm.state=state,state.strm=strm,state.window=null,state.mode=HEAD;let ret=inflateReset2(strm,windowBits);return ret!==Z_OK$1&&(strm.state=null),ret},inflateInit=strm=>inflateInit2(strm,DEF_WBITS),virgin=!0,lenfix,distfix,fixedtables=state=>{if(virgin){lenfix=new Int32Array(512),distfix=new Int32Array(32);let sym=0;for(;sym<144;)state.lens[sym++]=8;for(;sym<256;)state.lens[sym++]=9;for(;sym<280;)state.lens[sym++]=7;for(;sym<288;)state.lens[sym++]=8;for(inftrees(LENS,state.lens,0,288,lenfix,0,state.work,{bits:9}),sym=0;sym<32;)state.lens[sym++]=5;inftrees(DISTS,state.lens,0,32,distfix,0,state.work,{bits:5}),virgin=!1}state.lencode=lenfix,state.lenbits=9,state.distcode=distfix,state.distbits=5},updatewindow=(strm,src,end,copy)=>{let dist,state=strm.state;return state.window===null&&(state.wsize=1<<state.wbits,state.wnext=0,state.whave=0,state.window=new Uint8Array(state.wsize)),copy>=state.wsize?(state.window.set(src.subarray(end-state.wsize,end),0),state.wnext=0,state.whave=state.wsize):(dist=state.wsize-state.wnext,dist>copy&&(dist=copy),state.window.set(src.subarray(end-copy,end-copy+dist),state.wnext),copy-=dist,copy?(state.window.set(src.subarray(end-copy,end),0),state.wnext=copy,state.whave=state.wsize):(state.wnext+=dist,state.wnext===state.wsize&&(state.wnext=0),state.whave<state.wsize&&(state.whave+=dist))),0},inflate$2=(strm,flush)=>{let state,input,output,next,put,have,left,hold,bits,_in,_out,copy,from,from_source,here=0,here_bits,here_op,here_val,last_bits,last_op,last_val,len,ret,hbuf=new Uint8Array(4),opts,n,order=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);if(inflateStateCheck(strm)||!strm.output||!strm.input&&strm.avail_in!==0)return Z_STREAM_ERROR$1;state=strm.state,state.mode===TYPE&&(state.mode=TYPEDO),put=strm.next_out,output=strm.output,left=strm.avail_out,next=strm.next_in,input=strm.input,have=strm.avail_in,hold=state.hold,bits=state.bits,_in=have,_out=left,ret=Z_OK$1;inf_leave:for(;;)switch(state.mode){case HEAD:if(state.wrap===0){state.mode=TYPEDO;break}for(;bits<16;){if(have===0)break inf_leave;have--,hold+=input[next++]<<bits,bits+=8}if(state.wrap&2&&hold===35615){state.wbits===0&&(state.wbits=15),state.check=0,hbuf[0]=hold&255,hbuf[1]=hold>>>8&255,state.check=crc32_1(state.check,hbuf,2,0),hold=0,bits=0,state.mode=FLAGS;break}if(state.head&&(state.head.done=!1),!(state.wrap&1)||(((hold&255)<<8)+(hold>>8))%31){strm.msg="incorrect header check",state.mode=BAD;break}if((hold&15)!==Z_DEFLATED){strm.msg="unknown compression method",state.mode=BAD;break}if(hold>>>=4,bits-=4,len=(hold&15)+8,state.wbits===0&&(state.wbits=len),len>15||len>state.wbits){strm.msg="invalid window size",state.mode=BAD;break}state.dmax=1<<state.wbits,state.flags=0,strm.adler=state.check=1,state.mode=hold&512?DICTID:TYPE,hold=0,bits=0;break;case FLAGS:for(;bits<16;){if(have===0)break inf_leave;have--,hold+=input[next++]<<bits,bits+=8}if(state.flags=hold,(state.flags&255)!==Z_DEFLATED){strm.msg="unknown compression method",state.mode=BAD;break}if(state.flags&57344){strm.msg="unknown header flags set",state.mode=BAD;break}state.head&&(state.head.text=hold>>8&1),state.flags&512&&state.wrap&4&&(hbuf[0]=hold&255,hbuf[1]=hold>>>8&255,state.check=crc32_1(state.check,hbuf,2,0)),hold=0,bits=0,state.mode=TIME;case TIME:for(;bits<32;){if(have===0)break inf_leave;have--,hold+=input[next++]<<bits,bits+=8}state.head&&(state.head.time=hold),state.flags&512&&state.wrap&4&&(hbuf[0]=hold&255,hbuf[1]=hold>>>8&255,hbuf[2]=hold>>>16&255,hbuf[3]=hold>>>24&255,state.check=crc32_1(state.check,hbuf,4,0)),hold=0,bits=0,state.mode=OS;case OS:for(;bits<16;){if(have===0)break inf_leave;have--,hold+=input[next++]<<bits,bits+=8}state.head&&(state.head.xflags=hold&255,state.head.os=hold>>8),state.flags&512&&state.wrap&4&&(hbuf[0]=hold&255,hbuf[1]=hold>>>8&255,state.check=crc32_1(state.check,hbuf,2,0)),hold=0,bits=0,state.mode=EXLEN;case EXLEN:if(state.flags&1024){for(;bits<16;){if(have===0)break inf_leave;have--,hold+=input[next++]<<bits,bits+=8}state.length=hold,state.head&&(state.head.extra_len=hold),state.flags&512&&state.wrap&4&&(hbuf[0]=hold&255,hbuf[1]=hold>>>8&255,state.check=crc32_1(state.check,hbuf,2,0)),hold=0,bits=0}else state.head&&(state.head.extra=null);state.mode=EXTRA;case EXTRA:if(state.flags&1024&&(copy=state.length,copy>have&&(copy=have),copy&&(state.head&&(len=state.head.extra_len-state.length,state.head.extra||(state.head.extra=new Uint8Array(state.head.extra_len)),state.head.extra.set(input.subarray(next,next+copy),len)),state.flags&512&&state.wrap&4&&(state.check=crc32_1(state.check,input,copy,next)),have-=copy,next+=copy,state.length-=copy),state.length))break inf_leave;state.length=0,state.mode=NAME;case NAME:if(state.flags&2048){if(have===0)break inf_leave;copy=0;do len=input[next+copy++],state.head&&len&&state.length<65536&&(state.head.name+=String.fromCharCode(len));while(len&&copy<have);if(state.flags&512&&state.wrap&4&&(state.check=crc32_1(state.check,input,copy,next)),have-=copy,next+=copy,len)break inf_leave}else state.head&&(state.head.name=null);state.length=0,state.mode=COMMENT;case COMMENT:if(state.flags&4096){if(have===0)break inf_leave;copy=0;do len=input[next+copy++],state.head&&len&&state.length<65536&&(state.head.comment+=String.fromCharCode(len));while(len&&copy<have);if(state.flags&512&&state.wrap&4&&(state.check=crc32_1(state.check,input,copy,next)),have-=copy,next+=copy,len)break inf_leave}else state.head&&(state.head.comment=null);state.mode=HCRC;case HCRC:if(state.flags&512){for(;bits<16;){if(have===0)break inf_leave;have--,hold+=input[next++]<<bits,bits+=8}if(state.wrap&4&&hold!==(state.check&65535)){strm.msg="header crc mismatch",state.mode=BAD;break}hold=0,bits=0}state.head&&(state.head.hcrc=state.flags>>9&1,state.head.done=!0),strm.adler=state.check=0,state.mode=TYPE;break;case DICTID:for(;bits<32;){if(have===0)break inf_leave;have--,hold+=input[next++]<<bits,bits+=8}strm.adler=state.check=zswap32(hold),hold=0,bits=0,state.mode=DICT;case DICT:if(state.havedict===0)return strm.next_out=put,strm.avail_out=left,strm.next_in=next,strm.avail_in=have,state.hold=hold,state.bits=bits,Z_NEED_DICT$1;strm.adler=state.check=1,state.mode=TYPE;case TYPE:if(flush===Z_BLOCK||flush===Z_TREES)break inf_leave;case TYPEDO:if(state.last){hold>>>=bits&7,bits-=bits&7,state.mode=CHECK;break}for(;bits<3;){if(have===0)break inf_leave;have--,hold+=input[next++]<<bits,bits+=8}switch(state.last=hold&1,hold>>>=1,bits-=1,hold&3){case 0:state.mode=STORED;break;case 1:if(fixedtables(state),state.mode=LEN_,flush===Z_TREES){hold>>>=2,bits-=2;break inf_leave}break;case 2:state.mode=TABLE;break;case 3:strm.msg="invalid block type",state.mode=BAD}hold>>>=2,bits-=2;break;case STORED:for(hold>>>=bits&7,bits-=bits&7;bits<32;){if(have===0)break inf_leave;have--,hold+=input[next++]<<bits,bits+=8}if((hold&65535)!==(hold>>>16^65535)){strm.msg="invalid stored block lengths",state.mode=BAD;break}if(state.length=hold&65535,hold=0,bits=0,state.mode=COPY_,flush===Z_TREES)break inf_leave;case COPY_:state.mode=COPY;case COPY:if(copy=state.length,copy){if(copy>have&&(copy=have),copy>left&&(copy=left),copy===0)break inf_leave;output.set(input.subarray(next,next+copy),put),have-=copy,next+=copy,left-=copy,put+=copy,state.length-=copy;break}state.mode=TYPE;break;case TABLE:for(;bits<14;){if(have===0)break inf_leave;have--,hold+=input[next++]<<bits,bits+=8}if(state.nlen=(hold&31)+257,hold>>>=5,bits-=5,state.ndist=(hold&31)+1,hold>>>=5,bits-=5,state.ncode=(hold&15)+4,hold>>>=4,bits-=4,state.nlen>286||state.ndist>30){strm.msg="too many length or distance symbols",state.mode=BAD;break}state.have=0,state.mode=LENLENS;case LENLENS:for(;state.have<state.ncode;){for(;bits<3;){if(have===0)break inf_leave;have--,hold+=input[next++]<<bits,bits+=8}state.lens[order[state.have++]]=hold&7,hold>>>=3,bits-=3}for(;state.have<19;)state.lens[order[state.have++]]=0;if(state.lencode=state.lendyn,state.lenbits=7,opts={bits:state.lenbits},ret=inftrees(CODES,state.lens,0,19,state.lencode,0,state.work,opts),state.lenbits=opts.bits,ret){strm.msg="invalid code lengths set",state.mode=BAD;break}state.have=0,state.mode=CODELENS;case CODELENS:for(;state.have<state.nlen+state.ndist;){for(;here=state.lencode[hold&(1<<state.lenbits)-1],here_bits=here>>>24,here_op=here>>>16&255,here_val=here&65535,!(here_bits<=bits);){if(have===0)break inf_leave;have--,hold+=input[next++]<<bits,bits+=8}if(here_val<16)hold>>>=here_bits,bits-=here_bits,state.lens[state.have++]=here_val;else{if(here_val===16){for(n=here_bits+2;bits<n;){if(have===0)break inf_leave;have--,hold+=input[next++]<<bits,bits+=8}if(hold>>>=here_bits,bits-=here_bits,state.have===0){strm.msg="invalid bit length repeat",state.mode=BAD;break}len=state.lens[state.have-1],copy=3+(hold&3),hold>>>=2,bits-=2}else if(here_val===17){for(n=here_bits+3;bits<n;){if(have===0)break inf_leave;have--,hold+=input[next++]<<bits,bits+=8}hold>>>=here_bits,bits-=here_bits,len=0,copy=3+(hold&7),hold>>>=3,bits-=3}else{for(n=here_bits+7;bits<n;){if(have===0)break inf_leave;have--,hold+=input[next++]<<bits,bits+=8}hold>>>=here_bits,bits-=here_bits,len=0,copy=11+(hold&127),hold>>>=7,bits-=7}if(state.have+copy>state.nlen+state.ndist){strm.msg="invalid bit length repeat",state.mode=BAD;break}for(;copy--;)state.lens[state.have++]=len}}if(state.mode===BAD)break;if(state.lens[256]===0){strm.msg="invalid code -- missing end-of-block",state.mode=BAD;break}if(state.lenbits=9,opts={bits:state.lenbits},ret=inftrees(LENS,state.lens,0,state.nlen,state.lencode,0,state.work,opts),state.lenbits=opts.bits,ret){strm.msg="invalid literal/lengths set",state.mode=BAD;break}if(state.distbits=6,state.distcode=state.distdyn,opts={bits:state.distbits},ret=inftrees(DISTS,state.lens,state.nlen,state.ndist,state.distcode,0,state.work,opts),state.distbits=opts.bits,ret){strm.msg="invalid distances set",state.mode=BAD;break}if(state.mode=LEN_,flush===Z_TREES)break inf_leave;case LEN_:state.mode=LEN;case LEN:if(have>=6&&left>=258){strm.next_out=put,strm.avail_out=left,strm.next_in=next,strm.avail_in=have,state.hold=hold,state.bits=bits,inffast(strm,_out),put=strm.next_out,output=strm.output,left=strm.avail_out,next=strm.next_in,input=strm.input,have=strm.avail_in,hold=state.hold,bits=state.bits,state.mode===TYPE&&(state.back=-1);break}for(state.back=0;here=state.lencode[hold&(1<<state.lenbits)-1],here_bits=here>>>24,here_op=here>>>16&255,here_val=here&65535,!(here_bits<=bits);){if(have===0)break inf_leave;have--,hold+=input[next++]<<bits,bits+=8}if(here_op&&(here_op&240)===0){for(last_bits=here_bits,last_op=here_op,last_val=here_val;here=state.lencode[last_val+((hold&(1<<last_bits+last_op)-1)>>last_bits)],here_bits=here>>>24,here_op=here>>>16&255,here_val=here&65535,!(last_bits+here_bits<=bits);){if(have===0)break inf_leave;have--,hold+=input[next++]<<bits,bits+=8}hold>>>=last_bits,bits-=last_bits,state.back+=last_bits}if(hold>>>=here_bits,bits-=here_bits,state.back+=here_bits,state.length=here_val,here_op===0){state.mode=LIT;break}if(here_op&32){state.back=-1,state.mode=TYPE;break}if(here_op&64){strm.msg="invalid literal/length code",state.mode=BAD;break}state.extra=here_op&15,state.mode=LENEXT;case LENEXT:if(state.extra){for(n=state.extra;bits<n;){if(have===0)break inf_leave;have--,hold+=input[next++]<<bits,bits+=8}state.length+=hold&(1<<state.extra)-1,hold>>>=state.extra,bits-=state.extra,state.back+=state.extra}state.was=state.length,state.mode=DIST;case DIST:for(;here=state.distcode[hold&(1<<state.distbits)-1],here_bits=here>>>24,here_op=here>>>16&255,here_val=here&65535,!(here_bits<=bits);){if(have===0)break inf_leave;have--,hold+=input[next++]<<bits,bits+=8}if((here_op&240)===0){for(last_bits=here_bits,last_op=here_op,last_val=here_val;here=state.distcode[last_val+((hold&(1<<last_bits+last_op)-1)>>last_bits)],here_bits=here>>>24,here_op=here>>>16&255,here_val=here&65535,!(last_bits+here_bits<=bits);){if(have===0)break inf_leave;have--,hold+=input[next++]<<bits,bits+=8}hold>>>=last_bits,bits-=last_bits,state.back+=last_bits}if(hold>>>=here_bits,bits-=here_bits,state.back+=here_bits,here_op&64){strm.msg="invalid distance code",state.mode=BAD;break}state.offset=here_val,state.extra=here_op&15,state.mode=DISTEXT;case DISTEXT:if(state.extra){for(n=state.extra;bits<n;){if(have===0)break inf_leave;have--,hold+=input[next++]<<bits,bits+=8}state.offset+=hold&(1<<state.extra)-1,hold>>>=state.extra,bits-=state.extra,state.back+=state.extra}if(state.offset>state.dmax){strm.msg="invalid distance too far back",state.mode=BAD;break}state.mode=MATCH;case MATCH:if(left===0)break inf_leave;if(copy=_out-left,state.offset>copy){if(copy=state.offset-copy,copy>state.whave&&state.sane){strm.msg="invalid distance too far back",state.mode=BAD;break}copy>state.wnext?(copy-=state.wnext,from=state.wsize-copy):from=state.wnext-copy,copy>state.length&&(copy=state.length),from_source=state.window}else from_source=output,from=put-state.offset,copy=state.length;copy>left&&(copy=left),left-=copy,state.length-=copy;do output[put++]=from_source[from++];while(--copy);state.length===0&&(state.mode=LEN);break;case LIT:if(left===0)break inf_leave;output[put++]=state.length,left--,state.mode=LEN;break;case CHECK:if(state.wrap){for(;bits<32;){if(have===0)break inf_leave;have--,hold|=input[next++]<<bits,bits+=8}if(_out-=left,strm.total_out+=_out,state.total+=_out,state.wrap&4&&_out&&(strm.adler=state.check=state.flags?crc32_1(state.check,output,_out,put-_out):adler32_1(state.check,output,_out,put-_out)),_out=left,state.wrap&4&&(state.flags?hold:zswap32(hold))!==state.check){strm.msg="incorrect data check",state.mode=BAD;break}hold=0,bits=0}state.mode=LENGTH;case LENGTH:if(state.wrap&&state.flags){for(;bits<32;){if(have===0)break inf_leave;have--,hold+=input[next++]<<bits,bits+=8}if(state.wrap&4&&hold!==(state.total&4294967295)){strm.msg="incorrect length check",state.mode=BAD;break}hold=0,bits=0}state.mode=DONE;case DONE:ret=Z_STREAM_END$1;break inf_leave;case BAD:ret=Z_DATA_ERROR$1;break inf_leave;case MEM:return Z_MEM_ERROR$1;case SYNC:default:return Z_STREAM_ERROR$1}return strm.next_out=put,strm.avail_out=left,strm.next_in=next,strm.avail_in=have,state.hold=hold,state.bits=bits,(state.wsize||_out!==strm.avail_out&&state.mode<BAD&&(state.mode<CHECK||flush!==Z_FINISH$1))&&updatewindow(strm,strm.output,strm.next_out,_out-strm.avail_out),_in-=strm.avail_in,_out-=strm.avail_out,strm.total_in+=_in,strm.total_out+=_out,state.total+=_out,state.wrap&4&&_out&&(strm.adler=state.check=state.flags?crc32_1(state.check,output,_out,strm.next_out-_out):adler32_1(state.check,output,_out,strm.next_out-_out)),strm.data_type=state.bits+(state.last?64:0)+(state.mode===TYPE?128:0)+(state.mode===LEN_||state.mode===COPY_?256:0),(_in===0&&_out===0||flush===Z_FINISH$1)&&ret===Z_OK$1&&(ret=Z_BUF_ERROR),ret},inflateEnd=strm=>{if(inflateStateCheck(strm))return Z_STREAM_ERROR$1;let state=strm.state;return state.window&&(state.window=null),strm.state=null,Z_OK$1},inflateGetHeader=(strm,head)=>{if(inflateStateCheck(strm))return Z_STREAM_ERROR$1;let state=strm.state;return(state.wrap&2)===0?Z_STREAM_ERROR$1:(state.head=head,head.done=!1,Z_OK$1)},inflateSetDictionary=(strm,dictionary)=>{let dictLength=dictionary.length,state,dictid,ret;return inflateStateCheck(strm)||(state=strm.state,state.wrap!==0&&state.mode!==DICT)?Z_STREAM_ERROR$1:state.mode===DICT&&(dictid=1,dictid=adler32_1(dictid,dictionary,dictLength,0),dictid!==state.check)?Z_DATA_ERROR$1:(ret=updatewindow(strm,dictionary,dictLength,dictLength),ret?(state.mode=MEM,Z_MEM_ERROR$1):(state.havedict=1,Z_OK$1))},inflateReset_1=inflateReset,inflateReset2_1=inflateReset2,inflateResetKeep_1=inflateResetKeep,inflateInit_1=inflateInit,inflateInit2_1=inflateInit2,inflate_2$1=inflate$2,inflateEnd_1=inflateEnd,inflateGetHeader_1=inflateGetHeader,inflateSetDictionary_1=inflateSetDictionary,inflateInfo="pako inflate (from Nodeca project)",inflate_1$2={inflateReset:inflateReset_1,inflateReset2:inflateReset2_1,inflateResetKeep:inflateResetKeep_1,inflateInit:inflateInit_1,inflateInit2:inflateInit2_1,inflate:inflate_2$1,inflateEnd:inflateEnd_1,inflateGetHeader:inflateGetHeader_1,inflateSetDictionary:inflateSetDictionary_1,inflateInfo};function GZheader(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1}var gzheader=GZheader,toString=Object.prototype.toString,{Z_NO_FLUSH,Z_FINISH,Z_OK,Z_STREAM_END,Z_NEED_DICT,Z_STREAM_ERROR,Z_DATA_ERROR,Z_MEM_ERROR}=constants$2;function Inflate$1(options){this.options=common.assign({chunkSize:1024*64,windowBits:15,to:""},options||{});let opt=this.options;opt.raw&&opt.windowBits>=0&&opt.windowBits<16&&(opt.windowBits=-opt.windowBits,opt.windowBits===0&&(opt.windowBits=-15)),opt.windowBits>=0&&opt.windowBits<16&&!(options&&options.windowBits)&&(opt.windowBits+=32),opt.windowBits>15&&opt.windowBits<48&&(opt.windowBits&15)===0&&(opt.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new zstream,this.strm.avail_out=0;let status=inflate_1$2.inflateInit2(this.strm,opt.windowBits);if(status!==Z_OK)throw new Error(messages[status]);if(this.header=new gzheader,inflate_1$2.inflateGetHeader(this.strm,this.header),opt.dictionary&&(typeof opt.dictionary=="string"?opt.dictionary=strings.string2buf(opt.dictionary):toString.call(opt.dictionary)==="[object ArrayBuffer]"&&(opt.dictionary=new Uint8Array(opt.dictionary)),opt.raw&&(status=inflate_1$2.inflateSetDictionary(this.strm,opt.dictionary),status!==Z_OK)))throw new Error(messages[status])}Inflate$1.prototype.push=function(data,flush_mode){let strm=this.strm,chunkSize=this.options.chunkSize,dictionary=this.options.dictionary,status,_flush_mode,last_avail_out;if(this.ended)return!1;for(flush_mode===~~flush_mode?_flush_mode=flush_mode:_flush_mode=flush_mode===!0?Z_FINISH:Z_NO_FLUSH,toString.call(data)==="[object ArrayBuffer]"?strm.input=new Uint8Array(data):strm.input=data,strm.next_in=0,strm.avail_in=strm.input.length;;){for(strm.avail_out===0&&(strm.output=new Uint8Array(chunkSize),strm.next_out=0,strm.avail_out=chunkSize),status=inflate_1$2.inflate(strm,_flush_mode),status===Z_NEED_DICT&&dictionary&&(status=inflate_1$2.inflateSetDictionary(strm,dictionary),status===Z_OK?status=inflate_1$2.inflate(strm,_flush_mode):status===Z_DATA_ERROR&&(status=Z_NEED_DICT));strm.avail_in>0&&status===Z_STREAM_END&&strm.state.wrap>0&&data[strm.next_in]!==0;)inflate_1$2.inflateReset(strm),status=inflate_1$2.inflate(strm,_flush_mode);switch(status){case Z_STREAM_ERROR:case Z_DATA_ERROR:case Z_NEED_DICT:case Z_MEM_ERROR:return this.onEnd(status),this.ended=!0,!1}if(last_avail_out=strm.avail_out,strm.next_out&&(strm.avail_out===0||status===Z_STREAM_END))if(this.options.to==="string"){let next_out_utf8=strings.utf8border(strm.output,strm.next_out),tail=strm.next_out-next_out_utf8,utf8str=strings.buf2string(strm.output,next_out_utf8);strm.next_out=tail,strm.avail_out=chunkSize-tail,tail&&strm.output.set(strm.output.subarray(next_out_utf8,next_out_utf8+tail),0),this.onData(utf8str)}else this.onData(strm.output.length===strm.next_out?strm.output:strm.output.subarray(0,strm.next_out));if(!(status===Z_OK&&last_avail_out===0)){if(status===Z_STREAM_END)return status=inflate_1$2.inflateEnd(this.strm),this.onEnd(status),this.ended=!0,!0;if(strm.avail_in===0)break}}return!0};Inflate$1.prototype.onData=function(chunk2){this.chunks.push(chunk2)};Inflate$1.prototype.onEnd=function(status){status===Z_OK&&(this.options.to==="string"?this.result=this.chunks.join(""):this.result=common.flattenChunks(this.chunks)),this.chunks=[],this.err=status,this.msg=this.strm.msg};function inflate$1(input,options){let inflator=new Inflate$1(options);if(inflator.push(input),inflator.err)throw inflator.msg||messages[inflator.err];return inflator.result}function inflateRaw$1(input,options){return options=options||{},options.raw=!0,inflate$1(input,options)}var Inflate_1$1=Inflate$1,inflate_2=inflate$1,inflateRaw_1$1=inflateRaw$1,ungzip$1=inflate$1,constants=constants$2,inflate_1$1={Inflate:Inflate_1$1,inflate:inflate_2,inflateRaw:inflateRaw_1$1,ungzip:ungzip$1,constants},{Deflate,deflate,deflateRaw,gzip}=deflate_1$1,{Inflate,inflate,inflateRaw,ungzip}=inflate_1$1;var encoder=new TextEncoder,decoder=new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0}),htmlSegmentMagic=encoder.encode(`\0${RESOURCE_HTML_SEGMENT_ENCODING}\0`);var encoder2=new TextEncoder,decoder2=new TextDecoder("utf-8",{fatal:!0});var ARTIFACT_FRAGMENT_VERSION="v1",ARTIFACT_FRAGMENT_PREFIX=`${ARTIFACT_FRAGMENT_VERSION}.`;var ARTIFACT_COMPRESSED_LIMIT=5*1024*1024,ARTIFACT_EXPANDED_LIMIT=10*1024*1024;var encoder3=new TextEncoder;var ARTIFACT_SHARE_BASE_URL="https://share.openplanr.dev",ARTIFACT_SHARE_TTLS=Object.freeze(["1d","7d","30d"]);function shareError(code,message,fix=""){return new PipelineError(code,message,fix)}function loopback(hostname){return["127.0.0.1","localhost","[::1]"].includes(hostname)}function normalizeBaseUrl(value=ARTIFACT_SHARE_BASE_URL){let url;try{url=new globalThis.URL(value)}catch{throw shareError(ARTIFACT_ERROR_CODES.PASTE_INVALID,"Artifact share service URL is invalid.")}if(url.username||url.password||url.search||url.hash||url.pathname!=="/"&&url.pathname!==""||url.protocol!=="https:"&&!(url.protocol==="http:"&&loopback(url.hostname)))throw shareError(ARTIFACT_ERROR_CODES.PASTE_INVALID,"Artifact share service URL is not a secure origin.");return url}function assertPreparedArtifactPaste(value){let names=["schemaVersion","kind","origin","body","key","custodyToken","fragmentLength","compressedBytes"];if(!value||typeof value!="object"||Array.isArray(value)||Object.keys(value).length!==names.length||Object.keys(value).some(name=>!names.includes(name))||value.schemaVersion!=="1.0.0"||value.kind!=="openplanr-artifact-paste-preparation"||normalizeBaseUrl(value.origin).origin!==value.origin||!/^[A-Za-z0-9_-]{43}$/u.test(value.key??"")||!/^[A-Za-z0-9_-]{43}$/u.test(value.custodyToken??"")||value.key===value.custodyToken||!Number.isSafeInteger(value.fragmentLength)||value.fragmentLength<1||value.fragmentLength>8*1024*1024||!Number.isSafeInteger(value.compressedBytes)||value.compressedBytes<1||value.compressedBytes>ARTIFACT_COMPRESSED_LIMIT)throw shareError(ARTIFACT_ERROR_CODES.PASTE_INVALID,"Prepared paste custody is invalid.");if(assertSharingSecurityContract(value.body,"artifact-paste-v2"),new Set([value.key,value.custodyToken,value.body.id,value.body.creationId]).size!==4)throw shareError(ARTIFACT_ERROR_CODES.PASTE_INVALID,"Paste private secrets must differ from public identity.");return value}function createReviewOutbox({scope,indexedDB=globalThis.indexedDB,databaseName="openplanr-review-outbox-v1",leaseMs=3e4,now=Date.now,validatePayload=payload=>payload!==null&&typeof payload=="object"}){for(let value of[scope.workspaceId,scope.revisionId,scope.actorId])if(typeof value!="string"||!value||value.length>512)throw new TypeError("Review custody requires workspace, revision and actor identities.");if(!Number.isFinite(leaseMs)||leaseMs<300)throw new TypeError("A review lease must be at least 300ms.");let scopeKey=JSON.stringify([scope.workspaceId,scope.revisionId,scope.actorId]),key=id7=>{if(typeof id7!="string"||!id7||id7.length>512)throw new TypeError("A review operation needs a stable identity.");return JSON.stringify([scopeKey,id7])},closed6=!1,draining=null,listeners=new Set,heartbeats=new Set,channel=typeof globalThis.BroadcastChannel=="function"?new globalThis.BroadcastChannel(databaseName):null,notify=()=>{listeners.forEach(listener=>{listener()}),channel?.postMessage(scopeKey)};channel&&(channel.onmessage=event=>{event.data===scopeKey&&listeners.forEach(listener=>{listener()})});let database=new Promise((resolve,reject)=>{if(!indexedDB){reject(new Error("Durable review storage is unavailable. Enable browser storage before sending feedback."));return}let request=indexedDB.open(databaseName,1);request.onupgradeneeded=()=>{request.result.createObjectStore("operations",{keyPath:"key"}).createIndex("scope","scopeKey",{unique:!1})},request.onerror=()=>reject(request.error??new Error("Durable review storage could not open.")),request.onblocked=()=>reject(new Error("Close older review tabs to open durable review storage.")),request.onsuccess=()=>{let db=request.result;db.onversionchange=()=>db.close(),closed6&&db.close(),resolve(db)}});database.catch(()=>{});async function transaction(mode,work){if(closed6)throw new Error("Review custody has closed.");let db=await database;return new Promise((resolve,reject)=>{let tx=db.transaction("operations",mode),store=tx.objectStore("operations"),value;tx.oncomplete=()=>resolve(value),tx.onerror=()=>reject(tx.error??new Error("Review storage could not commit.")),tx.onabort=()=>reject(tx.error??new Error("Review storage did not commit."));let guard=callback=>()=>{try{callback()}catch(error){try{tx.abort()}catch{}reject(error)}};guard(()=>work(store,next=>{value=next},guard))()})}let publicEntry=({key:_key,scopeKey:_scope,leaseOwner:_owner,leaseUntil:_until,custodyInvalid:_invalid,invalidRecord:_record,...entry})=>entry;function payloadValid(payload){try{return validatePayload(payload)}catch{return!1}}function keyedIdentity(primaryKey){if(typeof primaryKey!="string")return null;try{let value=JSON.parse(primaryKey);return Array.isArray(value)&&value.length===2&&value[0]===scopeKey&&typeof value[1]=="string"&&value[1].length>0&&value[1].length<=512?value[1]:null}catch{return null}}function storedEntry(raw,primaryKey,store){let record2=raw!==null&&typeof raw=="object"?raw:null,fromKey=keyedIdentity(primaryKey);if(record2?.scopeKey!==scopeKey&&!fromKey)return null;let allowed=new Set(["key","scopeKey","operationId","payload","status","attempts","createdAt","nextAttemptAt","errorCode","leaseOwner","leaseUntil","custodyInvalid","invalidRecord"]),finiteTime=value=>typeof value=="number"&&Number.isFinite(value)&&value>=0,integer3=value=>typeof value=="number"&&Number.isSafeInteger(value)&&value>=0;if(record2&&Object.keys(record2).every(name=>allowed.has(name))&&fromKey!==null&&fromKey===record2.operationId&&record2.key===primaryKey&&record2.scopeKey===scopeKey&&Object.hasOwn(record2,"payload")&&["pending","quarantined"].includes(String(record2.status))&&integer3(record2.attempts)&&finiteTime(record2.createdAt)&&finiteTime(record2.nextAttemptAt)&&(record2.errorCode===void 0||typeof record2.errorCode=="string"&&record2.errorCode.length<=120)&&(record2.leaseOwner===void 0&&record2.leaseUntil===void 0||typeof record2.leaseOwner=="string"&&record2.leaseOwner.length>0&&record2.leaseOwner.length<=128&&finiteTime(record2.leaseUntil))&&(record2.custodyInvalid===!0?record2.status==="quarantined"&&record2.errorCode==="malformed_custody":record2.custodyInvalid===void 0&&record2.invalidRecord===void 0&&payloadValid(record2.payload)))return record2;let operationId=fromKey??`invalid-${globalThis.crypto.randomUUID()}`,repaired={key:key(operationId),scopeKey,operationId,payload:record2&&Object.hasOwn(record2,"payload")?record2.payload:null,status:"quarantined",attempts:0,createdAt:0,nextAttemptAt:0,errorCode:"malformed_custody",custodyInvalid:!0,invalidRecord:raw};return store.put(repaired),primaryKey!==repaired.key&&store.delete(primaryKey),repaired}function readScoped(store,result,guard){let entries=[],seen=new Set,request=store.openCursor();request.onsuccess=guard(()=>{let cursor=request.result;if(!cursor){result(entries);return}let entry=storedEntry(cursor.value,cursor.primaryKey,store);entry&&!seen.has(entry.key)&&(seen.add(entry.key),entries.push(entry)),cursor.continue()})}async function mutate(id7,update){await transaction("readwrite",(store,_result,guard)=>{let operationKey=key(id7),request=store.get(operationKey);request.onsuccess=guard(()=>{if(request.result===void 0)return;let entry=storedEntry(request.result,operationKey,store);entry&&update(entry,store)})}),notify()}async function claim(owner){return transaction("readwrite",(store,result,guard)=>{readScoped(store,entries=>{let time=now(),next=entries.filter(entry=>entry.status==="pending"&&entry.nextAttemptAt<=time&&(!entry.leaseUntil||entry.leaseUntil<=time)).sort((a,b)=>a.createdAt-b.createdAt||a.operationId.localeCompare(b.operationId))[0];if(!next){result(null);return}next.leaseOwner=owner,next.leaseUntil=time+leaseMs,store.put(next),result(next)},guard)})}return{async enqueue({operationId,payload}){let immutable=structuredClone(payload),operationKey=key(operationId);if(!payloadValid(immutable))throw new TypeError("Prepared review custody is invalid.");await transaction("readwrite",(store,_result,guard)=>{let request=store.get(operationKey);request.onsuccess=guard(()=>{if(request.result!==void 0){storedEntry(request.result,operationKey,store);return}store.add({key:operationKey,scopeKey,operationId,payload:immutable,status:"pending",attempts:0,createdAt:now(),nextAttemptAt:0})})}),notify()},async list(){return transaction("readwrite",(store,result,guard)=>{readScoped(store,entries=>result(entries.sort((a,b)=>a.createdAt-b.createdAt||a.operationId.localeCompare(b.operationId)).map(publicEntry)),guard)})},async retry(id7){await mutate(id7,(entry,store)=>{entry.custodyInvalid||entry.leaseUntil&&entry.leaseUntil>now()||(entry.status="pending",entry.nextAttemptAt=0,delete entry.errorCode,store.put(entry))})},async quarantine(id7,code){await mutate(id7,(entry,store)=>{entry.leaseUntil&&entry.leaseUntil>now()||(entry.status="quarantined",entry.nextAttemptAt=0,entry.errorCode=entry.custodyInvalid?"malformed_custody":String(code).slice(0,120),store.put(entry))})},async remove(id7){await mutate(id7,(entry,store)=>{(!entry.leaseUntil||entry.leaseUntil<=now())&&store.delete(entry.key)})},drain(send){if(draining)return draining;let owner=globalThis.crypto.randomUUID();return draining=(async()=>{for(;!closed6;){let entry=await claim(owner);if(!entry)return;let heartbeat=globalThis.setInterval(()=>{mutate(entry.operationId,(current,store)=>{current.leaseOwner===owner&&(current.leaseUntil=now()+leaseMs,store.put(current))}).catch(()=>{})},Math.floor(leaseMs/3));heartbeats.add(heartbeat);let outcome;try{outcome=await send(publicEntry(entry))}catch{outcome={status:"retry",code:"network"}}finally{globalThis.clearInterval(heartbeat),heartbeats.delete(heartbeat)}(!outcome||!["delivered","retry","rejected"].includes(outcome.status))&&(outcome={status:"retry",code:"invalid-delivery-result"}),await mutate(entry.operationId,(current,store)=>{if(current.leaseOwner!==owner)return;if(outcome.status==="delivered"){store.delete(current.key);return}delete current.leaseOwner,delete current.leaseUntil,current.attempts+=1,current.errorCode=typeof outcome.code=="string"?outcome.code.slice(0,120):outcome.status,current.status=outcome.status==="rejected"?"quarantined":"pending";let requestedDelay=Number.isFinite(outcome.retryAfterMs)?Math.max(0,Math.min(36e5,outcome.retryAfterMs)):0;current.nextAttemptAt=outcome.status==="retry"?now()+Math.max(requestedDelay,Math.min(6e4,1e3*2**Math.min(current.attempts-1,6))):0,store.put(current)})}})().finally(()=>{draining=null}),draining},subscribe(listener){return listeners.add(listener),()=>listeners.delete(listener)},close(){closed6=!0;for(let heartbeat of heartbeats)globalThis.clearInterval(heartbeat);heartbeats.clear(),channel?.close(),listeners.clear(),database.then(db=>db.close()).catch(()=>{})}}}var retainedPreparation=Symbol("private-paste-preparation-retained");function preparation(value){return assertPreparedArtifactPaste(value),value}function receipt(prepared,value){let url=new URL(`/p/${prepared.body.id}`,prepared.origin);if(url.hash=`k=${prepared.key}&v=2`,!value||value.url!==url.toString()||value.deletionToken!==prepared.custodyToken||typeof value.expiresAt!="string"||!Number.isFinite(Date.parse(value.expiresAt)))throw new Error("Paste receipt differs from saved private custody.");return value}function createDurablePasteShare({scope,create,commit,indexedDB=globalThis.indexedDB,databaseName="openplanr-paste-custody-v1"}){let queues=new Map;function queueFor(request){let base=scope(),revisionId2=`${base.revisionId}:${request.ttl??"7d"}`,identity=JSON.stringify({...base,revisionId:revisionId2}),queue=queues.get(identity);return queue||(queue=createReviewOutbox({scope:{...base,revisionId:revisionId2},indexedDB,databaseName}),queues.set(identity,queue)),queue}let activeReceipt=entries=>entries.map(entry=>entry.payload).find(value=>value?.kind==="paste-receipt"&&typeof value.result?.expiresAt=="string"&&Date.parse(value.result.expiresAt)>Date.now());return{async run(request){if(request.transport!=="short")return create(request);let queue=queueFor(request),entries=await queue.list(),prior=activeReceipt(entries);if(prior)return receipt(preparation(prior.prepared),prior.result??null);let pending=entries.find(entry=>entry.payload?.kind==="prepared-paste");if(pending?.status==="quarantined")throw new Error("The saved paste operation was rejected. Its private recovery custody is retained.");if(!pending){try{await create({...request,onPreparedPaste:async value=>{let prepared=preparation(value);throw prepared.body.ttl!==(request.ttl??"7d")?new Error("Prepared paste expiry differs."):(await queue.enqueue({operationId:prepared.body.creationId,payload:{kind:"prepared-paste",prepared}}),retainedPreparation)}})}catch(error){if(error!==retainedPreparation)throw error}if(entries=await queue.list(),pending=entries.find(entry=>entry.payload?.kind==="prepared-paste"),!pending)throw new Error("This host did not retain paste custody before publication. Update OpenPlanr and retry.")}await queue.retry(pending.operationId);let result=null;if(await queue.drain(async entry=>{let value=entry.payload;if(value?.kind==="paste-receipt")return{status:"rejected",code:"private-custody-receipt"};try{let prepared=preparation(value?.prepared),created=receipt(prepared,await commit(prepared)),receiptId=`${prepared.body.creationId}:receipt`;return await queue.enqueue({operationId:receiptId,payload:{kind:"paste-receipt",prepared,result:created}}),await queue.quarantine(receiptId,"private-custody-receipt"),result=created,{status:"delivered"}}catch(error){let code=error?.code;return typeof code=="string"&&["E_ARTIFACT_SHARE_NETWORK","E_ARTIFACT_PASTE_UNAVAILABLE"].includes(code)?{status:"retry",code}:{status:"rejected",code:"paste-rejected"}}}),result)return result;let completed=activeReceipt(await queue.list());if(completed)return receipt(preparation(completed.prepared),completed.result??null);throw new Error("Paste publication is pending. Retry this share to resume the saved encrypted operation; another tab may be sending it.")},close(){for(let queue of queues.values())queue.close();queues.clear()}}}var ARTIFACT_REVIEW_CHANGE_EVENT="planr:artifact-review-change",ARTIFACT_REVIEW_SELECT_EVENT="planr:artifact-review-select",ARTIFACT_REVIEW_DRAFT_CHANGE_EVENT="planr:artifact-review-draft-change",ARTIFACT_REVIEW_LIMITS=Object.freeze({id:128,authorName:256,artifactId:128,variant:128,anchor:512,screen:128,text:65536,pins:1e4,replies:1e4,viewport:16384}),ARTIFACT_REVIEW_DECISIONS=Object.freeze(["pending","approved","changes_requested"]),ARTIFACT_REVIEW_INTENTS=Object.freeze(["fix","improve","question"]),ARTIFACT_REVIEW_STATUSES=Object.freeze(["open","addressed","resolved"]),REVIEW_OF_RE=/^[a-f0-9]{64}$/,ArtifactReviewStateError=class extends Error{constructor(code,message){super(message),this.name="ArtifactReviewStateError",this.code=code}};function invalid(message){throw new ArtifactReviewStateError("E_ARTIFACT_REVIEW_INVALID",message)}function identityRequired(){throw new ArtifactReviewStateError("E_ARTIFACT_REVIEW_IDENTITY_REQUIRED","Enter your name before adding a comment.")}function clonePlain(value){if(Array.isArray(value))return value.map(clonePlain);if(!value||typeof value!="object")return value;let clone={};for(let[key,entry]of Object.entries(value))clone[key]=clonePlain(entry);return clone}function cloneFrozenArtifactReview(review){return deepFreeze(clonePlain(review))}function boundedString(value,label,{min=0,max,trim=!1,pattern}={}){typeof value!="string"&&invalid(`${label} must be a string.`);let normalized3=trim?value.trim():value;return(normalized3.length<min||max!==void 0&&normalized3.length>max)&&invalid(`${label} must contain ${min} through ${max??"unlimited"} characters.`),pattern&&!pattern.test(normalized3)&&invalid(`${label} has an invalid format.`),normalized3}function optionalString(value,label,options){if(value!==void 0)return boundedString(value,label,options)}function enumValue(value,values,label){return values.includes(value)||invalid(`${label} must be one of: ${values.join(", ")}.`),value}function isoTimestamp(value,label){let timestamp2=value instanceof Date?value.toISOString():value;return(typeof timestamp2!="string"||!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})$/.test(timestamp2)||!Number.isFinite(Date.parse(timestamp2)))&&invalid(`${label} must be an ISO-8601 date-time.`),timestamp2}function dependencyTimestamp(now){return isoTimestamp(now(),"now()")}function defaultNow(){return new Date().toISOString()}function createSecureArtifactReviewId(cryptoProvider=globalThis.crypto){let randomUuid=cryptoProvider?.randomUUID?.();if(randomUuid)return randomUuid;let bytes=new Uint8Array(16);if(typeof cryptoProvider?.getRandomValues!="function")throw new ArtifactReviewStateError("E_ARTIFACT_REVIEW_UUID_UNAVAILABLE","Secure UUID generation is unavailable in this browser.");cryptoProvider.getRandomValues(bytes),bytes[6]=bytes[6]&15|64,bytes[8]=bytes[8]&63|128;let hex=[...bytes].map(value=>value.toString(16).padStart(2,"0")).join("");return`${hex.slice(0,8)}-${hex.slice(8,12)}-${hex.slice(12,16)}-${hex.slice(16,20)}-${hex.slice(20)}`}function defaultCreateId(){return createSecureArtifactReviewId()}function dependencyId(createId,kind){return boundedString(createId(kind),`${kind} id`,{min:1,max:ARTIFACT_REVIEW_LIMITS.id,trim:!0})}function uniqueDependencyId(createId,kind,existingIds){for(let attempt=0;attempt<100;attempt+=1){let candidate=dependencyId(createId,kind);if(!existingIds.has(candidate))return candidate}throw new ArtifactReviewStateError("E_ARTIFACT_REVIEW_ID_COLLISION",`Could not create a unique ${kind} id.`)}function normalizeArtifactReviewIdentity(value,{allowEmpty=!1}={}){if(value==null||value===""){if(allowEmpty)return null;identityRequired()}let source=typeof value=="string"?{name:value}:value;(!source||typeof source!="object"||Array.isArray(source))&&identityRequired();let name=boundedString(source.name,"author.name",{min:1,max:ARTIFACT_REVIEW_LIMITS.authorName,trim:!0}),id7=optionalString(source.id,"author.id",{min:1,max:ARTIFACT_REVIEW_LIMITS.id,trim:!0});return deepFreeze(id7===void 0?{name}:{id:id7,name})}function normalizeRegion(region){(!region||typeof region!="object"||Array.isArray(region))&&invalid("pin.region must be an object.");let finite3=(value,label)=>((typeof value!="number"||!Number.isFinite(value))&&invalid(`${label} must be finite.`),value),x=finite3(region.x,"pin.region.x"),y=finite3(region.y,"pin.region.y"),w=finite3(region.w,"pin.region.w"),h=finite3(region.h,"pin.region.h");if(x>=0&&y>=0&&w>=0&&h>=0&&x+w<=1&&y+h<=1)return{x,y,w,h};let unit=value=>Math.round(Math.min(1,Math.max(0,value))*1e6)/1e6,boundedX=unit(x),boundedY=unit(y);return{x:boundedX,y:boundedY,w:Math.round(Math.min(unit(w),1-boundedX)*1e6)/1e6,h:Math.round(Math.min(unit(h),1-boundedY)*1e6)/1e6}}function normalizeViewport(viewport){(!viewport||typeof viewport!="object"||Array.isArray(viewport))&&invalid("pin.viewport must be an object.");let dimension=(value,label)=>((!Number.isInteger(value)||value<1||value>ARTIFACT_REVIEW_LIMITS.viewport)&&invalid(`${label} must be an integer from 1 through ${ARTIFACT_REVIEW_LIMITS.viewport}.`),value);return{width:dimension(viewport.width,"pin.viewport.width"),height:dimension(viewport.height,"pin.viewport.height")}}function normalizeAnchor(anchor2){if(anchor2==null)return;(typeof anchor2!="object"||Array.isArray(anchor2))&&invalid("pin.anchor must be an object.");let planrId=boundedString(anchor2.planrId,"pin.anchor.planrId",{min:1,max:ARTIFACT_REVIEW_LIMITS.anchor,trim:!0}),screen=optionalString(anchor2.screen,"pin.anchor.screen",{min:1,max:ARTIFACT_REVIEW_LIMITS.screen,trim:!0});return screen===void 0?{planrId}:{planrId,screen}}function normalizeReply(reply2,label="reply"){return(!reply2||typeof reply2!="object"||Array.isArray(reply2))&&invalid(`${label} must be an object.`),{id:boundedString(reply2.id,`${label}.id`,{min:1,max:ARTIFACT_REVIEW_LIMITS.id,trim:!0}),author:normalizeArtifactReviewIdentity(reply2.author),comment:boundedString(reply2.comment,`${label}.comment`,{min:1,max:ARTIFACT_REVIEW_LIMITS.text,trim:!0}),createdAt:isoTimestamp(reply2.createdAt,`${label}.createdAt`)}}function compareTimestampThenId(left,right){let byTime=left.createdAt.localeCompare(right.createdAt);return byTime===0?left.id.localeCompare(right.id):byTime}function normalizePin(pin,label="pin"){(!pin||typeof pin!="object"||Array.isArray(pin))&&invalid(`${label} must be an object.`),(!Array.isArray(pin.replies)||pin.replies.length>ARTIFACT_REVIEW_LIMITS.replies)&&invalid(`${label}.replies must contain no more than ${ARTIFACT_REVIEW_LIMITS.replies} items.`);let replies=pin.replies.map((reply2,index2)=>normalizeReply(reply2,`${label}.replies[${index2}]`));new Set(replies.map(({id:id7})=>id7)).size!==replies.length&&invalid(`${label}.replies must have unique ids.`);let normalized3={id:boundedString(pin.id,`${label}.id`,{min:1,max:ARTIFACT_REVIEW_LIMITS.id,trim:!0}),author:normalizeArtifactReviewIdentity(pin.author),artifactId:boundedString(pin.artifactId,`${label}.artifactId`,{min:1,max:ARTIFACT_REVIEW_LIMITS.artifactId,trim:!0}),region:normalizeRegion(pin.region),viewport:normalizeViewport(pin.viewport),intent:enumValue(pin.intent,ARTIFACT_REVIEW_INTENTS,`${label}.intent`),status:enumValue(pin.status,ARTIFACT_REVIEW_STATUSES,`${label}.status`),comment:boundedString(pin.comment,`${label}.comment`,{min:1,max:ARTIFACT_REVIEW_LIMITS.text,trim:!0}),replies:replies.sort(compareTimestampThenId),createdAt:isoTimestamp(pin.createdAt,`${label}.createdAt`),updatedAt:isoTimestamp(pin.updatedAt,`${label}.updatedAt`)},variant=optionalString(pin.variant,`${label}.variant`,{min:1,max:ARTIFACT_REVIEW_LIMITS.variant,trim:!0}),anchor2=normalizeAnchor(pin.anchor);return variant!==void 0&&(normalized3.variant=variant),anchor2!==void 0&&(normalized3.anchor=anchor2),normalized3}function normalizeArtifactReview(review){(!review||typeof review!="object"||Array.isArray(review))&&invalid("Artifact review must be an object."),(!Array.isArray(review.pins)||review.pins.length>ARTIFACT_REVIEW_LIMITS.pins)&&invalid(`review.pins must contain no more than ${ARTIFACT_REVIEW_LIMITS.pins} items.`);let pins=review.pins.map((pin,index2)=>normalizePin(pin,`review.pins[${index2}]`));new Set(pins.map(({id:id7})=>id7)).size!==pins.length&&invalid("review.pins must have unique ids.");let normalized3={schemaVersion:enumValue(review.schemaVersion,["1.0.0"],"review.schemaVersion"),reviewId:boundedString(review.reviewId,"review.reviewId",{min:1,max:ARTIFACT_REVIEW_LIMITS.id,trim:!0}),reviewOf:boundedString(review.reviewOf,"review.reviewOf",{min:64,max:64,pattern:REVIEW_OF_RE}),decision:enumValue(review.decision,ARTIFACT_REVIEW_DECISIONS,"review.decision"),overall:boundedString(review.overall,"review.overall",{max:ARTIFACT_REVIEW_LIMITS.text}),pins:pins.sort(compareTimestampThenId)};return review.createdAt!==void 0&&(normalized3.createdAt=isoTimestamp(review.createdAt,"review.createdAt")),review.updatedAt!==void 0&&(normalized3.updatedAt=isoTimestamp(review.updatedAt,"review.updatedAt")),deepFreeze(normalized3)}function createArtifactReview({reviewId,reviewOf,createId=defaultCreateId}={}){let normalizedReviewId=reviewId===void 0?dependencyId(createId,"review"):boundedString(reviewId,"reviewId",{min:1,max:ARTIFACT_REVIEW_LIMITS.id,trim:!0});return normalizeArtifactReview({schemaVersion:"1.0.0",reviewId:normalizedReviewId,reviewOf:boundedString(reviewOf,"reviewOf",{min:64,max:64,pattern:REVIEW_OF_RE}),decision:"pending",overall:"",pins:[]})}function replacePin(review,pin){return review.pins.map(candidate=>candidate.id===pin.id?pin:candidate)}function findPin(review,pinId){let normalizedId=boundedString(pinId,"pinId",{min:1,max:ARTIFACT_REVIEW_LIMITS.id,trim:!0}),pin=review.pins.find(({id:id7})=>id7===normalizedId);if(!pin)throw new ArtifactReviewStateError("E_ARTIFACT_REVIEW_PIN_NOT_FOUND",`Unknown feedback pin: ${normalizedId}`);return pin}function preserveOptionalReviewTimestamps(review,next,timestamp2){return review.createdAt!==void 0&&(next.createdAt=review.createdAt),review.updatedAt!==void 0&&(next.updatedAt=timestamp2),next}function reduceArtifactReview(review,action,{createId=defaultCreateId,now=defaultNow}={}){let current=normalizeArtifactReview(review);(!action||typeof action!="object"||Array.isArray(action))&&invalid("Review action must be an object.");let timestamp2=dependencyTimestamp(now),next;switch(action.type){case"add-pin":{current.pins.length>=ARTIFACT_REVIEW_LIMITS.pins&&invalid(`A review can contain at most ${ARTIFACT_REVIEW_LIMITS.pins} pins.`);let author=normalizeArtifactReviewIdentity(action.author),pinInput=action.pin&&typeof action.pin=="object"?action.pin:{},pinId=pinInput.id===void 0?uniqueDependencyId(createId,"pin",new Set(current.pins.map(({id:id7})=>id7))):boundedString(pinInput.id,"pin.id",{min:1,max:ARTIFACT_REVIEW_LIMITS.id,trim:!0});if(current.pins.some(({id:id7})=>id7===pinId))throw new ArtifactReviewStateError("E_ARTIFACT_REVIEW_ID_COLLISION",`Duplicate pin id: ${pinId}`);let pin=normalizePin({...pinInput,id:pinId,author,status:pinInput.status??"open",replies:[],createdAt:pinInput.createdAt??timestamp2,updatedAt:pinInput.updatedAt??timestamp2});next=preserveOptionalReviewTimestamps(current,{...current,pins:[...current.pins,pin]},timestamp2);break}case"add-reply":{let pin=findPin(current,action.pinId);pin.replies.length>=ARTIFACT_REVIEW_LIMITS.replies&&invalid(`A feedback thread can contain at most ${ARTIFACT_REVIEW_LIMITS.replies} replies.`);let replyId=action.id===void 0?uniqueDependencyId(createId,"reply",new Set(pin.replies.map(({id:id7})=>id7))):boundedString(action.id,"reply.id",{min:1,max:ARTIFACT_REVIEW_LIMITS.id,trim:!0});if(pin.replies.some(({id:id7})=>id7===replyId))throw new ArtifactReviewStateError("E_ARTIFACT_REVIEW_ID_COLLISION",`Duplicate reply id: ${replyId}`);let reply2=normalizeReply({id:replyId,author:normalizeArtifactReviewIdentity(action.author),comment:action.comment,createdAt:action.createdAt??timestamp2}),updatedPin=normalizePin({...pin,replies:[...pin.replies,reply2],updatedAt:timestamp2});next=preserveOptionalReviewTimestamps(current,{...current,pins:replacePin(current,updatedPin)},timestamp2);break}case"set-status":{let pin=findPin(current,action.pinId),updatedPin=normalizePin({...pin,status:enumValue(action.status,ARTIFACT_REVIEW_STATUSES,"status"),updatedAt:timestamp2});next=preserveOptionalReviewTimestamps(current,{...current,pins:replacePin(current,updatedPin)},timestamp2);break}case"set-overall":next=preserveOptionalReviewTimestamps(current,{...current,overall:boundedString(action.overall,"overall",{max:ARTIFACT_REVIEW_LIMITS.text})},timestamp2);break;case"set-decision":next=preserveOptionalReviewTimestamps(current,{...current,decision:enumValue(action.decision,ARTIFACT_REVIEW_DECISIONS,"decision")},timestamp2);break;default:throw new ArtifactReviewStateError("E_ARTIFACT_REVIEW_ACTION_UNKNOWN",`Unknown artifact review action: ${String(action.type)}`)}return normalizeArtifactReview(next)}function createArtifactReviewController({initialReview=null,reviewOf,reviewId,identity=null,createId=defaultCreateId,now=defaultNow}={}){let review=initialReview==null?null:normalizeArtifactReview(initialReview);if(review&&reviewOf!==void 0&&review.reviewOf!==reviewOf)throw new ArtifactReviewStateError("E_ARTIFACT_REVIEW_DIGEST_MISMATCH","The initial review does not match the artifact envelope digest.");let localIdentity=normalizeArtifactReviewIdentity(identity,{allowEmpty:!0}),activePinId=null,destroyed=!1,listeners=new Set,assertAlive=()=>{if(destroyed)throw new ArtifactReviewStateError("E_ARTIFACT_REVIEW_DESTROYED","Artifact review controller is destroyed.")},ensureReview=()=>(review??=createArtifactReview({reviewId,reviewOf,createId}),review),getState=()=>deepFreeze({review,identity:localIdentity,activePinId}),notify=change=>{let state=getState();for(let listener of[...listeners])listener(state,deepFreeze({...change}))};return Object.freeze({getReview(){return review},getState,getIdentity(){return localIdentity},setIdentity(value){return assertAlive(),localIdentity=normalizeArtifactReviewIdentity(value,{allowEmpty:!0}),notify({type:"identity"}),localIdentity},dispatch(action){assertAlive();let nextAction=(action?.type==="add-pin"||action?.type==="add-reply")&&action.author===void 0?{...action,author:localIdentity??identityRequired()}:action,previousPinIds=nextAction?.type==="add-pin"?new Set(review?.pins.map(({id:id7})=>id7)??[]):null;return review=reduceArtifactReview(ensureReview(),nextAction,{createId,now}),previousPinIds&&(activePinId=review.pins.find(({id:id7})=>!previousPinIds.has(id7))?.id??activePinId),notify({type:"review",action:nextAction.type}),review},replaceReview(value){assertAlive();let next=value==null?null:normalizeArtifactReview(value);if(next&&reviewOf!==void 0&&next.reviewOf!==reviewOf)throw new ArtifactReviewStateError("E_ARTIFACT_REVIEW_DIGEST_MISMATCH","The replacement review does not match the artifact envelope digest.");return review=next,activePinId&&!review?.pins.some(({id:id7})=>id7===activePinId)&&(activePinId=null),notify({type:"review-replaced"}),review},selectPin(pinId){return assertAlive(),pinId==null?activePinId=null:activePinId=findPin(ensureReview(),pinId).id,notify({type:"selection"}),activePinId},subscribe(listener){return assertAlive(),typeof listener!="function"&&invalid("Review subscriber must be a function."),listeners.add(listener),()=>listeners.delete(listener)},destroy(){destroyed||(destroyed=!0,listeners.clear(),review=null,localIdentity=null,activePinId=null)}})}function createElement(document2,tagName,{className,text:text5,attributes={}}={}){let element=document2.createElement(tagName);className&&(element.className=className),text5!==void 0&&(element.textContent=text5);for(let[name,value]of Object.entries(attributes))value!=null&&element.setAttribute(name,String(value));return element}function artifactReviewThreadDomId(pinId){return annotationDomIds(pinId).thread}function displayTimestamp(timestamp2){let canonical=new Date(timestamp2).toISOString();return`${canonical.slice(0,10)} ${canonical.slice(11,16)} UTC`}function renderReply(document2,reply2){let item2=createElement(document2,"li",{className:"planr-reply",attributes:{"data-planr-reply-id":reply2.id}}),heading=createElement(document2,"header");heading.append(createElement(document2,"strong",{text:reply2.author.name}));let time=createElement(document2,"time",{text:displayTimestamp(reply2.createdAt),attributes:{datetime:reply2.createdAt}});return heading.append(time),item2.append(heading,createElement(document2,"p",{text:reply2.comment})),item2}function renderReplyForm(document2,pin,expanded=!1){let fieldId=`${annotationDomIds(pin.id).thread}-reply`,wrapper=createElement(document2,"div",{className:"planr-reply-editor"}),toggle=createElement(document2,"button",{className:"planr-reply-toggle",text:expanded?"− Reply":"+ Reply",attributes:{type:"button",id:`${fieldId}-toggle`,"data-planr-reply-toggle":pin.id,"aria-expanded":String(expanded),"aria-controls":`${fieldId}-form`,title:expanded?"Collapse reply":"Reply to this comment"}}),form=createElement(document2,"form",{className:"planr-reply-form",attributes:{"data-planr-reply-form":pin.id,id:`${fieldId}-form`,...expanded?{}:{hidden:""}}}),label=createElement(document2,"label",{className:"planr-reply-label",text:"Reply to thread",attributes:{for:fieldId}}),textarea=createElement(document2,"textarea",{attributes:{id:fieldId,name:"reply",maxlength:ARTIFACT_REVIEW_LIMITS.text,rows:2,placeholder:"Write a reply…",required:"","aria-describedby":"planr-review-error"}}),controls=createElement(document2,"div",{className:"planr-reply-controls"}),hint=createElement(document2,"span",{className:"planr-reply-hint",text:"Ctrl/⌘ + Enter to send"}),submit=createElement(document2,"button",{className:"planr-reply-send",attributes:{type:"submit",disabled:"","aria-label":"Send reply",title:"Send reply (Ctrl/⌘ + Enter)"}}),svg=document2.createElementNS("http://www.w3.org/2000/svg","svg");for(let[name,value]of Object.entries({viewBox:"0 0 24 24",width:"16",height:"16",fill:"none",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true",focusable:"false"}))svg.setAttribute(name,value);let path=document2.createElementNS("http://www.w3.org/2000/svg","path");return path.setAttribute("d","M12 19V5m-6 6 6-6 6 6"),svg.append(path),submit.append(svg),controls.append(hint,submit),form.append(label,textarea,controls),wrapper.append(toggle,form),wrapper}function renderThread(document2,pin,active,description={}){let intentLabel=typeof description.intentLabel=="string"?description.intentLabel.slice(0,128):pin.intent,article=createElement(document2,"article",{className:`planr-thread${active?" is-active":""}`,attributes:{id:artifactReviewThreadDomId(pin.id),tabindex:"-1","data-planr-pin-id":pin.id,"data-planr-intent":pin.intent,"data-planr-status":pin.status,"aria-controls":annotationDomIds(pin.id).pin,"aria-label":`${intentLabel} comment by ${pin.author.name}`,"data-planr-unread":description.unread===!0?"true":"false",...description.compact?{"data-planr-compact":"true"}:{}}}),header=createElement(document2,"header"),byline=createElement(document2,"div",{className:"planr-review-byline"});byline.append(createElement(document2,"strong",{text:pin.author.name}),createElement(document2,"span",{className:"planr-intent",text:intentLabel}));let time=createElement(document2,"time",{text:description.compact?`${new Date(pin.createdAt).toISOString().slice(11,16)} UTC`:displayTimestamp(pin.createdAt),attributes:{datetime:pin.createdAt,title:displayTimestamp(pin.createdAt)}});header.append(byline,time);let comment=createElement(document2,"p",{className:"planr-thread-comment",text:pin.comment}),lifecycle=createElement(document2,"div",{className:"planr-thread-actions"});lifecycle.append(createElement(document2,"span",{className:"planr-thread-status",text:pin.status,attributes:{title:`Status: ${pin.status}`}}),createElement(document2,"button",{text:pin.status==="resolved"?"Reopen":"Resolve",attributes:{type:"button","data-planr-thread-action":pin.status==="resolved"?"reopen":"resolve","data-planr-pin-id":pin.id}}),createElement(document2,"button",{text:"Show pin",attributes:{type:"button","data-planr-thread-focus":pin.id,"aria-controls":annotationDomIds(pin.id).pin}}));let replies=createElement(document2,"ol",{className:"planr-replies",attributes:{"aria-label":"Replies"}}),earlierReplies=description.compact?Math.max(0,pin.replies.length-(description.replyLimit||2)):0;for(let reply2 of pin.replies.slice(earlierReplies))replies.append(renderReply(document2,reply2));let editor=renderReplyForm(document2,pin,description.replyExpanded);return article.append(header,comment),description.compact&&pin.comment.length>240&&(comment.dataset.planrCommentCollapsed=String(!description.commentExpanded),article.append(createElement(document2,"button",{className:"planr-comment-expand",text:description.commentExpanded?"Show less":"Read full comment",attributes:{type:"button",id:`${annotationDomIds(pin.id).thread}-expand`,"data-planr-comment-expand":pin.id,"aria-expanded":String(!!description.commentExpanded)}}))),earlierReplies&&article.append(createElement(document2,"button",{className:"planr-history-expand",text:`Show ${earlierReplies} earlier ${earlierReplies===1?"reply":"replies"}`,attributes:{type:"button",id:`${annotationDomIds(pin.id).thread}-history`,"data-planr-history-expand":pin.id,"aria-expanded":"false"}})),pin.replies.length&&article.append(replies),description.compact&&lifecycle.append(editor.querySelector("[data-planr-reply-toggle]")),article.append(lifecycle,editor),article}function decisionCopy(decision){return decision==="approved"?"Review approved":decision==="changes_requested"?"Changes requested":"Decision pending"}function mountArtifactFeedbackRail({root,document:document2=root?.ownerDocument,window=document2?.defaultView,controller:providedController,initialReview=null,reviewOf,reviewId,identity=null,createId=defaultCreateId,now=defaultNow,onSelectPin,presentation:initialPresentation={}}={}){(!root||!document2||!window)&&invalid("A browser root, document, and window are required.");let slot=root.querySelector('[data-planr-slot="feedback-rail"]'),identityInput=root.querySelector("[data-planr-reviewer-name]"),identityStatus=root.querySelector("[data-planr-identity-status]"),overall=root.querySelector("#planr-overall-note"),decisionStatus=root.querySelector('[data-planr-slot="decision-status"]'),decisionButtons=[...root.querySelectorAll("[data-planr-decision]")];(!slot||!identityInput||!overall||!decisionStatus||decisionButtons.length===0)&&invalid("Artifact feedback renderer slots are missing.");let ownsController=!providedController,controller=providedController??createArtifactReviewController({initialReview,reviewOf,reviewId,identity,createId,now}),destroyed=!1,presentation={...initialPresentation},replyDrafts=new Map,expandedReplies=new Set,expandedHistory=new Map,expandedComments=new Set,visibleLimit=Number.isInteger(initialPresentation.pageSize)?initialPresentation.pageSize:1/0,extraDrafts=new Map,overallDirty=!1,composing=!1,renderQueued=!1,captureDrafts=()=>{for(let form of slot.querySelectorAll("[data-planr-reply-form]")){let field=form.elements.namedItem("reply");field&&replyDrafts.set(form.dataset.planrReplyForm,field.value)}for(let field of slot.querySelectorAll("[data-planr-draft-key]"))typeof field.value=="string"&&extraDrafts.set(field.dataset.planrDraftKey,field.value)},snapshotDrafts=()=>(captureDrafts(),cloneFrozenArtifactReview({reviewOf:controller.getReview()?.reviewOf??reviewOf,replies:Object.fromEntries(replyDrafts),expandedReplies:[...expandedReplies],fields:Object.fromEntries(extraDrafts),overall:{value:overall.value,dirty:overallDirty},identity:identityInput.value})),emitDraftChange=()=>root.dispatchEvent(new window.CustomEvent(ARTIFACT_REVIEW_DRAFT_CHANGE_EVENT,{bubbles:!0,detail:snapshotDrafts()})),focusDescriptor=()=>{let element=document2.activeElement;if(!element||!slot.contains(element))return null;let thread2=element.closest("[data-planr-pin-id]");return{id:element.id,pinId:thread2?.dataset.planrPinId,draftKey:element.dataset.planrDraftKey,action:element.dataset.planrThreadAction,showPin:element.dataset.planrThreadFocus,tag:element.tagName,name:element.name,start:element.selectionStart,end:element.selectionEnd,direction:element.selectionDirection}},restoreFocus=descriptor=>{if(!descriptor)return;let thread2=descriptor.pinId&&document2.getElementById(artifactReviewThreadDomId(descriptor.pinId)),target=descriptor.id&&document2.getElementById(descriptor.id)||descriptor.draftKey&&[...slot.querySelectorAll("[data-planr-draft-key]")].find(field=>field.dataset.planrDraftKey===descriptor.draftKey)||descriptor.action&&[...thread2?.querySelectorAll("[data-planr-thread-action]")??[]].find(button=>button.dataset.planrThreadAction===descriptor.action)||descriptor.showPin&&thread2?.querySelector("[data-planr-thread-focus]")||[...thread2?.querySelectorAll("button,input,select,textarea")??[]].find(field=>field.tagName===descriptor.tag&&field.name===descriptor.name);target?.focus?.({preventScroll:!0}),Number.isInteger(descriptor.start)&&target?.setSelectionRange?.(descriptor.start,descriptor.end,descriptor.direction)},showError=error=>{let target=root.querySelector("#planr-review-error");target&&(target.textContent=error?.message??String(error),target.hidden=!1)},clearError=()=>{let target=root.querySelector("#planr-review-error");target&&(target.textContent="",target.hidden=!0)},announce2=message=>{decisionStatus.textContent=message;let live=root.parentElement?.querySelector('[data-planr-slot="review-announcer"]')??document2.querySelector('[data-planr-slot="review-announcer"]');live&&(live.textContent=message)},updateCounts=pins=>{let label=`${pins.length} ${pins.length===1?"comment":"comments"}`;for(let count2 of root.querySelectorAll('[data-planr-action="feedback"] .planr-count, .planr-review-rail > header .planr-count'))count2.textContent=String(pins.length),count2.setAttribute("aria-label",label);let commentsButton=root.querySelector('[data-planr-action="feedback"]');commentsButton?.setAttribute("aria-label",commentsButton.dataset.planrReviewLabel||label),commentsButton?.dataset.planrReviewLabel&&commentsButton.setAttribute("aria-description",label)},render=({capture=!0}={})=>{if(composing){renderQueued=!0;return}capture&&captureDrafts();let focus=focusDescriptor(),scroll=[];for(let node2=slot;node2&&root.contains(node2);node2=node2.parentElement)scroll.push([node2,node2.scrollTop,node2.scrollLeft]);let state=controller.getState(),{review,activePinId}=state,allPins=review?.pins??[],pins=typeof presentation.filterPin=="function"?allPins.filter(pin=>presentation.filterPin(pin,state)):allPins,activeIndex=pins.findIndex(pin=>pin.id===activePinId),visiblePins=pins.slice(0,visibleLimit);activeIndex>=visibleLimit&&visiblePins.push(pins[activeIndex]);let fragment=document2.createDocumentFragment(),list3=createElement(document2,"div",{className:"planr-thread-list",attributes:{"aria-label":"Comment threads"}});if(pins.length===0)list3.append(createElement(document2,"p",{className:"planr-review-empty",text:typeof presentation.emptyMessage=="string"?presentation.emptyMessage:allPins.length?"No comments match these filters.":"No comments yet. Choose Add comment, then select a point or region in the artifact."}));else for(let pin of visiblePins){let thread2=renderThread(document2,pin,pin.id===activePinId,{...presentation.describePin?.(pin,state),compact:presentation.compact===!0,replyLimit:expandedHistory.get(pin.id)||2,commentExpanded:expandedComments.has(pin.id),replyExpanded:expandedReplies.has(pin.id)});presentation.decorateThread?.({element:thread2,pin,state,document:document2});let reply2=thread2.querySelector('[name="reply"]');replyDrafts.has(pin.id)&&(reply2.value=replyDrafts.get(pin.id)),thread2.querySelector(".planr-reply-send").disabled=!reply2.value.trim();for(let field of thread2.querySelectorAll("[data-planr-draft-key]"))extraDrafts.has(field.dataset.planrDraftKey)&&(field.value=extraDrafts.get(field.dataset.planrDraftKey));list3.append(thread2)}pins.length>visibleLimit&&list3.append(createElement(document2,"button",{className:"planr-threads-more",text:`Show more comments · ${Math.min(visibleLimit,pins.length)} of ${pins.length}`,attributes:{type:"button","data-planr-threads-more":""}})),fragment.append(list3),slot.replaceChildren(fragment);let identityName2=controller.getIdentity()?.name??"";document2.activeElement!==identityInput&&(identityInput.value=identityName2),identityStatus&&(identityStatus.dataset.planrIdentityReady=String(!!identityName2),identityStatus.textContent=identityName2?`Comments will appear as ${identityName2}.`:"Used to sign your comments."),overall.maxLength=ARTIFACT_REVIEW_LIMITS.text,!overallDirty&&document2.activeElement!==overall&&(overall.value=review?.overall??"");for(let button of decisionButtons)button.setAttribute("aria-pressed",String(button.dataset.planrDecision===(review?.decision??"pending")));decisionStatus.textContent=decisionCopy(review?.decision??"pending"),updateCounts(allPins),restoreFocus(focus);for(let[node2,top,left]of scroll)node2.scrollTop=top,node2.scrollLeft=left;let openMetric=root.querySelector('[data-planr-metric="open"]');openMetric&&(openMetric.textContent=`${allPins.filter(({status})=>status!=="resolved").length} open`)},focusThread=pinId=>{let thread2=document2.getElementById(artifactReviewThreadDomId(pinId));thread2?.focus({preventScroll:!0}),thread2?.scrollIntoView?.({block:"nearest"})},emitReview=review=>{let detail=cloneFrozenArtifactReview(review);root.dispatchEvent(new window.CustomEvent(ARTIFACT_REVIEW_CHANGE_EVENT,{detail,bubbles:!0}))},unsubscribe=controller.subscribe((state,change)=>{destroyed||(["review","review-replaced","selection"].includes(change.type)&&render(),["review","review-replaced"].includes(change.type)&&state.review&&emitReview(state.review))}),onInput=event=>{if(event.target===identityInput)try{controller.setIdentity(event.target.value?{name:event.target.value}:null);let name=controller.getIdentity()?.name??"";identityStatus&&(identityStatus.dataset.planrIdentityReady=String(!!name),identityStatus.textContent=name?`Comments will appear as ${name}.`:"Used to sign your comments."),clearError()}catch(error){showError(error)}},setReplyExpanded=(pinId,expanded,{focus=!1}={})=>{let thread2=document2.getElementById(artifactReviewThreadDomId(pinId)),form=thread2?.querySelector("[data-planr-reply-form]"),toggle=thread2?.querySelector("[data-planr-reply-toggle]");!form||!toggle||(expanded?expandedReplies.add(pinId):expandedReplies.delete(pinId),form.hidden=!expanded,toggle.setAttribute("aria-expanded",String(expanded)),toggle.textContent=expanded?"− Reply":"+ Reply",toggle.title=expanded?"Collapse reply":"Reply to this comment",focus&&(expanded?form.elements.namedItem("reply"):toggle).focus({preventScroll:!0}),emitDraftChange())},onKeyDown=event=>{let form=event.target?.closest?.("[data-planr-reply-form]");!form||event.isComposing||(event.key==="Escape"?(event.preventDefault(),event.stopPropagation(),setReplyExpanded(form.dataset.planrReplyForm,!1,{focus:!0})):event.key==="Enter"&&(event.metaKey||event.ctrlKey)&&(event.preventDefault(),form.elements.namedItem("reply").value.trim()&&form.requestSubmit()))},emitSelection=pinId=>{controller.selectPin(pinId),root.dispatchEvent(new window.CustomEvent(ARTIFACT_REVIEW_SELECT_EVENT,{detail:deepFreeze({pinId,source:"thread"}),bubbles:!0})),onSelectPin?.(pinId)},onClick=event=>{if(event.target.closest?.("[data-planr-threads-more]")){visibleLimit+=presentation.pageSize||40,render();return}let historyToggle=event.target.closest?.("[data-planr-history-expand]");if(historyToggle){let id7=historyToggle.dataset.planrHistoryExpand;expandedHistory.set(id7,(expandedHistory.get(id7)||2)+20),render();return}let commentToggle=event.target.closest?.("[data-planr-comment-expand]");if(commentToggle){let id7=commentToggle.dataset.planrCommentExpand;expandedComments.has(id7)?expandedComments.delete(id7):expandedComments.add(id7),render();return}let replyToggle=event.target?.closest?.("[data-planr-reply-toggle]");if(replyToggle){setReplyExpanded(replyToggle.dataset.planrReplyToggle,replyToggle.getAttribute("aria-expanded")!=="true",{focus:!0});return}let action=event.target?.closest?.("[data-planr-thread-action]"),focus=event.target?.closest?.("[data-planr-thread-focus]");if(action){try{let pinId=action.dataset.planrPinId;controller.dispatch({type:"set-status",pinId,status:action.dataset.planrThreadAction==="resolve"?"resolved":"open"}),announce2(action.dataset.planrThreadAction==="resolve"?"Comment resolved":"Comment reopened"),focusThread(pinId),clearError()}catch(error){showError(error)}return}focus&&emitSelection(focus.dataset.planrThreadFocus)},onSubmit=event=>{let form=event.target?.closest?.("[data-planr-reply-form]");if(!form)return;event.preventDefault();let textarea=form.elements.namedItem("reply"),comment=textarea.value;if(!comment.trim())return;let wasExpanded=expandedReplies.has(form.dataset.planrReplyForm);try{textarea.setAttribute("aria-invalid","false"),textarea.value="",replyDrafts.delete(form.dataset.planrReplyForm),expandedReplies.delete(form.dataset.planrReplyForm),controller.dispatch({type:"add-reply",pinId:form.dataset.planrReplyForm,comment}),emitDraftChange(),announce2("Reply added"),focusThread(form.dataset.planrReplyForm),clearError()}catch(error){textarea.value=comment,replyDrafts.set(form.dataset.planrReplyForm,comment),wasExpanded&&expandedReplies.add(form.dataset.planrReplyForm),textarea?.setAttribute("aria-invalid","true"),showError(error),textarea?.focus()}},onOverallChange=()=>{try{let value=overall.value;controller.dispatch({type:"set-overall",overall:value}),overallDirty=!1,announce2("Overall note updated"),clearError()}catch(error){showError(error)}},onDecision=event=>{try{let selected=event.currentTarget.dataset.planrDecision,decision=controller.getReview()?.decision===selected?"pending":selected;controller.dispatch({type:"set-decision",decision}),announce2(decisionCopy(decision)),clearError()}catch(error){showError(error)}},onSelect=event=>{if(!(event.detail?.source==="thread"||typeof event.detail?.pinId!="string"))try{controller.selectPin(event.detail.pinId),focusThread(event.detail.pinId)}catch(error){showError(error)}},lastOpened=null,onThreadOpen=event=>{let thread2=event.target.closest?.(".planr-thread[data-planr-pin-id]");if(!thread2||!slot.contains(thread2))return;let pin=controller.getReview()?.pins.find(entry=>entry.id===thread2.dataset.planrPinId),key=pin&&`${pin.id}:${pin.replies.map(reply2=>reply2.id).join(",")}`;!key||lastOpened===key||(lastOpened=key,presentation.onThreadOpen?.(pin.id,controller.getState()),root.dispatchEvent(new window.CustomEvent("planr:artifact-thread-open",{bubbles:!0,detail:Object.freeze({pinId:pin.id})})))},onDraftInput=event=>{let form=event.target.closest?.("[data-planr-reply-form]");form&&(form.querySelector(".planr-reply-send").disabled=!form.elements.namedItem("reply").value.trim()),emitDraftChange()},onOverallInput=()=>{overallDirty=!0,emitDraftChange()},onCompositionStart=()=>{composing=!0},onCompositionEnd=()=>{composing=!1,renderQueued&&(renderQueued=!1,render())};slot.addEventListener("input",onDraftInput),slot.addEventListener("focusin",onThreadOpen),slot.addEventListener("click",onThreadOpen),slot.addEventListener("compositionstart",onCompositionStart),slot.addEventListener("compositionend",onCompositionEnd),overall.addEventListener("input",onOverallInput),identityInput.addEventListener("input",onInput),slot.addEventListener("click",onClick),slot.addEventListener("submit",onSubmit),slot.addEventListener("keydown",onKeyDown),overall.addEventListener("change",onOverallChange);for(let button of decisionButtons)button.addEventListener("click",onDecision);return root.addEventListener(ARTIFACT_REVIEW_SELECT_EVENT,onSelect),render(),Object.freeze({controller,getReview:()=>controller.getReview(),getState:()=>controller.getState(),getIdentity:()=>controller.getIdentity(),setIdentity:value=>controller.setIdentity(value),dispatch:action=>controller.dispatch(action),replaceReview:review=>controller.replaceReview(review),selectPin:pinId=>controller.selectPin(pinId),render,setPresentation(options={}){(options.filterKey!==presentation.filterKey||options.pageSize!==void 0&&options.pageSize!==presentation.pageSize)&&(visibleLimit=options.pageSize||presentation.pageSize||1/0),presentation={...presentation,...options},render()},snapshotDrafts,getReviewOf:()=>controller.getReview()?.reviewOf??reviewOf,restoreDrafts(snapshot2){let digest7=controller.getReview()?.reviewOf??reviewOf;if(!snapshot2||snapshot2.reviewOf!==digest7)return!1;if(typeof snapshot2.identity=="string"){let name=snapshot2.identity.slice(0,ARTIFACT_REVIEW_LIMITS.authorName);controller.setIdentity(name.trim()?{...controller.getIdentity(),name}:null)}for(let[id7,value]of Object.entries(snapshot2.replies??{}).slice(0,ARTIFACT_REVIEW_LIMITS.pins))id7.length<=ARTIFACT_REVIEW_LIMITS.id&&typeof value=="string"&&replyDrafts.set(id7,value.slice(0,ARTIFACT_REVIEW_LIMITS.text));expandedReplies.clear();let expanded=Array.isArray(snapshot2.expandedReplies)?snapshot2.expandedReplies:[...replyDrafts.keys()];for(let id7 of expanded.slice(0,ARTIFACT_REVIEW_LIMITS.pins))typeof id7=="string"&&id7.length<=ARTIFACT_REVIEW_LIMITS.id&&expandedReplies.add(id7);for(let[key,value]of Object.entries(snapshot2.fields??{}).slice(0,ARTIFACT_REVIEW_LIMITS.pins))key.length<=512&&typeof value=="string"&&extraDrafts.set(key,value.slice(0,ARTIFACT_REVIEW_LIMITS.text));return overallDirty=snapshot2.overall?.dirty===!0,overallDirty&&typeof snapshot2.overall?.value=="string"&&(overall.value=snapshot2.overall.value.slice(0,ARTIFACT_REVIEW_LIMITS.text)),render({capture:!1}),!0},focusThread,destroy(){if(!destroyed){destroyed=!0,unsubscribe(),slot.removeEventListener("input",onDraftInput),slot.removeEventListener("focusin",onThreadOpen),slot.removeEventListener("click",onThreadOpen),slot.removeEventListener("compositionstart",onCompositionStart),slot.removeEventListener("compositionend",onCompositionEnd),overall.removeEventListener("input",onOverallInput),identityInput.removeEventListener("input",onInput),slot.removeEventListener("click",onClick),slot.removeEventListener("submit",onSubmit),slot.removeEventListener("keydown",onKeyDown),overall.removeEventListener("change",onOverallChange);for(let button of decisionButtons)button.removeEventListener("click",onDecision);root.removeEventListener(ARTIFACT_REVIEW_SELECT_EVENT,onSelect),ownsController&&controller.destroy()}}})}var ARTIFACT_ROOM_GENESIS_HASH=`sha256:${"0".repeat(64)}`,ARTIFACT_ROOM_MAX_CLOCK_SKEW_MS=300*1e3,ARTIFACT_ROOM_CAPABILITIES=Object.freeze({reviewer:"reviewer-write",owner:"owner-verdict",management:"room-management"});var textEncoder=new TextEncoder;var encoder4=new TextEncoder,decoder3=new TextDecoder("utf-8",{fatal:!0}),preparations=new WeakMap;function assertLiveRoomV3RecoveryMatchesPreparation(prepared,recovery){let state=preparations.get(prepared),names=["schemaVersion","kind","origin","body","key","reviewOf","inputDigest","ownerSigner"];if(!state||!recovery||typeof recovery!="object"||Array.isArray(recovery)||Object.keys(recovery).length!==names.length||Object.keys(recovery).some(name=>!names.includes(name))||Object.values(Object.getOwnPropertyDescriptors(recovery)).some(descriptor=>!("value"in descriptor))||recovery.schemaVersion!=="2.0.0"||recovery.kind!=="openplanr-live-room-recovery")throw new TypeError("Room recovery differs from its private preparation.");assertSharingSecurityContract(recovery.body,"artifact-room-create-v3");let expected={origin:state.origin,body:state.body,key:state.key,reviewOf:state.reviewOf,inputDigest:state.inputDigest},actual={origin:recovery.origin,body:recovery.body,key:recovery.key,reviewOf:recovery.reviewOf,inputDigest:recovery.inputDigest};if(canonicalizeJson(expected)!==canonicalizeJson(actual))throw new TypeError("Room recovery differs from its private preparation.");return recovery}var ARTIFACT_ROOM_EVENT_KINDS=Object.freeze(["pin","reply","pin_status","recommendation","owner_decision","review_snapshot"]),ARTIFACT_ROOM_TTLS=Object.freeze(["1d","7d","30d"]);var MAX_ARTIFACT_HTML_BYTES=10*1024*1024;var ARTIFACT_SHARE_FRAGMENT_LIMIT=8e3,ARTIFACT_SHARE_TTLS2=Object.freeze({"1d":Object.freeze({label:"1 day",milliseconds:864e5}),"7d":Object.freeze({label:"7 days",milliseconds:6048e5}),"30d":Object.freeze({label:"30 days",milliseconds:2592e6})}),ARTIFACT_SHARE_TRANSPORTS=Object.freeze(["live","fragment","short"]),PHASES=Object.freeze(["idle","previewing","ready","custody-preparing","custody-ready","creating","ambiguous","created","error"]),LIVE_ROOM_ID_RE=/^[A-Za-z0-9_-]{16,128}$/,LIVE_ROOM_SECRET_RE=/^[A-Za-z0-9_-]{43}$/,LIVE_ROOM_KEY_ID_RE=/^sha256:[a-f0-9]{64}$/,LIVE_ROOM_REVIEW_RE=/^[a-f0-9]{64}$/,BASE64URL_RE=/^[A-Za-z0-9_-]+$/,OWNER_SECRET_MAX_BYTES=64*1024,ROOM_RECOVERY_MAX_BYTES=8*1024*1024,ArtifactShareUiError=class extends Error{constructor(code,message,details={}){super(message),this.name="ArtifactShareUiError",this.code=code,this.details=Object.freeze({...details})}};function member(value,allowed,fallback){return allowed.includes(value)?value:fallback}function count(value,name){if(!Number.isInteger(value)||value<0)throw new ArtifactShareUiError("E_ARTIFACT_SHARE_PREVIEW_INVALID",`${name} must be a non-negative integer.`,{field:name});return value}function text4(value,fallback=""){return typeof value=="string"?value:fallback}function record(value){return!!value&&typeof value=="object"&&!Array.isArray(value)}function exactKeys(value,expected){return record(value)&&JSON.stringify(Object.keys(value).sort())===JSON.stringify([...expected].sort())}function exactLoopback(hostname){return hostname==="localhost"||hostname==="127.0.0.1"||hostname==="[::1]"||hostname==="::1"}function parseLiveResultUrl(value,capability){let url;try{url=new URL(value)}catch{throw new ArtifactShareUiError("E_ARTIFACT_SHARE_RESULT_INVALID","Live room creation returned a malformed capability URL.")}let fields=new URLSearchParams(url.hash.slice(1)),keys=[...fields.keys()],authenticatedRead=fields.has("r"),expected=["k",capability,...authenticatedRead?["r"]:[]],roomId=/^\/r\/([A-Za-z0-9_-]{16,128})\/?$/.exec(url.pathname)?.[1];if(url.username||url.password||url.search||url.protocol!=="https:"&&!(url.protocol==="http:"&&exactLoopback(url.hostname))||!roomId||!LIVE_ROOM_ID_RE.test(roomId)||keys.length!==expected.length||!keys.includes("k")||!keys.includes(capability)||keys.some(key=>!expected.includes(key)||fields.getAll(key).length!==1)||authenticatedRead&&!LIVE_ROOM_SECRET_RE.test(fields.get("r")??"")||!LIVE_ROOM_SECRET_RE.test(fields.get("k")??"")||!LIVE_ROOM_SECRET_RE.test(fields.get(capability)??""))throw new ArtifactShareUiError("E_ARTIFACT_SHARE_RESULT_INVALID","Live room creation returned an invalid or mixed capability URL.");return Object.freeze({origin:url.origin,pathname:url.pathname.replace(/\/$/,""),key:fields.get("k"),capability:fields.get(capability),readCapability:fields.get("r")})}function validateLiveResultUrls({url,ownerUrl,manageUrl}){let reviewer=parseLiveResultUrl(url,"w"),owner=parseLiveResultUrl(ownerUrl,"o"),management=parseLiveResultUrl(manageUrl,"m");if(reviewer.origin!==owner.origin||reviewer.origin!==management.origin||reviewer.pathname!==owner.pathname||reviewer.pathname!==management.pathname||reviewer.key!==owner.key||reviewer.key!==management.key||reviewer.readCapability!==owner.readCapability||reviewer.readCapability!==management.readCapability||new Set([reviewer.capability,owner.capability,management.capability]).size!==3)throw new ArtifactShareUiError("E_ARTIFACT_SHARE_RESULT_INVALID","Live room creation must return separate reviewer, owner-verdict, and management capabilities for one room.")}function normalizeOwnerCustody(value){if(record(value?.prepared)&&record(value?.recovery)){let{prepared,recovery}=value;if(prepared.protocolVersion==="3.0.0"){try{assertLiveRoomV3RecoveryMatchesPreparation(prepared,recovery)}catch{throw new ArtifactShareUiError("E_ARTIFACT_SHARE_OWNER_CUSTODY_INVALID","Live room recovery custody does not match its prepared creation.")}if(validateLiveResultUrls(prepared),recovery.schemaVersion!=="2.0.0")throw new ArtifactShareUiError("E_ARTIFACT_SHARE_OWNER_CUSTODY_INVALID","Live room recovery version is invalid.");let signerCustody2=normalizeOwnerCustody({signer:prepared.ownerSigner,secret:recovery.ownerSigner});if(JSON.stringify(prepared.ownerKey)!==JSON.stringify({algorithm:signerCustody2.signer.algorithm,encoding:signerCustody2.signer.encoding,keyId:signerCustody2.signer.keyId,value:signerCustody2.signer.value??signerCustody2.signer.publicKey}))throw new ArtifactShareUiError("E_ARTIFACT_SHARE_OWNER_CUSTODY_INVALID","Live room recovery owner key does not match its prepared signer.");let serialized3=`${JSON.stringify(recovery,null,2)}
3
- `;if(new TextEncoder().encode(serialized3).byteLength>ROOM_RECOVERY_MAX_BYTES)throw new ArtifactShareUiError("E_ARTIFACT_SHARE_OWNER_CUSTODY_INVALID","Live room recovery bundle exceeds its bounded export size.");return Object.freeze({credential:prepared,signer:signerCustody2.signer,serialized:serialized3,filename:`openplanr-live-room-recovery-${prepared.roomId.slice(0,12)}.json`})}if(recovery.schemaVersion!=="1.0.0")throw new ArtifactShareUiError("E_ARTIFACT_SHARE_OWNER_CUSTODY_INVALID","Live room recovery version is invalid.");if(!exactKeys(prepared,["schemaVersion","kind","protocolVersion","id","roomId","reviewOf","ttl","ownerKey"])||prepared.schemaVersion!=="1.0.0"||prepared.kind!=="openplanr-live-room-preparation"||prepared.protocolVersion!=="2.0.0"||prepared.id!==prepared.roomId||!LIVE_ROOM_ID_RE.test(prepared.roomId??"")||!LIVE_ROOM_REVIEW_RE.test(prepared.reviewOf??"")||!Object.hasOwn(ARTIFACT_SHARE_TTLS2,prepared.ttl)||!record(prepared.ownerKey)||!exactKeys(prepared.ownerKey,["algorithm","encoding","keyId","value"])||!record(prepared.ownerSigner)||!exactKeys(recovery,["schemaVersion","kind","protocolVersion","id","roomId","reviewOf","ttl","ownerKey","url","ownerUrl","manageUrl","ownerSigner"])||recovery.schemaVersion!=="1.0.0"||recovery.kind!=="openplanr-live-room-recovery"||recovery.protocolVersion!=="2.0.0"||recovery.id!==prepared.id||recovery.roomId!==prepared.roomId||recovery.reviewOf!==prepared.reviewOf||recovery.ttl!==prepared.ttl||JSON.stringify(recovery.ownerKey)!==JSON.stringify(prepared.ownerKey)||recovery.url!==prepared.url||recovery.ownerUrl!==prepared.ownerUrl||recovery.manageUrl!==prepared.manageUrl)throw new ArtifactShareUiError("E_ARTIFACT_SHARE_OWNER_CUSTODY_INVALID","Live room recovery custody does not match its prepared creation.");validateLiveResultUrls(recovery);let signerCustody=normalizeOwnerCustody({signer:prepared.ownerSigner,secret:recovery.ownerSigner});if(prepared.ownerKey.algorithm!==signerCustody.signer.algorithm||prepared.ownerKey.encoding!==signerCustody.signer.encoding||prepared.ownerKey.keyId!==signerCustody.signer.keyId||prepared.ownerKey.value!==(signerCustody.signer.value??signerCustody.signer.publicKey))throw new ArtifactShareUiError("E_ARTIFACT_SHARE_OWNER_CUSTODY_INVALID","Live room recovery owner key does not match its prepared signer.");let serialized2=`${JSON.stringify(recovery,null,2)}
4
- `,byteLength2=new TextEncoder().encode(serialized2).byteLength;if(byteLength2<2||byteLength2>OWNER_SECRET_MAX_BYTES)throw new ArtifactShareUiError("E_ARTIFACT_SHARE_OWNER_CUSTODY_INVALID","Live room recovery bundle exceeds its bounded export size.");return Object.freeze({credential:prepared,signer:signerCustody.signer,serialized:serialized2,filename:`openplanr-live-room-recovery-${prepared.roomId.slice(0,12)}.json`})}if(!record(value)||!record(value.signer)||!record(value.secret))throw new ArtifactShareUiError("E_ARTIFACT_SHARE_OWNER_CUSTODY_INVALID","Live room owner custody could not be prepared safely.");let{signer,secret}=value;if(signer.role!=="owner"||typeof signer.sign!="function"||signer.algorithm!=="ECDSA-P256-SHA256"||signer.encoding!=="spki-base64url"||!LIVE_ROOM_KEY_ID_RE.test(signer.keyId??"")||!BASE64URL_RE.test(signer.value??signer.publicKey??"")||(signer.value??signer.publicKey).length<64||(signer.value??signer.publicKey).length>512)throw new ArtifactShareUiError("E_ARTIFACT_SHARE_OWNER_CUSTODY_INVALID","Live room owner signer is invalid.");if(!exactKeys(secret,["schemaVersion","kind","role","algorithm","keyId","publicKey","privateKey"])||secret.schemaVersion!=="1.0.0"||secret.kind!=="openplanr-live-room-signer"||secret.role!=="owner"||secret.algorithm!=="ECDSA-P256-SHA256"||secret.keyId!==signer.keyId||secret.publicKey!==(signer.value??signer.publicKey)||!BASE64URL_RE.test(secret.publicKey??"")||!BASE64URL_RE.test(secret.privateKey??"")||secret.publicKey.length<64||secret.publicKey.length>512||secret.privateKey.length<64||secret.privateKey.length>1024)throw new ArtifactShareUiError("E_ARTIFACT_SHARE_OWNER_CUSTODY_INVALID","Live room owner secret does not match its signer.");let serialized=`${JSON.stringify(secret,null,2)}
5
- `,byteLength=new TextEncoder().encode(serialized).byteLength;if(byteLength<2||byteLength>OWNER_SECRET_MAX_BYTES)throw new ArtifactShareUiError("E_ARTIFACT_SHARE_OWNER_CUSTODY_INVALID","Live room owner secret exceeds its bounded export size.");return Object.freeze({credential:signer,signer,serialized,filename:`openplanr-live-room-owner-${signer.keyId.slice(7,19)}.json`})}function defaultSaveOwnerCustody(document2,window,{filename,serialized}){if(typeof window?.Blob!="function"||typeof window?.URL?.createObjectURL!="function"||typeof window?.URL?.revokeObjectURL!="function"||typeof document2?.createElement!="function"||!document2.body)throw new ArtifactShareUiError("E_ARTIFACT_SHARE_OWNER_CUSTODY_UNAVAILABLE","This browser cannot save the private owner key. No room was created.");let blobUrl=window.URL.createObjectURL(new window.Blob([serialized],{type:"application/json;charset=utf-8"}));try{let anchor2=document2.createElement("a");anchor2.hidden=!0,anchor2.href=blobUrl,anchor2.download=filename,anchor2.rel="noreferrer",document2.body.append(anchor2),anchor2.click(),anchor2.remove()}catch(error){throw new ArtifactShareUiError("E_ARTIFACT_SHARE_OWNER_CUSTODY_UNAVAILABLE","The private owner key could not be handed to the browser download manager. No room was created.",{cause:error?.name})}finally{window.setTimeout(()=>window.URL.revokeObjectURL(blobUrl),0)}return!0}async function establishArtifactOwnerCustody({prepareOwnerCustody,saveOwnerCustody}={}){if(typeof prepareOwnerCustody!="function"||typeof saveOwnerCustody!="function")throw new ArtifactShareUiError("E_ARTIFACT_SHARE_OWNER_CUSTODY_REQUIRED","Live room creation requires explicit private owner-key custody. No room was created.");let custody=normalizeOwnerCustody(await prepareOwnerCustody()),saved=await saveOwnerCustody(Object.freeze({filename:custody.filename,serialized:custody.serialized}));if(saved!==!0&&saved?.saved!==!0)throw new ArtifactShareUiError("E_ARTIFACT_SHARE_OWNER_CUSTODY_UNAVAILABLE","Private owner-key custody was not confirmed. No room was created.");return custody.credential}function frozenResult(value){if(!value||typeof value!="object"||typeof value.url!="string"||value.url.length===0)throw new ArtifactShareUiError("E_ARTIFACT_SHARE_RESULT_INVALID","Share creation must return a non-empty review URL.");if(!ARTIFACT_SHARE_TRANSPORTS.includes(value.transport))throw new ArtifactShareUiError("E_ARTIFACT_SHARE_RESULT_INVALID","Share creation must return a known transport.",{field:"transport"});let deletionToken=text4(value.deletionToken),ownerUrl=text4(value.ownerUrl),manageUrl=text4(value.manageUrl);if(deletionToken&&value.url.includes(deletionToken))throw new ArtifactShareUiError("E_ARTIFACT_SHARE_DELETION_TOKEN_LEAK","The deletion token must never be included in the review URL.");if(value.transport==="live")validateLiveResultUrls({url:value.url,ownerUrl,manageUrl});else if(ownerUrl||manageUrl)throw new ArtifactShareUiError("E_ARTIFACT_SHARE_RESULT_INVALID","Snapshot creation cannot return live room capabilities.");return Object.freeze({transport:value.transport,url:value.url,ownerUrl,manageUrl,deletionToken,expiresAt:text4(value.expiresAt)})}function normalizeArtifactSharePreview(value={}){let preview=value&&typeof value=="object"?value:{},fragmentLength=count(preview.fragmentLength,"fragmentLength");return Object.freeze({fragmentLength,compressedBytes:count(preview.compressedBytes,"compressedBytes"),ciphertextBytes:count(preview.ciphertextBytes,"ciphertextBytes"),fragmentEligible:fragmentLength<=ARTIFACT_SHARE_FRAGMENT_LIMIT})}function freezeState(value){return Object.freeze({open:!!value.open,phase:member(value.phase,PHASES,"idle"),transport:member(value.transport,ARTIFACT_SHARE_TRANSPORTS,"live"),ttl:Object.hasOwn(ARTIFACT_SHARE_TTLS2,value.ttl)?value.ttl:"7d",preview:value.preview?normalizeArtifactSharePreview(value.preview):null,ownerCustodyEstablished:!!value.ownerCustodyEstablished,result:value.result?frozenResult(value.result):null,error:text4(value.error)})}function createArtifactShareDialogState({preview,ttl="7d"}={}){let normalizedPreview=preview?normalizeArtifactSharePreview(preview):null;return freezeState({open:!1,phase:normalizedPreview?"ready":"idle",transport:"live",ttl,preview:normalizedPreview,ownerCustodyEstablished:!1,result:null,error:""})}function reduceArtifactShareDialog(state,action={}){let current=state??createArtifactShareDialogState();if(current.phase==="created"&&action.type!=="close"||current.phase==="ambiguous"&&!["create-start","create-success","failure"].includes(action.type)||current.phase==="custody-ready"&&["select-transport","set-ttl"].includes(action.type))return current;switch(action.type){case"open":return freezeState({...current,open:!0,ownerCustodyEstablished:!1,result:null,error:""});case"close":return freezeState({...current,open:!1,phase:current.preview?"ready":"idle",ownerCustodyEstablished:!1,error:""});case"preview-start":return freezeState({...current,open:!0,phase:"previewing",preview:null,ownerCustodyEstablished:!1,result:null,error:""});case"preview-ready":{let preview=normalizeArtifactSharePreview(action.preview);return freezeState({...current,phase:"ready",preview,ownerCustodyEstablished:!1,transport:current.transport==="fragment"&&!preview.fragmentEligible?"short":current.transport,result:null,error:""})}case"select-transport":{let transport=member(action.transport,ARTIFACT_SHARE_TRANSPORTS,current.transport);return transport==="fragment"&&current.preview?.fragmentEligible===!1||transport===current.transport?current:freezeState({...current,phase:current.preview?"ready":"idle",transport,ownerCustodyEstablished:!1,result:null,error:""})}case"set-ttl":{let ttl=Object.hasOwn(ARTIFACT_SHARE_TTLS2,action.ttl)?action.ttl:current.ttl;return ttl===current.ttl?current:freezeState({...current,ttl,result:null,error:""})}case"custody-start":return freezeState({...current,phase:"custody-preparing",ownerCustodyEstablished:!1,result:null,error:""});case"custody-ready":return freezeState({...current,phase:"custody-ready",ownerCustodyEstablished:!0,result:null,error:""});case"create-start":return freezeState({...current,phase:"creating",result:null,error:""});case"create-success":return freezeState({...current,phase:"created",result:action.result,error:""});case"failure":return freezeState({...current,phase:action.ambiguous?"ambiguous":"error",ownerCustodyEstablished:!!action.ownerCustodyEstablished,result:null,error:text4(action.error,"Share creation failed.")});default:return current}}function artifactShareExpiry(ttl,now=new Date){let choice=ARTIFACT_SHARE_TTLS2[ttl]??ARTIFACT_SHARE_TTLS2["7d"],base=now instanceof Date?now.getTime():new Date(now).getTime();if(!Number.isFinite(base))throw new TypeError("Share expiry requires a valid date.");return new Date(base+choice.milliseconds).toISOString()}function formatArtifactShareBytes(value){let bytes=count(value,"bytes");return bytes<1e3?`${bytes} B`:bytes<1e6?`${(bytes/1e3).toFixed(bytes>=1e4?0:1)} KB`:`${(bytes/1e6).toFixed(1)} MB`}function focusableElements(dialog){return[...dialog.querySelectorAll('button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [href], [tabindex]:not([tabindex="-1"])')].filter(element=>!element.hidden&&!element.closest("[hidden]"))}function defaultCopy(window,value){if(typeof window?.navigator?.clipboard?.writeText!="function")throw new ArtifactShareUiError("E_ARTIFACT_SHARE_CLIPBOARD_UNAVAILABLE","Clipboard access is unavailable. Copy the value manually.");return window.navigator.clipboard.writeText(value)}function reviewForShare(stageController){return stageController?.review?.getReview?.()??null}function artifactShareCapabilities({prepareShare,prepareOwnerCustody,createShare,supportedTransports}={}){let canCreate=typeof prepareShare=="function"&&typeof createShare=="function";return Object.freeze(ARTIFACT_SHARE_TRANSPORTS.filter(transport=>canCreate&&(transport!=="live"||typeof prepareOwnerCustody=="function")&&(supportedTransports===void 0||Array.isArray(supportedTransports)&&supportedTransports.includes(transport))))}function mountArtifactShareDialog({document:document2=globalThis.document,window=document2?.defaultView,root=document2?.querySelector?.(".planr-shell"),stageController,prepareShare,prepareOwnerCustody,saveOwnerCustody,createShare,supportedTransports,unavailableReason,copyText,existingRoom=!1,existingShareUrl=null,now=()=>new Date}={}){if(!document2||!window||!root)return null;let backdrop=document2.querySelector("[data-planr-share-dialog]"),dialog=backdrop?.querySelector('[role="dialog"]'),trigger=root.querySelector('[data-planr-action="share"]');if(!backdrop||!dialog||!trigger)return null;let state=createArtifactShareDialogState(),capabilities=artifactShareCapabilities({prepareShare,prepareOwnerCustody,createShare,supportedTransports}),unavailable=text4(unavailableReason)||"Sharing is not configured in this viewer. Open the review with an updated OpenPlanr installation that supports sharing.",returnFocus=null,generation=0,pendingOwnerCustody=null,copyResetTimers=new Map,cleanup=[],handlers={prepareShare:typeof prepareShare=="function"?prepareShare:null,prepareOwnerCustody:typeof prepareOwnerCustody=="function"?prepareOwnerCustody:null,saveOwnerCustody:typeof saveOwnerCustody=="function"?saveOwnerCustody:value=>defaultSaveOwnerCustody(document2,window,value),createShare:typeof createShare=="function"?createShare:null,copyText:typeof copyText=="function"?copyText:value=>defaultCopy(window,value)},stableShareUrl=typeof existingShareUrl=="function"?existingShareUrl:()=>existingShareUrl;function supports(transport){return capabilities.includes(transport)&&(transport!=="fragment"||state.preview?.fragmentEligible!==!1)}function selectSupportedTransport(){if(!supports(state.transport)){let transport=capabilities.find(supports);transport&&(state=reduceArtifactShareDialog(state,{type:"select-transport",transport}))}}function listen(target,type,handler,options){target.addEventListener(type,handler,options),cleanup.push(()=>target.removeEventListener(type,handler,options))}function announce2(message){let live=dialog.querySelector("[data-planr-share-status]");live&&(live.textContent=message)}function resetCopyButton(button){let timer=copyResetTimers.get(button);timer&&window.clearTimeout(timer),copyResetTimers.delete(button),button.removeAttribute("data-planr-copy-state");let label=button.querySelector?.(".planr-action-label");label?label.textContent=button.dataset.planrCopyLabel??label.textContent:button.textContent=button.dataset.planrCopyLabel??button.textContent}function showCopyState(button,stateValue){if(!button)return;let label=button.querySelector?.(".planr-action-label");button.dataset.planrCopyLabel||(button.dataset.planrCopyLabel=(label?.textContent??button.textContent).trim());let prior=copyResetTimers.get(button);prior&&window.clearTimeout(prior),button.dataset.planrCopyState=stateValue,label?label.textContent=stateValue==="copied"?"Copied":"Try again":button.textContent=stateValue==="copied"?"Copied":"Try again",copyResetTimers.set(button,window.setTimeout(()=>resetCopyButton(button),1800))}function resetCopyButtons(){for(let button of dialog.querySelectorAll("[data-planr-copy-state]"))resetCopyButton(button)}function clearPendingOwnerSigner(){pendingOwnerCustody=null}function pendingOwnerSigner(){return pendingOwnerCustody?.ownerSigner??pendingOwnerCustody}async function copyExistingRoom(){let value=stableShareUrl();if(value)try{await handlers.copyText(value),showCopyState(trigger,"copied"),announce2("Live review URL copied. This remains the same collaboration room.")}catch(error){showCopyState(trigger,"error"),announce2(error?.message??"Review URL could not be copied.")}}function render(){let preview=state.preview;backdrop.hidden=!state.open,backdrop.style.pointerEvents=state.open?"auto":"",root.toggleAttribute("inert",state.open),root.setAttribute("aria-hidden",String(state.open)),state.open||root.removeAttribute("aria-hidden"),dialog.dataset.planrSharePhase=state.phase,dialog.dataset.planrShareSelected=state.transport;for(let button of dialog.querySelectorAll("[data-planr-share-transport]")){let transport=button.dataset.planrShareTransport,selected=transport===state.transport;button.hidden=state.phase==="created",button.setAttribute("aria-pressed",String(selected)),button.classList.toggle("is-selected",selected),button.disabled=["previewing","custody-preparing","custody-ready","creating","ambiguous","created"].includes(state.phase)||!supports(transport),button.setAttribute("aria-disabled",String(button.disabled)),button.title=capabilities.includes(transport)?"":transport==="live"&&capabilities.length?"Live review requires this host to provide private owner-key custody. Choose an available snapshot option.":unavailable,transport==="live"&&(button.querySelector(".planr-share-receipt-size").textContent=capabilities.includes("live")?"Default":"Unavailable")}let fragmentSize=dialog.querySelector("[data-planr-share-fragment-size]");fragmentSize&&(fragmentSize.textContent=capabilities.includes("fragment")?preview?`${preview.fragmentLength.toLocaleString("en-US")} chars · ${formatArtifactShareBytes(preview.compressedBytes)}`:state.phase==="previewing"?"Calculating…":"Size unavailable":"Unavailable");let shortSize=dialog.querySelector("[data-planr-share-short-size]");shortSize&&(shortSize.textContent=capabilities.includes("short")?preview?formatArtifactShareBytes(preview.ciphertextBytes):state.phase==="previewing"?"Calculating…":"Size unavailable":"Unavailable");let threshold=dialog.querySelector("[data-planr-share-threshold]");threshold&&(threshold.hidden=!capabilities.includes("fragment"),threshold.textContent=preview?.fragmentEligible===!1?`Private fragment snapshot unavailable (${preview.fragmentLength.toLocaleString("en-US")} characters; 8,000 limit). Choose an available sharing option.`:preview?"Private fragment snapshot available for links up to 8,000 characters.":"Preparing the snapshot size before sharing.");let ttlRow=dialog.querySelector("[data-planr-share-ttl-row]");ttlRow&&(ttlRow.hidden=state.phase==="created"||!supports(state.transport)||!["live","short"].includes(state.transport));let ttlSelect2=dialog.querySelector("[data-planr-share-ttl]");ttlSelect2&&(ttlSelect2.value=state.ttl,ttlSelect2.disabled=["custody-preparing","custody-ready","creating","ambiguous","created"].includes(state.phase));let expiry=artifactShareExpiry(state.ttl,now()),expiryNode=dialog.querySelector("[data-planr-share-expiry]");expiryNode&&(expiryNode.dateTime=expiry,expiryNode.textContent=new Intl.DateTimeFormat("en",{year:"numeric",month:"short",day:"numeric",timeZone:"UTC"}).format(new Date(expiry)));let primary=dialog.querySelector("[data-planr-share-confirm]");primary&&(primary.hidden=state.phase==="created",primary.disabled=!supports(state.transport)||!preview&&state.phase!=="error"||state.phase==="previewing"||state.phase==="custody-preparing"||state.phase==="creating"||state.phase==="created",primary.textContent=supports(state.transport)?state.phase==="error"&&!preview?"Retry preparation":state.phase==="custody-preparing"?"Preparing owner key…":state.phase==="creating"?"Creating…":state.phase==="ambiguous"?"Retry exact room creation":state.transport==="live"?state.ownerCustodyEstablished?state.phase==="error"?"Retry live review room":"I saved it — create live room":"Download recovery bundle":state.transport==="short"?"Create encrypted link":"Copy private link":"Sharing unavailable");for(let closeControl of dialog.querySelectorAll("[data-planr-share-close], [data-planr-share-cancel]")){let closeBlocked=state.phase==="creating"||state.phase==="ambiguous";closeControl.disabled=closeBlocked,closeControl.setAttribute("aria-disabled",String(closeBlocked))}let custody=dialog.querySelector("[data-planr-share-owner-custody]");custody&&(custody.hidden=state.transport!=="live"||!supports("live")||state.phase==="created");let custodyStatus=dialog.querySelector("[data-planr-share-owner-custody-status]");custodyStatus&&(custodyStatus.textContent=state.ownerCustodyEstablished?"Full recovery bundle handed to the browser. It contains the three scoped URLs and owner key; no room exists until you confirm creation.":"No room will be created until the full private recovery bundle is downloaded successfully.");let receipt2=dialog.querySelector("[data-planr-share-result]");receipt2&&(receipt2.hidden=state.phase!=="created"||!state.result);let resultUrl=dialog.querySelector("[data-planr-share-url]");resultUrl&&(resultUrl.value=state.result?.url??"");let owner=dialog.querySelector("[data-planr-share-owner]");owner&&(owner.hidden=!state.result?.ownerUrl);let ownerUrl=dialog.querySelector("[data-planr-share-owner-url]");ownerUrl&&(ownerUrl.value=state.result?.ownerUrl??"");let manage=dialog.querySelector("[data-planr-share-manage]");manage&&(manage.hidden=!state.result?.manageUrl);let manageUrl=dialog.querySelector("[data-planr-share-manage-url]");manageUrl&&(manageUrl.value=state.result?.manageUrl??"");let deletion=dialog.querySelector("[data-planr-share-deletion]");deletion&&(deletion.hidden=!state.result?.deletionToken);let deletionToken=dialog.querySelector("[data-planr-share-deletion-token]");deletionToken&&(deletionToken.textContent=state.result?.deletionToken??"");let error=dialog.querySelector("[data-planr-share-error]");error&&(error.hidden=!state.error,error.textContent=state.error)}async function open(){clearPendingOwnerSigner(),resetCopyButtons(),state.open||(returnFocus=document2.activeElement instanceof window.HTMLElement?document2.activeElement:trigger),state=reduceArtifactShareDialog(state,{type:"open"}),state=reduceArtifactShareDialog(state,{type:"preview-start"}),selectSupportedTransport(),state=reduceArtifactShareDialog(state,{type:"preview-start"}),render(),dialog.querySelector("[data-planr-share-close]")?.focus();let request=++generation;try{if(!capabilities.length)throw new ArtifactShareUiError("E_ARTIFACT_SHARE_HANDLER_REQUIRED",unavailable);let preview=await handlers.prepareShare(Object.freeze({review:reviewForShare(stageController),fragmentLimit:ARTIFACT_SHARE_FRAGMENT_LIMIT}));if(request!==generation||!state.open)return state;if(state=reduceArtifactShareDialog(state,{type:"preview-ready",preview}),selectSupportedTransport(),!supports(state.transport))throw new ArtifactShareUiError("E_ARTIFACT_SHARE_TRANSPORT_UNAVAILABLE","This review is too large for the sharing options supported by this viewer. Open it with an updated OpenPlanr installation or export the review.");render(),announce2(capabilities.includes("fragment")&&state.preview.fragmentEligible?"Private fragment is available. Nothing will be uploaded.":"Review prepared. Choose an available sharing option.")}catch(error){if(request!==generation||!state.open)return state;state=reduceArtifactShareDialog(state,{type:"failure",error:error?.message}),render(),announce2(state.error)}return state}function close(){return state.phase==="creating"||state.phase==="ambiguous"?(announce2(state.phase==="ambiguous"?"Room creation may have completed. Retry the exact attempt until its receipt is shown.":"Room creation is in progress. Keep this dialog open until its receipt is shown."),state):(generation+=1,clearPendingOwnerSigner(),state=reduceArtifactShareDialog(state,{type:"close"}),resetCopyButtons(),render(),returnFocus?.focus?.(),returnFocus=null,state)}async function confirm(){if(!state.open||!supports(state.transport))return state;if(!state.preview&&state.phase==="error")return open();if(!state.preview||["custody-preparing","creating","created"].includes(state.phase))return state;let transport=state.transport,request=generation;if(transport==="live"&&!state.ownerCustodyEstablished){state=reduceArtifactShareDialog(state,{type:"custody-start"}),render();try{let custody=await establishArtifactOwnerCustody({prepareOwnerCustody:()=>handlers.prepareOwnerCustody(Object.freeze({review:reviewForShare(stageController),ttl:state.ttl})),saveOwnerCustody:handlers.saveOwnerCustody});if(request!==generation||!state.open)return state;pendingOwnerCustody=custody,state=reduceArtifactShareDialog(state,{type:"custody-ready"}),render(),announce2("Private recovery-bundle download started. Verify the file is saved, then confirm room creation.")}catch(error){if(request!==generation||!state.open)return state;clearPendingOwnerSigner(),state=reduceArtifactShareDialog(state,{type:"failure",ownerCustodyEstablished:!1,error:error?.message}),render(),announce2(state.error)}return state}if(transport==="live"&&!pendingOwnerCustody)return state=reduceArtifactShareDialog(state,{type:"failure",ownerCustodyEstablished:!1,error:"The prepared recovery attempt is no longer available. Download a new bundle before creating a room."}),render(),announce2(state.error),state;state=reduceArtifactShareDialog(state,{type:"create-start"}),render();try{let input={review:reviewForShare(stageController),preview:state.preview,transport,ttl:["live","short"].includes(transport)?state.ttl:void 0,confirmed:["live","short"].includes(transport)};transport==="live"&&(pendingOwnerCustody?.kind==="openplanr-live-room-preparation"?Object.defineProperty(input,"prepared",{enumerable:!1,value:pendingOwnerCustody}):Object.defineProperty(input,"ownerSigner",{enumerable:!1,value:pendingOwnerCustody}));let result=await handlers.createShare(Object.freeze(input));if(request!==generation||!state.open)return state;if(transport==="live"&&result?.ownerSigner!==pendingOwnerSigner())throw new ArtifactShareUiError("E_ARTIFACT_SHARE_OWNER_CUSTODY_MISMATCH","The created room did not bind the prepared owner key. Retry the exact prepared attempt.",{effect:"ambiguous"});state=reduceArtifactShareDialog(state,{type:"create-success",result:{...result,transport}}),clearPendingOwnerSigner(),render(),announce2(transport==="live"?"Live room created. Keep the downloaded owner key with the separate owner-verdict URL; management cannot set a verdict.":transport==="short"?"Encrypted short link copied. Store the one-time deletion token now.":"Private fragment copied. Nothing was uploaded.");try{await handlers.copyText(state.result.url),announce2(transport==="live"?"Live review URL copied. Keep the downloaded owner key with the separate owner-verdict URL.":transport==="short"?"Encrypted short link copied. Store the one-time deletion token now.":"Private fragment copied. Nothing was uploaded.")}catch{announce2(transport==="live"?"Live room created. Copy the review and owner-verdict URLs manually; the room receipt remains visible.":"Share created. Copy the URL manually; the receipt remains visible.")}}catch(error){if(request!==generation||!state.open)return state;let ambiguous=transport==="live"&&error?.details?.effect==="ambiguous";transport==="live"&&!ambiguous&&clearPendingOwnerSigner(),state=reduceArtifactShareDialog(state,{type:"failure",ambiguous,ownerCustodyEstablished:transport==="live"&&!!pendingOwnerCustody,error:error?.message}),render(),announce2(state.error)}return state}async function copy(value,successMessage,button){if(value)try{await handlers.copyText(value),showCopyState(button,"copied"),announce2(successMessage)}catch(error){showCopyState(button,"error"),announce2(error?.message??"The value could not be copied. The share receipt remains visible.")}}if(existingRoom)if(stableShareUrl()){let label=trigger.querySelector(".planr-action-label");label?label.textContent="Copy link":trigger.textContent="Copy link",trigger.dataset.planrCopyLabel="Copy link",trigger.dataset.planrTooltip="Copy link",trigger.removeAttribute("aria-haspopup"),trigger.setAttribute("aria-label","Copy this live review room link"),listen(trigger,"click",()=>{copyExistingRoom()})}else trigger.hidden=!0;else listen(trigger,"click",open);listen(backdrop,"click",event=>{let button=event.target.closest?.("button");if(button){if(button.dataset.planrShareClose!==void 0||button.dataset.planrShareCancel!==void 0){close();return}if(button.dataset.planrShareTransport){if(!supports(button.dataset.planrShareTransport)||["custody-ready","creating","ambiguous","created"].includes(state.phase))return;button.dataset.planrShareTransport!==state.transport&&clearPendingOwnerSigner(),state=reduceArtifactShareDialog(state,{type:"select-transport",transport:button.dataset.planrShareTransport}),render(),announce2(state.transport==="live"?"Live encrypted review selected. Anyone with this link can comment.":state.transport==="short"?"Encrypted short link selected. Creation requires confirmation.":"Private fragment selected. Nothing will be uploaded.");return}if(button.dataset.planrShareConfirm!==void 0){confirm();return}if(button.dataset.planrShareCopyUrl!==void 0){copy(state.result?.url,"Review URL copied.",button);return}if(button.dataset.planrShareCopyOwner!==void 0){copy(state.result?.ownerUrl,"Private owner-verdict URL copied. It requires the matching downloaded owner key.",button);return}if(button.dataset.planrShareCopyManage!==void 0){copy(state.result?.manageUrl,"Private management URL copied. It can pause, reopen, or delete the room, but cannot set a verdict.",button);return}button.dataset.planrShareCopyDeletion!==void 0&&copy(state.result?.deletionToken,"One-time deletion token copied.",button)}});let ttlSelect=dialog.querySelector("[data-planr-share-ttl]");ttlSelect&&listen(ttlSelect,"change",()=>{if(["custody-ready","creating","ambiguous","created"].includes(state.phase)){ttlSelect.value=state.ttl;return}state=reduceArtifactShareDialog(state,{type:"set-ttl",ttl:ttlSelect.value}),render(),announce2(`Expiry set to ${ARTIFACT_SHARE_TTLS2[state.ttl].label}.`)}),listen(document2,"keydown",event=>{if(!state.open)return;if(event.key==="Escape"){event.preventDefault(),close();return}if(event.key!=="Tab")return;let focusable=focusableElements(dialog);if(focusable.length===0)return;let first=focusable[0],last=focusable.at(-1);event.shiftKey&&document2.activeElement===first?(event.preventDefault(),last.focus()):!event.shiftKey&&document2.activeElement===last&&(event.preventDefault(),first.focus())},!0),render();let controller=Object.freeze({getState:()=>state,open,close,confirm,dispatch(action){return action.type==="select-transport"&&!supports(action.transport)||(state=reduceArtifactShareDialog(state,action),render()),state},destroy(){if(state.phase==="creating"||state.phase==="ambiguous")return announce2(state.phase==="ambiguous"?"Room creation may have completed. Retry the exact attempt until its receipt is shown.":"Room creation is in progress. Keep this review open until its receipt is shown."),!1;generation+=1,clearPendingOwnerSigner();for(let timer of copyResetTimers.values())window.clearTimeout(timer);copyResetTimers.clear();for(let remove of cleanup.splice(0))remove();return state.open&&(state=reduceArtifactShareDialog(state,{type:"close"}),render()),!0}});return window.__openPlanrArtifactShare=controller,controller}var HOSTED_ARTIFACT_VIEWER_STATES=Object.freeze(["idle","empty-hash","loading","ready","invalid-version","malformed-payload","too-large","paste-missing","expired","decryption-failed","unsupported-browser","network-error","room-closed"]),HOSTED_ARTIFACT_STATE_COPY=Object.freeze({"empty-hash":Object.freeze({title:"Open a private review link",detail:"This page needs a complete OpenPlanr fragment or encrypted short-link URL.",action:""}),loading:Object.freeze({title:"Loading private review",detail:"Validating the immutable payload before opening the artifact.",action:""}),"invalid-version":Object.freeze({title:"This review version is not supported",detail:"Ask the sender to create a new link with a compatible OpenPlanr release.",action:""}),"malformed-payload":Object.freeze({title:"This review link is incomplete",detail:"Copy the complete URL again, including everything after the # character.",action:""}),"too-large":Object.freeze({title:"This private fragment is too large",detail:"Ask the sender to create an encrypted expiring short link instead.",action:""}),"paste-missing":Object.freeze({title:"This encrypted review is unavailable",detail:"It may have been deleted. Ask the sender for a new immutable review link.",action:""}),expired:Object.freeze({title:"This encrypted review expired",detail:"Ask the sender for a new immutable review link.",action:""}),"decryption-failed":Object.freeze({title:"This key cannot decrypt the review",detail:"Use the complete link, including its private fragment key. The payload may also have been changed.",action:""}),"unsupported-browser":Object.freeze({title:"Browser support is required",detail:"Use a current browser with raw DEFLATE and Web Crypto support.",action:""}),"network-error":Object.freeze({title:"The encrypted review could not be loaded",detail:"Your link remains unchanged. Check the connection and try again safely.",action:"Try again"}),"room-closed":Object.freeze({title:"Comments are paused",detail:"This review remains available to read, but the owner has paused new feedback.",action:""})}),HostedArtifactViewerError=class extends Error{constructor(code,message,details={}){super(message),this.name="HostedArtifactViewerError",this.code=code,this.details=Object.freeze({...details})}};function freezeState2(value){let status=HOSTED_ARTIFACT_VIEWER_STATES.includes(value.status)?value.status:"idle";return Object.freeze({status,transport:["fragment","short","room"].includes(value.transport)?value.transport:null,request:value.request?Object.freeze({...value.request}):null,envelope:value.envelope??null,retryable:status==="network-error"})}function locationParts(location){if(typeof location=="string"){let parsed=new URL(location,"https://share.openplanr.dev/");return{pathname:parsed.pathname,hash:parsed.hash}}return{pathname:typeof location?.pathname=="string"?location.pathname:"/",hash:typeof location?.hash=="string"?location.hash:""}}function malformed(status,details={}){return Object.freeze({ok:!1,status,details:Object.freeze(details)})}function parseHostedArtifactLocation(location,{fragmentLimit=ARTIFACT_SHARE_FRAGMENT_LIMIT}={}){let{pathname,hash}=locationParts(location),shortMatch=pathname.match(/^\/p\/([A-Za-z0-9_-]{1,128})\/?$/);if(shortMatch){if(!hash.startsWith("#k="))return malformed("malformed-payload",{transport:"short"});let key=hash.slice(3);return/^[A-Za-z0-9_-]{43}$/.test(key)?Object.freeze({ok:!0,transport:"short",id:shortMatch[1],key}):malformed("malformed-payload",{transport:"short"})}let roomMatch=pathname.match(/^\/r\/([A-Za-z0-9_-]{16,128})\/?$/);if(roomMatch){let params=new URLSearchParams(hash.slice(1)),key=params.get("k"),readCapability=params.get("r"),write=params.get("w"),owner=params.get("o"),manage=params.get("m"),authority=[write,owner,manage].filter(Boolean);return!key||!/^[A-Za-z0-9_-]{43}$/.test(key)||authority.length>1||readCapability!==null&&(!/^[A-Za-z0-9_-]{43}$/.test(readCapability)||params.size!==2+authority.length||[...params.keys()].some(name=>!["k","r","w","o","m"].includes(name))||new Set(params.keys()).size!==params.size)||write&&!/^[A-Za-z0-9_-]{43}$/.test(write)||owner&&!/^[A-Za-z0-9_-]{43}$/.test(owner)||manage&&!/^[A-Za-z0-9_-]{43}$/.test(manage)?malformed("malformed-payload",{transport:"room"}):Object.freeze({ok:!0,transport:"room",id:roomMatch[1],key,...readCapability?{readCapability}:{},...write?{write}:{},...owner?{owner}:{},...manage?{manage}:{}})}if(!hash||hash==="#")return malformed("empty-hash");let fragment=hash.slice(1);if(fragment.length>fragmentLimit)return malformed("too-large",{fragmentLength:fragment.length,fragmentLimit});if(!fragment.startsWith("v1."))return malformed(/^v\d+\./.test(fragment)?"invalid-version":"malformed-payload");let payload=fragment.slice(3);return!payload||!/^[A-Za-z0-9_-]+$/.test(payload)?malformed("malformed-payload"):Object.freeze({ok:!0,transport:"fragment",version:"v1",payload})}function hostedArtifactStateForError(error){let code=typeof error?.code=="string"?error.code:"";return["E_ARTIFACT_BROWSER_UNSUPPORTED","E_ARTIFACT_CODEC_UNSUPPORTED"].includes(code)?"unsupported-browser":["E_ARTIFACT_FRAGMENT_TOO_LARGE","E_ARTIFACT_PAYLOAD_TOO_LARGE","E_ARTIFACT_DECOMPRESSION_LIMIT"].includes(code)?"too-large":["E_ARTIFACT_PASTE_NOT_FOUND","E_ARTIFACT_SHARE_NOT_FOUND","E_ARTIFACT_PASTE_UNAVAILABLE"].includes(code)?"paste-missing":["E_ARTIFACT_PASTE_EXPIRED","E_ARTIFACT_SHARE_EXPIRED"].includes(code)?"expired":["E_ARTIFACT_DECRYPTION_FAILED","E_ARTIFACT_AUTH_FAILED","E_ARTIFACT_PAYLOAD_TAMPERED","OperationError"].includes(code)?"decryption-failed":["E_ARTIFACT_SHARE_NETWORK","E_ARTIFACT_NETWORK","E_ARTIFACT_FETCH_FAILED"].includes(code)||error?.name==="TypeError"?"network-error":["E_ARTIFACT_VERSION_UNSUPPORTED","E_ARTIFACT_FRAGMENT_VERSION","E_ARTIFACT_FRAGMENT_VERSION_UNSUPPORTED"].includes(code)?"invalid-version":"malformed-payload"}function setCopy(document2,status){let copy=HOSTED_ARTIFACT_STATE_COPY[status]??{title:"",detail:"",action:""},title2=document2.querySelector("[data-planr-hosted-title]"),detail=document2.querySelector("[data-planr-hosted-detail]"),action=document2.querySelector("[data-planr-hosted-retry]");title2&&(title2.textContent=copy.title),detail&&(detail.textContent=copy.detail),action&&(action.textContent=copy.action,action.hidden=!copy.action)}function mountHostedArtifactViewer({document:document2=globalThis.document,window=document2?.defaultView,enabled=!1,location=window?.location,decodeFragment,loadShort,loadRoom,onEnvelope,supportsTransport=()=>!0,fragmentLimit=ARTIFACT_SHARE_FRAGMENT_LIMIT}={}){if(!enabled||!document2||!window)return null;let slot=document2.querySelector("[data-planr-hosted-viewer]");if(!slot)return null;let state=freezeState2({status:"idle"}),generation=0,cleanup=[];function render(){let visible=!["idle","ready"].includes(state.status);slot.hidden=!visible,slot.dataset.planrHostedState=state.status,slot.setAttribute("aria-busy",String(state.status==="loading")),setCopy(document2,state.status)}function setState(next){return state=freezeState2(next),render(),state}async function load(){let parsed=parseHostedArtifactLocation(location,{fragmentLimit});if(!parsed.ok)return setState({status:parsed.status});let request=parsed.transport==="fragment"?{transport:"fragment",version:parsed.version,payload:parsed.payload}:{transport:parsed.transport,id:parsed.id,key:parsed.key,...parsed.readCapability?{readCapability:parsed.readCapability}:{},...parsed.write?{write:parsed.write}:{},...parsed.owner?{owner:parsed.owner}:{},...parsed.manage?{manage:parsed.manage}:{}};if(!supportsTransport(parsed.transport))return setState({status:"unsupported-browser",transport:parsed.transport,request});let sequence=++generation;setState({status:"loading",transport:parsed.transport,request});try{let envelope2=parsed.transport==="fragment"?await(typeof decodeFragment=="function"?decodeFragment(Object.freeze({version:parsed.version,payload:parsed.payload})):Promise.reject(new HostedArtifactViewerError("E_ARTIFACT_CODEC_UNSUPPORTED","No private-fragment decoder is installed."))):parsed.transport==="short"?await(typeof loadShort=="function"?loadShort(Object.freeze({id:parsed.id,key:parsed.key})):Promise.reject(new HostedArtifactViewerError("E_ARTIFACT_BROWSER_UNSUPPORTED","No encrypted short-link loader is installed."))):await(typeof loadRoom=="function"?loadRoom(Object.freeze({id:parsed.id,key:parsed.key,...parsed.readCapability?{readCapability:parsed.readCapability}:{},...parsed.write?{write:parsed.write}:{},...parsed.owner?{owner:parsed.owner}:{},...parsed.manage?{manage:parsed.manage}:{}})):Promise.reject(new HostedArtifactViewerError("E_ARTIFACT_BROWSER_UNSUPPORTED","No live review room loader is installed.")));if(sequence!==generation)return state;setState({status:"ready",transport:parsed.transport,request,envelope:envelope2}),typeof onEnvelope=="function"&&await onEnvelope(envelope2,Object.freeze({transport:parsed.transport}))}catch(error){if(sequence!==generation)return state;setState({status:hostedArtifactStateForError(error),transport:parsed.transport,request})}return state}function onClick(event){!event.target.closest?.("[data-planr-hosted-retry]")||!state.retryable||load()}slot.addEventListener("click",onClick),cleanup.push(()=>slot.removeEventListener("click",onClick)),render();let ready=load(),controller=Object.freeze({getState:()=>state,ready,retry(){return state.retryable?load():Promise.resolve(state)},load,destroy(){generation+=1;for(let remove of cleanup.splice(0))remove()}});return window.__openPlanrHostedArtifactViewer=controller,controller}var ARTIFACT_STAGE_MOUNT_EVENT="planr:artifact-stage-mount";function publishArtifactStage(window,stage){window.__openPlanrArtifactStage=stage,window.dispatchEvent(new window.CustomEvent(ARTIFACT_STAGE_MOUNT_EVENT,{detail:stage}))}var PRESENTATIONS=Object.freeze(["document","canvas"]);function positiveInteger(value,fallback){return Number.isInteger(value)&&value>0?value:fallback}function freezeArtifactMetadata(artifact,index2){if(!artifact||typeof artifact!="object")throw new TypeError(`Artifact ${index2+1} must be an object.`);if(typeof artifact.id!="string"||artifact.id.length===0)throw new TypeError(`Artifact ${index2+1} requires an id.`);return Object.freeze({id:artifact.id,title:typeof artifact.title=="string"&&artifact.title.length>0?artifact.title:`Artifact ${index2+1}`,sha256:typeof artifact.sha256=="string"?artifact.sha256:"",viewport:Object.freeze({width:positiveInteger(artifact.viewport?.width,1440),height:positiveInteger(artifact.viewport?.height,900)}),colorScheme:["light","dark"].includes(artifact.colorScheme)?artifact.colorScheme:"light"})}function requestedArtifactId(value){return typeof value=="string"?value:typeof value?.id=="string"?value.id:""}function availableId(artifacts,requested,fallback=""){return artifacts.some(({id:id7})=>id7===requested)?requested:fallback}function normalizeViewMode(value,artifactCount){return artifactCount<2?"single":["single","variants","split"].includes(value)?value:"variants"}function createArtifactStagePayload(envelope2={},{viewer}={}){let artifacts=Object.freeze((Array.isArray(envelope2?.artifacts)?envelope2.artifacts:[]).map(freezeArtifactMetadata)),sourceViewer=viewer&&typeof viewer=="object"?viewer:envelope2?.viewer&&typeof envelope2.viewer=="object"?envelope2.viewer:{},firstId=artifacts[0]?.id??"",activeArtifactId=availableId(artifacts,requestedArtifactId(sourceViewer.activeArtifactId),firstId),mode=normalizeViewMode(sourceViewer.mode,artifacts.length);return Object.freeze({schemaVersion:"1.0.0",artifacts,viewer:Object.freeze({mode,activeArtifactId,...PRESENTATIONS.includes(sourceViewer.presentation)?{presentation:sourceViewer.presentation}:{}})})}var ARTIFACT_STAGE_EVENTS=Object.freeze({change:"planr:stage-change",point:"planr:artifact-point",region:"planr:artifact-region",layout:"planr:artifact-layout",frameState:"planr:artifact-frame-state"}),ARTIFACT_STAGE_LIMITS=Object.freeze({defaultZoom:72,minZoom:25,maxZoom:200,zoomStep:10,maxDocumentWidth:16384,maxDocumentHeight:262144,defaultFrameBudget:3,frameLoadTimeoutMs:15e3}),VIEW_MODES=Object.freeze(["single","variants","split"]),REVIEW_MODES=Object.freeze(["interact","comment"]),THEMES=Object.freeze(["auto","light","dark"]),PRESENTATIONS2=Object.freeze(["document","canvas"]),STATUSES=Object.freeze(["ready","empty","bundling","loading","invalid","expired","decryption-failed","unsupported-browser"]),STATUS_COPY=Object.freeze({empty:Object.freeze({title:"No artifact content",detail:"Choose a bundled HTML artifact to begin this review."}),bundling:Object.freeze({title:"Bundling artifact",detail:"Packaging local scripts, styles, fonts, and images without network access."}),loading:Object.freeze({title:"Loading private review",detail:"Validating the envelope and frozen artifact viewport."}),invalid:Object.freeze({title:"This review is invalid",detail:"The artifact envelope could not be decoded or validated."}),expired:Object.freeze({title:"This encrypted review expired",detail:"Ask the sender for a new immutable review link."}),"decryption-failed":Object.freeze({title:"This key cannot decrypt the review",detail:"Use the complete link, including its private fragment key."}),"unsupported-browser":Object.freeze({title:"Browser support is required",detail:"Use a current browser with Blob URL support to review this artifact."})});function member2(value,allowed,fallback){return allowed.includes(value)?value:fallback}function finite2(value,fallback=0){return typeof value=="number"&&Number.isFinite(value)?value:fallback}function clamp2(value,min,max){return Math.min(max,Math.max(min,value))}function normalized2(value){return Math.round(clamp2(finite2(value),0,1)*1e6)/1e6}function artifactMetadata(artifact){return Object.freeze({id:artifact.id,title:artifact.title,sha256:artifact.sha256,viewport:artifact.viewport,colorScheme:artifact.colorScheme})}function requestedArtifactId2(value){return typeof value=="string"?value:typeof value?.id=="string"?value.id:""}function availableId2(artifacts,requested,fallback=""){return artifacts.some(({id:id7})=>id7===requested)?requested:fallback}function comparisonIdFor(artifacts,activeArtifactId,requested=""){return requested!==activeArtifactId&&artifacts.some(({id:id7})=>id7===requested)?requested:artifacts.find(({id:id7})=>id7!==activeArtifactId)?.id??""}function normalizeViewMode2(value,artifactCount){return artifactCount<2?"single":member2(value,VIEW_MODES,"variants")}function createArtifactStageState(payload={},shellModel={}){let artifacts=Object.freeze((Array.isArray(payload?.artifacts)?payload.artifacts:[]).map(artifactMetadata)),firstId=artifacts[0]?.id??"",activeArtifactId=availableId2(artifacts,requestedArtifactId2(shellModel.activeArtifact??shellModel.activeArtifactId)||requestedArtifactId2(payload?.viewer?.activeArtifactId),firstId),comparisonArtifactId=comparisonIdFor(artifacts,activeArtifactId,requestedArtifactId2(shellModel.comparisonArtifact??shellModel.comparisonArtifactId)),statusFallback=artifacts.length===0?"empty":"ready",status=member2(shellModel.status,STATUSES,statusFallback);artifacts.length===0&&status==="ready"&&(status="empty");let viewMode=normalizeViewMode2(shellModel.viewMode??payload?.viewer?.mode,artifacts.length),presentation=resolveArtifactPresentation(shellModel.presentation??payload?.viewer?.presentation,{viewMode,artifactCount:artifacts.length});return Object.freeze({schemaVersion:"1.0.0",artifacts,activeArtifactId,comparisonArtifactId,viewMode,presentation,reviewMode:member2(shellModel.reviewMode,REVIEW_MODES,"interact"),zoom:clamp2(Number.isInteger(shellModel.zoom)?shellModel.zoom:ARTIFACT_STAGE_LIMITS.defaultZoom,ARTIFACT_STAGE_LIMITS.minZoom,ARTIFACT_STAGE_LIMITS.maxZoom),railOpen:shellModel.railOpen===void 0?presentation==="canvas":!!shellModel.railOpen,theme:member2(shellModel.theme,THEMES,"auto"),status})}function nextState(state,changes){return Object.freeze({...state,...changes})}function reduceArtifactStageState(state,action={}){switch(action.type){case"set-active":{let id7=availableId2(state.artifacts,action.artifactId);if(!id7||id7===state.activeArtifactId)return state;let comparisonArtifactId=id7===state.comparisonArtifactId?state.activeArtifactId:comparisonIdFor(state.artifacts,id7,state.comparisonArtifactId);return nextState(state,{activeArtifactId:id7,comparisonArtifactId})}case"set-comparison":{let id7=comparisonIdFor(state.artifacts,state.activeArtifactId,action.artifactId);return id7===state.comparisonArtifactId?state:nextState(state,{comparisonArtifactId:id7})}case"set-view-mode":{let viewMode=normalizeViewMode2(action.viewMode,state.artifacts.length);return viewMode===state.viewMode?state:nextState(state,{viewMode})}case"set-review-mode":{let reviewMode=member2(action.reviewMode,REVIEW_MODES,state.reviewMode);return reviewMode===state.reviewMode?state:nextState(state,{reviewMode})}case"set-zoom":{let zoom=clamp2(Math.round(finite2(action.zoom,state.zoom)),ARTIFACT_STAGE_LIMITS.minZoom,ARTIFACT_STAGE_LIMITS.maxZoom);return zoom===state.zoom?state:nextState(state,{zoom})}case"zoom-by":return reduceArtifactStageState(state,{type:"set-zoom",zoom:state.zoom+finite2(action.delta)});case"set-rail-open":{let railOpen=!!action.railOpen;return railOpen===state.railOpen?state:nextState(state,{railOpen})}case"toggle-rail":return nextState(state,{railOpen:!state.railOpen});case"set-theme":{let theme=member2(action.theme,THEMES,state.theme);return theme===state.theme?state:nextState(state,{theme})}case"cycle-theme":{let index2=THEMES.indexOf(state.theme);return nextState(state,{theme:THEMES[(index2+1)%THEMES.length]})}case"set-status":{let status=member2(action.status,STATUSES,state.status);return status===state.status?state:nextState(state,{status})}default:return state}}function visibleArtifactIds(state){return state.activeArtifactId?state.viewMode==="split"&&state.comparisonArtifactId?Object.freeze([state.activeArtifactId,state.comparisonArtifactId]):Object.freeze([state.activeArtifactId]):Object.freeze([])}function assertRect2(rect){if(!rect||!Number.isFinite(rect.left)||!Number.isFinite(rect.top)||!Number.isFinite(rect.width)||!Number.isFinite(rect.height)||rect.width<=0||rect.height<=0)throw new RangeError("Artifact bounds must have positive finite dimensions.")}function clientPointToNormalized(rect,point2){return assertRect2(rect),Object.freeze({x:normalized2((finite2(point2?.x??point2?.clientX)-rect.left)/rect.width),y:normalized2((finite2(point2?.y??point2?.clientY)-rect.top)/rect.height)})}function normalizedPointToClient(rect,point2){return assertRect2(rect),Object.freeze({x:rect.left+normalized2(point2?.x)*rect.width,y:rect.top+normalized2(point2?.y)*rect.height})}function parseDataScript(document2,id7){let node2=document2.getElementById(id7);if(!node2)throw new Error(`Missing artifact shell data: ${id7}`);return JSON.parse(node2.textContent??"null")}function isEditableTarget(target){let HTMLElement=target?.ownerDocument?.defaultView?.HTMLElement;return!!(HTMLElement&&target instanceof HTMLElement&&(target.isContentEditable||["INPUT","TEXTAREA","SELECT"].includes(target.tagName)))}function stageArtifactById(state,id7){return state.artifacts.find(artifact=>artifact.id===id7)??null}function updateStatus(document2,state){let statusPanel=document2.querySelector(".planr-stage-status"),surface=document2.querySelector(".planr-stage-surface");if(!statusPanel||!surface)return;let ready=state.status==="ready";statusPanel.hidden=ready,surface.toggleAttribute("inert",!ready),surface.setAttribute("aria-hidden",String(!ready)),ready&&surface.removeAttribute("aria-hidden");let copy=STATUS_COPY[state.status];if(copy){let title2=statusPanel.querySelector("strong"),detail=statusPanel.querySelector("p");title2&&(title2.textContent=copy.title),detail&&(detail.textContent=copy.detail)}}function emit(root,window,type,detail){root.dispatchEvent(new window.CustomEvent(type,{detail,bubbles:!0}))}async function htmlForSource(window,source){return typeof source=="string"&&source.trimStart().startsWith("<")?source:source&&typeof source=="object"&&typeof source.html=="string"?source.html:source instanceof window.Blob?source.text():source instanceof window.ArrayBuffer?new window.TextDecoder().decode(source):window.ArrayBuffer.isView(source)?new window.TextDecoder().decode(new window.Uint8Array(source.buffer,source.byteOffset,source.byteLength)):null}function mountArtifactStage({document:document2=globalThis.document,window=document2?.defaultView,resolveArtifactSource,sourceTransport="blob",frameBudget:requestedFrameBudget,frameLoadTimeoutMs=ARTIFACT_STAGE_LIMITS.frameLoadTimeoutMs,bridgeClient,onState,review:reviewOptions={},share:shareOptions={},hosted:hostedOptions={}}={}){if(!document2||!window)return null;let root=document2.querySelector(".planr-shell");if(!root)return null;let initializationError=globalThis.__OPENPLANR_ARTIFACT_STAGE_INITIALIZATION_ERROR__;if(initializationError){let status=root.querySelector('[data-planr-slot="status"]');return status&&(status.textContent=initializationError,status.setAttribute("data-error",""),status.setAttribute("role","alert")),root.setAttribute("data-planr-initialization-error",""),null}if(!["blob","srcdoc"].includes(sourceTransport))throw new TypeError("Artifact source transport must be blob or srcdoc.");let payload,shellModel,reviewConfig;try{payload=parseDataScript(document2,"planr-artifact-stage-payload"),shellModel=parseDataScript(document2,"planr-artifact-shell-model"),reviewConfig=parseDataScript(document2,"planr-artifact-review-state")}catch{payload={artifacts:[],viewer:{mode:"single",activeArtifactId:""}},shellModel={status:"invalid"},reviewConfig={reviewOf:"0".repeat(64),review:null}}let state;try{state=createArtifactStageState(payload,shellModel)}catch{state=createArtifactStageState({},{status:"invalid"})}let frames=new Map([...document2.querySelectorAll("[data-planr-artifact-frame]")].map(frame=>[frame.dataset.planrArtifactFrame,frame])),panels=new Map([...document2.querySelectorAll(".planr-artifact-panel[data-artifact-id]")].map(panel=>[panel.dataset.artifactId,panel])),documentLayouts=new Map,cleanup=[],frameBudget=requestedFrameBudget===void 0?Number(root.dataset.planrFrameBudget||ARTIFACT_STAGE_LIMITS.defaultFrameBudget):requestedFrameBudget;if(frameBudget!==null&&(!Number.isInteger(frameBudget)||frameBudget<1||frameBudget>8))throw new RangeError("Artifact frame budget must be between 1 and 8, or null for eager loading.");if(!Number.isInteger(frameLoadTimeoutMs)||frameLoadTimeoutMs<1||frameLoadTimeoutMs>12e4)throw new RangeError("Artifact frame load timeout must be between 1 and 120000 milliseconds.");let frameDiagnostics=new Map,frameLoads=new Map,frameSlots=new Map;if(frameBudget!==null)for(let[id7,frame]of frames){let host=frame.parentNode;if(!host||!root.contains(host)||frame.hasAttribute("src")||frame.hasAttribute("srcdoc"))continue;let placeholder=document2.createComment("Artifact preview");frameSlots.set(id7,{host,placeholder}),host.replaceChild(placeholder,frame)}let frameUse=0,frameQueue=Promise.resolve(),activationGeneration=0,disposed=!1;for(let frame of frames.values())frame.dataset.planrFrameState="unloaded";function listen(target,type,handler,options){target.addEventListener(type,handler,options),cleanup.push(()=>target.removeEventListener(type,handler,options))}function render({announce:announce2=!1}={}){let visible=new Set(visibleArtifactIds(state));root.dataset.planrView=state.viewMode,root.dataset.planrReviewMode=state.reviewMode,root.dataset.planrState=state.status,root.dataset.planrRailOpen=String(state.railOpen),root.dataset.planrPresentation=state.presentation,document2.documentElement.dataset.planrPresentation=state.presentation,document2.documentElement.dataset.planrTheme=state.theme;let grid=document2.querySelector(".planr-frame-grid"),surface=document2.querySelector(".planr-stage-surface"),tablist=document2.querySelector(".planr-variants"),rail=document2.getElementById("planr-review-rail"),feedbackButton=document2.querySelector('[data-planr-action="feedback"]'),addCommentButton=document2.querySelector('[data-planr-action="add-comment"]'),themeButton=document2.querySelector('[data-planr-action="theme"]'),statusSlot=document2.querySelector('[data-planr-slot="status"]'),metadata=document2.querySelector(".planr-toolbar:not([data-studio-react-chrome]) .planr-title-block > span"),breadcrumb=document2.querySelector(".planr-stage-heading > span:first-child"),activeArtifact=stageArtifactById(state,state.activeArtifactId);grid&&(grid.dataset.planrLayout=state.viewMode);let visualOrder=state.viewMode==="split"?[...visible,...state.artifacts.map(({id:id7})=>id7).filter(id7=>!visible.has(id7))]:state.artifacts.map(({id:id7})=>id7);if(surface&&surface.style.setProperty("--planr-shell-zoom",String(state.zoom/100)),tablist&&(tablist.hidden=state.viewMode==="single"||state.artifacts.length<2),rail&&(rail.toggleAttribute("inert",!state.railOpen),rail.setAttribute("aria-hidden",String(!state.railOpen)),state.railOpen&&rail.removeAttribute("aria-hidden")),feedbackButton&&feedbackButton.setAttribute("aria-expanded",String(state.railOpen)),addCommentButton){let paused=root.hasAttribute("data-planr-room-comments-paused");addCommentButton.disabled=paused,addCommentButton.setAttribute("aria-pressed",String(state.reviewMode==="comment")),addCommentButton.setAttribute("aria-label",paused?"Add comment unavailable: comments are paused":"Add comment"),addCommentButton.dataset.planrTooltip=paused?"Comments are paused":"Add comment (C)"}themeButton&&(themeButton.textContent=state.theme,themeButton.setAttribute("aria-label",`Shell theme ${state.theme}`)),statusSlot&&(statusSlot.textContent=state.reviewMode==="comment"?"Comment mode":"Interactions enabled"),metadata&&activeArtifact&&(metadata.textContent=`HTML · ${activeArtifact.viewport.width}×${activeArtifact.viewport.height}`),breadcrumb&&(breadcrumb.textContent=`ARTIFACT / ${(activeArtifact?.title??"Artifact").toUpperCase()}`);for(let button of document2.querySelectorAll("[data-planr-view]")){let mode=button.dataset.planrView;button.setAttribute("aria-pressed",String(mode===state.viewMode)),button.disabled=state.artifacts.length<2&&mode!=="single"}for(let button of document2.querySelectorAll("[data-planr-mode]"))button.setAttribute("aria-pressed",String(button.dataset.planrMode===state.reviewMode));for(let button of document2.querySelectorAll('[data-planr-action="zoom-reset"]'))button.textContent=`${state.zoom}%`;for(let tab of document2.querySelectorAll('[role="tab"][data-artifact-id]')){let selected=tab.dataset.artifactId===state.activeArtifactId;tab.setAttribute("aria-selected",String(selected)),tab.tabIndex=selected?0:-1}for(let[id7,panel]of panels){let isVisible=visible.has(id7),isPrimary=id7===state.activeArtifactId;panel.hidden=!isVisible,panel.style.order=String(visualOrder.indexOf(id7));let artifact=stageArtifactById(state,id7);panel.setAttribute("aria-label",`${isPrimary?"Primary":"Comparison"} artifact: ${artifact?.title??id7}`);let frame=frames.get(id7),frameReady=frame?.dataset.planrFrameState==="ready",annotationLayer=panel.querySelector("[data-planr-annotation-layer]");if(frame&&(frame.tabIndex=isVisible&&frameReady&&state.status==="ready"&&state.reviewMode==="interact"?0:-1,state.presentation==="document"?(frame.setAttribute("scrolling","no"),frame.style.overflow="hidden"):(frame.removeAttribute("scrolling"),frame.style.removeProperty("overflow"))),annotationLayer){let enabled=isVisible&&frameReady&&state.status==="ready"&&state.reviewMode==="comment",hasComposer=!!annotationLayer.querySelector("[data-planr-annotation-composer]");annotationLayer.tabIndex=enabled?0:-1,annotationLayer.setAttribute("aria-disabled",String(!enabled&&!hasComposer))}}if(updateStatus(document2,state),renderFrameLoadingStatus(),typeof onState=="function")try{onState(state)}catch{}announce2&&emit(root,window,ARTIFACT_STAGE_EVENTS.change,state)}function renderFrameLoadingStatus(){let activeDiagnostic=frameDiagnostics.get(state.activeArtifactId),statusPanel=document2.querySelector(".planr-stage-status");if(!statusPanel||!activeDiagnostic)return;let detail=statusPanel.querySelector("p");if(detail&&state.status==="loading"){let copy={source:"Preparing the selected screen.",document:"Loading the selected screen.",bridge:"Connecting the selected screen to the review."};detail.textContent=copy[activeDiagnostic.phase]??"Loading the selected screen."}detail&&state.status==="invalid"&&activeDiagnostic.status==="error"&&(detail.textContent=`The selected screen did not finish its ${activeDiagnostic.failedPhase??"preview"} step. Retry to load it again; saved feedback remains available.`);let retry=statusPanel.querySelector('[data-planr-action="retry-frame"]');retry||(retry=document2.createElement("button"),retry.className="planr-toolbar-action",retry.dataset.planrAction="retry-frame",retry.textContent="Retry screen",statusPanel.querySelector("div")?.append(retry)),retry.hidden=state.status!=="invalid"||activeDiagnostic.status!=="error"}function dispatch(action,{announce:announce2=!0}={}){let previous=state;return state=reduceArtifactStageState(state,action),state!==previous&&(render({announce:announce2}),["set-active","set-comparison","set-view-mode"].includes(action.type)&&typeof resolveArtifactSource=="function"&&(readyPromise=activateVisibleFrames())),state}function setActiveFromTab(tab,{focus=!1}={}){dispatch({type:"set-active",artifactId:tab.dataset.artifactId}),focus&&tab.focus()}function onClick(event){let target=event.target.closest?.("button");if(target){if(target.hasAttribute("data-planr-close-feedback")){dispatch({type:"set-rail-open",railOpen:!1}),document2.querySelector('[data-planr-action="feedback"]')?.focus();return}if(target.dataset.planrView){dispatch({type:"set-view-mode",viewMode:target.dataset.planrView});return}if(target.dataset.artifactId&&target.getAttribute("role")==="tab"){setActiveFromTab(target);return}if(target.dataset.planrMode){dispatch({type:"set-review-mode",reviewMode:target.dataset.planrMode});return}switch(target.dataset.planrAction){case"add-comment":root.hasAttribute("data-planr-room-comments-paused")||dispatch({type:"set-review-mode",reviewMode:"comment"});break;case"zoom-out":dispatch({type:"zoom-by",delta:-ARTIFACT_STAGE_LIMITS.zoomStep});break;case"zoom-reset":dispatch({type:"set-zoom",zoom:ARTIFACT_STAGE_LIMITS.defaultZoom});break;case"zoom-in":dispatch({type:"zoom-by",delta:ARTIFACT_STAGE_LIMITS.zoomStep});break;case"feedback":{let rail=document2.getElementById("planr-review-rail");state.railOpen&&rail?.contains(document2.activeElement)&&target.focus(),dispatch({type:"toggle-rail"});break}case"more":{let menu=target.closest(".planr-more")?.querySelector(".planr-more-menu");if(!menu)break;let open=menu.hidden;menu.hidden=!open,target.setAttribute("aria-expanded",String(open)),open&&menu.querySelector('[role="menuitem"]')?.focus();break}case"sharing-options":target.closest(".planr-more-menu").hidden=!0,document2.querySelector('[data-planr-action="more"]')?.setAttribute("aria-expanded","false"),shareController?.open?.();break;case"retry-frame":retryFrames([state.activeArtifactId]);break;case"theme":dispatch({type:"cycle-theme"});break;default:break}}}function onKeyDown(event){if(event.defaultPrevented)return;if(!event.altKey&&!event.ctrlKey&&!event.metaKey&&!isEditableTarget(event.target)){if(event.key.toLowerCase()==="i"){dispatch({type:"set-review-mode",reviewMode:"interact"});return}if(event.key.toLowerCase()==="c"){root.hasAttribute("data-planr-room-comments-paused")||(dispatch({type:"set-review-mode",reviewMode:"comment"}),document2.querySelector('[data-planr-action="add-comment"]')?.focus());return}if(event.key==="Escape"){let more=document2.querySelector(".planr-more-menu:not([hidden])");if(more){more.hidden=!0;let trigger=document2.querySelector('[data-planr-action="more"]');trigger?.setAttribute("aria-expanded","false"),trigger?.focus();return}if(state.presentation==="document"&&state.reviewMode==="comment"){dispatch({type:"set-review-mode",reviewMode:"interact"}),document2.querySelector('[data-planr-action="add-comment"]')?.focus();return}if(state.railOpen){dispatch({type:"set-rail-open",railOpen:!1}),document2.querySelector('[data-planr-action="feedback"]')?.focus();return}}}let tab=event.target.closest?.('[role="tab"][data-artifact-id]');if(!tab||!["ArrowLeft","ArrowRight","Home","End"].includes(event.key))return;let tabs=[...document2.querySelectorAll('[role="tab"][data-artifact-id]')],index2=tabs.indexOf(tab);if(index2<0)return;event.preventDefault();let nextIndex=event.key==="Home"?0:event.key==="End"?tabs.length-1:(index2+(event.key==="ArrowRight"?1:-1)+tabs.length)%tabs.length;setActiveFromTab(tabs[nextIndex],{focus:!0})}function emitSelection(layer,start,end=start){if(state.reviewMode!=="comment"||state.status!=="ready")return;let artifactId=layer.dataset.planrAnnotationLayer;if(!visibleArtifactIds(state).includes(artifactId))return;let artifact=stageArtifactById(state,artifactId);if(!artifact)return;let region=clientSelectionToNormalized(layer.getBoundingClientRect(),start,end),measured=state.presentation==="document"?documentLayouts.get(artifactId):null,detail=Object.freeze({schemaVersion:"1.0.0",artifactId,region,viewport:measured??artifact.viewport});emit(root,window,ARTIFACT_STAGE_EVENTS.region,detail),emit(root,window,ARTIFACT_STAGE_EVENTS.point,detail),state.presentation==="document"&&dispatch({type:"set-review-mode",reviewMode:"interact"})}for(let layer of document2.querySelectorAll("[data-planr-annotation-layer]")){let selection=null,selectionPreview=null;listen(layer,"pointerdown",event=>{event.button!==0||state.reviewMode!=="comment"||state.status!=="ready"||event.target===layer&&(event.preventDefault(),selection={pointerId:event.pointerId,start:{x:event.clientX,y:event.clientY}},layer.setPointerCapture?.(event.pointerId),selectionPreview=document2.createElement("span"),selectionPreview.className="planr-region-selection",selectionPreview.setAttribute("aria-hidden","true"),layer.append(selectionPreview))}),listen(layer,"pointermove",event=>{if(!selection||selection.pointerId!==event.pointerId||!selectionPreview)return;let region=clientSelectionToNormalized(layer.getBoundingClientRect(),selection.start,{x:event.clientX,y:event.clientY});selectionPreview.style.left=`${region.x*100}%`,selectionPreview.style.top=`${region.y*100}%`,selectionPreview.style.width=`${region.w*100}%`,selectionPreview.style.height=`${region.h*100}%`}),listen(layer,"pointercancel",event=>{!selection||selection.pointerId!==event.pointerId||(layer.releasePointerCapture?.(event.pointerId),selection=null,selectionPreview?.remove(),selectionPreview=null)}),listen(layer,"pointerup",event=>{if(!selection||selection.pointerId!==event.pointerId)return;let start=selection.start;layer.releasePointerCapture?.(event.pointerId),selection=null,selectionPreview?.remove(),selectionPreview=null,emitSelection(layer,start,{x:event.clientX,y:event.clientY})}),listen(layer,"keydown",event=>{if(!["Enter"," "].includes(event.key)||event.target!==layer)return;event.preventDefault();let bounds2=layer.getBoundingClientRect();emitSelection(layer,{x:bounds2.left+bounds2.width/2,y:bounds2.top+bounds2.height/2})})}for(let[artifactId,frame]of frames)listen(frame,ARTIFACT_STAGE_EVENTS.layout,event=>{if(state.presentation!=="document")return;let width=event.detail?.width,height=event.detail?.height;if(!Number.isInteger(width)||!Number.isInteger(height)||width<1||width>ARTIFACT_STAGE_LIMITS.maxDocumentWidth||height<1||height>ARTIFACT_STAGE_LIMITS.maxDocumentHeight)return;let layout=Object.freeze({width,height});documentLayouts.set(artifactId,layout);let panel=panels.get(artifactId);panel&&(panel.dataset.planrLayoutMeasured="true",panel.style.setProperty("--planr-document-width",`${width}px`),panel.style.setProperty("--planr-document-height",`${height}px`))});listen(root,"click",onClick),listen(document2,"keydown",onKeyDown),listen(document2,"click",event=>{let more=document2.querySelector(".planr-more-menu:not([hidden])");!more||event.target.closest?.(".planr-more")||(more.hidden=!0,document2.querySelector('[data-planr-action="more"]')?.setAttribute("aria-expanded","false"))});let roomStateObserver=typeof window.MutationObserver=="function"?new window.MutationObserver(()=>{root.hasAttribute("data-planr-room-comments-paused")&&state.reviewMode==="comment"?dispatch({type:"set-review-mode",reviewMode:"interact"}):render()}):null;roomStateObserver?.observe(root,{attributes:!0,attributeFilter:["data-planr-room-comments-paused"]}),roomStateObserver&&cleanup.push(()=>roomStateObserver.disconnect()),render();let readyPromise=Promise.resolve(state),feedbackController=null,annotationController=null,shareController=null,hostedController=null;function disposeStage(){if(disposed)return!0;disposed=!0;for(let id7 of[...frameLoads.keys()])releaseFrame(id7);for(let remove of cleanup.splice(0))remove();return!0}let controller=Object.freeze({frameBudget,ensureFrames,retryFrames,getFrameDiagnostics:()=>[...frameDiagnostics.values()],getLoadedArtifactIds:()=>[...frameLoads].filter(([,record2])=>record2.status==="ready").map(([id7])=>id7),getState:()=>state,getFrame:artifactId=>frames.get(artifactId)??null,getPanel:artifactId=>panels.get(artifactId)??null,get review(){return feedbackController},get annotations(){return annotationController},get share(){return shareController},get hosted(){return hostedController},get ready(){return readyPromise},dispatch,destroy(){return["creating","ambiguous"].includes(shareController?.getState?.().phase)?(shareController.destroy?.(),!1):disposeStage()}});publishArtifactStage(window,controller),listen(window,"pagehide",event=>{event.persisted||disposeStage()}),feedbackController=mountArtifactFeedbackRail({document:document2,window,root,stageController:controller,reviewOf:reviewConfig?.reviewOf,initialReview:reviewConfig?.review??null,artifacts:state.artifacts,...reviewOptions}),annotationController=mountArtifactAnnotations({document:document2,window,root,stageController:controller,reviewController:feedbackController});let durablePasteShare=shareOptions.createShare&&shareOptions.resumePreparedShare?createDurablePasteShare({scope:()=>({workspaceId:window.location.pathname,revisionId:reviewConfig.reviewOf??"unknown-revision",actorId:"local-paste-owner"}),create:request=>shareOptions.createShare(request),commit:shareOptions.resumePreparedShare,indexedDB:window.indexedDB}):null;durablePasteShare&&cleanup.push(()=>durablePasteShare.close()),shareController=mountArtifactShareDialog({document:document2,window,root,stageController:controller,...shareOptions,...durablePasteShare?{createShare:request=>durablePasteShare.run(request)}:{}}),hostedController=mountHostedArtifactViewer({document:document2,window,...hostedOptions}),feedbackController?.destroy&&cleanup.push(()=>feedbackController.destroy()),annotationController?.destroy&&cleanup.push(()=>annotationController.destroy()),shareController?.destroy&&cleanup.push(()=>shareController.destroy()),hostedController?.destroy&&cleanup.push(()=>hostedController.destroy());function cancelledFrame(){let error=new Error("Artifact frame loading was cancelled.");return error.name="AbortError",error}function frameStatus(artifactId,status,phase,failure){let frame=frames.get(artifactId);frame&&(frame.dataset.planrFrameState=status,frame.dataset.planrFramePhase=phase);let previous=frameDiagnostics.get(artifactId),now=window.performance.now(),starting=status==="loading"&&phase==="source",startedAt=starting?now:previous?.startedAt??now,diagnostic=Object.freeze({artifactId,status,phase,startedAt,elapsedMs:Math.max(0,Math.round(now-startedAt)),attempt:(previous?.attempt??0)+(starting?1:0),transport:sourceTransport,...failure});frameDiagnostics.set(artifactId,diagnostic),disposed||(emit(root,window,ARTIFACT_STAGE_EVENTS.frameState,diagnostic),artifactId===state.activeArtifactId&&render())}function releaseFrame(artifactId,{status="unloaded",error=cancelledFrame(),failure}={}){let record2=frameLoads.get(artifactId);if(!record2)return;frameLoads.delete(artifactId),record2.cancelled=!0,record2.abort.abort(),record2.unlisten?.(),record2.detach?.(),record2.reject(error);let frame=frames.get(artifactId),slot=frameSlots.get(artifactId);slot&&frame.parentNode===slot.host&&!slot.placeholder.parentNode&&slot.host.replaceChild(slot.placeholder,frame),frame.removeAttribute("srcdoc"),frame.removeAttribute("src"),delete frame.dataset.planrArtifactDigest,delete frame.dataset.planrBridgeTrusted;try{delete frame.__openPlanrBridge}catch{}record2.sourceUrl&&window.URL.revokeObjectURL(record2.sourceUrl),documentLayouts.delete(artifactId);let panel=panels.get(artifactId);panel&&(delete panel.dataset.planrLayoutMeasured,panel.style.removeProperty("--planr-document-width"),panel.style.removeProperty("--planr-document-height")),frameStatus(artifactId,status,status,failure)}function assignArtifactSource(artifact){if(disposed)return Promise.reject(cancelledFrame());let frame=frames.get(artifact.id);if(!frame)return Promise.reject(new Error(`Missing artifact frame: ${artifact.id}`));let slot=frameSlots.get(artifact.id),existing=frameLoads.get(artifact.id);if(slot&&(!slot.host.isConnected||!root.contains(slot.host)||existing?.status==="ready"&&frame.parentNode!==slot.host))return releaseFrame(artifact.id),Promise.reject(cancelledFrame());if(existing)if(existing.status==="ready"&&existing.requireTrust&&frames.get(artifact.id)?.dataset.planrBridgeTrusted!=="true")releaseFrame(artifact.id);else return existing.used=++frameUse,existing.promise;let record2={status:"loading",used:++frameUse,cancelled:!1,abort:typeof window.AbortController=="function"?new window.AbortController:{signal:void 0,abort(){}}};record2.promise=new Promise((resolve,reject)=>{record2.resolve=resolve,record2.reject=reject}),frameLoads.set(artifact.id,record2);let current=()=>!disposed&&!record2.cancelled&&frameLoads.get(artifact.id)===record2,fail=error=>{current()&&releaseFrame(artifact.id,{status:"error",error,failure:{failedPhase:frameDiagnostics.get(artifact.id)?.phase??"source",code:error?.code??"E_ARTIFACT_FRAME_LOAD"}})},timer=window.setTimeout(()=>{let error=new Error(`Artifact frame did not finish loading: ${artifact.id}`);error.code="E_ARTIFACT_FRAME_TIMEOUT",fail(error)},frameLoadTimeoutMs),loaded=!1,ready=()=>{if(current()&&slot&&(!slot.host.isConnected||!root.contains(slot.host)||frame.parentNode!==slot.host)){fail(cancelledFrame());return}!current()||!loaded||record2.requireTrust&&frame.dataset.planrBridgeTrusted!=="true"||(record2.status="ready",record2.unlisten(),frameStatus(artifact.id,"ready","ready"),record2.resolve(artifact.id))},onLoad=()=>{loaded=!0,record2.requireTrust&&frame.dataset.planrBridgeTrusted!=="true"&&frameStatus(artifact.id,"loading","bridge"),ready()},onError=()=>fail(new Error(`Artifact frame failed: ${artifact.id}`));return record2.unlisten=()=>{window.clearTimeout(timer),frame.removeEventListener("load",onLoad),frame.removeEventListener("error",onError),frame.removeEventListener("planr:artifact-bridge-ready",ready)},frameStatus(artifact.id,"loading","source"),current()&&(async()=>{let source=await resolveArtifactSource(artifact,{frame,getState:()=>state,signal:record2.abort.signal});if(!current())return;if(typeof window.TextDecoder!="function"){let error=new Error("UTF-8 decoding support is required for artifact sources.");throw error.code="E_ARTIFACT_BROWSER_UNSUPPORTED",error}let html=await htmlForSource(window,source);if(current()){if(!html)throw new TypeError(`Artifact source resolver must return HTML bytes or a Blob for ${artifact.id}.`);if(slot){if(!slot.host.isConnected||!root.contains(slot.host)||slot.placeholder.parentNode!==slot.host||frame.parentNode)throw cancelledFrame();slot.host.replaceChild(frame,slot.placeholder)}if(typeof bridgeClient?.attach=="function"){let detach=bridgeClient.attach({artifact,frame,getState:()=>state});if(typeof detach=="function"&&(record2.detach=detach),!current()){record2.detach?.();return}record2.requireTrust=!0}if(frame.addEventListener("load",onLoad),frame.addEventListener("error",onError),frame.addEventListener("planr:artifact-bridge-ready",ready),frame.dataset.planrArtifactDigest=artifact.sha256,frameStatus(artifact.id,"loading","document"),!!current()){if(slot&&(!slot.host.isConnected||!root.contains(slot.host)||frame.parentNode!==slot.host))throw cancelledFrame();if(sourceTransport==="srcdoc")frame.removeAttribute("src"),frame.srcdoc=html;else{if(typeof window.URL?.createObjectURL!="function"||typeof window.Blob!="function"){let error=new Error("Blob URL support is required for artifact sources.");throw error.code="E_ARTIFACT_BROWSER_UNSUPPORTED",error}let sourceUrl=window.URL.createObjectURL(new window.Blob([html],{type:"text/html;charset=utf-8"}));record2.sourceUrl=sourceUrl,frame.removeAttribute("srcdoc"),frame.src=sourceUrl}}}})().catch(fail),record2.promise}function ensureFrames(artifactIds,isCurrent=()=>!0){if(disposed||!isCurrent())return Promise.reject(cancelledFrame());if(!Array.isArray(artifactIds)||artifactIds.some(id7=>typeof id7!="string"||!frames.has(id7)))return Promise.reject(new TypeError("Requested artifact frames must be known artifact IDs."));let requested=[...new Set(artifactIds)];if(frameBudget!==null&&requested.length>frameBudget)return Promise.reject(new RangeError(`At most ${frameBudget} artifact frames may be requested together.`));if(frameBudget===null)return Promise.all(requested.map(id7=>assignArtifactSource(stageArtifactById(state,id7))));let run=async()=>{if(disposed||!isCurrent())throw cancelledFrame();for(let id7 of requested){if(disposed||!isCurrent())throw cancelledFrame();if(!frameLoads.has(id7))for(;frameLoads.size>=frameBudget;){let candidates=[...frameLoads].filter(([loadedId])=>!requested.includes(loadedId)).sort((a,b)=>a[1].used-b[1].used);if(!candidates.length)throw new Error("The artifact frame budget is exhausted.");releaseFrame(candidates[0][0])}await assignArtifactSource(stageArtifactById(state,id7))}return requested},result=frameQueue.then(run);return frameQueue=result.catch(()=>{}),result}function frameIsReady(id7){let frame=frames.get(id7);return frame?.dataset.planrFrameState==="ready"&&(!frame.__openPlanrBridge||frame.dataset.planrBridgeTrusted==="true")}function setSelectionStatus(status,selection,generation){disposed||generation!==activationGeneration||visibleArtifactIds(state).join("|")!==selection||(state=reduceArtifactStageState(state,{type:"set-status",status}),render({announce:!0}))}function cancelInactiveLoads(ids2){for(let[id7,record2]of frameLoads)record2.status==="loading"&&!ids2.includes(id7)&&releaseFrame(id7)}async function activateVisibleFrames(){let generation=++activationGeneration,isCurrent=()=>generation===activationGeneration,ids2=visibleArtifactIds(state),selection=ids2.join("|");if(ids2.length===0)return state;if(cancelInactiveLoads(ids2),ids2.every(frameIsReady))return setSelectionStatus("ready",selection,generation),state;setSelectionStatus("loading",selection,generation);try{await ensureFrames(ids2,isCurrent),setSelectionStatus("ready",selection,generation)}catch(error){let status=error?.code==="E_ARTIFACT_BROWSER_UNSUPPORTED"?"unsupported-browser":"invalid";setSelectionStatus(status,selection,generation)}return state}function retryFrames(artifactIds=visibleArtifactIds(state)){if(!Array.isArray(artifactIds)||artifactIds.some(id7=>!frames.has(id7)))return Promise.reject(new TypeError("Requested artifact frames must be known artifact IDs."));for(let id7 of artifactIds)releaseFrame(id7);return artifactIds.some(id7=>visibleArtifactIds(state).includes(id7))?(readyPromise=activateVisibleFrames(),readyPromise):ensureFrames(artifactIds)}return state.status==="ready"&&state.artifacts.length>0&&(typeof resolveArtifactSource!="function"?(frameStatus(state.activeArtifactId,"loading","source"),frameStatus(state.activeArtifactId,"error","error",{failedPhase:"source",code:"E_ARTIFACT_SOURCE_UNAVAILABLE"}),state=reduceArtifactStageState(state,{type:"set-status",status:"invalid"}),render(),readyPromise=Promise.resolve(state)):(state=reduceArtifactStageState(state,{type:"set-status",status:"loading"}),render(),readyPromise=activateVisibleFrames(),frameBudget===null&&Promise.allSettled(state.artifacts.filter(({id:id7})=>id7!==state.activeArtifactId).map(assignArtifactSource)))),controller}function bootstrapArtifactStage(document2=globalThis.document,options={}){return mountArtifactStage({...options,document:document2,window:document2?.defaultView})}if(typeof document<"u"){let options=globalThis.__OPENPLANR_ARTIFACT_STAGE_OPTIONS__??{};document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>bootstrapArtifactStage(document,options),{once:!0}):queueMicrotask(()=>bootstrapArtifactStage(document,options))}return __toCommonJS(stage_exports);})();