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
@@ -0,0 +1,4966 @@
1
+ // packages/protocol/src/large-object-limits.mjs
2
+ var LARGE_OBJECT_LIMITS = Object.freeze({
3
+ uniqueHtmlBytes: 100 * 1024 * 1024,
4
+ decodedBytes: 128 * 1024 * 1024,
5
+ catalogBytes: 8 * 1024 * 1024,
6
+ manifestBytes: 64 * 1024,
7
+ chunkBytes: 1024 * 1024,
8
+ chunkPlaintextBytes: 1024 * 1024 - 16,
9
+ chunks: 129,
10
+ ciphertextBytes: 128 * 1024 * 1024 + 129 * 16,
11
+ sources: 256,
12
+ views: 4096,
13
+ resources: 1024,
14
+ eventBytes: 256 * 1024,
15
+ eventPageBytes: 1024 * 1024,
16
+ eventPageCount: 100
17
+ });
18
+
19
+ // packages/protocol/src/canonical-json.mjs
20
+ var hasOwn = (value, key) => Object.hasOwn(value, key);
21
+ function assertUnicodeScalarString(value, path) {
22
+ for (let index2 = 0; index2 < value.length; index2 += 1) {
23
+ const code = value.charCodeAt(index2);
24
+ if (code >= 55296 && code <= 56319) {
25
+ const next = value.charCodeAt(index2 + 1);
26
+ if (!(next >= 56320 && next <= 57343)) {
27
+ throw new TypeError(`JCS cannot canonicalize a lone high surrogate at ${path}.`);
28
+ }
29
+ index2 += 1;
30
+ } else if (code >= 56320 && code <= 57343) {
31
+ throw new TypeError(`JCS cannot canonicalize a lone low surrogate at ${path}.`);
32
+ }
33
+ }
34
+ }
35
+ function serialize(value, path, seen) {
36
+ if (value === null) return "null";
37
+ if (typeof value === "boolean") return value ? "true" : "false";
38
+ if (typeof value === "string") {
39
+ assertUnicodeScalarString(value, path);
40
+ return JSON.stringify(value);
41
+ }
42
+ if (typeof value === "number") {
43
+ if (!Number.isFinite(value)) throw new TypeError(`JCS requires a finite number at ${path}.`);
44
+ return JSON.stringify(value);
45
+ }
46
+ if (typeof value !== "object")
47
+ throw new TypeError(`JCS cannot canonicalize ${typeof value} at ${path}.`);
48
+ if (seen.has(value)) throw new TypeError(`JCS cannot canonicalize a cycle at ${path}.`);
49
+ seen.add(value);
50
+ try {
51
+ if (Array.isArray(value)) {
52
+ const entries2 = [];
53
+ for (let index2 = 0; index2 < value.length; index2 += 1) {
54
+ if (!hasOwn(value, index2))
55
+ throw new TypeError(`JCS cannot canonicalize a sparse array at ${path}[${index2}].`);
56
+ entries2.push(serialize(value[index2], `${path}[${index2}]`, seen));
57
+ }
58
+ return `[${entries2.join(",")}]`;
59
+ }
60
+ const prototype = Object.getPrototypeOf(value);
61
+ if (prototype !== Object.prototype && prototype !== null) {
62
+ throw new TypeError(`JCS requires a plain JSON object at ${path}.`);
63
+ }
64
+ const entries = Object.keys(value).sort().map((key) => {
65
+ assertUnicodeScalarString(key, `${path} key`);
66
+ return `${JSON.stringify(key)}:${serialize(value[key], `${path}.${key}`, seen)}`;
67
+ });
68
+ return `{${entries.join(",")}}`;
69
+ } finally {
70
+ seen.delete(value);
71
+ }
72
+ }
73
+ function canonicalizeJson(value) {
74
+ return serialize(value, "$", /* @__PURE__ */ new Set());
75
+ }
76
+ function deepFreeze(value) {
77
+ if (value && typeof value === "object" && !Object.isFrozen(value)) {
78
+ for (const nested of Object.values(value)) deepFreeze(nested);
79
+ Object.freeze(value);
80
+ }
81
+ return value;
82
+ }
83
+ function assertPlainDataAt(value, label, depth, seen) {
84
+ if (depth > 64) throw new TypeError(`${label} exceeds the maximum nesting depth.`);
85
+ if (value === null || ["string", "boolean"].includes(typeof value)) return;
86
+ if (typeof value === "number" && Number.isFinite(value)) return;
87
+ if (typeof value !== "object" || seen.has(value))
88
+ throw new TypeError(`${label} must be finite, acyclic JSON.`);
89
+ if (!Array.isArray(value) && ![Object.prototype, null].includes(Object.getPrototypeOf(value)))
90
+ throw new TypeError(`${label} must contain only plain JSON objects.`);
91
+ seen.add(value);
92
+ for (const [key, descriptor] of Object.entries(Object.getOwnPropertyDescriptors(value))) {
93
+ if (["__proto__", "prototype", "constructor"].includes(key) || !Object.hasOwn(descriptor, "value"))
94
+ throw new TypeError(`${label} contains a forbidden property.`);
95
+ assertPlainDataAt(descriptor.value, label, depth + 1, seen);
96
+ }
97
+ seen.delete(value);
98
+ }
99
+ function assertPlainData(value, label) {
100
+ assertPlainDataAt(value, label, 0, /* @__PURE__ */ new Set());
101
+ }
102
+
103
+ // packages/protocol/src/json-schema.mjs
104
+ var typeOf = (v) => {
105
+ if (v === null) return "null";
106
+ if (Array.isArray(v)) return "array";
107
+ if (Number.isInteger(v)) return "integer";
108
+ if (typeof v === "number") return "number";
109
+ return typeof v;
110
+ };
111
+ var matchesType = (v, t) => {
112
+ if (t === "integer") return Number.isInteger(v);
113
+ if (t === "number") return typeof v === "number";
114
+ if (t === "string") return typeof v === "string";
115
+ if (t === "boolean") return typeof v === "boolean";
116
+ if (t === "null") return v === null;
117
+ if (t === "array") return Array.isArray(v);
118
+ if (t === "object") return v !== null && typeof v === "object" && !Array.isArray(v);
119
+ return false;
120
+ };
121
+ var FORMAT_DATE = /^\d{4}-\d{2}-\d{2}$/;
122
+ var FORMAT_DATETIME = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})$/;
123
+ function resolveJsonPointer(root, reference) {
124
+ if (reference === "#") return root;
125
+ if (!reference.startsWith("#/")) return null;
126
+ return reference.slice(2).split("/").map((part) => part.replaceAll("~1", "/").replaceAll("~0", "~")).reduce((value, part) => value?.[part], root);
127
+ }
128
+ var validateNode = (value, schema6, path, errs, context) => {
129
+ if (schema6 === true) return;
130
+ if (schema6 === false) {
131
+ errs.push({ path, rule: "schema:false", detail: "value not allowed" });
132
+ return;
133
+ }
134
+ if (typeof schema6?.$ref === "string") {
135
+ const reference = schema6.$ref;
136
+ let resolved;
137
+ let nextRoot = context.rootSchema;
138
+ let resolvedBase = context.base;
139
+ if (reference.startsWith("#")) {
140
+ resolved = resolveJsonPointer(context.rootSchema, reference);
141
+ } else if (typeof context.resolveRef === "function") {
142
+ const result = context.resolveRef(reference, { base: context.base });
143
+ resolved = result?.schema ?? result;
144
+ nextRoot = result?.rootSchema ?? resolved;
145
+ resolvedBase = result?.base ?? resolved?.$id ?? context.base;
146
+ }
147
+ if (!resolved) {
148
+ errs.push({ path, rule: "$ref", detail: `could not resolve schema reference ${reference}` });
149
+ return;
150
+ }
151
+ const referenceKey = `${context.base ?? "<root>"}:${reference}`;
152
+ if (context.referenceStack.includes(referenceKey)) {
153
+ errs.push({ path, rule: "$ref", detail: `circular schema reference ${reference}` });
154
+ return;
155
+ }
156
+ validateNode(value, resolved, path, errs, {
157
+ ...context,
158
+ rootSchema: nextRoot,
159
+ base: resolvedBase,
160
+ referenceStack: [...context.referenceStack, referenceKey]
161
+ });
162
+ }
163
+ if (schema6.type !== void 0) {
164
+ const types = Array.isArray(schema6.type) ? schema6.type : [schema6.type];
165
+ if (!types.some((t) => matchesType(value, t))) {
166
+ errs.push({
167
+ path,
168
+ rule: "type",
169
+ detail: `expected ${types.join("|")}, got ${typeOf(value)}`
170
+ });
171
+ return;
172
+ }
173
+ }
174
+ if (schema6.const !== void 0) {
175
+ if (value !== schema6.const) {
176
+ errs.push({
177
+ path,
178
+ rule: "const",
179
+ detail: `expected ${JSON.stringify(schema6.const)}, got ${JSON.stringify(value)}`
180
+ });
181
+ }
182
+ }
183
+ if (Array.isArray(schema6.enum)) {
184
+ if (!schema6.enum.includes(value)) {
185
+ errs.push({
186
+ path,
187
+ rule: "enum",
188
+ detail: `value ${JSON.stringify(value)} not in enum [${schema6.enum.map((x) => JSON.stringify(x)).join(", ")}]`
189
+ });
190
+ }
191
+ }
192
+ if (typeof value === "string") {
193
+ if (typeof schema6.minLength === "number" && value.length < schema6.minLength) {
194
+ errs.push({
195
+ path,
196
+ rule: "minLength",
197
+ detail: `length ${value.length} < ${schema6.minLength}`
198
+ });
199
+ }
200
+ if (typeof schema6.maxLength === "number" && value.length > schema6.maxLength) {
201
+ errs.push({
202
+ path,
203
+ rule: "maxLength",
204
+ detail: `length ${value.length} > ${schema6.maxLength}`
205
+ });
206
+ }
207
+ if (typeof schema6.pattern === "string") {
208
+ try {
209
+ if (!new RegExp(schema6.pattern).test(value)) {
210
+ errs.push({
211
+ path,
212
+ rule: "pattern",
213
+ detail: `value ${JSON.stringify(value)} does not match /${schema6.pattern}/`
214
+ });
215
+ }
216
+ } catch (e) {
217
+ errs.push({
218
+ path,
219
+ rule: "pattern",
220
+ detail: `invalid regex /${schema6.pattern}/: ${e instanceof Error ? e.message : String(e)}`
221
+ });
222
+ }
223
+ }
224
+ if (typeof schema6.format === "string") {
225
+ if (schema6.format === "date" && !FORMAT_DATE.test(value)) {
226
+ errs.push({
227
+ path,
228
+ rule: "format:date",
229
+ detail: `value ${JSON.stringify(value)} is not YYYY-MM-DD`
230
+ });
231
+ } else if (schema6.format === "date-time" && !FORMAT_DATETIME.test(value)) {
232
+ errs.push({
233
+ path,
234
+ rule: "format:date-time",
235
+ detail: `value ${JSON.stringify(value)} is not ISO 8601 date-time`
236
+ });
237
+ }
238
+ }
239
+ }
240
+ if (typeof value === "number") {
241
+ if (typeof schema6.minimum === "number" && value < schema6.minimum) {
242
+ errs.push({ path, rule: "minimum", detail: `value ${value} < ${schema6.minimum}` });
243
+ }
244
+ if (typeof schema6.maximum === "number" && value > schema6.maximum) {
245
+ errs.push({ path, rule: "maximum", detail: `value ${value} > ${schema6.maximum}` });
246
+ }
247
+ }
248
+ if (Array.isArray(value)) {
249
+ if (typeof schema6.minItems === "number" && value.length < schema6.minItems) {
250
+ errs.push({ path, rule: "minItems", detail: `length ${value.length} < ${schema6.minItems}` });
251
+ }
252
+ if (typeof schema6.maxItems === "number" && value.length > schema6.maxItems) {
253
+ errs.push({ path, rule: "maxItems", detail: `length ${value.length} > ${schema6.maxItems}` });
254
+ }
255
+ const prefixLength = Array.isArray(schema6.prefixItems) ? schema6.prefixItems.length : 0;
256
+ if (prefixLength > 0) {
257
+ for (let i = 0; i < Math.min(value.length, prefixLength); i++) {
258
+ validateNode(value[i], schema6.prefixItems[i], `${path}[${i}]`, errs, context);
259
+ }
260
+ }
261
+ if (schema6.items !== void 0) {
262
+ for (let i = prefixLength; i < value.length; i++) {
263
+ validateNode(value[i], schema6.items, `${path}[${i}]`, errs, context);
264
+ }
265
+ }
266
+ if (schema6.uniqueItems === true) {
267
+ const seen = /* @__PURE__ */ new Set();
268
+ for (const item2 of value) {
269
+ const key = JSON.stringify(item2);
270
+ if (seen.has(key)) {
271
+ errs.push({ path, rule: "uniqueItems", detail: `duplicate item ${key}` });
272
+ break;
273
+ }
274
+ seen.add(key);
275
+ }
276
+ }
277
+ if (schema6.contains !== void 0) {
278
+ let matches = 0;
279
+ for (let index2 = 0; index2 < value.length; index2 += 1) {
280
+ const containedErrors = [];
281
+ validateNode(value[index2], schema6.contains, `${path}[${index2}]`, containedErrors, context);
282
+ if (containedErrors.length === 0) matches += 1;
283
+ }
284
+ const minimum = Number.isSafeInteger(schema6.minContains) ? schema6.minContains : 1;
285
+ const maximum = Number.isSafeInteger(schema6.maxContains) ? schema6.maxContains : null;
286
+ if (matches < minimum) {
287
+ errs.push({
288
+ path,
289
+ rule: "contains",
290
+ detail: `matched ${matches} contained items; expected at least ${minimum}`
291
+ });
292
+ }
293
+ if (maximum !== null && matches > maximum) {
294
+ errs.push({
295
+ path,
296
+ rule: "contains",
297
+ detail: `matched ${matches} contained items; expected at most ${maximum}`
298
+ });
299
+ }
300
+ }
301
+ }
302
+ if (value !== null && typeof value === "object" && !Array.isArray(value)) {
303
+ if (Array.isArray(schema6.required)) {
304
+ for (const req of schema6.required) {
305
+ if (!Object.hasOwn(value, req)) {
306
+ errs.push({ path, rule: "required", detail: `missing required property '${req}'` });
307
+ }
308
+ }
309
+ }
310
+ const props = schema6.properties || {};
311
+ for (const [k, v] of Object.entries(value)) {
312
+ if (!Object.hasOwn(props, k)) {
313
+ if (schema6.additionalProperties === false) {
314
+ errs.push({ path, rule: "additionalProperties", detail: `unknown property '${k}'` });
315
+ } else if (schema6.additionalProperties === true || schema6.additionalProperties !== null && typeof schema6.additionalProperties === "object") {
316
+ validateNode(v, schema6.additionalProperties, `${path}.${k}`, errs, context);
317
+ }
318
+ }
319
+ }
320
+ for (const [k, v] of Object.entries(value)) {
321
+ if (Object.hasOwn(props, k)) validateNode(v, props[k], `${path}.${k}`, errs, context);
322
+ }
323
+ }
324
+ if (Array.isArray(schema6.oneOf)) {
325
+ let matched = 0;
326
+ for (const sub of schema6.oneOf) {
327
+ const e = [];
328
+ validateNode(value, sub, path, e, context);
329
+ if (e.length === 0) matched++;
330
+ }
331
+ if (matched !== 1) {
332
+ const titles = schema6.oneOf.map((s) => s.title || "(unnamed)").join(" | ");
333
+ errs.push({
334
+ path,
335
+ rule: "oneOf",
336
+ detail: `matched ${matched}/${schema6.oneOf.length} branches (expected exactly 1). Branches: ${titles}`
337
+ });
338
+ }
339
+ }
340
+ if (Array.isArray(schema6.anyOf)) {
341
+ let matched = 0;
342
+ for (const sub of schema6.anyOf) {
343
+ const candidateErrors = [];
344
+ validateNode(value, sub, path, candidateErrors, context);
345
+ if (candidateErrors.length === 0) matched += 1;
346
+ }
347
+ if (matched === 0) {
348
+ const titles = schema6.anyOf.map((sub) => sub.title || "(unnamed)").join(" | ");
349
+ errs.push({
350
+ path,
351
+ rule: "anyOf",
352
+ detail: `matched 0/${schema6.anyOf.length} branches (expected at least 1). Branches: ${titles}`
353
+ });
354
+ }
355
+ }
356
+ if (Array.isArray(schema6.allOf)) {
357
+ for (const sub of schema6.allOf) {
358
+ validateNode(value, sub, path, errs, context);
359
+ }
360
+ }
361
+ if (schema6.if !== void 0) {
362
+ const conditionErrors = [];
363
+ validateNode(value, schema6.if, path, conditionErrors, context);
364
+ const branch = conditionErrors.length === 0 ? schema6.then : schema6.else;
365
+ if (branch !== void 0) validateNode(value, branch, path, errs, context);
366
+ }
367
+ if (schema6.not !== void 0) {
368
+ const e = [];
369
+ validateNode(value, schema6.not, path, e, context);
370
+ if (e.length === 0) {
371
+ errs.push({ path, rule: "not", detail: "value matched a forbidden subschema" });
372
+ }
373
+ }
374
+ };
375
+ var validateJson = (value, schema6, {
376
+ resolveRef,
377
+ base = (
378
+ /** @type {{ $id?: string } | null | undefined} */
379
+ schema6?.$id ?? null
380
+ )
381
+ } = {}) => {
382
+ const errs = [];
383
+ validateNode(value, schema6, "$", errs, {
384
+ rootSchema: schema6,
385
+ resolveRef,
386
+ base,
387
+ referenceStack: []
388
+ });
389
+ return errs;
390
+ };
391
+
392
+ // packages/protocol/src/enterprise-contracts.mjs
393
+ var ENTERPRISE_CONTRACT_VERSION = "1.0.0";
394
+ var ENTERPRISE_PROTOCOL_VERSION = "1.12.0";
395
+ var ENTERPRISE_ID_PATTERN = "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}(?![\\s\\S])";
396
+ var ENTERPRISE_REVIEW_CATEGORIES = Object.freeze([
397
+ "question",
398
+ "suggestion",
399
+ "change-request",
400
+ "blocker"
401
+ ]);
402
+ var ENTERPRISE_ACTIONS = Object.freeze([
403
+ "organization.manage",
404
+ "ownership.transfer",
405
+ "billing.manage",
406
+ "audit.read",
407
+ "project.create",
408
+ "project.manage",
409
+ "artifact.read",
410
+ "artifact.author",
411
+ "artifact.export",
412
+ "review.write",
413
+ "review.resolve"
414
+ ]);
415
+ var id = { type: "string", pattern: ENTERPRISE_ID_PATTERN };
416
+ var semanticId = {
417
+ type: "string",
418
+ minLength: 1,
419
+ maxLength: 512,
420
+ pattern: "^[^\\s\\u0000-\\u001f\\u007f]+$"
421
+ };
422
+ var nullableId = { anyOf: [id, { type: "null" }] };
423
+ var digest = { type: "string", minLength: 64, maxLength: 64, pattern: "^[a-f0-9]{64}$" };
424
+ var timestamp = {
425
+ type: "string",
426
+ format: "date-time",
427
+ pattern: "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{3})?Z$"
428
+ };
429
+ var text = { type: "string", minLength: 1, maxLength: 16384 };
430
+ var title = { ...text, maxLength: 240 };
431
+ var closed = (properties, required = Object.keys(properties)) => ({
432
+ type: "object",
433
+ additionalProperties: false,
434
+ properties,
435
+ required
436
+ });
437
+ var list = (items, maxItems = 1e3) => ({ type: "array", items, maxItems });
438
+ var schema = (name, properties, required) => ({
439
+ $schema: "https://json-schema.org/draft/2020-12/schema",
440
+ $id: `https://openplanr.dev/schemas/v1.12.0/${name}.schema.json`,
441
+ "x-openplanr-contract": { id: name, version: ENTERPRISE_PROTOCOL_VERSION },
442
+ ...closed(properties, required)
443
+ });
444
+ var envelope = (kind) => ({
445
+ kind: { const: `openplanr-${kind}` },
446
+ schemaVersion: { const: ENTERPRISE_CONTRACT_VERSION }
447
+ });
448
+ var scoped = { organizationId: id, projectId: id };
449
+ var versionedArtifact = { ...scoped, artifactId: id, revisionId: id };
450
+ var activeStatus = { enum: ["active", "revoked"] };
451
+ var projectRole = { enum: ["maintainer", "author", "reviewer", "viewer"] };
452
+ var ENTERPRISE_ACCESS_CONTEXT_SCHEMA = schema(
453
+ "enterprise-access-context",
454
+ {
455
+ actor: closed({ id, verified: { type: "boolean" } }),
456
+ organization: closed({ id, status: { enum: ["active", "suspended"] } }),
457
+ membership: closed({
458
+ organizationId: id,
459
+ actorId: id,
460
+ role: { enum: ["owner", "admin", "member"] },
461
+ status: activeStatus
462
+ }),
463
+ projectMembership: closed({ ...scoped, actorId: id, role: projectRole, status: activeStatus }),
464
+ guestGrant: closed({
465
+ ...scoped,
466
+ artifactId: id,
467
+ actorId: id,
468
+ role: { enum: ["reviewer", "viewer"] },
469
+ status: activeStatus,
470
+ expiresAt: timestamp
471
+ }),
472
+ resource: closed({ organizationId: id, projectId: id, artifactId: id }, ["organizationId"]),
473
+ action: { enum: ENTERPRISE_ACTIONS },
474
+ now: timestamp
475
+ },
476
+ ["actor", "organization", "resource", "action", "now"]
477
+ );
478
+ var ENTERPRISE_ARTIFACT_REVISION_SCHEMA = schema("enterprise-artifact-revision", {
479
+ ...envelope("enterprise-artifact-revision"),
480
+ id,
481
+ ...scoped,
482
+ artifactId: id,
483
+ parentRevisionId: nullableId,
484
+ contentDigest: digest,
485
+ contentType: { enum: ["application/json", "text/markdown", "image/svg+xml", "text/html"] },
486
+ byteLength: { type: "integer", minimum: 0, maximum: 5 * 1024 * 1024 },
487
+ createdAt: timestamp,
488
+ actorId: id
489
+ });
490
+ var ENTERPRISE_REVIEW_ANCHOR_SCHEMA = {
491
+ ...closed(
492
+ {
493
+ revisionId: id,
494
+ elementId: semanticId,
495
+ screenId: semanticId,
496
+ frameId: semanticId,
497
+ x: { type: "number", minimum: 0, maximum: 1 },
498
+ y: { type: "number", minimum: 0, maximum: 1 }
499
+ },
500
+ ["revisionId"]
501
+ ),
502
+ anyOf: [
503
+ { required: ["elementId"] },
504
+ { required: ["screenId", "frameId"] },
505
+ { required: ["x", "y"] }
506
+ ],
507
+ allOf: [
508
+ { if: { required: ["x"] }, then: { required: ["y"] } },
509
+ { if: { required: ["y"] }, then: { required: ["x"] } },
510
+ { if: { required: ["frameId"] }, then: { required: ["screenId"] } }
511
+ ]
512
+ };
513
+ var reply = closed({ id, authorId: id, body: text, createdAt: timestamp });
514
+ var ENTERPRISE_REVIEW_THREAD_SCHEMA = {
515
+ ...schema(
516
+ "enterprise-review-thread",
517
+ {
518
+ ...envelope("enterprise-review-thread"),
519
+ id,
520
+ ...scoped,
521
+ artifactId: id,
522
+ anchor: ENTERPRISE_REVIEW_ANCHOR_SCHEMA,
523
+ category: { enum: ENTERPRISE_REVIEW_CATEGORIES },
524
+ status: { enum: ["open", "addressed", "resolved"] },
525
+ authorId: id,
526
+ body: text,
527
+ createdAt: timestamp,
528
+ updatedAt: timestamp,
529
+ replies: list(reply, 1e4),
530
+ assigneeId: nullableId,
531
+ addressedRevisionId: id,
532
+ resolvedAt: timestamp
533
+ },
534
+ [
535
+ "kind",
536
+ "schemaVersion",
537
+ "id",
538
+ "organizationId",
539
+ "projectId",
540
+ "artifactId",
541
+ "anchor",
542
+ "category",
543
+ "status",
544
+ "authorId",
545
+ "body",
546
+ "createdAt",
547
+ "updatedAt",
548
+ "replies"
549
+ ]
550
+ ),
551
+ allOf: [
552
+ {
553
+ if: { properties: { status: { const: "addressed" } } },
554
+ then: { required: ["addressedRevisionId"], not: { required: ["resolvedAt"] } }
555
+ },
556
+ {
557
+ if: { properties: { status: { const: "resolved" } } },
558
+ then: { required: ["resolvedAt"] },
559
+ else: { not: { required: ["resolvedAt"] } }
560
+ }
561
+ ]
562
+ };
563
+ var collection = { enum: ["nodes", "relations", "groups", "events", "items"] };
564
+ var ENTERPRISE_CHANGE_OPERATION_SCHEMA = {
565
+ oneOf: [
566
+ closed({ op: { const: "replace-document" }, content: { type: "object" } }),
567
+ closed({
568
+ op: { const: "set-field" },
569
+ targetId: semanticId,
570
+ field: { enum: ["label", "description", "status", "title"] },
571
+ value: { type: "string", maxLength: 16384 }
572
+ }),
573
+ closed({
574
+ op: { const: "add-element" },
575
+ collection,
576
+ element: {
577
+ type: "object",
578
+ required: ["id"],
579
+ properties: { id: semanticId },
580
+ additionalProperties: true
581
+ }
582
+ }),
583
+ closed({ op: { const: "remove-element" }, collection, targetId: semanticId }),
584
+ closed({
585
+ op: { const: "set-layout" },
586
+ targetId: semanticId,
587
+ x: { type: "number", minimum: -1e7, maximum: 1e7 },
588
+ y: { type: "number", minimum: -1e7, maximum: 1e7 }
589
+ })
590
+ ]
591
+ };
592
+ var ENTERPRISE_CHANGE_PROPOSAL_SCHEMA = {
593
+ ...schema(
594
+ "enterprise-change-proposal",
595
+ {
596
+ ...envelope("enterprise-change-proposal"),
597
+ id,
598
+ ...scoped,
599
+ artifactId: id,
600
+ baseRevisionId: id,
601
+ authorId: id,
602
+ createdAt: timestamp,
603
+ status: { enum: ["draft", "proposed", "accepted", "rejected", "applied", "conflicted"] },
604
+ summary: title,
605
+ operations: { ...list(ENTERPRISE_CHANGE_OPERATION_SCHEMA, 1e3), minItems: 1 },
606
+ validation: closed({
607
+ status: { enum: ["pending", "passed", "failed"] },
608
+ issues: list(
609
+ closed({ code: id, message: text, targetId: semanticId }, ["code", "message"])
610
+ )
611
+ }),
612
+ application: closed(
613
+ {
614
+ revisionId: id,
615
+ appliedAt: timestamp,
616
+ actorId: id,
617
+ gitCommit: { type: "string", pattern: "^(?:[a-f0-9]{40}|[a-f0-9]{64})$" }
618
+ },
619
+ ["revisionId", "appliedAt", "actorId"]
620
+ )
621
+ },
622
+ [
623
+ "kind",
624
+ "schemaVersion",
625
+ "id",
626
+ "organizationId",
627
+ "projectId",
628
+ "artifactId",
629
+ "baseRevisionId",
630
+ "authorId",
631
+ "createdAt",
632
+ "status",
633
+ "summary",
634
+ "operations",
635
+ "validation"
636
+ ]
637
+ ),
638
+ allOf: [
639
+ {
640
+ if: { properties: { status: { const: "applied" } } },
641
+ then: {
642
+ required: ["application"],
643
+ properties: { validation: { properties: { status: { const: "passed" } } } }
644
+ },
645
+ else: { not: { required: ["application"] } }
646
+ },
647
+ {
648
+ if: { properties: { status: { const: "accepted" } } },
649
+ then: { properties: { validation: { properties: { status: { const: "passed" } } } } }
650
+ }
651
+ ]
652
+ };
653
+ var ENTERPRISE_EVIDENCE_REFERENCE_SCHEMA = schema(
654
+ "enterprise-evidence-reference",
655
+ {
656
+ ...envelope("enterprise-evidence-reference"),
657
+ id,
658
+ ...scoped,
659
+ source: {
660
+ oneOf: [
661
+ closed(
662
+ {
663
+ kind: { const: "repository" },
664
+ repositoryId: id,
665
+ path: text,
666
+ commit: { type: "string", pattern: "^(?:[a-f0-9]{40}|[a-f0-9]{64})$" },
667
+ line: { type: "integer", minimum: 1, maximum: 1e9 }
668
+ },
669
+ ["kind", "repositoryId", "path", "commit"]
670
+ ),
671
+ closed(
672
+ { kind: { const: "artifact" }, artifactId: id, revisionId: id, elementId: semanticId },
673
+ ["kind", "artifactId", "revisionId"]
674
+ ),
675
+ closed({ kind: { const: "url" }, url: { type: "string", minLength: 1, maxLength: 2048 } })
676
+ ]
677
+ },
678
+ capturedAt: timestamp,
679
+ freshness: { enum: ["current", "stale", "unknown"] },
680
+ label: title,
681
+ contentDigest: digest
682
+ },
683
+ [
684
+ "kind",
685
+ "schemaVersion",
686
+ "id",
687
+ "organizationId",
688
+ "projectId",
689
+ "source",
690
+ "capturedAt",
691
+ "freshness",
692
+ "label"
693
+ ]
694
+ );
695
+ var ENTERPRISE_SYNC_STATE_SCHEMA = schema("enterprise-sync-state", {
696
+ ...envelope("enterprise-sync-state"),
697
+ ...scoped,
698
+ repositoryId: id,
699
+ direction: { enum: ["push", "pull"] },
700
+ status: { enum: ["preview", "pending", "synchronized", "failed", "conflicted"] },
701
+ scope: { ...list(id, 1e4), uniqueItems: true },
702
+ cursor: { type: ["string", "null"], maxLength: 2048 },
703
+ operationId: id,
704
+ updatedAt: timestamp,
705
+ items: list(
706
+ closed({
707
+ artifactId: id,
708
+ baseRevisionId: nullableId,
709
+ revisionId: nullableId,
710
+ contentDigest: digest,
711
+ action: { enum: ["create", "update", "unchanged", "conflict"] }
712
+ }),
713
+ 1e4
714
+ ),
715
+ issues: list(closed({ code: id, artifactId: id, message: text }, ["code", "message"]))
716
+ });
717
+ var ENTERPRISE_AGENT_HANDOFF_SCHEMA = schema("enterprise-agent-handoff", {
718
+ ...envelope("enterprise-agent-handoff"),
719
+ ...versionedArtifact,
720
+ generatedAt: timestamp,
721
+ authority: { const: "feedback-only" },
722
+ contentTrust: { const: "untrusted" },
723
+ threads: list(ENTERPRISE_REVIEW_THREAD_SCHEMA, 1e4),
724
+ evidence: list(ENTERPRISE_EVIDENCE_REFERENCE_SCHEMA, 1e4),
725
+ unresolvedUncertainties: list(text),
726
+ contentDigest: digest
727
+ });
728
+ var ENTERPRISE_SCHEMAS = deepFreeze({
729
+ "enterprise-access-context": ENTERPRISE_ACCESS_CONTEXT_SCHEMA,
730
+ "enterprise-artifact-revision": ENTERPRISE_ARTIFACT_REVISION_SCHEMA,
731
+ "enterprise-review-thread": ENTERPRISE_REVIEW_THREAD_SCHEMA,
732
+ "enterprise-change-proposal": ENTERPRISE_CHANGE_PROPOSAL_SCHEMA,
733
+ "enterprise-evidence-reference": ENTERPRISE_EVIDENCE_REFERENCE_SCHEMA,
734
+ "enterprise-sync-state": ENTERPRISE_SYNC_STATE_SCHEMA,
735
+ "enterprise-agent-handoff": ENTERPRISE_AGENT_HANDOFF_SCHEMA
736
+ });
737
+ var projectCapabilities = deepFreeze({
738
+ maintainer: [
739
+ "project.manage",
740
+ "artifact.read",
741
+ "artifact.author",
742
+ "artifact.export",
743
+ "review.write",
744
+ "review.resolve"
745
+ ],
746
+ author: ["artifact.read", "artifact.author", "artifact.export", "review.write", "review.resolve"],
747
+ reviewer: ["artifact.read", "artifact.export", "review.write"],
748
+ viewer: ["artifact.read", "artifact.export"]
749
+ });
750
+ var noCapabilities = Object.freeze([]);
751
+ var organizationCapabilities = deepFreeze({
752
+ owner: [
753
+ "organization.manage",
754
+ "ownership.transfer",
755
+ "billing.manage",
756
+ "audit.read",
757
+ "project.create"
758
+ ],
759
+ admin: ["organization.manage", "billing.manage", "audit.read", "project.create"],
760
+ member: []
761
+ });
762
+ var editableCollections = Object.freeze(["nodes", "relations", "groups", "events", "items"]);
763
+ var identityCollections = Object.freeze([
764
+ ...editableCollections,
765
+ "lanes",
766
+ "series",
767
+ "axes",
768
+ "sets",
769
+ "annotations"
770
+ ]);
771
+
772
+ // packages/protocol/src/enterprise-resource-contracts.mjs
773
+ var opaqueRevisionId = { type: "string", pattern: "^[A-Za-z0-9_-]{22,64}$" };
774
+ function copySchema(value) {
775
+ return structuredClone(value);
776
+ }
777
+ var anchor = copySchema(ENTERPRISE_REVIEW_ANCHOR_SCHEMA);
778
+ var revisionId = {
779
+ anyOf: [opaqueRevisionId, anchor.properties.revisionId]
780
+ };
781
+ var nullableRevisionId = { anyOf: [revisionId, { type: "null" }] };
782
+ function successor(source, name) {
783
+ const value = structuredClone(source);
784
+ value.$id = `https://openplanr.dev/schemas/v1.17.0/${name}.schema.json`;
785
+ value["x-openplanr-contract"] = { id: name, version: "1.17.0" };
786
+ value.properties.schemaVersion = { const: "1.1.0" };
787
+ value.properties.protocolVersion = { const: "1.17.0" };
788
+ value.required.push("protocolVersion");
789
+ return value;
790
+ }
791
+ var ENTERPRISE_REVIEW_ANCHOR_V11_SCHEMA = deepFreeze({
792
+ ...anchor,
793
+ properties: { ...anchor.properties, revisionId }
794
+ });
795
+ var thread = successor(ENTERPRISE_REVIEW_THREAD_SCHEMA, "enterprise-review-thread");
796
+ thread.properties.anchor = ENTERPRISE_REVIEW_ANCHOR_V11_SCHEMA;
797
+ thread.properties.addressedRevisionId = revisionId;
798
+ var ENTERPRISE_REVIEW_THREAD_V11_SCHEMA = deepFreeze(thread);
799
+ var proposal = successor(ENTERPRISE_CHANGE_PROPOSAL_SCHEMA, "enterprise-change-proposal");
800
+ proposal.properties.baseRevisionId = revisionId;
801
+ proposal.properties.application.properties.revisionId = revisionId;
802
+ var ENTERPRISE_CHANGE_PROPOSAL_V11_SCHEMA = deepFreeze(proposal);
803
+ var evidence = successor(ENTERPRISE_EVIDENCE_REFERENCE_SCHEMA, "enterprise-evidence-reference");
804
+ evidence.properties.source.oneOf.find(
805
+ (branch) => branch.properties.kind.const === "artifact"
806
+ ).properties.revisionId = revisionId;
807
+ var ENTERPRISE_EVIDENCE_REFERENCE_V11_SCHEMA = deepFreeze(evidence);
808
+ var sync = successor(ENTERPRISE_SYNC_STATE_SCHEMA, "enterprise-sync-state");
809
+ sync.properties.items.items.properties.baseRevisionId = nullableRevisionId;
810
+ sync.properties.items.items.properties.revisionId = nullableRevisionId;
811
+ var ENTERPRISE_SYNC_STATE_V11_SCHEMA = deepFreeze(sync);
812
+ var handoff = successor(ENTERPRISE_AGENT_HANDOFF_SCHEMA, "enterprise-agent-handoff");
813
+ handoff.properties.revisionId = revisionId;
814
+ handoff.properties.threads.items = {
815
+ oneOf: [ENTERPRISE_REVIEW_THREAD_SCHEMA, ENTERPRISE_REVIEW_THREAD_V11_SCHEMA]
816
+ };
817
+ handoff.properties.evidence.items = {
818
+ oneOf: [ENTERPRISE_EVIDENCE_REFERENCE_SCHEMA, ENTERPRISE_EVIDENCE_REFERENCE_V11_SCHEMA]
819
+ };
820
+ var ENTERPRISE_AGENT_HANDOFF_V11_SCHEMA = deepFreeze(handoff);
821
+ var ENTERPRISE_RESOURCE_SCHEMAS = deepFreeze({
822
+ "enterprise-review-thread": ENTERPRISE_REVIEW_THREAD_V11_SCHEMA,
823
+ "enterprise-change-proposal": ENTERPRISE_CHANGE_PROPOSAL_V11_SCHEMA,
824
+ "enterprise-evidence-reference": ENTERPRISE_EVIDENCE_REFERENCE_V11_SCHEMA,
825
+ "enterprise-sync-state": ENTERPRISE_SYNC_STATE_V11_SCHEMA,
826
+ "enterprise-agent-handoff": ENTERPRISE_AGENT_HANDOFF_V11_SCHEMA
827
+ });
828
+
829
+ // packages/protocol/src/sharing-security-contracts.mjs
830
+ var ROOM_V3_READ_LIMITS = Object.freeze({
831
+ pageBytes: 8 * 1024 * 1024,
832
+ eventPageBytes: 1024 * 1024,
833
+ eventPageCount: 100,
834
+ aggregateBytes: 128 * 1024 * 1024,
835
+ projectionBytes: 128 * 1024 * 1024,
836
+ retainedEvents: 1e4
837
+ });
838
+ var ROOM_V3_VERSION = "3.0.0";
839
+ var ROOM_V3_GENESIS_HASH = `sha256:${"0".repeat(64)}`;
840
+ var ROOM_V3_CAPABILITIES = Object.freeze({
841
+ read: "room-read",
842
+ reviewer: "reviewer-write",
843
+ owner: "owner-verdict",
844
+ management: "room-management"
845
+ });
846
+ var id2 = { type: "string", pattern: "^[A-Za-z0-9_-]{16,128}$" };
847
+ var token = { type: "string", pattern: "^[A-Za-z0-9_-]{43}$" };
848
+ var sha = { type: "string", pattern: "^sha256:[a-f0-9]{64}$" };
849
+ var digest2 = { type: "string", pattern: "^[a-f0-9]{64}$" };
850
+ var integer = { type: "integer", minimum: 0, maximum: Number.MAX_SAFE_INTEGER };
851
+ var iso = { type: "string", format: "date-time", maxLength: 40 };
852
+ var signature = { type: "string", pattern: "^[A-Za-z0-9_-]{86}$" };
853
+ var closed2 = (properties, required = Object.keys(properties)) => ({
854
+ type: "object",
855
+ additionalProperties: false,
856
+ properties,
857
+ required
858
+ });
859
+ var schema2 = (name, properties, required) => ({
860
+ $schema: "https://json-schema.org/draft/2020-12/schema",
861
+ $id: `https://openplanr.dev/schemas/v1.17.0/${name}.schema.json`,
862
+ "x-openplanr-contract": { id: name, version: "1.17.0" },
863
+ ...closed2(properties, required)
864
+ });
865
+ var ownerKey = closed2({
866
+ algorithm: { const: "ECDSA-P256-SHA256" },
867
+ encoding: { const: "spki-base64url" },
868
+ keyId: sha,
869
+ value: { type: "string", pattern: "^[A-Za-z0-9_-]+$", minLength: 86, maxLength: 342 }
870
+ });
871
+ var cipher = (limit) => ({
872
+ iv: { type: "string", pattern: "^[A-Za-z0-9_-]{16}$" },
873
+ ciphertext: {
874
+ type: "string",
875
+ pattern: "^[A-Za-z0-9_-]+$",
876
+ minLength: 22,
877
+ maxLength: Math.ceil(limit * 4 / 3)
878
+ }
879
+ });
880
+ var ROOM_V3_DESCRIPTOR_SCHEMA = schema2("artifact-room-descriptor-v3", {
881
+ schemaVersion: { const: ROOM_V3_VERSION },
882
+ protocolVersion: { const: ROOM_V3_VERSION },
883
+ roomId: id2,
884
+ reviewCommitment: digest2,
885
+ ownerKey,
886
+ capabilities: closed2(
887
+ Object.fromEntries(
888
+ Object.entries(ROOM_V3_CAPABILITIES).map(([key, value]) => [key, { const: value }])
889
+ )
890
+ ),
891
+ createdAt: iso
892
+ });
893
+ var ROOM_V3_CREATE_SCHEMA = schema2("artifact-room-create-v3", {
894
+ schemaVersion: { const: ROOM_V3_VERSION },
895
+ operation: { const: "create" },
896
+ roomId: id2,
897
+ creationId: token,
898
+ ttl: { enum: ["1d", "7d", "30d"] },
899
+ reviewCommitment: digest2,
900
+ ...cipher(5 * 1024 * 1024),
901
+ ownerKey,
902
+ readCapability: token,
903
+ reviewerCapability: token,
904
+ ownerCapability: token,
905
+ manageCapability: token,
906
+ signature
907
+ });
908
+ var ROOM_V3_EVENT_SCHEMA = schema2("artifact-room-event-v3", {
909
+ schemaVersion: { const: ROOM_V3_VERSION },
910
+ protocolVersion: { const: ROOM_V3_VERSION },
911
+ roomId: id2,
912
+ eventId: { type: "string", pattern: "^[A-Za-z0-9._:-]{1,128}$" },
913
+ sequence: { ...integer, minimum: 1 },
914
+ predecessor: sha,
915
+ kind: {
916
+ enum: ["pin", "reply", "pin_status", "recommendation", "owner_decision", "review_snapshot"]
917
+ },
918
+ reviewCommitment: digest2,
919
+ authorRole: { enum: ["owner", "reviewer"] },
920
+ authorKey: ownerKey,
921
+ capability: { enum: ["reviewer-write", "owner-verdict"] },
922
+ createdAt: iso,
923
+ ...cipher(256 * 1024),
924
+ ciphertextDigest: sha,
925
+ signature
926
+ });
927
+ var ROOM_V3_APPEND_SCHEMA = schema2("artifact-room-append-v3", {
928
+ schemaVersion: { const: ROOM_V3_VERSION },
929
+ operation: { const: "append" },
930
+ expectedGeneration: integer,
931
+ record: ROOM_V3_EVENT_SCHEMA
932
+ });
933
+ var ROOM_V3_READ_PAGE_SCHEMA = schema2(
934
+ "artifact-room-read-page-v3",
935
+ {
936
+ version: { const: "v3" },
937
+ descriptor: ROOM_V3_DESCRIPTOR_SCHEMA,
938
+ expiresAt: iso,
939
+ commentsEnabled: { type: "boolean" },
940
+ generation: integer,
941
+ sequence: { ...integer, maximum: ROOM_V3_READ_LIMITS.retainedEvents },
942
+ head: sha,
943
+ cursor: { ...integer, maximum: ROOM_V3_READ_LIMITS.retainedEvents },
944
+ eventBytes: { ...integer, maximum: ROOM_V3_READ_LIMITS.eventPageBytes },
945
+ events: {
946
+ type: "array",
947
+ maxItems: ROOM_V3_READ_LIMITS.eventPageCount,
948
+ items: ROOM_V3_EVENT_SCHEMA
949
+ },
950
+ nextCursor: {
951
+ oneOf: [
952
+ { ...integer, minimum: 1, maximum: ROOM_V3_READ_LIMITS.retainedEvents },
953
+ { type: "null" }
954
+ ]
955
+ },
956
+ ...cipher(5 * 1024 * 1024)
957
+ },
958
+ [
959
+ "version",
960
+ "descriptor",
961
+ "expiresAt",
962
+ "commentsEnabled",
963
+ "generation",
964
+ "sequence",
965
+ "head",
966
+ "cursor",
967
+ "eventBytes",
968
+ "events",
969
+ "nextCursor"
970
+ ]
971
+ );
972
+ var ROOM_V3_MANAGEMENT_SCHEMA = schema2("artifact-room-management-v3", {
973
+ schemaVersion: { const: ROOM_V3_VERSION },
974
+ roomId: id2,
975
+ operation: { enum: ["pause", "resume", "delete"] },
976
+ operationId: id2,
977
+ expectedGeneration: integer,
978
+ signature
979
+ });
980
+ var PASTE_V2_SCHEMA = schema2("artifact-paste-v2", {
981
+ schemaVersion: { const: "2.0.0" },
982
+ operation: { const: "create" },
983
+ id: id2,
984
+ creationId: token,
985
+ ttl: { enum: ["1d", "7d", "30d"] },
986
+ ...cipher(5 * 1024 * 1024)
987
+ });
988
+ var SHARING_CRYPTO_AAD_SCHEMA = schema2("sharing-crypto-aad", {
989
+ version: { const: "2.0.0" },
990
+ purpose: { enum: ["artifact-paste", "room-envelope", "room-event"] },
991
+ objectId: id2,
992
+ recordId: { type: "string", pattern: "^[A-Za-z0-9._:-]{1,128}$" }
993
+ });
994
+ var PREVIEW_BRIDGE_MESSAGE_SCHEMA = {
995
+ $schema: "https://json-schema.org/draft/2020-12/schema",
996
+ $id: "https://openplanr.dev/schemas/v1.17.0/preview-bridge-message.schema.json",
997
+ "x-openplanr-contract": { id: "preview-bridge-message", version: "1.17.0" },
998
+ oneOf: [
999
+ schema2("preview-bridge-ready", {
1000
+ schemaVersion: { const: "1.0.0" },
1001
+ channel: token,
1002
+ type: { const: "ready" },
1003
+ viewId: id2
1004
+ }),
1005
+ schema2("preview-bridge-navigate", {
1006
+ schemaVersion: { const: "1.0.0" },
1007
+ channel: token,
1008
+ type: { const: "navigate" },
1009
+ viewId: id2,
1010
+ screenId: id2
1011
+ }),
1012
+ schema2("preview-bridge-select", {
1013
+ schemaVersion: { const: "1.0.0" },
1014
+ channel: token,
1015
+ type: { const: "select" },
1016
+ viewId: id2,
1017
+ elementId: id2
1018
+ }),
1019
+ schema2("preview-bridge-state", {
1020
+ schemaVersion: { const: "1.0.0" },
1021
+ channel: token,
1022
+ type: { const: "state" },
1023
+ viewId: id2,
1024
+ state: closed2({ session: { type: "object" }, forms: { type: "object" } })
1025
+ }),
1026
+ schema2("preview-bridge-failed", {
1027
+ schemaVersion: { const: "1.0.0" },
1028
+ channel: token,
1029
+ type: { const: "failed" },
1030
+ viewId: id2
1031
+ })
1032
+ ]
1033
+ };
1034
+ for (const alternative of PREVIEW_BRIDGE_MESSAGE_SCHEMA.oneOf)
1035
+ for (const key of ["viewId", "screenId", "elementId"])
1036
+ if (alternative.properties[key])
1037
+ alternative.properties[key] = {
1038
+ type: "string",
1039
+ pattern: "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
1040
+ };
1041
+ var SHARING_SECURITY_SCHEMAS = Object.freeze({
1042
+ "preview-bridge-message": PREVIEW_BRIDGE_MESSAGE_SCHEMA,
1043
+ "artifact-room-descriptor-v3": ROOM_V3_DESCRIPTOR_SCHEMA,
1044
+ "artifact-room-create-v3": ROOM_V3_CREATE_SCHEMA,
1045
+ "artifact-room-read-page-v3": ROOM_V3_READ_PAGE_SCHEMA,
1046
+ "artifact-room-append-v3": ROOM_V3_APPEND_SCHEMA,
1047
+ "artifact-room-event-v3": ROOM_V3_EVENT_SCHEMA,
1048
+ "artifact-room-management-v3": ROOM_V3_MANAGEMENT_SCHEMA,
1049
+ "artifact-paste-v2": PASTE_V2_SCHEMA,
1050
+ "sharing-crypto-aad": SHARING_CRYPTO_AAD_SCHEMA
1051
+ });
1052
+
1053
+ // packages/protocol/src/generated/diagram-registries.mjs
1054
+ var deepFreeze2 = (value) => {
1055
+ if (value && typeof value === "object" && !Object.isFrozen(value)) {
1056
+ for (const nested of Object.values(value)) deepFreeze2(nested);
1057
+ Object.freeze(value);
1058
+ }
1059
+ return value;
1060
+ };
1061
+ var DIAGRAM_REGISTRIES = deepFreeze2({
1062
+ "diagram-grammars.json": {
1063
+ "kind": "diagram-type-registry",
1064
+ "schemaVersion": "1.0.0",
1065
+ "protocolVersion": "1.6.0",
1066
+ "documentVersion": "1.0.0",
1067
+ "digestAlgorithm": "sha256",
1068
+ "canonicalization": "rfc8785",
1069
+ "registryVersion": "1.0.0",
1070
+ "primitives": [
1071
+ "node",
1072
+ "relation",
1073
+ "group",
1074
+ "lane",
1075
+ "event",
1076
+ "series",
1077
+ "axis",
1078
+ "set",
1079
+ "annotation",
1080
+ "emphasis"
1081
+ ],
1082
+ "layoutFamilies": [
1083
+ "cause-effect",
1084
+ "chart",
1085
+ "chronology",
1086
+ "containment",
1087
+ "entity",
1088
+ "graph",
1089
+ "hierarchy",
1090
+ "lanes",
1091
+ "sankey",
1092
+ "wardley"
1093
+ ],
1094
+ "grammars": [
1095
+ {
1096
+ "grammarId": "architecture",
1097
+ "grammarVersion": "1.0.0",
1098
+ "title": "Architecture",
1099
+ "summary": "Architecture semantic grammar using the graph layout family.",
1100
+ "layoutFamily": "graph",
1101
+ "aliases": [
1102
+ "system architecture",
1103
+ "software architecture",
1104
+ "components"
1105
+ ],
1106
+ "requiredPrimitives": [
1107
+ "node"
1108
+ ],
1109
+ "allowedPrimitives": [
1110
+ "node",
1111
+ "relation",
1112
+ "group",
1113
+ "annotation",
1114
+ "emphasis"
1115
+ ],
1116
+ "directions": [
1117
+ "top-down",
1118
+ "left-right",
1119
+ "right-left",
1120
+ "bottom-up",
1121
+ "radial"
1122
+ ],
1123
+ "detailLimits": {
1124
+ "simplified": 7,
1125
+ "balanced": 12,
1126
+ "faithful": 24,
1127
+ "hard": 24
1128
+ },
1129
+ "readability": {
1130
+ "maxLabelCharacters": 80,
1131
+ "maxCrossings": 12,
1132
+ "maxFanIn": 6,
1133
+ "minTextSize": 12,
1134
+ "aspectRatios": [
1135
+ "fit",
1136
+ "doc-wide",
1137
+ "slide-16x9"
1138
+ ]
1139
+ },
1140
+ "projections": {
1141
+ "mermaid": "partial",
1142
+ "excalidraw": "editable"
1143
+ },
1144
+ "fixture": "fixtures/diagram/grammars/architecture.planr-diagram.json",
1145
+ "reference": "references/diagram/architecture.md",
1146
+ "rendererContract": {
1147
+ "layoutFamily": "graph",
1148
+ "contractVersion": "1.0.0",
1149
+ "staticByDefault": true
1150
+ },
1151
+ "accessibilityTemplate": {
1152
+ "title": "Architecture diagram",
1153
+ "description": "Diagram content for the architecture grammar in semantic reading order."
1154
+ }
1155
+ },
1156
+ {
1157
+ "grammarId": "it-current-state",
1158
+ "grammarVersion": "1.0.0",
1159
+ "title": "IT current state",
1160
+ "summary": "IT current state semantic grammar using the graph layout family.",
1161
+ "layoutFamily": "graph",
1162
+ "aliases": [
1163
+ "legacy landscape",
1164
+ "current state",
1165
+ "modernization"
1166
+ ],
1167
+ "requiredPrimitives": [
1168
+ "node"
1169
+ ],
1170
+ "allowedPrimitives": [
1171
+ "node",
1172
+ "relation",
1173
+ "group",
1174
+ "annotation",
1175
+ "emphasis"
1176
+ ],
1177
+ "directions": [
1178
+ "top-down",
1179
+ "left-right",
1180
+ "right-left",
1181
+ "bottom-up",
1182
+ "radial"
1183
+ ],
1184
+ "detailLimits": {
1185
+ "simplified": 7,
1186
+ "balanced": 12,
1187
+ "faithful": 24,
1188
+ "hard": 24
1189
+ },
1190
+ "readability": {
1191
+ "maxLabelCharacters": 80,
1192
+ "maxCrossings": 12,
1193
+ "maxFanIn": 6,
1194
+ "minTextSize": 12,
1195
+ "aspectRatios": [
1196
+ "fit",
1197
+ "doc-wide",
1198
+ "slide-16x9"
1199
+ ]
1200
+ },
1201
+ "projections": {
1202
+ "mermaid": "partial",
1203
+ "excalidraw": "editable"
1204
+ },
1205
+ "fixture": "fixtures/diagram/grammars/it-current-state.planr-diagram.json",
1206
+ "reference": "references/diagram/it-current-state.md",
1207
+ "rendererContract": {
1208
+ "layoutFamily": "graph",
1209
+ "contractVersion": "1.0.0",
1210
+ "staticByDefault": true
1211
+ },
1212
+ "accessibilityTemplate": {
1213
+ "title": "IT current state diagram",
1214
+ "description": "Diagram content for the it current state grammar in semantic reading order."
1215
+ }
1216
+ },
1217
+ {
1218
+ "grammarId": "flowchart",
1219
+ "grammarVersion": "1.0.0",
1220
+ "title": "Flowchart",
1221
+ "summary": "Flowchart semantic grammar using the graph layout family.",
1222
+ "layoutFamily": "graph",
1223
+ "aliases": [
1224
+ "decision flow",
1225
+ "workflow",
1226
+ "process flow"
1227
+ ],
1228
+ "requiredPrimitives": [
1229
+ "node"
1230
+ ],
1231
+ "allowedPrimitives": [
1232
+ "node",
1233
+ "relation",
1234
+ "group",
1235
+ "annotation",
1236
+ "emphasis"
1237
+ ],
1238
+ "directions": [
1239
+ "top-down",
1240
+ "left-right",
1241
+ "right-left",
1242
+ "bottom-up",
1243
+ "radial"
1244
+ ],
1245
+ "detailLimits": {
1246
+ "simplified": 7,
1247
+ "balanced": 12,
1248
+ "faithful": 24,
1249
+ "hard": 24
1250
+ },
1251
+ "readability": {
1252
+ "maxLabelCharacters": 80,
1253
+ "maxCrossings": 12,
1254
+ "maxFanIn": 6,
1255
+ "minTextSize": 12,
1256
+ "aspectRatios": [
1257
+ "fit",
1258
+ "doc-wide",
1259
+ "slide-16x9"
1260
+ ]
1261
+ },
1262
+ "projections": {
1263
+ "mermaid": "editable",
1264
+ "excalidraw": "editable"
1265
+ },
1266
+ "fixture": "fixtures/diagram/grammars/flowchart.planr-diagram.json",
1267
+ "reference": "references/diagram/flowchart.md",
1268
+ "rendererContract": {
1269
+ "layoutFamily": "graph",
1270
+ "contractVersion": "1.0.0",
1271
+ "staticByDefault": true
1272
+ },
1273
+ "accessibilityTemplate": {
1274
+ "title": "Flowchart diagram",
1275
+ "description": "Diagram content for the flowchart grammar in semantic reading order."
1276
+ }
1277
+ },
1278
+ {
1279
+ "grammarId": "sequence",
1280
+ "grammarVersion": "1.0.0",
1281
+ "title": "Sequence",
1282
+ "summary": "Sequence semantic grammar using the chronology layout family.",
1283
+ "layoutFamily": "chronology",
1284
+ "aliases": [
1285
+ "message sequence",
1286
+ "interaction sequence",
1287
+ "request trace"
1288
+ ],
1289
+ "requiredPrimitives": [
1290
+ "node",
1291
+ "relation",
1292
+ "event"
1293
+ ],
1294
+ "allowedPrimitives": [
1295
+ "node",
1296
+ "relation",
1297
+ "event",
1298
+ "annotation",
1299
+ "emphasis"
1300
+ ],
1301
+ "directions": [
1302
+ "top-down",
1303
+ "left-right",
1304
+ "right-left",
1305
+ "bottom-up",
1306
+ "radial"
1307
+ ],
1308
+ "detailLimits": {
1309
+ "simplified": 7,
1310
+ "balanced": 12,
1311
+ "faithful": 24,
1312
+ "hard": 24
1313
+ },
1314
+ "readability": {
1315
+ "maxLabelCharacters": 80,
1316
+ "maxCrossings": 12,
1317
+ "maxFanIn": 6,
1318
+ "minTextSize": 12,
1319
+ "aspectRatios": [
1320
+ "fit",
1321
+ "doc-wide",
1322
+ "slide-16x9"
1323
+ ]
1324
+ },
1325
+ "projections": {
1326
+ "mermaid": "editable",
1327
+ "excalidraw": "editable"
1328
+ },
1329
+ "fixture": "fixtures/diagram/grammars/sequence.planr-diagram.json",
1330
+ "reference": "references/diagram/sequence.md",
1331
+ "rendererContract": {
1332
+ "layoutFamily": "chronology",
1333
+ "contractVersion": "1.0.0",
1334
+ "staticByDefault": true
1335
+ },
1336
+ "accessibilityTemplate": {
1337
+ "title": "Sequence diagram",
1338
+ "description": "Diagram content for the sequence grammar in semantic reading order."
1339
+ }
1340
+ },
1341
+ {
1342
+ "grammarId": "state-machine",
1343
+ "grammarVersion": "1.0.0",
1344
+ "title": "State machine",
1345
+ "summary": "State machine semantic grammar using the graph layout family.",
1346
+ "layoutFamily": "graph",
1347
+ "aliases": [
1348
+ "state diagram",
1349
+ "lifecycle states",
1350
+ "transitions"
1351
+ ],
1352
+ "requiredPrimitives": [
1353
+ "node"
1354
+ ],
1355
+ "allowedPrimitives": [
1356
+ "node",
1357
+ "relation",
1358
+ "group",
1359
+ "annotation",
1360
+ "emphasis"
1361
+ ],
1362
+ "directions": [
1363
+ "top-down",
1364
+ "left-right",
1365
+ "right-left",
1366
+ "bottom-up",
1367
+ "radial"
1368
+ ],
1369
+ "detailLimits": {
1370
+ "simplified": 7,
1371
+ "balanced": 12,
1372
+ "faithful": 24,
1373
+ "hard": 24
1374
+ },
1375
+ "readability": {
1376
+ "maxLabelCharacters": 80,
1377
+ "maxCrossings": 12,
1378
+ "maxFanIn": 6,
1379
+ "minTextSize": 12,
1380
+ "aspectRatios": [
1381
+ "fit",
1382
+ "doc-wide",
1383
+ "slide-16x9"
1384
+ ]
1385
+ },
1386
+ "projections": {
1387
+ "mermaid": "editable",
1388
+ "excalidraw": "editable"
1389
+ },
1390
+ "fixture": "fixtures/diagram/grammars/state-machine.planr-diagram.json",
1391
+ "reference": "references/diagram/state-machine.md",
1392
+ "rendererContract": {
1393
+ "layoutFamily": "graph",
1394
+ "contractVersion": "1.0.0",
1395
+ "staticByDefault": true
1396
+ },
1397
+ "accessibilityTemplate": {
1398
+ "title": "State machine diagram",
1399
+ "description": "Diagram content for the state machine grammar in semantic reading order."
1400
+ }
1401
+ },
1402
+ {
1403
+ "grammarId": "er-data-model",
1404
+ "grammarVersion": "1.0.0",
1405
+ "title": "ER data model",
1406
+ "summary": "ER data model semantic grammar using the entity layout family.",
1407
+ "layoutFamily": "entity",
1408
+ "aliases": [
1409
+ "entity relationship",
1410
+ "logical data model",
1411
+ "er diagram"
1412
+ ],
1413
+ "requiredPrimitives": [
1414
+ "node"
1415
+ ],
1416
+ "allowedPrimitives": [
1417
+ "node",
1418
+ "relation",
1419
+ "group",
1420
+ "annotation",
1421
+ "emphasis"
1422
+ ],
1423
+ "directions": [
1424
+ "top-down",
1425
+ "left-right",
1426
+ "right-left",
1427
+ "bottom-up",
1428
+ "radial"
1429
+ ],
1430
+ "detailLimits": {
1431
+ "simplified": 7,
1432
+ "balanced": 12,
1433
+ "faithful": 24,
1434
+ "hard": 24
1435
+ },
1436
+ "readability": {
1437
+ "maxLabelCharacters": 80,
1438
+ "maxCrossings": 12,
1439
+ "maxFanIn": 6,
1440
+ "minTextSize": 12,
1441
+ "aspectRatios": [
1442
+ "fit",
1443
+ "doc-wide",
1444
+ "slide-16x9"
1445
+ ]
1446
+ },
1447
+ "projections": {
1448
+ "mermaid": "editable",
1449
+ "excalidraw": "editable"
1450
+ },
1451
+ "fixture": "fixtures/diagram/grammars/er-data-model.planr-diagram.json",
1452
+ "reference": "references/diagram/er-data-model.md",
1453
+ "rendererContract": {
1454
+ "layoutFamily": "entity",
1455
+ "contractVersion": "1.0.0",
1456
+ "staticByDefault": true
1457
+ },
1458
+ "accessibilityTemplate": {
1459
+ "title": "ER data model diagram",
1460
+ "description": "Diagram content for the er data model grammar in semantic reading order."
1461
+ }
1462
+ },
1463
+ {
1464
+ "grammarId": "timeline",
1465
+ "grammarVersion": "1.0.0",
1466
+ "title": "Timeline",
1467
+ "summary": "Timeline semantic grammar using the chronology layout family.",
1468
+ "layoutFamily": "chronology",
1469
+ "aliases": [
1470
+ "milestones",
1471
+ "history",
1472
+ "roadmap"
1473
+ ],
1474
+ "requiredPrimitives": [
1475
+ "event"
1476
+ ],
1477
+ "allowedPrimitives": [
1478
+ "node",
1479
+ "relation",
1480
+ "event",
1481
+ "annotation",
1482
+ "emphasis"
1483
+ ],
1484
+ "directions": [
1485
+ "top-down",
1486
+ "left-right",
1487
+ "right-left",
1488
+ "bottom-up",
1489
+ "radial"
1490
+ ],
1491
+ "detailLimits": {
1492
+ "simplified": 7,
1493
+ "balanced": 12,
1494
+ "faithful": 24,
1495
+ "hard": 24
1496
+ },
1497
+ "readability": {
1498
+ "maxLabelCharacters": 80,
1499
+ "maxCrossings": 12,
1500
+ "maxFanIn": 6,
1501
+ "minTextSize": 12,
1502
+ "aspectRatios": [
1503
+ "fit",
1504
+ "doc-wide",
1505
+ "slide-16x9"
1506
+ ]
1507
+ },
1508
+ "projections": {
1509
+ "mermaid": "partial",
1510
+ "excalidraw": "editable"
1511
+ },
1512
+ "fixture": "fixtures/diagram/grammars/timeline.planr-diagram.json",
1513
+ "reference": "references/diagram/timeline.md",
1514
+ "rendererContract": {
1515
+ "layoutFamily": "chronology",
1516
+ "contractVersion": "1.0.0",
1517
+ "staticByDefault": true
1518
+ },
1519
+ "accessibilityTemplate": {
1520
+ "title": "Timeline diagram",
1521
+ "description": "Diagram content for the timeline grammar in semantic reading order."
1522
+ }
1523
+ },
1524
+ {
1525
+ "grammarId": "swimlane",
1526
+ "grammarVersion": "1.0.0",
1527
+ "title": "Swimlane",
1528
+ "summary": "Swimlane semantic grammar using the lanes layout family.",
1529
+ "layoutFamily": "lanes",
1530
+ "aliases": [
1531
+ "cross functional",
1532
+ "handoff flow",
1533
+ "responsibility lanes"
1534
+ ],
1535
+ "requiredPrimitives": [
1536
+ "node",
1537
+ "lane"
1538
+ ],
1539
+ "allowedPrimitives": [
1540
+ "node",
1541
+ "relation",
1542
+ "lane",
1543
+ "event",
1544
+ "annotation",
1545
+ "emphasis"
1546
+ ],
1547
+ "directions": [
1548
+ "top-down",
1549
+ "left-right",
1550
+ "right-left",
1551
+ "bottom-up",
1552
+ "radial"
1553
+ ],
1554
+ "detailLimits": {
1555
+ "simplified": 7,
1556
+ "balanced": 12,
1557
+ "faithful": 24,
1558
+ "hard": 24
1559
+ },
1560
+ "readability": {
1561
+ "maxLabelCharacters": 80,
1562
+ "maxCrossings": 12,
1563
+ "maxFanIn": 6,
1564
+ "minTextSize": 12,
1565
+ "aspectRatios": [
1566
+ "fit",
1567
+ "doc-wide",
1568
+ "slide-16x9"
1569
+ ]
1570
+ },
1571
+ "projections": {
1572
+ "mermaid": "partial",
1573
+ "excalidraw": "editable"
1574
+ },
1575
+ "fixture": "fixtures/diagram/grammars/swimlane.planr-diagram.json",
1576
+ "reference": "references/diagram/swimlane.md",
1577
+ "rendererContract": {
1578
+ "layoutFamily": "lanes",
1579
+ "contractVersion": "1.0.0",
1580
+ "staticByDefault": true
1581
+ },
1582
+ "accessibilityTemplate": {
1583
+ "title": "Swimlane diagram",
1584
+ "description": "Diagram content for the swimlane grammar in semantic reading order."
1585
+ }
1586
+ },
1587
+ {
1588
+ "grammarId": "quadrant",
1589
+ "grammarVersion": "1.0.0",
1590
+ "title": "Quadrant",
1591
+ "summary": "Quadrant semantic grammar using the chart layout family.",
1592
+ "layoutFamily": "chart",
1593
+ "aliases": [
1594
+ "two axis matrix",
1595
+ "impact effort",
1596
+ "four quadrants"
1597
+ ],
1598
+ "requiredPrimitives": [
1599
+ "node",
1600
+ "axis"
1601
+ ],
1602
+ "allowedPrimitives": [
1603
+ "node",
1604
+ "series",
1605
+ "axis",
1606
+ "annotation",
1607
+ "emphasis"
1608
+ ],
1609
+ "directions": [
1610
+ "radial"
1611
+ ],
1612
+ "detailLimits": {
1613
+ "simplified": 7,
1614
+ "balanced": 12,
1615
+ "faithful": 24,
1616
+ "hard": 24
1617
+ },
1618
+ "readability": {
1619
+ "maxLabelCharacters": 80,
1620
+ "maxCrossings": 12,
1621
+ "maxFanIn": 6,
1622
+ "minTextSize": 12,
1623
+ "aspectRatios": [
1624
+ "fit",
1625
+ "doc-wide",
1626
+ "slide-16x9"
1627
+ ]
1628
+ },
1629
+ "projections": {
1630
+ "mermaid": "partial",
1631
+ "excalidraw": "editable"
1632
+ },
1633
+ "fixture": "fixtures/diagram/grammars/quadrant.planr-diagram.json",
1634
+ "reference": "references/diagram/quadrant.md",
1635
+ "rendererContract": {
1636
+ "layoutFamily": "chart",
1637
+ "contractVersion": "1.0.0",
1638
+ "staticByDefault": true
1639
+ },
1640
+ "accessibilityTemplate": {
1641
+ "title": "Quadrant diagram",
1642
+ "description": "Diagram content for the quadrant grammar in semantic reading order."
1643
+ }
1644
+ },
1645
+ {
1646
+ "grammarId": "radar",
1647
+ "grammarVersion": "1.0.0",
1648
+ "title": "Radar chart",
1649
+ "summary": "Radar chart semantic grammar using the chart layout family.",
1650
+ "layoutFamily": "chart",
1651
+ "aliases": [
1652
+ "spider chart",
1653
+ "multi axis comparison"
1654
+ ],
1655
+ "requiredPrimitives": [
1656
+ "series",
1657
+ "axis"
1658
+ ],
1659
+ "allowedPrimitives": [
1660
+ "node",
1661
+ "series",
1662
+ "axis",
1663
+ "annotation",
1664
+ "emphasis"
1665
+ ],
1666
+ "directions": [
1667
+ "radial"
1668
+ ],
1669
+ "detailLimits": {
1670
+ "simplified": 7,
1671
+ "balanced": 12,
1672
+ "faithful": 24,
1673
+ "hard": 24
1674
+ },
1675
+ "readability": {
1676
+ "maxLabelCharacters": 80,
1677
+ "maxCrossings": 12,
1678
+ "maxFanIn": 6,
1679
+ "minTextSize": 12,
1680
+ "aspectRatios": [
1681
+ "fit",
1682
+ "doc-wide",
1683
+ "slide-16x9"
1684
+ ]
1685
+ },
1686
+ "projections": {
1687
+ "mermaid": "unsupported",
1688
+ "excalidraw": "editable"
1689
+ },
1690
+ "fixture": "fixtures/diagram/grammars/radar.planr-diagram.json",
1691
+ "reference": "references/diagram/radar.md",
1692
+ "rendererContract": {
1693
+ "layoutFamily": "chart",
1694
+ "contractVersion": "1.0.0",
1695
+ "staticByDefault": true
1696
+ },
1697
+ "accessibilityTemplate": {
1698
+ "title": "Radar chart diagram",
1699
+ "description": "Diagram content for the radar chart grammar in semantic reading order."
1700
+ }
1701
+ },
1702
+ {
1703
+ "grammarId": "polar",
1704
+ "grammarVersion": "1.0.0",
1705
+ "title": "Polar chart",
1706
+ "summary": "Polar chart semantic grammar using the chart layout family.",
1707
+ "layoutFamily": "chart",
1708
+ "aliases": [
1709
+ "polar area",
1710
+ "cyclic magnitude"
1711
+ ],
1712
+ "requiredPrimitives": [
1713
+ "series",
1714
+ "axis"
1715
+ ],
1716
+ "allowedPrimitives": [
1717
+ "node",
1718
+ "series",
1719
+ "axis",
1720
+ "annotation",
1721
+ "emphasis"
1722
+ ],
1723
+ "directions": [
1724
+ "radial"
1725
+ ],
1726
+ "detailLimits": {
1727
+ "simplified": 7,
1728
+ "balanced": 12,
1729
+ "faithful": 24,
1730
+ "hard": 24
1731
+ },
1732
+ "readability": {
1733
+ "maxLabelCharacters": 80,
1734
+ "maxCrossings": 12,
1735
+ "maxFanIn": 6,
1736
+ "minTextSize": 12,
1737
+ "aspectRatios": [
1738
+ "fit",
1739
+ "doc-wide",
1740
+ "slide-16x9"
1741
+ ]
1742
+ },
1743
+ "projections": {
1744
+ "mermaid": "unsupported",
1745
+ "excalidraw": "editable"
1746
+ },
1747
+ "fixture": "fixtures/diagram/grammars/polar.planr-diagram.json",
1748
+ "reference": "references/diagram/polar.md",
1749
+ "rendererContract": {
1750
+ "layoutFamily": "chart",
1751
+ "contractVersion": "1.0.0",
1752
+ "staticByDefault": true
1753
+ },
1754
+ "accessibilityTemplate": {
1755
+ "title": "Polar chart diagram",
1756
+ "description": "Diagram content for the polar chart grammar in semantic reading order."
1757
+ }
1758
+ },
1759
+ {
1760
+ "grammarId": "loop-flywheel",
1761
+ "grammarVersion": "1.0.0",
1762
+ "title": "Loop and flywheel",
1763
+ "summary": "Loop and flywheel semantic grammar using the graph layout family.",
1764
+ "layoutFamily": "graph",
1765
+ "aliases": [
1766
+ "flywheel",
1767
+ "reinforcing loop",
1768
+ "feedback loop"
1769
+ ],
1770
+ "requiredPrimitives": [
1771
+ "node"
1772
+ ],
1773
+ "allowedPrimitives": [
1774
+ "node",
1775
+ "relation",
1776
+ "group",
1777
+ "annotation",
1778
+ "emphasis"
1779
+ ],
1780
+ "directions": [
1781
+ "radial"
1782
+ ],
1783
+ "detailLimits": {
1784
+ "simplified": 7,
1785
+ "balanced": 12,
1786
+ "faithful": 24,
1787
+ "hard": 24
1788
+ },
1789
+ "readability": {
1790
+ "maxLabelCharacters": 80,
1791
+ "maxCrossings": 12,
1792
+ "maxFanIn": 6,
1793
+ "minTextSize": 12,
1794
+ "aspectRatios": [
1795
+ "fit",
1796
+ "doc-wide",
1797
+ "slide-16x9"
1798
+ ]
1799
+ },
1800
+ "projections": {
1801
+ "mermaid": "partial",
1802
+ "excalidraw": "editable"
1803
+ },
1804
+ "fixture": "fixtures/diagram/grammars/loop-flywheel.planr-diagram.json",
1805
+ "reference": "references/diagram/loop-flywheel.md",
1806
+ "rendererContract": {
1807
+ "layoutFamily": "graph",
1808
+ "contractVersion": "1.0.0",
1809
+ "staticByDefault": true
1810
+ },
1811
+ "accessibilityTemplate": {
1812
+ "title": "Loop and flywheel diagram",
1813
+ "description": "Diagram content for the loop and flywheel grammar in semantic reading order."
1814
+ }
1815
+ },
1816
+ {
1817
+ "grammarId": "nested",
1818
+ "grammarVersion": "1.0.0",
1819
+ "title": "Nested containment",
1820
+ "summary": "Nested containment semantic grammar using the containment layout family.",
1821
+ "layoutFamily": "containment",
1822
+ "aliases": [
1823
+ "nested boxes",
1824
+ "containment map"
1825
+ ],
1826
+ "requiredPrimitives": [
1827
+ "node",
1828
+ "group"
1829
+ ],
1830
+ "allowedPrimitives": [
1831
+ "node",
1832
+ "relation",
1833
+ "group",
1834
+ "set",
1835
+ "annotation",
1836
+ "emphasis"
1837
+ ],
1838
+ "directions": [
1839
+ "top-down",
1840
+ "left-right",
1841
+ "right-left",
1842
+ "bottom-up",
1843
+ "radial"
1844
+ ],
1845
+ "detailLimits": {
1846
+ "simplified": 7,
1847
+ "balanced": 12,
1848
+ "faithful": 24,
1849
+ "hard": 24
1850
+ },
1851
+ "readability": {
1852
+ "maxLabelCharacters": 80,
1853
+ "maxCrossings": 12,
1854
+ "maxFanIn": 6,
1855
+ "minTextSize": 12,
1856
+ "aspectRatios": [
1857
+ "fit",
1858
+ "doc-wide",
1859
+ "slide-16x9"
1860
+ ]
1861
+ },
1862
+ "projections": {
1863
+ "mermaid": "partial",
1864
+ "excalidraw": "editable"
1865
+ },
1866
+ "fixture": "fixtures/diagram/grammars/nested.planr-diagram.json",
1867
+ "reference": "references/diagram/nested.md",
1868
+ "rendererContract": {
1869
+ "layoutFamily": "containment",
1870
+ "contractVersion": "1.0.0",
1871
+ "staticByDefault": true
1872
+ },
1873
+ "accessibilityTemplate": {
1874
+ "title": "Nested containment diagram",
1875
+ "description": "Diagram content for the nested containment grammar in semantic reading order."
1876
+ }
1877
+ },
1878
+ {
1879
+ "grammarId": "tree",
1880
+ "grammarVersion": "1.0.0",
1881
+ "title": "Tree",
1882
+ "summary": "Tree semantic grammar using the hierarchy layout family.",
1883
+ "layoutFamily": "hierarchy",
1884
+ "aliases": [
1885
+ "hierarchy tree",
1886
+ "parent child"
1887
+ ],
1888
+ "requiredPrimitives": [
1889
+ "node"
1890
+ ],
1891
+ "allowedPrimitives": [
1892
+ "node",
1893
+ "relation",
1894
+ "group",
1895
+ "annotation",
1896
+ "emphasis"
1897
+ ],
1898
+ "directions": [
1899
+ "top-down",
1900
+ "left-right",
1901
+ "right-left",
1902
+ "bottom-up",
1903
+ "radial"
1904
+ ],
1905
+ "detailLimits": {
1906
+ "simplified": 7,
1907
+ "balanced": 12,
1908
+ "faithful": 24,
1909
+ "hard": 24
1910
+ },
1911
+ "readability": {
1912
+ "maxLabelCharacters": 80,
1913
+ "maxCrossings": 12,
1914
+ "maxFanIn": 6,
1915
+ "minTextSize": 12,
1916
+ "aspectRatios": [
1917
+ "fit",
1918
+ "doc-wide",
1919
+ "slide-16x9"
1920
+ ]
1921
+ },
1922
+ "projections": {
1923
+ "mermaid": "editable",
1924
+ "excalidraw": "editable"
1925
+ },
1926
+ "fixture": "fixtures/diagram/grammars/tree.planr-diagram.json",
1927
+ "reference": "references/diagram/tree.md",
1928
+ "rendererContract": {
1929
+ "layoutFamily": "hierarchy",
1930
+ "contractVersion": "1.0.0",
1931
+ "staticByDefault": true
1932
+ },
1933
+ "accessibilityTemplate": {
1934
+ "title": "Tree diagram",
1935
+ "description": "Diagram content for the tree grammar in semantic reading order."
1936
+ }
1937
+ },
1938
+ {
1939
+ "grammarId": "org-chart",
1940
+ "grammarVersion": "1.0.0",
1941
+ "title": "Organization chart",
1942
+ "summary": "Organization chart semantic grammar using the hierarchy layout family.",
1943
+ "layoutFamily": "hierarchy",
1944
+ "aliases": [
1945
+ "org chart",
1946
+ "reporting lines",
1947
+ "team structure"
1948
+ ],
1949
+ "requiredPrimitives": [
1950
+ "node"
1951
+ ],
1952
+ "allowedPrimitives": [
1953
+ "node",
1954
+ "relation",
1955
+ "group",
1956
+ "annotation",
1957
+ "emphasis"
1958
+ ],
1959
+ "directions": [
1960
+ "top-down",
1961
+ "left-right",
1962
+ "right-left",
1963
+ "bottom-up",
1964
+ "radial"
1965
+ ],
1966
+ "detailLimits": {
1967
+ "simplified": 7,
1968
+ "balanced": 12,
1969
+ "faithful": 24,
1970
+ "hard": 24
1971
+ },
1972
+ "readability": {
1973
+ "maxLabelCharacters": 80,
1974
+ "maxCrossings": 12,
1975
+ "maxFanIn": 6,
1976
+ "minTextSize": 12,
1977
+ "aspectRatios": [
1978
+ "fit",
1979
+ "doc-wide",
1980
+ "slide-16x9"
1981
+ ]
1982
+ },
1983
+ "projections": {
1984
+ "mermaid": "partial",
1985
+ "excalidraw": "editable"
1986
+ },
1987
+ "fixture": "fixtures/diagram/grammars/org-chart.planr-diagram.json",
1988
+ "reference": "references/diagram/org-chart.md",
1989
+ "rendererContract": {
1990
+ "layoutFamily": "hierarchy",
1991
+ "contractVersion": "1.0.0",
1992
+ "staticByDefault": true
1993
+ },
1994
+ "accessibilityTemplate": {
1995
+ "title": "Organization chart diagram",
1996
+ "description": "Diagram content for the organization chart grammar in semantic reading order."
1997
+ }
1998
+ },
1999
+ {
2000
+ "grammarId": "layer-stack",
2001
+ "grammarVersion": "1.0.0",
2002
+ "title": "Layer stack",
2003
+ "summary": "Layer stack semantic grammar using the hierarchy layout family.",
2004
+ "layoutFamily": "hierarchy",
2005
+ "aliases": [
2006
+ "layered architecture",
2007
+ "stacked abstractions"
2008
+ ],
2009
+ "requiredPrimitives": [
2010
+ "node"
2011
+ ],
2012
+ "allowedPrimitives": [
2013
+ "node",
2014
+ "relation",
2015
+ "group",
2016
+ "annotation",
2017
+ "emphasis"
2018
+ ],
2019
+ "directions": [
2020
+ "top-down",
2021
+ "left-right",
2022
+ "right-left",
2023
+ "bottom-up",
2024
+ "radial"
2025
+ ],
2026
+ "detailLimits": {
2027
+ "simplified": 7,
2028
+ "balanced": 12,
2029
+ "faithful": 24,
2030
+ "hard": 24
2031
+ },
2032
+ "readability": {
2033
+ "maxLabelCharacters": 80,
2034
+ "maxCrossings": 12,
2035
+ "maxFanIn": 6,
2036
+ "minTextSize": 12,
2037
+ "aspectRatios": [
2038
+ "fit",
2039
+ "doc-wide",
2040
+ "slide-16x9"
2041
+ ]
2042
+ },
2043
+ "projections": {
2044
+ "mermaid": "partial",
2045
+ "excalidraw": "editable"
2046
+ },
2047
+ "fixture": "fixtures/diagram/grammars/layer-stack.planr-diagram.json",
2048
+ "reference": "references/diagram/layer-stack.md",
2049
+ "rendererContract": {
2050
+ "layoutFamily": "hierarchy",
2051
+ "contractVersion": "1.0.0",
2052
+ "staticByDefault": true
2053
+ },
2054
+ "accessibilityTemplate": {
2055
+ "title": "Layer stack diagram",
2056
+ "description": "Diagram content for the layer stack grammar in semantic reading order."
2057
+ }
2058
+ },
2059
+ {
2060
+ "grammarId": "venn",
2061
+ "grammarVersion": "1.0.0",
2062
+ "title": "Venn",
2063
+ "summary": "Venn semantic grammar using the containment layout family.",
2064
+ "layoutFamily": "containment",
2065
+ "aliases": [
2066
+ "set overlap",
2067
+ "venn diagram"
2068
+ ],
2069
+ "requiredPrimitives": [
2070
+ "set"
2071
+ ],
2072
+ "allowedPrimitives": [
2073
+ "node",
2074
+ "relation",
2075
+ "group",
2076
+ "set",
2077
+ "annotation",
2078
+ "emphasis"
2079
+ ],
2080
+ "directions": [
2081
+ "radial"
2082
+ ],
2083
+ "detailLimits": {
2084
+ "simplified": 7,
2085
+ "balanced": 12,
2086
+ "faithful": 24,
2087
+ "hard": 24
2088
+ },
2089
+ "readability": {
2090
+ "maxLabelCharacters": 80,
2091
+ "maxCrossings": 12,
2092
+ "maxFanIn": 6,
2093
+ "minTextSize": 12,
2094
+ "aspectRatios": [
2095
+ "fit",
2096
+ "doc-wide",
2097
+ "slide-16x9"
2098
+ ]
2099
+ },
2100
+ "projections": {
2101
+ "mermaid": "unsupported",
2102
+ "excalidraw": "editable"
2103
+ },
2104
+ "fixture": "fixtures/diagram/grammars/venn.planr-diagram.json",
2105
+ "reference": "references/diagram/venn.md",
2106
+ "rendererContract": {
2107
+ "layoutFamily": "containment",
2108
+ "contractVersion": "1.0.0",
2109
+ "staticByDefault": true
2110
+ },
2111
+ "accessibilityTemplate": {
2112
+ "title": "Venn diagram",
2113
+ "description": "Diagram content for the venn grammar in semantic reading order."
2114
+ }
2115
+ },
2116
+ {
2117
+ "grammarId": "pyramid-funnel",
2118
+ "grammarVersion": "1.0.0",
2119
+ "title": "Pyramid and funnel",
2120
+ "summary": "Pyramid and funnel semantic grammar using the hierarchy layout family.",
2121
+ "layoutFamily": "hierarchy",
2122
+ "aliases": [
2123
+ "pyramid",
2124
+ "funnel",
2125
+ "ranked hierarchy"
2126
+ ],
2127
+ "requiredPrimitives": [
2128
+ "node"
2129
+ ],
2130
+ "allowedPrimitives": [
2131
+ "node",
2132
+ "relation",
2133
+ "group",
2134
+ "annotation",
2135
+ "emphasis"
2136
+ ],
2137
+ "directions": [
2138
+ "top-down",
2139
+ "left-right",
2140
+ "right-left",
2141
+ "bottom-up",
2142
+ "radial"
2143
+ ],
2144
+ "detailLimits": {
2145
+ "simplified": 7,
2146
+ "balanced": 12,
2147
+ "faithful": 24,
2148
+ "hard": 24
2149
+ },
2150
+ "readability": {
2151
+ "maxLabelCharacters": 80,
2152
+ "maxCrossings": 12,
2153
+ "maxFanIn": 6,
2154
+ "minTextSize": 12,
2155
+ "aspectRatios": [
2156
+ "fit",
2157
+ "doc-wide",
2158
+ "slide-16x9"
2159
+ ]
2160
+ },
2161
+ "projections": {
2162
+ "mermaid": "partial",
2163
+ "excalidraw": "editable"
2164
+ },
2165
+ "fixture": "fixtures/diagram/grammars/pyramid-funnel.planr-diagram.json",
2166
+ "reference": "references/diagram/pyramid-funnel.md",
2167
+ "rendererContract": {
2168
+ "layoutFamily": "hierarchy",
2169
+ "contractVersion": "1.0.0",
2170
+ "staticByDefault": true
2171
+ },
2172
+ "accessibilityTemplate": {
2173
+ "title": "Pyramid and funnel diagram",
2174
+ "description": "Diagram content for the pyramid and funnel grammar in semantic reading order."
2175
+ }
2176
+ },
2177
+ {
2178
+ "grammarId": "bar",
2179
+ "grammarVersion": "1.0.0",
2180
+ "title": "Bar chart",
2181
+ "summary": "Bar chart semantic grammar using the chart layout family.",
2182
+ "layoutFamily": "chart",
2183
+ "aliases": [
2184
+ "bar graph",
2185
+ "categorical comparison"
2186
+ ],
2187
+ "requiredPrimitives": [
2188
+ "series",
2189
+ "axis"
2190
+ ],
2191
+ "allowedPrimitives": [
2192
+ "node",
2193
+ "series",
2194
+ "axis",
2195
+ "annotation",
2196
+ "emphasis"
2197
+ ],
2198
+ "directions": [
2199
+ "top-down",
2200
+ "left-right",
2201
+ "right-left",
2202
+ "bottom-up",
2203
+ "radial"
2204
+ ],
2205
+ "detailLimits": {
2206
+ "simplified": 7,
2207
+ "balanced": 12,
2208
+ "faithful": 24,
2209
+ "hard": 24
2210
+ },
2211
+ "readability": {
2212
+ "maxLabelCharacters": 80,
2213
+ "maxCrossings": 12,
2214
+ "maxFanIn": 6,
2215
+ "minTextSize": 12,
2216
+ "aspectRatios": [
2217
+ "fit",
2218
+ "doc-wide",
2219
+ "slide-16x9"
2220
+ ]
2221
+ },
2222
+ "projections": {
2223
+ "mermaid": "unsupported",
2224
+ "excalidraw": "editable"
2225
+ },
2226
+ "fixture": "fixtures/diagram/grammars/bar.planr-diagram.json",
2227
+ "reference": "references/diagram/bar.md",
2228
+ "rendererContract": {
2229
+ "layoutFamily": "chart",
2230
+ "contractVersion": "1.0.0",
2231
+ "staticByDefault": true
2232
+ },
2233
+ "accessibilityTemplate": {
2234
+ "title": "Bar chart diagram",
2235
+ "description": "Diagram content for the bar chart grammar in semantic reading order."
2236
+ }
2237
+ },
2238
+ {
2239
+ "grammarId": "treemap",
2240
+ "grammarVersion": "1.0.0",
2241
+ "title": "Treemap",
2242
+ "summary": "Treemap semantic grammar using the containment layout family.",
2243
+ "layoutFamily": "containment",
2244
+ "aliases": [
2245
+ "part of whole",
2246
+ "area hierarchy"
2247
+ ],
2248
+ "requiredPrimitives": [
2249
+ "node",
2250
+ "group"
2251
+ ],
2252
+ "allowedPrimitives": [
2253
+ "node",
2254
+ "relation",
2255
+ "group",
2256
+ "set",
2257
+ "annotation",
2258
+ "emphasis"
2259
+ ],
2260
+ "directions": [
2261
+ "top-down",
2262
+ "left-right",
2263
+ "right-left",
2264
+ "bottom-up",
2265
+ "radial"
2266
+ ],
2267
+ "detailLimits": {
2268
+ "simplified": 7,
2269
+ "balanced": 12,
2270
+ "faithful": 24,
2271
+ "hard": 24
2272
+ },
2273
+ "readability": {
2274
+ "maxLabelCharacters": 80,
2275
+ "maxCrossings": 12,
2276
+ "maxFanIn": 6,
2277
+ "minTextSize": 12,
2278
+ "aspectRatios": [
2279
+ "fit",
2280
+ "doc-wide",
2281
+ "slide-16x9"
2282
+ ]
2283
+ },
2284
+ "projections": {
2285
+ "mermaid": "unsupported",
2286
+ "excalidraw": "editable"
2287
+ },
2288
+ "fixture": "fixtures/diagram/grammars/treemap.planr-diagram.json",
2289
+ "reference": "references/diagram/treemap.md",
2290
+ "rendererContract": {
2291
+ "layoutFamily": "containment",
2292
+ "contractVersion": "1.0.0",
2293
+ "staticByDefault": true
2294
+ },
2295
+ "accessibilityTemplate": {
2296
+ "title": "Treemap diagram",
2297
+ "description": "Diagram content for the treemap grammar in semantic reading order."
2298
+ }
2299
+ },
2300
+ {
2301
+ "grammarId": "line",
2302
+ "grammarVersion": "1.0.0",
2303
+ "title": "Line chart",
2304
+ "summary": "Line chart semantic grammar using the chart layout family.",
2305
+ "layoutFamily": "chart",
2306
+ "aliases": [
2307
+ "line graph",
2308
+ "trend chart"
2309
+ ],
2310
+ "requiredPrimitives": [
2311
+ "series",
2312
+ "axis"
2313
+ ],
2314
+ "allowedPrimitives": [
2315
+ "node",
2316
+ "series",
2317
+ "axis",
2318
+ "annotation",
2319
+ "emphasis"
2320
+ ],
2321
+ "directions": [
2322
+ "top-down",
2323
+ "left-right",
2324
+ "right-left",
2325
+ "bottom-up",
2326
+ "radial"
2327
+ ],
2328
+ "detailLimits": {
2329
+ "simplified": 7,
2330
+ "balanced": 12,
2331
+ "faithful": 24,
2332
+ "hard": 24
2333
+ },
2334
+ "readability": {
2335
+ "maxLabelCharacters": 80,
2336
+ "maxCrossings": 12,
2337
+ "maxFanIn": 6,
2338
+ "minTextSize": 12,
2339
+ "aspectRatios": [
2340
+ "fit",
2341
+ "doc-wide",
2342
+ "slide-16x9"
2343
+ ]
2344
+ },
2345
+ "projections": {
2346
+ "mermaid": "unsupported",
2347
+ "excalidraw": "editable"
2348
+ },
2349
+ "fixture": "fixtures/diagram/grammars/line.planr-diagram.json",
2350
+ "reference": "references/diagram/line.md",
2351
+ "rendererContract": {
2352
+ "layoutFamily": "chart",
2353
+ "contractVersion": "1.0.0",
2354
+ "staticByDefault": true
2355
+ },
2356
+ "accessibilityTemplate": {
2357
+ "title": "Line chart diagram",
2358
+ "description": "Diagram content for the line chart grammar in semantic reading order."
2359
+ }
2360
+ },
2361
+ {
2362
+ "grammarId": "gantt",
2363
+ "grammarVersion": "1.0.0",
2364
+ "title": "Gantt",
2365
+ "summary": "Gantt semantic grammar using the chronology layout family.",
2366
+ "layoutFamily": "chronology",
2367
+ "aliases": [
2368
+ "gantt chart",
2369
+ "project schedule",
2370
+ "task timeline"
2371
+ ],
2372
+ "requiredPrimitives": [
2373
+ "event"
2374
+ ],
2375
+ "allowedPrimitives": [
2376
+ "node",
2377
+ "relation",
2378
+ "event",
2379
+ "annotation",
2380
+ "emphasis"
2381
+ ],
2382
+ "directions": [
2383
+ "top-down",
2384
+ "left-right",
2385
+ "right-left",
2386
+ "bottom-up",
2387
+ "radial"
2388
+ ],
2389
+ "detailLimits": {
2390
+ "simplified": 7,
2391
+ "balanced": 12,
2392
+ "faithful": 24,
2393
+ "hard": 24
2394
+ },
2395
+ "readability": {
2396
+ "maxLabelCharacters": 80,
2397
+ "maxCrossings": 12,
2398
+ "maxFanIn": 6,
2399
+ "minTextSize": 12,
2400
+ "aspectRatios": [
2401
+ "fit",
2402
+ "doc-wide",
2403
+ "slide-16x9"
2404
+ ]
2405
+ },
2406
+ "projections": {
2407
+ "mermaid": "editable",
2408
+ "excalidraw": "editable"
2409
+ },
2410
+ "fixture": "fixtures/diagram/grammars/gantt.planr-diagram.json",
2411
+ "reference": "references/diagram/gantt.md",
2412
+ "rendererContract": {
2413
+ "layoutFamily": "chronology",
2414
+ "contractVersion": "1.0.0",
2415
+ "staticByDefault": true
2416
+ },
2417
+ "accessibilityTemplate": {
2418
+ "title": "Gantt diagram",
2419
+ "description": "Diagram content for the gantt grammar in semantic reading order."
2420
+ }
2421
+ },
2422
+ {
2423
+ "grammarId": "scatter",
2424
+ "grammarVersion": "1.0.0",
2425
+ "title": "Scatter plot",
2426
+ "summary": "Scatter plot semantic grammar using the chart layout family.",
2427
+ "layoutFamily": "chart",
2428
+ "aliases": [
2429
+ "scatter chart",
2430
+ "correlation",
2431
+ "distribution plot"
2432
+ ],
2433
+ "requiredPrimitives": [
2434
+ "series",
2435
+ "axis"
2436
+ ],
2437
+ "allowedPrimitives": [
2438
+ "node",
2439
+ "series",
2440
+ "axis",
2441
+ "annotation",
2442
+ "emphasis"
2443
+ ],
2444
+ "directions": [
2445
+ "top-down",
2446
+ "left-right",
2447
+ "right-left",
2448
+ "bottom-up",
2449
+ "radial"
2450
+ ],
2451
+ "detailLimits": {
2452
+ "simplified": 7,
2453
+ "balanced": 12,
2454
+ "faithful": 24,
2455
+ "hard": 24
2456
+ },
2457
+ "readability": {
2458
+ "maxLabelCharacters": 80,
2459
+ "maxCrossings": 12,
2460
+ "maxFanIn": 6,
2461
+ "minTextSize": 12,
2462
+ "aspectRatios": [
2463
+ "fit",
2464
+ "doc-wide",
2465
+ "slide-16x9"
2466
+ ]
2467
+ },
2468
+ "projections": {
2469
+ "mermaid": "unsupported",
2470
+ "excalidraw": "editable"
2471
+ },
2472
+ "fixture": "fixtures/diagram/grammars/scatter.planr-diagram.json",
2473
+ "reference": "references/diagram/scatter.md",
2474
+ "rendererContract": {
2475
+ "layoutFamily": "chart",
2476
+ "contractVersion": "1.0.0",
2477
+ "staticByDefault": true
2478
+ },
2479
+ "accessibilityTemplate": {
2480
+ "title": "Scatter plot diagram",
2481
+ "description": "Diagram content for the scatter plot grammar in semantic reading order."
2482
+ }
2483
+ },
2484
+ {
2485
+ "grammarId": "high-level",
2486
+ "grammarVersion": "1.0.0",
2487
+ "title": "High-level system view",
2488
+ "summary": "High-level system view semantic grammar using the graph layout family.",
2489
+ "layoutFamily": "graph",
2490
+ "aliases": [
2491
+ "high level architecture",
2492
+ "end to end stack"
2493
+ ],
2494
+ "requiredPrimitives": [
2495
+ "node"
2496
+ ],
2497
+ "allowedPrimitives": [
2498
+ "node",
2499
+ "relation",
2500
+ "group",
2501
+ "annotation",
2502
+ "emphasis"
2503
+ ],
2504
+ "directions": [
2505
+ "top-down",
2506
+ "left-right",
2507
+ "right-left",
2508
+ "bottom-up",
2509
+ "radial"
2510
+ ],
2511
+ "detailLimits": {
2512
+ "simplified": 7,
2513
+ "balanced": 12,
2514
+ "faithful": 24,
2515
+ "hard": 24
2516
+ },
2517
+ "readability": {
2518
+ "maxLabelCharacters": 80,
2519
+ "maxCrossings": 12,
2520
+ "maxFanIn": 6,
2521
+ "minTextSize": 12,
2522
+ "aspectRatios": [
2523
+ "fit",
2524
+ "doc-wide",
2525
+ "slide-16x9"
2526
+ ]
2527
+ },
2528
+ "projections": {
2529
+ "mermaid": "partial",
2530
+ "excalidraw": "editable"
2531
+ },
2532
+ "fixture": "fixtures/diagram/grammars/high-level.planr-diagram.json",
2533
+ "reference": "references/diagram/high-level.md",
2534
+ "rendererContract": {
2535
+ "layoutFamily": "graph",
2536
+ "contractVersion": "1.0.0",
2537
+ "staticByDefault": true
2538
+ },
2539
+ "accessibilityTemplate": {
2540
+ "title": "High-level system view diagram",
2541
+ "description": "Diagram content for the high-level system view grammar in semantic reading order."
2542
+ }
2543
+ },
2544
+ {
2545
+ "grammarId": "process",
2546
+ "grammarVersion": "1.0.0",
2547
+ "title": "Process",
2548
+ "summary": "Process semantic grammar using the lanes layout family.",
2549
+ "layoutFamily": "lanes",
2550
+ "aliases": [
2551
+ "business process",
2552
+ "multi actor process"
2553
+ ],
2554
+ "requiredPrimitives": [
2555
+ "node",
2556
+ "relation",
2557
+ "lane"
2558
+ ],
2559
+ "allowedPrimitives": [
2560
+ "node",
2561
+ "relation",
2562
+ "lane",
2563
+ "event",
2564
+ "annotation",
2565
+ "emphasis"
2566
+ ],
2567
+ "directions": [
2568
+ "top-down",
2569
+ "left-right",
2570
+ "right-left",
2571
+ "bottom-up",
2572
+ "radial"
2573
+ ],
2574
+ "detailLimits": {
2575
+ "simplified": 7,
2576
+ "balanced": 12,
2577
+ "faithful": 24,
2578
+ "hard": 24
2579
+ },
2580
+ "readability": {
2581
+ "maxLabelCharacters": 80,
2582
+ "maxCrossings": 12,
2583
+ "maxFanIn": 6,
2584
+ "minTextSize": 12,
2585
+ "aspectRatios": [
2586
+ "fit",
2587
+ "doc-wide",
2588
+ "slide-16x9"
2589
+ ]
2590
+ },
2591
+ "projections": {
2592
+ "mermaid": "partial",
2593
+ "excalidraw": "editable"
2594
+ },
2595
+ "fixture": "fixtures/diagram/grammars/process.planr-diagram.json",
2596
+ "reference": "references/diagram/process.md",
2597
+ "rendererContract": {
2598
+ "layoutFamily": "lanes",
2599
+ "contractVersion": "1.0.0",
2600
+ "staticByDefault": true
2601
+ },
2602
+ "accessibilityTemplate": {
2603
+ "title": "Process diagram",
2604
+ "description": "Diagram content for the process grammar in semantic reading order."
2605
+ }
2606
+ },
2607
+ {
2608
+ "grammarId": "medallion",
2609
+ "grammarVersion": "1.0.0",
2610
+ "title": "Medallion",
2611
+ "summary": "Medallion semantic grammar using the hierarchy layout family.",
2612
+ "layoutFamily": "hierarchy",
2613
+ "aliases": [
2614
+ "bronze silver gold",
2615
+ "data lakehouse tiers"
2616
+ ],
2617
+ "requiredPrimitives": [
2618
+ "node"
2619
+ ],
2620
+ "allowedPrimitives": [
2621
+ "node",
2622
+ "relation",
2623
+ "group",
2624
+ "annotation",
2625
+ "emphasis"
2626
+ ],
2627
+ "directions": [
2628
+ "top-down",
2629
+ "left-right",
2630
+ "right-left",
2631
+ "bottom-up",
2632
+ "radial"
2633
+ ],
2634
+ "detailLimits": {
2635
+ "simplified": 7,
2636
+ "balanced": 12,
2637
+ "faithful": 24,
2638
+ "hard": 24
2639
+ },
2640
+ "readability": {
2641
+ "maxLabelCharacters": 80,
2642
+ "maxCrossings": 12,
2643
+ "maxFanIn": 6,
2644
+ "minTextSize": 12,
2645
+ "aspectRatios": [
2646
+ "fit",
2647
+ "doc-wide",
2648
+ "slide-16x9"
2649
+ ]
2650
+ },
2651
+ "projections": {
2652
+ "mermaid": "partial",
2653
+ "excalidraw": "editable"
2654
+ },
2655
+ "fixture": "fixtures/diagram/grammars/medallion.planr-diagram.json",
2656
+ "reference": "references/diagram/medallion.md",
2657
+ "rendererContract": {
2658
+ "layoutFamily": "hierarchy",
2659
+ "contractVersion": "1.0.0",
2660
+ "staticByDefault": true
2661
+ },
2662
+ "accessibilityTemplate": {
2663
+ "title": "Medallion diagram",
2664
+ "description": "Diagram content for the medallion grammar in semantic reading order."
2665
+ }
2666
+ },
2667
+ {
2668
+ "grammarId": "data-flow",
2669
+ "grammarVersion": "1.0.0",
2670
+ "title": "Data flow",
2671
+ "summary": "Data flow semantic grammar using the graph layout family.",
2672
+ "layoutFamily": "graph",
2673
+ "aliases": [
2674
+ "data pipeline",
2675
+ "information flow"
2676
+ ],
2677
+ "requiredPrimitives": [
2678
+ "node"
2679
+ ],
2680
+ "allowedPrimitives": [
2681
+ "node",
2682
+ "relation",
2683
+ "group",
2684
+ "annotation",
2685
+ "emphasis"
2686
+ ],
2687
+ "directions": [
2688
+ "top-down",
2689
+ "left-right",
2690
+ "right-left",
2691
+ "bottom-up",
2692
+ "radial"
2693
+ ],
2694
+ "detailLimits": {
2695
+ "simplified": 7,
2696
+ "balanced": 12,
2697
+ "faithful": 24,
2698
+ "hard": 24
2699
+ },
2700
+ "readability": {
2701
+ "maxLabelCharacters": 80,
2702
+ "maxCrossings": 12,
2703
+ "maxFanIn": 6,
2704
+ "minTextSize": 12,
2705
+ "aspectRatios": [
2706
+ "fit",
2707
+ "doc-wide",
2708
+ "slide-16x9"
2709
+ ]
2710
+ },
2711
+ "projections": {
2712
+ "mermaid": "partial",
2713
+ "excalidraw": "editable"
2714
+ },
2715
+ "fixture": "fixtures/diagram/grammars/data-flow.planr-diagram.json",
2716
+ "reference": "references/diagram/data-flow.md",
2717
+ "rendererContract": {
2718
+ "layoutFamily": "graph",
2719
+ "contractVersion": "1.0.0",
2720
+ "staticByDefault": true
2721
+ },
2722
+ "accessibilityTemplate": {
2723
+ "title": "Data flow diagram",
2724
+ "description": "Diagram content for the data flow grammar in semantic reading order."
2725
+ }
2726
+ },
2727
+ {
2728
+ "grammarId": "dp-integration",
2729
+ "grammarVersion": "1.0.0",
2730
+ "title": "Data platform integration",
2731
+ "summary": "Data platform integration semantic grammar using the graph layout family.",
2732
+ "layoutFamily": "graph",
2733
+ "aliases": [
2734
+ "sources core consumers",
2735
+ "integration landscape"
2736
+ ],
2737
+ "requiredPrimitives": [
2738
+ "node"
2739
+ ],
2740
+ "allowedPrimitives": [
2741
+ "node",
2742
+ "relation",
2743
+ "group",
2744
+ "annotation",
2745
+ "emphasis"
2746
+ ],
2747
+ "directions": [
2748
+ "top-down",
2749
+ "left-right",
2750
+ "right-left",
2751
+ "bottom-up",
2752
+ "radial"
2753
+ ],
2754
+ "detailLimits": {
2755
+ "simplified": 7,
2756
+ "balanced": 12,
2757
+ "faithful": 24,
2758
+ "hard": 24
2759
+ },
2760
+ "readability": {
2761
+ "maxLabelCharacters": 80,
2762
+ "maxCrossings": 12,
2763
+ "maxFanIn": 6,
2764
+ "minTextSize": 12,
2765
+ "aspectRatios": [
2766
+ "fit",
2767
+ "doc-wide",
2768
+ "slide-16x9"
2769
+ ]
2770
+ },
2771
+ "projections": {
2772
+ "mermaid": "partial",
2773
+ "excalidraw": "editable"
2774
+ },
2775
+ "fixture": "fixtures/diagram/grammars/dp-integration.planr-diagram.json",
2776
+ "reference": "references/diagram/dp-integration.md",
2777
+ "rendererContract": {
2778
+ "layoutFamily": "graph",
2779
+ "contractVersion": "1.0.0",
2780
+ "staticByDefault": true
2781
+ },
2782
+ "accessibilityTemplate": {
2783
+ "title": "Data platform integration diagram",
2784
+ "description": "Diagram content for the data platform integration grammar in semantic reading order."
2785
+ }
2786
+ },
2787
+ {
2788
+ "grammarId": "dp-security-matrix",
2789
+ "grammarVersion": "1.0.0",
2790
+ "title": "Data platform security matrix",
2791
+ "summary": "Data platform security matrix semantic grammar using the lanes layout family.",
2792
+ "layoutFamily": "lanes",
2793
+ "aliases": [
2794
+ "access matrix",
2795
+ "role permissions"
2796
+ ],
2797
+ "requiredPrimitives": [
2798
+ "node",
2799
+ "lane"
2800
+ ],
2801
+ "allowedPrimitives": [
2802
+ "node",
2803
+ "relation",
2804
+ "lane",
2805
+ "event",
2806
+ "annotation",
2807
+ "emphasis"
2808
+ ],
2809
+ "directions": [
2810
+ "top-down",
2811
+ "left-right",
2812
+ "right-left",
2813
+ "bottom-up",
2814
+ "radial"
2815
+ ],
2816
+ "detailLimits": {
2817
+ "simplified": 7,
2818
+ "balanced": 12,
2819
+ "faithful": 24,
2820
+ "hard": 24
2821
+ },
2822
+ "readability": {
2823
+ "maxLabelCharacters": 80,
2824
+ "maxCrossings": 12,
2825
+ "maxFanIn": 6,
2826
+ "minTextSize": 12,
2827
+ "aspectRatios": [
2828
+ "fit",
2829
+ "doc-wide",
2830
+ "slide-16x9"
2831
+ ]
2832
+ },
2833
+ "projections": {
2834
+ "mermaid": "partial",
2835
+ "excalidraw": "editable"
2836
+ },
2837
+ "fixture": "fixtures/diagram/grammars/dp-security-matrix.planr-diagram.json",
2838
+ "reference": "references/diagram/dp-security-matrix.md",
2839
+ "rendererContract": {
2840
+ "layoutFamily": "lanes",
2841
+ "contractVersion": "1.0.0",
2842
+ "staticByDefault": true
2843
+ },
2844
+ "accessibilityTemplate": {
2845
+ "title": "Data platform security matrix diagram",
2846
+ "description": "Diagram content for the data platform security matrix grammar in semantic reading order."
2847
+ }
2848
+ },
2849
+ {
2850
+ "grammarId": "sankey",
2851
+ "grammarVersion": "1.0.0",
2852
+ "title": "Sankey",
2853
+ "summary": "Sankey semantic grammar using the sankey layout family.",
2854
+ "layoutFamily": "sankey",
2855
+ "aliases": [
2856
+ "flow quantities",
2857
+ "split and merge"
2858
+ ],
2859
+ "requiredPrimitives": [
2860
+ "node",
2861
+ "relation",
2862
+ "series"
2863
+ ],
2864
+ "allowedPrimitives": [
2865
+ "node",
2866
+ "relation",
2867
+ "series",
2868
+ "annotation",
2869
+ "emphasis"
2870
+ ],
2871
+ "directions": [
2872
+ "top-down",
2873
+ "left-right",
2874
+ "right-left",
2875
+ "bottom-up",
2876
+ "radial"
2877
+ ],
2878
+ "detailLimits": {
2879
+ "simplified": 7,
2880
+ "balanced": 12,
2881
+ "faithful": 24,
2882
+ "hard": 24
2883
+ },
2884
+ "readability": {
2885
+ "maxLabelCharacters": 80,
2886
+ "maxCrossings": 12,
2887
+ "maxFanIn": 8,
2888
+ "minTextSize": 12,
2889
+ "aspectRatios": [
2890
+ "fit",
2891
+ "doc-wide",
2892
+ "slide-16x9"
2893
+ ]
2894
+ },
2895
+ "projections": {
2896
+ "mermaid": "unsupported",
2897
+ "excalidraw": "editable"
2898
+ },
2899
+ "fixture": "fixtures/diagram/grammars/sankey.planr-diagram.json",
2900
+ "reference": "references/diagram/sankey.md",
2901
+ "rendererContract": {
2902
+ "layoutFamily": "sankey",
2903
+ "contractVersion": "1.0.0",
2904
+ "staticByDefault": true
2905
+ },
2906
+ "accessibilityTemplate": {
2907
+ "title": "Sankey diagram",
2908
+ "description": "Diagram content for the sankey grammar in semantic reading order."
2909
+ }
2910
+ },
2911
+ {
2912
+ "grammarId": "fishbone",
2913
+ "grammarVersion": "1.0.0",
2914
+ "title": "Fishbone",
2915
+ "summary": "Fishbone semantic grammar using the cause-effect layout family.",
2916
+ "layoutFamily": "cause-effect",
2917
+ "aliases": [
2918
+ "ishikawa",
2919
+ "cause and effect",
2920
+ "root causes"
2921
+ ],
2922
+ "requiredPrimitives": [
2923
+ "node",
2924
+ "relation",
2925
+ "group"
2926
+ ],
2927
+ "allowedPrimitives": [
2928
+ "node",
2929
+ "relation",
2930
+ "group",
2931
+ "annotation",
2932
+ "emphasis"
2933
+ ],
2934
+ "directions": [
2935
+ "top-down",
2936
+ "left-right",
2937
+ "right-left",
2938
+ "bottom-up",
2939
+ "radial"
2940
+ ],
2941
+ "detailLimits": {
2942
+ "simplified": 7,
2943
+ "balanced": 12,
2944
+ "faithful": 24,
2945
+ "hard": 24
2946
+ },
2947
+ "readability": {
2948
+ "maxLabelCharacters": 80,
2949
+ "maxCrossings": 12,
2950
+ "maxFanIn": 6,
2951
+ "minTextSize": 12,
2952
+ "aspectRatios": [
2953
+ "fit",
2954
+ "doc-wide",
2955
+ "slide-16x9"
2956
+ ]
2957
+ },
2958
+ "projections": {
2959
+ "mermaid": "unsupported",
2960
+ "excalidraw": "editable"
2961
+ },
2962
+ "fixture": "fixtures/diagram/grammars/fishbone.planr-diagram.json",
2963
+ "reference": "references/diagram/fishbone.md",
2964
+ "rendererContract": {
2965
+ "layoutFamily": "cause-effect",
2966
+ "contractVersion": "1.0.0",
2967
+ "staticByDefault": true
2968
+ },
2969
+ "accessibilityTemplate": {
2970
+ "title": "Fishbone diagram",
2971
+ "description": "Diagram content for the fishbone grammar in semantic reading order."
2972
+ }
2973
+ },
2974
+ {
2975
+ "grammarId": "wardley",
2976
+ "grammarVersion": "1.0.0",
2977
+ "title": "Wardley map",
2978
+ "summary": "Wardley map semantic grammar using the wardley layout family.",
2979
+ "layoutFamily": "wardley",
2980
+ "aliases": [
2981
+ "value chain evolution",
2982
+ "wardley"
2983
+ ],
2984
+ "requiredPrimitives": [
2985
+ "node",
2986
+ "relation",
2987
+ "axis"
2988
+ ],
2989
+ "allowedPrimitives": [
2990
+ "node",
2991
+ "relation",
2992
+ "axis",
2993
+ "annotation",
2994
+ "emphasis"
2995
+ ],
2996
+ "directions": [
2997
+ "top-down",
2998
+ "left-right",
2999
+ "right-left",
3000
+ "bottom-up",
3001
+ "radial"
3002
+ ],
3003
+ "detailLimits": {
3004
+ "simplified": 7,
3005
+ "balanced": 12,
3006
+ "faithful": 24,
3007
+ "hard": 24
3008
+ },
3009
+ "readability": {
3010
+ "maxLabelCharacters": 80,
3011
+ "maxCrossings": 12,
3012
+ "maxFanIn": 6,
3013
+ "minTextSize": 12,
3014
+ "aspectRatios": [
3015
+ "fit",
3016
+ "doc-wide",
3017
+ "slide-16x9"
3018
+ ]
3019
+ },
3020
+ "projections": {
3021
+ "mermaid": "unsupported",
3022
+ "excalidraw": "editable"
3023
+ },
3024
+ "fixture": "fixtures/diagram/grammars/wardley.planr-diagram.json",
3025
+ "reference": "references/diagram/wardley.md",
3026
+ "rendererContract": {
3027
+ "layoutFamily": "wardley",
3028
+ "contractVersion": "1.0.0",
3029
+ "staticByDefault": true
3030
+ },
3031
+ "accessibilityTemplate": {
3032
+ "title": "Wardley map diagram",
3033
+ "description": "Diagram content for the wardley map grammar in semantic reading order."
3034
+ }
3035
+ },
3036
+ {
3037
+ "grammarId": "kanban",
3038
+ "grammarVersion": "1.0.0",
3039
+ "title": "Kanban",
3040
+ "summary": "Kanban semantic grammar using the lanes layout family.",
3041
+ "layoutFamily": "lanes",
3042
+ "aliases": [
3043
+ "kanban board",
3044
+ "work in progress"
3045
+ ],
3046
+ "requiredPrimitives": [
3047
+ "node",
3048
+ "lane"
3049
+ ],
3050
+ "allowedPrimitives": [
3051
+ "node",
3052
+ "relation",
3053
+ "lane",
3054
+ "event",
3055
+ "annotation",
3056
+ "emphasis"
3057
+ ],
3058
+ "directions": [
3059
+ "top-down",
3060
+ "left-right",
3061
+ "right-left",
3062
+ "bottom-up",
3063
+ "radial"
3064
+ ],
3065
+ "detailLimits": {
3066
+ "simplified": 7,
3067
+ "balanced": 12,
3068
+ "faithful": 24,
3069
+ "hard": 24
3070
+ },
3071
+ "readability": {
3072
+ "maxLabelCharacters": 80,
3073
+ "maxCrossings": 12,
3074
+ "maxFanIn": 6,
3075
+ "minTextSize": 12,
3076
+ "aspectRatios": [
3077
+ "fit",
3078
+ "doc-wide",
3079
+ "slide-16x9"
3080
+ ]
3081
+ },
3082
+ "projections": {
3083
+ "mermaid": "unsupported",
3084
+ "excalidraw": "editable"
3085
+ },
3086
+ "fixture": "fixtures/diagram/grammars/kanban.planr-diagram.json",
3087
+ "reference": "references/diagram/kanban.md",
3088
+ "rendererContract": {
3089
+ "layoutFamily": "lanes",
3090
+ "contractVersion": "1.0.0",
3091
+ "staticByDefault": true
3092
+ },
3093
+ "accessibilityTemplate": {
3094
+ "title": "Kanban diagram",
3095
+ "description": "Diagram content for the kanban grammar in semantic reading order."
3096
+ }
3097
+ },
3098
+ {
3099
+ "grammarId": "user-journey",
3100
+ "grammarVersion": "1.0.0",
3101
+ "title": "User journey",
3102
+ "summary": "User journey semantic grammar using the lanes layout family.",
3103
+ "layoutFamily": "lanes",
3104
+ "aliases": [
3105
+ "customer journey",
3106
+ "experience map"
3107
+ ],
3108
+ "requiredPrimitives": [
3109
+ "event",
3110
+ "lane"
3111
+ ],
3112
+ "allowedPrimitives": [
3113
+ "node",
3114
+ "relation",
3115
+ "lane",
3116
+ "event",
3117
+ "annotation",
3118
+ "emphasis"
3119
+ ],
3120
+ "directions": [
3121
+ "top-down",
3122
+ "left-right",
3123
+ "right-left",
3124
+ "bottom-up",
3125
+ "radial"
3126
+ ],
3127
+ "detailLimits": {
3128
+ "simplified": 7,
3129
+ "balanced": 12,
3130
+ "faithful": 24,
3131
+ "hard": 24
3132
+ },
3133
+ "readability": {
3134
+ "maxLabelCharacters": 80,
3135
+ "maxCrossings": 12,
3136
+ "maxFanIn": 6,
3137
+ "minTextSize": 12,
3138
+ "aspectRatios": [
3139
+ "fit",
3140
+ "doc-wide",
3141
+ "slide-16x9"
3142
+ ]
3143
+ },
3144
+ "projections": {
3145
+ "mermaid": "partial",
3146
+ "excalidraw": "editable"
3147
+ },
3148
+ "fixture": "fixtures/diagram/grammars/user-journey.planr-diagram.json",
3149
+ "reference": "references/diagram/user-journey.md",
3150
+ "rendererContract": {
3151
+ "layoutFamily": "lanes",
3152
+ "contractVersion": "1.0.0",
3153
+ "staticByDefault": true
3154
+ },
3155
+ "accessibilityTemplate": {
3156
+ "title": "User journey diagram",
3157
+ "description": "Diagram content for the user journey grammar in semantic reading order."
3158
+ }
3159
+ },
3160
+ {
3161
+ "grammarId": "deployment",
3162
+ "grammarVersion": "1.0.0",
3163
+ "title": "Deployment",
3164
+ "summary": "Deployment semantic grammar using the containment layout family.",
3165
+ "layoutFamily": "containment",
3166
+ "aliases": [
3167
+ "deployment diagram",
3168
+ "zones hosts artifacts"
3169
+ ],
3170
+ "requiredPrimitives": [
3171
+ "node",
3172
+ "group"
3173
+ ],
3174
+ "allowedPrimitives": [
3175
+ "node",
3176
+ "relation",
3177
+ "group",
3178
+ "set",
3179
+ "annotation",
3180
+ "emphasis"
3181
+ ],
3182
+ "directions": [
3183
+ "top-down",
3184
+ "left-right",
3185
+ "right-left",
3186
+ "bottom-up",
3187
+ "radial"
3188
+ ],
3189
+ "detailLimits": {
3190
+ "simplified": 7,
3191
+ "balanced": 12,
3192
+ "faithful": 24,
3193
+ "hard": 24
3194
+ },
3195
+ "readability": {
3196
+ "maxLabelCharacters": 80,
3197
+ "maxCrossings": 12,
3198
+ "maxFanIn": 6,
3199
+ "minTextSize": 12,
3200
+ "aspectRatios": [
3201
+ "fit",
3202
+ "doc-wide",
3203
+ "slide-16x9"
3204
+ ]
3205
+ },
3206
+ "projections": {
3207
+ "mermaid": "partial",
3208
+ "excalidraw": "editable"
3209
+ },
3210
+ "fixture": "fixtures/diagram/grammars/deployment.planr-diagram.json",
3211
+ "reference": "references/diagram/deployment.md",
3212
+ "rendererContract": {
3213
+ "layoutFamily": "containment",
3214
+ "contractVersion": "1.0.0",
3215
+ "staticByDefault": true
3216
+ },
3217
+ "accessibilityTemplate": {
3218
+ "title": "Deployment diagram",
3219
+ "description": "Diagram content for the deployment grammar in semantic reading order."
3220
+ }
3221
+ },
3222
+ {
3223
+ "grammarId": "dependency-graph",
3224
+ "grammarVersion": "1.0.0",
3225
+ "title": "Dependency graph",
3226
+ "summary": "Dependency graph semantic grammar using the graph layout family.",
3227
+ "layoutFamily": "graph",
3228
+ "aliases": [
3229
+ "dependencies",
3230
+ "fan in graph",
3231
+ "package graph"
3232
+ ],
3233
+ "requiredPrimitives": [
3234
+ "node"
3235
+ ],
3236
+ "allowedPrimitives": [
3237
+ "node",
3238
+ "relation",
3239
+ "group",
3240
+ "annotation",
3241
+ "emphasis"
3242
+ ],
3243
+ "directions": [
3244
+ "top-down",
3245
+ "left-right",
3246
+ "right-left",
3247
+ "bottom-up",
3248
+ "radial"
3249
+ ],
3250
+ "detailLimits": {
3251
+ "simplified": 7,
3252
+ "balanced": 12,
3253
+ "faithful": 24,
3254
+ "hard": 24
3255
+ },
3256
+ "readability": {
3257
+ "maxLabelCharacters": 80,
3258
+ "maxCrossings": 12,
3259
+ "maxFanIn": 10,
3260
+ "minTextSize": 12,
3261
+ "aspectRatios": [
3262
+ "fit",
3263
+ "doc-wide",
3264
+ "slide-16x9"
3265
+ ]
3266
+ },
3267
+ "projections": {
3268
+ "mermaid": "editable",
3269
+ "excalidraw": "editable"
3270
+ },
3271
+ "fixture": "fixtures/diagram/grammars/dependency-graph.planr-diagram.json",
3272
+ "reference": "references/diagram/dependency-graph.md",
3273
+ "rendererContract": {
3274
+ "layoutFamily": "graph",
3275
+ "contractVersion": "1.0.0",
3276
+ "staticByDefault": true
3277
+ },
3278
+ "accessibilityTemplate": {
3279
+ "title": "Dependency graph diagram",
3280
+ "description": "Diagram content for the dependency graph grammar in semantic reading order."
3281
+ }
3282
+ },
3283
+ {
3284
+ "grammarId": "uml-class",
3285
+ "grammarVersion": "1.0.0",
3286
+ "title": "UML class",
3287
+ "summary": "UML class semantic grammar using the entity layout family.",
3288
+ "layoutFamily": "entity",
3289
+ "aliases": [
3290
+ "class diagram",
3291
+ "typed relations"
3292
+ ],
3293
+ "requiredPrimitives": [
3294
+ "node"
3295
+ ],
3296
+ "allowedPrimitives": [
3297
+ "node",
3298
+ "relation",
3299
+ "group",
3300
+ "annotation",
3301
+ "emphasis"
3302
+ ],
3303
+ "directions": [
3304
+ "top-down",
3305
+ "left-right",
3306
+ "right-left",
3307
+ "bottom-up",
3308
+ "radial"
3309
+ ],
3310
+ "detailLimits": {
3311
+ "simplified": 7,
3312
+ "balanced": 12,
3313
+ "faithful": 24,
3314
+ "hard": 24
3315
+ },
3316
+ "readability": {
3317
+ "maxLabelCharacters": 80,
3318
+ "maxCrossings": 12,
3319
+ "maxFanIn": 6,
3320
+ "minTextSize": 12,
3321
+ "aspectRatios": [
3322
+ "fit",
3323
+ "doc-wide",
3324
+ "slide-16x9"
3325
+ ]
3326
+ },
3327
+ "projections": {
3328
+ "mermaid": "editable",
3329
+ "excalidraw": "editable"
3330
+ },
3331
+ "fixture": "fixtures/diagram/grammars/uml-class.planr-diagram.json",
3332
+ "reference": "references/diagram/uml-class.md",
3333
+ "rendererContract": {
3334
+ "layoutFamily": "entity",
3335
+ "contractVersion": "1.0.0",
3336
+ "staticByDefault": true
3337
+ },
3338
+ "accessibilityTemplate": {
3339
+ "title": "UML class diagram",
3340
+ "description": "Diagram content for the uml class grammar in semantic reading order."
3341
+ }
3342
+ },
3343
+ {
3344
+ "grammarId": "story-map",
3345
+ "grammarVersion": "1.0.0",
3346
+ "title": "Story map",
3347
+ "summary": "Story map semantic grammar using the lanes layout family.",
3348
+ "layoutFamily": "lanes",
3349
+ "aliases": [
3350
+ "user story map",
3351
+ "release slices"
3352
+ ],
3353
+ "requiredPrimitives": [
3354
+ "node",
3355
+ "lane"
3356
+ ],
3357
+ "allowedPrimitives": [
3358
+ "node",
3359
+ "relation",
3360
+ "lane",
3361
+ "event",
3362
+ "annotation",
3363
+ "emphasis"
3364
+ ],
3365
+ "directions": [
3366
+ "top-down",
3367
+ "left-right",
3368
+ "right-left",
3369
+ "bottom-up",
3370
+ "radial"
3371
+ ],
3372
+ "detailLimits": {
3373
+ "simplified": 7,
3374
+ "balanced": 12,
3375
+ "faithful": 24,
3376
+ "hard": 24
3377
+ },
3378
+ "readability": {
3379
+ "maxLabelCharacters": 80,
3380
+ "maxCrossings": 12,
3381
+ "maxFanIn": 6,
3382
+ "minTextSize": 12,
3383
+ "aspectRatios": [
3384
+ "fit",
3385
+ "doc-wide",
3386
+ "slide-16x9"
3387
+ ]
3388
+ },
3389
+ "projections": {
3390
+ "mermaid": "unsupported",
3391
+ "excalidraw": "editable"
3392
+ },
3393
+ "fixture": "fixtures/diagram/grammars/story-map.planr-diagram.json",
3394
+ "reference": "references/diagram/story-map.md",
3395
+ "rendererContract": {
3396
+ "layoutFamily": "lanes",
3397
+ "contractVersion": "1.0.0",
3398
+ "staticByDefault": true
3399
+ },
3400
+ "accessibilityTemplate": {
3401
+ "title": "Story map diagram",
3402
+ "description": "Diagram content for the story map grammar in semantic reading order."
3403
+ }
3404
+ },
3405
+ {
3406
+ "grammarId": "database-schema",
3407
+ "grammarVersion": "1.0.0",
3408
+ "title": "Database schema",
3409
+ "summary": "Database schema semantic grammar using the entity layout family.",
3410
+ "layoutFamily": "entity",
3411
+ "aliases": [
3412
+ "physical schema",
3413
+ "database tables",
3414
+ "foreign keys"
3415
+ ],
3416
+ "requiredPrimitives": [
3417
+ "node"
3418
+ ],
3419
+ "allowedPrimitives": [
3420
+ "node",
3421
+ "relation",
3422
+ "group",
3423
+ "annotation",
3424
+ "emphasis"
3425
+ ],
3426
+ "directions": [
3427
+ "top-down",
3428
+ "left-right",
3429
+ "right-left",
3430
+ "bottom-up",
3431
+ "radial"
3432
+ ],
3433
+ "detailLimits": {
3434
+ "simplified": 7,
3435
+ "balanced": 12,
3436
+ "faithful": 24,
3437
+ "hard": 24
3438
+ },
3439
+ "readability": {
3440
+ "maxLabelCharacters": 80,
3441
+ "maxCrossings": 12,
3442
+ "maxFanIn": 6,
3443
+ "minTextSize": 12,
3444
+ "aspectRatios": [
3445
+ "fit",
3446
+ "doc-wide",
3447
+ "slide-16x9"
3448
+ ]
3449
+ },
3450
+ "projections": {
3451
+ "mermaid": "editable",
3452
+ "excalidraw": "editable"
3453
+ },
3454
+ "fixture": "fixtures/diagram/grammars/database-schema.planr-diagram.json",
3455
+ "reference": "references/diagram/database-schema.md",
3456
+ "rendererContract": {
3457
+ "layoutFamily": "entity",
3458
+ "contractVersion": "1.0.0",
3459
+ "staticByDefault": true
3460
+ },
3461
+ "accessibilityTemplate": {
3462
+ "title": "Database schema diagram",
3463
+ "description": "Diagram content for the database schema grammar in semantic reading order."
3464
+ }
3465
+ }
3466
+ ],
3467
+ "documentDigest": "sha256:f78d668b7cf01ba9c0dacbe64b6e7a1b19c6dc7e5855c9861594beb3d6984653"
3468
+ },
3469
+ "diagram-semantic-patterns.json": {
3470
+ "kind": "diagram-semantic-pattern-registry",
3471
+ "schemaVersion": "1.0.0",
3472
+ "protocolVersion": "1.6.0",
3473
+ "documentVersion": "1.0.0",
3474
+ "digestAlgorithm": "sha256",
3475
+ "canonicalization": "rfc8785",
3476
+ "patterns": [
3477
+ {
3478
+ "patternId": "fan-in-bottleneck",
3479
+ "patternVersion": "1.0.0",
3480
+ "triggers": [
3481
+ "queue",
3482
+ "bottleneck",
3483
+ "fan in"
3484
+ ],
3485
+ "candidateGrammars": [
3486
+ "dependency-graph",
3487
+ "sankey",
3488
+ "data-flow"
3489
+ ],
3490
+ "selection": "rank-only"
3491
+ },
3492
+ {
3493
+ "patternId": "repeated-stages",
3494
+ "patternVersion": "1.0.0",
3495
+ "triggers": [
3496
+ "stages",
3497
+ "pipeline slots",
3498
+ "repeat"
3499
+ ],
3500
+ "candidateGrammars": [
3501
+ "process",
3502
+ "swimlane",
3503
+ "data-flow"
3504
+ ],
3505
+ "selection": "rank-only"
3506
+ },
3507
+ {
3508
+ "patternId": "unstructured-transformation",
3509
+ "patternVersion": "1.0.0",
3510
+ "triggers": [
3511
+ "unstructured input",
3512
+ "transform",
3513
+ "normalize"
3514
+ ],
3515
+ "candidateGrammars": [
3516
+ "data-flow",
3517
+ "dp-integration"
3518
+ ],
3519
+ "selection": "rank-only"
3520
+ },
3521
+ {
3522
+ "patternId": "paired-policy-trace",
3523
+ "patternVersion": "1.0.0",
3524
+ "triggers": [
3525
+ "policy trace",
3526
+ "allow deny",
3527
+ "decision path"
3528
+ ],
3529
+ "candidateGrammars": [
3530
+ "sequence",
3531
+ "flowchart"
3532
+ ],
3533
+ "selection": "rank-only"
3534
+ },
3535
+ {
3536
+ "patternId": "secure-paved-road",
3537
+ "patternVersion": "1.0.0",
3538
+ "triggers": [
3539
+ "secure path",
3540
+ "paved road",
3541
+ "guardrails"
3542
+ ],
3543
+ "candidateGrammars": [
3544
+ "architecture",
3545
+ "deployment"
3546
+ ],
3547
+ "selection": "rank-only"
3548
+ },
3549
+ {
3550
+ "patternId": "governance-catalog",
3551
+ "patternVersion": "1.0.0",
3552
+ "triggers": [
3553
+ "catalog",
3554
+ "governance",
3555
+ "ownership"
3556
+ ],
3557
+ "candidateGrammars": [
3558
+ "tree",
3559
+ "org-chart",
3560
+ "layer-stack"
3561
+ ],
3562
+ "selection": "rank-only"
3563
+ },
3564
+ {
3565
+ "patternId": "compensating-layers",
3566
+ "patternVersion": "1.0.0",
3567
+ "triggers": [
3568
+ "defense in depth",
3569
+ "compensating controls"
3570
+ ],
3571
+ "candidateGrammars": [
3572
+ "layer-stack",
3573
+ "dp-security-matrix"
3574
+ ],
3575
+ "selection": "rank-only"
3576
+ }
3577
+ ],
3578
+ "documentDigest": "sha256:36a925bd1be54ef9a80ccd44039c9390dd7c4cc00185dbc03ba01be8997e222f"
3579
+ }
3580
+ });
3581
+
3582
+ // packages/protocol/src/diagram-authoring-contracts.mjs
3583
+ var DIAGRAM_EDIT_OPERATION_CLASSES = deepFreeze([
3584
+ "insert-elements",
3585
+ "update-semantics",
3586
+ "remove-elements",
3587
+ "set-membership-order",
3588
+ "set-geometry",
3589
+ "set-appearance-locks"
3590
+ ]);
3591
+ var DIAGRAM_AUTHORING_LIMITS = deepFreeze({
3592
+ depth: 48,
3593
+ values: 5e5,
3594
+ textCodeUnits: 8388608,
3595
+ sourceBytes: 1048576,
3596
+ elements: 1e4,
3597
+ operations: 256,
3598
+ coordinate: 1e6
3599
+ });
3600
+ var closed3 = (properties, required = Object.keys(properties)) => ({
3601
+ type: "object",
3602
+ additionalProperties: false,
3603
+ properties,
3604
+ required
3605
+ });
3606
+ var arr = (items, maxItems, minItems = 0, uniqueItems = false) => ({
3607
+ type: "array",
3608
+ items,
3609
+ minItems,
3610
+ maxItems,
3611
+ ...uniqueItems ? { uniqueItems } : {}
3612
+ });
3613
+ var nullable = (schema6) => ({ anyOf: [{ type: "null" }, schema6] });
3614
+ var str = (maxLength = 4096, minLength = 0) => ({ type: "string", minLength, maxLength });
3615
+ var enumOf = (...values) => ({ enum: values });
3616
+ var id3 = {
3617
+ type: "string",
3618
+ pattern: "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$",
3619
+ minLength: 1,
3620
+ maxLength: 128
3621
+ };
3622
+ var digest3 = { type: "string", pattern: "^sha256:[a-f0-9]{64}$" };
3623
+ var token2 = { type: "string", pattern: "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$", maxLength: 64 };
3624
+ var relativePath = {
3625
+ type: "string",
3626
+ minLength: 1,
3627
+ maxLength: 1024,
3628
+ pattern: "^[A-Za-z0-9][A-Za-z0-9._/-]*$"
3629
+ };
3630
+ var coordinate = { type: "number", minimum: -1e6, maximum: 1e6 };
3631
+ var positiveSize = { type: "number", minimum: 0.01, maximum: 1e6 };
3632
+ var index = { type: "integer", minimum: 0, maximum: 1e4 };
3633
+ var ids = arr(id3, 1e4, 0, true);
3634
+ var semanticKinds = ["process", "start", "end", "decision", "data-store", "component"];
3635
+ var relationKinds = ["association", "dependency", "flow", "message", "transition"];
3636
+ var node = closed3({
3637
+ id: id3,
3638
+ label: str(),
3639
+ kind: enumOf(...semanticKinds),
3640
+ description: nullable(str())
3641
+ });
3642
+ var relation = closed3({
3643
+ id: id3,
3644
+ from: id3,
3645
+ to: id3,
3646
+ kind: enumOf(...relationKinds),
3647
+ direction: enumOf("forward", "both", "none"),
3648
+ label: nullable(str()),
3649
+ weight: nullable({ type: "number", minimum: 0, maximum: 1e6 })
3650
+ });
3651
+ var container = closed3({ id: id3, label: str(), members: ids });
3652
+ var annotation = closed3({ id: id3, text: str(), targetId: nullable(id3) });
3653
+ var emphasis = closed3({ targetId: id3, level: enumOf("primary", "secondary", "muted") });
3654
+ var semanticCollections = {
3655
+ nodes: arr(node, 4096),
3656
+ relations: arr(relation, 8192),
3657
+ groups: arr(container, 1024),
3658
+ lanes: arr(container, 256),
3659
+ events: arr(false, 0),
3660
+ series: arr(false, 0),
3661
+ axes: arr(false, 0),
3662
+ sets: arr(false, 0),
3663
+ annotations: arr(annotation, 1024),
3664
+ emphasis: arr(emphasis, 1024)
3665
+ };
3666
+ var bounds = closed3({ x: coordinate, y: coordinate, width: positiveSize, height: positiveSize });
3667
+ var point = closed3({ x: coordinate, y: coordinate });
3668
+ var attachment = closed3({
3669
+ side: enumOf("top", "right", "bottom", "left"),
3670
+ offset: { type: "number", minimum: 0, maximum: 1 }
3671
+ });
3672
+ var route = closed3({
3673
+ mode: enumOf("automatic", "manual"),
3674
+ strategy: enumOf("straight", "orthogonal"),
3675
+ from: attachment,
3676
+ to: attachment,
3677
+ points: arr(point, 256)
3678
+ });
3679
+ var labelPlacement = closed3({ x: coordinate, y: coordinate, width: positiveSize });
3680
+ var appearance = closed3({
3681
+ shape: enumOf(
3682
+ "rectangle",
3683
+ "rounded-rectangle",
3684
+ "ellipse",
3685
+ "diamond",
3686
+ "cylinder",
3687
+ "text",
3688
+ "container",
3689
+ "connector"
3690
+ ),
3691
+ fill: enumOf("surface", "accent", "success", "warning", "danger", "transparent"),
3692
+ stroke: enumOf("default", "accent", "muted", "danger", "none"),
3693
+ strokeWidth: { type: "number", minimum: 0, maximum: 16 },
3694
+ strokeStyle: enumOf("solid", "dashed", "dotted"),
3695
+ fontSize: { type: "integer", minimum: 8, maximum: 72 },
3696
+ textAlign: enumOf("left", "center", "right")
3697
+ });
3698
+ var locks = closed3({
3699
+ position: { type: "boolean" },
3700
+ size: { type: "boolean" },
3701
+ route: { type: "boolean" }
3702
+ });
3703
+ var placement = closed3({
3704
+ elementId: id3,
3705
+ bounds: nullable(bounds),
3706
+ route: nullable(route),
3707
+ label: nullable(labelPlacement),
3708
+ zIndex: index,
3709
+ appearance,
3710
+ locks
3711
+ });
3712
+ var snapshot = closed3({
3713
+ bundleDigest: digest3,
3714
+ semanticDigest: digest3,
3715
+ presentationDigest: digest3
3716
+ });
3717
+ var schema3 = (name, kind, properties) => ({
3718
+ $schema: "https://json-schema.org/draft/2020-12/schema",
3719
+ $id: `https://openplanr.dev/schemas/v1.13.0/${name}.schema.json`,
3720
+ "x-openplanr-contract": { id: name, version: "1.13.0" },
3721
+ ...closed3({
3722
+ kind: { const: kind },
3723
+ schemaVersion: { const: "1.0.0" },
3724
+ protocolVersion: { const: "1.13.0" },
3725
+ ...properties
3726
+ })
3727
+ });
3728
+ var documentSchema = schema3("diagram-document", "planr-diagram", {
3729
+ diagramId: id3,
3730
+ title: str(),
3731
+ summary: str(),
3732
+ audience: enumOf("engineer", "executive", "mixed"),
3733
+ grammar: closed3({
3734
+ id: enumOf("flowchart", "process", "swimlane", "architecture"),
3735
+ version: { const: "1.0.0" }
3736
+ }),
3737
+ ...semanticCollections,
3738
+ laneOrder: ids,
3739
+ accessibility: closed3({ title: str(), description: str(), readingOrder: ids }),
3740
+ documentDigest: digest3
3741
+ });
3742
+ var presentationSchema = schema3("diagram-presentation", "diagram-presentation", {
3743
+ diagramId: id3,
3744
+ semanticDigest: digest3,
3745
+ coordinateSystem: { const: "global-canvas" },
3746
+ layout: closed3({
3747
+ direction: enumOf("top-down", "left-right", "right-left", "bottom-up"),
3748
+ detailTier: enumOf("simplified", "balanced", "faithful")
3749
+ }),
3750
+ theme: closed3({
3751
+ themeId: enumOf("paper", "slate", "midnight"),
3752
+ mode: enumOf("light", "dark", "auto")
3753
+ }),
3754
+ elements: arr(placement, 1e4),
3755
+ presentationDigest: digest3
3756
+ });
3757
+ var range = closed3({
3758
+ startByte: { type: "integer", minimum: 0, maximum: 1048576 },
3759
+ endByte: { type: "integer", minimum: 0, maximum: 1048576 }
3760
+ });
3761
+ var sourceMapSchema = schema3("diagram-source-map", "diagram-source-map", {
3762
+ diagramId: id3,
3763
+ semanticDigest: digest3,
3764
+ sourceDigest: digest3,
3765
+ sourceByteLength: { type: "integer", minimum: 0, maximum: 1048576 },
3766
+ encoding: { const: "utf-8" },
3767
+ parser: closed3({ id: token2, version: str(64, 1) }),
3768
+ certificationVersion: { const: "flowchart-copy-v1" },
3769
+ entries: arr(
3770
+ closed3({
3771
+ sourceId: nullable(str(128, 1)),
3772
+ elementIds: ids,
3773
+ range: nullable(range),
3774
+ construct: token2,
3775
+ confidence: enumOf("exact", "ambiguous"),
3776
+ losses: arr(str(512, 1), 64)
3777
+ }),
3778
+ 1e4
3779
+ )
3780
+ });
3781
+ var fidelityValue = enumOf("lossless", "partial", "unsupported");
3782
+ var fidelitySchema = schema3("diagram-fidelity-report", "diagram-fidelity-report", {
3783
+ diagramId: id3,
3784
+ basis: snapshot,
3785
+ sourceDigest: nullable(digest3),
3786
+ sourceFormat: enumOf("mermaid", "planr-diagram-bundle"),
3787
+ targetFormat: enumOf("mermaid", "planr-diagram-bundle", "svg", "html", "png"),
3788
+ semantic: fidelityValue,
3789
+ presentation: fidelityValue,
3790
+ sourceText: fidelityValue,
3791
+ losses: arr(
3792
+ closed3({
3793
+ dimension: enumOf("semantic", "presentation", "sourceText"),
3794
+ code: token2,
3795
+ elementIds: ids,
3796
+ message: str(512, 1)
3797
+ }),
3798
+ 1024
3799
+ )
3800
+ });
3801
+ var bundleSchema = schema3("diagram-authoring-bundle", "diagram-authoring-bundle", {
3802
+ diagramId: id3,
3803
+ document: documentSchema,
3804
+ presentation: presentationSchema,
3805
+ originalSource: nullable(
3806
+ closed3({ format: { const: "mermaid" }, text: str(1048576), sourceDigest: digest3 })
3807
+ ),
3808
+ sourceMap: nullable(sourceMapSchema),
3809
+ bundleDigest: digest3
3810
+ });
3811
+ var semanticEntry = {
3812
+ oneOf: [
3813
+ closed3({ collection: { const: "nodes" }, value: node }),
3814
+ closed3({ collection: { const: "relations" }, value: relation }),
3815
+ closed3({ collection: { const: "groups" }, value: container }),
3816
+ closed3({ collection: { const: "lanes" }, value: container }),
3817
+ closed3({ collection: { const: "annotations" }, value: annotation })
3818
+ ]
3819
+ };
3820
+ var editableSemanticValue = (collection2, properties) => closed3({
3821
+ type: { const: "update-semantics" },
3822
+ collection: { const: collection2 },
3823
+ elementId: id3,
3824
+ before: closed3(properties),
3825
+ after: closed3(properties)
3826
+ });
3827
+ var updateSchemas = [
3828
+ editableSemanticValue("nodes", {
3829
+ label: str(),
3830
+ kind: enumOf(...semanticKinds),
3831
+ description: nullable(str())
3832
+ }),
3833
+ editableSemanticValue("relations", {
3834
+ from: id3,
3835
+ to: id3,
3836
+ kind: enumOf(...relationKinds),
3837
+ direction: enumOf("forward", "both", "none"),
3838
+ label: nullable(str()),
3839
+ weight: nullable({ type: "number", minimum: 0, maximum: 1e6 })
3840
+ }),
3841
+ editableSemanticValue("groups", { label: str() }),
3842
+ editableSemanticValue("lanes", { label: str() }),
3843
+ editableSemanticValue("annotations", { text: str(), targetId: nullable(id3) }),
3844
+ closed3(
3845
+ {
3846
+ type: { const: "update-semantics" },
3847
+ collection: { const: "emphasis" },
3848
+ elementId: id3,
3849
+ before: nullable(enumOf("primary", "secondary", "muted")),
3850
+ after: nullable(enumOf("primary", "secondary", "muted")),
3851
+ index: { type: "integer", minimum: 0, maximum: 1024 }
3852
+ },
3853
+ ["type", "collection", "elementId", "before", "after"]
3854
+ ),
3855
+ closed3({
3856
+ type: { const: "update-semantics" },
3857
+ collection: { const: "document" },
3858
+ before: closed3({
3859
+ title: str(),
3860
+ summary: str(),
3861
+ audience: enumOf("engineer", "executive", "mixed"),
3862
+ accessibility: documentSchema.properties.accessibility
3863
+ }),
3864
+ after: closed3({
3865
+ title: str(),
3866
+ summary: str(),
3867
+ audience: enumOf("engineer", "executive", "mixed"),
3868
+ accessibility: documentSchema.properties.accessibility
3869
+ })
3870
+ }),
3871
+ closed3({
3872
+ type: { const: "update-semantics" },
3873
+ collection: { const: "source-map" },
3874
+ before: nullable(sourceMapSchema),
3875
+ after: nullable(sourceMapSchema)
3876
+ })
3877
+ ];
3878
+ var membershipState = closed3({
3879
+ groups: arr(closed3({ id: id3, members: ids }), 1024),
3880
+ lanes: arr(closed3({ id: id3, members: ids }), 256),
3881
+ laneOrder: ids
3882
+ });
3883
+ var geometryValue = closed3({
3884
+ bounds: nullable(bounds),
3885
+ route: nullable(route),
3886
+ label: nullable(labelPlacement),
3887
+ zIndex: index
3888
+ });
3889
+ var appearanceValue = closed3({ appearance, locks });
3890
+ var operation = {
3891
+ oneOf: [
3892
+ closed3(
3893
+ {
3894
+ type: { const: "insert-elements" },
3895
+ elements: arr(semanticEntry, 1e4, 1),
3896
+ presentation: arr(placement, 1e4, 1),
3897
+ positions: arr(
3898
+ closed3({ elementId: id3, semanticIndex: index, presentationIndex: index }),
3899
+ 1e4,
3900
+ 1
3901
+ )
3902
+ },
3903
+ ["type", "elements", "presentation"]
3904
+ ),
3905
+ ...updateSchemas,
3906
+ closed3({
3907
+ type: { const: "remove-elements" },
3908
+ elements: arr(semanticEntry, 1e4, 1),
3909
+ presentation: arr(placement, 1e4, 1)
3910
+ }),
3911
+ closed3({
3912
+ type: { const: "set-membership-order" },
3913
+ before: membershipState,
3914
+ after: membershipState
3915
+ }),
3916
+ closed3({
3917
+ type: { const: "set-geometry" },
3918
+ changes: arr(
3919
+ closed3({ elementId: id3, before: geometryValue, after: geometryValue }),
3920
+ 1e4,
3921
+ 1
3922
+ )
3923
+ }),
3924
+ closed3({
3925
+ type: { const: "set-appearance-locks" },
3926
+ changes: arr(
3927
+ closed3({ elementId: id3, before: appearanceValue, after: appearanceValue }),
3928
+ 1e4,
3929
+ 1
3930
+ )
3931
+ })
3932
+ ]
3933
+ };
3934
+ var transactionSchema = schema3("diagram-edit-transaction", "diagram-edit-transaction", {
3935
+ transactionId: id3,
3936
+ diagramId: id3,
3937
+ base: snapshot,
3938
+ operations: arr(operation, 256, 1),
3939
+ undoOf: nullable(id3)
3940
+ });
3941
+ var proposalSchema = schema3("diagram-change-proposal", "diagram-change-proposal", {
3942
+ proposalId: id3,
3943
+ diagramId: id3,
3944
+ base: snapshot,
3945
+ transaction: transactionSchema,
3946
+ summary: str(4096, 1),
3947
+ author: closed3({ kind: enumOf("human", "agent"), id: id3 }),
3948
+ status: enumOf("proposed", "accepted", "rejected", "stale")
3949
+ });
3950
+ var publicationSchema = schema3("diagram-publication-state", "diagram-publication-state", {
3951
+ diagramId: id3,
3952
+ draft: nullable(snapshot),
3953
+ published: nullable(snapshot),
3954
+ audience: enumOf("private", "company", "public"),
3955
+ capabilitySemantics: { const: "descriptive-only-requires-host-authorization" }
3956
+ });
3957
+ var manifestSchema = schema3("diagram-manifest", "diagram-manifest", {
3958
+ diagramId: id3,
3959
+ basis: snapshot,
3960
+ bundle: closed3({ path: relativePath, transportDigest: digest3 }),
3961
+ renderer: closed3({ id: token2, version: str(64, 1) }),
3962
+ outputs: arr(
3963
+ closed3({
3964
+ path: relativePath,
3965
+ mediaType: enumOf("image/svg+xml", "text/html", "image/png"),
3966
+ transportDigest: digest3,
3967
+ fidelity: fidelitySchema
3968
+ }),
3969
+ 32,
3970
+ 1
3971
+ )
3972
+ });
3973
+ manifestSchema.properties.theme = closed3({ id: token2, version: str(64, 1) });
3974
+ var mermaidConstruct = closed3({
3975
+ construct: token2,
3976
+ import: fidelityValue,
3977
+ export: fidelityValue,
3978
+ semanticRoundTrip: fidelityValue,
3979
+ mapping: str(512, 1)
3980
+ });
3981
+ var capabilityProfile = closed3({
3982
+ grammarId: enumOf("flowchart", "process", "swimlane", "architecture"),
3983
+ authoring: { const: true },
3984
+ primitives: arr(
3985
+ enumOf("node", "relation", "group", "lane", "annotation", "emphasis"),
3986
+ 6,
3987
+ 1,
3988
+ true
3989
+ ),
3990
+ nodeKinds: arr(enumOf(...semanticKinds), 6, 1, true),
3991
+ relationKinds: arr(enumOf(...relationKinds), 5, 1, true),
3992
+ operations: arr(enumOf(...DIAGRAM_EDIT_OPERATION_CLASSES), 6, 6, true),
3993
+ mermaid: closed3({
3994
+ mode: { const: "copy" },
3995
+ certificationVersion: { const: "flowchart-copy-v1" },
3996
+ constructs: arr(mermaidConstruct, 32, 1),
3997
+ linkedSource: { const: false }
3998
+ })
3999
+ });
4000
+ var capabilitiesSchema = schema3(
4001
+ "diagram-authoring-capabilities",
4002
+ "diagram-authoring-capabilities",
4003
+ {
4004
+ version: { const: "1.0.0" },
4005
+ liveCollaboration: { const: false },
4006
+ profiles: arr(capabilityProfile, 4, 4),
4007
+ unsupportedGrammars: arr(token2, 128, 0, true)
4008
+ }
4009
+ );
4010
+ var schemas = {
4011
+ "diagram-document": documentSchema,
4012
+ "diagram-presentation": presentationSchema,
4013
+ "diagram-authoring-bundle": bundleSchema,
4014
+ "diagram-edit-transaction": transactionSchema,
4015
+ "diagram-source-map": sourceMapSchema,
4016
+ "diagram-fidelity-report": fidelitySchema,
4017
+ "diagram-manifest": manifestSchema,
4018
+ "diagram-change-proposal": proposalSchema,
4019
+ "diagram-publication-state": publicationSchema,
4020
+ "diagram-authoring-capabilities": capabilitiesSchema
4021
+ };
4022
+ var DIAGRAM_AUTHORING_SCHEMAS = deepFreeze(schemas);
4023
+ var DIAGRAM_AUTHORING_CONTRACT_FILES = deepFreeze(
4024
+ /** @type {Record<DiagramAuthoringContractKind, string>} */
4025
+ Object.fromEntries(Object.keys(schemas).map((name) => [name, `${name}.schema.json`]))
4026
+ );
4027
+ var mermaidConstructs = [
4028
+ [
4029
+ "flowchart-direction",
4030
+ "lossless",
4031
+ "lossless",
4032
+ "lossless",
4033
+ "flowchart TB/TD/LR/RL/BT maps to presentation layout direction"
4034
+ ],
4035
+ [
4036
+ "explicit-node-id",
4037
+ "lossless",
4038
+ "lossless",
4039
+ "lossless",
4040
+ "Explicit source ID maps through source-map to stable semantic node ID; labels never establish identity"
4041
+ ],
4042
+ [
4043
+ "plain-node-label",
4044
+ "lossless",
4045
+ "lossless",
4046
+ "lossless",
4047
+ "Escaped plain text maps to node label; HTML is inert text and is not executed"
4048
+ ],
4049
+ [
4050
+ "rectangle-node",
4051
+ "lossless",
4052
+ "lossless",
4053
+ "lossless",
4054
+ "node.kind process and presentation shape rectangle"
4055
+ ],
4056
+ [
4057
+ "rounded-node",
4058
+ "lossless",
4059
+ "lossless",
4060
+ "lossless",
4061
+ "node.kind process and presentation shape rounded-rectangle"
4062
+ ],
4063
+ [
4064
+ "decision-node",
4065
+ "lossless",
4066
+ "lossless",
4067
+ "lossless",
4068
+ "node.kind decision and presentation shape diamond"
4069
+ ],
4070
+ [
4071
+ "cylinder-node",
4072
+ "lossless",
4073
+ "lossless",
4074
+ "lossless",
4075
+ "node.kind data-store and presentation shape cylinder"
4076
+ ],
4077
+ [
4078
+ "directed-edge",
4079
+ "lossless",
4080
+ "lossless",
4081
+ "lossless",
4082
+ "relation.kind flow and direction forward; source and target IDs are semantic endpoints"
4083
+ ],
4084
+ [
4085
+ "bidirectional-edge",
4086
+ "lossless",
4087
+ "lossless",
4088
+ "lossless",
4089
+ "relation.kind flow and direction both"
4090
+ ],
4091
+ [
4092
+ "undirected-edge",
4093
+ "lossless",
4094
+ "lossless",
4095
+ "lossless",
4096
+ "relation.kind association and direction none"
4097
+ ],
4098
+ [
4099
+ "plain-edge-label",
4100
+ "lossless",
4101
+ "lossless",
4102
+ "lossless",
4103
+ "Escaped plain text maps to relation label"
4104
+ ],
4105
+ [
4106
+ "subgraph",
4107
+ "lossless",
4108
+ "lossless",
4109
+ "lossless",
4110
+ "Explicit subgraph ID maps to one semantic group in an acyclic single-parent forest"
4111
+ ],
4112
+ [
4113
+ "lane-semantics",
4114
+ "unsupported",
4115
+ "partial",
4116
+ "partial",
4117
+ "Mermaid subgraphs do not encode lane identity or explicit lane order"
4118
+ ],
4119
+ [
4120
+ "manual-geometry",
4121
+ "unsupported",
4122
+ "partial",
4123
+ "partial",
4124
+ "Standard Mermaid does not preserve coordinates, routes, attachments, stacking or locks"
4125
+ ],
4126
+ [
4127
+ "styles-and-directives",
4128
+ "unsupported",
4129
+ "unsupported",
4130
+ "unsupported",
4131
+ "CSS, classDef, init directives, links, callbacks and HTML labels are outside this certified subset"
4132
+ ],
4133
+ [
4134
+ "unsupported-construct",
4135
+ "unsupported",
4136
+ "unsupported",
4137
+ "unsupported",
4138
+ "Unrecognized syntax is retained as original source with explicit loss diagnostics"
4139
+ ]
4140
+ ].map(([construct, input, output, roundTrip, mapping]) => ({
4141
+ construct,
4142
+ import: input,
4143
+ export: output,
4144
+ semanticRoundTrip: roundTrip,
4145
+ mapping
4146
+ }));
4147
+ var profileIds = ["flowchart", "process", "swimlane", "architecture"];
4148
+ var DIAGRAM_AUTHORING_CAPABILITIES = deepFreeze({
4149
+ kind: "diagram-authoring-capabilities",
4150
+ schemaVersion: "1.0.0",
4151
+ protocolVersion: "1.13.0",
4152
+ version: "1.0.0",
4153
+ liveCollaboration: false,
4154
+ profiles: (
4155
+ /** @type {DiagramAuthoringCapability[]} */
4156
+ profileIds.map((grammarId) => ({
4157
+ grammarId,
4158
+ authoring: true,
4159
+ primitives: [
4160
+ "node",
4161
+ "relation",
4162
+ "group",
4163
+ ...grammarId === "process" || grammarId === "swimlane" ? ["lane"] : [],
4164
+ "annotation",
4165
+ "emphasis"
4166
+ ],
4167
+ nodeKinds: [...semanticKinds],
4168
+ relationKinds: [...relationKinds],
4169
+ operations: [...DIAGRAM_EDIT_OPERATION_CLASSES],
4170
+ mermaid: {
4171
+ mode: "copy",
4172
+ certificationVersion: "flowchart-copy-v1",
4173
+ constructs: mermaidConstructs.map((entry) => ({ ...entry })),
4174
+ linkedSource: false
4175
+ }
4176
+ }))
4177
+ ),
4178
+ unsupportedGrammars: DIAGRAM_REGISTRIES["diagram-grammars.json"].grammars.map((entry) => entry.grammarId).filter((value) => !profileIds.includes(value))
4179
+ });
4180
+
4181
+ // packages/protocol/src/design-contracts.mjs
4182
+ var DESIGN_DOCUMENT_VERSION = "1.0.0";
4183
+ var freeze = (value) => {
4184
+ if (value && typeof value === "object") {
4185
+ for (const nested of Object.values(value)) freeze(nested);
4186
+ Object.freeze(value);
4187
+ }
4188
+ return value;
4189
+ };
4190
+ var DESIGN_DOCUMENT_SCHEMA = freeze({
4191
+ $schema: "https://json-schema.org/draft/2020-12/schema",
4192
+ $id: "https://openplanr.dev/schemas/v1.9.0/design-document.schema.json",
4193
+ "x-openplanr-contract": { id: "design-document", version: "1.9.0" },
4194
+ title: "OpenPlanr authored design document",
4195
+ type: "object",
4196
+ additionalProperties: false,
4197
+ required: [
4198
+ "kind",
4199
+ "schemaVersion",
4200
+ "id",
4201
+ "title",
4202
+ "brief",
4203
+ "frames",
4204
+ "screens",
4205
+ "screenOrder",
4206
+ "variants",
4207
+ "selectedVariant",
4208
+ "defaultView"
4209
+ ],
4210
+ properties: {
4211
+ kind: { const: "openplanr-design-document" },
4212
+ schemaVersion: { const: DESIGN_DOCUMENT_VERSION },
4213
+ id: { $ref: "#/$defs/id" },
4214
+ title: { $ref: "#/$defs/text" },
4215
+ brief: {
4216
+ type: "object",
4217
+ additionalProperties: false,
4218
+ required: ["text", "source", "provenance"],
4219
+ properties: {
4220
+ text: { $ref: "#/$defs/text" },
4221
+ source: { enum: ["spec", "png", "describe"] },
4222
+ provenance: { enum: ["spec", "inferred"] },
4223
+ references: { type: "array", items: { $ref: "#/$defs/text" }, uniqueItems: true }
4224
+ }
4225
+ },
4226
+ designSystem: {
4227
+ type: "object",
4228
+ additionalProperties: false,
4229
+ properties: {
4230
+ path: { $ref: "#/$defs/localPath" },
4231
+ tokens: { $ref: "#/$defs/localPath" },
4232
+ spacing: {
4233
+ type: "array",
4234
+ minItems: 1,
4235
+ uniqueItems: true,
4236
+ items: { type: "number", minimum: 0, maximum: 16384 }
4237
+ }
4238
+ }
4239
+ },
4240
+ assets: { $ref: "#/$defs/paths" },
4241
+ frames: {
4242
+ type: "array",
4243
+ minItems: 1,
4244
+ items: {
4245
+ type: "object",
4246
+ additionalProperties: false,
4247
+ required: ["id", "label", "width", "height"],
4248
+ properties: {
4249
+ id: { $ref: "#/$defs/id" },
4250
+ label: { $ref: "#/$defs/text" },
4251
+ width: { type: "integer", minimum: 1, maximum: 16384 },
4252
+ height: { type: "integer", minimum: 1, maximum: 16384 }
4253
+ }
4254
+ }
4255
+ },
4256
+ screens: {
4257
+ type: "array",
4258
+ minItems: 1,
4259
+ items: {
4260
+ type: "object",
4261
+ additionalProperties: false,
4262
+ required: ["id", "title", "source"],
4263
+ properties: {
4264
+ id: { $ref: "#/$defs/id" },
4265
+ title: { $ref: "#/$defs/text" },
4266
+ description: { $ref: "#/$defs/text" },
4267
+ source: { $ref: "#/$defs/source" },
4268
+ anchors: { $ref: "#/$defs/ids" }
4269
+ }
4270
+ }
4271
+ },
4272
+ screenOrder: { type: "array", minItems: 1, items: { $ref: "#/$defs/id" }, uniqueItems: true },
4273
+ flows: {
4274
+ type: "array",
4275
+ items: {
4276
+ type: "object",
4277
+ additionalProperties: false,
4278
+ required: ["id", "title", "screens"],
4279
+ properties: {
4280
+ id: { $ref: "#/$defs/id" },
4281
+ title: { $ref: "#/$defs/text" },
4282
+ screens: { type: "array", minItems: 1, items: { $ref: "#/$defs/id" } }
4283
+ }
4284
+ }
4285
+ },
4286
+ variants: {
4287
+ type: "array",
4288
+ minItems: 1,
4289
+ items: {
4290
+ type: "object",
4291
+ additionalProperties: false,
4292
+ required: ["id", "label", "status"],
4293
+ properties: {
4294
+ id: { $ref: "#/$defs/id" },
4295
+ label: { $ref: "#/$defs/text" },
4296
+ description: { $ref: "#/$defs/text" },
4297
+ status: { enum: ["ready", "failed"] },
4298
+ issue: { $ref: "#/$defs/text" },
4299
+ sources: { type: "object", additionalProperties: { $ref: "#/$defs/source" } }
4300
+ },
4301
+ if: { properties: { status: { const: "failed" } } },
4302
+ then: { required: ["issue"] }
4303
+ }
4304
+ },
4305
+ selectedVariant: { $ref: "#/$defs/id" },
4306
+ defaultView: { enum: ["canvas", "prototype", "walkthrough"] }
4307
+ },
4308
+ $defs: {
4309
+ id: { type: "string", minLength: 1, maxLength: 128, pattern: "^[A-Za-z][A-Za-z0-9_-]*$" },
4310
+ text: { type: "string", minLength: 1, pattern: "\\S" },
4311
+ ids: { type: "array", items: { $ref: "#/$defs/id" }, uniqueItems: true },
4312
+ localPath: {
4313
+ type: "string",
4314
+ minLength: 1,
4315
+ description: "Path relative to the authored document directory. No URL, traversal, encoded path, query or fragment.",
4316
+ pattern: "^(?!/)(?!.*(?:^|/)\\.{1,2}(?:/|$))(?!.*//)(?!.*[/ ]$)[^\\\\:\\u0000-\\u001F%?#]+$"
4317
+ },
4318
+ paths: { type: "array", items: { $ref: "#/$defs/localPath" }, uniqueItems: true },
4319
+ source: {
4320
+ type: "object",
4321
+ additionalProperties: false,
4322
+ required: ["html"],
4323
+ properties: {
4324
+ html: { $ref: "#/$defs/localPath" },
4325
+ styles: { $ref: "#/$defs/paths" },
4326
+ scripts: { $ref: "#/$defs/paths" }
4327
+ }
4328
+ }
4329
+ }
4330
+ });
4331
+
4332
+ // packages/protocol/src/workspace-contracts.mjs
4333
+ var DESIGN_WORKSPACE_VERSION = "1.0.0";
4334
+ var DESIGN_WORKSPACE_MAX_BYTES = 5 * 1024 * 1024;
4335
+ var DESIGN_WORKSPACE_MAX_EVENT_BYTES = 256 * 1024;
4336
+ var DESIGN_WORKSPACE_ID_PATTERN = "^[A-Za-z0-9_-]{22,64}$";
4337
+ var id4 = { type: "string", pattern: DESIGN_WORKSPACE_ID_PATTERN };
4338
+ var digest4 = { type: "string", pattern: "^[a-f0-9]{64}$" };
4339
+ var b64 = { type: "string", pattern: "^[A-Za-z0-9_-]+$" };
4340
+ var epoch = { type: "integer", minimum: 1, maximum: 2147483647 };
4341
+ var cipherProperties = {
4342
+ iv: { ...b64, minLength: 16, maxLength: 16 },
4343
+ ciphertext: { ...b64, minLength: 22, maxLength: Math.ceil(DESIGN_WORKSPACE_MAX_BYTES * 4 / 3) }
4344
+ };
4345
+ var signature2 = { ...b64, minLength: 86, maxLength: 86 };
4346
+ var publicKey = {
4347
+ type: "object",
4348
+ additionalProperties: false,
4349
+ required: ["kty", "crv", "x", "y"],
4350
+ properties: {
4351
+ kty: { const: "EC" },
4352
+ crv: { const: "P-256" },
4353
+ x: { ...b64, minLength: 43, maxLength: 43 },
4354
+ y: { ...b64, minLength: 43, maxLength: 43 },
4355
+ ext: { type: "boolean" },
4356
+ key_ops: { type: "array", items: { const: "verify" }, maxItems: 1 }
4357
+ }
4358
+ };
4359
+ var schema4 = (name, properties, required = Object.keys(properties)) => ({
4360
+ $schema: "https://json-schema.org/draft/2020-12/schema",
4361
+ $id: `https://openplanr.dev/schemas/v1.9.0/${name}.schema.json`,
4362
+ "x-openplanr-contract": { id: name, version: "1.9.0" },
4363
+ type: "object",
4364
+ additionalProperties: false,
4365
+ properties,
4366
+ required
4367
+ });
4368
+ var DESIGN_WORKSPACE_REVISION_SCHEMA = schema4("design-workspace-revision", {
4369
+ id: id4,
4370
+ epoch,
4371
+ reviewOf: digest4,
4372
+ createdAt: { type: "string", format: "date-time" },
4373
+ ...cipherProperties,
4374
+ signature: signature2
4375
+ });
4376
+ var DESIGN_WORKSPACE_EVENT_SCHEMA = schema4("design-workspace-event", {
4377
+ id: id4,
4378
+ revisionId: id4,
4379
+ reviewOf: digest4,
4380
+ epoch,
4381
+ ...cipherProperties,
4382
+ publicKey,
4383
+ signature: signature2
4384
+ });
4385
+ var sealed = {
4386
+ type: "object",
4387
+ additionalProperties: false,
4388
+ required: ["iv", "ciphertext"],
4389
+ properties: cipherProperties
4390
+ };
4391
+ var DESIGN_WORKSPACE_CREATE_SCHEMA = schema4("design-workspace-create", {
4392
+ schemaVersion: { const: DESIGN_WORKSPACE_VERSION },
4393
+ id: id4,
4394
+ ownerPublicKey: publicKey,
4395
+ ownerAuthHash: digest4,
4396
+ reviewerAuthHash: digest4,
4397
+ epoch: { const: 1 },
4398
+ keyring: sealed,
4399
+ revision: DESIGN_WORKSPACE_REVISION_SCHEMA,
4400
+ operationId: id4,
4401
+ signature: signature2
4402
+ });
4403
+ var DESIGN_WORKSPACE_SCHEMA = schema4("design-review-workspace", {
4404
+ schemaVersion: { const: DESIGN_WORKSPACE_VERSION },
4405
+ id: id4,
4406
+ version: epoch,
4407
+ epoch,
4408
+ currentRevision: id4,
4409
+ commentsPaused: { type: "boolean" },
4410
+ ownerPublicKey: publicKey,
4411
+ keyring: sealed
4412
+ });
4413
+ var designProperties = (
4414
+ /** @type {Record<string, { items: { properties: Record<string, unknown>; required: string[] } }>} */
4415
+ structuredClone(DESIGN_DOCUMENT_SCHEMA.properties)
4416
+ );
4417
+ for (const key of ["kind", "schemaVersion", "brief", "assets", "designSystem"])
4418
+ delete designProperties[key];
4419
+ delete designProperties.screens.items.properties.source;
4420
+ designProperties.screens.items.required = ["id", "title"];
4421
+ delete designProperties.variants.items.properties.sources;
4422
+ var DESIGN_REVIEW_BUNDLE_SCHEMA = {
4423
+ ...schema4(
4424
+ "design-review-bundle",
4425
+ {
4426
+ kind: { const: "openplanr-design-review-bundle" },
4427
+ schemaVersion: { const: DESIGN_WORKSPACE_VERSION },
4428
+ design: {
4429
+ type: "object",
4430
+ additionalProperties: false,
4431
+ properties: designProperties,
4432
+ required: [
4433
+ "id",
4434
+ "title",
4435
+ "frames",
4436
+ "screens",
4437
+ "screenOrder",
4438
+ "variants",
4439
+ "selectedVariant",
4440
+ "defaultView"
4441
+ ]
4442
+ },
4443
+ envelope: { type: "object", required: ["schemaVersion", "artifacts", "viewer"] },
4444
+ entries: {
4445
+ type: "array",
4446
+ minItems: 1,
4447
+ maxItems: 256,
4448
+ items: {
4449
+ type: "object",
4450
+ additionalProperties: false,
4451
+ required: ["artifactId", "screenId", "variantId", "frameId"],
4452
+ properties: Object.fromEntries(
4453
+ ["artifactId", "screenId", "variantId", "frameId"].map((key) => [
4454
+ key,
4455
+ { type: "string", minLength: 1, maxLength: 128 }
4456
+ ])
4457
+ )
4458
+ }
4459
+ },
4460
+ state: {
4461
+ type: ["object", "null"],
4462
+ additionalProperties: false,
4463
+ properties: {
4464
+ positions: {
4465
+ type: "object",
4466
+ additionalProperties: {
4467
+ type: "object",
4468
+ additionalProperties: false,
4469
+ required: ["x", "y"],
4470
+ properties: {
4471
+ x: { type: "number", minimum: -1e7, maximum: 1e7 },
4472
+ y: { type: "number", minimum: -1e7, maximum: 1e7 }
4473
+ }
4474
+ }
4475
+ }
4476
+ }
4477
+ },
4478
+ revision: { type: "string", minLength: 1, maxLength: 128 },
4479
+ verification: {
4480
+ type: ["object", "null"],
4481
+ additionalProperties: false,
4482
+ properties: { status: { enum: ["verified", "unverified", "failed", "pending"] } }
4483
+ }
4484
+ },
4485
+ ["kind", "schemaVersion", "design", "envelope", "entries", "revision"]
4486
+ ),
4487
+ $defs: structuredClone(DESIGN_DOCUMENT_SCHEMA.$defs)
4488
+ };
4489
+ var DESIGN_WORKSPACE_SCHEMAS = Object.freeze({
4490
+ "design-review-workspace": DESIGN_WORKSPACE_SCHEMA,
4491
+ "design-workspace-create": DESIGN_WORKSPACE_CREATE_SCHEMA,
4492
+ "design-workspace-revision": DESIGN_WORKSPACE_REVISION_SCHEMA,
4493
+ "design-workspace-event": DESIGN_WORKSPACE_EVENT_SCHEMA,
4494
+ "design-review-bundle": DESIGN_REVIEW_BUNDLE_SCHEMA
4495
+ });
4496
+
4497
+ // packages/protocol/src/diagram-review-contracts.mjs
4498
+ var DIAGRAM_WORKSPACE_MAX_BYTES = 5 * 1024 * 1024;
4499
+ var DIAGRAM_WORKSPACE_MAX_EVENT_BYTES = 256 * 1024;
4500
+ var text2 = { type: "string", maxLength: 8192 };
4501
+ var id5 = { type: "string", minLength: 1, maxLength: 160 };
4502
+ var digest5 = { type: "string", pattern: "^[a-f0-9]{64}$" };
4503
+ var shaDigest = { type: "string", pattern: "^sha256:[a-f0-9]{64}$" };
4504
+ var coord = { type: "number", minimum: 0, maximum: 1 };
4505
+ var closed4 = (properties, required = Object.keys(properties)) => ({
4506
+ type: "object",
4507
+ properties,
4508
+ required,
4509
+ additionalProperties: false
4510
+ });
4511
+ var list2 = (items, maxItems = 1e4) => ({ type: "array", items, maxItems });
4512
+ var contract = (name, shape) => ({
4513
+ $schema: "https://json-schema.org/draft/2020-12/schema",
4514
+ $id: `https://openplanr.dev/schemas/v1.15.0/${name}.schema.json`,
4515
+ "x-openplanr-contract": { id: name, version: "1.15.0" },
4516
+ ...shape
4517
+ });
4518
+ var item = closed4({ id: id5, label: text2, kind: id5, x: { type: "number" }, y: { type: "number" } });
4519
+ var relation2 = closed4({ id: id5, from: id5, to: id5, label: text2, kind: id5 });
4520
+ var DIAGRAM_REVIEW_BUNDLE_SCHEMA = contract(
4521
+ "diagram-review-bundle",
4522
+ closed4(
4523
+ {
4524
+ kind: { const: "openplanr-diagram-review-bundle" },
4525
+ schemaVersion: { const: "1.0.0" },
4526
+ diagramId: id5,
4527
+ title: text2,
4528
+ source: closed4({ kind: { enum: ["manifest", "authoring"] }, digest: shaDigest }),
4529
+ rendering: closed4({ id: id5, version: id5, fontFamily: { const: "Inter" } }),
4530
+ summary: text2,
4531
+ grammar: id5,
4532
+ colorScheme: { enum: ["light", "dark"] },
4533
+ scene: closed4({
4534
+ svg: { type: "string", minLength: 1, maxLength: 5 * 1024 * 1024 },
4535
+ width: { type: "number", exclusiveMinimum: 0, maximum: 16384 },
4536
+ height: { type: "number", exclusiveMinimum: 0, maximum: 16384 },
4537
+ items: list2(item),
4538
+ relations: list2(relation2)
4539
+ }),
4540
+ authored: DIAGRAM_AUTHORING_SCHEMAS["diagram-authoring-bundle"]
4541
+ },
4542
+ ["kind", "schemaVersion", "diagramId", "title", "source", "rendering", "scene"]
4543
+ )
4544
+ );
4545
+ var feedbackBase = {
4546
+ kind: { enum: ["comment", "reply", "resolve"] },
4547
+ author: { ...id5, maxLength: 160 },
4548
+ reviewOf: digest5,
4549
+ createdAt: { type: "string", format: "date-time" },
4550
+ commentId: id5
4551
+ };
4552
+ var DIAGRAM_REVIEW_FEEDBACK_SCHEMA = contract("diagram-review-feedback", {
4553
+ oneOf: [
4554
+ closed4({
4555
+ ...feedbackBase,
4556
+ kind: { const: "comment" },
4557
+ body: { ...text2, minLength: 1 },
4558
+ target: closed4({ elementId: id5, x: coord, y: coord }, [])
4559
+ }),
4560
+ closed4({
4561
+ ...feedbackBase,
4562
+ kind: { const: "reply" },
4563
+ body: { ...text2, minLength: 1 },
4564
+ parentId: id5
4565
+ }),
4566
+ closed4({ ...feedbackBase, kind: { const: "resolve" }, resolved: { type: "boolean" } })
4567
+ ]
4568
+ });
4569
+ function workspaceSchema(name, original) {
4570
+ return contract(name, {
4571
+ ...structuredClone(original),
4572
+ $id: `https://openplanr.dev/schemas/v1.15.0/${name}.schema.json`,
4573
+ "x-openplanr-contract": { id: name, version: "1.15.0" }
4574
+ });
4575
+ }
4576
+ var DIAGRAM_WORKSPACE_SCHEMA = workspaceSchema(
4577
+ "diagram-review-workspace",
4578
+ DESIGN_WORKSPACE_SCHEMAS["design-review-workspace"]
4579
+ );
4580
+ var DIAGRAM_WORKSPACE_CREATE_SCHEMA = workspaceSchema(
4581
+ "diagram-workspace-create",
4582
+ DESIGN_WORKSPACE_SCHEMAS["design-workspace-create"]
4583
+ );
4584
+ var DIAGRAM_WORKSPACE_REVISION_SCHEMA = workspaceSchema(
4585
+ "diagram-workspace-revision",
4586
+ DESIGN_WORKSPACE_SCHEMAS["design-workspace-revision"]
4587
+ );
4588
+ var DIAGRAM_WORKSPACE_EVENT_SCHEMA = workspaceSchema(
4589
+ "diagram-workspace-event",
4590
+ DESIGN_WORKSPACE_SCHEMAS["design-workspace-event"]
4591
+ );
4592
+ var DIAGRAM_REVIEW_SCHEMAS = Object.freeze({
4593
+ "diagram-review-bundle": DIAGRAM_REVIEW_BUNDLE_SCHEMA,
4594
+ "diagram-review-feedback": DIAGRAM_REVIEW_FEEDBACK_SCHEMA,
4595
+ "diagram-review-workspace": DIAGRAM_WORKSPACE_SCHEMA,
4596
+ "diagram-workspace-create": DIAGRAM_WORKSPACE_CREATE_SCHEMA,
4597
+ "diagram-workspace-revision": DIAGRAM_WORKSPACE_REVISION_SCHEMA,
4598
+ "diagram-workspace-event": DIAGRAM_WORKSPACE_EVENT_SCHEMA
4599
+ });
4600
+
4601
+ // packages/protocol/src/studio-presentation-contracts.mjs
4602
+ var DIAGRAM_PRESENTATION_SCHEMA = {
4603
+ $schema: "https://json-schema.org/draft/2020-12/schema",
4604
+ $id: "https://openplanr.dev/schemas/v1.17.0/diagram-presentation.schema.json",
4605
+ "x-openplanr-contract": { id: "diagram-presentation", version: "1.17.0" },
4606
+ type: "object",
4607
+ additionalProperties: false,
4608
+ required: ["kind", "schemaVersion", "palette", "theme", "fontFamily"],
4609
+ properties: {
4610
+ kind: { const: "openplanr-diagram-presentation" },
4611
+ schemaVersion: { const: "2.0.0" },
4612
+ palette: { const: "openplanr-brand-v2" },
4613
+ theme: { enum: ["light", "dark"] },
4614
+ fontFamily: { const: "Inter" }
4615
+ }
4616
+ };
4617
+ var DIAGRAM_REVIEW_BUNDLE_V11_SCHEMA = structuredClone(DIAGRAM_REVIEW_BUNDLE_SCHEMA);
4618
+ Object.assign(DIAGRAM_REVIEW_BUNDLE_V11_SCHEMA, {
4619
+ $id: "https://openplanr.dev/schemas/v1.17.0/diagram-review-bundle.schema.json",
4620
+ "x-openplanr-contract": { id: "diagram-review-bundle", version: "1.17.0" }
4621
+ });
4622
+ DIAGRAM_REVIEW_BUNDLE_V11_SCHEMA.properties.schemaVersion = { const: "1.1.0" };
4623
+ DIAGRAM_REVIEW_BUNDLE_V11_SCHEMA.properties.presentation = DIAGRAM_PRESENTATION_SCHEMA;
4624
+ DIAGRAM_REVIEW_BUNDLE_V11_SCHEMA.required.push("presentation");
4625
+ var DIAGRAM_AUTHORING_BUNDLE_V11_SCHEMA = structuredClone(
4626
+ DIAGRAM_AUTHORING_SCHEMAS["diagram-authoring-bundle"]
4627
+ );
4628
+ Object.assign(DIAGRAM_AUTHORING_BUNDLE_V11_SCHEMA, {
4629
+ $id: "https://openplanr.dev/schemas/v1.17.0/diagram-authoring-bundle.schema.json",
4630
+ "x-openplanr-contract": { id: "diagram-authoring-bundle", version: "1.17.0" }
4631
+ });
4632
+ Object.assign(DIAGRAM_AUTHORING_BUNDLE_V11_SCHEMA.properties, {
4633
+ schemaVersion: { const: "1.1.0" },
4634
+ protocolVersion: { const: "1.17.0" },
4635
+ studioPresentation: DIAGRAM_PRESENTATION_SCHEMA
4636
+ });
4637
+ DIAGRAM_AUTHORING_BUNDLE_V11_SCHEMA.required.push("studioPresentation");
4638
+ var DIAGRAM_EDIT_TRANSACTION_V11_SCHEMA = structuredClone(
4639
+ DIAGRAM_AUTHORING_SCHEMAS["diagram-edit-transaction"]
4640
+ );
4641
+ Object.assign(DIAGRAM_EDIT_TRANSACTION_V11_SCHEMA, {
4642
+ $id: "https://openplanr.dev/schemas/v1.17.0/diagram-edit-transaction.schema.json",
4643
+ "x-openplanr-contract": { id: "diagram-edit-transaction", version: "1.17.0" }
4644
+ });
4645
+ Object.assign(DIAGRAM_EDIT_TRANSACTION_V11_SCHEMA.properties, {
4646
+ schemaVersion: { const: "1.1.0" },
4647
+ protocolVersion: { const: "1.17.0" }
4648
+ });
4649
+ DIAGRAM_EDIT_TRANSACTION_V11_SCHEMA.properties.operations.items.oneOf.push({
4650
+ type: "object",
4651
+ additionalProperties: false,
4652
+ required: ["type", "before", "after"],
4653
+ properties: {
4654
+ type: { const: "set-studio-presentation" },
4655
+ before: { anyOf: [DIAGRAM_PRESENTATION_SCHEMA, { type: "null" }] },
4656
+ after: { anyOf: [DIAGRAM_PRESENTATION_SCHEMA, { type: "null" }] }
4657
+ }
4658
+ });
4659
+ DIAGRAM_REVIEW_BUNDLE_V11_SCHEMA.properties.authored = {
4660
+ oneOf: [
4661
+ DIAGRAM_REVIEW_BUNDLE_V11_SCHEMA.properties.authored,
4662
+ DIAGRAM_AUTHORING_BUNDLE_V11_SCHEMA
4663
+ ]
4664
+ };
4665
+
4666
+ // packages/protocol/src/large-object-contracts.mjs
4667
+ var LARGE_OBJECT_VERSION = "2.0.0";
4668
+ var id6 = { type: "string", pattern: "^[A-Za-z0-9_-]{22,64}$" };
4669
+ var digest6 = { type: "string", pattern: "^[a-f0-9]{64}$" };
4670
+ var signature3 = { type: "string", pattern: "^[A-Za-z0-9_-]{86}$" };
4671
+ var integer2 = (max, min = 0) => ({ type: "integer", minimum: min, maximum: max });
4672
+ var closed5 = (properties, required = Object.keys(properties)) => ({
4673
+ type: "object",
4674
+ additionalProperties: false,
4675
+ properties,
4676
+ required
4677
+ });
4678
+ var iso2 = { type: "string", format: "date-time", maxLength: 40 };
4679
+ var codec = { enum: ["identity", "deflate-raw"] };
4680
+ var publicKey2 = closed5({
4681
+ kty: { const: "EC" },
4682
+ crv: { const: "P-256" },
4683
+ x: { type: "string", pattern: "^[A-Za-z0-9_-]{43}$" },
4684
+ y: { type: "string", pattern: "^[A-Za-z0-9_-]{43}$" }
4685
+ });
4686
+ var keyring = closed5({
4687
+ iv: { type: "string", pattern: "^[A-Za-z0-9_-]{16}$" },
4688
+ ciphertext: { type: "string", pattern: "^[A-Za-z0-9_-]+$", maxLength: 65536 }
4689
+ });
4690
+ var chunk = closed5({
4691
+ index: integer2(128),
4692
+ byteLength: integer2(LARGE_OBJECT_LIMITS.chunkBytes, 17),
4693
+ iv: { type: "string", pattern: "^[A-Za-z0-9_-]{16}$" },
4694
+ sha256: digest6
4695
+ });
4696
+ var catalogSpan = closed5({
4697
+ offset: integer2(LARGE_OBJECT_LIMITS.decodedBytes),
4698
+ encodedBytes: integer2(LARGE_OBJECT_LIMITS.catalogBytes, 1),
4699
+ decodedBytes: integer2(LARGE_OBJECT_LIMITS.catalogBytes, 1),
4700
+ codec
4701
+ });
4702
+ var schema5 = (name, properties, required) => ({
4703
+ $schema: "https://json-schema.org/draft/2020-12/schema",
4704
+ $id: `https://openplanr.dev/schemas/v1.17.0/${name}.schema.json`,
4705
+ "x-openplanr-contract": { id: name, version: "1.17.0" },
4706
+ ...closed5(properties, required)
4707
+ });
4708
+ var ENCRYPTED_RESOURCE_MANIFEST_SCHEMA = schema5("encrypted-resource-manifest", {
4709
+ schemaVersion: { const: LARGE_OBJECT_VERSION },
4710
+ kind: { const: "openplanr-encrypted-resource-manifest" },
4711
+ workspaceId: id6,
4712
+ revisionId: id6,
4713
+ epoch: integer2(Number.MAX_SAFE_INTEGER, 1),
4714
+ createdAt: iso2,
4715
+ plaintextBytes: integer2(LARGE_OBJECT_LIMITS.decodedBytes, 1),
4716
+ ciphertextBytes: integer2(LARGE_OBJECT_LIMITS.ciphertextBytes, 17),
4717
+ catalog: catalogSpan,
4718
+ chunks: { type: "array", minItems: 1, maxItems: LARGE_OBJECT_LIMITS.chunks, items: chunk },
4719
+ signature: signature3
4720
+ });
4721
+ var ENCRYPTED_UPLOAD_PREPARE_SCHEMA = schema5("encrypted-upload-prepare", {
4722
+ schemaVersion: { const: LARGE_OBJECT_VERSION },
4723
+ workspaceId: id6,
4724
+ operationId: id6,
4725
+ expectedVersion: integer2(Number.MAX_SAFE_INTEGER),
4726
+ epoch: integer2(Number.MAX_SAFE_INTEGER, 1),
4727
+ ownerPublicKey: publicKey2,
4728
+ ownerAuthHash: digest6,
4729
+ reviewerAuthHash: digest6,
4730
+ keyring,
4731
+ manifest: ENCRYPTED_RESOURCE_MANIFEST_SCHEMA,
4732
+ signature: signature3
4733
+ });
4734
+ var ENCRYPTED_UPLOAD_COMMIT_SCHEMA = schema5("encrypted-upload-commit", {
4735
+ schemaVersion: { const: LARGE_OBJECT_VERSION },
4736
+ workspaceId: id6,
4737
+ operationId: id6,
4738
+ manifestSha256: digest6,
4739
+ signature: signature3
4740
+ });
4741
+ var ENCRYPTED_UPLOAD_RECEIPT_SCHEMA = schema5("encrypted-upload-receipt", {
4742
+ schemaVersion: { const: LARGE_OBJECT_VERSION },
4743
+ workspaceId: id6,
4744
+ operationId: id6,
4745
+ revisionId: id6,
4746
+ manifestSha256: digest6,
4747
+ status: { const: "committed" },
4748
+ version: integer2(Number.MAX_SAFE_INTEGER, 1),
4749
+ committedAt: iso2
4750
+ });
4751
+ var ENCRYPTED_UPLOAD_STATUS_SCHEMA = schema5(
4752
+ "encrypted-upload-status",
4753
+ {
4754
+ schemaVersion: { const: LARGE_OBJECT_VERSION },
4755
+ workspaceId: id6,
4756
+ operationId: id6,
4757
+ revisionId: id6,
4758
+ manifestSha256: digest6,
4759
+ status: { enum: ["prepared", "committed"] },
4760
+ receivedChunks: {
4761
+ type: "array",
4762
+ maxItems: LARGE_OBJECT_LIMITS.chunks,
4763
+ items: closed5({
4764
+ index: integer2(128),
4765
+ sha256: digest6,
4766
+ byteLength: integer2(LARGE_OBJECT_LIMITS.chunkBytes, 17)
4767
+ })
4768
+ },
4769
+ receipt: ENCRYPTED_UPLOAD_RECEIPT_SCHEMA
4770
+ },
4771
+ [
4772
+ "schemaVersion",
4773
+ "workspaceId",
4774
+ "operationId",
4775
+ "revisionId",
4776
+ "manifestSha256",
4777
+ "status",
4778
+ "receivedChunks"
4779
+ ]
4780
+ );
4781
+ var ENCRYPTED_WORKSPACE_V2_SCHEMA = schema5("encrypted-workspace-v2", {
4782
+ schemaVersion: { const: LARGE_OBJECT_VERSION },
4783
+ id: id6,
4784
+ version: integer2(Number.MAX_SAFE_INTEGER, 1),
4785
+ epoch: integer2(Number.MAX_SAFE_INTEGER, 1),
4786
+ currentRevision: id6,
4787
+ ownerPublicKey: publicKey2,
4788
+ keyring,
4789
+ commentsPaused: { type: "boolean" }
4790
+ });
4791
+ var ENCRYPTED_WORKSPACE_EVENT_V2_SCHEMA = schema5("encrypted-workspace-event-v2", {
4792
+ id: id6,
4793
+ epoch: integer2(Number.MAX_SAFE_INTEGER, 1),
4794
+ revisionId: id6,
4795
+ createdAt: iso2,
4796
+ iv: { type: "string", pattern: "^[A-Za-z0-9_-]{16}$" },
4797
+ ciphertext: {
4798
+ type: "string",
4799
+ pattern: "^[A-Za-z0-9_-]+$",
4800
+ maxLength: Math.ceil(LARGE_OBJECT_LIMITS.eventBytes * 4 / 3)
4801
+ },
4802
+ authorPublicKey: publicKey2,
4803
+ signature: signature3
4804
+ });
4805
+ var resource = closed5({
4806
+ id: { type: "string", pattern: "^r[0-9]{1,4}$" },
4807
+ type: { enum: ["html-segments", "shared-block", "asset"] },
4808
+ offset: integer2(LARGE_OBJECT_LIMITS.decodedBytes),
4809
+ encodedBytes: integer2(LARGE_OBJECT_LIMITS.decodedBytes, 1),
4810
+ decodedBytes: integer2(LARGE_OBJECT_LIMITS.decodedBytes, 1),
4811
+ codec,
4812
+ sha256: digest6
4813
+ });
4814
+ var RESOURCE_CATALOG_SCHEMA = schema5("resource-catalog", {
4815
+ schemaVersion: { const: "1.0.0" },
4816
+ kind: { const: "openplanr-resource-catalog" },
4817
+ bundle: { type: "object" },
4818
+ uniqueHtmlBytes: integer2(LARGE_OBJECT_LIMITS.uniqueHtmlBytes),
4819
+ totalDecodedBytes: integer2(LARGE_OBJECT_LIMITS.decodedBytes, 1),
4820
+ resources: {
4821
+ type: "array",
4822
+ minItems: 1,
4823
+ maxItems: LARGE_OBJECT_LIMITS.resources,
4824
+ items: resource
4825
+ },
4826
+ sources: {
4827
+ type: "array",
4828
+ minItems: 1,
4829
+ maxItems: LARGE_OBJECT_LIMITS.sources,
4830
+ items: closed5({
4831
+ id: { type: "string", minLength: 1, maxLength: 128 },
4832
+ resourceId: resource.properties.id,
4833
+ htmlBytes: integer2(LARGE_OBJECT_LIMITS.uniqueHtmlBytes, 1),
4834
+ sha256: digest6
4835
+ })
4836
+ },
4837
+ viewSources: {
4838
+ type: "object",
4839
+ maxProperties: LARGE_OBJECT_LIMITS.views,
4840
+ additionalProperties: { type: "string", minLength: 1, maxLength: 128 }
4841
+ }
4842
+ });
4843
+ RESOURCE_CATALOG_SCHEMA.properties.reviewOf = digest6;
4844
+ var companyId = { type: "string", pattern: "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$" };
4845
+ var companyScope = { organizationId: companyId, projectId: companyId, artifactId: companyId };
4846
+ var COMPANY_RESOURCE_MANIFEST_SCHEMA = schema5("company-resource-manifest", {
4847
+ schemaVersion: { const: "2.0.0" },
4848
+ kind: { const: "openplanr-company-resource-manifest" },
4849
+ ...companyScope,
4850
+ revisionId: id6,
4851
+ contentDigest: { type: "string", pattern: "^sha256:[a-f0-9]{64}$" },
4852
+ contentType: { const: "application/json" },
4853
+ byteLength: integer2(LARGE_OBJECT_LIMITS.decodedBytes, 1),
4854
+ decodedBytes: integer2(LARGE_OBJECT_LIMITS.decodedBytes, 1),
4855
+ catalog: catalogSpan,
4856
+ chunks: {
4857
+ type: "array",
4858
+ minItems: 1,
4859
+ maxItems: 128,
4860
+ items: closed5({
4861
+ index: integer2(127),
4862
+ byteLength: integer2(LARGE_OBJECT_LIMITS.chunkBytes, 1),
4863
+ sha256: digest6
4864
+ })
4865
+ }
4866
+ });
4867
+ var COMPANY_RESOURCE_UPLOAD_PREPARE_SCHEMA = schema5("company-resource-upload-prepare", {
4868
+ schemaVersion: { const: "2.0.0" },
4869
+ operationId: id6,
4870
+ baseRevisionId: { oneOf: [id6, { type: "null" }] },
4871
+ manifest: COMPANY_RESOURCE_MANIFEST_SCHEMA
4872
+ });
4873
+ var COMPANY_RESOURCE_UPLOAD_RECEIPT_SCHEMA = schema5("company-resource-upload-receipt", {
4874
+ schemaVersion: { const: "2.0.0" },
4875
+ ...companyScope,
4876
+ operationId: id6,
4877
+ revisionId: id6,
4878
+ manifestSha256: digest6,
4879
+ contentDigest: { type: "string", pattern: "^sha256:[a-f0-9]{64}$" },
4880
+ status: { const: "committed" },
4881
+ committedAt: iso2
4882
+ });
4883
+ var COMPANY_RESOURCE_UPLOAD_STATUS_SCHEMA = schema5(
4884
+ "company-resource-upload-status",
4885
+ {
4886
+ schemaVersion: { const: "2.0.0" },
4887
+ operationId: id6,
4888
+ status: { enum: ["prepared", "committed"] },
4889
+ receivedChunks: {
4890
+ type: "array",
4891
+ maxItems: 128,
4892
+ items: closed5({
4893
+ index: integer2(127),
4894
+ sha256: digest6,
4895
+ byteLength: integer2(LARGE_OBJECT_LIMITS.chunkBytes, 1)
4896
+ })
4897
+ },
4898
+ receipt: COMPANY_RESOURCE_UPLOAD_RECEIPT_SCHEMA
4899
+ },
4900
+ ["schemaVersion", "operationId", "status", "receivedChunks"]
4901
+ );
4902
+ var ENTERPRISE_ARTIFACT_REVISION_V11_SCHEMA = structuredClone(
4903
+ ENTERPRISE_ARTIFACT_REVISION_SCHEMA
4904
+ );
4905
+ Object.assign(ENTERPRISE_ARTIFACT_REVISION_V11_SCHEMA, {
4906
+ $id: "https://openplanr.dev/schemas/v1.17.0/enterprise-artifact-revision.schema.json",
4907
+ "x-openplanr-contract": { id: "enterprise-artifact-revision", version: "1.17.0" }
4908
+ });
4909
+ Object.assign(ENTERPRISE_ARTIFACT_REVISION_V11_SCHEMA.properties, {
4910
+ id: id6,
4911
+ parentRevisionId: {
4912
+ anyOf: [id6, structuredClone(ENTERPRISE_ARTIFACT_REVISION_SCHEMA.properties.parentRevisionId)]
4913
+ },
4914
+ schemaVersion: { const: "1.1.0" },
4915
+ protocolVersion: { const: "1.17.0" },
4916
+ contentDigest: { type: "string", pattern: "^sha256:[a-f0-9]{64}$" },
4917
+ byteLength: integer2(LARGE_OBJECT_LIMITS.decodedBytes, 1),
4918
+ contentReference: closed5({ transport: { const: "resources-v2" }, manifestSha256: digest6 })
4919
+ });
4920
+ ENTERPRISE_ARTIFACT_REVISION_V11_SCHEMA.required.push("contentReference", "protocolVersion");
4921
+ var WORKSPACE_MANAGEMENT_V2_SCHEMA = schema5("workspace-management-v2", {
4922
+ operationId: id6,
4923
+ expectedVersion: integer2(Number.MAX_SAFE_INTEGER, 1),
4924
+ epoch: integer2(Number.MAX_SAFE_INTEGER, 1),
4925
+ action: { enum: ["pause", "resume", "revoke", "delete"] },
4926
+ signature: signature3
4927
+ });
4928
+ var WORKSPACE_ROTATION_V2_SCHEMA = schema5("workspace-rotation-v2", {
4929
+ operationId: id6,
4930
+ expectedVersion: integer2(Number.MAX_SAFE_INTEGER, 1),
4931
+ epoch: integer2(Number.MAX_SAFE_INTEGER, 2),
4932
+ reviewerAuthHash: digest6,
4933
+ keyring,
4934
+ signature: signature3
4935
+ });
4936
+ var LARGE_OBJECT_SCHEMAS = Object.freeze({
4937
+ ...ENTERPRISE_RESOURCE_SCHEMAS,
4938
+ ...SHARING_SECURITY_SCHEMAS,
4939
+ "diagram-authoring-bundle": DIAGRAM_AUTHORING_BUNDLE_V11_SCHEMA,
4940
+ "diagram-edit-transaction": DIAGRAM_EDIT_TRANSACTION_V11_SCHEMA,
4941
+ "diagram-presentation": DIAGRAM_PRESENTATION_SCHEMA,
4942
+ "diagram-review-bundle": DIAGRAM_REVIEW_BUNDLE_V11_SCHEMA,
4943
+ "encrypted-resource-manifest": ENCRYPTED_RESOURCE_MANIFEST_SCHEMA,
4944
+ "encrypted-upload-prepare": ENCRYPTED_UPLOAD_PREPARE_SCHEMA,
4945
+ "encrypted-upload-commit": ENCRYPTED_UPLOAD_COMMIT_SCHEMA,
4946
+ "encrypted-upload-receipt": ENCRYPTED_UPLOAD_RECEIPT_SCHEMA,
4947
+ "encrypted-upload-status": ENCRYPTED_UPLOAD_STATUS_SCHEMA,
4948
+ "encrypted-workspace-v2": ENCRYPTED_WORKSPACE_V2_SCHEMA,
4949
+ "encrypted-workspace-event-v2": ENCRYPTED_WORKSPACE_EVENT_V2_SCHEMA,
4950
+ "resource-catalog": RESOURCE_CATALOG_SCHEMA,
4951
+ "company-resource-manifest": COMPANY_RESOURCE_MANIFEST_SCHEMA,
4952
+ "company-resource-upload-prepare": COMPANY_RESOURCE_UPLOAD_PREPARE_SCHEMA,
4953
+ "company-resource-upload-receipt": COMPANY_RESOURCE_UPLOAD_RECEIPT_SCHEMA,
4954
+ "company-resource-upload-status": COMPANY_RESOURCE_UPLOAD_STATUS_SCHEMA,
4955
+ "enterprise-artifact-revision": ENTERPRISE_ARTIFACT_REVISION_V11_SCHEMA,
4956
+ "workspace-management-v2": WORKSPACE_MANAGEMENT_V2_SCHEMA,
4957
+ "workspace-rotation-v2": WORKSPACE_ROTATION_V2_SCHEMA
4958
+ });
4959
+
4960
+ export {
4961
+ canonicalizeJson,
4962
+ assertPlainData,
4963
+ validateJson,
4964
+ DESIGN_REVIEW_BUNDLE_SCHEMA,
4965
+ LARGE_OBJECT_LIMITS
4966
+ };