openplanr 3.1.1 → 3.2.0

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 (363) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/dist/cli/commands/groups/delivery.d.ts.map +1 -1
  3. package/dist/cli/commands/groups/delivery.js +2 -0
  4. package/dist/cli/commands/groups/delivery.js.map +1 -1
  5. package/dist/cli/commands/planning-artifacts.d.ts.map +1 -1
  6. package/dist/cli/commands/planning-artifacts.js +22 -12
  7. package/dist/cli/commands/planning-artifacts.js.map +1 -1
  8. package/dist/cli/commands/ship.d.ts +3 -0
  9. package/dist/cli/commands/ship.d.ts.map +1 -0
  10. package/dist/cli/commands/ship.js +65 -0
  11. package/dist/cli/commands/ship.js.map +1 -0
  12. package/dist/dashboard/.vite/manifest.json +1 -1
  13. package/dist/dashboard/assets/{index-G7ygVDGg.js → index-L8qtwqv6.js} +2 -2
  14. package/dist/dashboard/assets/{index-G7ygVDGg.js.map → index-L8qtwqv6.js.map} +1 -1
  15. package/dist/dashboard/dashboard-manifest.json +8 -8
  16. package/dist/dashboard/index.html +1 -1
  17. package/dist/models/schema.d.ts +39 -23
  18. package/dist/models/schema.d.ts.map +1 -1
  19. package/dist/models/schema.js +19 -12
  20. package/dist/models/schema.js.map +1 -1
  21. package/dist/models/types.d.ts +6 -0
  22. package/dist/models/types.d.ts.map +1 -1
  23. package/dist/services/id-service.d.ts +1 -5
  24. package/dist/services/id-service.d.ts.map +1 -1
  25. package/dist/services/id-service.js +1 -34
  26. package/dist/services/id-service.js.map +1 -1
  27. package/dist/services/ship-checks/changes.d.ts +24 -0
  28. package/dist/services/ship-checks/changes.d.ts.map +1 -0
  29. package/dist/services/ship-checks/changes.js +135 -0
  30. package/dist/services/ship-checks/changes.js.map +1 -0
  31. package/dist/services/ship-checks/contract.d.ts +81 -0
  32. package/dist/services/ship-checks/contract.d.ts.map +1 -0
  33. package/dist/services/ship-checks/contract.js +7 -0
  34. package/dist/services/ship-checks/contract.js.map +1 -0
  35. package/dist/services/ship-checks/discover.d.ts +10 -0
  36. package/dist/services/ship-checks/discover.d.ts.map +1 -0
  37. package/dist/services/ship-checks/discover.js +250 -0
  38. package/dist/services/ship-checks/discover.js.map +1 -0
  39. package/dist/services/ship-checks/glob.d.ts +5 -0
  40. package/dist/services/ship-checks/glob.d.ts.map +1 -0
  41. package/dist/services/ship-checks/glob.js +39 -0
  42. package/dist/services/ship-checks/glob.js.map +1 -0
  43. package/dist/services/ship-checks/hooks.d.ts +7 -0
  44. package/dist/services/ship-checks/hooks.d.ts.map +1 -0
  45. package/dist/services/ship-checks/hooks.js +65 -0
  46. package/dist/services/ship-checks/hooks.js.map +1 -0
  47. package/dist/services/ship-checks/packages.d.ts +29 -0
  48. package/dist/services/ship-checks/packages.d.ts.map +1 -0
  49. package/dist/services/ship-checks/packages.js +197 -0
  50. package/dist/services/ship-checks/packages.js.map +1 -0
  51. package/dist/services/ship-checks/related-tests.d.ts +13 -0
  52. package/dist/services/ship-checks/related-tests.d.ts.map +1 -0
  53. package/dist/services/ship-checks/related-tests.js +73 -0
  54. package/dist/services/ship-checks/related-tests.js.map +1 -0
  55. package/dist/services/ship-checks/scope.d.ts +8 -0
  56. package/dist/services/ship-checks/scope.d.ts.map +1 -0
  57. package/dist/services/ship-checks/scope.js +66 -0
  58. package/dist/services/ship-checks/scope.js.map +1 -0
  59. package/dist/services/ship-checks/task-requirements.d.ts +14 -0
  60. package/dist/services/ship-checks/task-requirements.d.ts.map +1 -0
  61. package/dist/services/ship-checks/task-requirements.js +145 -0
  62. package/dist/services/ship-checks/task-requirements.js.map +1 -0
  63. package/dist/services/ship-checks/workflows.d.ts +21 -0
  64. package/dist/services/ship-checks/workflows.d.ts.map +1 -0
  65. package/dist/services/ship-checks/workflows.js +208 -0
  66. package/dist/services/ship-checks/workflows.js.map +1 -0
  67. package/dist/services/template-service.d.ts +2 -0
  68. package/dist/services/template-service.d.ts.map +1 -1
  69. package/dist/services/template-service.js +4 -0
  70. package/dist/services/template-service.js.map +1 -1
  71. package/dist/utils/slugify.d.ts +1 -8
  72. package/dist/utils/slugify.d.ts.map +1 -1
  73. package/dist/utils/slugify.js +1 -25
  74. package/dist/utils/slugify.js.map +1 -1
  75. package/docs/CLI.md +48 -1
  76. package/lib/backlog-item.d.mts +49 -0
  77. package/lib/backlog-item.mjs +339 -0
  78. package/lib/host-packages/adapter-registry.json +5 -5
  79. package/lib/host-packages/capability-map.json +1 -1
  80. package/lib/host-packages/claude/.claude-plugin/marketplace.json +2 -2
  81. package/lib/host-packages/claude/openplanr/.claude-plugin/plugin.json +1 -1
  82. package/lib/host-packages/claude/openplanr/.openplanr-content.json +126 -90
  83. package/lib/host-packages/claude/openplanr/CONNECTORS.md +4 -6
  84. package/lib/host-packages/claude/openplanr/README.md +1 -1
  85. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-artifact-shell.mjs +1 -1
  86. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-chunked-workspace-client.mjs +1 -1
  87. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-document.mjs +385 -79
  88. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-handoff.mjs +1 -1
  89. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-resource-pack.mjs +1 -1
  90. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-review.mjs +45 -4
  91. package/lib/host-packages/{cursor/openplanr/runtime/design/scripts/design-runtime-support-e34c388a8e59.mjs → claude/openplanr/runtime/design/scripts/design-runtime-support-6774fd3d5d02.mjs} +1 -1
  92. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-share.mjs +8 -5
  93. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-shared-artifact-support-dependencies-design-support-protocol-contracts-3d9b1a86.mjs +40 -7
  94. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-shared-artifact-support-protocol-contracts-ea2cd15e.mjs +1 -1
  95. package/lib/host-packages/claude/openplanr/runtime/design/scripts/{design-shared-protocol-contracts-31a760fc.mjs → design-shared-protocol-contracts-b5f28f94.mjs} +284 -45
  96. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-upload-spool.mjs +1 -1
  97. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design.mjs +215 -55
  98. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/02-artifact-review-ui.js +23 -23
  99. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/03-protocol-contracts.js +246 -45
  100. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/06-artifact-review-ui.js +12 -12
  101. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/08-artifact-review-ui.js +47 -14
  102. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources.json +11 -10
  103. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/package.json +4 -3
  104. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.css +16 -11
  105. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/01-module-runtime.js +7 -11
  106. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/02-react.js +163 -274
  107. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/03-react-dom-client-fiber-foundations.js +494 -967
  108. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/04-react-dom-client-reconciliation-hooks.js +346 -678
  109. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/05-react-dom-client-render-phases.js +382 -810
  110. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/06-react-dom-client-commit-effects.js +406 -730
  111. 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 +259 -522
  112. 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 +585 -937
  113. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/09-react-dom-client-public-roots.js +115 -240
  114. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/10-react.js +7 -17
  115. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/11-artifact-review-ui.js +3 -4
  116. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/12-protocol-contracts.js +215 -0
  117. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/13-design-review-experience.js +2766 -0
  118. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/14-studio-shell.js +134 -0
  119. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/15-canvas-engine.js +2170 -0
  120. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/16-design-review-experience.js +16 -0
  121. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/17-studio-shell.js +8 -0
  122. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/18-interface-primitives.js +3883 -0
  123. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/19-interface-primitives.js +966 -0
  124. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/{16-studio-shell.js → 20-studio-shell.js} +122 -227
  125. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/21-design-studio.js +1583 -0
  126. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources.json +101 -47
  127. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/protocol/package.json +5 -1
  128. package/lib/host-packages/{openai/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.9.0 → claude/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.20.0}/design-document.schema.json +78 -5
  129. package/lib/host-packages/claude/openplanr/runtime/plan/scripts/design-protocol-contracts.mjs +247 -45
  130. package/lib/host-packages/claude/openplanr/runtime/plan/scripts/design.mjs +45 -12
  131. package/lib/host-packages/claude/openplanr/runtime/plan/scripts/runtime/packages/protocol/package.json +5 -1
  132. package/lib/host-packages/claude/openplanr/skills/connect/references/connectors.md +4 -6
  133. package/lib/host-packages/claude/openplanr/skills/design/SKILL.md +12 -0
  134. package/lib/host-packages/claude/openplanr/skills/design/references/craft.md +14 -3
  135. package/lib/host-packages/claude/openplanr/skills/design/references/design-system.md +33 -1
  136. package/lib/host-packages/claude/openplanr/skills/design/references/discovery.md +18 -4
  137. package/lib/host-packages/claude/openplanr/skills/design/references/generation.md +74 -1
  138. package/lib/host-packages/claude/openplanr/skills/design/references/hosted-canvas.md +62 -0
  139. package/lib/host-packages/claude/openplanr/skills/design/references/review.md +46 -1
  140. package/lib/host-packages/claude/openplanr/skills/design/references/utilities.md +6 -0
  141. package/lib/host-packages/claude/openplanr/skills/design/schemas/design-document.schema.json +78 -5
  142. package/lib/host-packages/claude/openplanr/skills/design-loop/references/craft.md +14 -3
  143. package/lib/host-packages/claude/openplanr/skills/design-loop/references/design-system.md +33 -1
  144. package/lib/host-packages/claude/openplanr/skills/design-loop/references/discovery.md +18 -4
  145. package/lib/host-packages/claude/openplanr/skills/design-loop/references/generation.md +74 -1
  146. package/lib/host-packages/claude/openplanr/skills/design-loop/references/review.md +46 -1
  147. package/lib/host-packages/claude/openplanr/skills/design-loop/references/utilities.md +6 -0
  148. package/lib/host-packages/claude/openplanr/skills/design-loop/schemas/design-document.schema.json +78 -5
  149. package/lib/host-packages/claude/openplanr/skills/design-review/references/craft.md +14 -3
  150. package/lib/host-packages/claude/openplanr/skills/design-review/references/design-system.md +33 -1
  151. package/lib/host-packages/claude/openplanr/skills/design-review/references/discovery.md +18 -4
  152. package/lib/host-packages/claude/openplanr/skills/design-review/references/generation.md +74 -1
  153. package/lib/host-packages/claude/openplanr/skills/design-review/references/review.md +46 -1
  154. package/lib/host-packages/claude/openplanr/skills/design-review/references/utilities.md +6 -0
  155. package/lib/host-packages/claude/openplanr/skills/design-review/schemas/design-document.schema.json +78 -5
  156. package/lib/host-packages/claude/openplanr/skills/investigate/SKILL.md +10 -1
  157. package/lib/host-packages/claude/openplanr/skills/investigate/references/findings.md +92 -0
  158. package/lib/host-packages/claude/openplanr/skills/investigate/scripts/backlog-item.mjs +339 -0
  159. package/lib/host-packages/claude/openplanr/skills/plan/SKILL.md +3 -0
  160. package/lib/host-packages/claude/openplanr/skills/plan/schemas/design-document.schema.json +78 -5
  161. package/lib/host-packages/claude/openplanr/skills/share/references/connectors.md +4 -6
  162. package/lib/host-packages/claude/openplanr/skills/ship/SKILL.md +15 -4
  163. package/lib/host-packages/claude/openplanr/skills/ship/references/findings.md +92 -0
  164. package/lib/host-packages/claude/openplanr/skills/ship/references/result-contract.md +3 -1
  165. package/lib/host-packages/claude/openplanr/skills/ship/scripts/backlog-item.mjs +339 -0
  166. package/lib/host-packages/claude/openplanr/skills/sprint/references/connectors.md +4 -6
  167. package/lib/host-packages/claude/openplanr/skills/status/references/connectors.md +4 -6
  168. package/lib/host-packages/claude/openplanr/skills/sync/references/connectors.md +4 -6
  169. package/lib/host-packages/cursor/openplanr/.openplanr-content.json +125 -89
  170. package/lib/host-packages/cursor/openplanr/CONNECTORS.md +4 -6
  171. package/lib/host-packages/cursor/openplanr/manifest.json +1 -1
  172. package/lib/host-packages/cursor/openplanr/rules/planr-connect/references/connectors.md +4 -6
  173. package/lib/host-packages/cursor/openplanr/rules/planr-design/references/craft.md +14 -3
  174. package/lib/host-packages/cursor/openplanr/rules/planr-design/references/design-system.md +33 -1
  175. package/lib/host-packages/cursor/openplanr/rules/planr-design/references/discovery.md +18 -4
  176. package/lib/host-packages/cursor/openplanr/rules/planr-design/references/generation.md +74 -1
  177. package/lib/host-packages/cursor/openplanr/rules/planr-design/references/hosted-canvas.md +62 -0
  178. package/lib/host-packages/cursor/openplanr/rules/planr-design/references/review.md +46 -1
  179. package/lib/host-packages/cursor/openplanr/rules/planr-design/references/utilities.md +6 -0
  180. package/lib/host-packages/cursor/openplanr/rules/planr-design/schemas/design-document.schema.json +78 -5
  181. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/craft.md +14 -3
  182. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/design-system.md +33 -1
  183. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/discovery.md +18 -4
  184. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/generation.md +74 -1
  185. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/review.md +46 -1
  186. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/utilities.md +6 -0
  187. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/schemas/design-document.schema.json +78 -5
  188. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/craft.md +14 -3
  189. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/design-system.md +33 -1
  190. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/discovery.md +18 -4
  191. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/generation.md +74 -1
  192. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/review.md +46 -1
  193. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/utilities.md +6 -0
  194. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/schemas/design-document.schema.json +78 -5
  195. package/lib/host-packages/cursor/openplanr/rules/planr-design.mdc +12 -0
  196. package/lib/host-packages/cursor/openplanr/rules/planr-investigate/references/findings.md +92 -0
  197. package/lib/host-packages/cursor/openplanr/rules/planr-investigate/scripts/backlog-item.mjs +339 -0
  198. package/lib/host-packages/cursor/openplanr/rules/planr-investigate.mdc +10 -1
  199. package/lib/host-packages/cursor/openplanr/rules/planr-plan/schemas/design-document.schema.json +78 -5
  200. package/lib/host-packages/cursor/openplanr/rules/planr-plan.mdc +3 -0
  201. package/lib/host-packages/cursor/openplanr/rules/planr-share/references/connectors.md +4 -6
  202. package/lib/host-packages/cursor/openplanr/rules/planr-ship/references/findings.md +92 -0
  203. package/lib/host-packages/cursor/openplanr/rules/planr-ship/references/result-contract.md +3 -1
  204. package/lib/host-packages/cursor/openplanr/rules/planr-ship/scripts/backlog-item.mjs +339 -0
  205. package/lib/host-packages/cursor/openplanr/rules/planr-ship.mdc +15 -4
  206. package/lib/host-packages/cursor/openplanr/rules/planr-sprint/references/connectors.md +4 -6
  207. package/lib/host-packages/cursor/openplanr/rules/planr-status/references/connectors.md +4 -6
  208. package/lib/host-packages/cursor/openplanr/rules/planr-sync/references/connectors.md +4 -6
  209. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-artifact-shell.mjs +1 -1
  210. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-chunked-workspace-client.mjs +1 -1
  211. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-document.mjs +385 -79
  212. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-handoff.mjs +1 -1
  213. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-resource-pack.mjs +1 -1
  214. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-review.mjs +45 -4
  215. package/lib/host-packages/{openai/openplanr/runtime/design/scripts/design-runtime-support-e34c388a8e59.mjs → cursor/openplanr/runtime/design/scripts/design-runtime-support-6774fd3d5d02.mjs} +1 -1
  216. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-share.mjs +8 -5
  217. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-shared-artifact-support-dependencies-design-support-protocol-contracts-3d9b1a86.mjs +40 -7
  218. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-shared-artifact-support-protocol-contracts-ea2cd15e.mjs +1 -1
  219. package/lib/host-packages/{openai/openplanr/runtime/design/scripts/design-shared-protocol-contracts-31a760fc.mjs → cursor/openplanr/runtime/design/scripts/design-shared-protocol-contracts-b5f28f94.mjs} +284 -45
  220. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-upload-spool.mjs +1 -1
  221. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design.mjs +215 -55
  222. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/02-artifact-review-ui.js +23 -23
  223. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/03-protocol-contracts.js +246 -45
  224. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/06-artifact-review-ui.js +12 -12
  225. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/08-artifact-review-ui.js +47 -14
  226. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources.json +11 -10
  227. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/package.json +4 -3
  228. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.css +16 -11
  229. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/01-module-runtime.js +7 -11
  230. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/02-react.js +163 -274
  231. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/03-react-dom-client-fiber-foundations.js +494 -967
  232. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/04-react-dom-client-reconciliation-hooks.js +346 -678
  233. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/05-react-dom-client-render-phases.js +382 -810
  234. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/06-react-dom-client-commit-effects.js +406 -730
  235. 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 +259 -522
  236. 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 +585 -937
  237. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/09-react-dom-client-public-roots.js +115 -240
  238. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/10-react.js +7 -17
  239. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/11-artifact-review-ui.js +3 -4
  240. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/12-protocol-contracts.js +215 -0
  241. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/13-design-review-experience.js +2766 -0
  242. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/14-studio-shell.js +134 -0
  243. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/15-canvas-engine.js +2170 -0
  244. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/16-design-review-experience.js +16 -0
  245. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/17-studio-shell.js +8 -0
  246. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/18-interface-primitives.js +3883 -0
  247. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/19-interface-primitives.js +966 -0
  248. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/{16-studio-shell.js → 20-studio-shell.js} +122 -227
  249. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/21-design-studio.js +1583 -0
  250. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources.json +101 -47
  251. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/protocol/package.json +5 -1
  252. package/lib/host-packages/{claude/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.9.0 → cursor/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.20.0}/design-document.schema.json +78 -5
  253. package/lib/host-packages/cursor/openplanr/runtime/plan/scripts/design-protocol-contracts.mjs +247 -45
  254. package/lib/host-packages/cursor/openplanr/runtime/plan/scripts/design.mjs +45 -12
  255. package/lib/host-packages/cursor/openplanr/runtime/plan/scripts/runtime/packages/protocol/package.json +5 -1
  256. package/lib/host-packages/openai/.claude-plugin/marketplace.json +2 -2
  257. package/lib/host-packages/openai/openplanr/.codex-plugin/plugin.json +1 -1
  258. package/lib/host-packages/openai/openplanr/.openplanr-content.json +128 -92
  259. package/lib/host-packages/openai/openplanr/CONNECTORS.md +4 -6
  260. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-artifact-shell.mjs +1 -1
  261. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-chunked-workspace-client.mjs +1 -1
  262. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-document.mjs +385 -79
  263. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-handoff.mjs +1 -1
  264. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-resource-pack.mjs +1 -1
  265. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-review.mjs +45 -4
  266. package/lib/host-packages/{claude/openplanr/runtime/design/scripts/design-runtime-support-e34c388a8e59.mjs → openai/openplanr/runtime/design/scripts/design-runtime-support-6774fd3d5d02.mjs} +1 -1
  267. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-share.mjs +8 -5
  268. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-shared-artifact-support-dependencies-design-support-protocol-contracts-3d9b1a86.mjs +40 -7
  269. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-shared-artifact-support-protocol-contracts-ea2cd15e.mjs +1 -1
  270. package/lib/host-packages/{cursor/openplanr/runtime/design/scripts/design-shared-protocol-contracts-31a760fc.mjs → openai/openplanr/runtime/design/scripts/design-shared-protocol-contracts-b5f28f94.mjs} +284 -45
  271. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-upload-spool.mjs +1 -1
  272. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design.mjs +215 -55
  273. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/02-artifact-review-ui.js +23 -23
  274. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/03-protocol-contracts.js +246 -45
  275. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/06-artifact-review-ui.js +12 -12
  276. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/08-artifact-review-ui.js +47 -14
  277. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources.json +11 -10
  278. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/package.json +4 -3
  279. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.css +16 -11
  280. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/01-module-runtime.js +7 -11
  281. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/02-react.js +163 -274
  282. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/03-react-dom-client-fiber-foundations.js +494 -967
  283. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/04-react-dom-client-reconciliation-hooks.js +346 -678
  284. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/05-react-dom-client-render-phases.js +382 -810
  285. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/06-react-dom-client-commit-effects.js +406 -730
  286. 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 +259 -522
  287. 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 +585 -937
  288. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/09-react-dom-client-public-roots.js +115 -240
  289. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/10-react.js +7 -17
  290. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/11-artifact-review-ui.js +3 -4
  291. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/12-protocol-contracts.js +215 -0
  292. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/13-design-review-experience.js +2766 -0
  293. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/14-studio-shell.js +134 -0
  294. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/15-canvas-engine.js +2170 -0
  295. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/16-design-review-experience.js +16 -0
  296. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/17-studio-shell.js +8 -0
  297. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/18-interface-primitives.js +3883 -0
  298. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/19-interface-primitives.js +966 -0
  299. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/{16-studio-shell.js → 20-studio-shell.js} +122 -227
  300. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/21-design-studio.js +1583 -0
  301. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources.json +101 -47
  302. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/protocol/package.json +5 -1
  303. package/lib/host-packages/{cursor/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.9.0 → openai/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.20.0}/design-document.schema.json +78 -5
  304. package/lib/host-packages/openai/openplanr/runtime/plan/scripts/design-protocol-contracts.mjs +247 -45
  305. package/lib/host-packages/openai/openplanr/runtime/plan/scripts/design.mjs +45 -12
  306. package/lib/host-packages/openai/openplanr/runtime/plan/scripts/runtime/packages/protocol/package.json +5 -1
  307. package/lib/host-packages/openai/openplanr/skills/connect/references/connectors.md +4 -6
  308. package/lib/host-packages/openai/openplanr/skills/design/SKILL.md +12 -0
  309. package/lib/host-packages/openai/openplanr/skills/design/openplanr.skill.json +11 -0
  310. package/lib/host-packages/openai/openplanr/skills/design/references/craft.md +14 -3
  311. package/lib/host-packages/openai/openplanr/skills/design/references/design-system.md +33 -1
  312. package/lib/host-packages/openai/openplanr/skills/design/references/discovery.md +18 -4
  313. package/lib/host-packages/openai/openplanr/skills/design/references/generation.md +74 -1
  314. package/lib/host-packages/openai/openplanr/skills/design/references/hosted-canvas.md +62 -0
  315. package/lib/host-packages/openai/openplanr/skills/design/references/review.md +46 -1
  316. package/lib/host-packages/openai/openplanr/skills/design/references/utilities.md +6 -0
  317. package/lib/host-packages/openai/openplanr/skills/design/schemas/design-document.schema.json +78 -5
  318. package/lib/host-packages/openai/openplanr/skills/design-loop/references/craft.md +14 -3
  319. package/lib/host-packages/openai/openplanr/skills/design-loop/references/design-system.md +33 -1
  320. package/lib/host-packages/openai/openplanr/skills/design-loop/references/discovery.md +18 -4
  321. package/lib/host-packages/openai/openplanr/skills/design-loop/references/generation.md +74 -1
  322. package/lib/host-packages/openai/openplanr/skills/design-loop/references/review.md +46 -1
  323. package/lib/host-packages/openai/openplanr/skills/design-loop/references/utilities.md +6 -0
  324. package/lib/host-packages/openai/openplanr/skills/design-loop/schemas/design-document.schema.json +78 -5
  325. package/lib/host-packages/openai/openplanr/skills/design-review/references/craft.md +14 -3
  326. package/lib/host-packages/openai/openplanr/skills/design-review/references/design-system.md +33 -1
  327. package/lib/host-packages/openai/openplanr/skills/design-review/references/discovery.md +18 -4
  328. package/lib/host-packages/openai/openplanr/skills/design-review/references/generation.md +74 -1
  329. package/lib/host-packages/openai/openplanr/skills/design-review/references/review.md +46 -1
  330. package/lib/host-packages/openai/openplanr/skills/design-review/references/utilities.md +6 -0
  331. package/lib/host-packages/openai/openplanr/skills/design-review/schemas/design-document.schema.json +78 -5
  332. package/lib/host-packages/openai/openplanr/skills/investigate/SKILL.md +10 -1
  333. package/lib/host-packages/openai/openplanr/skills/investigate/openplanr.skill.json +22 -0
  334. package/lib/host-packages/openai/openplanr/skills/investigate/references/findings.md +92 -0
  335. package/lib/host-packages/openai/openplanr/skills/investigate/scripts/backlog-item.mjs +339 -0
  336. package/lib/host-packages/openai/openplanr/skills/plan/SKILL.md +3 -0
  337. package/lib/host-packages/openai/openplanr/skills/plan/schemas/design-document.schema.json +78 -5
  338. package/lib/host-packages/openai/openplanr/skills/share/references/connectors.md +4 -6
  339. package/lib/host-packages/openai/openplanr/skills/ship/SKILL.md +15 -4
  340. package/lib/host-packages/openai/openplanr/skills/ship/openplanr.skill.json +22 -0
  341. package/lib/host-packages/openai/openplanr/skills/ship/references/findings.md +92 -0
  342. package/lib/host-packages/openai/openplanr/skills/ship/references/result-contract.md +3 -1
  343. package/lib/host-packages/openai/openplanr/skills/ship/scripts/backlog-item.mjs +339 -0
  344. package/lib/host-packages/openai/openplanr/skills/sprint/references/connectors.md +4 -6
  345. package/lib/host-packages/openai/openplanr/skills/status/references/connectors.md +4 -6
  346. package/lib/host-packages/openai/openplanr/skills/sync/references/connectors.md +4 -6
  347. package/package.json +3 -3
  348. package/dist/templates/backlog/backlog-item.md.hbs +0 -40
  349. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/12-design-review-experience.js +0 -3589
  350. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/13-studio-shell.js +0 -184
  351. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/14-interface-primitives.js +0 -5229
  352. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/15-interface-primitives.js +0 -1733
  353. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/17-design-studio.js +0 -1844
  354. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/12-design-review-experience.js +0 -3589
  355. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/13-studio-shell.js +0 -184
  356. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/14-interface-primitives.js +0 -5229
  357. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/15-interface-primitives.js +0 -1733
  358. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/17-design-studio.js +0 -1844
  359. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/12-design-review-experience.js +0 -3589
  360. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/13-studio-shell.js +0 -184
  361. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/14-interface-primitives.js +0 -5229
  362. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/15-interface-primitives.js +0 -1733
  363. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/17-design-studio.js +0 -1844
