@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,275 @@
1
+ import { useEffect, useRef, useState } from 'react';
2
+ import { FolderIcon, SparklesIcon } from 'lucide-react';
3
+ import { Button } from '@/components/ui/button';
4
+ import { Input } from '@/components/ui/input';
5
+ import { Command, CommandEmpty, CommandGroup, CommandItem, CommandList } from '@/components/ui/command';
6
+ import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';
7
+ import { Dialog, DialogContent, DialogTitle } from '@/components/ui/dialog';
8
+ import { useBuilderStore } from '../store/builderStore';
9
+ import { cn } from '@/lib/utils';
10
+
11
+ /** lowercase, spaces -> '-', strip anything not URL-safe (matches builderStore.slug). */
12
+ function slug(name: string): string {
13
+ return name.trim().toLowerCase().replace(/\s+/g, '-').replace(/[^a-z0-9-]/g, '');
14
+ }
15
+
16
+ // Words that add no meaning to an operation's derived name/route.
17
+ const STOP = new Set([
18
+ 'a', 'an', 'the', 'and', 'to', 'for', 'of', 'that', 'with', 'from', 'on', 'in', 'into',
19
+ 'your', 'my', 'me', 'it', 'create', 'make', 'build', 'add', 'new', 'return', 'get',
20
+ ]);
21
+ // Read-ish verbs → a GET route; everything else defaults to POST.
22
+ const GET_VERB = /^(list|get|look\s?up|fetch|find|show|read|search|retrieve|view)\b/i;
23
+
24
+ /** Derive a first-guess operation name + method + path from the plain-language
25
+ * goal, so the create flow can stand up a real, selectable stub immediately.
26
+ * The agent (and the Inspector) can refine any of it afterwards. */
27
+ function deriveOperation(goal: string, location: string): { name: string; method: string; httpPath: string } {
28
+ const words = goal
29
+ .toLowerCase()
30
+ .replace(/[^a-z0-9\s]/g, ' ')
31
+ .split(/\s+/)
32
+ .filter((w) => w.length > 1 && !STOP.has(w))
33
+ .slice(0, 4);
34
+ const opSlug = words.join('-') || 'operation';
35
+ const name = words.length
36
+ ? words.map((w) => w[0].toUpperCase() + w.slice(1)).join(' ')
37
+ : 'New Operation';
38
+ const method = GET_VERB.test(goal.trim()) ? 'GET' : 'POST';
39
+ return { name, method, httpPath: `/${location}/${opSlug}` };
40
+ }
41
+
42
+ /** Configures the two entry points that share this modal. */
43
+ export type CreateModalState =
44
+ | { mode: 'api' }
45
+ | { mode: 'operation'; location?: string }; // location preset scopes it to an API (from the + hover)
46
+
47
+ const OPERATION_EXAMPLES = [
48
+ 'List overdue invoices for a customer',
49
+ 'Charge a saved card and return the receipt',
50
+ 'Webhook that verifies a Stripe event',
51
+ ];
52
+ const API_EXAMPLES = [
53
+ 'Create a draft invoice',
54
+ 'Look up a customer by email',
55
+ 'Start a background export job',
56
+ ];
57
+
58
+ /**
59
+ * The agentic create surface — one centered modal for both "New API" (name +
60
+ * its first operation) and "New operation" (scoped to an API, or with a
61
+ * location picker). Describe the goal in plain language; the agent picks the
62
+ * method/path/nodes and builds it. Streams into the AgentConsole on submit.
63
+ */
64
+ export function CreateModal({
65
+ state,
66
+ onOpenChange,
67
+ locations,
68
+ }: {
69
+ state: CreateModalState | null;
70
+ onOpenChange: (open: boolean) => void;
71
+ locations: string[];
72
+ }) {
73
+ const createAndBuild = useBuilderStore((s) => s.createAndBuild);
74
+ const agentRunning = useBuilderStore((s) => s.agentRun?.status === 'running');
75
+
76
+ const [apiName, setApiName] = useState('');
77
+ const [goal, setGoal] = useState('');
78
+ const [location, setLocation] = useState('');
79
+ const [locationPickerOpen, setLocationPickerOpen] = useState(false);
80
+ const goalRef = useRef<HTMLTextAreaElement>(null);
81
+
82
+ const open = state !== null;
83
+ const mode = state?.mode ?? 'operation';
84
+ const presetLocation = state?.mode === 'operation' ? state.location : undefined;
85
+ const examples = mode === 'api' ? API_EXAMPLES : OPERATION_EXAMPLES;
86
+
87
+ // Reset fields each time the modal opens; seed the location from the preset.
88
+ useEffect(() => {
89
+ if (!open) return;
90
+ setApiName('');
91
+ setGoal('');
92
+ setLocation(presetLocation ?? '');
93
+ setLocationPickerOpen(false);
94
+ const t = setTimeout(() => goalRef.current?.focus(), 60);
95
+ return () => clearTimeout(t);
96
+ }, [open, presetLocation]);
97
+
98
+ const apiSlug = slug(apiName);
99
+ const targetLocation = mode === 'api' ? apiSlug : location.trim() || 'default';
100
+ const canSubmit =
101
+ !agentRunning && goal.trim().length > 0 && (mode === 'operation' || apiSlug.length > 0);
102
+
103
+ const submit = () => {
104
+ if (!canSubmit) return;
105
+ const { name, method, httpPath } = deriveOperation(goal.trim(), targetLocation);
106
+ // Stand up the stub + select it, then let the agent fill it in. The user
107
+ // sees the operation's name and route immediately, with a holding pattern
108
+ // on the canvas until the build completes.
109
+ void createAndBuild({ location: targetLocation, name, method, httpPath, goal: goal.trim() });
110
+ onOpenChange(false);
111
+ };
112
+
113
+ const scopedLabel = presetLocation; // operation launched from an API's + button
114
+
115
+ return (
116
+ <Dialog open={open} onOpenChange={onOpenChange}>
117
+ <DialogContent className="max-w-xl gap-0 p-0 overflow-hidden">
118
+ {/* Header */}
119
+ <div className="flex items-start gap-3 border-b border-border/60 px-5 py-4">
120
+ <span className="mt-0.5 flex size-8 shrink-0 items-center justify-center rounded-lg bg-highlight/15 text-highlight">
121
+ <SparklesIcon className="size-4" />
122
+ </span>
123
+ <div className="min-w-0">
124
+ <DialogTitle className="text-[15px]">
125
+ {mode === 'api' ? 'New API' : 'New operation'}
126
+ </DialogTitle>
127
+ <p className="mt-0.5 text-[12px] leading-relaxed text-muted-foreground">
128
+ {mode === 'api'
129
+ ? 'Name the API and describe its first operation — the agent builds it.'
130
+ : scopedLabel
131
+ ? 'Describe what this operation should do — the agent builds it.'
132
+ : 'Pick where it lives and describe what it should do.'}
133
+ </p>
134
+ </div>
135
+ </div>
136
+
137
+ <div className="flex flex-col gap-4 px-5 py-4">
138
+ {/* API name (api mode) */}
139
+ {mode === 'api' && (
140
+ <div className="flex flex-col gap-1.5">
141
+ <label className="text-[11px] font-medium uppercase tracking-wide text-muted-foreground">
142
+ API name
143
+ </label>
144
+ <Input
145
+ value={apiName}
146
+ onChange={(e) => setApiName(e.target.value)}
147
+ placeholder="e.g. Billing"
148
+ autoFocus
149
+ />
150
+ {apiName.trim() && (
151
+ <span className="font-mono text-[11px] text-muted-foreground">
152
+ → <span className="text-foreground/80">{apiSlug || '—'}</span>
153
+ </span>
154
+ )}
155
+ </div>
156
+ )}
157
+
158
+ {/* Target (operation mode) — a static chip when scoped, a picker otherwise */}
159
+ {mode === 'operation' &&
160
+ (scopedLabel ? (
161
+ <div className="flex items-center gap-2 text-[12px] text-muted-foreground">
162
+ <span>in</span>
163
+ <span className="inline-flex items-center gap-1.5 rounded-md border border-border/70 bg-secondary/40 px-2 py-1 font-mono text-[12px] text-foreground">
164
+ <FolderIcon className="size-3.5 text-muted-foreground" />
165
+ {scopedLabel}
166
+ </span>
167
+ </div>
168
+ ) : (
169
+ <div className="flex flex-col gap-1.5">
170
+ <label className="text-[11px] font-medium uppercase tracking-wide text-muted-foreground">
171
+ Location
172
+ </label>
173
+ <Popover open={locationPickerOpen} onOpenChange={setLocationPickerOpen}>
174
+ <PopoverTrigger asChild>
175
+ <Input
176
+ value={location}
177
+ onChange={(e) => setLocation(e.target.value)}
178
+ onFocus={() => setLocationPickerOpen(true)}
179
+ placeholder="e.g. billing/charges"
180
+ />
181
+ </PopoverTrigger>
182
+ {locations.length > 0 && (
183
+ <PopoverContent className="w-72 p-0" align="start" onOpenAutoFocus={(e) => e.preventDefault()}>
184
+ <Command>
185
+ <CommandList>
186
+ <CommandEmpty>No existing locations.</CommandEmpty>
187
+ <CommandGroup>
188
+ {locations
189
+ .filter((l) => l.toLowerCase().includes(location.toLowerCase()))
190
+ .map((l) => (
191
+ <CommandItem
192
+ key={l}
193
+ value={l}
194
+ onSelect={() => {
195
+ setLocation(l);
196
+ setLocationPickerOpen(false);
197
+ }}
198
+ >
199
+ <FolderIcon className="size-3.5" />
200
+ {l}
201
+ </CommandItem>
202
+ ))}
203
+ </CommandGroup>
204
+ </CommandList>
205
+ </Command>
206
+ </PopoverContent>
207
+ )}
208
+ </Popover>
209
+ </div>
210
+ ))}
211
+
212
+ {/* Goal */}
213
+ <div className="flex flex-col gap-1.5">
214
+ <label className="text-[11px] font-medium uppercase tracking-wide text-muted-foreground">
215
+ {mode === 'api' ? 'What should its first operation do?' : 'What should this operation do?'}
216
+ </label>
217
+ <textarea
218
+ ref={goalRef}
219
+ value={goal}
220
+ onChange={(e) => setGoal(e.target.value)}
221
+ onKeyDown={(e) => {
222
+ if ((e.metaKey || e.ctrlKey) && e.key === 'Enter') {
223
+ e.preventDefault();
224
+ submit();
225
+ }
226
+ }}
227
+ placeholder="Describe the goal in plain language — the agent picks the method, path, and nodes."
228
+ rows={5}
229
+ className={cn(
230
+ 'w-full resize-none rounded-md border border-input bg-input/30 px-3 py-2.5 text-[13.5px] leading-relaxed text-foreground shadow-xs outline-none transition-colors',
231
+ 'placeholder:text-muted-foreground selection:bg-highlight selection:text-highlight-foreground',
232
+ 'focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50',
233
+ )}
234
+ />
235
+ {/* Example prompts */}
236
+ <div className="flex flex-wrap gap-1.5 pt-0.5">
237
+ <span className="text-[11px] text-muted-foreground/70">Try:</span>
238
+ {examples.map((ex) => (
239
+ <button
240
+ key={ex}
241
+ type="button"
242
+ onClick={() => {
243
+ setGoal(ex);
244
+ goalRef.current?.focus();
245
+ }}
246
+ className="rounded-full border border-border/60 px-2 py-0.5 text-[11px] text-muted-foreground transition-colors hover:border-highlight/50 hover:text-foreground"
247
+ >
248
+ {ex}
249
+ </button>
250
+ ))}
251
+ </div>
252
+ </div>
253
+ </div>
254
+
255
+ {/* Footer */}
256
+ <div className="flex items-center justify-between gap-3 border-t border-border/60 px-5 py-3.5">
257
+ <span className="text-[11px] text-muted-foreground">
258
+ {mode === 'operation' && !scopedLabel ? null : (
259
+ <>
260
+ Builds in{' '}
261
+ <span className="font-mono text-foreground/70">{targetLocation || '…'}</span>
262
+ </>
263
+ )}
264
+ </span>
265
+ <div className="flex items-center gap-2">
266
+ <span className="hidden text-[10px] text-muted-foreground/60 sm:inline">⌘⏎</span>
267
+ <Button size="sm" onClick={submit} disabled={!canSubmit}>
268
+ <SparklesIcon /> {agentRunning ? 'Agent running…' : 'Create with AI'}
269
+ </Button>
270
+ </div>
271
+ </div>
272
+ </DialogContent>
273
+ </Dialog>
274
+ );
275
+ }