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,455 @@
1
+
2
+
3
+ // ../artifact/lib/artifact/ui/studio-shell-components.mjs
4
+ var import_react3 = __toESM(require_react(), 1);
5
+ var StudioButton = (0, import_react3.forwardRef)(function StudioButton2({ variant = "default", className = "", type = "button", ...props }, ref) {
6
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
7
+ "button",
8
+ {
9
+ ref,
10
+ type,
11
+ className: `studio-button studio-button-${variant} ${className}`,
12
+ ...props
13
+ }
14
+ );
15
+ });
16
+ function StudioBadge({ children }) {
17
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: "studio-type-badge", children });
18
+ }
19
+ function StudioMark() {
20
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: "planr-mark", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("svg", { viewBox: "0 0 160 160", focusable: "false", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("g", { transform: "rotate(-45 80 80)", children: [
21
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
22
+ "path",
23
+ {
24
+ d: "M125 50A52 52 0 1 0 125 110",
25
+ fill: "none",
26
+ stroke: "currentColor",
27
+ strokeWidth: "12",
28
+ strokeLinecap: "round",
29
+ strokeLinejoin: "round"
30
+ }
31
+ ),
32
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("rect", { x: "127", y: "71", width: "18", height: "18", rx: "3", fill: "currentColor" })
33
+ ] }) }) });
34
+ }
35
+ function StudioToolbar({
36
+ title,
37
+ titleNode,
38
+ brand = true,
39
+ as: Tag = "header",
40
+ kind,
41
+ hierarchy = [],
42
+ subtitle,
43
+ leading,
44
+ viewPicker,
45
+ status,
46
+ actions,
47
+ className = ""
48
+ }) {
49
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(Tag, { className: `planr-toolbar studio-toolbar ${className}`, "data-studio-react-chrome": "true", children: [
50
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "studio-toolbar-leading design-toolbar-leading", children: [
51
+ leading,
52
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "planr-brand", children: [
53
+ brand && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_jsx_runtime15.Fragment, { children: [
54
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(StudioMark, {}),
55
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("span", { className: "design-wordmark", children: [
56
+ "Open",
57
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { children: "Planr" })
58
+ ] })
59
+ ] }),
60
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "studio-identity", children: [
61
+ hierarchy.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("nav", { className: "studio-hierarchy", "aria-label": "Project path", children: hierarchy.map((item, index2) => /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("span", { children: [
62
+ index2 > 0 && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { "aria-hidden": "true", children: " / " }),
63
+ item.href ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("a", { href: item.href, children: item.label }) : item.label
64
+ ] }, item.href ?? item.label)) }),
65
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("span", { className: "planr-title-block", children: [
66
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(StudioBadge, { children: kind === "artifact" ? "Artifact" : kind === "diagram" ? "Diagram" : "Design" }),
67
+ titleNode ?? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("strong", { title, children: title })
68
+ ] }),
69
+ subtitle && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: "studio-subtitle", children: subtitle })
70
+ ] })
71
+ ] })
72
+ ] }),
73
+ viewPicker,
74
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "studio-toolbar-trailing design-toolbar-trailing", children: [
75
+ status,
76
+ actions
77
+ ] })
78
+ ] });
79
+ }
80
+ function StudioMenu({
81
+ label,
82
+ items,
83
+ className = "",
84
+ triggerAttributes = {},
85
+ open,
86
+ onOpenChange
87
+ }) {
88
+ const trigger = (0, import_react3.useRef)(null);
89
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(dist_exports5.Root, { modal: false, open, onOpenChange, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("span", { className: `studio-menu ${className}`, children: [
90
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(dist_exports5.Trigger, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(StudioButton, { "aria-label": label, title: label, ...triggerAttributes, ref: trigger, children: [
91
+ label,
92
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { "aria-hidden": "true", children: "⌄" })
93
+ ] }) }),
94
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
95
+ dist_exports5.Content,
96
+ {
97
+ className: "studio-menu-content",
98
+ align: "end",
99
+ sideOffset: 8,
100
+ collisionPadding: 8,
101
+ onCloseAutoFocus: (event) => {
102
+ event.preventDefault();
103
+ const content = event.target;
104
+ const ownerDocument = content?.ownerDocument;
105
+ const active = ownerDocument?.activeElement;
106
+ if (active?.isConnected && active !== ownerDocument?.body && active !== ownerDocument?.documentElement && !content?.contains(active))
107
+ return;
108
+ if (trigger.current?.isConnected) trigger.current.focus();
109
+ },
110
+ children: items.map((item, index2) => /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
111
+ dist_exports5.Item,
112
+ {
113
+ asChild: true,
114
+ disabled: item.disabled,
115
+ onSelect: item.onSelect,
116
+ children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
117
+ "button",
118
+ {
119
+ type: "button",
120
+ className: `studio-menu-item${index2 > 0 && item.group !== items[index2 - 1].group ? " studio-menu-group-start" : ""}`,
121
+ disabled: item.disabled,
122
+ ...item.attributes,
123
+ children: item.label
124
+ }
125
+ )
126
+ },
127
+ item.id
128
+ ))
129
+ }
130
+ )
131
+ ] }) });
132
+ }
133
+ function StudioPanelDialog({
134
+ open,
135
+ onOpenChange,
136
+ title,
137
+ description = "Inspect this panel, then close it to return to the canvas.",
138
+ side = "right",
139
+ children,
140
+ container,
141
+ onCloseAutoFocus
142
+ }) {
143
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(dist_exports.Root, { open, onOpenChange, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(dist_exports.Portal, { container, children: [
144
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(dist_exports.Overlay, { className: "studio-panel-overlay" }),
145
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
146
+ dist_exports.Content,
147
+ {
148
+ onCloseAutoFocus,
149
+ className: `studio-panel-dialog studio-panel-${side}`,
150
+ children: [
151
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(dist_exports.Title, { className: "planr-visually-hidden", children: title }),
152
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(dist_exports.Description, { className: "planr-visually-hidden", children: description }),
153
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(dist_exports.Close, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
154
+ StudioButton,
155
+ {
156
+ className: "studio-panel-close",
157
+ variant: "ghost",
158
+ "aria-label": `Close ${title.toLowerCase()}`,
159
+ children: "×"
160
+ }
161
+ ) }),
162
+ children
163
+ ]
164
+ }
165
+ )
166
+ ] }) });
167
+ }
168
+
169
+ // ../artifact/lib/artifact/ui/studio-shell-mount-impl.mjs
170
+ function mountDesignStudioChrome({
171
+ root,
172
+ title,
173
+ state: initial
174
+ }) {
175
+ const document2 = root.ownerDocument;
176
+ const window2 = document2.defaultView;
177
+ if (!window2) return null;
178
+ const old = root.querySelector(".design-toolbar");
179
+ if (!old || old.hasAttribute("data-studio-react-chrome")) return null;
180
+ const share = old.querySelector(".design-share");
181
+ const showShare = !!share && !share.hidden;
182
+ const showExport = !old.querySelector(".design-export")?.hidden;
183
+ let state = {
184
+ previewLabel: old.querySelector("[data-design-preview-state]")?.textContent ?? "Loading preview",
185
+ saveLabel: old.querySelector("[data-design-save-state]")?.textContent ?? "Loading studio",
186
+ savePhase: "loading",
187
+ ...initial,
188
+ exportMenuOpen: false
189
+ };
190
+ const listeners = /* @__PURE__ */ new Set();
191
+ const update = (value) => {
192
+ const next = { ...state, ...value };
193
+ if (Object.keys(next).every(
194
+ (key) => next[key] === state[key]
195
+ ))
196
+ return;
197
+ state = next;
198
+ (0, import_react_dom2.flushSync)(
199
+ () => listeners.forEach((listener) => {
200
+ listener();
201
+ })
202
+ );
203
+ };
204
+ const mount = document2.createElement("div");
205
+ mount.className = "studio-chrome-mount";
206
+ old.replaceWith(mount);
207
+ const react = (0, import_client.createRoot)(mount);
208
+ function Chrome() {
209
+ const current = (0, import_react4.useSyncExternalStore)(
210
+ (listener) => {
211
+ listeners.add(listener);
212
+ return () => listeners.delete(listener);
213
+ },
214
+ () => state
215
+ );
216
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
217
+ StudioToolbar,
218
+ {
219
+ title,
220
+ kind: "design",
221
+ className: "design-toolbar",
222
+ leading: /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
223
+ StudioButton,
224
+ {
225
+ className: "planr-toolbar-action design-panel-toggle",
226
+ variant: "ghost",
227
+ "data-design-toggle-nav": "",
228
+ "aria-controls": "design-navigator",
229
+ "aria-expanded": current.navOpen,
230
+ "aria-label": "Screens",
231
+ title: "Screens",
232
+ children: [
233
+ "☰",
234
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { className: "design-button-label", children: "Screens" })
235
+ ]
236
+ }
237
+ ),
238
+ viewPicker: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("fieldset", { className: "planr-segment design-view-picker", "aria-label": "Design view", children: ["canvas", "prototype", "walkthrough"].map((view) => /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
239
+ StudioButton,
240
+ {
241
+ variant: "ghost",
242
+ "data-design-view": view,
243
+ "aria-pressed": current.view === view,
244
+ "aria-label": view[0].toUpperCase() + view.slice(1),
245
+ title: view[0].toUpperCase() + view.slice(1),
246
+ children: [
247
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { "aria-hidden": "true", children: view === "canvas" ? "▦" : view === "prototype" ? "▷" : "▤" }),
248
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { className: "design-button-label", children: view[0].toUpperCase() + view.slice(1) })
249
+ ]
250
+ },
251
+ view
252
+ )) }),
253
+ status: /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_jsx_runtime16.Fragment, { children: [
254
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("output", { className: "design-preview-state", "data-design-preview-state": "", children: current.previewLabel }),
255
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
256
+ "output",
257
+ {
258
+ className: "design-save-state",
259
+ "aria-live": "polite",
260
+ "data-design-save-state": "",
261
+ "data-status": current.savePhase,
262
+ children: current.saveLabel
263
+ }
264
+ )
265
+ ] }),
266
+ actions: /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_jsx_runtime16.Fragment, { children: [
267
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
268
+ StudioButton,
269
+ {
270
+ className: "planr-toolbar-action design-review-toggle",
271
+ "data-planr-action": "feedback",
272
+ "data-planr-review-label": "Review",
273
+ "aria-controls": "planr-review-rail",
274
+ "aria-expanded": current.reviewOpen,
275
+ "aria-label": "Review",
276
+ title: "Review",
277
+ children: [
278
+ "☷",
279
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { className: "design-button-label", children: "Review" })
280
+ ]
281
+ }
282
+ ),
283
+ showShare && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(PreservedNode, { element: share }),
284
+ showExport && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
285
+ StudioMenu,
286
+ {
287
+ className: "design-export",
288
+ label: "Export",
289
+ open: current.exportMenuOpen,
290
+ onOpenChange: (open) => update({ exportMenuOpen: open }),
291
+ triggerAttributes: { "data-studio-export-menu": "" },
292
+ items: [
293
+ {
294
+ id: "html",
295
+ label: "Portable HTML",
296
+ group: "design",
297
+ attributes: { "data-design-export": "html" }
298
+ },
299
+ {
300
+ id: "png",
301
+ label: "Screen PNG",
302
+ group: "design",
303
+ attributes: { "data-design-export": "png" }
304
+ }
305
+ ]
306
+ }
307
+ )
308
+ ] })
309
+ }
310
+ );
311
+ }
312
+ (0, import_react_dom2.flushSync)(() => react.render(/* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Chrome, {})));
313
+ const observer = new window2.MutationObserver(() => {
314
+ const node = root.querySelector("[data-design-save-state]");
315
+ if (node)
316
+ update({
317
+ saveLabel: node.textContent ?? "",
318
+ savePhase: node.dataset.status ?? state.savePhase
319
+ });
320
+ });
321
+ observer.observe(mount, {
322
+ subtree: true,
323
+ characterData: true,
324
+ childList: true,
325
+ attributes: true,
326
+ attributeFilter: ["data-status"]
327
+ });
328
+ root.dataset.studioFramework = "react";
329
+ let destroyed = false;
330
+ return {
331
+ update,
332
+ destroy() {
333
+ if (destroyed) return;
334
+ destroyed = true;
335
+ observer.disconnect();
336
+ (0, import_react_dom2.flushSync)(() => react.unmount());
337
+ mount.replaceWith(old);
338
+ delete root.dataset.studioFramework;
339
+ }
340
+ };
341
+ }
342
+ function PersistentPanel({ element }) {
343
+ const host = (0, import_react4.useRef)(null);
344
+ (0, import_react4.useLayoutEffect)(() => {
345
+ const target = host.current;
346
+ if (!target) return;
347
+ const marker = element.ownerDocument.createComment("studio-panel-home");
348
+ element.before(marker);
349
+ target.append(element);
350
+ return () => {
351
+ marker.replaceWith(element);
352
+ };
353
+ }, [element]);
354
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { ref: host, className: "studio-panel-content" });
355
+ }
356
+ function mountStudioPanelDialogs({
357
+ root,
358
+ closePanel,
359
+ breakpoint = 960
360
+ }) {
361
+ const document2 = root.ownerDocument;
362
+ const window2 = document2.defaultView;
363
+ if (!window2) return { destroy() {
364
+ } };
365
+ const left = root.querySelector(".design-navigator,.diagram-outline");
366
+ const right = root.querySelector(".planr-review-rail");
367
+ if (!left || !right) return { destroy() {
368
+ } };
369
+ const panels = { left, right };
370
+ const mount = document2.createElement("div");
371
+ mount.className = "studio-panel-mount";
372
+ root.append(mount);
373
+ const react = (0, import_client.createRoot)(mount);
374
+ let snapshot = "";
375
+ let wasCompact = false;
376
+ let lastOpenSide = "left";
377
+ const listeners = /* @__PURE__ */ new Set();
378
+ const read = () => {
379
+ const width = root.getBoundingClientRect().width || window2.innerWidth;
380
+ const compact = width <= breakpoint;
381
+ if (compact && !wasCompact) {
382
+ wasCompact = true;
383
+ if (root.dataset.outlineOpen === "true") closePanel("left");
384
+ }
385
+ wasCompact = compact;
386
+ const next = width <= breakpoint ? root.dataset.designNavOpen === "true" || root.dataset.outlineOpen === "true" ? "left" : root.dataset.planrRailOpen === "true" ? "right" : "" : "";
387
+ if (snapshot !== next) {
388
+ if (next) lastOpenSide = next;
389
+ snapshot = next;
390
+ listeners.forEach((listener) => {
391
+ listener();
392
+ });
393
+ }
394
+ };
395
+ function Panels() {
396
+ const side = (0, import_react4.useSyncExternalStore)(
397
+ (listener) => {
398
+ listeners.add(listener);
399
+ return () => listeners.delete(listener);
400
+ },
401
+ () => snapshot
402
+ );
403
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
404
+ StudioPanelDialog,
405
+ {
406
+ open: !!side,
407
+ side: side === "left" ? "left" : "right",
408
+ title: side === "left" ? "Screens" : "Review",
409
+ container: root,
410
+ onCloseAutoFocus: (event) => {
411
+ event.preventDefault();
412
+ root.querySelector(
413
+ lastOpenSide === "left" ? "[data-design-toggle-nav],[data-action=outline]" : "[data-planr-action=feedback],[data-action=review]"
414
+ )?.focus({ preventScroll: true });
415
+ },
416
+ onOpenChange: (open) => {
417
+ if (!open && side) closePanel(side);
418
+ },
419
+ children: side && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(PersistentPanel, { element: panels[side === "left" ? "left" : "right"] }, side)
420
+ }
421
+ );
422
+ }
423
+ read();
424
+ (0, import_react_dom2.flushSync)(() => react.render(/* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Panels, {})));
425
+ const observer = new window2.MutationObserver(read);
426
+ observer.observe(root, {
427
+ attributes: true,
428
+ attributeFilter: ["data-design-nav-open", "data-outline-open", "data-planr-rail-open"]
429
+ });
430
+ const resize = typeof window2.ResizeObserver === "function" ? new window2.ResizeObserver(read) : null;
431
+ resize?.observe(root);
432
+ window2.addEventListener("resize", read);
433
+ return {
434
+ destroy() {
435
+ observer.disconnect();
436
+ resize?.disconnect();
437
+ window2.removeEventListener("resize", read);
438
+ (0, import_react_dom2.flushSync)(() => react.unmount());
439
+ mount.remove();
440
+ }
441
+ };
442
+ }
443
+ function PreservedNode({ element }) {
444
+ const host = (0, import_react4.useRef)(null);
445
+ (0, import_react4.useLayoutEffect)(() => {
446
+ if (!element) return;
447
+ const marker = element.ownerDocument.createComment("studio-control-home");
448
+ element.before(marker);
449
+ host.current?.append(element);
450
+ return () => {
451
+ marker.replaceWith(element);
452
+ };
453
+ }, [element]);
454
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { ref: host, className: "studio-preserved-control" });
455
+ }