@@ -4626,7 +4626,22 @@
4626
4626
  }
4627
4627
  return value;
4628
4628
  };
4629
- var DESIGN_DOCUMENT_SCHEMA = freeze({
4629
+ var FRAME_SCHEMA = {
4630
+ type: "array",
4631
+ minItems: 1,
4632
+ items: {
4633
+ type: "object",
4634
+ additionalProperties: false,
4635
+ required: ["id", "label", "width", "height"],
4636
+ properties: {
4637
+ id: { $ref: "#/$defs/id" },
4638
+ label: { $ref: "#/$defs/text" },
4639
+ width: { type: "integer", minimum: 1, maximum: 16384 },
4640
+ height: { type: "integer", minimum: 1, maximum: 16384 }
4641
+ }
4642
+ }
4643
+ };
4644
+ var DESIGN_DOCUMENT_V1_SCHEMA = freeze({
4630
4645
  $schema: "https://json-schema.org/draft/2020-12/schema",
4631
4646
  $id: "https://openplanr.dev/schemas/v1.9.0/design-document.schema.json",
4632
4647
  "x-openplanr-contract": { id: "design-document", version: "1.9.0" },
@@ -4677,21 +4692,7 @@
4677
4692
  }
4678
4693
  },
4679
4694
  assets: { $ref: "#/$defs/paths" },
4680
- frames: {
4681
- type: "array",
4682
- minItems: 1,
4683
- items: {
4684
- type: "object",
4685
- additionalProperties: false,
4686
- required: ["id", "label", "width", "height"],
4687
- properties: {
4688
- id: { $ref: "#/$defs/id" },
4689
- label: { $ref: "#/$defs/text" },
4690
- width: { type: "integer", minimum: 1, maximum: 16384 },
4691
- height: { type: "integer", minimum: 1, maximum: 16384 }
4692
- }
4693
- }
4694
- },
4695
+ frames: FRAME_SCHEMA,
4695
4696
  screens: {
4696
4697
  type: "array",
4697
4698
  minItems: 1,
@@ -4767,6 +4768,65 @@
4767
4768
  }
4768
4769
  }
4769
4770
  });
