@xdelivered/emberflow 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (414) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +153 -0
  3. package/bin/commands.test.ts +185 -0
  4. package/bin/commands.ts +306 -0
  5. package/bin/emberflow.mjs +38 -0
  6. package/bin/init.test.ts +165 -0
  7. package/bin/init.ts +297 -0
  8. package/bin/runtime.mjs +105 -0
  9. package/bin/runtime.test.ts +167 -0
  10. package/bin/skillTargets.test.ts +108 -0
  11. package/bin/skillTargets.ts +36 -0
  12. package/bin/skillTemplates.test.ts +37 -0
  13. package/bin/tsconfig.json +23 -0
  14. package/dist/bin/commands.d.ts +24 -0
  15. package/dist/bin/commands.js +252 -0
  16. package/dist/bin/init.d.ts +17 -0
  17. package/dist/bin/init.js +241 -0
  18. package/dist/bin/runtime.d.mts +39 -0
  19. package/dist/bin/runtime.mjs +96 -0
  20. package/dist/bin/skillTargets.d.ts +13 -0
  21. package/dist/bin/skillTargets.js +22 -0
  22. package/dist/server/agents/claudeAdapter.d.ts +8 -0
  23. package/dist/server/agents/claudeAdapter.js +190 -0
  24. package/dist/server/agents/claudeParse.d.ts +2 -0
  25. package/dist/server/agents/claudeParse.js +162 -0
  26. package/dist/server/agents/codexAdapter.d.ts +13 -0
  27. package/dist/server/agents/codexAdapter.js +174 -0
  28. package/dist/server/agents/codexParse.d.ts +2 -0
  29. package/dist/server/agents/codexParse.js +74 -0
  30. package/dist/server/agents/detect.d.ts +23 -0
  31. package/dist/server/agents/detect.js +35 -0
  32. package/dist/server/agents/gitScope.d.ts +24 -0
  33. package/dist/server/agents/gitScope.js +95 -0
  34. package/dist/server/agents/modelRejectionHint.d.ts +8 -0
  35. package/dist/server/agents/modelRejectionHint.js +12 -0
  36. package/dist/server/agents/prompt.d.ts +79 -0
  37. package/dist/server/agents/prompt.js +364 -0
  38. package/dist/server/agents/runManager.d.ts +90 -0
  39. package/dist/server/agents/runManager.js +259 -0
  40. package/dist/server/agents/types.d.ts +15 -0
  41. package/dist/server/agents/types.js +1 -0
  42. package/dist/server/apiStore.d.ts +60 -0
  43. package/dist/server/apiStore.js +249 -0
  44. package/dist/server/auth/enforce.d.ts +1 -0
  45. package/dist/server/auth/enforce.js +6 -0
  46. package/dist/server/auth/types.d.ts +1 -0
  47. package/dist/server/auth/types.js +1 -0
  48. package/dist/server/auth/verifiers.d.ts +1 -0
  49. package/dist/server/auth/verifiers.js +4 -0
  50. package/dist/server/authAttach.d.ts +19 -0
  51. package/dist/server/authAttach.js +79 -0
  52. package/dist/server/cli.d.ts +7 -0
  53. package/dist/server/cli.js +804 -0
  54. package/dist/server/client.d.ts +130 -0
  55. package/dist/server/client.js +247 -0
  56. package/dist/server/environments.d.ts +103 -0
  57. package/dist/server/environments.js +486 -0
  58. package/dist/server/flowStore.d.ts +37 -0
  59. package/dist/server/flowStore.js +117 -0
  60. package/dist/server/httpOperations.d.ts +32 -0
  61. package/dist/server/httpOperations.js +62 -0
  62. package/dist/server/index.d.ts +1 -0
  63. package/dist/server/index.js +1022 -0
  64. package/dist/server/infrastructure.d.ts +51 -0
  65. package/dist/server/infrastructure.js +116 -0
  66. package/dist/server/login.d.ts +21 -0
  67. package/dist/server/login.js +44 -0
  68. package/dist/server/mcp.d.ts +1 -0
  69. package/dist/server/mcp.js +182 -0
  70. package/dist/server/migrateFlows.d.ts +8 -0
  71. package/dist/server/migrateFlows.js +25 -0
  72. package/dist/server/mockHandler.d.ts +15 -0
  73. package/dist/server/mockHandler.js +35 -0
  74. package/dist/server/nodesPayload.d.ts +14 -0
  75. package/dist/server/nodesPayload.js +14 -0
  76. package/dist/server/normalizeFlow.d.ts +21 -0
  77. package/dist/server/normalizeFlow.js +48 -0
  78. package/dist/server/openBrowser.d.ts +8 -0
  79. package/dist/server/openBrowser.js +16 -0
  80. package/dist/server/operationResult.d.ts +12 -0
  81. package/dist/server/operationResult.js +26 -0
  82. package/dist/server/pathGuard.d.ts +1 -0
  83. package/dist/server/pathGuard.js +16 -0
  84. package/dist/server/pathSafety.d.ts +20 -0
  85. package/dist/server/pathSafety.js +35 -0
  86. package/dist/server/projectConfig.d.ts +47 -0
  87. package/dist/server/projectConfig.js +61 -0
  88. package/dist/server/projectMode.d.ts +26 -0
  89. package/dist/server/projectMode.js +44 -0
  90. package/dist/server/redact.d.ts +6 -0
  91. package/dist/server/redact.js +37 -0
  92. package/dist/server/runRegistry.d.ts +84 -0
  93. package/dist/server/runRegistry.js +200 -0
  94. package/dist/server/runtime/RuntimeAdapter.d.ts +22 -0
  95. package/dist/server/runtime/RuntimeAdapter.js +1 -0
  96. package/dist/server/runtime/expressAdapter.d.ts +19 -0
  97. package/dist/server/runtime/expressAdapter.js +56 -0
  98. package/dist/server/scenarioTest.d.ts +14 -0
  99. package/dist/server/scenarioTest.js +66 -0
  100. package/dist/server/subflowRunner.d.ts +32 -0
  101. package/dist/server/subflowRunner.js +72 -0
  102. package/dist/server/testRunner.d.ts +70 -0
  103. package/dist/server/testRunner.js +151 -0
  104. package/dist/src/config.d.ts +3 -0
  105. package/dist/src/config.js +2 -0
  106. package/dist/src/engine/authVerify.d.ts +33 -0
  107. package/dist/src/engine/authVerify.js +63 -0
  108. package/dist/src/engine/diagnostics.d.ts +62 -0
  109. package/dist/src/engine/diagnostics.js +148 -0
  110. package/dist/src/engine/executor.d.ts +151 -0
  111. package/dist/src/engine/executor.js +684 -0
  112. package/dist/src/engine/httpError.d.ts +7 -0
  113. package/dist/src/engine/httpError.js +14 -0
  114. package/dist/src/engine/index.d.ts +11 -0
  115. package/dist/src/engine/index.js +11 -0
  116. package/dist/src/engine/output.d.ts +11 -0
  117. package/dist/src/engine/output.js +20 -0
  118. package/dist/src/engine/publish.d.ts +30 -0
  119. package/dist/src/engine/publish.js +95 -0
  120. package/dist/src/engine/registry.d.ts +34 -0
  121. package/dist/src/engine/registry.js +67 -0
  122. package/dist/src/engine/scenarios.d.ts +12 -0
  123. package/dist/src/engine/scenarios.js +19 -0
  124. package/dist/src/engine/schemaCheck.d.ts +4 -0
  125. package/dist/src/engine/schemaCheck.js +34 -0
  126. package/dist/src/engine/trace.d.ts +12 -0
  127. package/dist/src/engine/trace.js +12 -0
  128. package/dist/src/engine/types.d.ts +308 -0
  129. package/dist/src/engine/types.js +1 -0
  130. package/dist/src/engine/validation.d.ts +26 -0
  131. package/dist/src/engine/validation.js +318 -0
  132. package/dist/src/flows/anomaly-flows.d.ts +23 -0
  133. package/dist/src/flows/anomaly-flows.js +151 -0
  134. package/dist/src/flows/city-sweep-flow.d.ts +10 -0
  135. package/dist/src/flows/city-sweep-flow.js +127 -0
  136. package/dist/src/flows/login-flow.d.ts +13 -0
  137. package/dist/src/flows/login-flow.js +145 -0
  138. package/dist/src/flows/pradar-flows.d.ts +5 -0
  139. package/dist/src/flows/pradar-flows.js +375 -0
  140. package/dist/src/flows/weather-flow.d.ts +12 -0
  141. package/dist/src/flows/weather-flow.js +150 -0
  142. package/dist/src/lib/pathParams.d.ts +3 -0
  143. package/dist/src/lib/pathParams.js +6 -0
  144. package/dist/src/nodes/anomaly.d.ts +2 -0
  145. package/dist/src/nodes/anomaly.js +556 -0
  146. package/dist/src/nodes/flow-control.d.ts +7 -0
  147. package/dist/src/nodes/flow-control.js +270 -0
  148. package/dist/src/nodes/index.d.ts +3 -0
  149. package/dist/src/nodes/index.js +20 -0
  150. package/dist/src/nodes/login.d.ts +7 -0
  151. package/dist/src/nodes/login.js +158 -0
  152. package/dist/src/nodes/loops.d.ts +11 -0
  153. package/dist/src/nodes/loops.js +60 -0
  154. package/dist/src/nodes/pradar/index.d.ts +7 -0
  155. package/dist/src/nodes/pradar/index.js +9 -0
  156. package/dist/src/nodes/pradar/logic.d.ts +189 -0
  157. package/dist/src/nodes/pradar/logic.js +370 -0
  158. package/dist/src/nodes/pradar/nodes.d.ts +42 -0
  159. package/dist/src/nodes/pradar/nodes.js +801 -0
  160. package/dist/src/nodes/requireAuth.d.ts +20 -0
  161. package/dist/src/nodes/requireAuth.js +48 -0
  162. package/dist/src/nodes/response.d.ts +8 -0
  163. package/dist/src/nodes/response.js +33 -0
  164. package/dist/src/nodes/weather.d.ts +33 -0
  165. package/dist/src/nodes/weather.js +260 -0
  166. package/package.json +92 -0
  167. package/server/agentRoute.test.ts +157 -0
  168. package/server/agents/__fixtures__/fake-claude-writer.mjs +23 -0
  169. package/server/agents/__fixtures__/fake-claude.mjs +55 -0
  170. package/server/agents/__fixtures__/fake-codex-writer.mjs +27 -0
  171. package/server/agents/__fixtures__/fake-codex.mjs +52 -0
  172. package/server/agents/__fixtures__/fake-version-empty.mjs +3 -0
  173. package/server/agents/__fixtures__/fake-version-fail.mjs +4 -0
  174. package/server/agents/__fixtures__/fake-version-garbage.mjs +4 -0
  175. package/server/agents/__fixtures__/fake-version-good.mjs +4 -0
  176. package/server/agents/__fixtures__/fake-version-hang.mjs +3 -0
  177. package/server/agents/claudeAdapter.test.ts +127 -0
  178. package/server/agents/claudeAdapter.ts +212 -0
  179. package/server/agents/claudeParse.ts +193 -0
  180. package/server/agents/codexAdapter.test.ts +125 -0
  181. package/server/agents/codexAdapter.ts +198 -0
  182. package/server/agents/codexParse.test.ts +58 -0
  183. package/server/agents/codexParse.ts +126 -0
  184. package/server/agents/detect.test.ts +65 -0
  185. package/server/agents/detect.ts +43 -0
  186. package/server/agents/gitScope.test.ts +129 -0
  187. package/server/agents/gitScope.ts +110 -0
  188. package/server/agents/modelRejectionHint.test.ts +30 -0
  189. package/server/agents/modelRejectionHint.ts +14 -0
  190. package/server/agents/prompt.test.ts +613 -0
  191. package/server/agents/prompt.ts +527 -0
  192. package/server/agents/runManager.test.ts +251 -0
  193. package/server/agents/runManager.ts +286 -0
  194. package/server/agents/types.ts +17 -0
  195. package/server/apiMount.test.ts +591 -0
  196. package/server/apiStore.test.ts +324 -0
  197. package/server/apiStore.ts +241 -0
  198. package/server/auth/enforce.test.ts +61 -0
  199. package/server/auth/enforce.ts +6 -0
  200. package/server/auth/types.ts +5 -0
  201. package/server/auth/verifiers.test.ts +37 -0
  202. package/server/auth/verifiers.ts +9 -0
  203. package/server/authAttach.test.ts +175 -0
  204. package/server/authAttach.ts +99 -0
  205. package/server/cli.ts +847 -0
  206. package/server/cliAuth.test.ts +229 -0
  207. package/server/cliCreate.test.ts +131 -0
  208. package/server/cliDoctor.test.ts +326 -0
  209. package/server/cliTest.test.ts +735 -0
  210. package/server/client.ts +314 -0
  211. package/server/demoProject.test.ts +29 -0
  212. package/server/diagnosticsRoute.test.ts +169 -0
  213. package/server/environments.test.ts +620 -0
  214. package/server/environments.ts +603 -0
  215. package/server/environmentsRoute.test.ts +385 -0
  216. package/server/errorWorkflow.test.ts +205 -0
  217. package/server/flowStore.test.ts +84 -0
  218. package/server/flowStore.ts +125 -0
  219. package/server/httpOperations.test.ts +377 -0
  220. package/server/httpOperations.ts +96 -0
  221. package/server/index.ts +1111 -0
  222. package/server/infrastructure.test.ts +154 -0
  223. package/server/infrastructure.ts +161 -0
  224. package/server/infrastructureRoute.test.ts +105 -0
  225. package/server/login.test.ts +153 -0
  226. package/server/login.ts +67 -0
  227. package/server/mcp.ts +278 -0
  228. package/server/migrateFlows.test.ts +55 -0
  229. package/server/migrateFlows.ts +23 -0
  230. package/server/mockHandler.test.ts +138 -0
  231. package/server/mockHandler.ts +52 -0
  232. package/server/mockRun.test.ts +367 -0
  233. package/server/mockServe.test.ts +467 -0
  234. package/server/nodesPayload.test.ts +29 -0
  235. package/server/nodesPayload.ts +26 -0
  236. package/server/normalizeFlow.test.ts +80 -0
  237. package/server/normalizeFlow.ts +59 -0
  238. package/server/openBrowser.test.ts +20 -0
  239. package/server/openBrowser.ts +22 -0
  240. package/server/operationResult.test.ts +67 -0
  241. package/server/operationResult.ts +27 -0
  242. package/server/pathGuard.test.ts +19 -0
  243. package/server/pathGuard.ts +12 -0
  244. package/server/pathSafety.test.ts +38 -0
  245. package/server/pathSafety.ts +33 -0
  246. package/server/projectConfig.test.ts +67 -0
  247. package/server/projectConfig.ts +101 -0
  248. package/server/projectMode.test.ts +106 -0
  249. package/server/projectMode.ts +59 -0
  250. package/server/redact.test.ts +88 -0
  251. package/server/redact.ts +35 -0
  252. package/server/redactEgress.test.ts +281 -0
  253. package/server/runRegistry.ts +270 -0
  254. package/server/runsAuth.test.ts +119 -0
  255. package/server/runtime/RuntimeAdapter.ts +24 -0
  256. package/server/runtime/expressAdapter.test.ts +38 -0
  257. package/server/runtime/expressAdapter.ts +70 -0
  258. package/server/scenarioTest.test.ts +148 -0
  259. package/server/scenarioTest.ts +88 -0
  260. package/server/setupStatus.test.ts +127 -0
  261. package/server/subflowRunner.ts +104 -0
  262. package/server/testRunner.ts +216 -0
  263. package/server/tsconfig.json +20 -0
  264. package/server/workflowTestRoute.test.ts +297 -0
  265. package/src/App.tsx +233 -0
  266. package/src/components/AgentConsole.tsx +461 -0
  267. package/src/components/BranchRulesEditor.tsx +156 -0
  268. package/src/components/CreateModal.tsx +275 -0
  269. package/src/components/Dock.tsx +487 -0
  270. package/src/components/EnvironmentDialog.tsx +569 -0
  271. package/src/components/EnvironmentPicker.tsx +357 -0
  272. package/src/components/EnvironmentsDialog.tsx +144 -0
  273. package/src/components/ExecutionPager.tsx +67 -0
  274. package/src/components/InfraPanel.test.tsx +103 -0
  275. package/src/components/InfraPanel.tsx +171 -0
  276. package/src/components/Inspector.tsx +1182 -0
  277. package/src/components/Json.tsx +50 -0
  278. package/src/components/JsonModal.tsx +52 -0
  279. package/src/components/LogMessage.tsx +61 -0
  280. package/src/components/NodeRunModal.tsx +213 -0
  281. package/src/components/RunLogPanel.tsx +397 -0
  282. package/src/components/RunbookView.tsx +1085 -0
  283. package/src/components/Scenarios.tsx +476 -0
  284. package/src/components/SettingsDialog.tsx +229 -0
  285. package/src/components/Sidebar.tsx +436 -0
  286. package/src/components/StatusBar.tsx +302 -0
  287. package/src/components/Toolbar.tsx +663 -0
  288. package/src/components/WelcomeDialog.test.tsx +107 -0
  289. package/src/components/WelcomeDialog.tsx +412 -0
  290. package/src/components/agentMarkdown.test.tsx +91 -0
  291. package/src/components/agentMarkdown.tsx +158 -0
  292. package/src/components/ui/badge.tsx +31 -0
  293. package/src/components/ui/button.tsx +46 -0
  294. package/src/components/ui/combobox.tsx +114 -0
  295. package/src/components/ui/command.tsx +82 -0
  296. package/src/components/ui/dialog.tsx +73 -0
  297. package/src/components/ui/input.tsx +20 -0
  298. package/src/components/ui/popover.tsx +32 -0
  299. package/src/components/ui/resizable.tsx +44 -0
  300. package/src/components/ui/tabs.tsx +36 -0
  301. package/src/config.ts +4 -0
  302. package/src/engine/authVerify.ts +81 -0
  303. package/src/engine/diagnostics.test.ts +437 -0
  304. package/src/engine/diagnostics.ts +211 -0
  305. package/src/engine/executor.test.ts +1339 -0
  306. package/src/engine/executor.ts +840 -0
  307. package/src/engine/httpError.test.ts +12 -0
  308. package/src/engine/httpError.ts +16 -0
  309. package/src/engine/index.ts +11 -0
  310. package/src/engine/output.ts +21 -0
  311. package/src/engine/publish.test.ts +176 -0
  312. package/src/engine/publish.ts +127 -0
  313. package/src/engine/registry.test.ts +64 -0
  314. package/src/engine/registry.ts +80 -0
  315. package/src/engine/scenarios.test.ts +55 -0
  316. package/src/engine/scenarios.ts +29 -0
  317. package/src/engine/schemaCheck.test.ts +21 -0
  318. package/src/engine/schemaCheck.ts +35 -0
  319. package/src/engine/trace.test.ts +19 -0
  320. package/src/engine/trace.ts +23 -0
  321. package/src/engine/types.test.ts +22 -0
  322. package/src/engine/types.ts +316 -0
  323. package/src/engine/validation.test.ts +314 -0
  324. package/src/engine/validation.ts +354 -0
  325. package/src/flows/anomaly-flows.test.ts +81 -0
  326. package/src/flows/anomaly-flows.ts +202 -0
  327. package/src/flows/city-sweep-flow.ts +131 -0
  328. package/src/flows/flows.test.ts +30 -0
  329. package/src/flows/login-flow.ts +150 -0
  330. package/src/flows/pradar-flows.test.ts +204 -0
  331. package/src/flows/pradar-flows.ts +419 -0
  332. package/src/flows/weather-flow.ts +154 -0
  333. package/src/globals.css +147 -0
  334. package/src/lib/pathParams.test.ts +24 -0
  335. package/src/lib/pathParams.ts +6 -0
  336. package/src/lib/registerLens.test.ts +79 -0
  337. package/src/lib/registerLens.ts +59 -0
  338. package/src/lib/runbookModel.test.ts +61 -0
  339. package/src/lib/runbookModel.ts +290 -0
  340. package/src/lib/runbookProjection.test.ts +417 -0
  341. package/src/lib/runbookProjection.ts +254 -0
  342. package/src/lib/useTailAnchor.ts +53 -0
  343. package/src/lib/utils.ts +7 -0
  344. package/src/main.tsx +13 -0
  345. package/src/nodes/anomaly.test.ts +98 -0
  346. package/src/nodes/anomaly.ts +637 -0
  347. package/src/nodes/effects-scan.test.ts +44 -0
  348. package/src/nodes/flow-control.test.ts +280 -0
  349. package/src/nodes/flow-control.ts +305 -0
  350. package/src/nodes/index.ts +22 -0
  351. package/src/nodes/login.test.ts +81 -0
  352. package/src/nodes/login.ts +186 -0
  353. package/src/nodes/loops.ts +69 -0
  354. package/src/nodes/pradar/index.ts +11 -0
  355. package/src/nodes/pradar/logic.test.ts +288 -0
  356. package/src/nodes/pradar/logic.ts +582 -0
  357. package/src/nodes/pradar/nodes.test.ts +146 -0
  358. package/src/nodes/pradar/nodes.ts +955 -0
  359. package/src/nodes/requireAuth.test.ts +75 -0
  360. package/src/nodes/requireAuth.ts +55 -0
  361. package/src/nodes/response.test.ts +33 -0
  362. package/src/nodes/response.ts +39 -0
  363. package/src/nodes/traceDetail.test.ts +39 -0
  364. package/src/nodes/weather.test.ts +65 -0
  365. package/src/nodes/weather.ts +306 -0
  366. package/src/store/agentClient.test.ts +103 -0
  367. package/src/store/agentClient.ts +131 -0
  368. package/src/store/apiTree.test.ts +17 -0
  369. package/src/store/apiTree.ts +73 -0
  370. package/src/store/builderStore.test.ts +1234 -0
  371. package/src/store/builderStore.ts +1879 -0
  372. package/src/store/infraClient.ts +63 -0
  373. package/src/store/nodeMeta.test.ts +24 -0
  374. package/src/store/nodeMeta.ts +21 -0
  375. package/src/store/persistence.test.ts +15 -0
  376. package/src/store/persistence.ts +54 -0
  377. package/src/store/serverRunner.ts +381 -0
  378. package/src/store/setupClient.ts +57 -0
  379. package/studio-dist/assets/ibm-plex-mono-cyrillic-400-normal-BSMlKf0J.woff2 +0 -0
  380. package/studio-dist/assets/ibm-plex-mono-cyrillic-400-normal-CEL4l2ZJ.woff +0 -0
  381. package/studio-dist/assets/ibm-plex-mono-cyrillic-500-normal-Ael50iVv.woff +0 -0
  382. package/studio-dist/assets/ibm-plex-mono-cyrillic-500-normal-Bq9vWWag.woff2 +0 -0
  383. package/studio-dist/assets/ibm-plex-mono-cyrillic-ext-400-normal-DMdlQ8Kv.woff +0 -0
  384. package/studio-dist/assets/ibm-plex-mono-cyrillic-ext-400-normal-xuaO2J-f.woff2 +0 -0
  385. package/studio-dist/assets/ibm-plex-mono-cyrillic-ext-500-normal-BIfNGwUT.woff +0 -0
  386. package/studio-dist/assets/ibm-plex-mono-cyrillic-ext-500-normal-BqneJy0T.woff2 +0 -0
  387. package/studio-dist/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
  388. package/studio-dist/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
  389. package/studio-dist/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
  390. package/studio-dist/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
  391. package/studio-dist/assets/ibm-plex-mono-latin-ext-400-normal-BmRBH3aV.woff2 +0 -0
  392. package/studio-dist/assets/ibm-plex-mono-latin-ext-400-normal-D3D2R8hC.woff +0 -0
  393. package/studio-dist/assets/ibm-plex-mono-latin-ext-500-normal-CAhNIIs5.woff2 +0 -0
  394. package/studio-dist/assets/ibm-plex-mono-latin-ext-500-normal-CZ70TYgx.woff +0 -0
  395. package/studio-dist/assets/ibm-plex-mono-vietnamese-400-normal-BulugwFq.woff2 +0 -0
  396. package/studio-dist/assets/ibm-plex-mono-vietnamese-400-normal-DDuiU_S-.woff +0 -0
  397. package/studio-dist/assets/ibm-plex-mono-vietnamese-500-normal-C8zxqsMH.woff +0 -0
  398. package/studio-dist/assets/ibm-plex-mono-vietnamese-500-normal-DZ4AoWbu.woff2 +0 -0
  399. package/studio-dist/assets/index-DNJwW-hM.css +1 -0
  400. package/studio-dist/assets/index-O26dKRjW.js +65 -0
  401. package/studio-dist/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  402. package/studio-dist/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  403. package/studio-dist/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  404. package/studio-dist/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  405. package/studio-dist/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  406. package/studio-dist/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  407. package/studio-dist/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  408. package/studio-dist/favicon.svg +1 -0
  409. package/studio-dist/icons.svg +24 -0
  410. package/studio-dist/index.html +14 -0
  411. package/templates/skills/emberflow-basics/SKILL.md +316 -0
  412. package/templates/skills/emberflow-model-process/SKILL.md +209 -0
  413. package/templates/skills/emberflow-new-workflow/SKILL.md +211 -0
  414. package/templates/skills/emberflow-review-workflow/SKILL.md +148 -0
