@agent-native/core 0.37.3 → 0.39.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 (476) hide show
  1. package/README.md +19 -6
  2. package/dist/action.d.ts +60 -2
  3. package/dist/action.d.ts.map +1 -1
  4. package/dist/action.js +6 -2
  5. package/dist/action.js.map +1 -1
  6. package/dist/agent/production-agent.d.ts +12 -6
  7. package/dist/agent/production-agent.d.ts.map +1 -1
  8. package/dist/agent/production-agent.js +161 -11
  9. package/dist/agent/production-agent.js.map +1 -1
  10. package/dist/agent/types.d.ts +2 -0
  11. package/dist/agent/types.d.ts.map +1 -1
  12. package/dist/agent/types.js.map +1 -1
  13. package/dist/catalog.json +2 -2
  14. package/dist/cli/connect.d.ts.map +1 -1
  15. package/dist/cli/connect.js +15 -0
  16. package/dist/cli/connect.js.map +1 -1
  17. package/dist/cli/create.d.ts.map +1 -1
  18. package/dist/cli/create.js +8 -1
  19. package/dist/cli/create.js.map +1 -1
  20. package/dist/cli/index.js +10 -6
  21. package/dist/cli/index.js.map +1 -1
  22. package/dist/cli/plan-publish-store.d.ts +52 -0
  23. package/dist/cli/plan-publish-store.d.ts.map +1 -0
  24. package/dist/cli/plan-publish-store.js +103 -0
  25. package/dist/cli/plan-publish-store.js.map +1 -0
  26. package/dist/cli/skills.d.ts +30 -4
  27. package/dist/cli/skills.d.ts.map +1 -1
  28. package/dist/cli/skills.js +1240 -339
  29. package/dist/cli/skills.js.map +1 -1
  30. package/dist/cli/templates-meta.js +12 -12
  31. package/dist/cli/templates-meta.js.map +1 -1
  32. package/dist/client/AssistantChat.d.ts +3 -1
  33. package/dist/client/AssistantChat.d.ts.map +1 -1
  34. package/dist/client/AssistantChat.js +65 -15
  35. package/dist/client/AssistantChat.js.map +1 -1
  36. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  37. package/dist/client/MultiTabAssistantChat.js +20 -2
  38. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  39. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  40. package/dist/client/agent-chat-adapter.js +12 -0
  41. package/dist/client/agent-chat-adapter.js.map +1 -1
  42. package/dist/client/agent-engine-key.d.ts +24 -0
  43. package/dist/client/agent-engine-key.d.ts.map +1 -0
  44. package/dist/client/agent-engine-key.js +49 -0
  45. package/dist/client/agent-engine-key.js.map +1 -0
  46. package/dist/client/analytics.d.ts.map +1 -1
  47. package/dist/client/analytics.js +34 -0
  48. package/dist/client/analytics.js.map +1 -1
  49. package/dist/client/blocks/BlockView.d.ts +35 -0
  50. package/dist/client/blocks/BlockView.d.ts.map +1 -0
  51. package/dist/client/blocks/BlockView.js +45 -0
  52. package/dist/client/blocks/BlockView.js.map +1 -0
  53. package/dist/client/blocks/SchemaBlockEditor.d.ts +25 -0
  54. package/dist/client/blocks/SchemaBlockEditor.d.ts.map +1 -0
  55. package/dist/client/blocks/SchemaBlockEditor.js +165 -0
  56. package/dist/client/blocks/SchemaBlockEditor.js.map +1 -0
  57. package/dist/client/blocks/agent.d.ts +30 -0
  58. package/dist/client/blocks/agent.d.ts.map +1 -0
  59. package/dist/client/blocks/agent.js +61 -0
  60. package/dist/client/blocks/agent.js.map +1 -0
  61. package/dist/client/blocks/index.d.ts +51 -0
  62. package/dist/client/blocks/index.d.ts.map +1 -0
  63. package/dist/client/blocks/index.js +67 -0
  64. package/dist/client/blocks/index.js.map +1 -0
  65. package/dist/client/blocks/library/AnnotatedCodeBlock.d.ts +6 -0
  66. package/dist/client/blocks/library/AnnotatedCodeBlock.d.ts.map +1 -0
  67. package/dist/client/blocks/library/AnnotatedCodeBlock.js +135 -0
  68. package/dist/client/blocks/library/AnnotatedCodeBlock.js.map +1 -0
  69. package/dist/client/blocks/library/ApiEndpointBlock.d.ts +20 -0
  70. package/dist/client/blocks/library/ApiEndpointBlock.d.ts.map +1 -0
  71. package/dist/client/blocks/library/ApiEndpointBlock.js +131 -0
  72. package/dist/client/blocks/library/ApiEndpointBlock.js.map +1 -0
  73. package/dist/client/blocks/library/DataModelBlock.d.ts +28 -0
  74. package/dist/client/blocks/library/DataModelBlock.d.ts.map +1 -0
  75. package/dist/client/blocks/library/DataModelBlock.js +222 -0
  76. package/dist/client/blocks/library/DataModelBlock.js.map +1 -0
  77. package/dist/client/blocks/library/DiffBlock.d.ts +6 -0
  78. package/dist/client/blocks/library/DiffBlock.d.ts.map +1 -0
  79. package/dist/client/blocks/library/DiffBlock.js +293 -0
  80. package/dist/client/blocks/library/DiffBlock.js.map +1 -0
  81. package/dist/client/blocks/library/FileTreeBlock.d.ts +23 -0
  82. package/dist/client/blocks/library/FileTreeBlock.d.ts.map +1 -0
  83. package/dist/client/blocks/library/FileTreeBlock.js +225 -0
  84. package/dist/client/blocks/library/FileTreeBlock.js.map +1 -0
  85. package/dist/client/blocks/library/JsonExplorerBlock.d.ts +19 -0
  86. package/dist/client/blocks/library/JsonExplorerBlock.d.ts.map +1 -0
  87. package/dist/client/blocks/library/JsonExplorerBlock.js +171 -0
  88. package/dist/client/blocks/library/JsonExplorerBlock.js.map +1 -0
  89. package/dist/client/blocks/library/MermaidBlock.d.ts +17 -0
  90. package/dist/client/blocks/library/MermaidBlock.d.ts.map +1 -0
  91. package/dist/client/blocks/library/MermaidBlock.js +131 -0
  92. package/dist/client/blocks/library/MermaidBlock.js.map +1 -0
  93. package/dist/client/blocks/library/OpenApiSpecBlock.d.ts +19 -0
  94. package/dist/client/blocks/library/OpenApiSpecBlock.d.ts.map +1 -0
  95. package/dist/client/blocks/library/OpenApiSpecBlock.js +494 -0
  96. package/dist/client/blocks/library/OpenApiSpecBlock.js.map +1 -0
  97. package/dist/client/blocks/library/annotated-code.config.d.ts +58 -0
  98. package/dist/client/blocks/library/annotated-code.config.d.ts.map +1 -0
  99. package/dist/client/blocks/library/annotated-code.config.js +53 -0
  100. package/dist/client/blocks/library/annotated-code.config.js.map +1 -0
  101. package/dist/client/blocks/library/api-endpoint.config.d.ts +71 -0
  102. package/dist/client/blocks/library/api-endpoint.config.d.ts.map +1 -0
  103. package/dist/client/blocks/library/api-endpoint.config.js +91 -0
  104. package/dist/client/blocks/library/api-endpoint.config.js.map +1 -0
  105. package/dist/client/blocks/library/checklist.config.d.ts +36 -0
  106. package/dist/client/blocks/library/checklist.config.d.ts.map +1 -0
  107. package/dist/client/blocks/library/checklist.config.js +25 -0
  108. package/dist/client/blocks/library/checklist.config.js.map +1 -0
  109. package/dist/client/blocks/library/checklist.d.ts +26 -0
  110. package/dist/client/blocks/library/checklist.d.ts.map +1 -0
  111. package/dist/client/blocks/library/checklist.js +78 -0
  112. package/dist/client/blocks/library/checklist.js.map +1 -0
  113. package/dist/client/blocks/library/code-tabs.config.d.ts +36 -0
  114. package/dist/client/blocks/library/code-tabs.config.d.ts.map +1 -0
  115. package/dist/client/blocks/library/code-tabs.config.js +30 -0
  116. package/dist/client/blocks/library/code-tabs.config.js.map +1 -0
  117. package/dist/client/blocks/library/code-tabs.d.ts +3 -0
  118. package/dist/client/blocks/library/code-tabs.d.ts.map +1 -0
  119. package/dist/client/blocks/library/code-tabs.js +165 -0
  120. package/dist/client/blocks/library/code-tabs.js.map +1 -0
  121. package/dist/client/blocks/library/data-model.config.d.ts +72 -0
  122. package/dist/client/blocks/library/data-model.config.d.ts.map +1 -0
  123. package/dist/client/blocks/library/data-model.config.js +59 -0
  124. package/dist/client/blocks/library/data-model.config.js.map +1 -0
  125. package/dist/client/blocks/library/dev-doc-ui.d.ts +49 -0
  126. package/dist/client/blocks/library/dev-doc-ui.d.ts.map +1 -0
  127. package/dist/client/blocks/library/dev-doc-ui.js +50 -0
  128. package/dist/client/blocks/library/dev-doc-ui.js.map +1 -0
  129. package/dist/client/blocks/library/diff.config.d.ts +41 -0
  130. package/dist/client/blocks/library/diff.config.d.ts.map +1 -0
  131. package/dist/client/blocks/library/diff.config.js +34 -0
  132. package/dist/client/blocks/library/diff.config.js.map +1 -0
  133. package/dist/client/blocks/library/file-tree.config.d.ts +59 -0
  134. package/dist/client/blocks/library/file-tree.config.d.ts.map +1 -0
  135. package/dist/client/blocks/library/file-tree.config.js +45 -0
  136. package/dist/client/blocks/library/file-tree.config.js.map +1 -0
  137. package/dist/client/blocks/library/html.config.d.ts +37 -0
  138. package/dist/client/blocks/library/html.config.d.ts.map +1 -0
  139. package/dist/client/blocks/library/html.config.js +46 -0
  140. package/dist/client/blocks/library/html.config.js.map +1 -0
  141. package/dist/client/blocks/library/html.d.ts +21 -0
  142. package/dist/client/blocks/library/html.d.ts.map +1 -0
  143. package/dist/client/blocks/library/html.js +72 -0
  144. package/dist/client/blocks/library/html.js.map +1 -0
  145. package/dist/client/blocks/library/json-explorer.config.d.ts +46 -0
  146. package/dist/client/blocks/library/json-explorer.config.d.ts.map +1 -0
  147. package/dist/client/blocks/library/json-explorer.config.js +28 -0
  148. package/dist/client/blocks/library/json-explorer.config.js.map +1 -0
  149. package/dist/client/blocks/library/mermaid.config.d.ts +32 -0
  150. package/dist/client/blocks/library/mermaid.config.d.ts.map +1 -0
  151. package/dist/client/blocks/library/mermaid.config.js +24 -0
  152. package/dist/client/blocks/library/mermaid.config.js.map +1 -0
  153. package/dist/client/blocks/library/openapi-spec.config.d.ts +49 -0
  154. package/dist/client/blocks/library/openapi-spec.config.d.ts.map +1 -0
  155. package/dist/client/blocks/library/openapi-spec.config.js +24 -0
  156. package/dist/client/blocks/library/openapi-spec.config.js.map +1 -0
  157. package/dist/client/blocks/library/server-specs.d.ts +35 -0
  158. package/dist/client/blocks/library/server-specs.d.ts.map +1 -0
  159. package/dist/client/blocks/library/server-specs.js +171 -0
  160. package/dist/client/blocks/library/server-specs.js.map +1 -0
  161. package/dist/client/blocks/library/specs.d.ts +29 -0
  162. package/dist/client/blocks/library/specs.d.ts.map +1 -0
  163. package/dist/client/blocks/library/specs.js +229 -0
  164. package/dist/client/blocks/library/specs.js.map +1 -0
  165. package/dist/client/blocks/library/table.config.d.ts +30 -0
  166. package/dist/client/blocks/library/table.config.d.ts.map +1 -0
  167. package/dist/client/blocks/library/table.config.js +22 -0
  168. package/dist/client/blocks/library/table.config.js.map +1 -0
  169. package/dist/client/blocks/library/table.d.ts +8 -0
  170. package/dist/client/blocks/library/table.d.ts.map +1 -0
  171. package/dist/client/blocks/library/table.js +109 -0
  172. package/dist/client/blocks/library/table.js.map +1 -0
  173. package/dist/client/blocks/library/tabs.config.d.ts +56 -0
  174. package/dist/client/blocks/library/tabs.config.d.ts.map +1 -0
  175. package/dist/client/blocks/library/tabs.config.js +36 -0
  176. package/dist/client/blocks/library/tabs.config.js.map +1 -0
  177. package/dist/client/blocks/library/tabs.d.ts +20 -0
  178. package/dist/client/blocks/library/tabs.d.ts.map +1 -0
  179. package/dist/client/blocks/library/tabs.js +123 -0
  180. package/dist/client/blocks/library/tabs.js.map +1 -0
  181. package/dist/client/blocks/mdx.d.ts +74 -0
  182. package/dist/client/blocks/mdx.d.ts.map +1 -0
  183. package/dist/client/blocks/mdx.js +205 -0
  184. package/dist/client/blocks/mdx.js.map +1 -0
  185. package/dist/client/blocks/provider.d.ts +25 -0
  186. package/dist/client/blocks/provider.d.ts.map +1 -0
  187. package/dist/client/blocks/provider.js +19 -0
  188. package/dist/client/blocks/provider.js.map +1 -0
  189. package/dist/client/blocks/registry.d.ts +32 -0
  190. package/dist/client/blocks/registry.d.ts.map +1 -0
  191. package/dist/client/blocks/registry.js +65 -0
  192. package/dist/client/blocks/registry.js.map +1 -0
  193. package/dist/client/blocks/schema-form/introspect.d.ts +31 -0
  194. package/dist/client/blocks/schema-form/introspect.d.ts.map +1 -0
  195. package/dist/client/blocks/schema-form/introspect.js +164 -0
  196. package/dist/client/blocks/schema-form/introspect.js.map +1 -0
  197. package/dist/client/blocks/server.d.ts +31 -0
  198. package/dist/client/blocks/server.d.ts.map +1 -0
  199. package/dist/client/blocks/server.js +41 -0
  200. package/dist/client/blocks/server.js.map +1 -0
  201. package/dist/client/blocks/types.d.ts +252 -0
  202. package/dist/client/blocks/types.d.ts.map +1 -0
  203. package/dist/client/blocks/types.js +5 -0
  204. package/dist/client/blocks/types.js.map +1 -0
  205. package/dist/client/composer/ComposerPlusMenu.js +10 -1
  206. package/dist/client/composer/ComposerPlusMenu.js.map +1 -1
  207. package/dist/client/guided-questions.d.ts +68 -0
  208. package/dist/client/guided-questions.d.ts.map +1 -1
  209. package/dist/client/guided-questions.js +158 -3
  210. package/dist/client/guided-questions.js.map +1 -1
  211. package/dist/client/index.d.ts +6 -1
  212. package/dist/client/index.d.ts.map +1 -1
  213. package/dist/client/index.js +24 -1
  214. package/dist/client/index.js.map +1 -1
  215. package/dist/client/rich-markdown-editor/BubbleToolbar.d.ts +37 -0
  216. package/dist/client/rich-markdown-editor/BubbleToolbar.d.ts.map +1 -0
  217. package/dist/client/rich-markdown-editor/BubbleToolbar.js +161 -0
  218. package/dist/client/rich-markdown-editor/BubbleToolbar.js.map +1 -0
  219. package/dist/client/rich-markdown-editor/DragHandle.d.ts +52 -0
  220. package/dist/client/rich-markdown-editor/DragHandle.d.ts.map +1 -0
  221. package/dist/client/rich-markdown-editor/DragHandle.js +403 -0
  222. package/dist/client/rich-markdown-editor/DragHandle.js.map +1 -0
  223. package/dist/client/rich-markdown-editor/ImageExtension.d.ts +63 -0
  224. package/dist/client/rich-markdown-editor/ImageExtension.d.ts.map +1 -0
  225. package/dist/client/rich-markdown-editor/ImageExtension.js +242 -0
  226. package/dist/client/rich-markdown-editor/ImageExtension.js.map +1 -0
  227. package/dist/client/rich-markdown-editor/RegistryBlockNode.d.ts +97 -0
  228. package/dist/client/rich-markdown-editor/RegistryBlockNode.d.ts.map +1 -0
  229. package/dist/client/rich-markdown-editor/RegistryBlockNode.js +214 -0
  230. package/dist/client/rich-markdown-editor/RegistryBlockNode.js.map +1 -0
  231. package/dist/client/rich-markdown-editor/RichMarkdownEditor.d.ts +51 -0
  232. package/dist/client/rich-markdown-editor/RichMarkdownEditor.d.ts.map +1 -0
  233. package/dist/client/rich-markdown-editor/RichMarkdownEditor.js +37 -0
  234. package/dist/client/rich-markdown-editor/RichMarkdownEditor.js.map +1 -0
  235. package/dist/client/rich-markdown-editor/RunId.d.ts +28 -0
  236. package/dist/client/rich-markdown-editor/RunId.d.ts.map +1 -0
  237. package/dist/client/rich-markdown-editor/RunId.js +60 -0
  238. package/dist/client/rich-markdown-editor/RunId.js.map +1 -0
  239. package/dist/client/rich-markdown-editor/SharedRichEditor.d.ts +85 -0
  240. package/dist/client/rich-markdown-editor/SharedRichEditor.d.ts.map +1 -0
  241. package/dist/client/rich-markdown-editor/SharedRichEditor.js +130 -0
  242. package/dist/client/rich-markdown-editor/SharedRichEditor.js.map +1 -0
  243. package/dist/client/rich-markdown-editor/SlashCommandMenu.d.ts +36 -0
  244. package/dist/client/rich-markdown-editor/SlashCommandMenu.d.ts.map +1 -0
  245. package/dist/client/rich-markdown-editor/SlashCommandMenu.js +193 -0
  246. package/dist/client/rich-markdown-editor/SlashCommandMenu.js.map +1 -0
  247. package/dist/client/rich-markdown-editor/extensions.d.ts +166 -0
  248. package/dist/client/rich-markdown-editor/extensions.d.ts.map +1 -0
  249. package/dist/client/rich-markdown-editor/extensions.js +222 -0
  250. package/dist/client/rich-markdown-editor/extensions.js.map +1 -0
  251. package/dist/client/rich-markdown-editor/gfmDoc.d.ts +24 -0
  252. package/dist/client/rich-markdown-editor/gfmDoc.d.ts.map +1 -0
  253. package/dist/client/rich-markdown-editor/gfmDoc.js +83 -0
  254. package/dist/client/rich-markdown-editor/gfmDoc.js.map +1 -0
  255. package/dist/client/rich-markdown-editor/index.d.ts +14 -0
  256. package/dist/client/rich-markdown-editor/index.d.ts.map +1 -0
  257. package/dist/client/rich-markdown-editor/index.js +14 -0
  258. package/dist/client/rich-markdown-editor/index.js.map +1 -0
  259. package/dist/client/rich-markdown-editor/registrySlashCommands.d.ts +46 -0
  260. package/dist/client/rich-markdown-editor/registrySlashCommands.d.ts.map +1 -0
  261. package/dist/client/rich-markdown-editor/registrySlashCommands.js +13 -0
  262. package/dist/client/rich-markdown-editor/registrySlashCommands.js.map +1 -0
  263. package/dist/client/rich-markdown-editor/uploadEditorImage.d.ts +18 -0
  264. package/dist/client/rich-markdown-editor/uploadEditorImage.d.ts.map +1 -0
  265. package/dist/client/rich-markdown-editor/uploadEditorImage.js +57 -0
  266. package/dist/client/rich-markdown-editor/uploadEditorImage.js.map +1 -0
  267. package/dist/client/rich-markdown-editor/useCollabReconcile.d.ts +91 -0
  268. package/dist/client/rich-markdown-editor/useCollabReconcile.d.ts.map +1 -0
  269. package/dist/client/rich-markdown-editor/useCollabReconcile.js +375 -0
  270. package/dist/client/rich-markdown-editor/useCollabReconcile.js.map +1 -0
  271. package/dist/client/track.d.ts +25 -0
  272. package/dist/client/track.d.ts.map +1 -0
  273. package/dist/client/track.js +53 -0
  274. package/dist/client/track.js.map +1 -0
  275. package/dist/client/use-action.d.ts.map +1 -1
  276. package/dist/client/use-action.js +6 -0
  277. package/dist/client/use-action.js.map +1 -1
  278. package/dist/client/use-session.d.ts +3 -2
  279. package/dist/client/use-session.d.ts.map +1 -1
  280. package/dist/client/use-session.js +3 -2
  281. package/dist/client/use-session.js.map +1 -1
  282. package/dist/deploy/build.d.ts +5 -0
  283. package/dist/deploy/build.d.ts.map +1 -1
  284. package/dist/deploy/build.js +67 -1
  285. package/dist/deploy/build.js.map +1 -1
  286. package/dist/extensions/schema.d.ts +1 -1
  287. package/dist/mcp/build-server.d.ts.map +1 -1
  288. package/dist/mcp/build-server.js +9 -2
  289. package/dist/mcp/build-server.js.map +1 -1
  290. package/dist/mcp/server.d.ts +1 -1
  291. package/dist/mcp/server.d.ts.map +1 -1
  292. package/dist/mcp/server.js +35 -2
  293. package/dist/mcp/server.js.map +1 -1
  294. package/dist/provider-api/index.d.ts +1 -1
  295. package/dist/provider-api/index.d.ts.map +1 -1
  296. package/dist/scripts/docs/search.d.ts.map +1 -1
  297. package/dist/scripts/docs/search.js +5 -2
  298. package/dist/scripts/docs/search.js.map +1 -1
  299. package/dist/scripts/runner.d.ts.map +1 -1
  300. package/dist/scripts/runner.js +16 -3
  301. package/dist/scripts/runner.js.map +1 -1
  302. package/dist/server/action-discovery.d.ts.map +1 -1
  303. package/dist/server/action-discovery.js +2 -0
  304. package/dist/server/action-discovery.js.map +1 -1
  305. package/dist/server/action-routes.d.ts.map +1 -1
  306. package/dist/server/action-routes.js +30 -4
  307. package/dist/server/action-routes.js.map +1 -1
  308. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  309. package/dist/server/agent-chat-plugin.js +65 -19
  310. package/dist/server/agent-chat-plugin.js.map +1 -1
  311. package/dist/server/agent-teams.d.ts.map +1 -1
  312. package/dist/server/agent-teams.js +8 -1
  313. package/dist/server/agent-teams.js.map +1 -1
  314. package/dist/server/agents-bundle.d.ts +27 -1
  315. package/dist/server/agents-bundle.d.ts.map +1 -1
  316. package/dist/server/agents-bundle.js +41 -3
  317. package/dist/server/agents-bundle.js.map +1 -1
  318. package/dist/server/auth.d.ts.map +1 -1
  319. package/dist/server/auth.js +76 -3
  320. package/dist/server/auth.js.map +1 -1
  321. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  322. package/dist/server/core-routes-plugin.js +60 -0
  323. package/dist/server/core-routes-plugin.js.map +1 -1
  324. package/dist/server/onboarding-html.d.ts.map +1 -1
  325. package/dist/server/onboarding-html.js +160 -22
  326. package/dist/server/onboarding-html.js.map +1 -1
  327. package/dist/server/sentry.d.ts.map +1 -1
  328. package/dist/server/sentry.js +6 -0
  329. package/dist/server/sentry.js.map +1 -1
  330. package/dist/server/social-og-image.d.ts +2 -1
  331. package/dist/server/social-og-image.d.ts.map +1 -1
  332. package/dist/server/social-og-image.js +24 -4
  333. package/dist/server/social-og-image.js.map +1 -1
  334. package/dist/sharing/schema.d.ts +1 -1
  335. package/dist/styles/agent-native.css +1 -0
  336. package/dist/styles/rich-markdown-editor.css +439 -0
  337. package/dist/templates/default/.agents/skills/actions/SKILL.md +4 -1
  338. package/dist/templates/default/.agents/skills/security/SKILL.md +13 -4
  339. package/dist/templates/default/.agents/skills/storing-data/SKILL.md +15 -3
  340. package/dist/templates/default/AGENTS.md +1 -0
  341. package/dist/templates/default/DEVELOPING.md +2 -0
  342. package/dist/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +10 -3
  343. package/dist/templates/workspace-core/.agents/skills/actions/SKILL.md +98 -10
  344. package/dist/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +45 -3
  345. package/dist/templates/workspace-core/.agents/skills/address-feedback/SKILL.md +2 -0
  346. package/dist/templates/workspace-core/.agents/skills/authentication/SKILL.md +37 -4
  347. package/dist/templates/workspace-core/.agents/skills/automations/SKILL.md +9 -4
  348. package/dist/templates/workspace-core/.agents/skills/capture-learnings/SKILL.md +2 -0
  349. package/dist/templates/workspace-core/.agents/skills/client-methods/SKILL.md +106 -0
  350. package/dist/templates/workspace-core/.agents/skills/client-methods/references/legacy-client-fetch-audit-2026-06-03.md +53 -0
  351. package/dist/templates/workspace-core/.agents/skills/client-side-routing/SKILL.md +2 -0
  352. package/dist/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +62 -61
  353. package/dist/templates/workspace-core/.agents/skills/context-xray/SKILL.md +47 -0
  354. package/dist/templates/workspace-core/.agents/skills/create-skill/SKILL.md +28 -0
  355. package/dist/templates/workspace-core/.agents/skills/delegate-to-agent/SKILL.md +52 -1
  356. package/dist/templates/workspace-core/.agents/skills/extension-points/SKILL.md +2 -0
  357. package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +95 -433
  358. package/dist/templates/workspace-core/.agents/skills/extensions/references/api.md +285 -0
  359. package/dist/templates/workspace-core/.agents/skills/extensions/references/examples.md +259 -0
  360. package/dist/templates/workspace-core/.agents/skills/external-agents/SKILL.md +398 -0
  361. package/dist/templates/workspace-core/.agents/skills/external-agents/references/mcp-apps-embedding.md +157 -0
  362. package/dist/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +17 -0
  363. package/dist/templates/workspace-core/.agents/skills/integration-webhooks/SKILL.md +13 -2
  364. package/dist/templates/workspace-core/.agents/skills/mvp-followup/SKILL.md +51 -0
  365. package/dist/templates/workspace-core/.agents/skills/observability/SKILL.md +14 -4
  366. package/dist/templates/workspace-core/.agents/skills/onboarding/SKILL.md +13 -1
  367. package/dist/templates/workspace-core/.agents/skills/portability/SKILL.md +27 -5
  368. package/dist/templates/workspace-core/.agents/skills/qa/SKILL.md +24 -8
  369. package/dist/templates/workspace-core/.agents/skills/real-time-collab/SKILL.md +53 -7
  370. package/dist/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +43 -10
  371. package/dist/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +2 -0
  372. package/dist/templates/workspace-core/.agents/skills/secrets/SKILL.md +43 -14
  373. package/dist/templates/workspace-core/.agents/skills/security/SKILL.md +50 -1
  374. package/dist/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +4 -2
  375. package/dist/templates/workspace-core/.agents/skills/server-plugins/SKILL.md +11 -1
  376. package/dist/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +15 -0
  377. package/dist/templates/workspace-core/.agents/skills/sharing/SKILL.md +5 -1
  378. package/dist/templates/workspace-core/.agents/skills/storing-data/SKILL.md +48 -19
  379. package/dist/templates/workspace-core/.agents/skills/tracking/SKILL.md +7 -3
  380. package/dist/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +13 -6
  381. package/dist/templates/workspace-core/.agents/skills/writing-agent-instructions/SKILL.md +236 -0
  382. package/dist/templates/workspace-core/AGENTS.md +5 -1
  383. package/dist/templates/workspace-root/AGENTS.md +5 -2
  384. package/dist/tracking/route.d.ts +43 -0
  385. package/dist/tracking/route.d.ts.map +1 -0
  386. package/dist/tracking/route.js +85 -0
  387. package/dist/tracking/route.js.map +1 -0
  388. package/dist/vite/client.d.ts.map +1 -1
  389. package/dist/vite/client.js +15 -0
  390. package/dist/vite/client.js.map +1 -1
  391. package/docs/content/a2a-protocol.md +18 -4
  392. package/docs/content/actions.md +87 -0
  393. package/docs/content/agent-mentions.md +2 -1
  394. package/docs/content/authentication.md +2 -1
  395. package/docs/content/client.md +64 -13
  396. package/docs/content/cloneable-saas.md +1 -1
  397. package/docs/content/code-agents-ui.md +17 -11
  398. package/docs/content/context-awareness.md +23 -28
  399. package/docs/content/creating-templates.md +1 -1
  400. package/docs/content/drop-in-agent.md +2 -0
  401. package/docs/content/getting-started.md +2 -2
  402. package/docs/content/key-concepts.md +2 -2
  403. package/docs/content/messaging.md +57 -15
  404. package/docs/content/migration-workbench.md +1 -1
  405. package/docs/content/multi-app-workspace.md +1 -1
  406. package/docs/content/multi-tenancy.md +17 -15
  407. package/docs/content/real-time-collaboration.md +1 -1
  408. package/docs/content/recurring-jobs.md +1 -1
  409. package/docs/content/security.md +2 -2
  410. package/docs/content/server.md +4 -4
  411. package/docs/content/skills-guide.md +30 -0
  412. package/docs/content/template-analytics.md +2 -2
  413. package/docs/content/template-assets.md +17 -1
  414. package/docs/content/template-brain.md +2 -2
  415. package/docs/content/template-calendar.md +1 -1
  416. package/docs/content/template-clips.md +3 -3
  417. package/docs/content/template-content.md +2 -2
  418. package/docs/content/template-design.md +2 -2
  419. package/docs/content/template-dispatch.md +3 -3
  420. package/docs/content/template-forms.md +14 -2
  421. package/docs/content/template-mail.md +1 -3
  422. package/docs/content/template-plan.md +133 -0
  423. package/docs/content/template-slides.md +5 -4
  424. package/docs/content/template-starter.md +4 -4
  425. package/docs/content/template-videos.md +6 -11
  426. package/docs/content/tracking.md +21 -1
  427. package/docs/content/visual-plans.md +74 -0
  428. package/docs/content/workspace.md +9 -9
  429. package/package.json +26 -11
  430. package/src/templates/default/.agents/skills/actions/SKILL.md +4 -1
  431. package/src/templates/default/.agents/skills/security/SKILL.md +13 -4
  432. package/src/templates/default/.agents/skills/storing-data/SKILL.md +15 -3
  433. package/src/templates/default/AGENTS.md +1 -0
  434. package/src/templates/default/DEVELOPING.md +2 -0
  435. package/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +10 -3
  436. package/src/templates/workspace-core/.agents/skills/actions/SKILL.md +98 -10
  437. package/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +45 -3
  438. package/src/templates/workspace-core/.agents/skills/address-feedback/SKILL.md +2 -0
  439. package/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +37 -4
  440. package/src/templates/workspace-core/.agents/skills/automations/SKILL.md +9 -4
  441. package/src/templates/workspace-core/.agents/skills/capture-learnings/SKILL.md +2 -0
  442. package/src/templates/workspace-core/.agents/skills/client-methods/SKILL.md +106 -0
  443. package/src/templates/workspace-core/.agents/skills/client-methods/references/legacy-client-fetch-audit-2026-06-03.md +53 -0
  444. package/src/templates/workspace-core/.agents/skills/client-side-routing/SKILL.md +2 -0
  445. package/src/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +62 -61
  446. package/src/templates/workspace-core/.agents/skills/context-xray/SKILL.md +47 -0
  447. package/src/templates/workspace-core/.agents/skills/create-skill/SKILL.md +28 -0
  448. package/src/templates/workspace-core/.agents/skills/delegate-to-agent/SKILL.md +52 -1
  449. package/src/templates/workspace-core/.agents/skills/extension-points/SKILL.md +2 -0
  450. package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +95 -433
  451. package/src/templates/workspace-core/.agents/skills/extensions/references/api.md +285 -0
  452. package/src/templates/workspace-core/.agents/skills/extensions/references/examples.md +259 -0
  453. package/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +398 -0
  454. package/src/templates/workspace-core/.agents/skills/external-agents/references/mcp-apps-embedding.md +157 -0
  455. package/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +17 -0
  456. package/src/templates/workspace-core/.agents/skills/integration-webhooks/SKILL.md +13 -2
  457. package/src/templates/workspace-core/.agents/skills/mvp-followup/SKILL.md +51 -0
  458. package/src/templates/workspace-core/.agents/skills/observability/SKILL.md +14 -4
  459. package/src/templates/workspace-core/.agents/skills/onboarding/SKILL.md +13 -1
  460. package/src/templates/workspace-core/.agents/skills/portability/SKILL.md +27 -5
  461. package/src/templates/workspace-core/.agents/skills/qa/SKILL.md +24 -8
  462. package/src/templates/workspace-core/.agents/skills/real-time-collab/SKILL.md +53 -7
  463. package/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +43 -10
  464. package/src/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +2 -0
  465. package/src/templates/workspace-core/.agents/skills/secrets/SKILL.md +43 -14
  466. package/src/templates/workspace-core/.agents/skills/security/SKILL.md +50 -1
  467. package/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +4 -2
  468. package/src/templates/workspace-core/.agents/skills/server-plugins/SKILL.md +11 -1
  469. package/src/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +15 -0
  470. package/src/templates/workspace-core/.agents/skills/sharing/SKILL.md +5 -1
  471. package/src/templates/workspace-core/.agents/skills/storing-data/SKILL.md +48 -19
  472. package/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +7 -3
  473. package/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +13 -6
  474. package/src/templates/workspace-core/.agents/skills/writing-agent-instructions/SKILL.md +236 -0
  475. package/src/templates/workspace-core/AGENTS.md +5 -1
  476. package/src/templates/workspace-root/AGENTS.md +5 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../../../../src/client/blocks/library/tabs.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAe,MAAM,aAAa,CAAC;AAC/E,OAAO,EAGL,KAAK,QAAQ,EAEd,MAAM,kBAAkB,CAAC;AAuE1B,6EAA6E;AAC7E,wBAAgB,eAAe,CAAC,EAC9B,IAAI,EACJ,OAAO,EACP,KAAK,EACL,GAAG,GACJ,EAAE,cAAc,CAAC,QAAQ,CAAC,2CAuB1B;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,EAC9B,IAAI,EACJ,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,KAAK,EACL,GAAG,GACJ,EAAE,cAAc,CAAC,QAAQ,CAAC,2CAsI1B;AAED;;;;;GAKG;AACH,eAAO,MAAM,SAAS,2CAYpB,CAAC"}