4771
+ var DESIGN_DOCUMENT_SCHEMA = freeze({
4772
+ ...DESIGN_DOCUMENT_V1_SCHEMA,
4773
+ $id: "https://openplanr.dev/schemas/v1.20.0/design-document.schema.json",
4774
+ "x-openplanr-contract": { id: "design-document", version: "1.20.0" },
4775
+ properties: {
4776
+ .../** @type {Record<string, unknown>} */
4777
+ DESIGN_DOCUMENT_V1_SCHEMA.properties,
4778
+ frames: {
4779
+ ...FRAME_SCHEMA,
4780
+ items: {
4781
+ ...FRAME_SCHEMA.items,
4782
+ properties: {
4783
+ ...FRAME_SCHEMA.items.properties,
4784
+ height: { anyOf: [{ type: "integer", minimum: 1, maximum: 16384 }, { const: "auto" }] }
4785
+ }
4786
+ }
4787
+ },
4788
+ layout: {
4789
+ type: "object",
4790
+ additionalProperties: false,
4791
+ properties: {
4792
+ boards: {
4793
+ type: "object",
4794
+ description: "Keys are screenId, screenId/frameId or screenId/frameId/variantId; each ID must exist in the document.",
4795
+ additionalProperties: {
4796
+ type: "object",
4797
+ additionalProperties: false,
4798
+ required: ["x", "y"],
4799
+ properties: {
4800
+ x: { $ref: "#/$defs/coordinate" },
4801
+ y: { $ref: "#/$defs/coordinate" },
4802
+ title: { $ref: "#/$defs/text" }
4803
+ }
4804
+ }
4805
+ },
4806
+ sections: {
4807
+ type: "array",
4808
+ items: {
4809
+ type: "object",
4810
+ additionalProperties: false,
4811
+ required: ["id", "x", "y", "text"],
4812
+ properties: {
4813
+ id: { $ref: "#/$defs/id" },
4814
+ x: { $ref: "#/$defs/coordinate" },
4815
+ y: { $ref: "#/$defs/coordinate" },
4816
+ text: { $ref: "#/$defs/text" },
4817
+ maxW: { type: "integer", minimum: 1, maximum: 16384 }
4818
+ }
4819
+ }
4820
+ }
4821
+ }
4822
+ }
4823
+ },
4824
+ $defs: {
4825
+ .../** @type {Record<string, unknown>} */
4826
+ DESIGN_DOCUMENT_V1_SCHEMA.$defs,
4827
+ coordinate: { type: "number", minimum: -1e7, maximum: 1e7 }
4828
+ }
4829
+ });
4770
4830
 
