makersclaw 0.8.0 → 0.8.1

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 (401) hide show
  1. package/README.md +9 -3
  2. package/package.json +1 -1
  3. package/r/activity-log.json +52 -0
  4. package/r/agent-changes.json +51 -0
  5. package/r/agent-chat.json +53 -0
  6. package/r/agent-column.json +85 -0
  7. package/r/agent-dock.json +57 -0
  8. package/r/agent-kit.json +49 -0
  9. package/r/agent-marks.json +49 -0
  10. package/r/agent-pane.json +93 -0
  11. package/r/ai-action.json +56 -0
  12. package/r/annotate.json +3 -3
  13. package/r/approval-request.json +2 -2
  14. package/r/approval.json +54 -0
  15. package/r/ask-bar.json +50 -0
  16. package/r/audio-player.json +2 -2
  17. package/r/auth-form.json +2 -2
  18. package/r/automation-editor.json +66 -0
  19. package/r/automation-list.json +57 -0
  20. package/r/automation-model.json +118 -0
  21. package/r/automations-screen.json +71 -0
  22. package/r/board.json +2 -2
  23. package/r/calendar-view.json +3 -3
  24. package/r/cart.json +2 -2
  25. package/r/chart.json +2 -2
  26. package/r/chat-pane.json +84 -0
  27. package/r/chat.json +2 -2
  28. package/r/code-editor.json +2 -2
  29. package/r/comment-box.json +3 -3
  30. package/r/connect-card.json +51 -0
  31. package/r/contact-section.json +2 -2
  32. package/r/core.json +13 -7
  33. package/r/cost.json +51 -0
  34. package/r/csv-import.json +3 -3
  35. package/r/data-picker.json +60 -0
  36. package/r/data-table.json +2 -2
  37. package/r/diagram.json +2 -2
  38. package/r/doc-editor.json +2 -2
  39. package/r/doc-page.json +3 -3
  40. package/r/email-render.json +2 -2
  41. package/r/faq.json +2 -2
  42. package/r/file-upload.json +2 -2
  43. package/r/first-run.json +63 -0
  44. package/r/fix-note.json +57 -0
  45. package/r/flow-canvas.json +2 -2
  46. package/r/flow-editor.json +79 -0
  47. package/r/footer.json +2 -2
  48. package/r/gantt.json +3 -3
  49. package/r/job-panel.json +2 -2
  50. package/r/json-editor.json +3 -3
  51. package/r/library-shelf.json +56 -0
  52. package/r/map.json +2 -2
  53. package/r/margin-notes.json +67 -0
  54. package/r/menubar.json +2 -2
  55. package/r/mind-map.json +3 -3
  56. package/r/navigation-menu.json +2 -2
  57. package/r/needs-you.json +55 -0
  58. package/r/order-detail.json +2 -2
  59. package/r/org-chart.json +3 -3
  60. package/r/pace-bar.json +69 -0
  61. package/r/page-builder.json +2 -2
  62. package/r/payment-methods.json +2 -2
  63. package/r/pdf-document.json +2 -2
  64. package/r/pdf-viewer.json +2 -2
  65. package/r/product-detail.json +2 -2
  66. package/r/product-grid.json +3 -3
  67. package/r/record-form.json +2 -2
  68. package/r/record-grid.json +52 -0
  69. package/r/record-notes.json +4 -4
  70. package/r/registry.json +4086 -1512
  71. package/r/run-history.json +52 -0
  72. package/r/run-view.json +80 -0
  73. package/r/schedule-card.json +54 -0
  74. package/r/schedule-engine.json +79 -0
  75. package/r/schedule-gantt.json +83 -0
  76. package/r/schedule-ruler.json +64 -0
  77. package/r/search-dialog.json +2 -2
  78. package/r/settings-list.json +2 -2
  79. package/r/setup-checklist.json +2 -2
  80. package/r/share-dialog.json +2 -2
  81. package/r/sidebar.json +2 -2
  82. package/r/signature-pad.json +2 -2
  83. package/r/sketch-canvas.json +2 -2
  84. package/r/source-receipt.json +52 -0
  85. package/r/spreadsheet.json +3 -3
  86. package/r/stat-cards.json +3 -3
  87. package/r/step-picker.json +53 -0
  88. package/r/step-settings.json +72 -0
  89. package/r/suggestion.json +58 -0
  90. package/r/sum-bar.json +64 -0
  91. package/r/task-list.json +3 -3
  92. package/r/task-model.json +2 -2
  93. package/r/testimonials.json +2 -2
  94. package/r/tier-map.json +67 -0
  95. package/r/time-grid.json +73 -0
  96. package/r/time-strip.json +64 -0
  97. package/r/top-bar.json +66 -0
  98. package/r/transaction-list.json +2 -2
  99. package/r/trigger-picker.json +61 -0
  100. package/r/whiteboard.json +3 -3
  101. package/r/workflow-view.json +55 -0
  102. package/registry/blocks/activity-log/README.md +112 -0
  103. package/registry/blocks/activity-log/activity-log.jsx +351 -0
  104. package/registry/blocks/activity-log/block.json +33 -0
  105. package/registry/blocks/activity-log/demo.jsx +48 -0
  106. package/registry/blocks/activity-log/index.js +4 -0
  107. package/registry/blocks/agent-changes/README.md +94 -0
  108. package/registry/blocks/agent-changes/agent-changes.jsx +118 -0
  109. package/registry/blocks/agent-changes/block.json +28 -0
  110. package/registry/blocks/agent-changes/demo.jsx +39 -0
  111. package/registry/blocks/agent-changes/index.js +3 -0
  112. package/registry/blocks/agent-chat/README.md +145 -0
  113. package/registry/blocks/agent-chat/agent-chat.jsx +415 -0
  114. package/registry/blocks/agent-chat/block.json +30 -0
  115. package/registry/blocks/agent-chat/demo.jsx +165 -0
  116. package/registry/blocks/agent-chat/index.js +3 -0
  117. package/registry/blocks/agent-column/README.md +197 -0
  118. package/registry/blocks/agent-column/agent-column.jsx +492 -0
  119. package/registry/blocks/agent-column/block.json +67 -0
  120. package/registry/blocks/agent-column/column-picker.jsx +163 -0
  121. package/registry/blocks/agent-column/demo.jsx +50 -0
  122. package/registry/blocks/agent-column/index.js +7 -0
  123. package/registry/blocks/agent-column/model.js +164 -0
  124. package/registry/blocks/agent-column/receipt.jsx +483 -0
  125. package/registry/blocks/agent-column/spreadsheet-type.jsx +24 -0
  126. package/registry/blocks/agent-dock/README.md +210 -0
  127. package/registry/blocks/agent-dock/agent-dock.jsx +356 -0
  128. package/registry/blocks/agent-dock/block.json +47 -0
  129. package/registry/blocks/agent-dock/demo.jsx +153 -0
  130. package/registry/blocks/agent-dock/dock-model.js +118 -0
  131. package/registry/blocks/agent-dock/index.js +5 -0
  132. package/registry/blocks/agent-kit/README.md +73 -0
  133. package/registry/blocks/agent-kit/agent-kit.jsx +86 -0
  134. package/registry/blocks/agent-kit/block.json +10 -0
  135. package/registry/blocks/agent-kit/demo.jsx +35 -0
  136. package/registry/blocks/agent-kit/index.js +3 -0
  137. package/registry/blocks/agent-marks/README.md +80 -0
  138. package/registry/blocks/agent-marks/agent-marks.jsx +133 -0
  139. package/registry/blocks/agent-marks/block.json +27 -0
  140. package/registry/blocks/agent-marks/demo.jsx +49 -0
  141. package/registry/blocks/agent-marks/index.js +3 -0
  142. package/registry/blocks/agent-pane/README.md +225 -0
  143. package/registry/blocks/agent-pane/agent-pane.jsx +244 -0
  144. package/registry/blocks/agent-pane/block.json +41 -0
  145. package/registry/blocks/agent-pane/composer.jsx +6 -0
  146. package/registry/blocks/agent-pane/demo.jsx +233 -0
  147. package/registry/blocks/agent-pane/dock-context.js +10 -0
  148. package/registry/blocks/agent-pane/index.js +4 -0
  149. package/registry/blocks/agent-pane/prose.jsx +84 -0
  150. package/registry/blocks/agent-pane/questions.jsx +134 -0
  151. package/registry/blocks/agent-pane/transcript.jsx +268 -0
  152. package/registry/blocks/agent-pane/work.jsx +368 -0
  153. package/registry/blocks/ai-action/README.md +94 -0
  154. package/registry/blocks/ai-action/ai-action.jsx +188 -0
  155. package/registry/blocks/ai-action/block.json +34 -0
  156. package/registry/blocks/ai-action/demo.jsx +93 -0
  157. package/registry/blocks/ai-action/index.js +3 -0
  158. package/registry/blocks/approval/README.md +145 -0
  159. package/registry/blocks/approval/approval.jsx +163 -0
  160. package/registry/blocks/approval/block.json +31 -0
  161. package/registry/blocks/approval/demo.jsx +121 -0
  162. package/registry/blocks/approval/index.js +3 -0
  163. package/registry/blocks/ask-bar/README.md +105 -0
  164. package/registry/blocks/ask-bar/ask-bar.jsx +166 -0
  165. package/registry/blocks/ask-bar/block.json +26 -0
  166. package/registry/blocks/ask-bar/demo.jsx +78 -0
  167. package/registry/blocks/ask-bar/index.js +3 -0
  168. package/registry/blocks/automation-editor/README.md +291 -0
  169. package/registry/blocks/automation-editor/automation-editor.jsx +656 -0
  170. package/registry/blocks/automation-editor/block.json +39 -0
  171. package/registry/blocks/automation-editor/demo.jsx +284 -0
  172. package/registry/blocks/automation-editor/index.js +4 -0
  173. package/registry/blocks/automation-editor/run-inputs.jsx +82 -0
  174. package/registry/blocks/automation-list/README.md +129 -0
  175. package/registry/blocks/automation-list/automation-list.jsx +476 -0
  176. package/registry/blocks/automation-list/block.json +35 -0
  177. package/registry/blocks/automation-list/demo.jsx +67 -0
  178. package/registry/blocks/automation-list/index.js +3 -0
  179. package/registry/blocks/automation-model/README.md +109 -0
  180. package/registry/blocks/automation-model/block.json +135 -0
  181. package/registry/blocks/automation-model/catalog.js +256 -0
  182. package/registry/blocks/automation-model/check.js +161 -0
  183. package/registry/blocks/automation-model/demo.jsx +42 -0
  184. package/registry/blocks/automation-model/edit.js +262 -0
  185. package/registry/blocks/automation-model/fixes.js +287 -0
  186. package/registry/blocks/automation-model/glyph.jsx +13 -0
  187. package/registry/blocks/automation-model/graph.js +410 -0
  188. package/registry/blocks/automation-model/index.js +33 -0
  189. package/registry/blocks/automation-model/overlay.js +175 -0
  190. package/registry/blocks/automation-model/parts.jsx +94 -0
  191. package/registry/blocks/automation-model/schedule.js +53 -0
  192. package/registry/blocks/automation-model/templates.js +128 -0
  193. package/registry/blocks/automation-model/values.js +29 -0
  194. package/registry/blocks/automation-model/words.js +439 -0
  195. package/registry/blocks/automations-screen/README.md +207 -0
  196. package/registry/blocks/automations-screen/automations-screen.jsx +452 -0
  197. package/registry/blocks/automations-screen/block.json +47 -0
  198. package/registry/blocks/automations-screen/demo.jsx +364 -0
  199. package/registry/blocks/automations-screen/index.js +4 -0
  200. package/registry/blocks/automations-screen/screen-model.js +129 -0
  201. package/registry/blocks/chat-pane/README.md +143 -0
  202. package/registry/blocks/chat-pane/block.json +48 -0
  203. package/registry/blocks/chat-pane/chat-attach.js +166 -0
  204. package/registry/blocks/chat-pane/chat-composer.jsx +195 -0
  205. package/registry/blocks/chat-pane/chat-context.js +17 -0
  206. package/registry/blocks/chat-pane/chat-model.js +43 -0
  207. package/registry/blocks/chat-pane/chat-pane.jsx +398 -0
  208. package/registry/blocks/chat-pane/chats-list.jsx +52 -0
  209. package/registry/blocks/chat-pane/demo.jsx +103 -0
  210. package/registry/blocks/chat-pane/index.js +9 -0
  211. package/registry/blocks/connect-card/README.md +99 -0
  212. package/registry/blocks/connect-card/block.json +10 -0
  213. package/registry/blocks/connect-card/connect-card.jsx +103 -0
  214. package/registry/blocks/connect-card/demo.jsx +49 -0
  215. package/registry/blocks/connect-card/index.js +3 -0
  216. package/registry/blocks/cost/README.md +115 -0
  217. package/registry/blocks/cost/block.json +10 -0
  218. package/registry/blocks/cost/cost.jsx +176 -0
  219. package/registry/blocks/cost/demo.jsx +66 -0
  220. package/registry/blocks/cost/index.js +3 -0
  221. package/registry/blocks/data-picker/README.md +81 -0
  222. package/registry/blocks/data-picker/block.json +38 -0
  223. package/registry/blocks/data-picker/data-picker.jsx +210 -0
  224. package/registry/blocks/data-picker/demo.jsx +34 -0
  225. package/registry/blocks/data-picker/fields.js +89 -0
  226. package/registry/blocks/data-picker/index.js +4 -0
  227. package/registry/blocks/data-table/demo.jsx +1 -1
  228. package/registry/blocks/first-run/README.md +118 -0
  229. package/registry/blocks/first-run/block.json +11 -0
  230. package/registry/blocks/first-run/demo.jsx +88 -0
  231. package/registry/blocks/first-run/first-run-model.js +51 -0
  232. package/registry/blocks/first-run/first-run.jsx +156 -0
  233. package/registry/blocks/first-run/index.js +5 -0
  234. package/registry/blocks/first-run/probe-rules.js +26 -0
  235. package/registry/blocks/fix-note/README.md +79 -0
  236. package/registry/blocks/fix-note/block.json +35 -0
  237. package/registry/blocks/fix-note/demo.jsx +30 -0
  238. package/registry/blocks/fix-note/fix-note.jsx +235 -0
  239. package/registry/blocks/fix-note/index.js +3 -0
  240. package/registry/blocks/flow-editor/README.md +108 -0
  241. package/registry/blocks/flow-editor/block.json +44 -0
  242. package/registry/blocks/flow-editor/demo.jsx +115 -0
  243. package/registry/blocks/flow-editor/flow-canvas.jsx +568 -0
  244. package/registry/blocks/flow-editor/flow-editor.jsx +154 -0
  245. package/registry/blocks/flow-editor/index.js +6 -0
  246. package/registry/blocks/flow-editor/minimap.jsx +78 -0
  247. package/registry/blocks/flow-editor/outline.jsx +134 -0
  248. package/registry/blocks/library-shelf/README.md +117 -0
  249. package/registry/blocks/library-shelf/block.json +28 -0
  250. package/registry/blocks/library-shelf/demo.jsx +68 -0
  251. package/registry/blocks/library-shelf/index.js +3 -0
  252. package/registry/blocks/library-shelf/library-shelf.jsx +211 -0
  253. package/registry/blocks/library-shelf/probe-rules.js +15 -0
  254. package/registry/blocks/margin-notes/README.md +222 -0
  255. package/registry/blocks/margin-notes/block.json +10 -0
  256. package/registry/blocks/margin-notes/demo.jsx +144 -0
  257. package/registry/blocks/margin-notes/index.js +20 -0
  258. package/registry/blocks/margin-notes/margin-model.js +224 -0
  259. package/registry/blocks/margin-notes/margin-notes.jsx +465 -0
  260. package/registry/blocks/needs-you/README.md +177 -0
  261. package/registry/blocks/needs-you/block.json +34 -0
  262. package/registry/blocks/needs-you/demo.jsx +143 -0
  263. package/registry/blocks/needs-you/index.js +3 -0
  264. package/registry/blocks/needs-you/needs-you.jsx +441 -0
  265. package/registry/blocks/pace-bar/README.md +230 -0
  266. package/registry/blocks/pace-bar/block.json +10 -0
  267. package/registry/blocks/pace-bar/demo.jsx +255 -0
  268. package/registry/blocks/pace-bar/index.js +22 -0
  269. package/registry/blocks/pace-bar/pace-bar.jsx +461 -0
  270. package/registry/blocks/pace-bar/pace-model.js +288 -0
  271. package/registry/blocks/record-grid/README.md +100 -0
  272. package/registry/blocks/record-grid/block.json +28 -0
  273. package/registry/blocks/record-grid/demo.jsx +43 -0
  274. package/registry/blocks/record-grid/index.js +3 -0
  275. package/registry/blocks/record-grid/record-grid.jsx +251 -0
  276. package/registry/blocks/run-history/README.md +138 -0
  277. package/registry/blocks/run-history/block.json +10 -0
  278. package/registry/blocks/run-history/demo.jsx +74 -0
  279. package/registry/blocks/run-history/index.js +3 -0
  280. package/registry/blocks/run-history/run-history.jsx +218 -0
  281. package/registry/blocks/run-view/README.md +174 -0
  282. package/registry/blocks/run-view/block.json +50 -0
  283. package/registry/blocks/run-view/demo.jsx +286 -0
  284. package/registry/blocks/run-view/index.js +5 -0
  285. package/registry/blocks/run-view/run-controls.jsx +266 -0
  286. package/registry/blocks/run-view/run-view.jsx +236 -0
  287. package/registry/blocks/run-view/runs-list.jsx +99 -0
  288. package/registry/blocks/schedule-card/README.md +121 -0
  289. package/registry/blocks/schedule-card/block.json +10 -0
  290. package/registry/blocks/schedule-card/demo.jsx +82 -0
  291. package/registry/blocks/schedule-card/index.js +3 -0
  292. package/registry/blocks/schedule-card/schedule-card.jsx +136 -0
  293. package/registry/blocks/schedule-engine/README.md +137 -0
  294. package/registry/blocks/schedule-engine/block.json +10 -0
  295. package/registry/blocks/schedule-engine/demo.jsx +82 -0
  296. package/registry/blocks/schedule-engine/engine.js +769 -0
  297. package/registry/blocks/schedule-engine/index.js +9 -0
  298. package/registry/blocks/schedule-engine/ops.js +71 -0
  299. package/registry/blocks/schedule-engine/place.js +294 -0
  300. package/registry/blocks/schedule-engine/tree.js +79 -0
  301. package/registry/blocks/schedule-engine/waits.js +80 -0
  302. package/registry/blocks/schedule-gantt/README.md +159 -0
  303. package/registry/blocks/schedule-gantt/block.json +10 -0
  304. package/registry/blocks/schedule-gantt/demo.jsx +223 -0
  305. package/registry/blocks/schedule-gantt/gantt-model.js +219 -0
  306. package/registry/blocks/schedule-gantt/geometry.js +176 -0
  307. package/registry/blocks/schedule-gantt/index.js +26 -0
  308. package/registry/blocks/schedule-gantt/schedule-gantt.jsx +882 -0
  309. package/registry/blocks/schedule-gantt/sheet.jsx +372 -0
  310. package/registry/blocks/schedule-gantt/track.jsx +190 -0
  311. package/registry/blocks/schedule-ruler/README.md +148 -0
  312. package/registry/blocks/schedule-ruler/block.json +10 -0
  313. package/registry/blocks/schedule-ruler/demo.jsx +181 -0
  314. package/registry/blocks/schedule-ruler/index.js +21 -0
  315. package/registry/blocks/schedule-ruler/ruler-model.js +239 -0
  316. package/registry/blocks/schedule-ruler/schedule-ruler.jsx +548 -0
  317. package/registry/blocks/source-receipt/README.md +97 -0
  318. package/registry/blocks/source-receipt/block.json +30 -0
  319. package/registry/blocks/source-receipt/demo.jsx +71 -0
  320. package/registry/blocks/source-receipt/index.js +3 -0
  321. package/registry/blocks/source-receipt/source-receipt.jsx +107 -0
  322. package/registry/blocks/spreadsheet/spreadsheet.jsx +15 -1
  323. package/registry/blocks/step-picker/README.md +78 -0
  324. package/registry/blocks/step-picker/block.json +31 -0
  325. package/registry/blocks/step-picker/demo.jsx +23 -0
  326. package/registry/blocks/step-picker/index.js +3 -0
  327. package/registry/blocks/step-picker/step-picker.jsx +144 -0
  328. package/registry/blocks/step-settings/README.md +100 -0
  329. package/registry/blocks/step-settings/block.json +44 -0
  330. package/registry/blocks/step-settings/demo.jsx +93 -0
  331. package/registry/blocks/step-settings/fields.jsx +58 -0
  332. package/registry/blocks/step-settings/flow-settings.jsx +115 -0
  333. package/registry/blocks/step-settings/index.js +5 -0
  334. package/registry/blocks/step-settings/step-settings.jsx +290 -0
  335. package/registry/blocks/suggestion/README.md +171 -0
  336. package/registry/blocks/suggestion/block.json +40 -0
  337. package/registry/blocks/suggestion/demo.jsx +91 -0
  338. package/registry/blocks/suggestion/index.js +3 -0
  339. package/registry/blocks/suggestion/suggestion.jsx +436 -0
  340. package/registry/blocks/sum-bar/README.md +122 -0
  341. package/registry/blocks/sum-bar/block.json +10 -0
  342. package/registry/blocks/sum-bar/demo.jsx +110 -0
  343. package/registry/blocks/sum-bar/index.js +5 -0
  344. package/registry/blocks/sum-bar/sum-bar.jsx +209 -0
  345. package/registry/blocks/sum-bar/sum-model.js +126 -0
  346. package/registry/blocks/tier-map/README.md +217 -0
  347. package/registry/blocks/tier-map/block.json +10 -0
  348. package/registry/blocks/tier-map/demo.jsx +222 -0
  349. package/registry/blocks/tier-map/index.js +24 -0
  350. package/registry/blocks/tier-map/tier-map.jsx +574 -0
  351. package/registry/blocks/tier-map/tier-model.js +318 -0
  352. package/registry/blocks/time-grid/README.md +305 -0
  353. package/registry/blocks/time-grid/block.json +10 -0
  354. package/registry/blocks/time-grid/demo.jsx +279 -0
  355. package/registry/blocks/time-grid/grid-model.js +322 -0
  356. package/registry/blocks/time-grid/index.js +25 -0
  357. package/registry/blocks/time-grid/time-grid.jsx +1325 -0
  358. package/registry/blocks/time-strip/README.md +141 -0
  359. package/registry/blocks/time-strip/block.json +10 -0
  360. package/registry/blocks/time-strip/demo.jsx +129 -0
  361. package/registry/blocks/time-strip/index.js +19 -0
  362. package/registry/blocks/time-strip/strip-model.js +178 -0
  363. package/registry/blocks/time-strip/time-strip.jsx +260 -0
  364. package/registry/blocks/top-bar/README.md +149 -0
  365. package/registry/blocks/top-bar/block.json +35 -0
  366. package/registry/blocks/top-bar/demo.jsx +78 -0
  367. package/registry/blocks/top-bar/index.js +5 -0
  368. package/registry/blocks/top-bar/probe-rules.js +74 -0
  369. package/registry/blocks/top-bar/top-bar-model.js +152 -0
  370. package/registry/blocks/top-bar/top-bar.jsx +244 -0
  371. package/registry/blocks/trigger-picker/README.md +98 -0
  372. package/registry/blocks/trigger-picker/block.json +38 -0
  373. package/registry/blocks/trigger-picker/demo.jsx +59 -0
  374. package/registry/blocks/trigger-picker/index.js +3 -0
  375. package/registry/blocks/trigger-picker/trigger-picker.jsx +374 -0
  376. package/registry/blocks/workflow-view/README.md +123 -0
  377. package/registry/blocks/workflow-view/block.json +10 -0
  378. package/registry/blocks/workflow-view/demo.jsx +90 -0
  379. package/registry/blocks/workflow-view/index.js +3 -0
  380. package/registry/blocks/workflow-view/workflow-view.jsx +203 -0
  381. package/src/install.mjs +77 -16
  382. package/src/registry.mjs +3 -0
  383. package/templates/next/browser/lib/data.js +6 -1
  384. package/templates/next/files/README.md +627 -24
  385. package/templates/next/files/check/automation-format.ts +2103 -0
  386. package/templates/next/files/check/automation-package.ts +142 -0
  387. package/templates/next/files/check/run.mjs +968 -9
  388. package/templates/next/files/components/ui/field.jsx +17 -4
  389. package/templates/next/files/components/ui/icon.jsx +13 -0
  390. package/templates/next/files/components/ui/index.js +2 -1
  391. package/templates/next/files/components/ui/layout.jsx +77 -2
  392. package/templates/next/files/components/ui/notice.jsx +70 -0
  393. package/templates/next/files/components/ui/page.jsx +124 -0
  394. package/templates/next/files/components/ui/stat.jsx +22 -7
  395. package/templates/next/files/components/ui/toast.jsx +6 -3
  396. package/templates/next/files/lib/automations.js +660 -0
  397. package/templates/next/files/lib/claw.js +241 -5
  398. package/templates/next/files/lib/door.js +92 -0
  399. package/templates/next/files/lib/hooks.js +1627 -8
  400. package/templates/next/files/lib/platform.js +529 -21
  401. package/templates/next/template.json +13 -3
