makersclaw 0.8.0 → 0.8.2

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 +234 -0
  143. package/registry/blocks/agent-pane/agent-pane.jsx +246 -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 +1677 -8
  400. package/templates/next/files/lib/platform.js +529 -21
  401. package/templates/next/template.json +13 -3
@@ -0,0 +1,93 @@
1
+ "use client";
2
+
3
+ // StepSettings and FlowSettings — the gallery's and the smoke test's
4
+ // surface. Not installed into apps. A step of each kind to look at, the
5
+ // whole-automation panel, and a failed step in a run with the agent's fix.
6
+ import { useState } from "react";
7
+ import { Button, ButtonGroup } from "../components/ui";
8
+ import { StepSettings, FlowSettings } from "../components/blocks/step-settings";
9
+ import { availableBefore, blankAutomation, stepTitle, summarizeSteps, updateStep } from "../components/blocks/automation-model";
10
+
11
+ const DEF = {
12
+ ...blankAutomation("Morning read", "morning-read", { type: "schedule", cron: "0 7 * * 1-5", tz: "team" }),
13
+ does: "Reads your mail and drafts the follow-ups that are owed.",
14
+ steps: [
15
+ { id: "mail", kind: "tool", label: "Read the mail", needs: { category: "mail" }, tool: "list_messages", input: { since: "{{ trigger.at }}", limit: 200 } },
16
+ { id: "touches", kind: "action", action: "record_touches", input: { touches: "{{ steps.mail.output.messages }}" } },
17
+ { id: "check", kind: "condition", if: "{{ steps.touches.output.saved > 0 }}", then: [{ id: "tell", kind: "notify", message: "Saved some." }], else: [] },
18
+ { id: "ask", kind: "llm", prompt: "Write one line about {{ steps.touches.output.saved }} people.", tier: "fast" },
19
+ { id: "agent", kind: "agent", instructions: "Look at the list and say what looks wrong.", cap_credits: 40 },
20
+ ],
21
+ };
22
+ const ACTIONS = [
23
+ { name: "record_touches", description: "Save who wrote and who was met" },
24
+ { name: "suggest", description: "Save a draft for a person" },
25
+ ];
26
+ const OUTPUTS = { mail: { count: 12, messages: [{ from: "ana@x.com" }] } };
27
+ const FAILED = summarizeSteps([
28
+ {
29
+ path: "touches",
30
+ step_id: "touches",
31
+ attempt: 2,
32
+ status: "done",
33
+ started_at: "2026-10-12T07:00:01Z",
34
+ ended_at: "2026-10-12T07:00:04Z",
35
+ credits: 0.4,
36
+ error: null,
37
+ input: { touches: ["Ana@x.com "] },
38
+ output: { saved: 1 },
39
+ fix: { by: "agent", kind: "format", before: "Ana@x.com ", after: "ana@x.com", why: "The mail tool refuses spaces." },
40
+ },
41
+ ]).get("touches");
42
+
43
+ export default function StepSettingsDemo() {
44
+ const [def, setDef] = useState(DEF);
45
+ const [id, setId] = useState("touches");
46
+ const [which, setWhich] = useState("step");
47
+ const step = def.steps.find((s) => s.id === id) ?? def.steps[0];
48
+ return (
49
+ <div className="grid gap-4 p-4">
50
+ <div className="flex flex-wrap gap-2">
51
+ <ButtonGroup aria-label="Which panel">
52
+ {["step", "run", "flow"].map((w) => (
53
+ <Button key={w} size="sm" variant={which === w ? "primary" : "secondary"} onClick={() => setWhich(w)}>
54
+ {w === "step" ? "A step" : w === "run" ? "A step in a run" : "The automation"}
55
+ </Button>
56
+ ))}
57
+ </ButtonGroup>
58
+ {which !== "flow" ? (
59
+ <ButtonGroup aria-label="Which step">
60
+ {def.steps.map((s) => (
61
+ <Button key={s.id} size="sm" variant={s.id === step.id ? "primary" : "secondary"} onClick={() => setId(s.id)}>
62
+ {s.kind}
63
+ </Button>
64
+ ))}
65
+ </ButtonGroup>
66
+ ) : null}
67
+ </div>
68
+ <div className="h-[640px] w-full max-w-sm overflow-hidden rounded-lg border border-border">
69
+ {which === "flow" ? (
70
+ <FlowSettings def={def} versions={[{ version: 2, kind: "member", created_at: "2026-10-11T12:00:00Z", note: "Added the check" }, { version: 1, kind: "shipped", created_at: "2026-10-09T12:00:00Z" }]} liveVersion={2} onChange={setDef} onClose={() => {}} onReset={() => {}} />
71
+ ) : (
72
+ <StepSettings
73
+ key={`${which}:${step.id}`}
74
+ step={step}
75
+ available={{ ...availableBefore(def, step.id, stepTitle), inputs: [] }}
76
+ samples={OUTPUTS}
77
+ actions={ACTIONS}
78
+ ownedByApp
79
+ problems={step.kind === "agent" ? ["Tell the agent what to do."] : []}
80
+ readOnly={which === "run"}
81
+ summary={which === "run" && step.id === "touches" ? FAILED : null}
82
+ dataVisible
83
+ onChange={(patch) => setDef(updateStep(def, step.id, patch))}
84
+ onRemove={() => setDef({ ...def, steps: def.steps.filter((s) => s.id !== step.id) })}
85
+ onDuplicate={() => {}}
86
+ onKeepFix={async () => ({ ok: true })}
87
+ onClose={() => {}}
88
+ />
89
+ )}
90
+ </div>
91
+ </div>
92
+ );
93
+ }
@@ -0,0 +1,58 @@
1
+ "use client";
2
+
3
+ // The plain form rows the settings panels share, on the kit's parts: a
4
+ // labelled text, number, select or switch. Each is a real label over a
5
+ // real control, so it works by keyboard and with a screen reader.
6
+
7
+ import { useId } from "react";
8
+ import { Field, Input, Select, Switch, Textarea } from "../../ui";
9
+
10
+ export function TextField({ label, value, onChange, help, placeholder, mono = false, multiline = false, rows = 3, disabled = false }) {
11
+ const id = useId();
12
+ const common = { id, value, disabled, placeholder, className: mono ? "font-mono text-[13px]" : undefined, onChange: (e) => onChange(e.target.value) };
13
+ return (
14
+ <Field id={id} label={label} hint={help}>
15
+ {multiline ? <Textarea {...common} rows={rows} /> : <Input {...common} type="text" />}
16
+ </Field>
17
+ );
18
+ }
19
+
20
+ export function NumberField({ label, value, onChange, min, max, step, help, placeholder, disabled = false }) {
21
+ const id = useId();
22
+ return (
23
+ <Field id={id} label={label} hint={help}>
24
+ <Input
25
+ id={id}
26
+ type="number"
27
+ inputMode={step !== undefined && step < 1 ? "decimal" : "numeric"}
28
+ className="font-mono text-[13px]"
29
+ min={min}
30
+ max={max}
31
+ step={step}
32
+ value={value ?? ""}
33
+ placeholder={placeholder}
34
+ disabled={disabled}
35
+ onChange={(e) => onChange(e.target.value === "" ? undefined : Number(e.target.value))}
36
+ />
37
+ </Field>
38
+ );
39
+ }
40
+
41
+ export function SelectField({ label, value, onChange, options, help, disabled = false }) {
42
+ const id = useId();
43
+ return (
44
+ <Field id={id} label={label} hint={help}>
45
+ <Select id={id} value={value} disabled={disabled} options={options} onChange={(e) => onChange(e.target.value)} />
46
+ </Field>
47
+ );
48
+ }
49
+
50
+ export function SwitchField({ label, checked, onChange, help, disabled = false }) {
51
+ const id = useId();
52
+ return (
53
+ <div className="grid gap-0.5">
54
+ <Switch id={id} checked={checked} disabled={disabled} label={label} onChange={(e) => onChange(e.target.checked)} />
55
+ {help ? <p className="m-0 text-xs text-muted-foreground">{help}</p> : null}
56
+ </div>
57
+ );
58
+ }
@@ -0,0 +1,115 @@
1
+ "use client";
2
+
3
+ // The panel for the automation as a whole: its name, what it does, what
4
+ // happens when a step fails, what one run may spend, what a manual run
5
+ // asks for first, and its versions. Props in; every change is
6
+ // `onChange(nextDefinition)`.
7
+
8
+ import { Button, Select, Input, cx } from "../../ui";
9
+ import { Chip, Glyph, PanelSection, SidePanel, agoWords } from "../automation-model";
10
+ import { NumberField, SelectField, SwitchField, TextField } from "./fields";
11
+
12
+ const OVERLAP = [
13
+ { value: "skip", label: "Skip the new run" },
14
+ { value: "queue", label: "Queue it behind" },
15
+ { value: "allow", label: "Run both at once" },
16
+ ];
17
+ const FAILURE = [
18
+ { value: "retry_then_agent", label: "Retry, then ask the agent to fix it" },
19
+ { value: "agent_first", label: "Ask the agent to fix it straight away" },
20
+ { value: "stop", label: "Stop the run" },
21
+ ];
22
+ const INPUT_TYPES = [
23
+ { value: "string", label: "Text" },
24
+ { value: "number", label: "Number" },
25
+ { value: "boolean", label: "Yes or no" },
26
+ { value: "date", label: "Date" },
27
+ ];
28
+
29
+ /**
30
+ * def the automation: { name, does, settings, inputs, … }
31
+ * readOnly shown, not editable
32
+ * versions [{ version, kind: shipped|member|agent, note, created_at }]
33
+ * liveVersion the version that runs
34
+ * onChange(def)
35
+ * onClose draws the close button
36
+ * onReset draws "Reset to the app's version" when the automation
37
+ * was edited from a shipped one
38
+ */
39
+ export function FlowSettings({ def, readOnly = false, versions = [], liveVersion = null, onChange, onClose, onReset }) {
40
+ const set = (patch) => onChange({ ...def, ...patch });
41
+ const setSettings = (patch) => onChange({ ...def, settings: { ...def.settings, ...patch } });
42
+ const inputs = Object.entries(def.inputs ?? {});
43
+ const setInputs = (next) => onChange({ ...def, inputs: Object.fromEntries(next) });
44
+
45
+ return (
46
+ <SidePanel glyph={<Glyph name="automation" size={20} />} title="This automation" subtitle="How it behaves as a whole" label="Flow settings" onClose={onClose}>
47
+ <TextField label="Name" value={def.name} disabled={readOnly} onChange={(v) => set({ name: v })} />
48
+ <TextField label="What it does" value={def.does ?? ""} multiline rows={3} disabled={readOnly} onChange={(v) => set({ does: v || undefined })} help="One sentence, for the list." />
49
+
50
+ <PanelSection title="When it runs">
51
+ <SelectField label="If it is still running when the next one is due" value={def.settings.overlap} options={OVERLAP} disabled={readOnly} onChange={(v) => setSettings({ overlap: v })} />
52
+ <SwitchField label="Only when something changed" checked={Boolean(def.settings.only_if_changed)} disabled={readOnly} onChange={(v) => setSettings({ only_if_changed: v })} help="Skip a scheduled run when nothing it reads has changed since the last one." />
53
+ </PanelSection>
54
+
55
+ <PanelSection title="When a step fails">
56
+ <SelectField label="What happens" value={def.settings.on_failure} options={FAILURE} disabled={readOnly} onChange={(v) => setSettings({ on_failure: v })} help="The agent changes only this run: a date format, a missing field. Never who gets what." />
57
+ <NumberField label="Most one run may spend" value={def.settings.run_cap_credits} min={1} disabled={readOnly} placeholder="No limit" onChange={(v) => setSettings({ run_cap_credits: v })} help="In credits. A run that reaches it stops." />
58
+ </PanelSection>
59
+
60
+ <PanelSection title="What a manual run asks for">
61
+ {inputs.length === 0 ? <p className="m-0 text-xs text-muted-foreground">Nothing. Add a question if a run needs an answer first.</p> : null}
62
+ {inputs.map(([name, spec], i) => (
63
+ <div key={i} className="flex min-w-0 items-center gap-1.5">
64
+ <Input
65
+ className="min-w-0 flex-1 font-mono text-[13px]"
66
+ aria-label={`Question name ${i + 1}`}
67
+ value={name}
68
+ disabled={readOnly}
69
+ onChange={(e) => setInputs(inputs.map((x, j) => (j === i ? [e.target.value.toLowerCase().replace(/[^a-z0-9_]/g, "_"), x[1]] : x)))}
70
+ />
71
+ <span className="w-28 shrink-0">
72
+ <Select aria-label={`Question type ${i + 1}`} value={spec.type} disabled={readOnly} options={INPUT_TYPES} onChange={(e) => setInputs(inputs.map((x, j) => (j === i ? [x[0], { ...x[1], type: e.target.value }] : x)))} />
73
+ </span>
74
+ {!readOnly ? (
75
+ <button type="button" aria-label={`Remove ${name}`} onClick={() => setInputs(inputs.filter((_, j) => j !== i))} className="inline-flex size-9 shrink-0 items-center justify-center rounded-md text-muted-foreground hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring">
76
+ ×
77
+ </button>
78
+ ) : null}
79
+ </div>
80
+ ))}
81
+ {!readOnly && inputs.length < 20 ? (
82
+ <Button size="sm" variant="secondary" className="justify-self-start" onClick={() => setInputs([...inputs, [`question_${inputs.length + 1}`, { type: "string", label: "" }]])}>
83
+ + Add a question
84
+ </Button>
85
+ ) : null}
86
+ </PanelSection>
87
+
88
+ {versions.length > 0 ? (
89
+ <PanelSection title="Versions">
90
+ <ol className="m-0 grid list-none gap-1.5 p-0">
91
+ {versions.map((v) => (
92
+ <li key={v.version} className={cx("grid gap-0.5 rounded-lg border px-2.5 py-1.5", v.version === liveVersion ? "border-success/50" : "border-border")}>
93
+ <span className="flex items-center gap-2">
94
+ <b className="text-[13px] font-semibold">Version {v.version}</b>
95
+ {v.version === liveVersion ? <Chip tone="green">Live</Chip> : null}
96
+ </span>
97
+ <span className="text-xs text-muted-foreground">
98
+ {v.kind === "shipped" ? "From the app" : v.kind === "agent" ? "By the agent" : "Edited"}
99
+ {" · "}
100
+ {agoWords(v.created_at) ?? ""}
101
+ </span>
102
+ {v.note ? <p className="m-0 text-xs">{v.note}</p> : null}
103
+ </li>
104
+ ))}
105
+ </ol>
106
+ {onReset && !readOnly ? (
107
+ <Button size="sm" variant="secondary" className="justify-self-start" onClick={onReset}>
108
+ Reset to the app's version
109
+ </Button>
110
+ ) : null}
111
+ </PanelSection>
112
+ ) : null}
113
+ </SidePanel>
114
+ );
115
+ }
@@ -0,0 +1,5 @@
1
+ // The StepSettings block — `makersclaw add step-settings`. Fixed: compose
2
+ // it through its props (README.md beside this file).
3
+ export { FlowSettings } from "./flow-settings";
4
+ export { NumberField, SelectField, SwitchField, TextField } from "./fields";
5
+ export { StepSettings } from "./step-settings";
@@ -0,0 +1,290 @@
1
+ "use client";
2
+
3
+ // The panel for one step: its name, what it does (a form made for its
4
+ // kind), what happens if it fails, and the plain list of what is wrong
5
+ // with it. In a run the same panel is read-only and adds how the step went,
6
+ // what went in and what came out, and, when the agent fixed the step,
7
+ // what it changed (fix-note).
8
+ //
9
+ // Fields are written in a person's words; the definition's own keys stay
10
+ // out of sight (the step id is shown small, because it is what a run's rows
11
+ // and an app update match steps by). Props in, callbacks out: every change
12
+ // is `onChange(patch)`, applied by the screen with automation-model's
13
+ // updateStep.
14
+
15
+ import { useState } from "react";
16
+ import { Button, Confirm, Icon, cx } from "../../ui";
17
+ import { Glyph, KINDS, SidePanel, creditsWords, innerCount, nodeStateWords, stepTitle } from "../automation-model";
18
+ import { DataInput, DataPairs } from "../data-picker";
19
+ import { FixNote } from "../fix-note";
20
+ import { NumberField, SelectField, TextField } from "./fields";
21
+
22
+ const FAIL_OPTIONS = [
23
+ { value: "stop", label: "Stop the run" },
24
+ { value: "continue", label: "Carry on without it" },
25
+ ];
26
+ const OP_OPTIONS = [
27
+ { value: "search", label: "Search" },
28
+ { value: "get", label: "Get one" },
29
+ { value: "list", label: "List" },
30
+ ];
31
+ const METHOD_OPTIONS = [
32
+ { value: "GET", label: "Ask (GET)" },
33
+ { value: "POST", label: "Send (POST)" },
34
+ { value: "PUT", label: "Replace (PUT)" },
35
+ { value: "PATCH", label: "Change (PATCH)" },
36
+ ];
37
+ const TIER_OPTIONS = [
38
+ { value: "fast", label: "Quick" },
39
+ { value: "smart", label: "Careful" },
40
+ ];
41
+
42
+ const show = (v) => JSON.stringify(v, null, 2) ?? "";
43
+
44
+ function Data({ label, value }) {
45
+ if (value === undefined || value === null) return null;
46
+ const text = show(value);
47
+ return (
48
+ <details open={text.length < 240} className="rounded-md border border-border bg-muted">
49
+ <summary className="cursor-pointer px-2 py-1 text-xs font-medium">{label}</summary>
50
+ <pre className="m-0 max-h-64 overflow-auto px-2 pb-2 font-mono text-xs">{text.length > 4000 ? `${text.slice(0, 4000)}\n…` : text}</pre>
51
+ </details>
52
+ );
53
+ }
54
+
55
+ /** A run's own account of the step: how it went, what went in and out. */
56
+ function RunBlock({ summary, dataVisible, title, fixProps }) {
57
+ const last = summary.rows[summary.rows.length - 1];
58
+ return (
59
+ <section aria-label="How it went" className="grid gap-2 rounded-lg border border-border bg-background p-3">
60
+ <h4 className={cx("m-0 text-sm font-semibold", summary.state === "failed" && "text-destructive", summary.state === "done" && "text-success", summary.state === "would" && "text-primary")}>{nodeStateWords(summary.state)}</h4>
61
+ <p className="m-0 text-xs text-muted-foreground">
62
+ {summary.passes > 1 ? `${summary.passes} times · ` : ""}
63
+ {creditsWords(summary.credits)}
64
+ </p>
65
+ {summary.words ? <p className="m-0 text-[13px] text-destructive">{summary.words}</p> : null}
66
+ {summary.state === "would" && summary.would ? <p className="m-0 text-[13px] text-primary">{summary.would}</p> : null}
67
+ {summary.unchecked ? <p className="m-0 text-[13px] text-muted-foreground">Not checked: it needs what an earlier step would have made.</p> : null}
68
+ {summary.fix ? <FixNote fix={summary.fix} stepTitle={title} {...fixProps} /> : null}
69
+ {dataVisible && last ? (
70
+ <>
71
+ <Data label="Went in" value={last.input} />
72
+ <Data label="Came out" value={last.output} />
73
+ </>
74
+ ) : (
75
+ <p className="m-0 text-xs text-muted-foreground">What went in and came out is shown to the automation's owner and the admins.</p>
76
+ )}
77
+ </section>
78
+ );
79
+ }
80
+
81
+ /**
82
+ * step the step shown
83
+ * available automation-model's availableBefore(def, id, stepTitle), plus
84
+ * optionally `inputs: [{ name, label }]` (what a manual run asks)
85
+ * samples { [stepId]: a real output } for the data picker, or null
86
+ * apps the workspace's apps, [{ id, name }], for an action in a team automation
87
+ * actions the app's declared actions, [{ name, description? }]: an action
88
+ * step picks from them instead of typing a name
89
+ * ownedByApp the automation belongs to an app (its actions need no app)
90
+ * problems lines about this step to fix
91
+ * readOnly shown, not editable (a run)
92
+ * onChange(patch), onRemove(), onDuplicate(), onClose()
93
+ * summary a run: automation-model's summarizeSteps() entry for this step
94
+ * dataVisible the member may read what went in and out
95
+ * fixProps what FixNote needs for a step the agent fixed: { draft, onKeep, onDrop, onUndo }
96
+ * onKeepFix() keep a fix the agent made, for next time (shorthand for fixProps.onKeep)
97
+ * runActions a run: what the member can do with this step (a node), drawn under how it went
98
+ */
99
+ export function StepSettings({ step, available, samples = null, apps = [], actions, ownedByApp = false, problems = [], readOnly = false, onChange, onRemove, onDuplicate, onClose, summary = null, dataVisible = false, fixProps, onKeepFix, runActions = null }) {
100
+ const info = KINDS[step.kind] ?? KINDS.action;
101
+ const dis = readOnly;
102
+ const set = (patch) => onChange?.(patch);
103
+ const inner = innerCount(step);
104
+ const [confirming, setConfirming] = useState(false);
105
+ const title = stepTitle(step);
106
+
107
+ const remove = () => {
108
+ if (inner > 0) setConfirming(true);
109
+ else onRemove?.();
110
+ };
111
+
112
+ return (
113
+ <SidePanel
114
+ glyph={<Glyph name={info.glyph} size={20} />}
115
+ tone={info.tone === "plain" ? "plain" : "ai"}
116
+ title={title}
117
+ subtitle={`${info.name}${info.paid ? " · costs credits" : " · free"}`}
118
+ label={`${info.name} settings`}
119
+ onClose={onClose}
120
+ footer={
121
+ readOnly ? null : (
122
+ <>
123
+ <Button size="sm" variant="secondary" icon="copy" onClick={onDuplicate}>
124
+ Duplicate
125
+ </Button>
126
+ <Button size="sm" variant="danger" icon="trash" onClick={remove}>
127
+ Remove
128
+ </Button>
129
+ </>
130
+ )
131
+ }
132
+ >
133
+ {summary ? <RunBlock summary={summary} dataVisible={dataVisible} title={title} fixProps={fixProps ?? (onKeepFix ? { onKeep: onKeepFix } : undefined)} /> : null}
134
+ {summary && runActions ? runActions : null}
135
+
136
+ <TextField label="Name" value={step.label ?? ""} placeholder={stepTitle({ ...step, label: undefined })} disabled={dis} onChange={(v) => set({ label: v.trim() ? v : undefined })} help="What this step is called on the canvas." />
137
+
138
+ {step.kind === "action" ? (
139
+ <>
140
+ {!ownedByApp ? (
141
+ <SelectField label="App" value={step.app ?? ""} disabled={dis} onChange={(v) => set({ app: v || undefined })} options={[{ value: "", label: "Pick an app" }, ...apps.map((a) => ({ value: a.id, label: a.name }))]} help="Which of your apps this action belongs to." />
142
+ ) : null}
143
+ {actions?.length ? (
144
+ <SelectField
145
+ label="Action"
146
+ value={step.action}
147
+ disabled={dis}
148
+ onChange={(v) => set({ action: v })}
149
+ options={[{ value: "", label: "Pick an action" }, ...actions.map((a) => ({ value: a.name, label: a.description ? `${a.name}: ${a.description}` : a.name })), ...(step.action && !actions.some((a) => a.name === step.action) ? [{ value: step.action, label: step.action }] : [])]}
150
+ help="The actions this app declares."
151
+ />
152
+ ) : (
153
+ <TextField label="Action" value={step.action} mono disabled={dis} placeholder="add_people" onChange={(v) => set({ action: v })} help="The name of the action the app declares." />
154
+ )}
155
+ <DataPairs label="What to give it" value={step.input} available={available} samples={samples} disabled={dis} onChange={(v) => set({ input: v })} />
156
+ </>
157
+ ) : null}
158
+
159
+ {step.kind === "tool" ? (
160
+ <>
161
+ <TextField label="Kind of account" value={step.needs?.category ?? ""} mono disabled={dis} placeholder="mail" onChange={(v) => set({ needs: { category: v } })} help="The account is chosen by kind (mail, calendar, chat), never by product." />
162
+ <TextField label="Tool" value={step.tool} mono disabled={dis} placeholder="list_messages" onChange={(v) => set({ tool: v })} />
163
+ <TextField label="Which account" value={step.account ?? ""} disabled={dis} placeholder="you@company.com" onChange={(v) => set({ account: v || undefined })} help="Only when you have several of that kind." />
164
+ <DataPairs label="What to give it" value={step.input} available={available} samples={samples} disabled={dis} onChange={(v) => set({ input: v })} />
165
+ </>
166
+ ) : null}
167
+
168
+ {step.kind === "brain.read" ? (
169
+ <>
170
+ <SelectField label="How" value={step.op} options={OP_OPTIONS} disabled={dis} onChange={(v) => set({ op: v })} />
171
+ <DataPairs label="What to look for" value={step.input} available={available} samples={samples} disabled={dis} onChange={(v) => set({ input: v })} />
172
+ </>
173
+ ) : null}
174
+
175
+ {step.kind === "condition" ? (
176
+ <DataInput label="Go the Yes way when" value={step.if} mono multiline rows={3} disabled={dis} available={available} samples={samples} onChange={(v) => set({ if: v })} help="Anything else goes the No way. Branches are drawn on the canvas; add steps to each with +." />
177
+ ) : null}
178
+
179
+ {step.kind === "loop" ? (
180
+ <>
181
+ <DataInput label="Go through" value={step.over} mono disabled={dis} available={available} samples={samples} onChange={(v) => set({ over: v })} help="A list from an earlier step." />
182
+ <NumberField label="At most" value={step.max} min={1} max={500} disabled={dis} onChange={(v) => set({ max: v })} help="How many items it will go through." />
183
+ <DataInput label="Collect from each pass" value={step.collect ?? ""} mono disabled={dis} available={available} samples={samples} onChange={(v) => set({ collect: v || undefined })} help="Optional: what to keep from every pass, as a list." />
184
+ </>
185
+ ) : null}
186
+
187
+ {step.kind === "set" ? <DataPairs label="Values" value={step.values} available={available} samples={samples} disabled={dis} keyLabel="Name" onChange={(v) => set({ values: v })} /> : null}
188
+
189
+ {step.kind === "wait" ? (
190
+ <>
191
+ <TextField label="Wait for" value={step.for ?? ""} mono disabled={dis} placeholder="10m" onChange={(v) => set({ for: v || undefined, ...(v ? { until: undefined } : {}) })} help="A number and a unit: 30s, 10m, 2h, 3d. Nothing runs while it waits." />
192
+ <DataInput label="Or wait until" value={step.until ?? ""} mono disabled={dis} available={available} samples={samples} onChange={(v) => set({ until: v || undefined, ...(v ? { for: undefined } : {}) })} help="A time, as data." />
193
+ </>
194
+ ) : null}
195
+
196
+ {step.kind === "stop" ? (
197
+ <>
198
+ <DataInput label="Message" value={step.message} multiline rows={3} disabled={dis} available={available} samples={samples} onChange={(v) => set({ message: v })} />
199
+ <SelectField
200
+ label="Ends as"
201
+ value={step.as ?? "done"}
202
+ disabled={dis}
203
+ onChange={(v) => set({ as: v === "done" ? undefined : v })}
204
+ options={[
205
+ { value: "done", label: "Done" },
206
+ { value: "failed", label: "Failed" },
207
+ ]}
208
+ />
209
+ </>
210
+ ) : null}
211
+
212
+ {step.kind === "notify" ? <DataInput label="Message" value={step.message} multiline rows={3} disabled={dis} available={available} samples={samples} onChange={(v) => set({ message: v })} help="A line for the owner, in their Needs you." /> : null}
213
+
214
+ {step.kind === "search" ? (
215
+ <>
216
+ <DataInput label="Search for" value={step.query} multiline rows={2} disabled={dis} available={available} samples={samples} onChange={(v) => set({ query: v })} />
217
+ <NumberField label="How many results" value={step.limit} min={1} max={20} disabled={dis} onChange={(v) => set({ limit: v })} />
218
+ </>
219
+ ) : null}
220
+
221
+ {step.kind === "llm" ? (
222
+ <>
223
+ <DataInput label="What to ask" value={step.prompt} multiline rows={6} disabled={dis} available={available} samples={samples} onChange={(v) => set({ prompt: v })} />
224
+ <SelectField label="Which model" value={step.tier ?? "fast"} options={TIER_OPTIONS} disabled={dis} onChange={(v) => set({ tier: v })} help="Quick is cheaper. Careful thinks longer." />
225
+ <TextField label="Standing instructions" value={step.system ?? ""} multiline rows={2} disabled={dis} onChange={(v) => set({ system: v || undefined })} help="Optional instructions that frame every answer." />
226
+ </>
227
+ ) : null}
228
+
229
+ {step.kind === "agent" ? (
230
+ <>
231
+ <DataInput label="What the agent should do" value={step.instructions} multiline rows={7} disabled={dis} available={available} samples={samples} onChange={(v) => set({ instructions: v })} help="Plain words. The agent may use your apps and connected accounts, within what you can reach." />
232
+ <NumberField label="Most it may spend" value={step.cap_credits} min={1} disabled={dis} onChange={(v) => set({ cap_credits: v })} help="In credits. The run stops the agent there." />
233
+ </>
234
+ ) : null}
235
+
236
+ {step.kind === "zero" ? (
237
+ <>
238
+ <TextField label="Paid service" value={step.capability ?? ""} mono disabled={dis} placeholder="the service's name" onChange={(v) => set({ capability: v })} help="The name the platform's catalog of paid services gave it." />
239
+ <DataInput label="Address" value={step.url ?? ""} mono disabled={dis} available={available} samples={samples} onChange={(v) => set({ url: v })} help="The service's own web address, starting with https://." />
240
+ <SelectField label="How it is called" value={step.method ?? "GET"} options={METHOD_OPTIONS} disabled={dis} onChange={(v) => set({ method: v === "GET" ? undefined : v })} help="Ask puts what you give it on the address; the others send it as a body." />
241
+ <DataPairs label="What to give it" value={step.input} available={available} samples={samples} disabled={dis} onChange={(v) => set({ input: v })} />
242
+ <NumberField label="Most one call may cost, in dollars" value={step.max_pay_usd} min={0.01} max={2} step={0.01} disabled={dis} onChange={(v) => set({ max_pay_usd: v })} help="The step never pays more than this, and the same call is not paid for twice. It comes out of your credits." />
243
+ </>
244
+ ) : null}
245
+
246
+ {step.kind === "automation" ? (
247
+ <>
248
+ <TextField label="Which automation" value={step.key} mono disabled={dis} placeholder="morning-read" onChange={(v) => set({ key: v })} />
249
+ <DataPairs label="What to give it" value={step.input} available={available} samples={samples} disabled={dis} onChange={(v) => set({ input: v })} />
250
+ </>
251
+ ) : null}
252
+
253
+ <section className="grid gap-3 border-t border-border pt-3">
254
+ <h4 className="m-0 text-2xs font-semibold uppercase tracking-wide text-muted-foreground">If it fails</h4>
255
+ <SelectField label="After the tries are used up" value={step.on_error ?? "stop"} options={FAIL_OPTIONS} disabled={dis} onChange={(v) => set({ on_error: v === "stop" ? undefined : v })} help="The agent steps in first, if the flow lets it." />
256
+ <NumberField label="Tries after the first" value={step.retry?.max} min={0} max={5} disabled={dis} placeholder="3" onChange={(v) => set({ retry: v === undefined ? undefined : { max: v } })} help="For a slow or busy service. Leave empty for the usual three." />
257
+ </section>
258
+
259
+ {problems.length > 0 ? (
260
+ <div role="alert" className="grid gap-1 rounded-lg border border-destructive/50 bg-destructive/10 p-3">
261
+ <h4 className="m-0 flex items-center gap-1.5 text-sm font-semibold text-destructive">
262
+ <Icon name="warning" size={14} /> To fix
263
+ </h4>
264
+ <ul className="m-0 grid list-disc gap-0.5 pl-5 text-[13px]">
265
+ {problems.map((x) => (
266
+ <li key={x}>{x}</li>
267
+ ))}
268
+ </ul>
269
+ </div>
270
+ ) : null}
271
+
272
+ <p className="m-0 text-xs text-muted-foreground">
273
+ Step id <span className="font-mono">{step.id}</span>
274
+ </p>
275
+
276
+ <Confirm
277
+ open={confirming}
278
+ onClose={() => setConfirming(false)}
279
+ onConfirm={() => {
280
+ setConfirming(false);
281
+ onRemove?.();
282
+ }}
283
+ title="Remove this step?"
284
+ body={`This also removes the ${inner} step${inner === 1 ? "" : "s"} inside it.`}
285
+ confirmLabel="Remove"
286
+ tone="danger"
287
+ />
288
+ </SidePanel>
289
+ );
290
+ }