4771
4831
  // ../protocol/src/workspace-contracts.mjs
4772
4832
  var DESIGN_WORKSPACE_VERSION = "1.0.0";
@@ -4851,7 +4911,7 @@
4851
4911
  });
4852
4912
  var designProperties = (
4853
4913
  /** @type {Record<string, { items: { properties: Record<string, unknown>; required: string[] } }>} */
4854
- structuredClone(DESIGN_DOCUMENT_SCHEMA.properties)
4914
+ structuredClone(DESIGN_DOCUMENT_V1_SCHEMA.properties)
4855
4915
  );
4856
4916
  for (const key of ["kind", "schemaVersion", "brief", "assets", "designSystem"])
4857
4917
  delete designProperties[key];
@@ -4923,7 +4983,7 @@
4923
4983
  },
4924
4984
  ["kind", "schemaVersion", "design", "envelope", "entries", "revision"]
4925
4985
  ),
4926
- $defs: structuredClone(DESIGN_DOCUMENT_SCHEMA.$defs)
4986
+ $defs: structuredClone(DESIGN_DOCUMENT_V1_SCHEMA.$defs)
4927
4987
  };
4928
4988
  var DESIGN_WORKSPACE_SCHEMAS = Object.freeze({
4929
4989
  "design-review-workspace": DESIGN_WORKSPACE_SCHEMA,
@@ -5037,6 +5097,86 @@
5037
5097
  "diagram-workspace-event": DIAGRAM_WORKSPACE_EVENT_SCHEMA
5038
5098
  });
