@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,158 @@
1
+ import type { ReactNode } from 'react';
2
+
3
+ /**
4
+ * A tiny, dependency-free markdown SUBSET renderer for agent replies.
5
+ *
6
+ * Supports: **bold**, *italic*, `inline code`, fenced ``` code blocks,
7
+ * #/##/### headings (rendered as slightly-bolder text, NOT giant), `-` and
8
+ * `1.` lists (flat only), and blank-line-separated paragraphs. Anything it
9
+ * doesn't recognise — including malformed markers like an unclosed `**` — is
10
+ * passed through as literal text.
11
+ *
12
+ * Deliberately NOT a full markdown engine and NOT `dangerouslySetInnerHTML`:
13
+ * it returns a React element tree, so there is no HTML-injection surface. The
14
+ * classes reuse the AgentConsole panel's existing tokens (small type, muted
15
+ * foreground, the same code-block treatment as the command output <pre>s).
16
+ */
17
+
18
+ /** Split inline text into React nodes, handling `code`, **bold**, *italic*.
19
+ * Unmatched/malformed markers stay literal. Nesting is not supported (flat). */
20
+ function parseInline(text: string, keyPrefix: string): ReactNode[] {
21
+ // Alternation order matters: code spans first (their content is literal),
22
+ // then bold (**…**) before italic (*…*) so the double-star wins.
23
+ const pattern = /(`[^`]+`)|(\*\*[^*]+?\*\*)|(\*[^*]+?\*)/g;
24
+ const nodes: ReactNode[] = [];
25
+ let last = 0;
26
+ let match: RegExpExecArray | null;
27
+ let i = 0;
28
+ while ((match = pattern.exec(text)) !== null) {
29
+ if (match.index > last) nodes.push(text.slice(last, match.index));
30
+ const token = match[0];
31
+ const key = `${keyPrefix}-${i++}`;
32
+ if (token.startsWith('`')) {
33
+ nodes.push(
34
+ <code key={key} className="rounded bg-background/60 px-1 py-0.5 font-mono text-[11px] text-foreground/90">
35
+ {token.slice(1, -1)}
36
+ </code>,
37
+ );
38
+ } else if (token.startsWith('**')) {
39
+ nodes.push(
40
+ <strong key={key} className="font-semibold text-foreground">
41
+ {token.slice(2, -2)}
42
+ </strong>,
43
+ );
44
+ } else {
45
+ nodes.push(
46
+ <em key={key} className="italic">
47
+ {token.slice(1, -1)}
48
+ </em>,
49
+ );
50
+ }
51
+ last = pattern.lastIndex;
52
+ }
53
+ if (last < text.length) nodes.push(text.slice(last));
54
+ return nodes;
55
+ }
56
+
57
+ const HEADING = /^(#{1,3})\s+(.*)$/;
58
+ const UL_ITEM = /^[-*]\s+(.+)$/;
59
+ const OL_ITEM = /^\d+\.\s+(.+)$/;
60
+
61
+ /** Convert a markdown subset string to a flat list of block React elements. */
62
+ export function renderAgentMarkdown(source: string): ReactNode[] {
63
+ const lines = source.replace(/\r\n/g, '\n').split('\n');
64
+ const blocks: ReactNode[] = [];
65
+ let key = 0;
66
+ let paragraph: string[] = [];
67
+
68
+ const flushParagraph = (): void => {
69
+ if (paragraph.length === 0) return;
70
+ const text = paragraph.join(' ');
71
+ blocks.push(
72
+ <p key={`p-${key++}`} className="text-[12.5px] leading-relaxed text-foreground/90">
73
+ {parseInline(text, `p${key}`)}
74
+ </p>,
75
+ );
76
+ paragraph = [];
77
+ };
78
+
79
+ for (let i = 0; i < lines.length; i++) {
80
+ const line = lines[i];
81
+
82
+ // Fenced code block: everything until the closing fence is literal.
83
+ if (/^```/.test(line.trim())) {
84
+ flushParagraph();
85
+ const body: string[] = [];
86
+ i++;
87
+ while (i < lines.length && !/^```/.test(lines[i].trim())) {
88
+ body.push(lines[i]);
89
+ i++;
90
+ }
91
+ blocks.push(
92
+ <pre
93
+ key={`code-${key++}`}
94
+ className="my-1 overflow-x-auto rounded border border-border/50 bg-background/40 p-2 font-mono text-[11px] leading-relaxed text-foreground/85"
95
+ >
96
+ {body.join('\n')}
97
+ </pre>,
98
+ );
99
+ continue;
100
+ }
101
+
102
+ // Blank line → paragraph boundary.
103
+ if (line.trim() === '') {
104
+ flushParagraph();
105
+ continue;
106
+ }
107
+
108
+ // Heading.
109
+ const heading = HEADING.exec(line);
110
+ if (heading) {
111
+ flushParagraph();
112
+ const level = heading[1].length;
113
+ const size = level === 1 ? 'text-[13.5px]' : level === 2 ? 'text-[13px]' : 'text-[12.5px]';
114
+ blocks.push(
115
+ <p key={`h-${key++}`} className={`mt-1 font-semibold text-foreground ${size}`}>
116
+ {parseInline(heading[2], `h${key}`)}
117
+ </p>,
118
+ );
119
+ continue;
120
+ }
121
+
122
+ // Lists: gather consecutive items of the same kind into one <ul>/<ol>.
123
+ if (UL_ITEM.test(line) || OL_ITEM.test(line)) {
124
+ flushParagraph();
125
+ const ordered = OL_ITEM.test(line);
126
+ const re = ordered ? OL_ITEM : UL_ITEM;
127
+ const items: string[] = [];
128
+ while (i < lines.length && re.test(lines[i])) {
129
+ items.push(re.exec(lines[i])![1]);
130
+ i++;
131
+ }
132
+ i--; // step back; the outer loop will advance.
133
+ const listKey = key++;
134
+ const children = items.map((item, idx) => (
135
+ <li key={idx} className="pl-0.5">
136
+ {parseInline(item, `li${listKey}-${idx}`)}
137
+ </li>
138
+ ));
139
+ blocks.push(
140
+ ordered ? (
141
+ <ol key={`ol-${listKey}`} className="ml-4 list-decimal space-y-0.5 text-[12.5px] leading-relaxed text-foreground/90">
142
+ {children}
143
+ </ol>
144
+ ) : (
145
+ <ul key={`ul-${listKey}`} className="ml-4 list-disc space-y-0.5 text-[12.5px] leading-relaxed text-foreground/90">
146
+ {children}
147
+ </ul>
148
+ ),
149
+ );
150
+ continue;
151
+ }
152
+
153
+ // Plain prose line → accumulate into the current paragraph.
154
+ paragraph.push(line);
155
+ }
156
+ flushParagraph();
157
+ return blocks;
158
+ }
@@ -0,0 +1,31 @@
1
+ import * as React from 'react';
2
+ import { cva } from 'class-variance-authority';
3
+ import type { VariantProps } from 'class-variance-authority';
4
+ import { cn } from '@/lib/utils';
5
+
6
+ const badgeVariants = cva(
7
+ 'inline-flex items-center justify-center rounded-sm border px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wider w-fit whitespace-nowrap shrink-0 gap-1',
8
+ {
9
+ variants: {
10
+ variant: {
11
+ default: 'border-transparent bg-secondary text-secondary-foreground',
12
+ highlight: 'border-transparent bg-highlight/15 text-highlight',
13
+ success: 'border-transparent bg-success/15 text-success',
14
+ destructive: 'border-transparent bg-destructive/15 text-destructive-foreground',
15
+ outline: 'text-muted-foreground',
16
+ mono: 'border-border bg-tertiary font-mono normal-case tracking-normal text-muted-foreground',
17
+ },
18
+ },
19
+ defaultVariants: { variant: 'default' },
20
+ },
21
+ );
22
+
23
+ function Badge({
24
+ className,
25
+ variant,
26
+ ...props
27
+ }: React.ComponentProps<'span'> & VariantProps<typeof badgeVariants>) {
28
+ return <span className={cn(badgeVariants({ variant }), className)} {...props} />;
29
+ }
30
+
31
+ export { Badge, badgeVariants };
@@ -0,0 +1,46 @@
1
+ import * as React from 'react';
2
+ import { Slot } from '@radix-ui/react-slot';
3
+ import { cva } from 'class-variance-authority';
4
+ import type { VariantProps } from 'class-variance-authority';
5
+ import { cn } from '@/lib/utils';
6
+
7
+ const buttonVariants = cva(
8
+ "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-[13px] font-medium transition-colors disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:ring-ring/50 focus-visible:ring-[3px] cursor-pointer",
9
+ {
10
+ variants: {
11
+ variant: {
12
+ default: 'bg-primary text-primary-foreground hover:bg-primary/90',
13
+ destructive: 'bg-destructive text-white hover:bg-destructive/90',
14
+ outline: 'border border-input bg-transparent hover:bg-accent hover:text-accent-foreground',
15
+ secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/80',
16
+ ghost: 'hover:bg-accent hover:text-accent-foreground',
17
+ link: 'text-highlight underline-offset-4 hover:underline',
18
+ },
19
+ size: {
20
+ default: 'h-8 px-3 py-2',
21
+ sm: 'h-7 rounded-md gap-1.5 px-2.5',
22
+ xs: 'h-6 rounded-md gap-1 px-2 text-xs',
23
+ lg: 'h-10 rounded-md px-6',
24
+ icon: 'size-8',
25
+ },
26
+ },
27
+ defaultVariants: {
28
+ variant: 'default',
29
+ size: 'default',
30
+ },
31
+ },
32
+ );
33
+
34
+ function Button({
35
+ className,
36
+ variant,
37
+ size,
38
+ asChild = false,
39
+ ...props
40
+ }: React.ComponentProps<'button'> &
41
+ VariantProps<typeof buttonVariants> & { asChild?: boolean }) {
42
+ const Comp = asChild ? Slot : 'button';
43
+ return <Comp className={cn(buttonVariants({ variant, size, className }))} {...props} />;
44
+ }
45
+
46
+ export { Button, buttonVariants };
@@ -0,0 +1,114 @@
1
+ import * as React from 'react';
2
+ import { CheckIcon, ChevronsUpDownIcon } from 'lucide-react';
3
+ import { Button } from '@/components/ui/button';
4
+ import {
5
+ Command,
6
+ CommandEmpty,
7
+ CommandGroup,
8
+ CommandInput,
9
+ CommandItem,
10
+ CommandList,
11
+ } from '@/components/ui/command';
12
+ import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';
13
+ import { cn } from '@/lib/utils';
14
+
15
+ export interface ComboboxOption {
16
+ value: string;
17
+ label: string;
18
+ /** Optional group heading. Options with the same group render together. */
19
+ group?: string;
20
+ }
21
+
22
+ interface ComboboxProps {
23
+ options: ComboboxOption[];
24
+ value: string;
25
+ onChange: (value: string) => void;
26
+ placeholder?: string;
27
+ searchPlaceholder?: string;
28
+ emptyText?: string;
29
+ /** Label shown for the empty-string option; omit to disallow clearing. */
30
+ clearLabel?: string;
31
+ className?: string;
32
+ }
33
+
34
+ /** Typeahead combobox: Popover + cmdk Command with text filtering. */
35
+ export function Combobox({
36
+ options,
37
+ value,
38
+ onChange,
39
+ placeholder = 'Select…',
40
+ searchPlaceholder = 'Search…',
41
+ emptyText = 'No match.',
42
+ clearLabel,
43
+ className,
44
+ }: ComboboxProps) {
45
+ const [open, setOpen] = React.useState(false);
46
+ const selected = options.find((o) => o.value === value);
47
+
48
+ const groups = new Map<string, ComboboxOption[]>();
49
+ for (const option of options) {
50
+ const key = option.group ?? '';
51
+ if (!groups.has(key)) groups.set(key, []);
52
+ groups.get(key)!.push(option);
53
+ }
54
+
55
+ const pick = (next: string) => {
56
+ onChange(next);
57
+ setOpen(false);
58
+ };
59
+
60
+ return (
61
+ <Popover open={open} onOpenChange={setOpen}>
62
+ <PopoverTrigger asChild>
63
+ <Button
64
+ variant="outline"
65
+ role="combobox"
66
+ aria-expanded={open}
67
+ className={cn(
68
+ 'h-8 w-full justify-between bg-input/30 px-2.5 font-normal',
69
+ !selected && 'text-muted-foreground',
70
+ className,
71
+ )}
72
+ >
73
+ <span className="truncate">{selected ? selected.label : placeholder}</span>
74
+ <ChevronsUpDownIcon className="size-3.5 shrink-0 opacity-50" />
75
+ </Button>
76
+ </PopoverTrigger>
77
+ <PopoverContent className="w-(--radix-popover-trigger-width) min-w-56 p-0" align="start">
78
+ <Command>
79
+ <CommandInput placeholder={searchPlaceholder} />
80
+ <CommandList>
81
+ <CommandEmpty>{emptyText}</CommandEmpty>
82
+ {clearLabel !== undefined && (
83
+ <CommandGroup>
84
+ <CommandItem value="__clear__" onSelect={() => pick('')}>
85
+ <CheckIcon className={cn('size-3.5', value === '' ? 'opacity-100' : 'opacity-0')} />
86
+ <span className="text-muted-foreground">{clearLabel}</span>
87
+ </CommandItem>
88
+ </CommandGroup>
89
+ )}
90
+ {[...groups.entries()].map(([group, groupOptions]) => (
91
+ <CommandGroup key={group} heading={group || undefined}>
92
+ {groupOptions.map((option) => (
93
+ <CommandItem
94
+ key={option.value}
95
+ value={`${option.label} ${option.value}`}
96
+ onSelect={() => pick(option.value)}
97
+ >
98
+ <CheckIcon
99
+ className={cn(
100
+ 'size-3.5',
101
+ value === option.value ? 'opacity-100' : 'opacity-0',
102
+ )}
103
+ />
104
+ <span className="truncate">{option.label}</span>
105
+ </CommandItem>
106
+ ))}
107
+ </CommandGroup>
108
+ ))}
109
+ </CommandList>
110
+ </Command>
111
+ </PopoverContent>
112
+ </Popover>
113
+ );
114
+ }
@@ -0,0 +1,82 @@
1
+ import * as React from 'react';
2
+ import { Command as CommandPrimitive } from 'cmdk';
3
+ import { SearchIcon } from 'lucide-react';
4
+ import { cn } from '@/lib/utils';
5
+
6
+ function Command({ className, ...props }: React.ComponentProps<typeof CommandPrimitive>) {
7
+ return (
8
+ <CommandPrimitive
9
+ className={cn(
10
+ 'flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground',
11
+ className,
12
+ )}
13
+ {...props}
14
+ />
15
+ );
16
+ }
17
+
18
+ function CommandInput({
19
+ className,
20
+ ...props
21
+ }: React.ComponentProps<typeof CommandPrimitive.Input>) {
22
+ return (
23
+ <div className="flex h-9 items-center gap-2 border-b border-border px-3">
24
+ <SearchIcon className="size-3.5 shrink-0 text-muted-foreground" />
25
+ <CommandPrimitive.Input
26
+ className={cn(
27
+ 'flex h-9 w-full bg-transparent py-3 text-[13px] outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50',
28
+ className,
29
+ )}
30
+ {...props}
31
+ />
32
+ </div>
33
+ );
34
+ }
35
+
36
+ function CommandList({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.List>) {
37
+ return (
38
+ <CommandPrimitive.List
39
+ className={cn('max-h-72 overflow-x-hidden overflow-y-auto p-1', className)}
40
+ {...props}
41
+ />
42
+ );
43
+ }
44
+
45
+ function CommandEmpty(props: React.ComponentProps<typeof CommandPrimitive.Empty>) {
46
+ return (
47
+ <CommandPrimitive.Empty
48
+ className="py-5 text-center text-[12.5px] text-muted-foreground"
49
+ {...props}
50
+ />
51
+ );
52
+ }
53
+
54
+ function CommandGroup({
55
+ className,
56
+ ...props
57
+ }: React.ComponentProps<typeof CommandPrimitive.Group>) {
58
+ return (
59
+ <CommandPrimitive.Group
60
+ className={cn(
61
+ 'overflow-hidden text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-[10px] [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:uppercase [&_[cmdk-group-heading]]:tracking-wider [&_[cmdk-group-heading]]:text-muted-foreground',
62
+ className,
63
+ )}
64
+ {...props}
65
+ />
66
+ );
67
+ }
68
+
69
+ function CommandItem({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.Item>) {
70
+ return (
71
+ <CommandPrimitive.Item
72
+ className={cn(
73
+ 'relative flex cursor-pointer items-center gap-2 rounded-sm px-2 py-1.5 text-[12.5px] outline-none select-none',
74
+ "data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 [&_svg:not([class*='size-'])]:size-3.5 [&_svg]:shrink-0 [&_svg]:text-muted-foreground",
75
+ className,
76
+ )}
77
+ {...props}
78
+ />
79
+ );
80
+ }
81
+
82
+ export { Command, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem };
@@ -0,0 +1,73 @@
1
+ import * as React from 'react';
2
+ import * as DialogPrimitive from '@radix-ui/react-dialog';
3
+ import { XIcon } from 'lucide-react';
4
+ import { cn } from '@/lib/utils';
5
+
6
+ const Dialog = DialogPrimitive.Root;
7
+ const DialogTrigger = DialogPrimitive.Trigger;
8
+ const DialogClose = DialogPrimitive.Close;
9
+
10
+ function DialogOverlay({
11
+ className,
12
+ ...props
13
+ }: React.ComponentProps<typeof DialogPrimitive.Overlay>) {
14
+ return (
15
+ <DialogPrimitive.Overlay
16
+ className={cn(
17
+ 'fixed inset-0 z-50 bg-black/60 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=closed]:animate-out data-[state=closed]:fade-out-0',
18
+ className,
19
+ )}
20
+ {...props}
21
+ />
22
+ );
23
+ }
24
+
25
+ function DialogContent({
26
+ className,
27
+ children,
28
+ ...props
29
+ }: React.ComponentProps<typeof DialogPrimitive.Content>) {
30
+ return (
31
+ <DialogPrimitive.Portal>
32
+ <DialogOverlay />
33
+ <DialogPrimitive.Content
34
+ className={cn(
35
+ 'fixed top-1/2 left-1/2 z-50 flex max-h-[85vh] w-full max-w-3xl -translate-x-1/2 -translate-y-1/2 flex-col gap-3 rounded-lg border border-border bg-popover p-5 shadow-lg outline-none',
36
+ 'data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95',
37
+ 'data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95',
38
+ className,
39
+ )}
40
+ {...props}
41
+ >
42
+ {children}
43
+ <DialogPrimitive.Close className="absolute top-4 right-4 rounded-sm text-muted-foreground opacity-70 transition-opacity outline-none hover:opacity-100 focus-visible:ring-ring/50 focus-visible:ring-[3px]">
44
+ <XIcon className="size-4" />
45
+ <span className="sr-only">Close</span>
46
+ </DialogPrimitive.Close>
47
+ </DialogPrimitive.Content>
48
+ </DialogPrimitive.Portal>
49
+ );
50
+ }
51
+
52
+ function DialogTitle({ className, ...props }: React.ComponentProps<typeof DialogPrimitive.Title>) {
53
+ return (
54
+ <DialogPrimitive.Title
55
+ className={cn('text-[15px] font-semibold tracking-tight', className)}
56
+ {...props}
57
+ />
58
+ );
59
+ }
60
+
61
+ function DialogDescription({
62
+ className,
63
+ ...props
64
+ }: React.ComponentProps<typeof DialogPrimitive.Description>) {
65
+ return (
66
+ <DialogPrimitive.Description
67
+ className={cn('text-[12.5px] text-muted-foreground', className)}
68
+ {...props}
69
+ />
70
+ );
71
+ }
72
+
73
+ export { Dialog, DialogTrigger, DialogClose, DialogContent, DialogTitle, DialogDescription };
@@ -0,0 +1,20 @@
1
+ import * as React from 'react';
2
+ import { cn } from '@/lib/utils';
3
+
4
+ function Input({ className, type, ...props }: React.ComponentProps<'input'>) {
5
+ return (
6
+ <input
7
+ type={type}
8
+ className={cn(
9
+ 'flex h-8 w-full min-w-0 rounded-md border border-input bg-input/30 px-2.5 py-1 text-[13px] text-foreground shadow-xs transition-colors outline-none',
10
+ 'placeholder:text-muted-foreground selection:bg-highlight selection:text-highlight-foreground',
11
+ 'focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]',
12
+ 'disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50',
13
+ className,
14
+ )}
15
+ {...props}
16
+ />
17
+ );
18
+ }
19
+
20
+ export { Input };
@@ -0,0 +1,32 @@
1
+ import * as React from 'react';
2
+ import * as PopoverPrimitive from '@radix-ui/react-popover';
3
+ import { cn } from '@/lib/utils';
4
+
5
+ const Popover = PopoverPrimitive.Root;
6
+ const PopoverTrigger = PopoverPrimitive.Trigger;
7
+ const PopoverAnchor = PopoverPrimitive.Anchor;
8
+
9
+ function PopoverContent({
10
+ className,
11
+ align = 'center',
12
+ sideOffset = 4,
13
+ ...props
14
+ }: React.ComponentProps<typeof PopoverPrimitive.Content>) {
15
+ return (
16
+ <PopoverPrimitive.Portal>
17
+ <PopoverPrimitive.Content
18
+ align={align}
19
+ sideOffset={sideOffset}
20
+ className={cn(
21
+ 'z-50 w-72 rounded-md border border-border bg-popover p-0 text-popover-foreground shadow-lg outline-none',
22
+ 'data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95',
23
+ 'data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95',
24
+ className,
25
+ )}
26
+ {...props}
27
+ />
28
+ </PopoverPrimitive.Portal>
29
+ );
30
+ }
31
+
32
+ export { Popover, PopoverTrigger, PopoverContent, PopoverAnchor };
@@ -0,0 +1,44 @@
1
+ import { GripVerticalIcon } from 'lucide-react';
2
+ import * as ResizablePrimitive from 'react-resizable-panels';
3
+ import { cn } from '@/lib/utils';
4
+
5
+ function ResizablePanelGroup({
6
+ className,
7
+ ...props
8
+ }: React.ComponentProps<typeof ResizablePrimitive.PanelGroup>) {
9
+ return (
10
+ <ResizablePrimitive.PanelGroup
11
+ className={cn('flex h-full w-full data-[panel-group-direction=vertical]:flex-col', className)}
12
+ {...props}
13
+ />
14
+ );
15
+ }
16
+
17
+ const ResizablePanel = ResizablePrimitive.Panel;
18
+
19
+ function ResizableHandle({
20
+ withHandle,
21
+ className,
22
+ ...props
23
+ }: React.ComponentProps<typeof ResizablePrimitive.PanelResizeHandle> & {
24
+ withHandle?: boolean;
25
+ }) {
26
+ return (
27
+ <ResizablePrimitive.PanelResizeHandle
28
+ className={cn(
29
+ 'relative flex w-px items-center justify-center bg-border after:absolute after:inset-y-0 after:left-1/2 after:w-1.5 after:-translate-x-1/2 hover:bg-ring data-[resize-handle-state=drag]:bg-highlight',
30
+ 'data-[panel-group-direction=vertical]:h-px data-[panel-group-direction=vertical]:w-full data-[panel-group-direction=vertical]:after:left-0 data-[panel-group-direction=vertical]:after:h-1.5 data-[panel-group-direction=vertical]:after:w-full data-[panel-group-direction=vertical]:after:translate-x-0 data-[panel-group-direction=vertical]:after:-translate-y-1/2 data-[panel-group-direction=vertical]:after:top-1/2',
31
+ className,
32
+ )}
33
+ {...props}
34
+ >
35
+ {withHandle && (
36
+ <div className="z-10 flex h-4 w-3 items-center justify-center rounded-xs border border-border bg-secondary">
37
+ <GripVerticalIcon className="size-2.5 text-muted-foreground" />
38
+ </div>
39
+ )}
40
+ </ResizablePrimitive.PanelResizeHandle>
41
+ );
42
+ }
43
+
44
+ export { ResizablePanelGroup, ResizablePanel, ResizableHandle };
@@ -0,0 +1,36 @@
1
+ import * as React from 'react';
2
+ import * as TabsPrimitive from '@radix-ui/react-tabs';
3
+ import { cn } from '@/lib/utils';
4
+
5
+ function Tabs({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Root>) {
6
+ return <TabsPrimitive.Root className={cn('flex flex-col', className)} {...props} />;
7
+ }
8
+
9
+ function TabsList({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.List>) {
10
+ return (
11
+ <TabsPrimitive.List
12
+ className={cn('inline-flex items-center gap-1 border-b border-border px-3', className)}
13
+ {...props}
14
+ />
15
+ );
16
+ }
17
+
18
+ function TabsTrigger({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Trigger>) {
19
+ return (
20
+ <TabsPrimitive.Trigger
21
+ className={cn(
22
+ 'inline-flex items-center gap-1.5 border-b-2 border-transparent px-3 py-2 text-[12.5px] font-medium text-muted-foreground transition-colors outline-none cursor-pointer',
23
+ 'hover:text-foreground focus-visible:ring-ring/50 focus-visible:ring-[3px]',
24
+ 'data-[state=active]:border-highlight data-[state=active]:text-foreground',
25
+ className,
26
+ )}
27
+ {...props}
28
+ />
29
+ );
30
+ }
31
+
32
+ function TabsContent({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Content>) {
33
+ return <TabsPrimitive.Content className={cn('flex-1 outline-none', className)} {...props} />;
34
+ }
35
+
36
+ export { Tabs, TabsList, TabsTrigger, TabsContent };
package/src/config.ts ADDED
@@ -0,0 +1,4 @@
1
+ // src/config.ts — the `emberflow` package root: what a consumer's emberflow.config imports.
2
+ export { defineConfig } from '../server/projectConfig';
3
+ export type { EmberflowUserConfig } from '../server/projectConfig';
4
+ export type { NodeRegistry, NodeDefinition, NodeExecutionContext } from './engine';