@@ -0,0 +1,71 @@
1
+ "use client";
2
+
3
+ // SourceReceipt for a page, a mail, two sources to pick from, and a
4
+ // source with nothing to underline — the gallery's and the smoke test's
5
+ // surface. Not installed into apps.
6
+ import { useState } from "react";
7
+ import { Button } from "../components/ui";
8
+ import { SourceReceipt } from "../components/blocks/source-receipt";
9
+
10
+ export default function SourceReceiptDemo() {
11
+ const [picked, setPicked] = useState(null);
12
+ const pick = (which, words) =>
13
+ picked === which ? (
14
+ <Button size="sm" variant="primary" disabled>
15
+ Picked
16
+ </Button>
17
+ ) : (
18
+ <Button size="sm" onClick={() => setPicked(which)}>
19
+ {words}
20
+ </Button>
21
+ );
22
+ return (
23
+ <div className="grid gap-6 p-6 [grid-template-columns:repeat(auto-fit,minmax(min(100%,20rem),1fr))]">
24
+ <SourceReceipt
25
+ title="Careers · Klarwerk"
26
+ url="https://www.klarwerk.de/careers"
27
+ date="read 22 Sep"
28
+ trust="their own site, five months old"
29
+ sure="likely"
30
+ excerpt="We're a team of 70 across Berlin and Leipzig. Our team of 70 ships payroll software for 2,000 shops."
31
+ marks={["team of 70"]}
32
+ />
33
+ <SourceReceipt
34
+ kind="mail"
35
+ title="Re: scheduling for all the shops"
36
+ site="Sofia Reyes <sofia@crumb.co>"
37
+ date="Sat 12 Sep"
38
+ trust="her email signature"
39
+ sure="sure"
40
+ excerpt="Sofia Reyes — Head of Retail Operations, Crumb & Co. +1 612 555 0142"
41
+ marks={["head of retail operations"]}
42
+ onOpen={() => undefined}
43
+ openLabel="Open the mail"
44
+ />
45
+ <SourceReceipt
46
+ title="Klarwerk on LinkedIn"
47
+ url="linkedin.com/company/klarwerk"
48
+ date="read 22 Sep"
49
+ trust="a profile the company keeps"
50
+ sure="likely"
51
+ excerpt="[[51–200 employees]] · [[85]] members"
52
+ action={pick("one", "Pick 85")}
53
+ picked={picked === "one"}
54
+ />
55
+ <SourceReceipt
56
+ title="A 2023 directory"
57
+ url="https://directory.example.org/companies/klarwerk-gmbh-berlin-leipzig-payroll-software-2023"
58
+ date="read 22 Sep"
59
+ trust="a 2023 directory"
60
+ sure="guess"
61
+ excerpt="Klarwerk GmbH, payroll software, Berlin. About 60 staff."
62
+ marks={["about 60", "nothing that appears"]}
63
+ action={pick("other", "Pick 60")}
64
+ picked={picked === "other"}
65
+ />
66
+ <div className="w-80 max-w-full">
67
+ <SourceReceipt title="A source with no words kept" url="nordlicht.io/team" date="read 21 Sep" />
68
+ </div>
69
+ </div>
70
+ );
71
+ }
@@ -0,0 +1,3 @@
1
+ // The SourceReceipt block — `makersclaw add source-receipt`. Fixed:
2
+ // compose it through its props (README.md beside this file).
3
+ export { SourceReceipt, markExcerpt } from "./source-receipt";
@@ -0,0 +1,107 @@
1
+ "use client";
2
+
3
+ import { Button, Icon, cx } from "../../ui";
4
+ import { Clipping } from "../agent-column";
5
+
6
+ // SourceReceipt — where one value came from, as a clipping (the app kit,
7
+ // D15): the page or the mail, its date, a trust word ("their own site",
8
+ // "a 2023 directory"), the words on it with the deciding ones underlined,
9
+ // and Open the source. For a value that is not in an agent column: a
10
+ // CRM's found title, a note's proof margin, a newsletter's source line.
11
+ //
12
+ // It is NOT a second receipt. The clipping is agent-column's (Data
13
+ // Enrichment's "the receipt"); this wraps it for one source standing on
14
+ // its own, so both draw the same thing. No door: the source is app data
15
+ // the agent wrote. Props in, callbacks out.
16
+
17
+ /** Wrap every occurrence of each mark in [[…]] (the clipping's mark for
18
+ * deciding words), case-insensitive, longest first so no mark lands
19
+ * inside another. With no marks, the excerpt's own [[…]] (the agent's)
20
+ * stand; with marks, they replace them. Plain strings only: never HTML. */
21
+ export function markExcerpt(excerpt, marks) {
22
+ const list = [...new Set((marks ?? []).map((m) => String(m ?? "").trim()).filter((m) => m && !/[[\]]/.test(m)))].sort((a, b) => b.length - a.length);
23
+ if (!list.length) return String(excerpt ?? "");
24
+ const text = String(excerpt ?? "").replace(/\[\[|\]\]/g, "");
25
+ if (!text) return text;
26
+ const re = new RegExp(list.map((m) => m.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join("|"), "gi");
27
+ return text.replace(re, (hit) => `[[${hit}]]`);
28
+ }
29
+
30
+ /** "acme.com", from a URL; null when it is not one. */
31
+ function siteOf(url) {
32
+ try {
33
+ return new URL(/^https?:/i.test(url) ? url : `https://${url}`).hostname.replace(/^www\./i, "");
34
+ } catch {
35
+ return null;
36
+ }
37
+ }
38
+
39
+ /**
40
+ * title the page's or the mail's title ("Careers · Klarwerk")
41
+ * site where: a site ("klarwerk.de") or a mailbox ("Sofia Reyes
42
+ * <sofia@crumb.co>"); from `url` when left out
43
+ * url the source's address; the clipping links it
44
+ * kind "site" (default) or "mail": the icon before the trust word
45
+ * date when it was read or sent, in words ("read 22 Sep")
46
+ * trust a word for how far to trust it ("their own site")
47
+ * sure sure · likely · guess: the trust mark's shape, beside the title
48
+ * excerpt the words on it
49
+ * marks the deciding words, underlined wherever they appear
50
+ * onOpen() opens the source; without it, with a url, the source opens
51
+ * in a new tab
52
+ * openLabel default "Open the source"
53
+ * action a node at the head's end (a "Pick" for one of two)
54
+ * picked drawn as the one chosen
55
+ */
56
+ export function SourceReceipt({
57
+ title,
58
+ site,
59
+ url,
60
+ kind = "site",
61
+ date,
62
+ trust,
63
+ sure,
64
+ excerpt,
65
+ marks = [],
66
+ onOpen,
67
+ openLabel = "Open the source",
68
+ action,
69
+ picked = false,
70
+ className,
71
+ }) {
72
+ const where = site ?? (url ? siteOf(url) : null);
73
+ // The clipping draws a url as its linked address; a mailbox or a site
74
+ // without one rides in its date line instead.
75
+ const read = [url ? null : where, date].filter(Boolean).join(" · ") || undefined;
76
+ const href = url ? (/^https?:/i.test(url) ? url : `https://${url}`) : null;
77
+ return (
78
+ <Clipping
79
+ source={{ url: url || undefined, title: title || where || undefined, evidence: excerpt ? markExcerpt(excerpt, marks) : undefined, read }}
80
+ trust={sure}
81
+ title={title || where || "A source"}
82
+ action={action}
83
+ picked={picked}
84
+ className={cx("min-w-0 text-sm", className)}
85
+ >
86
+ {trust || onOpen || href ? (
87
+ <div className="flex min-w-0 flex-wrap items-center gap-x-3 gap-y-1 text-xs">
88
+ {trust ? (
89
+ <span className="inline-flex min-w-0 items-center gap-1 text-muted-foreground">
90
+ <Icon name={kind === "mail" ? "mail" : "globe"} size={12} className="shrink-0" />
91
+ <span className="min-w-0 break-words">{trust}</span>
92
+ </span>
93
+ ) : null}
94
+ {onOpen ? (
95
+ <Button variant="link" size="inherit" onClick={onOpen} className="ml-auto">
96
+ {openLabel} <Icon name="external" size={12} />
97
+ </Button>
98
+ ) : href ? (
99
+ <Button variant="link" size="inherit" href={href} target="_blank" rel="noreferrer" className="ml-auto">
100
+ {openLabel} <Icon name="external" size={12} />
101
+ </Button>
102
+ ) : null}
103
+ </div>
104
+ ) : null}
105
+ </Clipping>
106
+ );
107
+ }
@@ -154,13 +154,22 @@ export function Spreadsheet({
154
154
  const el = rootRef.current;
155
155
  if (!el) return;
156
156
  setBoxW(el.clientWidth);
157
- const ro = new ResizeObserver(() => setBoxW(el.clientWidth));
157
+ // The new width is taken in the next frame, never inside the observer's
158
+ // own delivery: a change made there that touches anything observed
159
+ // (the virtualisers watch this grid too) makes the browser report
160
+ // "ResizeObserver loop completed with undelivered notifications".
161
+ let frame = 0;
162
+ const ro = new ResizeObserver(() => {
163
+ cancelAnimationFrame(frame);
164
+ frame = requestAnimationFrame(() => setBoxW(el.clientWidth));
165
+ });
158
166
  ro.observe(el);
159
167
  const mq = window.matchMedia?.("(pointer: coarse)");
160
168
  const onMq = () => setCoarse(Boolean(mq?.matches));
161
169
  onMq();
162
170
  mq?.addEventListener?.("change", onMq);
163
171
  return () => {
172
+ cancelAnimationFrame(frame);
164
173
  ro.disconnect();
165
174
  mq?.removeEventListener?.("change", onMq);
166
175
  };
@@ -1065,6 +1074,10 @@ export function Spreadsheet({
1065
1074
  overscan: 10,
1066
1075
  scrollMargin: headH,
1067
1076
  initialRect: { width: 1200, height: typeof height === "number" ? height : 560 },
1077
+ // The scroller's new size is read in the next frame, not inside the
1078
+ // observer's delivery (a synchronous re-render there is what the
1079
+ // browser reports as a ResizeObserver loop).
1080
+ useAnimationFrameWithResizeObserver: true,
1068
1081
  rangeExtractor: keepRow,
1069
1082
  getItemKey: (i) => viewRows[i]?.id ?? i,
1070
1083
  });
@@ -1077,6 +1090,7 @@ export function Spreadsheet({
1077
1090
  overscan: 2,
1078
1091
  scrollMargin: gutterW + frozenW,
1079
1092
  initialRect: { width: 1200, height: typeof height === "number" ? height : 560 },
1093
+ useAnimationFrameWithResizeObserver: true,
1080
1094
  rangeExtractor: keepCol,
1081
1095
  getItemKey: (i) => scrollCols[i]?.key ?? i,
1082
1096
  });
@@ -0,0 +1,78 @@
1
+ # StepPicker
2
+
3
+ The two ways to choose a step of an automation. They only say which kind a
4
+ person chose; where the step goes is the editor's call (`flow-editor` and
5
+ `automation-editor` do it for you).
6
+
7
+ - `StepPicker` — the popover a **+** on a connector opens: a search box,
8
+ then the kinds grouped Your apps · Think · Flow · Data · Tell · More,
9
+ each with one line on what it does and a tag: **free**, **paid** (it
10
+ costs credits when it runs) or **soon** (the platform does not run it
11
+ yet).
12
+ - `PaletteBar` — the strip along the bottom of a canvas: one icon per
13
+ kind, grouped, with an "AI" mark on a model call and an "A" on the agent.
14
+
15
+ ```jsx
16
+ import { StepPicker, PaletteBar } from "../components/blocks/step-picker"; // a Makersclaw app
17
+ import { StepPicker, PaletteBar } from "@/components/makersclaw/blocks/step-picker"; // a shadcn project
18
+ ```
19
+
20
+ `makersclaw add step-picker` lays `automation-model` with it, which holds
21
+ the catalog both read. Client components. Tokens only: an agent step is
22
+ drawn in the app's accent (`primary`, as the kit's AgentMark draws the agent: solid for the agent, outlined for one model call) and everything else plain.
23
+
24
+ ## Props
25
+
26
+ ### StepPicker
27
+
28
+ - `onPick(kind)` — a kind was chosen: `action` · `tool` · `llm` · `agent` ·
29
+ `condition` · `loop` · `wait` · `stop` · `set` · `brain.read` · `search` ·
30
+ `notify` · `automation`.
31
+ - `onClose()` — Escape, or a press outside it.
32
+ - `title` — the dialog's name for a screen reader (default "Add a step").
33
+ - `inline` — in the flow of a page (the outline view), not floating over a
34
+ canvas.
35
+ - `runnable` — a `Set` of the kinds the platform runs. The rest say
36
+ "soon". Default: the kinds the engine runs today.
37
+ - `style`, `className` — where the floating panel sits. Never colour.
38
+
39
+ ### PaletteBar
40
+
41
+ - `onAdd(kind)` — a kind was pressed.
42
+ - `className`.
43
+
44
+ ## Never
45
+
46
+ - Never offer a kind the platform cannot run without saying "soon": the
47
+ save would refuse it later.
48
+ - Never a price in the picker beyond free or paid: a step's price comes
49
+ from the automation's estimate, on its card.
50
+
51
+ ## Example
52
+
53
+ ```jsx
54
+ "use client";
55
+ import { useState } from "react";
56
+ import { StepPicker } from "../components/blocks/step-picker";
57
+ import { Button } from "../components/ui";
58
+
59
+ export default function AddStep({ onAdd }) {
60
+ const [open, setOpen] = useState(false);
61
+ return (
62
+ <div className="relative">
63
+ <Button variant="secondary" icon="plus" onClick={() => setOpen(true)}>
64
+ Add a step
65
+ </Button>
66
+ {open ? (
67
+ <StepPicker
68
+ onClose={() => setOpen(false)}
69
+ onPick={(kind) => {
70
+ setOpen(false);
71
+ onAdd(kind);
72
+ }}
73
+ />
74
+ ) : null}
75
+ </div>
76
+ );
77
+ }
78
+ ```
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "step-picker",
3
+ "title": "StepPicker",
4
+ "description": "The two ways to choose a step of an automation: StepPicker, the popover a + on a connector opens (a search box, the kinds grouped Your apps / Think / Flow / Data / Tell, one line on what each does and whether it is free, paid or coming), and PaletteBar, the strip along the bottom of a canvas (one icon per kind). Both only say which kind a person chose; where it goes is the editor's call.",
5
+ "useWhen": "A screen lets a person add a step to an automation: from a + on the canvas or the outline (flow-editor does it for you), or from a button of your own. Not a general command palette (use Command).",
6
+ "tags": [
7
+ "automation",
8
+ "workflow",
9
+ "step",
10
+ "picker",
11
+ "palette",
12
+ "add",
13
+ "node",
14
+ "search",
15
+ "kinds",
16
+ "trigger",
17
+ "n8n",
18
+ "make"
19
+ ],
20
+ "exports": [
21
+ "PaletteBar",
22
+ "StepPicker"
23
+ ],
24
+ "files": [
25
+ "index.js",
26
+ "step-picker.jsx"
27
+ ],
28
+ "requires": [
29
+ "automation-model"
30
+ ]
31
+ }
@@ -0,0 +1,23 @@
1
+ "use client";
2
+
3
+ // StepPicker and PaletteBar — the gallery's and the smoke test's surface.
4
+ // Not installed into apps. Press a kind: the page says which.
5
+ import { useState } from "react";
6
+ import { PaletteBar, StepPicker } from "../components/blocks/step-picker";
7
+
8
+ export default function StepPickerDemo() {
9
+ const [said, setSaid] = useState("Nothing chosen yet.");
10
+ return (
11
+ <div className="grid gap-6 p-4">
12
+ <p className="m-0 text-sm" role="status">
13
+ {said}
14
+ </p>
15
+ <div className="max-w-sm">
16
+ <StepPicker inline onClose={() => setSaid("Closed.")} onPick={(kind) => setSaid(`Chose ${kind}.`)} />
17
+ </div>
18
+ <div className="max-w-full">
19
+ <PaletteBar onAdd={(kind) => setSaid(`Added ${kind}.`)} />
20
+ </div>
21
+ </div>
22
+ );
23
+ }
@@ -0,0 +1,3 @@
1
+ // The StepPicker block — `makersclaw add step-picker`. Fixed: compose it
2
+ // through its props (README.md beside this file).
3
+ export { PaletteBar, StepPicker } from "./step-picker";
@@ -0,0 +1,144 @@
1
+ "use client";
2
+
3
+ // Two ways to choose a step: the picker a + on a connector opens (search,
4
+ // the kinds grouped, what each does), and the palette along the bottom of
5
+ // a canvas (one icon per kind, grouped). Both read the catalog
6
+ // (automation-model); both only say which kind a person chose. Where it
7
+ // goes is the editor's call. Props in, callbacks out; tokens only.
8
+
9
+ import { useEffect, useMemo, useRef, useState } from "react";
10
+ import { Input, cx } from "../../ui";
11
+ import { Glyph, KINDS, isRunnable, paletteGroups } from "../automation-model";
12
+
13
+ const matches = (k, q) => {
14
+ if (!q) return true;
15
+ const hay = `${k.name} ${k.blurb} ${k.kind}`.toLowerCase();
16
+ return q
17
+ .toLowerCase()
18
+ .split(/\s+/)
19
+ .every((w) => hay.includes(w));
20
+ };
21
+
22
+ /** How a kind is dressed: the agent solid in the app's accent, a model
23
+ * call outlined in it, every other kind plain. */
24
+ const TILE = {
25
+ plain: "border-border bg-card text-muted-foreground",
26
+ model: "border-primary/55 bg-card text-primary",
27
+ agent: "border-primary bg-primary/15 text-primary",
28
+ };
29
+
30
+ /**
31
+ * onPick(kind) a kind was chosen ("action", "condition", "llm" …)
32
+ * onClose() Escape, or a press outside
33
+ * title the dialog's name (default "Add a step")
34
+ * inline in the flow of a page (the outline), not floating
35
+ * runnable a Set of the kinds the platform runs; the rest say "soon"
36
+ * (default: automation-model's RUNNABLE)
37
+ * className, style the floating panel's place (the editor sets it)
38
+ */
39
+ export function StepPicker({ onPick, onClose, title = "Add a step", inline = false, runnable, className, style }) {
40
+ const [q, setQ] = useState("");
41
+ const ref = useRef(null);
42
+ const groups = useMemo(
43
+ () =>
44
+ paletteGroups()
45
+ .map((g) => ({ ...g, kinds: g.kinds.filter((k) => matches(k, q)) }))
46
+ .filter((g) => g.kinds.length),
47
+ [q],
48
+ );
49
+
50
+ useEffect(() => {
51
+ const onDown = (e) => {
52
+ if (ref.current && !ref.current.contains(e.target)) onClose?.();
53
+ };
54
+ const onKey = (e) => {
55
+ if (e.key === "Escape") {
56
+ e.preventDefault();
57
+ onClose?.();
58
+ }
59
+ };
60
+ document.addEventListener("pointerdown", onDown, true);
61
+ document.addEventListener("keydown", onKey, true);
62
+ return () => {
63
+ document.removeEventListener("pointerdown", onDown, true);
64
+ document.removeEventListener("keydown", onKey, true);
65
+ };
66
+ }, [onClose]);
67
+
68
+ return (
69
+ <div
70
+ ref={ref}
71
+ role="dialog"
72
+ aria-label={title}
73
+ style={style}
74
+ onPointerDown={(e) => e.stopPropagation()}
75
+ className={cx(
76
+ "z-20 flex min-w-0 flex-col gap-2 rounded-lg border border-border bg-popover p-2 text-popover-foreground",
77
+ inline ? "w-full" : "absolute w-[330px] max-w-[calc(100%_-_1rem)] shadow-lg",
78
+ className,
79
+ )}
80
+ >
81
+ <Input type="search" placeholder="Search steps" aria-label="Search steps" value={q} autoFocus onChange={(e) => setQ(e.target.value)} />
82
+ <div data-scroll className={cx("grid min-w-0 gap-2 overflow-y-auto", inline ? "max-h-72" : "max-h-[320px]")}>
83
+ {groups.length === 0 ? <p className="m-0 p-2 text-sm text-muted-foreground">No step matches “{q}”.</p> : null}
84
+ {groups.map((g) => (
85
+ <section key={g.group} aria-label={g.label} className="grid gap-0.5">
86
+ <h4 className="m-0 px-2 pt-1 text-2xs font-semibold uppercase tracking-wide text-muted-foreground">{g.label}</h4>
87
+ {g.kinds.map((k) => (
88
+ <button
89
+ key={k.kind}
90
+ type="button"
91
+ onClick={() => onPick?.(k.kind)}
92
+ className="flex min-w-0 items-center gap-2.5 rounded-md border border-transparent px-2 py-1.5 text-left hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
93
+ >
94
+ <span className={cx("inline-flex size-9 shrink-0 items-center justify-center rounded-lg border", TILE[k.tone] ?? TILE.plain)}>
95
+ <Glyph name={k.glyph} size={18} />
96
+ </span>
97
+ <span className="grid min-w-0 flex-1 gap-0.5">
98
+ <b className="text-[13px] font-semibold">{k.name}</b>
99
+ <span className="text-xs leading-snug text-muted-foreground">{k.blurb}</span>
100
+ </span>
101
+ <span className="shrink-0 rounded-full border border-border px-1.5 text-2xs text-muted-foreground">{k.paid ? "paid" : !isRunnable(k.kind, runnable) ? "soon" : "free"}</span>
102
+ </button>
103
+ ))}
104
+ </section>
105
+ ))}
106
+ </div>
107
+ </div>
108
+ );
109
+ }
110
+
111
+ /**
112
+ * The bar along the bottom of a canvas: every kind, one icon each, grouped.
113
+ * onAdd(kind) a kind was pressed
114
+ */
115
+ export function PaletteBar({ onAdd, className }) {
116
+ const groups = paletteGroups();
117
+ return (
118
+ <div role="toolbar" aria-label="Add a step" className={cx("flex max-w-full items-end gap-3 overflow-x-auto rounded-xl border border-border bg-card p-1.5 text-card-foreground shadow-md", className)}>
119
+ {groups.map((g) => (
120
+ <div key={g.group} className="grid shrink-0 gap-1">
121
+ <span className="px-1 text-2xs font-semibold uppercase tracking-wide text-muted-foreground">{g.label}</span>
122
+ <div className="flex gap-0.5">
123
+ {g.kinds.map((k) => (
124
+ <button
125
+ key={k.kind}
126
+ type="button"
127
+ title={`${k.name}: ${k.blurb}`}
128
+ aria-label={`Add ${KINDS[k.kind].name}`}
129
+ onClick={() => onAdd?.(k.kind)}
130
+ className={cx(
131
+ "relative inline-flex size-9 items-center justify-center rounded-lg border border-transparent hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
132
+ k.tone === "plain" ? "text-muted-foreground hover:text-foreground" : "text-primary",
133
+ )}
134
+ >
135
+ <Glyph name={k.glyph} size={16} />
136
+ {k.mark ? <em className="absolute -bottom-0.5 -right-0.5 rounded-full bg-primary px-1 text-2xs font-bold not-italic leading-none text-primary-foreground">{k.mark === "model" ? "AI" : "A"}</em> : null}
137
+ </button>
138
+ ))}
139
+ </div>
140
+ </div>
141
+ ))}
142
+ </div>
143
+ );
144
+ }
@@ -0,0 +1,100 @@
1
+ # StepSettings
2
+
3
+ The panel for one step of an automation, made for its kind, and the panel
4
+ for the automation as a whole. In a run the same panel is read-only and
5
+ adds how the step went.
6
+
7
+ **StepSettings** — a name; then what the kind needs, in a person's words:
8
+
9
+ - **App action** — picked from the app's declared actions (`actions`),
10
+ with what to give it; in a team automation, which app.
11
+ - **Connected tool** — the kind of account (mail, calendar, chat — never a
12
+ product), the tool, which account when there are several, what to give it.
13
+ - **Condition** — "Go the Yes way when …"; anything else goes No.
14
+ - **For each** — the list, at most how many, what to collect.
15
+ - **Ask the model** — what to ask, Quick or Careful, standing instructions.
16
+ - **Agent** — what it should do, and the most it may spend.
17
+ - **Buy paid data** (a Zero step) — the paid service, its address, how it is
18
+ called (Ask, Send, Replace, Change), what to give it, and the most one call
19
+ may cost in dollars. Plain code: no model, and the same call is never paid
20
+ for twice.
21
+ - **Set, Wait, Stop, Tell someone, Search, Another automation, Company
22
+ brain** — their own few fields.
23
+
24
+ Every text field takes data from earlier steps (`data-picker`). For every
25
+ step: **If it fails** (stop or carry on without it; how many tries) and a
26
+ plain **To fix** list of what is wrong with it. In a run (`readOnly` and a
27
+ `summary`): how it went, how many times, what it cost, what went in and
28
+ what came out (for those who may read it), and the agent's fix (`fix-note`).
29
+
30
+ **FlowSettings** — name; what it does; if it is still running when the next
31
+ is due (skip, queue, run both); only when something changed; what happens
32
+ when a step fails (retry, then the agent; the agent first; stop); the most
33
+ one run may spend; what a manual run asks for first; its versions.
34
+
35
+ ```jsx
36
+ import { StepSettings, FlowSettings } from "../components/blocks/step-settings"; // a Makersclaw app
37
+ import { StepSettings, FlowSettings } from "@/components/makersclaw/blocks/step-settings"; // a shadcn project
38
+ ```
39
+
40
+ `makersclaw add step-settings` lays `data-picker`, `fix-note` and
41
+ `automation-model` with it. Client components. Each is a panel (a head, a
42
+ scrolling body, a foot): place it beside or over the canvas.
43
+
44
+ ## Props
45
+
46
+ ### StepSettings
47
+
48
+ - `step` — the step shown.
49
+ - `available` — `availableBefore(def, step.id, stepTitle)`, plus
50
+ `inputs: [{ name, label }]` for a manual run's questions. `samples` —
51
+ `{ [stepId]: a real output }`, or null.
52
+ - `apps` — `[{ id, name }]`; `ownedByApp` — an app's own automation needs
53
+ no app on an action. `actions` — `[{ name, description }]`.
54
+ - `problems` — lines about this step (`issuesFor(issues, step.id)`).
55
+ - `readOnly`, `summary` (a run's `summarizeSteps(rows).get(step.id)`),
56
+ `dataVisible` (the member may read what went in and out), `onKeepFix()`,
57
+ `runActions` (a node drawn under how the step went: run-view puts its
58
+ "Retry from this step" there).
59
+ - `onChange(patch)` — fields to change, for `updateStep(def, id, patch)`.
60
+ `onRemove()` (asks first when the step holds others), `onDuplicate()`,
61
+ `onClose()`.
62
+
63
+ ### FlowSettings
64
+
65
+ - `def`, `readOnly`, `versions` (`[{ version, kind, note, created_at }]`),
66
+ `liveVersion`, `onChange(def)`, `onClose`, `onReset` ("Reset to the app's
67
+ version", when it was edited from a shipped one).
68
+
69
+ ### The rows
70
+
71
+ `TextField`, `NumberField`, `SelectField` and `SwitchField`: a labelled
72
+ control each, on the kit's parts.
73
+
74
+ ## Never
75
+
76
+ - Never show the definition's own keys: a step's words are a person's.
77
+ (The step id is shown small, because a run's rows and an app update
78
+ match steps by it.)
79
+ - Never let the panel save: it only says what changed. The screen saves.
80
+
81
+ ## Example
82
+
83
+ ```jsx
84
+ "use client";
85
+ import { useState } from "react";
86
+ import { availableBefore, stepTitle, updateStep } from "../components/blocks/automation-model";
87
+ import { StepSettings } from "../components/blocks/step-settings";
88
+
89
+ const START = { format: 1, key: "t", name: "T", trigger: { type: "manual" }, inputs: {}, settings: {}, steps: [{ id: "tell", kind: "notify", message: "Hello" }] };
90
+
91
+ export default function Panel() {
92
+ const [def, setDef] = useState(START);
93
+ const step = def.steps[0];
94
+ return (
95
+ <div className="h-[520px] max-w-sm overflow-hidden rounded-lg border border-border">
96
+ <StepSettings step={step} available={availableBefore(def, step.id, stepTitle)} onChange={(patch) => setDef(updateStep(def, step.id, patch))} onClose={() => {}} />
97
+ </div>
98
+ );
99
+ }
100
+ ```
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "step-settings",
3
+ "title": "StepSettings",
4
+ "description": "The panel for one step of an automation, made for its kind: a name; an app action picked from the app's declared actions with what to give it; a connected tool by kind of account; a condition; a for-each's list and limit; a model call's question and tier; an agent step's instructions and credit limit; a paid-data step's service, address and price ceiling; a wait; a stop; a note for the owner; and, for every step, what happens if it fails (stop or carry on, how many tries) and a plain list of what is wrong with it. Every text field takes data from earlier steps (data-picker). In a run the same panel is read-only and shows how the step went, what went in and what came out, and what the agent changed (fix-note). FlowSettings is the panel for the automation as a whole: name, what it does, overlap, what happens when a step fails, the most a run may spend, what a manual run asks first, and its versions.",
5
+ "useWhen": "A step or an automation is edited or read in your own screen. automation-editor and run-view place these for you.",
6
+ "tags": [
7
+ "automation",
8
+ "workflow",
9
+ "step",
10
+ "settings",
11
+ "form",
12
+ "panel",
13
+ "inspector",
14
+ "action",
15
+ "condition",
16
+ "loop",
17
+ "llm",
18
+ "agent",
19
+ "retry",
20
+ "failure",
21
+ "versions",
22
+ "n8n",
23
+ "make"
24
+ ],
25
+ "exports": [
26
+ "FlowSettings",
27
+ "NumberField",
28
+ "SelectField",
29
+ "StepSettings",
30
+ "SwitchField",
31
+ "TextField"
32
+ ],
33
+ "files": [
34
+ "index.js",
35
+ "step-settings.jsx",
36
+ "flow-settings.jsx",
37
+ "fields.jsx"
38
+ ],
39
+ "requires": [
40
+ "automation-model",
41
+ "data-picker",
42
+ "fix-note"
43
+ ]
44
+ }