5039
5099
 
5100
+ // ../protocol/src/shape-library-contracts.mjs
5101
+ var closed5 = (properties) => ({
5102
+ type: "object",
5103
+ additionalProperties: false,
5104
+ required: Object.keys(properties),
5105
+ properties
5106
+ });
5107
+ var unit = { type: "number", minimum: 0, maximum: 1 };
5108
+ var extent = { type: "number", exclusiveMinimum: 0, maximum: 1 };
5109
+ var point2 = closed5({ x: unit, y: unit });
5110
+ var identifier = { type: "string", pattern: "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$", maxLength: 128 };
5111
+ var version = { type: "string", pattern: "^[0-9]+\\.[0-9]+\\.[0-9]+$", maxLength: 32 };
5112
+ var digest6 = { type: "string", pattern: "^sha256:[a-f0-9]{64}$" };
5113
+ var rect = {
5114
+ type: { const: "rect" },
5115
+ x: unit,
5116
+ y: unit,
5117
+ width: extent,
5118
+ height: extent,
5119
+ radius: unit
5120
+ };
5121
+ var ellipse = { type: { const: "ellipse" }, cx: unit, cy: unit, rx: extent, ry: extent };
5122
+ var polygon = {
5123
+ type: { const: "polygon" },
5124
+ points: { type: "array", minItems: 3, maxItems: 32, items: point2 }
5125
+ };
5126
+ var paint = { fill: { enum: ["fill", "none"] }, stroke: { enum: ["stroke", "none"] } };
5127
+ var pixels = { type: "number", minimum: 1, maximum: 1e4 };
5128
+ var SHAPE_REFERENCE_SCHEMA = closed5({
5129
+ packId: identifier,
5130
+ packVersion: version,
5131
+ shapeId: identifier,
5132
+ definitionDigest: digest6
5133
+ });
5134
+ var SHAPE_DEFINITION_SCHEMA = {
5135
+ $schema: "https://json-schema.org/draft/2020-12/schema",
5136
+ $id: "https://openplanr.dev/schemas/v1.21.0/diagram-shape-definition.schema.json",
5137
+ "x-openplanr-contract": { id: "diagram-shape-definition", version: "1.21.0" },
5138
+ ...closed5({
5139
+ ...SHAPE_REFERENCE_SCHEMA.properties,
5140
+ name: { type: "string", minLength: 1, maxLength: 128 },
5141
+ description: { type: "string", maxLength: 1024 },
5142
+ tags: {
5143
+ type: "array",
5144
+ maxItems: 16,
5145
+ uniqueItems: true,
5146
+ items: { type: "string", minLength: 1, maxLength: 64 }
5147
+ },
5148
+ primitives: {
5149
+ type: "array",
5150
+ minItems: 1,
5151
+ maxItems: 32,
5152
+ items: {
5153
+ oneOf: [
5154
+ closed5({ ...rect, ...paint }),
5155
+ closed5({ ...ellipse, ...paint }),
5156
+ closed5({ ...polygon, ...paint }),
5157
+ closed5({
5158
+ type: { const: "line" },
5159
+ x1: unit,
5160
+ y1: unit,
5161
+ x2: unit,
5162
+ y2: unit,
5163
+ stroke: paint.stroke
5164
+ })
5165
+ ]
5166
+ }
5167
+ },
5168
+ attachment: { oneOf: [closed5(rect), closed5(ellipse), closed5(polygon)] },
5169
+ textRegion: closed5({ x: unit, y: unit, width: extent, height: extent }),
5170
+ sizing: closed5({ width: pixels, height: pixels, minWidth: pixels, minHeight: pixels })
5171
+ })
5172
+ };
5173
+ var SHAPE_LIBRARY_SCHEMA = {
5174
+ type: "array",
5175
+ maxItems: 512,
5176
+ items: SHAPE_DEFINITION_SCHEMA
5177
+ };
5178
+ var GEOMETRY_ROUNDOFF = Number.EPSILON * 32;
5179
+
5040
5180
  // ../protocol/src/studio-presentation-contracts.mjs
5041
5181
  var DIAGRAM_PRESENTATION_SCHEMA = {
5042
5182
  $schema: "https://json-schema.org/draft/2020-12/schema",
@@ -5101,6 +5241,67 @@
5101
5241
  DIAGRAM_AUTHORING_BUNDLE_V11_SCHEMA
5102
5242
  ]
5103
5243
  };
5244
+ function withShapeReferences(schema6) {
5245
+ const copy = structuredClone(schema6);
5246
+ function visit(value) {
5247
+ if (!value || typeof value !== "object") return;
5248
+ if (value.properties?.shape && value.properties?.strokeWidth && value.properties?.fontSize)
5249
+ value.properties.shapeRef = SHAPE_REFERENCE_SCHEMA;
5250
+ for (const child of Object.values(value)) visit(child);
5251
+ }
5252
+ visit(copy);
5253
+ return copy;
5254
+ }
5255
+ function versionSchema(schema6, name) {
5256
+ return {
5257
+ ...schema6,
5258
+ $id: `https://openplanr.dev/schemas/v1.21.0/${name}.schema.json`,
5259
+ "x-openplanr-contract": { id: name, version: "1.21.0" }
5260
+ };
5261
+ }
5262
+ var DIAGRAM_AUTHORING_BUNDLE_V12_SCHEMA = versionSchema(
5263
+ withShapeReferences(DIAGRAM_AUTHORING_BUNDLE_V11_SCHEMA),
5264
+ "diagram-authoring-bundle"
5265
+ );
5266
+ Object.assign(DIAGRAM_AUTHORING_BUNDLE_V12_SCHEMA.properties, {
5267
+ schemaVersion: { const: "1.2.0" },
5268
+ protocolVersion: { const: "1.21.0" },
5269
+ shapeLibrary: SHAPE_LIBRARY_SCHEMA
5270
+ });
5271
+ DIAGRAM_AUTHORING_BUNDLE_V12_SCHEMA.required = DIAGRAM_AUTHORING_BUNDLE_V12_SCHEMA.required.filter((key) => key !== "studioPresentation").concat("shapeLibrary");
5272
+ var DIAGRAM_EDIT_TRANSACTION_V12_SCHEMA = versionSchema(
5273
+ withShapeReferences(DIAGRAM_EDIT_TRANSACTION_V11_SCHEMA),
5274
+ "diagram-edit-transaction"
5275
+ );
5276
+ Object.assign(DIAGRAM_EDIT_TRANSACTION_V12_SCHEMA.properties, {
5277
+ schemaVersion: { const: "1.2.0" },
5278
+ protocolVersion: { const: "1.21.0" }
5279
+ });
5280
+ DIAGRAM_EDIT_TRANSACTION_V12_SCHEMA.properties.operations.items.oneOf.push({
5281
+ type: "object",
5282
+ additionalProperties: false,
5283
+ required: ["type", "before", "after"],
5284
+ properties: {
5285
+ type: { const: "set-shape-library" },
5286
+ before: { anyOf: [SHAPE_LIBRARY_SCHEMA, { type: "null" }] },
5287
+ after: { anyOf: [SHAPE_LIBRARY_SCHEMA, { type: "null" }] }
5288
+ }
5289
+ });
5290
+ var DIAGRAM_REVIEW_BUNDLE_V12_SCHEMA = versionSchema(
5291
+ structuredClone(DIAGRAM_REVIEW_BUNDLE_SCHEMA),
5292
+ "diagram-review-bundle"
5293
+ );
5294
+ Object.assign(DIAGRAM_REVIEW_BUNDLE_V12_SCHEMA.properties, {
5295
+ schemaVersion: { const: "1.2.0" },
5296
+ presentation: DIAGRAM_PRESENTATION_SCHEMA,
5297
+ authored: {
5298
+ oneOf: [
5299
+ DIAGRAM_AUTHORING_SCHEMAS["diagram-authoring-bundle"],
5300
+ DIAGRAM_AUTHORING_BUNDLE_V11_SCHEMA,
5301
+ DIAGRAM_AUTHORING_BUNDLE_V12_SCHEMA
5302
+ ]
5303
+ }
5304
+ });
5104
5305
 