@@ -0,0 +1,50 @@
1
+ import { memo } from 'react';
2
+ import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter';
3
+ import { oneDark } from 'react-syntax-highlighter/dist/esm/styles/prism';
4
+ import { cn } from '@/lib/utils';
5
+
6
+ /**
7
+ * Shared read-only JSON display: pretty-printed and syntax-highlighted with
8
+ * the same Prism theme as the node-source code modal. Editors (scenario
9
+ * payloads, JSON config fields) stay plain textareas — this is display only.
10
+ */
11
+ export const Json = memo(function Json({
12
+ value,
13
+ className,
14
+ maxHeight,
15
+ variant = 'panel',
16
+ }: {
17
+ value: unknown;
18
+ className?: string;
19
+ maxHeight?: number;
20
+ /**
21
+ * 'panel' draws its own bordered card sized for compact dock/inspector use;
22
+ * 'preview' is bare — the canvas node's preview class provides the chrome;
23
+ * 'modal' is the same bordered card as 'panel' but scaled up for a
24
+ * fullscreen read (JsonModal), matching the node-source code modal's type scale.
25
+ */
26
+ variant?: 'panel' | 'preview' | 'modal';
27
+ }) {
28
+ const text = JSON.stringify(value, null, 2) ?? 'undefined';
29
+ return (
30
+ <div
31
+ className={cn(variant !== 'preview' && 'overflow-auto rounded-md border border-border bg-card', className)}
32
+ style={maxHeight ? { maxHeight } : undefined}
33
+ >
34
+ <SyntaxHighlighter
35
+ language="json"
36
+ style={oneDark}
37
+ customStyle={{
38
+ margin: 0,
39
+ padding: variant === 'preview' ? 0 : variant === 'modal' ? '14px' : '10px',
40
+ background: 'transparent',
41
+ fontSize: variant === 'modal' ? '13px' : variant === 'panel' ? '11.5px' : '10.5px',
42
+ lineHeight: variant === 'modal' ? 1.65 : variant === 'panel' ? 1.6 : 1.55,
43
+ }}
44
+ codeTagProps={{ style: { fontFamily: 'var(--font-mono, ui-monospace, monospace)' } }}
45
+ >
46
+ {text}
47
+ </SyntaxHighlighter>
48
+ </div>
49
+ );
50
+ });
@@ -0,0 +1,52 @@
1
+ import { useState } from 'react';
2
+ import { CheckIcon, CopyIcon } from 'lucide-react';
3
+ import { Button } from '@/components/ui/button';
4
+ import { Dialog, DialogContent, DialogTitle } from '@/components/ui/dialog';
5
+ import { Json } from './Json';
6
+
7
+ /**
8
+ * Fullscreen JSON viewer for a single value — display-node previews and dock
9
+ * I/O panes are deliberately small; this is where "too small to read" goes
10
+ * to get a real look, with a one-click copy of the pretty-printed text.
11
+ */
12
+ export function JsonModal({
13
+ title,
14
+ value,
15
+ open,
16
+ onOpenChange,
17
+ }: {
18
+ title: string;
19
+ value: unknown;
20
+ open: boolean;
21
+ onOpenChange: (open: boolean) => void;
22
+ }) {
23
+ const [copied, setCopied] = useState(false);
24
+
25
+ const handleCopy = () => {
26
+ navigator.clipboard.writeText(JSON.stringify(value, null, 2) ?? 'undefined');
27
+ setCopied(true);
28
+ setTimeout(() => setCopied(false), 1500);
29
+ };
30
+
31
+ return (
32
+ <Dialog open={open} onOpenChange={onOpenChange}>
33
+ <DialogContent className="max-w-[80vw] h-[85vh]">
34
+ <div className="flex items-center justify-between gap-2 pr-8">
35
+ <DialogTitle className="truncate">{title}</DialogTitle>
36
+ <Button
37
+ variant="ghost"
38
+ size="xs"
39
+ className="shrink-0 text-muted-foreground hover:text-foreground"
40
+ onClick={handleCopy}
41
+ >
42
+ {copied ? <CheckIcon className="text-success" /> : <CopyIcon />}
43
+ {copied ? 'Copied' : 'Copy'}
44
+ </Button>
45
+ </div>
46
+ <div className="min-h-0 flex-1">
47
+ <Json value={value} variant="modal" className="h-full" />
48
+ </div>
49
+ </DialogContent>
50
+ </Dialog>
51
+ );
52
+ }
@@ -0,0 +1,61 @@
1
+ import { useEffect, useMemo, useState } from 'react';
2
+ import { ChevronDownIcon, ChevronRightIcon } from 'lucide-react';
3
+ import { Json } from './Json';
4
+
5
+ /**
6
+ * Log message renderer: when a message embeds a JSON payload (engine nodes
7
+ * log `Some prefix: {...}`), the payload renders as a collapsible
8
+ * syntax-highlighted block under the prose instead of a wall of escaped
9
+ * text. Plain messages pass through untouched.
10
+ */
11
+
12
+ /** Split "prefix {json}" → { prefix, value } when the tail parses as JSON. */
13
+ export function splitJsonTail(message: string): { prefix: string; value: unknown } | null {
14
+ for (const opener of ['{', '[']) {
15
+ const at = message.indexOf(opener);
16
+ if (at === -1) continue;
17
+ const tail = message.slice(at).trim();
18
+ if (tail.length < 12) continue; // tiny fragments read fine inline
19
+ try {
20
+ const value = JSON.parse(tail);
21
+ if (value !== null && typeof value === 'object') {
22
+ return { prefix: message.slice(0, at).trimEnd(), value };
23
+ }
24
+ } catch {
25
+ // fall through — try the other opener or give up
26
+ }
27
+ }
28
+ return null;
29
+ }
30
+
31
+ export function LogMessage({ message, defaultOpen = true }: { message: string; defaultOpen?: boolean }) {
32
+ const parsed = useMemo(() => splitJsonTail(message), [message]);
33
+ const [open, setOpen] = useState(defaultOpen);
34
+ // Register flips mid-session must apply to already-rendered lines, not just
35
+ // new ones — re-sync local open state whenever the caller's default changes.
36
+ useEffect(() => {
37
+ setOpen(defaultOpen);
38
+ }, [defaultOpen]);
39
+ if (!parsed) {
40
+ return <span className="min-w-0 whitespace-pre-wrap break-words text-muted-foreground">{message}</span>;
41
+ }
42
+ const Chevron = open ? ChevronDownIcon : ChevronRightIcon;
43
+ return (
44
+ <span className="min-w-0 flex-1">
45
+ <button
46
+ type="button"
47
+ onClick={() => setOpen((o) => !o)}
48
+ className="inline-flex cursor-pointer items-baseline gap-1 text-left text-muted-foreground transition-colors hover:text-foreground"
49
+ aria-expanded={open}
50
+ >
51
+ <Chevron className="size-3 shrink-0 self-center opacity-60" />
52
+ <span className="whitespace-pre-wrap break-words">{parsed.prefix || 'payload'}</span>
53
+ </button>
54
+ {open && (
55
+ <div className="mt-1 mb-0.5">
56
+ <Json value={parsed.value} maxHeight={240} />
57
+ </div>
58
+ )}
59
+ </span>
60
+ );
61
+ }
@@ -0,0 +1,213 @@
1
+ import { useEffect, useMemo, useState } from 'react';
2
+ import { Loader2Icon, PinIcon, PlayIcon } from 'lucide-react';
3
+ import { Badge } from '@/components/ui/badge';
4
+ import { Button } from '@/components/ui/button';
5
+ import { Combobox } from '@/components/ui/combobox';
6
+ import { Dialog, DialogContent, DialogDescription, DialogTitle } from '@/components/ui/dialog';
7
+ import { useBuilderStore } from '../store/builderStore';
8
+ import { fetchSamples } from '../store/serverRunner';
9
+ import { Json } from './Json';
10
+ import { cn } from '@/lib/utils';
11
+ import type { LogLine, NodeExecutionSample, WorkflowNode } from '../engine';
12
+
13
+ const levelColor: Record<string, string> = {
14
+ info: 'text-success',
15
+ debug: 'text-muted-foreground/60',
16
+ warn: 'text-yellow-500',
17
+ error: 'text-destructive',
18
+ };
19
+
20
+ interface RunResult {
21
+ output?: unknown;
22
+ error?: string;
23
+ logs: LogLine[];
24
+ }
25
+
26
+ export function NodeRunModal({
27
+ node,
28
+ open,
29
+ onOpenChange,
30
+ }: {
31
+ node: WorkflowNode;
32
+ open: boolean;
33
+ onOpenChange(open: boolean): void;
34
+ }) {
35
+ const trace = useBuilderStore((s) => s.trace);
36
+ const run = useBuilderStore((s) => s.run);
37
+ const runNodeIsolated = useBuilderStore((s) => s.runNodeIsolated);
38
+ const pinNodeOutput = useBuilderStore((s) => s.pinNodeOutput);
39
+
40
+ const [inputText, setInputText] = useState('{}');
41
+ const [sourceValue, setSourceValue] = useState('');
42
+ const [running, setRunning] = useState(false);
43
+ const [result, setResult] = useState<RunResult | null>(null);
44
+ const [pinnedThis, setPinnedThis] = useState(false);
45
+
46
+ const localSamples = useMemo(
47
+ () => (open ? trace.samplesFor(node.id) : []),
48
+ [open, trace, node.id],
49
+ );
50
+ const [samples, setSamples] = useState<NodeExecutionSample[]>([]);
51
+
52
+ useEffect(() => {
53
+ if (!open) {
54
+ setSamples(localSamples);
55
+ return;
56
+ }
57
+ if (!useBuilderStore.getState().runnerOnline) {
58
+ setSamples(localSamples);
59
+ return;
60
+ }
61
+ let cancelled = false;
62
+ fetchSamples(node.id).then((remote) => {
63
+ if (cancelled) return;
64
+ const byId = new Map<string, NodeExecutionSample>();
65
+ for (const sample of [...localSamples, ...remote]) byId.set(sample.id, sample);
66
+ const merged = [...byId.values()].sort(
67
+ (a, b) => new Date(b.startedAt).getTime() - new Date(a.startedAt).getTime(),
68
+ );
69
+ setSamples(merged);
70
+ });
71
+ return () => {
72
+ cancelled = true;
73
+ };
74
+ }, [open, node.id, localSamples]);
75
+
76
+ const lastRunInput = run?.nodeStates[node.id]?.input;
77
+
78
+ const sourceOptions = [
79
+ ...(lastRunInput !== undefined
80
+ ? [{ value: '__lastRun__', label: 'From last run' }]
81
+ : []),
82
+ ...samples.map((s) => ({
83
+ value: s.id,
84
+ label: `${new Date(s.startedAt).toLocaleTimeString()} · ${s.status}${s.runId.startsWith('isolated') ? ' · isolated' : ''}`,
85
+ group: 'Previous executions',
86
+ })),
87
+ ];
88
+
89
+ const applySource = (value: string) => {
90
+ setSourceValue(value);
91
+ if (value === '__lastRun__' && lastRunInput !== undefined) {
92
+ setInputText(JSON.stringify(lastRunInput, null, 2));
93
+ return;
94
+ }
95
+ const sample = samples.find((s) => s.id === value);
96
+ if (sample) setInputText(JSON.stringify(sample.input ?? {}, null, 2));
97
+ };
98
+
99
+ const execute = async () => {
100
+ let input: Record<string, unknown>;
101
+ try {
102
+ input = JSON.parse(inputText) as Record<string, unknown>;
103
+ } catch (err) {
104
+ setResult({ error: `Input is not valid JSON: ${err instanceof Error ? err.message : ''}`, logs: [] });
105
+ return;
106
+ }
107
+ setRunning(true);
108
+ setPinnedThis(false);
109
+ try {
110
+ setResult(await runNodeIsolated(node.id, input));
111
+ } finally {
112
+ setRunning(false);
113
+ }
114
+ };
115
+
116
+ const pinResult = () => {
117
+ if (result?.output === undefined) return;
118
+ pinNodeOutput(node.id, result.output);
119
+ setPinnedThis(true);
120
+ };
121
+
122
+ return (
123
+ <Dialog open={open} onOpenChange={onOpenChange}>
124
+ <DialogContent className="max-w-3xl">
125
+ <DialogTitle className="flex items-center gap-2">
126
+ Run node
127
+ <span className="text-muted-foreground">·</span> {node.label}
128
+ <Badge variant="mono">{node.type}</Badge>
129
+ </DialogTitle>
130
+ <DialogDescription>
131
+ Executes this node alone against the input below. The execution is captured as a
132
+ replayable sample.
133
+ </DialogDescription>
134
+
135
+ <div className="flex items-center gap-2">
136
+ <span className="text-[10px] font-medium uppercase tracking-widest text-muted-foreground">
137
+ Input
138
+ </span>
139
+ <div className="ml-auto w-72">
140
+ <Combobox
141
+ options={sourceOptions}
142
+ value={sourceValue}
143
+ onChange={applySource}
144
+ placeholder="Manual input"
145
+ searchPlaceholder="Search captured inputs…"
146
+ emptyText="No captured executions yet."
147
+ clearLabel="Manual input"
148
+ />
149
+ </div>
150
+ </div>
151
+ <textarea
152
+ value={inputText}
153
+ onChange={(e) => {
154
+ setInputText(e.target.value);
155
+ setSourceValue('');
156
+ }}
157
+ spellCheck={false}
158
+ rows={8}
159
+ className="w-full resize-y rounded-md border border-border bg-background p-3 font-mono text-[12px] leading-relaxed outline-none focus-visible:ring-ring/50 focus-visible:ring-[3px]"
160
+ />
161
+
162
+ <div className="flex items-center gap-2">
163
+ <Button size="sm" onClick={execute} disabled={running}>
164
+ {running ? <Loader2Icon className="animate-spin" /> : <PlayIcon />} Run node
165
+ </Button>
166
+ {result?.output !== undefined && (
167
+ <Button variant="secondary" size="sm" onClick={pinResult} disabled={pinnedThis}>
168
+ <PinIcon /> {pinnedThis ? 'Pinned' : 'Pin this output'}
169
+ </Button>
170
+ )}
171
+ </div>
172
+
173
+ {result && (
174
+ <div className="grid min-h-0 flex-1 grid-cols-2 gap-3 overflow-hidden">
175
+ <div className="min-h-0 overflow-auto">
176
+ <div className="mb-1.5 text-[10px] font-medium uppercase tracking-widest text-muted-foreground">
177
+ {result.error ? 'Error' : 'Output'}
178
+ </div>
179
+ {result.error ? (
180
+ <pre className="overflow-auto rounded-md border border-destructive/50 p-2.5 font-mono text-[11.5px] leading-relaxed whitespace-pre-wrap text-destructive-foreground">
181
+ {result.error}
182
+ </pre>
183
+ ) : (
184
+ <Json value={result.output} />
185
+ )}
186
+ </div>
187
+ <div className="min-h-0 overflow-auto">
188
+ <div className="mb-1.5 text-[10px] font-medium uppercase tracking-widest text-muted-foreground">
189
+ Logs
190
+ </div>
191
+ {result.logs.length === 0 && (
192
+ <div className="text-[12px] text-muted-foreground/60">No log output.</div>
193
+ )}
194
+ {result.logs.map((line, i) => (
195
+ <div key={i} className="flex items-baseline gap-2 py-0.5 font-mono text-[11px]">
196
+ <span
197
+ className={cn(
198
+ 'w-10 shrink-0 text-[9.5px] uppercase tracking-wider',
199
+ levelColor[line.level],
200
+ )}
201
+ >
202
+ {line.level}
203
+ </span>
204
+ <span className="text-muted-foreground">{line.message}</span>
205
+ </div>
206
+ ))}
207
+ </div>
208
+ </div>
209
+ )}
210
+ </DialogContent>
211
+ </Dialog>
212
+ );
213
+ }