@@ -0,0 +1,123 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { IconLayoutNavbar, IconPlus, IconX } from "@tabler/icons-react";
4
+ import { cn } from "../../utils.js";
5
+ import { defineBlock } from "../types.js";
6
+ import { tabsSchema, tabsMdx, } from "./tabs.config.js";
7
+ /**
8
+ * Standard `tabs` block: a horizontal pill-tab container whose tabs each hold a
9
+ * list of child blocks. Lives in core so any app (plan today, content later) can
10
+ * register it.
11
+ *
12
+ * `Read`/`Edit` mirror the legacy plan `TabsBlock` markup byte-for-byte (same
13
+ * `plan-block` section, the `inline-flex` pill tab rail with `role="tablist"`/
14
+ * `role="tab"`, the same active-tab `useState`, and the `compactVisuals`
15
+ * heuristic on the block title) so converting the block to the registry does not
16
+ * change rendered output. The plan CSS classes (`plan-block`, `bg-plan-block`,
17
+ * `text-plan-*`) resolve against the plan app's stylesheet at render time,
18
+ * exactly as before.
19
+ *
20
+ * Child rendering flows through `ctx.renderBlock` — the app's own block
21
+ * dispatcher — so registered children render via their spec and unconverted
22
+ * children fall through the app's legacy switch. This is the coexistence seam:
23
+ * the core tabs block never has to know app-specific child block types.
24
+ */
25
+ /** Mint a reasonably-unique tab id without pulling a dep into core. */
26
+ function newTabId() {
27
+ return `tab-${Math.random().toString(36).slice(2, 10)}`;
28
+ }
29
+ /** Compact embedded visuals for dense tab panes, matching legacy behavior. */
30
+ function isCompact(title) {
31
+ return /interaction|component|note/i.test(title ?? "");
32
+ }
33
+ /** Shared pill-tab rail. */
34
+ function TabRail({ tabs, activeId, onSelect, }) {
35
+ return (_jsx("div", { className: "mb-8 inline-flex max-w-full gap-1 overflow-x-auto", role: "tablist", "data-plan-interactive": true, children: tabs.map((tab) => {
36
+ const selected = tab.id === activeId;
37
+ return (_jsx("button", { type: "button", role: "tab", "aria-selected": selected, onClick: () => onSelect(tab.id), className: cn("rounded-lg px-4 py-2 text-sm font-semibold transition-colors", selected
38
+ ? "bg-plan-block text-plan-text shadow-sm"
39
+ : "text-plan-muted hover:bg-plan-block/60 hover:text-plan-text"), children: tab.label }, tab.id));
40
+ }) }));
41
+ }
42
+ /** Read renderer: pill tabs, child blocks rendered read-only via the app. */
43
+ export function TabsBlockReader({ data, blockId, title, ctx, }) {
44
+ const [activeId, setActiveId] = useState(data.tabs[0]?.id ?? "");
45
+ const active = data.tabs.find((tab) => tab.id === activeId) ?? data.tabs[0];
46
+ const compact = isCompact(title);
47
+ return (_jsxs("section", { className: "plan-block", "data-block-id": blockId, children: [title && _jsx("div", { className: "plan-block-label", children: title }), _jsx(TabRail, { tabs: data.tabs, activeId: active?.id, onSelect: setActiveId }), active && (_jsx("div", { children: active.blocks.map((child) => (_jsx("div", { children: ctx.renderBlock?.({
48
+ block: child,
49
+ editing: false,
50
+ compactVisuals: compact,
51
+ }) }, child.id))) }))] }));
52
+ }
53
+ /**
54
+ * Editor: pill tabs plus tab management (add/remove/rename), with child blocks
55
+ * rendered editable in place through the app dispatcher. A child change updates
56
+ * that child within its tab and commits the whole tabs block — mirroring the
57
+ * legacy `TabsBlock` onChange bubbling so the plan's recursive `updateBlocks`/
58
+ * `findBlock` (`PlanContentRenderer`) keeps working unchanged.
59
+ */
60
+ export function TabsBlockEditor({ data, onChange, editable, blockId, title, ctx, }) {
61
+ const [activeId, setActiveId] = useState(data.tabs[0]?.id ?? "");
62
+ const active = data.tabs.find((tab) => tab.id === activeId) ?? data.tabs[0];
63
+ const compact = isCompact(title);
64
+ const commit = (tabs) => onChange({ tabs });
65
+ const renameTab = (id, label) => commit(data.tabs.map((tab) => (tab.id === id ? { ...tab, label } : tab)));
66
+ const removeTab = (id) => {
67
+ const next = data.tabs.filter((tab) => tab.id !== id);
68
+ if (next.length === 0)
69
+ return; // tabs must keep at least one (schema min 1)
70
+ commit(next);
71
+ if (activeId === id)
72
+ setActiveId(next[0]?.id ?? "");
73
+ };
74
+ const addTab = () => {
75
+ if (data.tabs.length >= 12)
76
+ return; // schema max
77
+ const id = newTabId();
78
+ commit([
79
+ ...data.tabs,
80
+ { id, label: `Tab ${data.tabs.length + 1}`, blocks: [] },
81
+ ]);
82
+ setActiveId(id);
83
+ };
84
+ const updateChild = (tabId, child) => commit(data.tabs.map((tab) => tab.id === tabId
85
+ ? {
86
+ ...tab,
87
+ blocks: tab.blocks.map((existing) => existing.id === child.id ? child : existing),
88
+ }
89
+ : tab));
90
+ // Renders BARE (no `plan-block` section / title): in edit mode the app's
91
+ // block dispatcher already wraps registered editors in a titled `plan-block`
92
+ // section, so wrapping again here would double-nest. The read renderer
93
+ // (`TabsBlockReader`) owns its own section because read mode renders the spec
94
+ // directly.
95
+ return (_jsxs("div", { "data-tabs-edit-block": blockId, children: [_jsxs("div", { className: "mb-8 flex max-w-full flex-wrap items-center gap-1 overflow-x-auto", role: "tablist", "data-plan-interactive": true, children: [data.tabs.map((tab) => {
96
+ const selected = tab.id === active?.id;
97
+ return (_jsxs("div", { className: cn("group flex items-center gap-1 rounded-lg pr-1 transition-colors", selected ? "bg-plan-block shadow-sm" : "hover:bg-plan-block/60"), children: [_jsx("button", { type: "button", role: "tab", "aria-selected": selected, onClick: () => setActiveId(tab.id), className: cn("rounded-lg px-4 py-2 text-sm font-semibold transition-colors", selected ? "text-plan-text" : "text-plan-muted"), children: tab.label }), editable && data.tabs.length > 1 && (_jsx("button", { type: "button", "data-plan-interactive": true, "aria-label": `Remove ${tab.label}`, className: cn("flex size-6 shrink-0 items-center justify-center rounded text-plan-muted transition-opacity", "opacity-0 group-hover:opacity-100 group-focus-within:opacity-100", "hover:bg-muted hover:text-foreground"), onClick: () => removeTab(tab.id), children: _jsx(IconX, { className: "size-3.5 shrink-0" }) }))] }, tab.id));
98
+ }), editable && data.tabs.length < 12 && (_jsxs("button", { type: "button", "data-plan-interactive": true, "aria-label": "Add tab", className: "flex items-center gap-1.5 rounded-md px-2 py-2 text-sm text-plan-muted hover:bg-plan-block/60 hover:text-plan-text", onClick: addTab, children: [_jsx(IconPlus, { className: "size-4" }), "Add tab"] }))] }), active && (_jsxs("div", { className: "grid gap-3", children: [editable && (_jsx("input", { type: "text", "data-plan-interactive": true, className: "flex h-9 w-full max-w-xs rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring", placeholder: "Tab label", value: active.label, onChange: (event) => renameTab(active.id, event.target.value) })), _jsx("div", { children: active.blocks.map((child) => (_jsx("div", { children: ctx.renderBlock?.({
99
+ block: child,
100
+ editing: true,
101
+ compactVisuals: compact,
102
+ onChange: (next) => updateChild(active.id, next),
103
+ }) }, child.id))) })] }))] }));
104
+ }
105
+ /**
106
+ * The standard tabs block spec (with React `Read`/`Edit`). Apps register this in
107
+ * their browser registry. The schema + MDX config come from `./tabs.config.ts`,
108
+ * the exact same object server / agent code registers, so rendering and source
109
+ * round-trip never drift.
110
+ */
111
+ export const tabsBlock = defineBlock({
112
+ type: "tabs",
113
+ schema: tabsSchema,
114
+ mdx: tabsMdx,
115
+ Read: TabsBlockReader,
116
+ Edit: TabsBlockEditor,
117
+ placement: ["block", "inline"],
118
+ label: "Tabs",
119
+ icon: IconLayoutNavbar,
120
+ description: "A horizontal pill-tab container; each tab holds its own list of blocks.",
121
+ empty: () => ({ tabs: [{ id: newTabId(), label: "Tab 1", blocks: [] }] }),
122
+ });
123
+ //# sourceMappingURL=tabs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabs.js","sourceRoot":"","sources":["../../../../src/client/blocks/library/tabs.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useState } from \"react\";\nimport { IconLayoutNavbar, IconPlus, IconX } from \"@tabler/icons-react\";\nimport { cn } from \"../../utils.js\";\nimport { defineBlock } from \"../types.js\";\nimport type { BlockReadProps, BlockEditProps, NestedBlock } from \"../types.js\";\nimport {\n tabsSchema,\n tabsMdx,\n type TabsData,\n type TabsTab,\n} from \"./tabs.config.js\";\n\n/**\n * Standard `tabs` block: a horizontal pill-tab container whose tabs each hold a\n * list of child blocks. Lives in core so any app (plan today, content later) can\n * register it.\n *\n * `Read`/`Edit` mirror the legacy plan `TabsBlock` markup byte-for-byte (same\n * `plan-block` section, the `inline-flex` pill tab rail with `role=\"tablist\"`/\n * `role=\"tab\"`, the same active-tab `useState`, and the `compactVisuals`\n * heuristic on the block title) so converting the block to the registry does not\n * change rendered output. The plan CSS classes (`plan-block`, `bg-plan-block`,\n * `text-plan-*`) resolve against the plan app's stylesheet at render time,\n * exactly as before.\n *\n * Child rendering flows through `ctx.renderBlock` — the app's own block\n * dispatcher — so registered children render via their spec and unconverted\n * children fall through the app's legacy switch. This is the coexistence seam:\n * the core tabs block never has to know app-specific child block types.\n */\n\n/** Mint a reasonably-unique tab id without pulling a dep into core. */\nfunction newTabId(): string {\n return `tab-${Math.random().toString(36).slice(2, 10)}`;\n}\n\n/** Compact embedded visuals for dense tab panes, matching legacy behavior. */\nfunction isCompact(title: string | undefined): boolean {\n return /interaction|component|note/i.test(title ?? \"\");\n}\n\n/** Shared pill-tab rail. */\nfunction TabRail({\n tabs,\n activeId,\n onSelect,\n}: {\n tabs: TabsTab[];\n activeId: string | undefined;\n onSelect: (id: string) => void;\n}) {\n return (\n <div\n className=\"mb-8 inline-flex max-w-full gap-1 overflow-x-auto\"\n role=\"tablist\"\n data-plan-interactive\n >\n {tabs.map((tab) => {\n const selected = tab.id === activeId;\n return (\n <button\n key={tab.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={selected}\n onClick={() => onSelect(tab.id)}\n className={cn(\n \"rounded-lg px-4 py-2 text-sm font-semibold transition-colors\",\n selected\n ? \"bg-plan-block text-plan-text shadow-sm\"\n : \"text-plan-muted hover:bg-plan-block/60 hover:text-plan-text\",\n )}\n >\n {tab.label}\n </button>\n );\n })}\n </div>\n );\n}\n\n/** Read renderer: pill tabs, child blocks rendered read-only via the app. */\nexport function TabsBlockReader({\n data,\n blockId,\n title,\n ctx,\n}: BlockReadProps<TabsData>) {\n const [activeId, setActiveId] = useState(data.tabs[0]?.id ?? \"\");\n const active = data.tabs.find((tab) => tab.id === activeId) ?? data.tabs[0];\n const compact = isCompact(title);\n return (\n <section className=\"plan-block\" data-block-id={blockId}>\n {title && <div className=\"plan-block-label\">{title}</div>}\n <TabRail tabs={data.tabs} activeId={active?.id} onSelect={setActiveId} />\n {active && (\n <div>\n {active.blocks.map((child) => (\n <div key={child.id}>\n {ctx.renderBlock?.({\n block: child,\n editing: false,\n compactVisuals: compact,\n })}\n </div>\n ))}\n </div>\n )}\n </section>\n );\n}\n\n/**\n * Editor: pill tabs plus tab management (add/remove/rename), with child blocks\n * rendered editable in place through the app dispatcher. A child change updates\n * that child within its tab and commits the whole tabs block — mirroring the\n * legacy `TabsBlock` onChange bubbling so the plan's recursive `updateBlocks`/\n * `findBlock` (`PlanContentRenderer`) keeps working unchanged.\n */\nexport function TabsBlockEditor({\n data,\n onChange,\n editable,\n blockId,\n title,\n ctx,\n}: BlockEditProps<TabsData>) {\n const [activeId, setActiveId] = useState(data.tabs[0]?.id ?? \"\");\n const active = data.tabs.find((tab) => tab.id === activeId) ?? data.tabs[0];\n const compact = isCompact(title);\n\n const commit = (tabs: TabsTab[]) => onChange({ tabs });\n\n const renameTab = (id: string, label: string) =>\n commit(data.tabs.map((tab) => (tab.id === id ? { ...tab, label } : tab)));\n\n const removeTab = (id: string) => {\n const next = data.tabs.filter((tab) => tab.id !== id);\n if (next.length === 0) return; // tabs must keep at least one (schema min 1)\n commit(next);\n if (activeId === id) setActiveId(next[0]?.id ?? \"\");\n };\n\n const addTab = () => {\n if (data.tabs.length >= 12) return; // schema max\n const id = newTabId();\n commit([\n ...data.tabs,\n { id, label: `Tab ${data.tabs.length + 1}`, blocks: [] },\n ]);\n setActiveId(id);\n };\n\n const updateChild = (tabId: string, child: NestedBlock) =>\n commit(\n data.tabs.map((tab) =>\n tab.id === tabId\n ? {\n ...tab,\n blocks: tab.blocks.map((existing) =>\n existing.id === child.id ? child : existing,\n ),\n }\n : tab,\n ),\n );\n\n // Renders BARE (no `plan-block` section / title): in edit mode the app's\n // block dispatcher already wraps registered editors in a titled `plan-block`\n // section, so wrapping again here would double-nest. The read renderer\n // (`TabsBlockReader`) owns its own section because read mode renders the spec\n // directly.\n return (\n <div data-tabs-edit-block={blockId}>\n <div\n className=\"mb-8 flex max-w-full flex-wrap items-center gap-1 overflow-x-auto\"\n role=\"tablist\"\n data-plan-interactive\n >\n {data.tabs.map((tab) => {\n const selected = tab.id === active?.id;\n return (\n <div\n key={tab.id}\n className={cn(\n \"group flex items-center gap-1 rounded-lg pr-1 transition-colors\",\n selected ? \"bg-plan-block shadow-sm\" : \"hover:bg-plan-block/60\",\n )}\n >\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={selected}\n onClick={() => setActiveId(tab.id)}\n className={cn(\n \"rounded-lg px-4 py-2 text-sm font-semibold transition-colors\",\n selected ? \"text-plan-text\" : \"text-plan-muted\",\n )}\n >\n {tab.label}\n </button>\n {editable && data.tabs.length > 1 && (\n <button\n type=\"button\"\n data-plan-interactive\n aria-label={`Remove ${tab.label}`}\n className={cn(\n \"flex size-6 shrink-0 items-center justify-center rounded text-plan-muted transition-opacity\",\n \"opacity-0 group-hover:opacity-100 group-focus-within:opacity-100\",\n \"hover:bg-muted hover:text-foreground\",\n )}\n onClick={() => removeTab(tab.id)}\n >\n <IconX className=\"size-3.5 shrink-0\" />\n </button>\n )}\n </div>\n );\n })}\n {editable && data.tabs.length < 12 && (\n <button\n type=\"button\"\n data-plan-interactive\n aria-label=\"Add tab\"\n className=\"flex items-center gap-1.5 rounded-md px-2 py-2 text-sm text-plan-muted hover:bg-plan-block/60 hover:text-plan-text\"\n onClick={addTab}\n >\n <IconPlus className=\"size-4\" />\n Add tab\n </button>\n )}\n </div>\n {active && (\n <div className=\"grid gap-3\">\n {editable && (\n <input\n type=\"text\"\n data-plan-interactive\n className=\"flex h-9 w-full max-w-xs rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n placeholder=\"Tab label\"\n value={active.label}\n onChange={(event) => renameTab(active.id, event.target.value)}\n />\n )}\n <div>\n {active.blocks.map((child) => (\n <div key={child.id}>\n {ctx.renderBlock?.({\n block: child,\n editing: true,\n compactVisuals: compact,\n onChange: (next) => updateChild(active.id, next),\n })}\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n}\n\n/**\n * The standard tabs block spec (with React `Read`/`Edit`). Apps register this in\n * their browser registry. The schema + MDX config come from `./tabs.config.ts`,\n * the exact same object server / agent code registers, so rendering and source\n * round-trip never drift.\n */\nexport const tabsBlock = defineBlock<TabsData>({\n type: \"tabs\",\n schema: tabsSchema,\n mdx: tabsMdx,\n Read: TabsBlockReader,\n Edit: TabsBlockEditor,\n placement: [\"block\", \"inline\"],\n label: \"Tabs\",\n icon: IconLayoutNavbar,\n description:\n \"A horizontal pill-tab container; each tab holds its own list of blocks.\",\n empty: () => ({ tabs: [{ id: newTabId(), label: \"Tab 1\", blocks: [] }] }),\n});\n"]}
@@ -0,0 +1,74 @@
1
+ import type { BlockSpec, BlockAttrReader } from "./types.js";
2
+ import type { BlockRegistry } from "./registry.js";
3
+ /**
4
+ * Registry-driven MDX serialize/parse, plus the shared encoder primitives that
5
+ * are the round-trip contract. This module is React-free so the server MDX
6
+ * adapter (`plan-mdx.ts`) and the agent schema export can import it. The encoder
7
+ * + estree literal walker are kept BYTE-FOR-BYTE identical to the originals in
8
+ * `plan-mdx.ts` — `plan-mdx.ts` re-imports them so nothing else there changes
9
+ * and stored `.mdx` files round-trip the same.
10
+ */
11
+ export declare function jsonExpression(value: unknown): string;
12
+ export declare function escapeAttr(value: string): string;
13
+ /**
14
+ * Encode a single attribute. Returns "" (the attribute is dropped) for
15
+ * undefined/null; a bare/`={false}` flag for booleans; `={n}` for numbers; a
16
+ * quoted string when it matches the safe charset and is short, else a JSON
17
+ * expression. Objects/arrays always serialize as a JSON expression.
18
+ */
19
+ export declare function prop(name: string, value: unknown): string;
20
+ /** Minimal MDX AST node shape (subset of the remark-mdx jsx element). */
21
+ export type MdxAttrNode = {
22
+ type: string;
23
+ name?: string;
24
+ value?: string | null | MdxAttrExpression;
25
+ };
26
+ type MdxAttrExpression = {
27
+ type: string;
28
+ value: string;
29
+ data?: unknown;
30
+ };
31
+ export type MdxJsxNode = {
32
+ type: string;
33
+ name?: string;
34
+ attributes?: MdxAttrNode[];
35
+ children?: unknown[];
36
+ [key: string]: unknown;
37
+ };
38
+ export declare function attributeValue(attr: MdxAttrNode | undefined): unknown;
39
+ /** Build a {@link BlockAttrReader} bound to one parsed JSX node. */
40
+ export declare function createAttrReader(node: MdxJsxNode): BlockAttrReader;
41
+ /** The base-attribute + body shape every block carries. */
42
+ export interface SerializableBlock {
43
+ id: string;
44
+ title?: string;
45
+ summary?: string;
46
+ editable?: boolean;
47
+ data: unknown;
48
+ }
49
+ /** Base block attributes parsed from a node, before the type-specific data. */
50
+ export interface ParsedBlockBase {
51
+ id: string;
52
+ title?: string;
53
+ summary?: string;
54
+ editable?: boolean;
55
+ }
56
+ /**
57
+ * Serialize a block to its MDX element using its spec. Byte output MUST match
58
+ * the legacy `serializeBlock` for every converted block: base attrs
59
+ * (`id,title,summary,editable`) first, then the spec's `toAttrs` in insertion
60
+ * order, then either nested children, prose children, or self-closing.
61
+ */
62
+ export declare function serializeSpecBlock(spec: BlockSpec<any>, block: SerializableBlock): string;
63
+ /**
64
+ * Parse one MDX JSX node into a block via the registry, if its tag is
65
+ * registered. Returns `null` for unregistered tags so the caller can fall back
66
+ * to its legacy parser. `base` is the already-extracted id/title/summary/
67
+ * editable; `children` is the stringified prose children.
68
+ */
69
+ export declare function parseSpecBlock(registry: BlockRegistry, node: MdxJsxNode, base: ParsedBlockBase, children: string, idContext: string): {
70
+ type: string;
71
+ data: unknown;
72
+ } | null;
73
+ export {};
74
+ //# sourceMappingURL=mdx.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mdx.d.ts","sourceRoot":"","sources":["../../../src/client/blocks/mdx.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAgB,MAAM,YAAY,CAAC;AAC3E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD;;;;;;;GAOG;AAMH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAErD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMhD;AAED;;;;;GAKG;AACH,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAazD;AAMD,yEAAyE;AACzE,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,iBAAiB,CAAC;CAC3C,CAAC;AAEF,KAAK,iBAAiB,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAgBF,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,WAAW,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,CAAC;AAWF,wBAAgB,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,SAAS,GAAG,OAAO,CAgBrE;AA+CD,oEAAoE;AACpE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,eAAe,CAyBlE;AAMD,2DAA2D;AAC3D,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,+EAA+E;AAC/E,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,EACpB,KAAK,EAAE,iBAAiB,GACvB,MAAM,CA+BR;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,aAAa,EACvB,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,eAAe,EACrB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAChB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAmBxC"}
@@ -0,0 +1,205 @@
1
+ /**
2
+ * Registry-driven MDX serialize/parse, plus the shared encoder primitives that
3
+ * are the round-trip contract. This module is React-free so the server MDX
4
+ * adapter (`plan-mdx.ts`) and the agent schema export can import it. The encoder
5
+ * + estree literal walker are kept BYTE-FOR-BYTE identical to the originals in
6
+ * `plan-mdx.ts` — `plan-mdx.ts` re-imports them so nothing else there changes
7
+ * and stored `.mdx` files round-trip the same.
8
+ */
9
+ /* -------------------------------------------------------------------------- */
10
+ /* Serialize-side encoder primitives (moved verbatim from plan-mdx.ts) */
11
+ /* -------------------------------------------------------------------------- */
12
+ export function jsonExpression(value) {
13
+ return JSON.stringify(value, null, 2);
14
+ }
15
+ export function escapeAttr(value) {
16
+ return value
17
+ .replace(/&/g, "&amp;")
18
+ .replace(/"/g, "&quot;")
19
+ .replace(/</g, "&lt;")
20
+ .replace(/>/g, "&gt;");
21
+ }
22
+ /**
23
+ * Encode a single attribute. Returns "" (the attribute is dropped) for
24
+ * undefined/null; a bare/`={false}` flag for booleans; `={n}` for numbers; a
25
+ * quoted string when it matches the safe charset and is short, else a JSON
26
+ * expression. Objects/arrays always serialize as a JSON expression.
27
+ */
28
+ export function prop(name, value) {
29
+ if (value === undefined || value === null)
30
+ return "";
31
+ if (typeof value === "boolean") {
32
+ return value ? ` ${name}` : ` ${name}={false}`;
33
+ }
34
+ if (typeof value === "number")
35
+ return ` ${name}={${value}}`;
36
+ if (typeof value === "string") {
37
+ if (/^[\w .:/@#,+()[\]-]+$/.test(value) && value.length < 140) {
38
+ return ` ${name}="${escapeAttr(value)}"`;
39
+ }
40
+ return ` ${name}={${jsonExpression(value)}}`;
41
+ }
42
+ return ` ${name}={${jsonExpression(value)}}`;
43
+ }
44
+ function findAttribute(node, name) {
45
+ return node.attributes?.find((attr) => attr.type === "mdxJsxAttribute" && attr.name === name);
46
+ }
47
+ export function attributeValue(attr) {
48
+ if (!attr)
49
+ return undefined;
50
+ if (attr.value === null || attr.value === undefined)
51
+ return true;
52
+ if (typeof attr.value === "string")
53
+ return attr.value;
54
+ const astValue = literalExpressionValue(attr.value);
55
+ if (astValue !== undefined)
56
+ return astValue;
57
+ const expression = attr.value.value.trim();
58
+ if (!expression)
59
+ return undefined;
60
+ if (expression === "undefined")
61
+ return undefined;
62
+ try {
63
+ return JSON.parse(expression);
64
+ }
65
+ catch {
66
+ throw new Error(`Unsupported MDX attribute expression for "${attr.name}": {${expression}}. Use literal values or valid JSON.`);
67
+ }
68
+ }
69
+ function literalExpressionValue(expression) {
70
+ const estree = expression.data
71
+ ?.estree;
72
+ const statement = estree?.body?.[0];
73
+ if (!statement || statement.type !== "ExpressionStatement")
74
+ return undefined;
75
+ return literalNodeValue(statement.expression);
76
+ }
77
+ function literalNodeValue(node) {
78
+ if (!node)
79
+ return undefined;
80
+ if (node.type === "Literal")
81
+ return node.value;
82
+ if (node.type === "ArrayExpression") {
83
+ return (node.elements ?? []).map((item) => literalNodeValue(item));
84
+ }
85
+ if (node.type === "ObjectExpression") {
86
+ const out = {};
87
+ for (const property of node.properties ?? []) {
88
+ if (property.type !== "Property" || property.computed)
89
+ return undefined;
90
+ const key = property.key;
91
+ const rawKey = key?.type === "Identifier"
92
+ ? key.name
93
+ : key?.type === "Literal" && typeof key.value === "string"
94
+ ? key.value
95
+ : undefined;
96
+ if (!rawKey)
97
+ return undefined;
98
+ const value = literalNodeValue(property.value);
99
+ if (value !== undefined)
100
+ out[rawKey] = value;
101
+ }
102
+ return out;
103
+ }
104
+ if (node.type === "UnaryExpression") {
105
+ const value = literalNodeValue(node.argument);
106
+ if (typeof value !== "number")
107
+ return undefined;
108
+ if (node.operator === "-")
109
+ return -value;
110
+ if (node.operator === "+")
111
+ return value;
112
+ }
113
+ if (node.type === "Identifier") {
114
+ if (node.name === "undefined")
115
+ return undefined;
116
+ if (node.name === "NaN")
117
+ return Number.NaN;
118
+ if (node.name === "Infinity")
119
+ return Infinity;
120
+ }
121
+ return undefined;
122
+ }
123
+ /** Build a {@link BlockAttrReader} bound to one parsed JSX node. */
124
+ export function createAttrReader(node) {
125
+ const read = (name) => attributeValue(findAttribute(node, name));
126
+ return {
127
+ raw: read,
128
+ string(name) {
129
+ const value = read(name);
130
+ return typeof value === "string" ? value : undefined;
131
+ },
132
+ number(name) {
133
+ const value = read(name);
134
+ return typeof value === "number" ? value : undefined;
135
+ },
136
+ bool(name) {
137
+ const value = read(name);
138
+ return typeof value === "boolean" ? value : undefined;
139
+ },
140
+ array(name) {
141
+ const value = read(name);
142
+ return Array.isArray(value) ? value : undefined;
143
+ },
144
+ object(name) {
145
+ const value = read(name);
146
+ return value && typeof value === "object" ? value : undefined;
147
+ },
148
+ };
149
+ }
150
+ /**
151
+ * Serialize a block to its MDX element using its spec. Byte output MUST match
152
+ * the legacy `serializeBlock` for every converted block: base attrs
153
+ * (`id,title,summary,editable`) first, then the spec's `toAttrs` in insertion
154
+ * order, then either nested children, prose children, or self-closing.
155
+ */
156
+ export function serializeSpecBlock(spec, block) {
157
+ const base = prop("id", block.id) +
158
+ prop("title", block.title) +
159
+ prop("summary", block.summary) +
160
+ prop("editable", block.editable);
161
+ const attrs = spec.mdx.toAttrs(block.data);
162
+ const childrenField = spec.mdx.childrenField;
163
+ const attrStr = Object.entries(attrs)
164
+ .filter(([key]) => key !== childrenField)
165
+ .map(([key, value]) => prop(key, value))
166
+ .join("");
167
+ const tag = spec.mdx.tag;
168
+ // Custom nested-MDX children (e.g. wireframe Screen/kit tree).
169
+ if (spec.mdx.serializeChildren) {
170
+ return `<${tag}${base}${attrStr}>\n${spec.mdx.serializeChildren(block.data)}\n</${tag}>`;
171
+ }
172
+ // Prose children (rich-text, callout): body is a trimmed markdown string.
173
+ if (childrenField) {
174
+ const body = String(block.data[childrenField] ?? "").trim();
175
+ return `<${tag}${base}${attrStr}>\n\n${body}\n\n</${tag}>`;
176
+ }
177
+ // Self-closing structured block.
178
+ return `<${tag}${base}${attrStr} />`;
179
+ }
180
+ /**
181
+ * Parse one MDX JSX node into a block via the registry, if its tag is
182
+ * registered. Returns `null` for unregistered tags so the caller can fall back
183
+ * to its legacy parser. `base` is the already-extracted id/title/summary/
184
+ * editable; `children` is the stringified prose children.
185
+ */
186
+ export function parseSpecBlock(registry, node, base, children, idContext) {
187
+ const tag = node.name;
188
+ if (!tag)
189
+ return null;
190
+ const spec = registry.getByTag(tag);
191
+ if (!spec)
192
+ return null;
193
+ const reader = createAttrReader(node);
194
+ let data;
195
+ if (spec.mdx.parseChildren) {
196
+ const fromAttrs = spec.mdx.fromAttrs(reader, children);
197
+ const fromChildren = spec.mdx.parseChildren(node.children ?? [], `${idContext}-${base.id}`);
198
+ data = { ...fromAttrs, ...fromChildren };
199
+ }
200
+ else {
201
+ data = spec.mdx.fromAttrs(reader, children);
202
+ }
203
+ return { type: spec.type, data };
204
+ }
205
+ //# sourceMappingURL=mdx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mdx.js","sourceRoot":"","sources":["../../../src/client/blocks/mdx.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BlockSpec, BlockAttrReader, MdxAttrValue } from \"./types.js\";\nimport type { BlockRegistry } from \"./registry.js\";\n\n/**\n * Registry-driven MDX serialize/parse, plus the shared encoder primitives that\n * are the round-trip contract. This module is React-free so the server MDX\n * adapter (`plan-mdx.ts`) and the agent schema export can import it. The encoder\n * + estree literal walker are kept BYTE-FOR-BYTE identical to the originals in\n * `plan-mdx.ts` — `plan-mdx.ts` re-imports them so nothing else there changes\n * and stored `.mdx` files round-trip the same.\n */\n\n/* -------------------------------------------------------------------------- */\n/* Serialize-side encoder primitives (moved verbatim from plan-mdx.ts) */\n/* -------------------------------------------------------------------------- */\n\nexport function jsonExpression(value: unknown): string {\n return JSON.stringify(value, null, 2);\n}\n\nexport function escapeAttr(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\");\n}\n\n/**\n * Encode a single attribute. Returns \"\" (the attribute is dropped) for\n * undefined/null; a bare/`={false}` flag for booleans; `={n}` for numbers; a\n * quoted string when it matches the safe charset and is short, else a JSON\n * expression. Objects/arrays always serialize as a JSON expression.\n */\nexport function prop(name: string, value: unknown): string {\n if (value === undefined || value === null) return \"\";\n if (typeof value === \"boolean\") {\n return value ? ` ${name}` : ` ${name}={false}`;\n }\n if (typeof value === \"number\") return ` ${name}={${value}}`;\n if (typeof value === \"string\") {\n if (/^[\\w .:/@#,+()[\\]-]+$/.test(value) && value.length < 140) {\n return ` ${name}=\"${escapeAttr(value)}\"`;\n }\n return ` ${name}={${jsonExpression(value)}}`;\n }\n return ` ${name}={${jsonExpression(value)}}`;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Parse-side attribute resolution (moved verbatim from plan-mdx.ts) */\n/* -------------------------------------------------------------------------- */\n\n/** Minimal MDX AST node shape (subset of the remark-mdx jsx element). */\nexport type MdxAttrNode = {\n type: string;\n name?: string;\n value?: string | null | MdxAttrExpression;\n};\n\ntype MdxAttrExpression = {\n type: string;\n value: string;\n data?: unknown;\n};\n\ntype EstreeNode = {\n type: string;\n value?: unknown;\n name?: string;\n expression?: EstreeNode;\n body?: EstreeNode[];\n elements?: Array<EstreeNode | null>;\n properties?: EstreeNode[];\n key?: EstreeNode;\n computed?: boolean;\n argument?: EstreeNode;\n operator?: string;\n};\n\nexport type MdxJsxNode = {\n type: string;\n name?: string;\n attributes?: MdxAttrNode[];\n children?: unknown[];\n [key: string]: unknown;\n};\n\nfunction findAttribute(\n node: MdxJsxNode,\n name: string,\n): MdxAttrNode | undefined {\n return node.attributes?.find(\n (attr) => attr.type === \"mdxJsxAttribute\" && attr.name === name,\n );\n}\n\nexport function attributeValue(attr: MdxAttrNode | undefined): unknown {\n if (!attr) return undefined;\n if (attr.value === null || attr.value === undefined) return true;\n if (typeof attr.value === \"string\") return attr.value;\n const astValue = literalExpressionValue(attr.value);\n if (astValue !== undefined) return astValue;\n const expression = attr.value.value.trim();\n if (!expression) return undefined;\n if (expression === \"undefined\") return undefined;\n try {\n return JSON.parse(expression);\n } catch {\n throw new Error(\n `Unsupported MDX attribute expression for \"${attr.name}\": {${expression}}. Use literal values or valid JSON.`,\n );\n }\n}\n\nfunction literalExpressionValue(expression: MdxAttrExpression): unknown {\n const estree = (expression.data as { estree?: EstreeNode } | undefined)\n ?.estree;\n const statement = estree?.body?.[0];\n if (!statement || statement.type !== \"ExpressionStatement\") return undefined;\n return literalNodeValue(statement.expression);\n}\n\nfunction literalNodeValue(node: EstreeNode | undefined | null): unknown {\n if (!node) return undefined;\n if (node.type === \"Literal\") return node.value;\n if (node.type === \"ArrayExpression\") {\n return (node.elements ?? []).map((item) => literalNodeValue(item));\n }\n if (node.type === \"ObjectExpression\") {\n const out: Record<string, unknown> = {};\n for (const property of node.properties ?? []) {\n if (property.type !== \"Property\" || property.computed) return undefined;\n const key = property.key;\n const rawKey =\n key?.type === \"Identifier\"\n ? key.name\n : key?.type === \"Literal\" && typeof key.value === \"string\"\n ? key.value\n : undefined;\n if (!rawKey) return undefined;\n const value = literalNodeValue(property.value as EstreeNode | undefined);\n if (value !== undefined) out[rawKey] = value;\n }\n return out;\n }\n if (node.type === \"UnaryExpression\") {\n const value = literalNodeValue(node.argument);\n if (typeof value !== \"number\") return undefined;\n if (node.operator === \"-\") return -value;\n if (node.operator === \"+\") return value;\n }\n if (node.type === \"Identifier\") {\n if (node.name === \"undefined\") return undefined;\n if (node.name === \"NaN\") return Number.NaN;\n if (node.name === \"Infinity\") return Infinity;\n }\n return undefined;\n}\n\n/** Build a {@link BlockAttrReader} bound to one parsed JSX node. */\nexport function createAttrReader(node: MdxJsxNode): BlockAttrReader {\n const read = (name: string) => attributeValue(findAttribute(node, name));\n return {\n raw: read,\n string(name) {\n const value = read(name);\n return typeof value === \"string\" ? value : undefined;\n },\n number(name) {\n const value = read(name);\n return typeof value === \"number\" ? value : undefined;\n },\n bool(name) {\n const value = read(name);\n return typeof value === \"boolean\" ? value : undefined;\n },\n array(name) {\n const value = read(name);\n return Array.isArray(value) ? (value as never[]) : undefined;\n },\n object(name) {\n const value = read(name);\n return value && typeof value === \"object\" ? (value as never) : undefined;\n },\n };\n}\n\n/* -------------------------------------------------------------------------- */\n/* Registry serialize / parse */\n/* -------------------------------------------------------------------------- */\n\n/** The base-attribute + body shape every block carries. */\nexport interface SerializableBlock {\n id: string;\n title?: string;\n summary?: string;\n editable?: boolean;\n data: unknown;\n}\n\n/** Base block attributes parsed from a node, before the type-specific data. */\nexport interface ParsedBlockBase {\n id: string;\n title?: string;\n summary?: string;\n editable?: boolean;\n}\n\n/**\n * Serialize a block to its MDX element using its spec. Byte output MUST match\n * the legacy `serializeBlock` for every converted block: base attrs\n * (`id,title,summary,editable`) first, then the spec's `toAttrs` in insertion\n * order, then either nested children, prose children, or self-closing.\n */\nexport function serializeSpecBlock(\n spec: BlockSpec<any>,\n block: SerializableBlock,\n): string {\n const base =\n prop(\"id\", block.id) +\n prop(\"title\", block.title) +\n prop(\"summary\", block.summary) +\n prop(\"editable\", block.editable);\n\n const attrs = spec.mdx.toAttrs(block.data);\n const childrenField = spec.mdx.childrenField;\n const attrStr = Object.entries(attrs)\n .filter(([key]) => key !== childrenField)\n .map(([key, value]) => prop(key, value as MdxAttrValue | undefined))\n .join(\"\");\n\n const tag = spec.mdx.tag;\n\n // Custom nested-MDX children (e.g. wireframe Screen/kit tree).\n if (spec.mdx.serializeChildren) {\n return `<${tag}${base}${attrStr}>\\n${spec.mdx.serializeChildren(block.data)}\\n</${tag}>`;\n }\n\n // Prose children (rich-text, callout): body is a trimmed markdown string.\n if (childrenField) {\n const body = String(\n (block.data as Record<string, unknown>)[childrenField] ?? \"\",\n ).trim();\n return `<${tag}${base}${attrStr}>\\n\\n${body}\\n\\n</${tag}>`;\n }\n\n // Self-closing structured block.\n return `<${tag}${base}${attrStr} />`;\n}\n\n/**\n * Parse one MDX JSX node into a block via the registry, if its tag is\n * registered. Returns `null` for unregistered tags so the caller can fall back\n * to its legacy parser. `base` is the already-extracted id/title/summary/\n * editable; `children` is the stringified prose children.\n */\nexport function parseSpecBlock(\n registry: BlockRegistry,\n node: MdxJsxNode,\n base: ParsedBlockBase,\n children: string,\n idContext: string,\n): { type: string; data: unknown } | null {\n const tag = node.name;\n if (!tag) return null;\n const spec = registry.getByTag(tag);\n if (!spec) return null;\n\n const reader = createAttrReader(node);\n let data: unknown;\n if (spec.mdx.parseChildren) {\n const fromAttrs = spec.mdx.fromAttrs(reader, children);\n const fromChildren = spec.mdx.parseChildren(\n node.children ?? [],\n `${idContext}-${base.id}`,\n );\n data = { ...(fromAttrs as object), ...(fromChildren as object) };\n } else {\n data = spec.mdx.fromAttrs(reader, children);\n }\n return { type: spec.type, data };\n}\n"]}
@@ -0,0 +1,25 @@
1
+ import { type ReactNode } from "react";
2
+ import type { BlockRegistry } from "./registry.js";
3
+ import type { BlockRenderContext } from "./types.js";
4
+ /**
5
+ * React provision for the block registry. The registry itself is a per-app
6
+ * module singleton (so the server MDX serializer/parser and the agent schema
7
+ * export can import it outside React); this thin context threads that singleton
8
+ * plus the runtime {@link BlockRenderContext} (asset resolver, action caller,
9
+ * inline markdown editor, …) into the renderer, and lets tests swap registries.
10
+ */
11
+ interface BlockRegistryValue {
12
+ registry: BlockRegistry;
13
+ ctx: BlockRenderContext;
14
+ }
15
+ export declare function BlockRegistryProvider({ registry, ctx, children, }: {
16
+ registry: BlockRegistry;
17
+ ctx: BlockRenderContext;
18
+ children: ReactNode;
19
+ }): import("react/jsx-runtime").JSX.Element;
20
+ /** Read the active registry + render context. Throws outside a provider. */
21
+ export declare function useBlockRegistry(): BlockRegistryValue;
22
+ /** Read the active registry + render context, or `null` outside a provider. */
23
+ export declare function useOptionalBlockRegistry(): BlockRegistryValue | null;
24
+ export {};
25
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/client/blocks/provider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD;;;;;;GAMG;AAEH,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,aAAa,CAAC;IACxB,GAAG,EAAE,kBAAkB,CAAC;CACzB;AAID,wBAAgB,qBAAqB,CAAC,EACpC,QAAQ,EACR,GAAG,EACH,QAAQ,GACT,EAAE;IACD,QAAQ,EAAE,aAAa,CAAC;IACxB,GAAG,EAAE,kBAAkB,CAAC;IACxB,QAAQ,EAAE,SAAS,CAAC;CACrB,2CAMA;AAED,4EAA4E;AAC5E,wBAAgB,gBAAgB,IAAI,kBAAkB,CAQrD;AAED,+EAA+E;AAC/E,wBAAgB,wBAAwB,IAAI,kBAAkB,GAAG,IAAI,CAEpE"}
@@ -0,0 +1,19 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createContext, useContext } from "react";
3
+ const BlockRegistryContext = createContext(null);
4
+ export function BlockRegistryProvider({ registry, ctx, children, }) {
5
+ return (_jsx(BlockRegistryContext.Provider, { value: { registry, ctx }, children: children }));
6
+ }
7
+ /** Read the active registry + render context. Throws outside a provider. */
8
+ export function useBlockRegistry() {
9
+ const value = useContext(BlockRegistryContext);
10
+ if (!value) {
11
+ throw new Error("useBlockRegistry must be used inside a <BlockRegistryProvider>.");
12
+ }
13
+ return value;
14
+ }
15
+ /** Read the active registry + render context, or `null` outside a provider. */
16
+ export function useOptionalBlockRegistry() {
17
+ return useContext(BlockRegistryContext);
18
+ }
19
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/client/blocks/provider.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAkB,MAAM,OAAO,CAAC;AAiBlE,MAAM,oBAAoB,GAAG,aAAa,CAA4B,IAAI,CAAC,CAAC;AAE5E,MAAM,UAAU,qBAAqB,CAAC,EACpC,QAAQ,EACR,GAAG,EACH,QAAQ,GAKT;IACC,OAAO,CACL,KAAC,oBAAoB,CAAC,QAAQ,IAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,YACpD,QAAQ,GACqB,CACjC,CAAC;AACJ,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,gBAAgB;IAC9B,MAAM,KAAK,GAAG,UAAU,CAAC,oBAAoB,CAAC,CAAC;IAC/C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACb,iEAAiE,CAClE,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,wBAAwB;IACtC,OAAO,UAAU,CAAC,oBAAoB,CAAC,CAAC;AAC1C,CAAC","sourcesContent":["import { createContext, useContext, type ReactNode } from \"react\";\nimport type { BlockRegistry } from \"./registry.js\";\nimport type { BlockRenderContext } from \"./types.js\";\n\n/**\n * React provision for the block registry. The registry itself is a per-app\n * module singleton (so the server MDX serializer/parser and the agent schema\n * export can import it outside React); this thin context threads that singleton\n * plus the runtime {@link BlockRenderContext} (asset resolver, action caller,\n * inline markdown editor, …) into the renderer, and lets tests swap registries.\n */\n\ninterface BlockRegistryValue {\n registry: BlockRegistry;\n ctx: BlockRenderContext;\n}\n\nconst BlockRegistryContext = createContext<BlockRegistryValue | null>(null);\n\nexport function BlockRegistryProvider({\n registry,\n ctx,\n children,\n}: {\n registry: BlockRegistry;\n ctx: BlockRenderContext;\n children: ReactNode;\n}) {\n return (\n <BlockRegistryContext.Provider value={{ registry, ctx }}>\n {children}\n </BlockRegistryContext.Provider>\n );\n}\n\n/** Read the active registry + render context. Throws outside a provider. */\nexport function useBlockRegistry(): BlockRegistryValue {\n const value = useContext(BlockRegistryContext);\n if (!value) {\n throw new Error(\n \"useBlockRegistry must be used inside a <BlockRegistryProvider>.\",\n );\n }\n return value;\n}\n\n/** Read the active registry + render context, or `null` outside a provider. */\nexport function useOptionalBlockRegistry(): BlockRegistryValue | null {\n return useContext(BlockRegistryContext);\n}\n"]}
@@ -0,0 +1,32 @@
1
+ import type { BlockSpec, BlockPlacement } from "./types.js";
2
+ /**
3
+ * In-memory block registry. Holds two lookups: by runtime `type` (render +
4
+ * serialize side) and by MDX `tag` (parse side). The registry is a plain object
5
+ * usable both inside React (via the context provider) and outside it (the
6
+ * server MDX serializer/parser, agent schema export) — mirroring how the legacy
7
+ * `BLOCK_COMPONENTS` set and `serializeBlock`/`parseBlock` are plain functions.
8
+ */
9
+ export declare class BlockRegistry {
10
+ private byType;
11
+ private byTag;
12
+ register(spec: BlockSpec<any>): void;
13
+ get(type: string): BlockSpec<any> | undefined;
14
+ getByTag(tag: string): BlockSpec<any> | undefined;
15
+ has(type: string): boolean;
16
+ hasTag(tag: string): boolean;
17
+ /** All registered MDX tags — replaces the hardcoded `BLOCK_COMPONENTS` set. */
18
+ tags(): Set<string>;
19
+ /**
20
+ * The set of registered block `type`s whose specs declare
21
+ * `notionCompatible: true` — i.e. they round-trip to Notion-Flavored Markdown
22
+ * and may sync to Notion. Apps use this as the registry-backed part of their
23
+ * Notion gating allowlist; prose-only NFM analogs that are not registry atoms
24
+ * (rich-text, callout) are NOT in here — apps union those in separately.
25
+ */
26
+ notionCompatibleTypes(): Set<string>;
27
+ /** All registered specs, optionally filtered by placement. */
28
+ list(placement?: BlockPlacement): BlockSpec<any>[];
29
+ }
30
+ /** Register a batch of specs in order. */
31
+ export declare function registerBlocks(registry: BlockRegistry, specs: BlockSpec<any>[]): void;
32
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/client/blocks/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5D;;;;;;GAMG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAqC;IACnD,OAAO,CAAC,KAAK,CAAqC;IAElD,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI;IAWpC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,SAAS;IAI7C,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,SAAS;IAIjD,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI5B,+EAA+E;IAC/E,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC;IAInB;;;;;;OAMG;IACH,qBAAqB,IAAI,GAAG,CAAC,MAAM,CAAC;IAQpC,8DAA8D;IAC9D,IAAI,CAAC,SAAS,CAAC,EAAE,cAAc,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE;CAMnD;AAED,0CAA0C;AAC1C,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,aAAa,EACvB,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,GACtB,IAAI,CAEN"}