5105
5306
  // ../protocol/src/large-object-limits.mjs
5106
5307
  var LARGE_OBJECT_LIMITS = Object.freeze({
@@ -5124,10 +5325,10 @@
5124
5325
  var LARGE_OBJECT_VERSION = "2.0.0";
5125
5326
  var RESOURCE_HTML_SEGMENT_ENCODING = "openplanr.html-segments.utf8-v1";
5126
5327
  var id6 = { type: "string", pattern: "^[A-Za-z0-9_-]{22,64}$" };
5127
- var digest6 = { type: "string", pattern: "^[a-f0-9]{64}$" };
5328
+ var digest7 = { type: "string", pattern: "^[a-f0-9]{64}$" };
5128
5329
  var signature3 = { type: "string", pattern: "^[A-Za-z0-9_-]{86}$" };
5129
5330
  var integer2 = (max, min = 0) => ({ type: "integer", minimum: min, maximum: max });
5130
- var closed5 = (properties, required = Object.keys(properties)) => ({
5331
+ var closed6 = (properties, required = Object.keys(properties)) => ({
5131
5332
  type: "object",
5132
5333
  additionalProperties: false,
5133
5334
  properties,
@@ -5135,23 +5336,23 @@
5135
5336
  });
5136
5337
  var iso2 = { type: "string", format: "date-time", maxLength: 40 };
5137
5338
  var codec = { enum: ["identity", "deflate-raw"] };
5138
- var publicKey2 = closed5({
5339
+ var publicKey2 = closed6({
5139
5340
  kty: { const: "EC" },
5140
5341
  crv: { const: "P-256" },
5141
5342
  x: { type: "string", pattern: "^[A-Za-z0-9_-]{43}$" },
5142
5343
  y: { type: "string", pattern: "^[A-Za-z0-9_-]{43}$" }
5143
5344
  });
5144
- var keyring = closed5({
5345
+ var keyring = closed6({
5145
5346
  iv: { type: "string", pattern: "^[A-Za-z0-9_-]{16}$" },
5146
5347
  ciphertext: { type: "string", pattern: "^[A-Za-z0-9_-]+$", maxLength: 65536 }
5147
5348
  });
5148
- var chunk = closed5({
5349
+ var chunk = closed6({
5149
5350
  index: integer2(128),
5150
5351
  byteLength: integer2(LARGE_OBJECT_LIMITS.chunkBytes, 17),
5151
5352
  iv: { type: "string", pattern: "^[A-Za-z0-9_-]{16}$" },
5152
- sha256: digest6
5353
+ sha256: digest7
5153
5354
  });
5154
- var catalogSpan = closed5({
5355
+ var catalogSpan = closed6({
5155
5356
  offset: integer2(LARGE_OBJECT_LIMITS.decodedBytes),
5156
5357
  encodedBytes: integer2(LARGE_OBJECT_LIMITS.catalogBytes, 1),
5157
5358
  decodedBytes: integer2(LARGE_OBJECT_LIMITS.catalogBytes, 1),
@@ -5161,7 +5362,7 @@
5161
5362
  $schema: "https://json-schema.org/draft/2020-12/schema",
5162
5363
  $id: `https://openplanr.dev/schemas/v1.17.0/${name}.schema.json`,
5163
5364
  "x-openplanr-contract": { id: name, version: "1.17.0" },
5164
- ...closed5(properties, required)
5365
+ ...closed6(properties, required)
5165
5366
  });
5166
5367
  var ENCRYPTED_RESOURCE_MANIFEST_SCHEMA = schema5("encrypted-resource-manifest", {
5167
5368
  schemaVersion: { const: LARGE_OBJECT_VERSION },
@@ -5183,8 +5384,8 @@
5183
5384
  expectedVersion: integer2(Number.MAX_SAFE_INTEGER),
5184
5385
  epoch: integer2(Number.MAX_SAFE_INTEGER, 1),
5185
5386
  ownerPublicKey: publicKey2,
5186
- ownerAuthHash: digest6,
5187
- reviewerAuthHash: digest6,
5387
+ ownerAuthHash: digest7,
5388
+ reviewerAuthHash: digest7,
5188
5389
  keyring,
5189
5390
  manifest: ENCRYPTED_RESOURCE_MANIFEST_SCHEMA,
5190
5391
  signature: signature3
@@ -5193,7 +5394,7 @@
5193
5394
  schemaVersion: { const: LARGE_OBJECT_VERSION },
5194
5395
  workspaceId: id6,
5195
5396
  operationId: id6,
5196
- manifestSha256: digest6,
5397
+ manifestSha256: digest7,
5197
5398
  signature: signature3
5198
5399
  });
5199
5400
  var ENCRYPTED_UPLOAD_RECEIPT_SCHEMA = schema5("encrypted-upload-receipt", {
@@ -5201,7 +5402,7 @@
5201
5402
  workspaceId: id6,
5202
5403
  operationId: id6,
5203
5404
  revisionId: id6,
5204
- manifestSha256: digest6,
5405
+ manifestSha256: digest7,
5205
5406
  status: { const: "committed" },
5206
5407
  version: integer2(Number.MAX_SAFE_INTEGER, 1),
5207
5408
  committedAt: iso2
@@ -5213,14 +5414,14 @@
5213
5414
  workspaceId: id6,
5214
5415
  operationId: id6,
5215
5416
  revisionId: id6,
5216
- manifestSha256: digest6,
5417
+ manifestSha256: digest7,
5217
5418
  status: { enum: ["prepared", "committed"] },
5218
5419
  receivedChunks: {
5219
5420
  type: "array",
5220
5421
  maxItems: LARGE_OBJECT_LIMITS.chunks,
5221
- items: closed5({
5422
+ items: closed6({
5222
5423
  index: integer2(128),
5223
- sha256: digest6,
5424
+ sha256: digest7,
5224
5425
  byteLength: integer2(LARGE_OBJECT_LIMITS.chunkBytes, 17)
5225
5426
  })
5226
5427
  },
@@ -5260,14 +5461,14 @@
5260
5461
  authorPublicKey: publicKey2,
5261
5462
  signature: signature3
5262
5463
  });
5263
- var resource = closed5({
5464
+ var resource = closed6({
5264
5465
  id: { type: "string", pattern: "^r[0-9]{1,4}$" },
5265
5466
  type: { enum: ["html-segments", "shared-block", "asset"] },
5266
5467
  offset: integer2(LARGE_OBJECT_LIMITS.decodedBytes),
5267
5468
  encodedBytes: integer2(LARGE_OBJECT_LIMITS.decodedBytes, 1),
5268
5469
  decodedBytes: integer2(LARGE_OBJECT_LIMITS.decodedBytes, 1),
5269
5470
  codec,
5270
- sha256: digest6
5471
+ sha256: digest7
5271
5472
  });
5272
5473
  var RESOURCE_CATALOG_SCHEMA = schema5("resource-catalog", {
5273
5474
  schemaVersion: { const: "1.0.0" },
@@ -5285,11 +5486,11 @@
5285
5486
  type: "array",
5286
5487
  minItems: 1,
5287
5488
  maxItems: LARGE_OBJECT_LIMITS.sources,
5288
- items: closed5({
5489
+ items: closed6({
5289
5490
  id: { type: "string", minLength: 1, maxLength: 128 },
5290
5491
  resourceId: resource.properties.id,
5291
5492
  htmlBytes: integer2(LARGE_OBJECT_LIMITS.uniqueHtmlBytes, 1),
5292
- sha256: digest6
5493
+ sha256: digest7
5293
5494
  })
5294
5495
  },
5295
5496
  viewSources: {
@@ -5298,7 +5499,7 @@
5298
5499
  additionalProperties: { type: "string", minLength: 1, maxLength: 128 }
5299
5500
  }
5300
5501
  });
5301
- RESOURCE_CATALOG_SCHEMA.properties.reviewOf = digest6;
5502
+ RESOURCE_CATALOG_SCHEMA.properties.reviewOf = digest7;
5302
5503
  var companyId = { type: "string", pattern: "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$" };
5303
5504
  var companyScope = { organizationId: companyId, projectId: companyId, artifactId: companyId };
5304
5505
  var COMPANY_RESOURCE_MANIFEST_SCHEMA = schema5("company-resource-manifest", {
@@ -5315,10 +5516,10 @@
5315
5516
  type: "array",
5316
5517
  minItems: 1,
5317
5518
  maxItems: 128,
5318
- items: closed5({
5519
+ items: closed6({
5319
5520
  index: integer2(127),
5320
5521
  byteLength: integer2(LARGE_OBJECT_LIMITS.chunkBytes, 1),
5321
- sha256: digest6
5522
+ sha256: digest7
5322
5523
  })
5323
5524
  }
5324
5525
  });
@@ -5333,7 +5534,7 @@
5333
5534
  ...companyScope,
5334
5535
  operationId: id6,
5335
5536
  revisionId: id6,
5336
- manifestSha256: digest6,
5537
+ manifestSha256: digest7,
5337
5538
  contentDigest: { type: "string", pattern: "^sha256:[a-f0-9]{64}$" },
5338
5539
  status: { const: "committed" },
5339
5540
  committedAt: iso2
@@ -5347,9 +5548,9 @@
5347
5548
  receivedChunks: {
5348
5549
  type: "array",
5349
5550
  maxItems: 128,
5350
- items: closed5({
5551
+ items: closed6({
5351
5552
  index: integer2(127),
5352
- sha256: digest6,
5553
+ sha256: digest7,
5353
5554
  byteLength: integer2(LARGE_OBJECT_LIMITS.chunkBytes, 1)
5354
5555
  })
5355
5556
  },
@@ -5373,7 +5574,7 @@
5373
5574
  protocolVersion: { const: "1.17.0" },
5374
5575
  contentDigest: { type: "string", pattern: "^sha256:[a-f0-9]{64}$" },
5375
5576
  byteLength: integer2(LARGE_OBJECT_LIMITS.decodedBytes, 1),
5376
- contentReference: closed5({ transport: { const: "resources-v2" }, manifestSha256: digest6 })
5577
+ contentReference: closed6({ transport: { const: "resources-v2" }, manifestSha256: digest7 })
5377
5578
  });
5378
5579
  ENTERPRISE_ARTIFACT_REVISION_V11_SCHEMA.required.push("contentReference", "protocolVersion");
5379
5580
  var WORKSPACE_MANAGEMENT_V2_SCHEMA = schema5("workspace-management-v2", {
@@ -5387,7 +5588,7 @@
5387
5588
  operationId: id6,
5388
5589
  expectedVersion: integer2(Number.MAX_SAFE_INTEGER, 1),
5389
5590
  epoch: integer2(Number.MAX_SAFE_INTEGER, 2),
5390
- reviewerAuthHash: digest6,
5591
+ reviewerAuthHash: digest7,
5391
5592
  keyring,
5392
5593
  signature: signature3
5393
5594
  });
@@ -20,7 +20,7 @@
20
20
  throw new TypeError("A review operation needs a stable identity.");
21
21
  return JSON.stringify([scopeKey, id7]);
22
22
  };
23
- let closed6 = false, draining = null;
23
+ let closed7 = false, draining = null;
24
24
  const listeners = /* @__PURE__ */ new Set();
25
25
  const heartbeats = /* @__PURE__ */ new Set();
26
26
  const channel = typeof globalThis.BroadcastChannel === "function" ? new globalThis.BroadcastChannel(databaseName) : null;
@@ -56,14 +56,14 @@
56
56
  request.onsuccess = () => {
57
57
  const db = request.result;
58
58
  db.onversionchange = () => db.close();
59
- if (closed6) db.close();
59
+ if (closed7) db.close();
60
60
  resolve(db);
61
61
  };
62
62
  });
63
63
  void database.catch(() => {
64
64
  });
65
65
  async function transaction(mode, work) {
66
- if (closed6) throw new Error("Review custody has closed.");
66
+ if (closed7) throw new Error("Review custody has closed.");
67
67
  const db = await database;
68
68
  return new Promise((resolve, reject) => {
69
69
  const tx = db.transaction("operations", mode), store = tx.objectStore("operations");
@@ -278,7 +278,7 @@
278
278
  if (draining) return draining;
279
279
  const owner = globalThis.crypto.randomUUID();
280
280
  draining = (async () => {
281
- while (!closed6) {
281
+ while (!closed7) {
282
282
  const entry = await claim(owner);
283
283
  if (!entry) return;
284
284
  const heartbeat = globalThis.setInterval(
@@ -334,7 +334,7 @@
334
334
  return () => listeners.delete(listener);
335
335
  },
336
336
  close() {
337
- closed6 = true;
337
+ closed7 = true;
338
338
  for (const heartbeat of heartbeats) globalThis.clearInterval(heartbeat);
339
339
  heartbeats.clear();
340
340
  channel?.close();
@@ -605,14 +605,14 @@
605
605
  if (x >= 0 && y >= 0 && w >= 0 && h >= 0 && x + w <= 1 && y + h <= 1) {
606
606
  return { x, y, w, h };
607
607
  }
608
- const unit = (value) => Math.round(Math.min(1, Math.max(0, value)) * 1e6) / 1e6;
609
- const boundedX = unit(x);
610
- const boundedY = unit(y);
608
+ const unit2 = (value) => Math.round(Math.min(1, Math.max(0, value)) * 1e6) / 1e6;
609
+ const boundedX = unit2(x);
610
+ const boundedY = unit2(y);
611
611
  return {
612
612
  x: boundedX,
613
613
  y: boundedY,
614
- w: Math.round(Math.min(unit(w), 1 - boundedX) * 1e6) / 1e6,
615
- h: Math.round(Math.min(unit(h), 1 - boundedY) * 1e6) / 1e6
614
+ w: Math.round(Math.min(unit2(w), 1 - boundedX) * 1e6) / 1e6,
615
+ h: Math.round(Math.min(unit2(h), 1 - boundedY) * 1e6) / 1e6
616
616
  };
617
617
  }
618
618
  function normalizeViewport(viewport) {
@@ -1700,8 +1700,8 @@
1700
1700
  snapshotDrafts,
1701
1701
  getReviewOf: () => controller.getReview()?.reviewOf ?? reviewOf,
1702
1702
  restoreDrafts(snapshot2) {
1703
- const digest7 = controller.getReview()?.reviewOf ?? reviewOf;
1704
- if (!snapshot2 || snapshot2.reviewOf !== digest7) return false;
1703
+ const digest8 = controller.getReview()?.reviewOf ?? reviewOf;
1704
+ if (!snapshot2 || snapshot2.reviewOf !== digest8) return false;
1705
1705
  if (typeof snapshot2.identity === "string") {
1706
1706
  const name = snapshot2.identity.slice(0, ARTIFACT_REVIEW_LIMITS.authorName);
1707
1707
  controller.setIdentity(name.trim() ? { ...controller.getIdentity(), name } : null);
@@ -1648,23 +1648,23 @@
1648
1648
  }
1649
1649
  return Object.freeze([state.activeArtifactId]);
1650
1650
  }
1651
- function assertRect2(rect) {
1652
- if (!rect || !Number.isFinite(rect.left) || !Number.isFinite(rect.top) || !Number.isFinite(rect.width) || !Number.isFinite(rect.height) || rect.width <= 0 || rect.height <= 0) {
1651
+ function assertRect2(rect2) {
1652
+ if (!rect2 || !Number.isFinite(rect2.left) || !Number.isFinite(rect2.top) || !Number.isFinite(rect2.width) || !Number.isFinite(rect2.height) || rect2.width <= 0 || rect2.height <= 0) {
1653
1653
  throw new RangeError("Artifact bounds must have positive finite dimensions.");
1654
1654
  }
1655
1655
  }
1656
- function clientPointToNormalized(rect, point2) {
1657
- assertRect2(rect);
1656
+ function clientPointToNormalized(rect2, point3) {
1657
+ assertRect2(rect2);
1658
1658
  return Object.freeze({
1659
- x: normalized2((finite2(point2?.x ?? point2?.clientX) - rect.left) / rect.width),
1660
- y: normalized2((finite2(point2?.y ?? point2?.clientY) - rect.top) / rect.height)
1659
+ x: normalized2((finite2(point3?.x ?? point3?.clientX) - rect2.left) / rect2.width),
1660
+ y: normalized2((finite2(point3?.y ?? point3?.clientY) - rect2.top) / rect2.height)
1661
1661
  });
1662
1662
  }
1663
- function normalizedPointToClient(rect, point2) {
1664
- assertRect2(rect);
1663
+ function normalizedPointToClient(rect2, point3) {
1664
+ assertRect2(rect2);
1665
1665
  return Object.freeze({
1666
- x: rect.left + normalized2(point2?.x) * rect.width,
1667
- y: rect.top + normalized2(point2?.y) * rect.height
1666
+ x: rect2.left + normalized2(point3?.x) * rect2.width,
1667
+ y: rect2.top + normalized2(point3?.y) * rect2.height
1668
1668
  });
1669
1669
  }
1670
1670
  function parseDataScript(document2, id7) {
@@ -1786,6 +1786,8 @@
1786
1786
  }
1787
1787
  const frameDiagnostics = /* @__PURE__ */ new Map();
1788
1788
  const frameLoads = /* @__PURE__ */ new Map();
1789
+ const frameHolds = /* @__PURE__ */ new Map();
1790
+ const frameHoldWaiters = /* @__PURE__ */ new Set();
1789
1791
  const frameSlots = /* @__PURE__ */ new Map();
1790
1792
  if (frameBudget !== null) {
1791
1793
  for (const [id7, frame] of frames) {
@@ -2184,12 +2186,14 @@
2184
2186
  function disposeStage() {
2185
2187
  if (disposed) return true;
2186
2188
  disposed = true;
2189
+ wakeFrameDemand();
2187
2190
  for (const id7 of [...frameLoads.keys()]) releaseFrame(id7);
2188
2191
  for (const remove of cleanup.splice(0)) remove();
2189
2192
  return true;
2190
2193
  }
2191
2194
  const controller = Object.freeze({
2192
2195
  frameBudget,
2196
+ holdFrames,
2193
2197
  ensureFrames,
2194
2198
  retryFrames,
2195
2199
  getFrameDiagnostics: () => [...frameDiagnostics.values()],
@@ -2311,6 +2315,7 @@
2311
2315
  const record2 = frameLoads.get(artifactId);
2312
2316
  if (!record2) return;
2313
2317
  frameLoads.delete(artifactId);
2318
+ wakeFrameDemand();
2314
2319
  record2.cancelled = true;
2315
2320
  record2.abort.abort();
2316
2321
  record2.unlisten?.();
@@ -2482,6 +2487,29 @@
2482
2487
  })().catch(fail);
2483
2488
  return record2.promise;
2484
2489
  }
2490
+ function wakeFrameDemand() {
2491
+ for (const resolve of frameHoldWaiters) resolve();
2492
+ frameHoldWaiters.clear();
2493
+ }
2494
+ function holdFrames(artifactIds) {
2495
+ if (disposed) throw cancelledFrame();
2496
+ if (!Array.isArray(artifactIds) || artifactIds.some((id7) => !frames.has(id7))) {
2497
+ throw new TypeError("Requested artifact frames must be known artifact IDs.");
2498
+ }
2499
+ const ids2 = [...new Set(artifactIds)];
2500
+ for (const id7 of ids2) frameHolds.set(id7, (frameHolds.get(id7) ?? 0) + 1);
2501
+ let released = false;
2502
+ return () => {
2503
+ if (released) return;
2504
+ released = true;
2505
+ for (const id7 of ids2) {
2506
+ const count2 = frameHolds.get(id7) ?? 0;
2507
+ if (count2 > 1) frameHolds.set(id7, count2 - 1);
2508
+ else frameHolds.delete(id7);
2509
+ }
2510
+ wakeFrameDemand();
2511
+ };
2512
+ }
2485
2513
  function ensureFrames(artifactIds, isCurrent = () => true) {
2486
2514
  if (disposed || !isCurrent()) return Promise.reject(cancelledFrame());
2487
2515
  if (!Array.isArray(artifactIds) || artifactIds.some((id7) => typeof id7 !== "string" || !frames.has(id7))) {
@@ -2493,7 +2521,7 @@
2493
2521
  new RangeError(`At most ${frameBudget} artifact frames may be requested together.`)
2494
2522
  );
2495
2523
  }
2496
- if (frameBudget === null)
2524
+ if (frameBudget === null || requested.every((id7) => frameLoads.has(id7)))
2497
2525
  return Promise.all(requested.map((id7) => assignArtifactSource(stageArtifactById(state, id7))));
2498
2526
  const run = async () => {
2499
2527
  if (disposed || !isCurrent()) throw cancelledFrame();
@@ -2501,8 +2529,13 @@
2501
2529
  if (disposed || !isCurrent()) throw cancelledFrame();
2502
2530
  if (!frameLoads.has(id7)) {
2503
2531
  while (frameLoads.size >= frameBudget) {
2504
- const candidates = [...frameLoads].filter(([loadedId]) => !requested.includes(loadedId)).sort((a, b) => a[1].used - b[1].used);
2505
- if (!candidates.length) throw new Error("The artifact frame budget is exhausted.");
2532
+ const candidates = [...frameLoads].filter(([loadedId]) => !requested.includes(loadedId) && !frameHolds.has(loadedId)).sort((a, b) => a[1].used - b[1].used);
2533
+ if (!candidates.length) {
2534
+ if (!frameHolds.size) throw new Error("The artifact frame budget is exhausted.");
2535
+ await new Promise((resolve) => frameHoldWaiters.add(resolve));
2536
+ if (disposed || !isCurrent()) throw cancelledFrame();
2537
+ continue;
2538
+ }
2506
2539
  releaseFrame(candidates[0][0]);
2507
2540
  }
2508
2541
  }
@@ -2527,7 +2560,7 @@
2527
2560
  }
2528
2561
  function cancelInactiveLoads(ids2) {
2529
2562
  for (const [id7, record2] of frameLoads) {
2530
- if (record2.status === "loading" && !ids2.includes(id7)) releaseFrame(id7);
2563
+ if (record2.status === "loading" && !ids2.includes(id7) && !frameHolds.has(id7)) releaseFrame(id7);
2531
2564
  }
2532
2565
  }
2533
2566
  async function activateVisibleFrames() {