@hotmeshio/long-tail 0.1.3 → 0.1.5

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 (615) hide show
  1. package/README.md +118 -173
  2. package/build/examples/seed.js +1 -1
  3. package/build/examples/workflows/basic-echo/activities.d.ts +2 -2
  4. package/build/examples/workflows/basic-echo/activities.js +7 -7
  5. package/build/examples/workflows/basic-echo/index.js +1 -1
  6. package/build/examples/workflows/kitchen-sink/index.js +2 -2
  7. package/build/index.d.ts +12 -10
  8. package/build/index.js +15 -12
  9. package/build/lib/db/index.d.ts +18 -0
  10. package/build/{services → lib}/db/index.js +9 -0
  11. package/build/{services → lib}/db/migrate.js +3 -3
  12. package/build/{services → lib}/telemetry/honeycomb.d.ts +2 -2
  13. package/build/{services → lib}/telemetry/honeycomb.js +2 -2
  14. package/build/modules/defaults.d.ts +2 -0
  15. package/build/modules/defaults.js +3 -1
  16. package/build/routes/controlplane.js +1 -1
  17. package/build/routes/dba.js +4 -0
  18. package/build/routes/docs.d.ts +2 -0
  19. package/build/routes/docs.js +87 -0
  20. package/build/routes/escalations/bulk.js +120 -202
  21. package/build/routes/escalations/resolve.js +1 -1
  22. package/build/routes/escalations/single.js +1 -1
  23. package/build/routes/files.js +1 -1
  24. package/build/routes/index.js +2 -0
  25. package/build/routes/insight.js +2 -1
  26. package/build/routes/mcp.js +3 -2
  27. package/build/routes/oauth.js +1 -1
  28. package/build/routes/settings.js +4 -4
  29. package/build/routes/workflows/discovery.js +3 -3
  30. package/build/routes/workflows/invocation.js +1 -1
  31. package/build/routes/yaml-workflows/crud.js +1 -1
  32. package/build/routes/yaml-workflows/deployment.js +25 -0
  33. package/build/services/auth/bot-api-key.js +1 -1
  34. package/build/services/auth/index.d.ts +4 -0
  35. package/build/services/auth/index.js +17 -0
  36. package/build/services/auth/service-token.js +1 -1
  37. package/build/services/config/provider.js +1 -1
  38. package/build/services/config/read.js +1 -1
  39. package/build/services/config/write.js +1 -1
  40. package/build/services/controlplane/index.js +3 -4
  41. package/build/services/controlplane/quorum-bridge.js +2 -2
  42. package/build/services/cron/index.js +4 -5
  43. package/build/services/dba.d.ts +4 -0
  44. package/build/services/dba.js +3 -6
  45. package/build/services/escalation/bulk.js +1 -1
  46. package/build/services/escalation/crud.js +1 -1
  47. package/build/services/escalation/queries.js +1 -1
  48. package/build/services/export/client.js +2 -5
  49. package/build/services/export/index.js +14 -2
  50. package/build/services/hotmesh-utils.js +1 -1
  51. package/build/services/iam/bots.js +6 -12
  52. package/build/services/iam/context.d.ts +1 -1
  53. package/build/services/iam/context.js +5 -5
  54. package/build/services/iam/credentials.js +1 -1
  55. package/build/services/iam/ephemeral.js +8 -15
  56. package/build/services/iam/principal.js +3 -10
  57. package/build/services/iam/resolve.js +1 -1
  58. package/build/services/iam/sql.d.ts +10 -0
  59. package/build/services/iam/sql.js +42 -0
  60. package/build/services/insight/index.d.ts +1 -0
  61. package/build/services/insight/index.js +4 -6
  62. package/build/services/interceptor/activities/escalation.js +1 -1
  63. package/build/services/interceptor/activities/task.js +9 -6
  64. package/build/services/interceptor/activities/workflow.js +4 -5
  65. package/build/services/interceptor/activity-interceptor.d.ts +1 -1
  66. package/build/services/interceptor/activity-interceptor.js +5 -5
  67. package/build/services/interceptor/completion.js +1 -1
  68. package/build/services/interceptor/escalation.js +1 -1
  69. package/build/services/interceptor/index.js +4 -4
  70. package/build/services/interceptor/lifecycle.js +1 -1
  71. package/build/services/maintenance/index.js +4 -5
  72. package/build/services/mcp/adapter.js +1 -16
  73. package/build/services/mcp/client/connection.d.ts +1 -1
  74. package/build/services/mcp/client/connection.js +2 -2
  75. package/build/services/mcp/client/tools.js +1 -1
  76. package/build/services/mcp/db-server/index.js +1 -1
  77. package/build/services/mcp/db-server/tools.js +17 -4
  78. package/build/services/mcp/db.js +1 -1
  79. package/build/services/mcp/playwright-server/index.js +1 -1
  80. package/build/services/mcp/playwright-server/lifecycle.js +1 -1
  81. package/build/services/mcp/playwright-server/schemas.d.ts +2 -2
  82. package/build/services/mcp/playwright-server/tools.js +1 -1
  83. package/build/services/mcp/register-tool.d.ts +11 -0
  84. package/build/services/mcp/register-tool.js +15 -0
  85. package/build/services/mcp/server.js +1 -1
  86. package/build/services/mcp/sql.d.ts +6 -0
  87. package/build/services/mcp/sql.js +34 -1
  88. package/build/services/mcp/workflow-compiler-server.js +1 -1
  89. package/build/services/mcp/workflow-server.js +1 -1
  90. package/build/services/mcp-runs/execution-builder.js +8 -6
  91. package/build/services/mcp-runs/queries.js +2 -2
  92. package/build/services/mcp-runs/sql.d.ts +4 -1
  93. package/build/services/mcp-runs/sql.js +23 -2
  94. package/build/services/namespace/index.js +1 -1
  95. package/build/services/oauth/db.js +9 -37
  96. package/build/services/oauth/index.js +1 -1
  97. package/build/services/oauth/providers/registry.js +1 -1
  98. package/build/services/oauth/sql.d.ts +7 -0
  99. package/build/services/oauth/sql.js +32 -0
  100. package/build/services/orchestrator/index.js +3 -3
  101. package/build/services/role/index.js +1 -1
  102. package/build/services/task/crud.js +1 -1
  103. package/build/services/task/process.js +1 -1
  104. package/build/services/task/resolve.js +1 -1
  105. package/build/services/user/auth.js +1 -1
  106. package/build/services/user/crud.js +1 -1
  107. package/build/services/user/rbac.js +1 -1
  108. package/build/services/user/roles.js +1 -1
  109. package/build/services/user/sql.d.ts +2 -0
  110. package/build/services/user/sql.js +3 -1
  111. package/build/services/yaml-workflow/db-utils.js +1 -1
  112. package/build/services/yaml-workflow/db.js +1 -1
  113. package/build/services/yaml-workflow/deployer-helpers.js +1 -1
  114. package/build/services/yaml-workflow/deployer.js +4 -4
  115. package/build/services/yaml-workflow/generator.js +1 -1
  116. package/build/services/yaml-workflow/input-analyzer-helpers.d.ts +6 -0
  117. package/build/services/yaml-workflow/input-analyzer-helpers.js +36 -7
  118. package/build/services/yaml-workflow/input-analyzer.js +16 -3
  119. package/build/services/yaml-workflow/pipeline/analyze.js +1 -1
  120. package/build/services/yaml-workflow/pipeline/build/dag.js +10 -5
  121. package/build/services/yaml-workflow/pipeline/compile/llm-call.js +1 -1
  122. package/build/services/yaml-workflow/pipeline/extract.js +5 -3
  123. package/build/services/yaml-workflow/pipeline/index.d.ts +5 -0
  124. package/build/services/yaml-workflow/pipeline/index.js +22 -0
  125. package/build/services/yaml-workflow/pipeline/validate.js +2 -2
  126. package/build/services/yaml-workflow/workers/callbacks.js +1 -1
  127. package/build/services/yaml-workflow/workers/events.js +2 -2
  128. package/build/services/yaml-workflow/workers/register.js +8 -8
  129. package/build/start/adapters.js +7 -7
  130. package/build/start/index.js +4 -4
  131. package/build/start/server.js +1 -1
  132. package/build/start/workers.d.ts +1 -2
  133. package/build/start/workers.js +8 -7
  134. package/build/system/activities/claude-code.js +1 -1
  135. package/build/system/activities/file-storage.js +1 -1
  136. package/build/system/activities/knowledge.d.ts +58 -0
  137. package/build/system/activities/knowledge.js +128 -0
  138. package/build/system/activities/sql.d.ts +9 -0
  139. package/build/system/activities/sql.js +41 -0
  140. package/build/system/activities/triage/context.js +1 -1
  141. package/build/system/activities/triage/discovery.d.ts +2 -14
  142. package/build/system/activities/triage/discovery.js +5 -161
  143. package/build/system/activities/triage/llm.d.ts +1 -8
  144. package/build/system/activities/triage/llm.js +2 -28
  145. package/build/system/activities/triage/tools.d.ts +1 -17
  146. package/build/system/activities/triage/tools.js +8 -167
  147. package/build/system/index.js +5 -4
  148. package/build/system/mcp-servers/admin/escalations.d.ts +5 -0
  149. package/build/system/mcp-servers/admin/escalations.js +149 -0
  150. package/build/system/mcp-servers/admin/index.d.ts +31 -0
  151. package/build/system/mcp-servers/admin/index.js +80 -0
  152. package/build/system/mcp-servers/admin/maintenance.d.ts +5 -0
  153. package/build/system/mcp-servers/admin/maintenance.js +58 -0
  154. package/build/system/mcp-servers/admin/mcp-servers.d.ts +5 -0
  155. package/build/system/mcp-servers/admin/mcp-servers.js +146 -0
  156. package/build/system/mcp-servers/admin/schemas.d.ts +411 -0
  157. package/build/system/mcp-servers/admin/schemas.js +177 -0
  158. package/build/system/mcp-servers/admin/tasks.d.ts +5 -0
  159. package/build/system/mcp-servers/admin/tasks.js +112 -0
  160. package/build/system/mcp-servers/admin/users.d.ts +5 -0
  161. package/build/system/mcp-servers/admin/users.js +167 -0
  162. package/build/system/mcp-servers/admin/workflow-config.d.ts +9 -0
  163. package/build/system/mcp-servers/admin/workflow-config.js +118 -0
  164. package/build/system/mcp-servers/admin/workflows.d.ts +6 -0
  165. package/build/system/mcp-servers/admin/workflows.js +138 -0
  166. package/build/system/mcp-servers/admin/yaml-workflows.d.ts +8 -0
  167. package/build/system/mcp-servers/admin/yaml-workflows.js +237 -0
  168. package/build/system/mcp-servers/claude-code.js +1 -1
  169. package/build/system/mcp-servers/db-query/index.js +1 -1
  170. package/build/system/mcp-servers/db-query/tools.js +17 -4
  171. package/build/system/mcp-servers/docs.d.ts +5 -0
  172. package/build/system/mcp-servers/docs.js +147 -0
  173. package/build/system/mcp-servers/file-storage.js +1 -1
  174. package/build/system/mcp-servers/http-fetch.js +1 -1
  175. package/build/system/mcp-servers/human-queue.js +1 -1
  176. package/build/system/mcp-servers/knowledge.d.ts +4 -0
  177. package/build/system/mcp-servers/knowledge.js +137 -0
  178. package/build/system/mcp-servers/oauth.js +1 -1
  179. package/build/system/mcp-servers/playwright/browser-lifecycle.js +1 -1
  180. package/build/system/mcp-servers/playwright/index.js +1 -1
  181. package/build/system/mcp-servers/playwright/schemas.d.ts +19 -8
  182. package/build/system/mcp-servers/playwright/schemas.js +3 -0
  183. package/build/system/mcp-servers/playwright/tools-navigation.js +22 -9
  184. package/build/system/mcp-servers/playwright/tools-run-script.js +20 -3
  185. package/build/system/mcp-servers/playwright/vision-helper.d.ts +12 -0
  186. package/build/system/mcp-servers/playwright/vision-helper.js +81 -0
  187. package/build/system/mcp-servers/playwright-cli/helpers.js +2 -2
  188. package/build/system/mcp-servers/playwright-cli/index.js +1 -1
  189. package/build/system/mcp-servers/playwright-cli/schemas.d.ts +28 -28
  190. package/build/system/mcp-servers/playwright-cli/schemas.js +1 -1
  191. package/build/system/mcp-servers/playwright-cli/tools-auth.js +1 -1
  192. package/build/system/mcp-servers/playwright-cli/tools-capture.js +4 -2
  193. package/build/system/mcp-servers/translation.d.ts +14 -0
  194. package/build/system/mcp-servers/translation.js +130 -0
  195. package/build/system/mcp-servers/vision-prompts.d.ts +2 -0
  196. package/build/system/mcp-servers/vision-prompts.js +9 -0
  197. package/build/system/mcp-servers/{document-vision.d.ts → vision.d.ts} +3 -4
  198. package/build/system/mcp-servers/vision.js +221 -0
  199. package/build/system/mcp-servers/workflow-compiler.js +1 -1
  200. package/build/system/mcp-servers/workflow.js +1 -1
  201. package/build/system/seed/index.js +13 -2
  202. package/build/system/seed/server-definitions.d.ts +1954 -322
  203. package/build/system/seed/server-definitions.js +65 -34
  204. package/build/system/seed/tool-manifests-admin.d.ts +1645 -0
  205. package/build/system/seed/tool-manifests-admin.js +45 -0
  206. package/build/system/seed/tool-manifests-browser.d.ts +1 -1
  207. package/build/system/seed/tool-manifests-browser.js +3 -3
  208. package/build/system/seed/tool-manifests-data.d.ts +62 -21
  209. package/build/system/seed/tool-manifests-data.js +55 -17
  210. package/build/system/seed/tool-manifests-knowledge.d.ts +171 -0
  211. package/build/system/seed/tool-manifests-knowledge.js +94 -0
  212. package/build/system/workflows/mcp-deterministic/index.js +1 -1
  213. package/build/system/workflows/mcp-query/activities/discovery.d.ts +2 -20
  214. package/build/system/workflows/mcp-query/activities/discovery.js +5 -163
  215. package/build/system/workflows/mcp-query/activities/llm.d.ts +1 -7
  216. package/build/system/workflows/mcp-query/activities/llm.js +2 -27
  217. package/build/system/workflows/mcp-query/activities/tool-executor.d.ts +0 -4
  218. package/build/system/workflows/mcp-query/activities/tool-executor.js +2 -106
  219. package/build/system/workflows/mcp-query/activities/tool-loader.d.ts +0 -9
  220. package/build/system/workflows/mcp-query/activities/tool-loader.js +2 -87
  221. package/build/system/workflows/mcp-query/index.js +55 -5
  222. package/build/system/workflows/mcp-query/prompts.d.ts +1 -2
  223. package/build/system/workflows/mcp-query/prompts.js +5 -32
  224. package/build/system/workflows/mcp-query/strategy-advisors.d.ts +3 -14
  225. package/build/system/workflows/mcp-query/strategy-advisors.js +4 -107
  226. package/build/system/workflows/mcp-query/types.d.ts +2 -10
  227. package/build/system/workflows/mcp-query/types.js +0 -1
  228. package/build/system/workflows/mcp-query-router/index.js +1 -1
  229. package/build/system/workflows/mcp-triage/index.d.ts +2 -2
  230. package/build/system/workflows/mcp-triage/index.js +39 -7
  231. package/build/system/workflows/mcp-triage/prompts.js +7 -14
  232. package/build/system/workflows/mcp-triage-deterministic/index.js +1 -1
  233. package/build/system/workflows/mcp-triage-router/index.js +1 -1
  234. package/build/system/workflows/shared/discovery.d.ts +35 -0
  235. package/build/system/workflows/shared/discovery.js +175 -0
  236. package/build/system/workflows/shared/index.d.ts +7 -0
  237. package/build/system/workflows/shared/index.js +18 -0
  238. package/build/system/workflows/shared/llm-caller.d.ts +8 -0
  239. package/build/system/workflows/shared/llm-caller.js +31 -0
  240. package/build/system/workflows/shared/prompts.d.ts +2 -0
  241. package/build/system/workflows/shared/prompts.js +32 -0
  242. package/build/system/workflows/shared/strategy-advisors.d.ts +14 -0
  243. package/build/system/workflows/shared/strategy-advisors.js +109 -0
  244. package/build/system/workflows/shared/tool-executor.d.ts +11 -0
  245. package/build/system/workflows/shared/tool-executor.js +111 -0
  246. package/build/system/workflows/shared/tool-loader.d.ts +19 -0
  247. package/build/system/workflows/shared/tool-loader.js +94 -0
  248. package/build/system/workflows/shared/types.d.ts +9 -0
  249. package/build/system/workflows/shared/types.js +2 -0
  250. package/build/system/workflows/tool-result-guard.d.ts +14 -0
  251. package/build/system/workflows/tool-result-guard.js +78 -0
  252. package/build/tsconfig.tsbuildinfo +1 -1
  253. package/build/types/user.d.ts +2 -0
  254. package/build/vitest.config.d.ts +1 -1
  255. package/build/vitest.integration.config.d.ts +1 -1
  256. package/build/workers/index.js +2 -8
  257. package/dashboard/dist/assets/AdminDashboard-CTyAMUJR.js +2 -0
  258. package/dashboard/dist/assets/AdminDashboard-CTyAMUJR.js.map +1 -0
  259. package/dashboard/dist/assets/AvailableEscalationsPage-BMXV3Q4l.js +2 -0
  260. package/dashboard/dist/assets/AvailableEscalationsPage-BMXV3Q4l.js.map +1 -0
  261. package/dashboard/dist/assets/BotPicker-C51nKFEu.js +2 -0
  262. package/dashboard/dist/assets/{BotPicker-D6FYW1Gt.js.map → BotPicker-C51nKFEu.js.map} +1 -1
  263. package/dashboard/dist/assets/CollapsibleSection-BSyfd8uL.js +2 -0
  264. package/dashboard/dist/assets/{CollapsibleSection-Cxk4wvjT.js.map → CollapsibleSection-BSyfd8uL.js.map} +1 -1
  265. package/dashboard/dist/assets/ConfirmDeleteModal-CBdhia5T.js +2 -0
  266. package/dashboard/dist/assets/{ConfirmDeleteModal-FSXyKjaB.js.map → ConfirmDeleteModal-CBdhia5T.js.map} +1 -1
  267. package/dashboard/dist/assets/CopyableId-dGlewBCS.js +2 -0
  268. package/dashboard/dist/assets/{CopyableId-CBdxWfp8.js.map → CopyableId-dGlewBCS.js.map} +1 -1
  269. package/dashboard/dist/assets/CredentialsPage-CoBNFSAu.js +2 -0
  270. package/dashboard/dist/assets/{CredentialsPage-Ikzsot0w.js.map → CredentialsPage-CoBNFSAu.js.map} +1 -1
  271. package/dashboard/dist/assets/CustomDurationPicker-BataWFj8.js +2 -0
  272. package/dashboard/dist/assets/{CustomDurationPicker-CAninCbl.js.map → CustomDurationPicker-BataWFj8.js.map} +1 -1
  273. package/dashboard/dist/assets/DataTable-B3uf5CCo.js +2 -0
  274. package/dashboard/dist/assets/DataTable-B3uf5CCo.js.map +1 -0
  275. package/dashboard/dist/assets/ElapsedCell-G5oSwTpT.js +2 -0
  276. package/dashboard/dist/assets/ElapsedCell-G5oSwTpT.js.map +1 -0
  277. package/dashboard/dist/assets/EmptyState-BChBJNGS.js +2 -0
  278. package/dashboard/dist/assets/{EmptyState-2CmV-IaS.js.map → EmptyState-BChBJNGS.js.map} +1 -1
  279. package/dashboard/dist/assets/EscalationsOverview-CxUv8xjG.js +2 -0
  280. package/dashboard/dist/assets/{EscalationsOverview-GXYFPASS.js.map → EscalationsOverview-CxUv8xjG.js.map} +1 -1
  281. package/dashboard/dist/assets/EventTable-CVt8B0BZ.js +2 -0
  282. package/dashboard/dist/assets/{EventTable-B01oJf6Y.js.map → EventTable-CVt8B0BZ.js.map} +1 -1
  283. package/dashboard/dist/assets/FilterBar-CShf0oe7.js +2 -0
  284. package/dashboard/dist/assets/{FilterBar-Ck4K4rzu.js.map → FilterBar-CShf0oe7.js.map} +1 -1
  285. package/dashboard/dist/assets/McpOverview-CbaZRnJl.js +2 -0
  286. package/dashboard/dist/assets/{McpOverview-JkvRcX2e.js.map → McpOverview-CbaZRnJl.js.map} +1 -1
  287. package/dashboard/dist/assets/McpQueryDetailPage-CGoR9XK6.js +5 -0
  288. package/dashboard/dist/assets/McpQueryDetailPage-CGoR9XK6.js.map +1 -0
  289. package/dashboard/dist/assets/McpQueryPage-BjXoYQuU.js +2 -0
  290. package/dashboard/dist/assets/McpQueryPage-BjXoYQuU.js.map +1 -0
  291. package/dashboard/dist/assets/McpRunDetailPage-DLkA5Aar.js +2 -0
  292. package/dashboard/dist/assets/McpRunDetailPage-DLkA5Aar.js.map +1 -0
  293. package/dashboard/dist/assets/McpRunsPage-DCh9n11D.js +2 -0
  294. package/dashboard/dist/assets/McpRunsPage-DCh9n11D.js.map +1 -0
  295. package/dashboard/dist/assets/Modal-CI5RBPOQ.js +2 -0
  296. package/dashboard/dist/assets/{Modal-B4rbIVAn.js.map → Modal-CI5RBPOQ.js.map} +1 -1
  297. package/dashboard/dist/assets/OperatorDashboard-Dc80suXd.js +2 -0
  298. package/dashboard/dist/assets/OperatorDashboard-Dc80suXd.js.map +1 -0
  299. package/dashboard/dist/assets/PageHeader-SMD9qtOO.js +2 -0
  300. package/dashboard/dist/assets/PageHeader-SMD9qtOO.js.map +1 -0
  301. package/dashboard/dist/assets/PageHeaderWithStats-TikLQsTp.js +2 -0
  302. package/dashboard/dist/assets/PageHeaderWithStats-TikLQsTp.js.map +1 -0
  303. package/dashboard/dist/assets/PriorityBadge-CQ0EsLTA.js +2 -0
  304. package/dashboard/dist/assets/{PriorityBadge-DfQY9St9.js.map → PriorityBadge-CQ0EsLTA.js.map} +1 -1
  305. package/dashboard/dist/assets/ProcessDetailPage-B2GKuGzk.js +2 -0
  306. package/dashboard/dist/assets/ProcessDetailPage-B2GKuGzk.js.map +1 -0
  307. package/dashboard/dist/assets/ProcessesListPage-CTjI3Wn6.js +2 -0
  308. package/dashboard/dist/assets/ProcessesListPage-CTjI3Wn6.js.map +1 -0
  309. package/dashboard/dist/assets/RefreshButton-BcQDObrv.js +2 -0
  310. package/dashboard/dist/assets/RefreshButton-BcQDObrv.js.map +1 -0
  311. package/dashboard/dist/assets/RolePill-Crj4TH5p.js +2 -0
  312. package/dashboard/dist/assets/{RolePill-BTPa8L-P.js.map → RolePill-Crj4TH5p.js.map} +1 -1
  313. package/dashboard/dist/assets/RolesPage-C_RInUwS.js +2 -0
  314. package/dashboard/dist/assets/RolesPage-C_RInUwS.js.map +1 -0
  315. package/dashboard/dist/assets/RowActions-Cp5HyK_w.js +2 -0
  316. package/dashboard/dist/assets/{RowActions-Dg-Fsm5O.js.map → RowActions-Cp5HyK_w.js.map} +1 -1
  317. package/dashboard/dist/assets/RunAsSelector-BhyWtofX.js +2 -0
  318. package/dashboard/dist/assets/RunAsSelector-BhyWtofX.js.map +1 -0
  319. package/dashboard/dist/assets/StatCard-BKZLSgNV.js +2 -0
  320. package/dashboard/dist/assets/{StatCard-DlgF0CJC.js.map → StatCard-BKZLSgNV.js.map} +1 -1
  321. package/dashboard/dist/assets/StatusBadge-BYNGGZK5.js +2 -0
  322. package/dashboard/dist/assets/StatusBadge-BYNGGZK5.js.map +1 -0
  323. package/dashboard/dist/assets/StickyPagination-CTosgiU2.js +2 -0
  324. package/dashboard/dist/assets/{StickyPagination-F9FZsRy9.js.map → StickyPagination-CTosgiU2.js.map} +1 -1
  325. package/dashboard/dist/assets/SwimlaneTimeline-ylG5Ps1s.js +2 -0
  326. package/dashboard/dist/assets/SwimlaneTimeline-ylG5Ps1s.js.map +1 -0
  327. package/dashboard/dist/assets/TaskDetailPage-C9pDGdD2.js +2 -0
  328. package/dashboard/dist/assets/TaskDetailPage-C9pDGdD2.js.map +1 -0
  329. package/dashboard/dist/assets/TaskQueuePill-BtJbZTT0.js +2 -0
  330. package/dashboard/dist/assets/{TaskQueuePill-awmtb0qw.js.map → TaskQueuePill-BtJbZTT0.js.map} +1 -1
  331. package/dashboard/dist/assets/TasksListPage-DtFLUEhg.js +2 -0
  332. package/dashboard/dist/assets/{TasksListPage-C_QF23c1.js.map → TasksListPage-DtFLUEhg.js.map} +1 -1
  333. package/dashboard/dist/assets/TimeAgo-WuM6xImZ.js +2 -0
  334. package/dashboard/dist/assets/TimeAgo-WuM6xImZ.js.map +1 -0
  335. package/dashboard/dist/assets/TimestampCell-IVL_-Upy.js +2 -0
  336. package/dashboard/dist/assets/TimestampCell-IVL_-Upy.js.map +1 -0
  337. package/dashboard/dist/assets/UserName-DU9qeg13.js +2 -0
  338. package/dashboard/dist/assets/{UserName-DaP4YAKr.js.map → UserName-DU9qeg13.js.map} +1 -1
  339. package/dashboard/dist/assets/WorkflowExecutionPage-DOocX81f.js +2 -0
  340. package/dashboard/dist/assets/WorkflowExecutionPage-DOocX81f.js.map +1 -0
  341. package/dashboard/dist/assets/WorkflowPill-Diw8iWBP.js +2 -0
  342. package/dashboard/dist/assets/WorkflowPill-Diw8iWBP.js.map +1 -0
  343. package/dashboard/dist/assets/WorkflowsDashboard-DDtUIrTy.js +2 -0
  344. package/dashboard/dist/assets/WorkflowsDashboard-DDtUIrTy.js.map +1 -0
  345. package/dashboard/dist/assets/WorkflowsOverview-CPuvA4t3.js +2 -0
  346. package/dashboard/dist/assets/{WorkflowsOverview-D9OzzQqw.js.map → WorkflowsOverview-CPuvA4t3.js.map} +1 -1
  347. package/dashboard/dist/assets/YamlWorkflowsPage-DlwwkluN.js +2 -0
  348. package/dashboard/dist/assets/YamlWorkflowsPage-DlwwkluN.js.map +1 -0
  349. package/dashboard/dist/assets/{bots-BkKVMbUW.js → bots-BPiZXf2h.js} +2 -2
  350. package/dashboard/dist/assets/{bots-BkKVMbUW.js.map → bots-BPiZXf2h.js.map} +1 -1
  351. package/dashboard/dist/assets/constants-BHkpVaqx.js +2 -0
  352. package/dashboard/dist/assets/constants-BHkpVaqx.js.map +1 -0
  353. package/dashboard/dist/assets/escalation-DTY_OKRh.js +2 -0
  354. package/dashboard/dist/assets/escalation-DTY_OKRh.js.map +1 -0
  355. package/dashboard/dist/assets/escalation-columns-C91fHSkp.js +2 -0
  356. package/dashboard/dist/assets/{escalation-columns-D6aqStaY.js.map → escalation-columns-C91fHSkp.js.map} +1 -1
  357. package/dashboard/dist/assets/helpers-DBUZ9pnG.js +2 -0
  358. package/dashboard/dist/assets/helpers-DBUZ9pnG.js.map +1 -0
  359. package/dashboard/dist/assets/index-BOeA-gfK.js +17 -0
  360. package/dashboard/dist/assets/{index-X85K5bHC.js.map → index-BOeA-gfK.js.map} +1 -1
  361. package/dashboard/dist/assets/index-BZ6K_kmL.js +3 -0
  362. package/dashboard/dist/assets/index-BZ6K_kmL.js.map +1 -0
  363. package/dashboard/dist/assets/index-Bpm0yeoi.js +2 -0
  364. package/dashboard/dist/assets/index-Bpm0yeoi.js.map +1 -0
  365. package/dashboard/dist/assets/index-BtOwLI0K.js +2 -0
  366. package/dashboard/dist/assets/{index-DTPzZr_X.js.map → index-BtOwLI0K.js.map} +1 -1
  367. package/dashboard/dist/assets/index-CBF3ZvRZ.js +6 -0
  368. package/dashboard/dist/assets/index-CBF3ZvRZ.js.map +1 -0
  369. package/dashboard/dist/assets/index-CDWOfCmi.js +2 -0
  370. package/dashboard/dist/assets/index-CDWOfCmi.js.map +1 -0
  371. package/dashboard/dist/assets/index-Ce6sL__n.js +2 -0
  372. package/dashboard/dist/assets/index-Ce6sL__n.js.map +1 -0
  373. package/dashboard/dist/assets/index-DSzSoku1.js +283 -0
  374. package/dashboard/dist/assets/index-DSzSoku1.js.map +1 -0
  375. package/dashboard/dist/assets/index-D_qEAYrg.js +2 -0
  376. package/dashboard/dist/assets/index-D_qEAYrg.js.map +1 -0
  377. package/dashboard/dist/assets/index-gCy9XX3W.css +1 -0
  378. package/dashboard/dist/assets/mcp-BzVpaaKF.js +2 -0
  379. package/dashboard/dist/assets/{mcp-blCW6IL7.js.map → mcp-BzVpaaKF.js.map} +1 -1
  380. package/dashboard/dist/assets/mcp-query-wTuxTTCV.js +2 -0
  381. package/dashboard/dist/assets/mcp-query-wTuxTTCV.js.map +1 -0
  382. package/dashboard/dist/assets/{mcp-runs-ChPbpvXK.js → mcp-runs-DmXYJD19.js} +2 -2
  383. package/dashboard/dist/assets/{mcp-runs-ChPbpvXK.js.map → mcp-runs-DmXYJD19.js.map} +1 -1
  384. package/dashboard/dist/assets/namespaces-DoGa7jc7.js +2 -0
  385. package/dashboard/dist/assets/{namespaces-BgbaC3ow.js.map → namespaces-DoGa7jc7.js.map} +1 -1
  386. package/dashboard/dist/assets/{roles-ZNrqqnQl.js → roles-wCdQ2Z7k.js} +2 -2
  387. package/dashboard/dist/assets/{roles-ZNrqqnQl.js.map → roles-wCdQ2Z7k.js.map} +1 -1
  388. package/dashboard/dist/assets/settings-DDe_L7JT.js +2 -0
  389. package/dashboard/dist/assets/{settings-eBRSE0mQ.js.map → settings-DDe_L7JT.js.map} +1 -1
  390. package/dashboard/dist/assets/tasks-3Hih8Bt7.js +2 -0
  391. package/dashboard/dist/assets/{tasks-tRqClPns.js.map → tasks-3Hih8Bt7.js.map} +1 -1
  392. package/dashboard/dist/assets/{useFilterParams-BaXUAkYK.js → useFilterParams-BUyLHcx_.js} +2 -2
  393. package/dashboard/dist/assets/{useFilterParams-BaXUAkYK.js.map → useFilterParams-BUyLHcx_.js.map} +1 -1
  394. package/dashboard/dist/assets/{useNatsEvents-Xr43X1fG.js → useNatsEvents-DeGKHFTX.js} +2 -2
  395. package/dashboard/dist/assets/{useNatsEvents-Xr43X1fG.js.map → useNatsEvents-DeGKHFTX.js.map} +1 -1
  396. package/dashboard/dist/assets/{useYamlActivityEvents-BO51u8tm.js → useYamlActivityEvents-B5dHec6Y.js} +2 -2
  397. package/dashboard/dist/assets/{useYamlActivityEvents-BO51u8tm.js.map → useYamlActivityEvents-B5dHec6Y.js.map} +1 -1
  398. package/dashboard/dist/assets/{users-tMvNyOo8.js → users-BTagPmGW.js} +2 -2
  399. package/dashboard/dist/assets/{users-tMvNyOo8.js.map → users-BTagPmGW.js.map} +1 -1
  400. package/dashboard/dist/assets/{vendor-icons-ZTAKVwGc.js → vendor-icons-DCLlGYO9.js} +112 -57
  401. package/dashboard/dist/assets/vendor-icons-DCLlGYO9.js.map +1 -0
  402. package/dashboard/dist/assets/vendor-query-DLp59M9_.js +35 -0
  403. package/dashboard/dist/assets/vendor-query-DLp59M9_.js.map +1 -0
  404. package/dashboard/dist/assets/vendor-react-Co3Y8ikm.js +26 -0
  405. package/dashboard/dist/assets/vendor-react-Co3Y8ikm.js.map +1 -0
  406. package/dashboard/dist/assets/{workflows-Cc4VHcrp.js → workflows-B20dR3NE.js} +2 -2
  407. package/dashboard/dist/assets/{workflows-Cc4VHcrp.js.map → workflows-B20dR3NE.js.map} +1 -1
  408. package/dashboard/dist/assets/yaml-workflows-CaLPMQha.js +2 -0
  409. package/dashboard/dist/assets/yaml-workflows-CaLPMQha.js.map +1 -0
  410. package/dashboard/dist/index.html +5 -5
  411. package/docs/api/dba.md +81 -0
  412. package/docs/api/escalations.md +575 -0
  413. package/docs/api/exports.md +170 -0
  414. package/docs/api/maintenance.md +93 -0
  415. package/docs/api/mcp-runs.md +128 -0
  416. package/docs/api/mcp-servers.md +195 -0
  417. package/docs/api/namespaces.md +48 -0
  418. package/docs/api/roles.md +390 -0
  419. package/docs/api/service-accounts.md +188 -0
  420. package/docs/api/settings.md +33 -0
  421. package/docs/api/tasks.md +167 -0
  422. package/docs/api/users.md +180 -0
  423. package/docs/api/workflows.md +616 -0
  424. package/docs/api/yaml-workflows.md +312 -0
  425. package/docs/architecture.md +221 -0
  426. package/docs/auth.md +181 -0
  427. package/docs/cloud.md +272 -0
  428. package/docs/compilation.md +136 -0
  429. package/docs/contributing.md +56 -0
  430. package/docs/dashboard.md +145 -0
  431. package/docs/data.md +478 -0
  432. package/docs/escalation-strategies.md +264 -0
  433. package/docs/events.md +251 -0
  434. package/docs/iam.md +222 -0
  435. package/docs/img/01-login.png +0 -0
  436. package/docs/img/02-dashboard-home.png +0 -0
  437. package/docs/img/03-processes-list.png +0 -0
  438. package/docs/img/04-escalations-list.png +0 -0
  439. package/docs/img/05-mcp-servers.png +0 -0
  440. package/docs/img/06-mcp-pipelines.png +0 -0
  441. package/docs/img/07-workflows-list.png +0 -0
  442. package/docs/img/compilation/01-query-submit.png +0 -0
  443. package/docs/img/compilation/02-mcp-servers.png +0 -0
  444. package/docs/img/compilation/03-query-completed.png +0 -0
  445. package/docs/img/compilation/04-wizard-original.png +0 -0
  446. package/docs/img/compilation/05-wizard-timeline.png +0 -0
  447. package/docs/img/compilation/06-wizard-profile.png +0 -0
  448. package/docs/img/compilation/07-wizard-deploy.png +0 -0
  449. package/docs/img/compilation/08-wizard-test-modal.png +0 -0
  450. package/docs/img/compilation/09-wizard-test-compare.png +0 -0
  451. package/docs/img/compilation/10-wizard-verify.png +0 -0
  452. package/docs/logging.md +110 -0
  453. package/docs/maintenance.md +221 -0
  454. package/docs/mcp.md +715 -0
  455. package/docs/oauth-and-delegation.md +469 -0
  456. package/docs/telemetry.md +144 -0
  457. package/docs/workflows.md +695 -0
  458. package/lib/db/schemas/015_knowledge.sql +23 -0
  459. package/package.json +8 -9
  460. package/build/services/db/index.d.ts +0 -3
  461. package/build/services/mcp/vision-server.d.ts +0 -15
  462. package/build/services/mcp/vision-server.js +0 -214
  463. package/build/system/mcp-servers/document-vision.js +0 -228
  464. package/build/system/mcp-servers/prompts.d.ts +0 -4
  465. package/build/system/mcp-servers/prompts.js +0 -10
  466. package/dashboard/dist/assets/AdminDashboard-jfacvOC7.js +0 -2
  467. package/dashboard/dist/assets/AdminDashboard-jfacvOC7.js.map +0 -1
  468. package/dashboard/dist/assets/AvailableEscalationsPage-BglLDoT8.js +0 -2
  469. package/dashboard/dist/assets/AvailableEscalationsPage-BglLDoT8.js.map +0 -1
  470. package/dashboard/dist/assets/BotPicker-D6FYW1Gt.js +0 -2
  471. package/dashboard/dist/assets/CollapsibleSection-Cxk4wvjT.js +0 -2
  472. package/dashboard/dist/assets/ConfirmDeleteModal-FSXyKjaB.js +0 -2
  473. package/dashboard/dist/assets/CopyableId-CBdxWfp8.js +0 -2
  474. package/dashboard/dist/assets/CredentialsPage-Ikzsot0w.js +0 -2
  475. package/dashboard/dist/assets/CustomDurationPicker-CAninCbl.js +0 -2
  476. package/dashboard/dist/assets/DataTable-BDn1WBHS.js +0 -2
  477. package/dashboard/dist/assets/DataTable-BDn1WBHS.js.map +0 -1
  478. package/dashboard/dist/assets/EmptyState-2CmV-IaS.js +0 -2
  479. package/dashboard/dist/assets/EscalationsOverview-GXYFPASS.js +0 -2
  480. package/dashboard/dist/assets/EventTable-B01oJf6Y.js +0 -2
  481. package/dashboard/dist/assets/Field-DuFBAYhu.js +0 -2
  482. package/dashboard/dist/assets/Field-DuFBAYhu.js.map +0 -1
  483. package/dashboard/dist/assets/FilterBar-Ck4K4rzu.js +0 -2
  484. package/dashboard/dist/assets/McpOverview-JkvRcX2e.js +0 -2
  485. package/dashboard/dist/assets/McpQueryDetailPage-CUMqhQdS.js +0 -2
  486. package/dashboard/dist/assets/McpQueryDetailPage-CUMqhQdS.js.map +0 -1
  487. package/dashboard/dist/assets/McpQueryPage-DRRhw4nN.js +0 -2
  488. package/dashboard/dist/assets/McpQueryPage-DRRhw4nN.js.map +0 -1
  489. package/dashboard/dist/assets/McpRunDetailPage-CmPs5EvE.js +0 -2
  490. package/dashboard/dist/assets/McpRunDetailPage-CmPs5EvE.js.map +0 -1
  491. package/dashboard/dist/assets/McpRunsPage-Dl5Y2u6k.js +0 -2
  492. package/dashboard/dist/assets/McpRunsPage-Dl5Y2u6k.js.map +0 -1
  493. package/dashboard/dist/assets/Modal-B4rbIVAn.js +0 -2
  494. package/dashboard/dist/assets/OperatorDashboard-B56il28q.js +0 -2
  495. package/dashboard/dist/assets/OperatorDashboard-B56il28q.js.map +0 -1
  496. package/dashboard/dist/assets/PageHeader-CpWFly5S.js +0 -2
  497. package/dashboard/dist/assets/PageHeader-CpWFly5S.js.map +0 -1
  498. package/dashboard/dist/assets/PriorityBadge-DfQY9St9.js +0 -2
  499. package/dashboard/dist/assets/ProcessDetailPage-CMLq4M7D.js +0 -2
  500. package/dashboard/dist/assets/ProcessDetailPage-CMLq4M7D.js.map +0 -1
  501. package/dashboard/dist/assets/ProcessesListPage-CZ_HF06v.js +0 -2
  502. package/dashboard/dist/assets/ProcessesListPage-CZ_HF06v.js.map +0 -1
  503. package/dashboard/dist/assets/RolePill-BTPa8L-P.js +0 -2
  504. package/dashboard/dist/assets/RolesPage-9grZW7yR.js +0 -2
  505. package/dashboard/dist/assets/RolesPage-9grZW7yR.js.map +0 -1
  506. package/dashboard/dist/assets/RowActions-Dg-Fsm5O.js +0 -2
  507. package/dashboard/dist/assets/SimpleMarkdown-CBlvaWP4.js +0 -4
  508. package/dashboard/dist/assets/SimpleMarkdown-CBlvaWP4.js.map +0 -1
  509. package/dashboard/dist/assets/StatCard-DlgF0CJC.js +0 -2
  510. package/dashboard/dist/assets/StatusBadge-TlC4jiig.js +0 -2
  511. package/dashboard/dist/assets/StatusBadge-TlC4jiig.js.map +0 -1
  512. package/dashboard/dist/assets/StickyPagination-F9FZsRy9.js +0 -2
  513. package/dashboard/dist/assets/SwimlaneTimeline-7SiwATsZ.js +0 -2
  514. package/dashboard/dist/assets/SwimlaneTimeline-7SiwATsZ.js.map +0 -1
  515. package/dashboard/dist/assets/TaskDetailPage-CbPVTakt.js +0 -2
  516. package/dashboard/dist/assets/TaskDetailPage-CbPVTakt.js.map +0 -1
  517. package/dashboard/dist/assets/TaskQueuePill-awmtb0qw.js +0 -2
  518. package/dashboard/dist/assets/TasksListPage-C_QF23c1.js +0 -2
  519. package/dashboard/dist/assets/TimeAgo-UPG6DoH8.js +0 -2
  520. package/dashboard/dist/assets/TimeAgo-UPG6DoH8.js.map +0 -1
  521. package/dashboard/dist/assets/TimestampCell-DoWMKg6w.js +0 -2
  522. package/dashboard/dist/assets/TimestampCell-DoWMKg6w.js.map +0 -1
  523. package/dashboard/dist/assets/UserName-DaP4YAKr.js +0 -2
  524. package/dashboard/dist/assets/VersionHistory-Bt7WBr6m.js +0 -5
  525. package/dashboard/dist/assets/VersionHistory-Bt7WBr6m.js.map +0 -1
  526. package/dashboard/dist/assets/WorkflowExecutionPage-DjtAQ3hy.js +0 -2
  527. package/dashboard/dist/assets/WorkflowExecutionPage-DjtAQ3hy.js.map +0 -1
  528. package/dashboard/dist/assets/WorkflowPill-CCDSVaQj.js +0 -2
  529. package/dashboard/dist/assets/WorkflowPill-CCDSVaQj.js.map +0 -1
  530. package/dashboard/dist/assets/WorkflowsDashboard-D8z9uBNB.js +0 -2
  531. package/dashboard/dist/assets/WorkflowsDashboard-D8z9uBNB.js.map +0 -1
  532. package/dashboard/dist/assets/WorkflowsOverview-D9OzzQqw.js +0 -2
  533. package/dashboard/dist/assets/YamlWorkflowDetailPage-DrDvvP62.js +0 -3
  534. package/dashboard/dist/assets/YamlWorkflowDetailPage-DrDvvP62.js.map +0 -1
  535. package/dashboard/dist/assets/YamlWorkflowsPage-COqiNCQK.js +0 -2
  536. package/dashboard/dist/assets/YamlWorkflowsPage-COqiNCQK.js.map +0 -1
  537. package/dashboard/dist/assets/constants-CgaZfe5d.js +0 -2
  538. package/dashboard/dist/assets/constants-CgaZfe5d.js.map +0 -1
  539. package/dashboard/dist/assets/escalation-columns-D6aqStaY.js +0 -2
  540. package/dashboard/dist/assets/escalation-qalymbKB.js +0 -2
  541. package/dashboard/dist/assets/escalation-qalymbKB.js.map +0 -1
  542. package/dashboard/dist/assets/format-gXZXQ-HJ.js +0 -2
  543. package/dashboard/dist/assets/format-gXZXQ-HJ.js.map +0 -1
  544. package/dashboard/dist/assets/helpers-0gSleuzT.js +0 -2
  545. package/dashboard/dist/assets/helpers-0gSleuzT.js.map +0 -1
  546. package/dashboard/dist/assets/index-BWvMHed7.js +0 -6
  547. package/dashboard/dist/assets/index-BWvMHed7.js.map +0 -1
  548. package/dashboard/dist/assets/index-BaszoPO_.css +0 -1
  549. package/dashboard/dist/assets/index-Cn2jyj9A.js +0 -2
  550. package/dashboard/dist/assets/index-Cn2jyj9A.js.map +0 -1
  551. package/dashboard/dist/assets/index-D8VH6K8B.js +0 -54
  552. package/dashboard/dist/assets/index-D8VH6K8B.js.map +0 -1
  553. package/dashboard/dist/assets/index-D9SYwJsi.js +0 -3
  554. package/dashboard/dist/assets/index-D9SYwJsi.js.map +0 -1
  555. package/dashboard/dist/assets/index-DTPzZr_X.js +0 -2
  556. package/dashboard/dist/assets/index-D_6AB5BE.js +0 -2
  557. package/dashboard/dist/assets/index-D_6AB5BE.js.map +0 -1
  558. package/dashboard/dist/assets/index-S9Ks2Lj2.js +0 -2
  559. package/dashboard/dist/assets/index-S9Ks2Lj2.js.map +0 -1
  560. package/dashboard/dist/assets/index-X85K5bHC.js +0 -17
  561. package/dashboard/dist/assets/index-rjmgHlSH.js +0 -2
  562. package/dashboard/dist/assets/index-rjmgHlSH.js.map +0 -1
  563. package/dashboard/dist/assets/mcp-blCW6IL7.js +0 -2
  564. package/dashboard/dist/assets/mcp-query-DoAyPbjC.js +0 -2
  565. package/dashboard/dist/assets/mcp-query-DoAyPbjC.js.map +0 -1
  566. package/dashboard/dist/assets/namespaces-BgbaC3ow.js +0 -2
  567. package/dashboard/dist/assets/settings-eBRSE0mQ.js +0 -2
  568. package/dashboard/dist/assets/tasks-tRqClPns.js +0 -2
  569. package/dashboard/dist/assets/vendor-icons-ZTAKVwGc.js.map +0 -1
  570. package/dashboard/dist/assets/vendor-query-B2UbickB.js +0 -18
  571. package/dashboard/dist/assets/vendor-query-B2UbickB.js.map +0 -1
  572. package/dashboard/dist/assets/vendor-react-Cw8Gy8NJ.js +0 -22
  573. package/dashboard/dist/assets/vendor-react-Cw8Gy8NJ.js.map +0 -1
  574. package/dashboard/dist/assets/yaml-workflows-BL4V5CQy.js +0 -2
  575. package/dashboard/dist/assets/yaml-workflows-BL4V5CQy.js.map +0 -1
  576. /package/build/{services → lib}/db/migrate.d.ts +0 -0
  577. /package/build/{services → lib}/events/index.d.ts +0 -0
  578. /package/build/{services → lib}/events/index.js +0 -0
  579. /package/build/{services → lib}/events/memory.d.ts +0 -0
  580. /package/build/{services → lib}/events/memory.js +0 -0
  581. /package/build/{services → lib}/events/nats.d.ts +0 -0
  582. /package/build/{services → lib}/events/nats.js +0 -0
  583. /package/build/{services → lib}/events/publish.d.ts +0 -0
  584. /package/build/{services → lib}/events/publish.js +0 -0
  585. /package/build/{services → lib}/events/socketio.d.ts +0 -0
  586. /package/build/{services → lib}/events/socketio.js +0 -0
  587. /package/build/{services → lib}/logger/index.d.ts +0 -0
  588. /package/build/{services → lib}/logger/index.js +0 -0
  589. /package/build/{services → lib}/logger/pino.d.ts +0 -0
  590. /package/build/{services → lib}/logger/pino.js +0 -0
  591. /package/build/{services → lib}/storage/index.d.ts +0 -0
  592. /package/build/{services → lib}/storage/index.js +0 -0
  593. /package/build/{services → lib}/storage/local.d.ts +0 -0
  594. /package/build/{services → lib}/storage/local.js +0 -0
  595. /package/build/{services → lib}/storage/s3.d.ts +0 -0
  596. /package/build/{services → lib}/storage/s3.js +0 -0
  597. /package/build/{services → lib}/storage/types.d.ts +0 -0
  598. /package/build/{services → lib}/storage/types.js +0 -0
  599. /package/build/{services → lib}/telemetry/index.d.ts +0 -0
  600. /package/build/{services → lib}/telemetry/index.js +0 -0
  601. /package/{services → lib}/db/README.md +0 -0
  602. /package/{services → lib}/db/schemas/001_schema.sql +0 -0
  603. /package/{services → lib}/db/schemas/002_seed.sql +0 -0
  604. /package/{services → lib}/db/schemas/003_workflow_discovery.sql +0 -0
  605. /package/{services → lib}/db/schemas/004_query_router.sql +0 -0
  606. /package/{services → lib}/db/schemas/005_triage_router.sql +0 -0
  607. /package/{services → lib}/db/schemas/006_oauth.sql +0 -0
  608. /package/{services → lib}/db/schemas/007_security.sql +0 -0
  609. /package/{services → lib}/db/schemas/008_bot_accounts.sql +0 -0
  610. /package/{services → lib}/db/schemas/009_audit_trail.sql +0 -0
  611. /package/{services → lib}/db/schemas/010_credential_providers.sql +0 -0
  612. /package/{services → lib}/db/schemas/011_system_workflow_configs.sql +0 -0
  613. /package/{services → lib}/db/schemas/012_drop_modality.sql +0 -0
  614. /package/{services → lib}/db/schemas/013_execute_as.sql +0 -0
  615. /package/{services → lib}/db/schemas/014_ephemeral_credentials.sql +0 -0
@@ -0,0 +1,17 @@
1
+ import{j as e}from"./index-DSzSoku1.js";import{a as d}from"./vendor-query-DLp59M9_.js";import{e as G,i as K,u as A,j as X,b as Z}from"./workflows-B20dR3NE.js";import{D as ee}from"./DataTable-B3uf5CCo.js";import{C as se}from"./ConfirmDeleteModal-CBdhia5T.js";import{F as re,b as _}from"./FilterBar-CShf0oe7.js";import{R as oe,a as q}from"./RowActions-Cp5HyK_w.js";import{u as ae}from"./useFilterParams-BUyLHcx_.js";import{P as J}from"./PageHeader-SMD9qtOO.js";import{R as te}from"./RolePill-Crj4TH5p.js";import{T as ie}from"./TaskQueuePill-BtJbZTT0.js";import{W as le}from"./WorkflowPill-Diw8iWBP.js";import{H as ne,Z as ce,_ as me,U as O,X as M,C as U,s as B,d as T}from"./vendor-icons-DCLlGYO9.js";import{c as Q,e as ue,f as de}from"./vendor-react-Co3Y8ikm.js";import{u as fe}from"./roles-wCdQ2Z7k.js";import{B as pe}from"./BotPicker-C51nKFEu.js";import"./EmptyState-BChBJNGS.js";import"./Modal-CI5RBPOQ.js";import"./bots-BPiZXf2h.js";function he(s,o){const i=o.toLowerCase();return s.workflow_type.toLowerCase().includes(i)||(s.description??"").toLowerCase().includes(i)}function Fe(){const s=Q(),{data:o,isLoading:i}=G(),u=K(),{filters:a,setFilter:l}=ae({filters:{search:"",queue:"",role:"",tier:""}}),[c,N]=d.useState(a.search),[p,y]=d.useState(null);d.useEffect(()=>{if(c===a.search)return;const r=setTimeout(()=>l("search",c),300);return()=>clearTimeout(r)},[c,l,a.search]);const n=o??[],f=d.useMemo(()=>[...new Set(n.map(r=>r.task_queue).filter(Boolean))].sort(),[n]),m=d.useMemo(()=>[...new Set(n.flatMap(r=>r.roles??[]))].sort(),[n]),t=d.useMemo(()=>{let r=n;return a.search&&(r=r.filter(h=>he(h,a.search))),a.queue&&(r=r.filter(h=>h.task_queue===a.queue)),a.role&&(r=r.filter(h=>(h.roles??[]).includes(a.role))),a.tier==="certified"&&(r=r.filter(h=>h.registered)),a.tier==="durable"&&(r=r.filter(h=>!h.registered)),r},[n,a]),C=[{key:"workflow_type",label:"Workflow",render:r=>e.jsxDEV("div",{className:"min-w-0",children:[e.jsxDEV(le,{type:r.workflow_type},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:78,columnNumber:11},this),r.description&&e.jsxDEV("p",{className:"text-[10px] text-text-tertiary mt-0.5 truncate",children:r.description},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:80,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:77,columnNumber:9},this)},{key:"task_queue",label:"Queue",render:r=>r.task_queue?e.jsxDEV(ie,{queue:r.task_queue},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:88,columnNumber:41},this):e.jsxDEV("span",{className:"text-xs text-text-tertiary",children:"—"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:88,columnNumber:84},this),className:"whitespace-nowrap"},{key:"registered",label:"Tier",render:r=>r.registered?e.jsxDEV("span",{className:"inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] font-medium bg-accent/10 text-accent",children:[e.jsxDEV(ne,{className:"w-3 h-3"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:95,columnNumber:131},this),"Certified"]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:95,columnNumber:11},this):e.jsxDEV("span",{className:"inline-flex items-center px-1.5 py-0.5 rounded text-[10px] font-medium bg-surface-sunken text-text-tertiary",children:"Durable"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:96,columnNumber:11},this),className:"whitespace-nowrap"},{key:"roles",label:"Roles",render:r=>r.registered?e.jsxDEV("div",{className:"flex gap-1 flex-wrap",children:[(r.roles??[]).map(h=>e.jsxDEV(te,{role:h},h,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:105,columnNumber:13},this)),(!r.roles||r.roles.length===0)&&e.jsxDEV("span",{className:"text-xs text-text-tertiary",children:"—"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:107,columnNumber:54},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:103,columnNumber:9},this):e.jsxDEV("span",{className:"text-xs text-text-tertiary",children:"—"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:110,columnNumber:9},this)},{key:"actions",label:"",render:r=>e.jsxDEV(oe,{children:r.registered?e.jsxDEV(q,{icon:ce,title:"De-certify workflow",onClick:()=>y(r.workflow_type),colorClass:"text-text-tertiary hover:text-status-warning"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:119,columnNumber:13},this):e.jsxDEV(q,{icon:me,title:"Certify workflow",onClick:()=>s(`/workflows/registry/new?workflow_type=${encodeURIComponent(r.workflow_type)}&task_queue=${encodeURIComponent(r.task_queue??"")}`),colorClass:"text-text-tertiary hover:text-status-success"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:126,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:117,columnNumber:9},this),className:"w-16 text-right"}],E=()=>{p&&u.mutate(p,{onSuccess:()=>y(null)})},D=r=>{r.registered?s(`/workflows/registry/${encodeURIComponent(r.workflow_type)}`):s(`/workflows/registry/new?workflow_type=${encodeURIComponent(r.workflow_type)}&task_queue=${encodeURIComponent(r.task_queue??"")}`)};return e.jsxDEV("div",{children:[e.jsxDEV(J,{title:"Workflow Registry",actions:e.jsxDEV("button",{onClick:()=>s("/workflows/registry/new"),className:"btn-primary text-xs",children:"Register Workflow"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:159,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:156,columnNumber:7},this),e.jsxDEV(re,{children:[e.jsxDEV("input",{type:"text",placeholder:"Search workflow type...",value:c,onChange:r=>N(r.target.value),className:"input text-[11px] py-1 px-2 w-56"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:169,columnNumber:9},this),e.jsxDEV(_,{label:"Queue",value:a.queue,onChange:r=>l("queue",r),options:f.map(r=>({value:r,label:r}))},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:176,columnNumber:9},this),e.jsxDEV(_,{label:"Tier",value:a.tier,onChange:r=>l("tier",r),options:[{value:"certified",label:"Certified"},{value:"durable",label:"Durable"}]},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:182,columnNumber:9},this),e.jsxDEV(_,{label:"Role",value:a.role,onChange:r=>l("role",r),options:m.map(r=>({value:r,label:r}))},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:191,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:168,columnNumber:7},this),e.jsxDEV(ee,{columns:C,data:t,keyFn:r=>r.workflow_type,onRowClick:D,isLoading:i,emptyMessage:"No workflows found"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:199,columnNumber:7},this),e.jsxDEV(se,{open:!!p,onClose:()=>y(null),onConfirm:E,title:"De-certify Workflow",description:e.jsxDEV(e.Fragment,{children:["Remove certification from ",e.jsxDEV("span",{className:"font-mono font-medium text-text-primary",children:p},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:214,columnNumber:50},this),"? This removes interceptor guarantees, escalation chains, and invocation role constraints. The workflow will continue running as a standard durable workflow."]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:214,columnNumber:22},this),isPending:u.isPending,error:u.error},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:209,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigsPage.tsx",lineNumber:155,columnNumber:5},this)}function be({steps:s,currentStep:o,onStepClick:i}){return e.jsxDEV("div",{className:"flex items-center justify-center gap-1 pb-4 border-b border-surface-border mb-4",children:s.map((u,a)=>{const l=a<o,c=a===o,N=!!i;return e.jsxDEV("div",{className:"flex items-center gap-1",children:[a>0&&e.jsxDEV("div",{className:`w-4 h-px ${l?"bg-accent":"bg-surface-border"}`},void 0,!1,{fileName:"/app/dashboard/src/components/common/layout/StepIndicator.tsx",lineNumber:17,columnNumber:15},this),e.jsxDEV("button",{type:"button",onClick:N?()=>i(a):void 0,className:`flex items-center gap-1 ${N?"cursor-pointer":"cursor-default"}`,children:[e.jsxDEV("span",{className:`w-5 h-5 rounded-full text-[10px] font-semibold flex items-center justify-center shrink-0 transition-colors ${c?"bg-accent text-text-inverse":l?"bg-accent-muted text-accent":"bg-surface-sunken text-text-tertiary"} ${N&&!c?"hover:bg-accent-muted hover:text-accent":""}`,children:a+1},void 0,!1,{fileName:"/app/dashboard/src/components/common/layout/StepIndicator.tsx",lineNumber:24,columnNumber:15},this),e.jsxDEV("span",{className:`text-[10px] font-semibold uppercase tracking-wider whitespace-nowrap transition-colors ${c?"text-text-primary":"text-text-tertiary"} ${N&&!c?"hover:text-text-primary":""}`,children:u},void 0,!1,{fileName:"/app/dashboard/src/components/common/layout/StepIndicator.tsx",lineNumber:35,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/layout/StepIndicator.tsx",lineNumber:19,columnNumber:13},this)]},u,!0,{fileName:"/app/dashboard/src/components/common/layout/StepIndicator.tsx",lineNumber:15,columnNumber:11},this)})},void 0,!1,{fileName:"/app/dashboard/src/components/common/layout/StepIndicator.tsx",lineNumber:9,columnNumber:5},this)}function j(s){return s.split(",").map(o=>o.trim()).filter(Boolean)}const z={workflow_type:"",description:"",task_queue:"",default_role:"reviewer",invocable:!1,roles:"",invocation_roles:"",consumes:"",envelope_schema:"",resolver_schema:"",cron_schedule:"",execute_as:""};function Ne(s){return{workflow_type:s.workflow_type,description:s.description??"",task_queue:s.task_queue??"",default_role:s.default_role,invocable:s.invocable,roles:(s.roles??[]).join(", "),invocation_roles:(s.invocation_roles??[]).join(", "),consumes:(s.consumes??[]).join(", "),envelope_schema:s.envelope_schema?JSON.stringify(s.envelope_schema,null,2):"",resolver_schema:s.resolver_schema?JSON.stringify(s.resolver_schema,null,2):"",cron_schedule:s.cron_schedule??"",execute_as:s.execute_as??""}}const L=["Identity","Escalation","Invocation & Schemas"];function W(s){if(!s.trim())return!0;try{return JSON.parse(s),!0}catch{return!1}}function $(s,o){return s===1?!!o.workflow_type.trim():s===3?W(o.envelope_schema)&&W(o.resolver_schema):!0}const v="block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",k="text-[10px] text-text-tertiary mt-2 leading-relaxed",F="input font-mono text-[11px] w-full leading-relaxed tabular-nums";function R({selected:s,onChange:o,single:i,placeholder:u}){const{data:a}=fe(),l=(a==null?void 0:a.roles)??[],[c,N]=d.useState(!1),p=d.useRef(null);d.useEffect(()=>{const m=t=>{p.current&&!p.current.contains(t.target)&&N(!1)};return document.addEventListener("mousedown",m),()=>document.removeEventListener("mousedown",m)},[]);const y=m=>{i?(o(s.includes(m)?[]:[m]),N(!1)):o(s.includes(m)?s.filter(t=>t!==m):[...s,m])},n=m=>{o(s.filter(t=>t!==m))},f=u??(i?"Select role...":"Add roles...");return e.jsxDEV("div",{ref:p,className:"relative",children:[e.jsxDEV("button",{type:"button",onClick:()=>N(!c),className:"flex flex-wrap items-center gap-1.5 w-full min-h-[34px] px-2 py-1.5 bg-surface-sunken border border-surface-border rounded-md text-left cursor-pointer hover:border-accent/40 transition-colors focus:ring-1 focus:ring-accent focus:outline-none",children:[s.length===0&&e.jsxDEV("span",{className:"text-xs text-text-tertiary",children:f},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/RolePicker.tsx",lineNumber:55,columnNumber:11},this),s.map(m=>e.jsxDEV("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 rounded-lg bg-accent/[0.08] text-text-secondary text-[11px]",children:[e.jsxDEV(O,{className:"w-2.5 h-2.5 shrink-0 text-accent/75"},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/RolePicker.tsx",lineNumber:62,columnNumber:13},this),m,e.jsxDEV("span",{role:"button",onClick:t=>{t.stopPropagation(),n(m)},className:"ml-0.5 hover:text-status-error transition-colors",children:e.jsxDEV(M,{className:"w-2.5 h-2.5"},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/RolePicker.tsx",lineNumber:69,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/RolePicker.tsx",lineNumber:64,columnNumber:13},this)]},m,!0,{fileName:"/app/dashboard/src/components/common/form/RolePicker.tsx",lineNumber:58,columnNumber:11},this)),e.jsxDEV(U,{className:`w-3.5 h-3.5 ml-auto shrink-0 text-text-tertiary transition-transform ${c?"rotate-180":""}`},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/RolePicker.tsx",lineNumber:73,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/form/RolePicker.tsx",lineNumber:49,columnNumber:7},this),c&&e.jsxDEV("div",{className:"absolute z-20 mt-1 w-full bg-white border border-surface-border rounded-md shadow-lg max-h-48 overflow-y-auto",children:l.length===0?e.jsxDEV("p",{className:"px-3 py-2 text-xs text-text-tertiary",children:"No roles defined"},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/RolePicker.tsx",lineNumber:80,columnNumber:13},this):l.map(m=>{const t=s.includes(m);return e.jsxDEV("button",{type:"button",onClick:()=>y(m),className:`flex items-center gap-2 w-full px-3 py-1.5 text-left text-xs transition-colors ${t?"bg-accent/[0.06] text-accent":"text-text-primary hover:bg-surface-sunken"}`,children:[e.jsxDEV(O,{className:"w-3 h-3 shrink-0 text-accent/60"},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/RolePicker.tsx",lineNumber:95,columnNumber:19},this),e.jsxDEV("span",{className:"flex-1",children:m},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/RolePicker.tsx",lineNumber:96,columnNumber:19},this),t&&e.jsxDEV(B,{className:"w-3 h-3 shrink-0"},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/RolePicker.tsx",lineNumber:97,columnNumber:34},this)]},m,!0,{fileName:"/app/dashboard/src/components/common/form/RolePicker.tsx",lineNumber:85,columnNumber:17},this)})},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/RolePicker.tsx",lineNumber:78,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/form/RolePicker.tsx",lineNumber:47,columnNumber:5},this)}function ge({options:s,selected:o,onChange:i,placeholder:u}){const[a,l]=d.useState(!1),c=d.useRef(null);d.useEffect(()=>{const n=f=>{c.current&&!c.current.contains(f.target)&&l(!1)};return document.addEventListener("mousedown",n),()=>document.removeEventListener("mousedown",n)},[]);const N=n=>{i(o.includes(n)?o.filter(f=>f!==n):[...o,n])},p=n=>{i(o.filter(f=>f!==n))},y=u??"Add workflows...";return e.jsxDEV("div",{ref:c,className:"relative",children:[e.jsxDEV("button",{type:"button",onClick:()=>l(!a),className:"flex flex-wrap items-center gap-1.5 w-full min-h-[34px] px-2 py-1.5 bg-surface-sunken border border-surface-border rounded-md text-left cursor-pointer hover:border-accent/40 transition-colors focus:ring-1 focus:ring-accent focus:outline-none",children:[o.length===0&&e.jsxDEV("span",{className:"text-xs text-text-tertiary",children:y},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/WorkflowPicker.tsx",lineNumber:45,columnNumber:11},this),o.map(n=>e.jsxDEV("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 rounded-lg bg-accent/[0.08] text-text-secondary text-[11px] font-mono",children:[e.jsxDEV(T,{className:"w-2.5 h-2.5 shrink-0 text-accent/75"},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/WorkflowPicker.tsx",lineNumber:52,columnNumber:13},this),n,e.jsxDEV("span",{role:"button",onClick:f=>{f.stopPropagation(),p(n)},className:"ml-0.5 hover:text-status-error transition-colors",children:e.jsxDEV(M,{className:"w-2.5 h-2.5"},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/WorkflowPicker.tsx",lineNumber:59,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/WorkflowPicker.tsx",lineNumber:54,columnNumber:13},this)]},n,!0,{fileName:"/app/dashboard/src/components/common/form/WorkflowPicker.tsx",lineNumber:48,columnNumber:11},this)),e.jsxDEV(U,{className:`w-3.5 h-3.5 ml-auto shrink-0 text-text-tertiary transition-transform ${a?"rotate-180":""}`},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/WorkflowPicker.tsx",lineNumber:63,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/form/WorkflowPicker.tsx",lineNumber:39,columnNumber:7},this),a&&e.jsxDEV("div",{className:"absolute z-20 mt-1 w-full bg-white border border-surface-border rounded-md shadow-lg max-h-48 overflow-y-auto",children:s.length===0?e.jsxDEV("p",{className:"px-3 py-2 text-xs text-text-tertiary",children:"No registered workflows"},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/WorkflowPicker.tsx",lineNumber:69,columnNumber:13},this):s.map(n=>{const f=o.includes(n);return e.jsxDEV("button",{type:"button",onClick:()=>N(n),className:`flex items-center gap-2 w-full px-3 py-1.5 text-left text-xs font-mono transition-colors ${f?"bg-accent/[0.06] text-accent":"text-text-primary hover:bg-surface-sunken"}`,children:[e.jsxDEV(T,{className:"w-3 h-3 shrink-0 text-accent/60"},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/WorkflowPicker.tsx",lineNumber:84,columnNumber:19},this),e.jsxDEV("span",{className:"flex-1",children:n},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/WorkflowPicker.tsx",lineNumber:85,columnNumber:19},this),f&&e.jsxDEV(B,{className:"w-3 h-3 shrink-0"},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/WorkflowPicker.tsx",lineNumber:86,columnNumber:34},this)]},n,!0,{fileName:"/app/dashboard/src/components/common/form/WorkflowPicker.tsx",lineNumber:74,columnNumber:17},this)})},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/WorkflowPicker.tsx",lineNumber:67,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/form/WorkflowPicker.tsx",lineNumber:38,columnNumber:5},this)}function V(s){return j(s)}function I(s){return s.join(", ")}function xe({form:s,set:o,editing:i,durableTypes:u=[]}){const a=!i&&u.length>0;return e.jsxDEV("div",{className:"space-y-5",children:[e.jsxDEV("div",{children:[e.jsxDEV("label",{className:v,children:"Workflow Type"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:37,columnNumber:9},this),a&&!s.workflow_type?e.jsxDEV("div",{className:"space-y-2",children:[e.jsxDEV("p",{className:"text-xs text-text-secondary",children:"Select a durable workflow to register as certified:"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:40,columnNumber:13},this),e.jsxDEV("div",{className:"grid gap-1",children:u.map(l=>e.jsxDEV("button",{onClick:()=>o("workflow_type",l),className:"flex items-center gap-2 px-3 py-2 text-left text-xs font-mono rounded-md border border-surface-border hover:border-accent/50 hover:bg-accent/[0.04] transition-colors",children:l},l,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:45,columnNumber:17},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:43,columnNumber:13},this),e.jsxDEV("div",{className:"flex items-center gap-2 pt-1",children:[e.jsxDEV("span",{className:"text-[10px] text-text-tertiary",children:"or"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:55,columnNumber:15},this),e.jsxDEV("input",{type:"text",onChange:l=>o("workflow_type",l.target.value),placeholder:"Enter a workflow type manually",className:"input font-mono text-xs flex-1"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:56,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:54,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:39,columnNumber:11},this):e.jsxDEV(e.Fragment,{children:[e.jsxDEV("input",{type:"text",value:s.workflow_type,onChange:l=>o("workflow_type",l.target.value),disabled:i,placeholder:"reviewContent",className:"input font-mono text-xs w-full"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:66,columnNumber:13},this),!i&&s.workflow_type&&u.length>0&&e.jsxDEV("button",{onClick:()=>o("workflow_type",""),className:"text-[10px] text-accent hover:underline mt-1",children:"Choose from durable workflows"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:75,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:65,columnNumber:11},this),e.jsxDEV("p",{className:k,children:"Registering a durable workflow makes it certified — the interceptor wraps every execution so failures escalate instead of throwing."},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:84,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:36,columnNumber:7},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:v,children:"Description"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:90,columnNumber:9},this),e.jsxDEV("input",{type:"text",value:s.description,onChange:l=>o("description",l.target.value),placeholder:"AI-powered content moderation with human escalation",className:"input text-xs w-full"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:91,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:89,columnNumber:7},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:v,children:"Task Queue"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:101,columnNumber:9},this),e.jsxDEV("input",{type:"text",value:s.task_queue,onChange:l=>o("task_queue",l.target.value),placeholder:"lt-review",className:"input font-mono text-xs w-full"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:102,columnNumber:9},this),e.jsxDEV("p",{className:k,children:"Durable task queue this workflow listens on"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:109,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:100,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:35,columnNumber:5},this)}function we({form:s,set:o}){const{data:i}=A(),u=(i??[]).map(a=>a.workflow_type).filter(a=>a!==s.workflow_type);return e.jsxDEV("div",{className:"space-y-5",children:[e.jsxDEV("p",{className:"text-xs text-text-secondary leading-relaxed",children:"Configure how escalations are routed and who can interact with this workflow."},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:127,columnNumber:7},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:v,children:"Default Escalation Role"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:132,columnNumber:9},this),e.jsxDEV(R,{selected:V(s.default_role),onChange:a=>o("default_role",a[0]??""),single:!0,placeholder:"Select escalation role..."},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:133,columnNumber:9},this),e.jsxDEV("p",{className:k,children:"When this workflow escalates, assign to users with this role"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:139,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:131,columnNumber:7},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:v,children:"Escalation Roles"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:145,columnNumber:9},this),e.jsxDEV(R,{selected:V(s.roles),onChange:a=>o("roles",I(a)),placeholder:"Select who can resolve escalations..."},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:146,columnNumber:9},this),e.jsxDEV("p",{className:k,children:"Users with any of these roles can claim and resolve escalations from this workflow."},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:151,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:144,columnNumber:7},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:v,children:"Consumes"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:157,columnNumber:9},this),e.jsxDEV(ge,{options:u,selected:V(s.consumes),onChange:a=>o("consumes",I(a)),placeholder:"Select workflow dependencies..."},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:158,columnNumber:9},this),e.jsxDEV("p",{className:k,children:"Output from these upstream workflows will be injected into the input envelope for this workflow."},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:164,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:156,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:126,columnNumber:5},this)}function ke({form:s,set:o}){return e.jsxDEV("div",{className:"space-y-5",children:[e.jsxDEV("div",{className:"flex gap-6 pt-1",children:e.jsxDEV("label",{className:"flex items-center gap-2 cursor-pointer",children:[e.jsxDEV("input",{type:"checkbox",checked:s.invocable,onChange:i=>o("invocable",i.target.checked),className:"w-4 h-4 rounded border-border accent-accent"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:180,columnNumber:11},this),e.jsxDEV("span",{className:"text-xs text-text-primary font-medium",children:"Invocable"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:186,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:179,columnNumber:9},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:178,columnNumber:7},this),e.jsxDEV("p",{className:k,children:"Allow this workflow to be started from the dashboard or API."},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:189,columnNumber:7},this),s.invocable&&e.jsxDEV(e.Fragment,{children:[e.jsxDEV("div",{children:[e.jsxDEV("label",{className:v,children:"Run As"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:197,columnNumber:13},this),e.jsxDEV(pe,{selected:s.execute_as,onChange:i=>o("execute_as",i)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:198,columnNumber:13},this),e.jsxDEV("p",{className:k,children:"Choose a bot to execute this workflow under its identity and credentials. Default runs as the invoking user."},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:202,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:196,columnNumber:11},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:v,children:"Invocation Roles"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:210,columnNumber:13},this),e.jsxDEV(R,{selected:V(s.invocation_roles),onChange:i=>o("invocation_roles",I(i)),placeholder:"Select who can start this workflow..."},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:211,columnNumber:13},this),e.jsxDEV("p",{className:k,children:"Only users with these roles can start this workflow. Leave empty to allow all authenticated users."},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:216,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:209,columnNumber:11},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:v,children:"Envelope Schema"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:224,columnNumber:13},this),e.jsxDEV("textarea",{value:s.envelope_schema,onChange:i=>o("envelope_schema",i.target.value),placeholder:`{
2
+ "data": {
3
+ "contentId": "example-123",
4
+ "content": "Text to review"
5
+ },
6
+ "metadata": {
7
+ "source": "dashboard"
8
+ }
9
+ }`,className:F,rows:8,spellCheck:!1},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:225,columnNumber:13},this),e.jsxDEV("p",{className:k,children:["Pre-fills the JSON editor when invoking this workflow. Should include ",e.jsxDEV("span",{className:"font-mono",children:"data"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:235,columnNumber:30},this)," (workflow input) and optional ",e.jsxDEV("span",{className:"font-mono",children:"metadata"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:235,columnNumber:100},this)," (context)."]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:233,columnNumber:13},this),s.envelope_schema.trim()&&!W(s.envelope_schema)&&e.jsxDEV("p",{className:"text-[10px] text-status-error mt-1",children:"Invalid JSON"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:238,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:223,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:194,columnNumber:9},this),!s.invocable&&e.jsxDEV("div",{className:"py-4 px-4 bg-surface-sunken/50 rounded-md text-center",children:e.jsxDEV("p",{className:"text-xs text-text-tertiary",children:["Enable ",e.jsxDEV("span",{className:"font-medium text-text-secondary",children:"Invocable"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:247,columnNumber:20},this)," above to configure who can start this workflow and set an input template."]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:246,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:245,columnNumber:9},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:v,children:"Resolver Schema"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:254,columnNumber:9},this),e.jsxDEV("textarea",{value:s.resolver_schema,onChange:i=>o("resolver_schema",i.target.value),placeholder:`{
10
+ "approved": true,
11
+ "analysis": {
12
+ "confidence": 0.95,
13
+ "flags": [],
14
+ "summary": "Content meets guidelines"
15
+ }
16
+ }`,className:F,rows:8,spellCheck:!1},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:255,columnNumber:9},this),e.jsxDEV("p",{className:k,children:"The shape of data a human or AI provides when resolving an escalation from this workflow. Pre-fills the JSON editor in the escalation resolution form."},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:263,columnNumber:9},this),s.resolver_schema.trim()&&!W(s.resolver_schema)&&e.jsxDEV("p",{className:"text-[10px] text-status-error mt-1",children:"Invalid JSON"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:268,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:253,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/ConfigWizardSteps.tsx",lineNumber:176,columnNumber:5},this)}function Ae(){const{workflowType:s}=ue(),o=!s,i=Q(),{data:u,isLoading:a}=A(),l=X(),c=(u==null?void 0:u.find(b=>b.workflow_type===s))??null,N=new Set(["mcpQuery","mcpDeterministic","mcpQueryRouter","mcpTriage","mcpTriageRouter","mcpTriageDeterministic","insightQuery"]),{data:p}=Z({limit:500}),y=d.useMemo(()=>{const b=new Set((u??[]).map(g=>g.workflow_type));return[...new Set(((p==null?void 0:p.jobs)??[]).map(g=>g.entity))].filter(g=>!b.has(g)&&!N.has(g)).sort()},[u,p]),[n,f]=de(),m=d.useMemo(()=>{if(!o)return z;const b=n.get("workflow_type")??"",w=n.get("task_queue")??"";return!b&&!w?z:{...z,workflow_type:b,task_queue:w}},[o,n]),[t,C]=d.useState(m),[E,D]=d.useState(""),[r,h]=d.useState(!1),x=parseInt(n.get("step")||"1",10),S=d.useCallback(b=>{f(w=>{const g=new URLSearchParams(w);return g.set("step",String(b)),g},{replace:!1})},[f]);d.useEffect(()=>{if(!r){if(o){C(m),h(!0);return}c&&(C(Ne(c)),h(!0))}},[c,o,r,m]);const P=(b,w)=>C(g=>({...g,[b]:w})),H=()=>{if(!t.workflow_type.trim())return;D("");let b=null,w=null;try{t.envelope_schema.trim()&&(b=JSON.parse(t.envelope_schema))}catch{D("Invalid JSON in Envelope Schema");return}try{t.resolver_schema.trim()&&(w=JSON.parse(t.resolver_schema))}catch{D("Invalid JSON in Resolver Schema");return}l.mutate({workflow_type:t.workflow_type.trim(),description:t.description.trim()||null,task_queue:t.task_queue.trim()||null,default_role:t.default_role.trim()||"reviewer",invocable:t.invocable,roles:j(t.roles),invocation_roles:j(t.invocation_roles),consumes:j(t.consumes),envelope_schema:b,resolver_schema:w,cron_schedule:t.cron_schedule.trim()||null,execute_as:t.execute_as.trim()||null},{onSuccess:()=>{i("/workflows/registry")}})};if(a)return e.jsxDEV("div",{className:"animate-pulse space-y-4",children:[e.jsxDEV("div",{className:"h-8 bg-surface-sunken rounded w-48"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigDetailPage.tsx",lineNumber:132,columnNumber:9},this),e.jsxDEV("div",{className:"h-60 bg-surface-sunken rounded"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigDetailPage.tsx",lineNumber:133,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigDetailPage.tsx",lineNumber:131,columnNumber:7},this);if(!o&&!c)return e.jsxDEV("p",{className:"text-sm text-text-secondary",children:"Config not found."},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigDetailPage.tsx",lineNumber:139,columnNumber:12},this);const Y=x===L.length;return e.jsxDEV("div",{children:[e.jsxDEV(J,{title:o?"Register Workflow":(c==null?void 0:c.workflow_type)??""},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigDetailPage.tsx",lineNumber:147,columnNumber:7},this),e.jsxDEV("div",{className:"max-w-3xl",children:[e.jsxDEV(be,{steps:L,currentStep:x-1,onStepClick:b=>S(b+1)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigDetailPage.tsx",lineNumber:150,columnNumber:11},this),e.jsxDEV("div",{className:"min-h-[360px] py-2",children:[x===1&&e.jsxDEV(xe,{form:t,set:P,editing:!!c,durableTypes:y},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigDetailPage.tsx",lineNumber:153,columnNumber:28},this),x===2&&e.jsxDEV(we,{form:t,set:P},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigDetailPage.tsx",lineNumber:154,columnNumber:28},this),x===3&&e.jsxDEV(ke,{form:t,set:P},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigDetailPage.tsx",lineNumber:155,columnNumber:28},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigDetailPage.tsx",lineNumber:152,columnNumber:11},this),(E||l.error)&&e.jsxDEV("p",{className:"text-xs text-status-error mt-4",children:E||l.error.message},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigDetailPage.tsx",lineNumber:159,columnNumber:13},this),e.jsxDEV("div",{className:"flex justify-between items-center pt-4 border-t border-surface-border mt-4",children:[e.jsxDEV("div",{children:x>1&&e.jsxDEV("button",{onClick:()=>S(x-1),className:"btn-secondary text-xs",children:"Back"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigDetailPage.tsx",lineNumber:168,columnNumber:17},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigDetailPage.tsx",lineNumber:166,columnNumber:13},this),e.jsxDEV("div",{className:"flex gap-3",children:[e.jsxDEV("button",{onClick:()=>i("/workflows/registry"),className:"btn-ghost text-xs",children:"Cancel"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigDetailPage.tsx",lineNumber:177,columnNumber:15},this),Y?e.jsxDEV("button",{onClick:H,disabled:!$(x,t)||l.isPending,className:"btn-primary text-xs",children:l.isPending?"Saving...":c?"Save":"Create"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigDetailPage.tsx",lineNumber:181,columnNumber:17},this):e.jsxDEV("button",{onClick:()=>S(x+1),disabled:!$(x,t),className:"btn-primary text-xs",children:"Next"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigDetailPage.tsx",lineNumber:189,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigDetailPage.tsx",lineNumber:176,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigDetailPage.tsx",lineNumber:165,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigDetailPage.tsx",lineNumber:149,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/registry/WorkflowConfigDetailPage.tsx",lineNumber:146,columnNumber:5},this)}export{Ae as WorkflowConfigDetailPage,Fe as WorkflowConfigsPage};
17
+ //# sourceMappingURL=index-BOeA-gfK.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-X85K5bHC.js","sources":["../../src/pages/workflows/registry/WorkflowConfigsPage.tsx","../../src/components/common/layout/StepIndicator.tsx","../../src/lib/parse.ts","../../src/pages/workflows/registry/config-form-types.ts","../../src/components/common/form/RolePicker.tsx","../../src/components/common/form/WorkflowPicker.tsx","../../src/pages/workflows/registry/ConfigWizardSteps.tsx","../../src/pages/workflows/registry/WorkflowConfigDetailPage.tsx"],"sourcesContent":["import { useState, useEffect, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport {\n useDiscoveredWorkflows,\n useDeleteWorkflowConfig,\n} from '../../../api/workflows';\nimport { ShieldCheck, ShieldPlus, ShieldOff } from 'lucide-react';\nimport { DataTable, type Column } from '../../../components/common/data/DataTable';\nimport { ConfirmDeleteModal } from '../../../components/common/modal/ConfirmDeleteModal';\nimport { FilterBar, FilterSelect } from '../../../components/common/data/FilterBar';\nimport { RowAction, RowActionGroup } from '../../../components/common/layout/RowActions';\nimport { useFilterParams } from '../../../hooks/useFilterParams';\nimport type { DiscoveredWorkflow } from '../../../api/types';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { RolePill } from '../../../components/common/display/RolePill';\nimport { TaskQueuePill } from '../../../components/common/display/TaskQueuePill';\nimport { WorkflowPill } from '../../../components/common/display/WorkflowPill';\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\nfunction matchesSearch(wf: DiscoveredWorkflow, search: string): boolean {\n const q = search.toLowerCase();\n return (\n wf.workflow_type.toLowerCase().includes(q) ||\n (wf.description ?? '').toLowerCase().includes(q)\n );\n}\n\n// ── Page ──────────────────────────────────────────────────────────────────────\n\nexport function WorkflowConfigsPage() {\n const navigate = useNavigate();\n const { data, isLoading } = useDiscoveredWorkflows();\n const deleteConfig = useDeleteWorkflowConfig();\n const { filters, setFilter } = useFilterParams({\n filters: { search: '', queue: '', role: '', tier: '' },\n });\n\n const [searchInput, setSearchInput] = useState(filters.search);\n const [confirmDelete, setConfirmDelete] = useState<string | null>(null);\n\n // Debounce search input\n useEffect(() => {\n if (searchInput === filters.search) return;\n const timer = setTimeout(() => setFilter('search', searchInput), 300);\n return () => clearTimeout(timer);\n }, [searchInput, setFilter, filters.search]);\n\n const allWorkflows = data ?? [];\n\n // Derive facet options from data\n const queues = useMemo(\n () => [...new Set(allWorkflows.map((w) => w.task_queue).filter(Boolean) as string[])].sort(),\n [allWorkflows],\n );\n const roles = useMemo(\n () => [...new Set(allWorkflows.flatMap((w) => w.roles ?? []))].sort(),\n [allWorkflows],\n );\n\n // Apply client-side filters\n const workflows = useMemo(() => {\n let result = allWorkflows;\n if (filters.search) result = result.filter((w) => matchesSearch(w, filters.search));\n if (filters.queue) result = result.filter((w) => w.task_queue === filters.queue);\n if (filters.role) result = result.filter((w) => (w.roles ?? []).includes(filters.role));\n if (filters.tier === 'certified') result = result.filter((w) => w.registered);\n if (filters.tier === 'durable') result = result.filter((w) => !w.registered);\n return result;\n }, [allWorkflows, filters]);\n\n const columns: Column<DiscoveredWorkflow>[] = [\n {\n key: 'workflow_type',\n label: 'Workflow',\n render: (row) => (\n <div className=\"min-w-0\">\n <WorkflowPill type={row.workflow_type} />\n {row.description && (\n <p className=\"text-[10px] text-text-tertiary mt-0.5 truncate\">{row.description}</p>\n )}\n </div>\n ),\n },\n {\n key: 'task_queue',\n label: 'Queue',\n render: (row) => row.task_queue ? <TaskQueuePill queue={row.task_queue} /> : <span className=\"text-xs text-text-tertiary\">—</span>,\n className: 'whitespace-nowrap',\n },\n {\n key: 'registered',\n label: 'Tier',\n render: (row) => row.registered\n ? <span className=\"inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] font-medium bg-accent/10 text-accent\"><ShieldCheck className=\"w-3 h-3\" />Certified</span>\n : <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-[10px] font-medium bg-surface-sunken text-text-tertiary\">Durable</span>,\n className: 'whitespace-nowrap',\n },\n {\n key: 'roles',\n label: 'Roles',\n render: (row) => row.registered ? (\n <div className=\"flex gap-1 flex-wrap\">\n {(row.roles ?? []).map((r) => (\n <RolePill key={r} role={r} />\n ))}\n {(!row.roles || row.roles.length === 0) && <span className=\"text-xs text-text-tertiary\">—</span>}\n </div>\n ) : (\n <span className=\"text-xs text-text-tertiary\">—</span>\n ),\n },\n {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n {row.registered ? (\n <RowAction\n icon={ShieldOff}\n title=\"De-certify workflow\"\n onClick={() => setConfirmDelete(row.workflow_type)}\n colorClass=\"text-text-tertiary hover:text-status-warning\"\n />\n ) : (\n <RowAction\n icon={ShieldPlus}\n title=\"Certify workflow\"\n onClick={() => navigate(`/workflows/registry/new?workflow_type=${encodeURIComponent(row.workflow_type)}&task_queue=${encodeURIComponent(row.task_queue ?? '')}`)}\n colorClass=\"text-text-tertiary hover:text-status-success\"\n />\n )}\n </RowActionGroup>\n ),\n className: 'w-16 text-right',\n },\n ];\n\n const handleDelete = () => {\n if (!confirmDelete) return;\n deleteConfig.mutate(confirmDelete, {\n onSuccess: () => setConfirmDelete(null),\n });\n };\n\n const handleRowClick = (row: DiscoveredWorkflow) => {\n if (row.registered) {\n navigate(`/workflows/registry/${encodeURIComponent(row.workflow_type)}`);\n } else {\n navigate(`/workflows/registry/new?workflow_type=${encodeURIComponent(row.workflow_type)}&task_queue=${encodeURIComponent(row.task_queue ?? '')}`);\n }\n };\n\n return (\n <div>\n <PageHeader\n title=\"Workflow Registry\"\n actions={\n <button\n onClick={() => navigate('/workflows/registry/new')}\n className=\"btn-primary text-xs\"\n >\n Register Workflow\n </button>\n }\n />\n\n <FilterBar>\n <input\n type=\"text\"\n placeholder=\"Search workflow type...\"\n value={searchInput}\n onChange={(e) => setSearchInput(e.target.value)}\n className=\"input text-[11px] py-1 px-2 w-56\"\n />\n <FilterSelect\n label=\"Queue\"\n value={filters.queue}\n onChange={(v) => setFilter('queue', v)}\n options={queues.map((q) => ({ value: q, label: q }))}\n />\n <FilterSelect\n label=\"Tier\"\n value={filters.tier}\n onChange={(v) => setFilter('tier', v)}\n options={[\n { value: 'certified', label: 'Certified' },\n { value: 'durable', label: 'Durable' },\n ]}\n />\n <FilterSelect\n label=\"Role\"\n value={filters.role}\n onChange={(v) => setFilter('role', v)}\n options={roles.map((r) => ({ value: r, label: r }))}\n />\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={workflows}\n keyFn={(row) => row.workflow_type}\n onRowClick={handleRowClick}\n isLoading={isLoading}\n emptyMessage=\"No workflows found\"\n />\n\n {/* Delete confirmation modal */}\n <ConfirmDeleteModal\n open={!!confirmDelete}\n onClose={() => setConfirmDelete(null)}\n onConfirm={handleDelete}\n title=\"De-certify Workflow\"\n description={<>Remove certification from <span className=\"font-mono font-medium text-text-primary\">{confirmDelete}</span>? This removes interceptor guarantees, escalation chains, and invocation role constraints. The workflow will continue running as a standard durable workflow.</>}\n isPending={deleteConfig.isPending}\n error={deleteConfig.error as Error | null}\n />\n </div>\n );\n}\n","interface StepIndicatorProps {\n steps: string[];\n currentStep: number;\n onStepClick?: (step: number) => void;\n}\n\nexport function StepIndicator({ steps, currentStep, onStepClick }: StepIndicatorProps) {\n return (\n <div className=\"flex items-center justify-center gap-1 pb-4 border-b border-surface-border mb-4\">\n {steps.map((label, i) => {\n const done = i < currentStep;\n const active = i === currentStep;\n const clickable = !!onStepClick;\n return (\n <div key={label} className=\"flex items-center gap-1\">\n {i > 0 && (\n <div className={`w-4 h-px ${done ? 'bg-accent' : 'bg-surface-border'}`} />\n )}\n <button\n type=\"button\"\n onClick={clickable ? () => onStepClick(i) : undefined}\n className={`flex items-center gap-1 ${clickable ? 'cursor-pointer' : 'cursor-default'}`}\n >\n <span\n className={`w-5 h-5 rounded-full text-[10px] font-semibold flex items-center justify-center shrink-0 transition-colors ${\n active\n ? 'bg-accent text-text-inverse'\n : done\n ? 'bg-accent-muted text-accent'\n : 'bg-surface-sunken text-text-tertiary'\n } ${clickable && !active ? 'hover:bg-accent-muted hover:text-accent' : ''}`}\n >\n {i + 1}\n </span>\n <span\n className={`text-[10px] font-semibold uppercase tracking-wider whitespace-nowrap transition-colors ${\n active ? 'text-text-primary' : 'text-text-tertiary'\n } ${clickable && !active ? 'hover:text-text-primary' : ''}`}\n >\n {label}\n </span>\n </button>\n </div>\n );\n })}\n </div>\n );\n}\n","export function splitCsv(s: string): string[] {\n return s\n .split(',')\n .map((v) => v.trim())\n .filter(Boolean);\n}\n\nexport function safeParseJson<T = unknown>(\n json: string,\n): { ok: true; data: T } | { ok: false; error: string } {\n try {\n return { ok: true, data: JSON.parse(json) as T };\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : 'Invalid JSON';\n return { ok: false, error: message };\n }\n}\n","import type { LTWorkflowConfig } from '../../../api/types';\n\nexport interface ConfigFormState {\n workflow_type: string;\n description: string;\n task_queue: string;\n default_role: string;\n invocable: boolean;\n roles: string;\n invocation_roles: string;\n consumes: string;\n envelope_schema: string;\n resolver_schema: string;\n cron_schedule: string;\n execute_as: string;\n}\n\nexport const EMPTY_FORM: ConfigFormState = {\n workflow_type: '',\n description: '',\n task_queue: '',\n default_role: 'reviewer',\n invocable: false,\n roles: '',\n invocation_roles: '',\n consumes: '',\n envelope_schema: '',\n resolver_schema: '',\n cron_schedule: '',\n execute_as: '',\n};\n\nexport function configToForm(c: LTWorkflowConfig): ConfigFormState {\n return {\n workflow_type: c.workflow_type,\n description: c.description ?? '',\n task_queue: c.task_queue ?? '',\n default_role: c.default_role,\n invocable: c.invocable,\n roles: (c.roles ?? []).join(', '),\n invocation_roles: (c.invocation_roles ?? []).join(', '),\n consumes: (c.consumes ?? []).join(', '),\n envelope_schema: c.envelope_schema ? JSON.stringify(c.envelope_schema, null, 2) : '',\n resolver_schema: c.resolver_schema ? JSON.stringify(c.resolver_schema, null, 2) : '',\n cron_schedule: c.cron_schedule ?? '',\n execute_as: c.execute_as ?? '',\n };\n}\n\nexport const STEP_LABELS = ['Identity', 'Escalation', 'Invocation & Schemas'];\n\nexport function jsonValid(v: string): boolean {\n if (!v.trim()) return true;\n try { JSON.parse(v); return true; } catch { return false; }\n}\n\nexport function isStepValid(step: number, form: ConfigFormState): boolean {\n if (step === 1) return !!form.workflow_type.trim();\n if (step === 3) return jsonValid(form.envelope_schema) && jsonValid(form.resolver_schema);\n return true;\n}\n\nexport const labelCls = 'block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1';\nexport const hintCls = 'text-[10px] text-text-tertiary mt-2 leading-relaxed';\nexport const jsonCls = 'input font-mono text-[11px] w-full leading-relaxed tabular-nums';\n\nexport const DEFAULT_ENVELOPE = '{\\n \"data\": {},\\n \"metadata\": {}\\n}';\n","import { useState, useRef, useEffect } from 'react';\nimport { User, X, ChevronDown, Check } from 'lucide-react';\nimport { useRoles } from '../../../api/roles';\n\ninterface RolePickerProps {\n selected: string[];\n onChange: (roles: string[]) => void;\n /** Only allow one selection */\n single?: boolean;\n placeholder?: string;\n}\n\nexport function RolePicker({ selected, onChange, single, placeholder }: RolePickerProps) {\n const { data } = useRoles();\n const allRoles = data?.roles ?? [];\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, []);\n\n const toggle = (role: string) => {\n if (single) {\n onChange(selected.includes(role) ? [] : [role]);\n setOpen(false);\n } else {\n onChange(\n selected.includes(role)\n ? selected.filter((r) => r !== role)\n : [...selected, role],\n );\n }\n };\n\n const remove = (role: string) => {\n onChange(selected.filter((r) => r !== role));\n };\n\n const placeholderText = placeholder ?? (single ? 'Select role...' : 'Add roles...');\n\n return (\n <div ref={ref} className=\"relative\">\n {/* Selected pills + trigger */}\n <button\n type=\"button\"\n onClick={() => setOpen(!open)}\n className=\"flex flex-wrap items-center gap-1.5 w-full min-h-[34px] px-2 py-1.5 bg-surface-sunken border border-surface-border rounded-md text-left cursor-pointer hover:border-accent/40 transition-colors focus:ring-1 focus:ring-accent focus:outline-none\"\n >\n {selected.length === 0 && (\n <span className=\"text-xs text-text-tertiary\">{placeholderText}</span>\n )}\n {selected.map((role) => (\n <span\n key={role}\n className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-lg bg-accent/[0.08] text-text-secondary text-[11px]\"\n >\n <User className=\"w-2.5 h-2.5 shrink-0 text-accent/75\" />\n {role}\n <span\n role=\"button\"\n onClick={(e) => { e.stopPropagation(); remove(role); }}\n className=\"ml-0.5 hover:text-status-error transition-colors\"\n >\n <X className=\"w-2.5 h-2.5\" />\n </span>\n </span>\n ))}\n <ChevronDown className={`w-3.5 h-3.5 ml-auto shrink-0 text-text-tertiary transition-transform ${open ? 'rotate-180' : ''}`} />\n </button>\n\n {/* Dropdown */}\n {open && (\n <div className=\"absolute z-20 mt-1 w-full bg-white border border-surface-border rounded-md shadow-lg max-h-48 overflow-y-auto\">\n {allRoles.length === 0 ? (\n <p className=\"px-3 py-2 text-xs text-text-tertiary\">No roles defined</p>\n ) : (\n allRoles.map((role) => {\n const isSelected = selected.includes(role);\n return (\n <button\n key={role}\n type=\"button\"\n onClick={() => toggle(role)}\n className={`flex items-center gap-2 w-full px-3 py-1.5 text-left text-xs transition-colors ${\n isSelected\n ? 'bg-accent/[0.06] text-accent'\n : 'text-text-primary hover:bg-surface-sunken'\n }`}\n >\n <User className=\"w-3 h-3 shrink-0 text-accent/60\" />\n <span className=\"flex-1\">{role}</span>\n {isSelected && <Check className=\"w-3 h-3 shrink-0\" />}\n </button>\n );\n })\n )}\n </div>\n )}\n </div>\n );\n}\n","import { useState, useRef, useEffect } from 'react';\nimport { Workflow, X, ChevronDown, Check } from 'lucide-react';\n\ninterface WorkflowPickerProps {\n options: string[];\n selected: string[];\n onChange: (workflows: string[]) => void;\n placeholder?: string;\n}\n\nexport function WorkflowPicker({ options, selected, onChange, placeholder }: WorkflowPickerProps) {\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, []);\n\n const toggle = (wfType: string) => {\n onChange(\n selected.includes(wfType)\n ? selected.filter((t) => t !== wfType)\n : [...selected, wfType],\n );\n };\n\n const remove = (wfType: string) => {\n onChange(selected.filter((t) => t !== wfType));\n };\n\n const placeholderText = placeholder ?? 'Add workflows...';\n\n return (\n <div ref={ref} className=\"relative\">\n <button\n type=\"button\"\n onClick={() => setOpen(!open)}\n className=\"flex flex-wrap items-center gap-1.5 w-full min-h-[34px] px-2 py-1.5 bg-surface-sunken border border-surface-border rounded-md text-left cursor-pointer hover:border-accent/40 transition-colors focus:ring-1 focus:ring-accent focus:outline-none\"\n >\n {selected.length === 0 && (\n <span className=\"text-xs text-text-tertiary\">{placeholderText}</span>\n )}\n {selected.map((wfType) => (\n <span\n key={wfType}\n className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-lg bg-accent/[0.08] text-text-secondary text-[11px] font-mono\"\n >\n <Workflow className=\"w-2.5 h-2.5 shrink-0 text-accent/75\" />\n {wfType}\n <span\n role=\"button\"\n onClick={(e) => { e.stopPropagation(); remove(wfType); }}\n className=\"ml-0.5 hover:text-status-error transition-colors\"\n >\n <X className=\"w-2.5 h-2.5\" />\n </span>\n </span>\n ))}\n <ChevronDown className={`w-3.5 h-3.5 ml-auto shrink-0 text-text-tertiary transition-transform ${open ? 'rotate-180' : ''}`} />\n </button>\n\n {open && (\n <div className=\"absolute z-20 mt-1 w-full bg-white border border-surface-border rounded-md shadow-lg max-h-48 overflow-y-auto\">\n {options.length === 0 ? (\n <p className=\"px-3 py-2 text-xs text-text-tertiary\">No registered workflows</p>\n ) : (\n options.map((wfType) => {\n const isSelected = selected.includes(wfType);\n return (\n <button\n key={wfType}\n type=\"button\"\n onClick={() => toggle(wfType)}\n className={`flex items-center gap-2 w-full px-3 py-1.5 text-left text-xs font-mono transition-colors ${\n isSelected\n ? 'bg-accent/[0.06] text-accent'\n : 'text-text-primary hover:bg-surface-sunken'\n }`}\n >\n <Workflow className=\"w-3 h-3 shrink-0 text-accent/60\" />\n <span className=\"flex-1\">{wfType}</span>\n {isSelected && <Check className=\"w-3 h-3 shrink-0\" />}\n </button>\n );\n })\n )}\n </div>\n )}\n </div>\n );\n}\n","import { labelCls, hintCls, jsonCls, jsonValid } from './config-form-types';\nimport type { ConfigFormState } from './config-form-types';\nimport { RolePicker } from '../../../components/common/form/RolePicker';\nimport { WorkflowPicker } from '../../../components/common/form/WorkflowPicker';\nimport { BotPicker } from '../../../components/common/form/BotPicker';\nimport { useWorkflowConfigs } from '../../../api/workflows';\nimport { splitCsv } from '../../../lib/parse';\n\ninterface StepProps {\n form: ConfigFormState;\n set: (field: keyof ConfigFormState, value: string | boolean) => void;\n}\n\ninterface BasicsStepProps extends StepProps {\n editing: boolean;\n durableTypes?: string[];\n}\n\n// ── Helpers ────────────────────────────────────────────────────────────────────\n\nfunction csvToArray(csv: string): string[] {\n return splitCsv(csv);\n}\n\nfunction arrayToCsv(arr: string[]): string {\n return arr.join(', ');\n}\n\n// ── Step 1: Identity ────────────────────────────────────────────────────────\n\nexport function BasicsStep({ form, set, editing, durableTypes = [] }: BasicsStepProps) {\n const showPickList = !editing && durableTypes.length > 0;\n\n return (\n <div className=\"space-y-5\">\n <div>\n <label className={labelCls}>Workflow Type</label>\n {showPickList && !form.workflow_type ? (\n <div className=\"space-y-2\">\n <p className=\"text-xs text-text-secondary\">\n Select a durable workflow to register as certified:\n </p>\n <div className=\"grid gap-1\">\n {durableTypes.map((type) => (\n <button\n key={type}\n onClick={() => set('workflow_type', type)}\n className=\"flex items-center gap-2 px-3 py-2 text-left text-xs font-mono rounded-md border border-surface-border hover:border-accent/50 hover:bg-accent/[0.04] transition-colors\"\n >\n {type}\n </button>\n ))}\n </div>\n <div className=\"flex items-center gap-2 pt-1\">\n <span className=\"text-[10px] text-text-tertiary\">or</span>\n <input\n type=\"text\"\n onChange={(e) => set('workflow_type', e.target.value)}\n placeholder=\"Enter a workflow type manually\"\n className=\"input font-mono text-xs flex-1\"\n />\n </div>\n </div>\n ) : (\n <>\n <input\n type=\"text\"\n value={form.workflow_type}\n onChange={(e) => set('workflow_type', e.target.value)}\n disabled={editing}\n placeholder=\"reviewContent\"\n className=\"input font-mono text-xs w-full\"\n />\n {!editing && form.workflow_type && durableTypes.length > 0 && (\n <button\n onClick={() => set('workflow_type', '')}\n className=\"text-[10px] text-accent hover:underline mt-1\"\n >\n Choose from durable workflows\n </button>\n )}\n </>\n )}\n <p className={hintCls}>\n Registering a durable workflow makes it certified — the interceptor wraps every execution so failures escalate instead of throwing.\n </p>\n </div>\n\n <div>\n <label className={labelCls}>Description</label>\n <input\n type=\"text\"\n value={form.description}\n onChange={(e) => set('description', e.target.value)}\n placeholder=\"AI-powered content moderation with human escalation\"\n className=\"input text-xs w-full\"\n />\n </div>\n\n <div>\n <label className={labelCls}>Task Queue</label>\n <input\n type=\"text\"\n value={form.task_queue}\n onChange={(e) => set('task_queue', e.target.value)}\n placeholder=\"lt-review\"\n className=\"input font-mono text-xs w-full\"\n />\n <p className={hintCls}>\n Durable task queue this workflow listens on\n </p>\n </div>\n </div>\n );\n}\n\n// ── Step 2: Escalation ──────────────────────────────────────────────────────\n\nexport function AccessStep({ form, set }: StepProps) {\n const { data: configs } = useWorkflowConfigs();\n const consumesOptions = (configs ?? [])\n .map((c) => c.workflow_type)\n .filter((t) => t !== form.workflow_type);\n\n return (\n <div className=\"space-y-5\">\n <p className=\"text-xs text-text-secondary leading-relaxed\">\n Configure how escalations are routed and who can interact with this workflow.\n </p>\n\n <div>\n <label className={labelCls}>Default Escalation Role</label>\n <RolePicker\n selected={csvToArray(form.default_role)}\n onChange={(roles) => set('default_role', roles[0] ?? '')}\n single\n placeholder=\"Select escalation role...\"\n />\n <p className={hintCls}>\n When this workflow escalates, assign to users with this role\n </p>\n </div>\n\n <div>\n <label className={labelCls}>Escalation Roles</label>\n <RolePicker\n selected={csvToArray(form.roles)}\n onChange={(roles) => set('roles', arrayToCsv(roles))}\n placeholder=\"Select who can resolve escalations...\"\n />\n <p className={hintCls}>\n Users with any of these roles can claim and resolve escalations from this workflow.\n </p>\n </div>\n\n <div>\n <label className={labelCls}>Consumes</label>\n <WorkflowPicker\n options={consumesOptions}\n selected={csvToArray(form.consumes)}\n onChange={(workflows) => set('consumes', arrayToCsv(workflows))}\n placeholder=\"Select workflow dependencies...\"\n />\n <p className={hintCls}>\n Output from these upstream workflows will be injected into the input envelope for this workflow.\n </p>\n </div>\n </div>\n );\n}\n\n// ── Step 3: Invocation & Schemas ────────────────────────────────────────────\n\nexport function SchemasStep({ form, set }: StepProps) {\n return (\n <div className=\"space-y-5\">\n {/* Invocable toggle */}\n <div className=\"flex gap-6 pt-1\">\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={form.invocable}\n onChange={(e) => set('invocable', e.target.checked)}\n className=\"w-4 h-4 rounded border-border accent-accent\"\n />\n <span className=\"text-xs text-text-primary font-medium\">Invocable</span>\n </label>\n </div>\n <p className={hintCls}>\n Allow this workflow to be started from the dashboard or API.\n </p>\n\n {form.invocable && (\n <>\n {/* Run As */}\n <div>\n <label className={labelCls}>Run As</label>\n <BotPicker\n selected={form.execute_as}\n onChange={(botId) => set('execute_as', botId)}\n />\n <p className={hintCls}>\n Choose a bot to execute this workflow under its identity and credentials.\n Default runs as the invoking user.\n </p>\n </div>\n\n {/* Invocation roles */}\n <div>\n <label className={labelCls}>Invocation Roles</label>\n <RolePicker\n selected={csvToArray(form.invocation_roles)}\n onChange={(roles) => set('invocation_roles', arrayToCsv(roles))}\n placeholder=\"Select who can start this workflow...\"\n />\n <p className={hintCls}>\n Only users with these roles can start this workflow.\n Leave empty to allow all authenticated users.\n </p>\n </div>\n\n {/* Envelope schema */}\n <div>\n <label className={labelCls}>Envelope Schema</label>\n <textarea\n value={form.envelope_schema}\n onChange={(e) => set('envelope_schema', e.target.value)}\n placeholder={`{\\n \"data\": {\\n \"contentId\": \"example-123\",\\n \"content\": \"Text to review\"\\n },\\n \"metadata\": {\\n \"source\": \"dashboard\"\\n }\\n}`}\n className={jsonCls}\n rows={8}\n spellCheck={false}\n />\n <p className={hintCls}>\n Pre-fills the JSON editor when invoking this workflow.\n Should include <span className=\"font-mono\">data</span> (workflow input) and optional <span className=\"font-mono\">metadata</span> (context).\n </p>\n {form.envelope_schema.trim() && !jsonValid(form.envelope_schema) && (\n <p className=\"text-[10px] text-status-error mt-1\">Invalid JSON</p>\n )}\n </div>\n </>\n )}\n\n {!form.invocable && (\n <div className=\"py-4 px-4 bg-surface-sunken/50 rounded-md text-center\">\n <p className=\"text-xs text-text-tertiary\">\n Enable <span className=\"font-medium text-text-secondary\">Invocable</span> above to configure who can start this workflow and set an input template.\n </p>\n </div>\n )}\n\n {/* Resolver schema — always available */}\n <div>\n <label className={labelCls}>Resolver Schema</label>\n <textarea\n value={form.resolver_schema}\n onChange={(e) => set('resolver_schema', e.target.value)}\n placeholder={`{\\n \"approved\": true,\\n \"analysis\": {\\n \"confidence\": 0.95,\\n \"flags\": [],\\n \"summary\": \"Content meets guidelines\"\\n }\\n}`}\n className={jsonCls}\n rows={8}\n spellCheck={false}\n />\n <p className={hintCls}>\n The shape of data a human or AI provides when resolving an escalation from this workflow.\n Pre-fills the JSON editor in the escalation resolution form.\n </p>\n {form.resolver_schema.trim() && !jsonValid(form.resolver_schema) && (\n <p className=\"text-[10px] text-status-error mt-1\">Invalid JSON</p>\n )}\n </div>\n </div>\n );\n}\n","import { useState, useEffect, useCallback, useMemo } from 'react';\nimport { useParams, useNavigate, useSearchParams } from 'react-router-dom';\nimport { useWorkflowConfigs, useUpsertWorkflowConfig, useJobs } from '../../../api/workflows';\nimport { StepIndicator } from '../../../components/common/layout/StepIndicator';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { splitCsv } from '../../../lib/parse';\nimport { EMPTY_FORM, configToForm, STEP_LABELS, isStepValid } from './config-form-types';\nimport type { ConfigFormState } from './config-form-types';\nimport { BasicsStep, AccessStep, SchemasStep } from './ConfigWizardSteps';\n\nexport function WorkflowConfigDetailPage() {\n const { workflowType } = useParams<{ workflowType: string }>();\n const isNew = !workflowType;\n const navigate = useNavigate();\n const { data: configs, isLoading } = useWorkflowConfigs();\n const upsert = useUpsertWorkflowConfig();\n\n const editing = configs?.find((c) => c.workflow_type === workflowType) ?? null;\n\n // Fetch known workflow types from jobs to build the pick-list.\n // System workflows (triage, query, routing pipelines) are excluded —\n // they serve the discovery/compilation layer, not user-authored flows.\n const SYSTEM_WORKFLOWS = new Set([\n 'mcpQuery',\n 'mcpDeterministic',\n 'mcpQueryRouter',\n 'mcpTriage',\n 'mcpTriageRouter',\n 'mcpTriageDeterministic',\n 'insightQuery',\n ]);\n const { data: jobsData } = useJobs({ limit: 500 });\n const unregisteredTypes = useMemo(() => {\n const registeredSet = new Set((configs ?? []).map((c) => c.workflow_type));\n const allEntities = new Set((jobsData?.jobs ?? []).map((j) => j.entity));\n return [...allEntities]\n .filter((e) => !registeredSet.has(e) && !SYSTEM_WORKFLOWS.has(e))\n .sort();\n }, [configs, jobsData]);\n\n // Step via URL search param for browser history\n const [searchParams, setSearchParams] = useSearchParams();\n\n // Pre-fill from URL search params when creating new\n const prefillForm = useMemo((): ConfigFormState => {\n if (!isNew) return EMPTY_FORM;\n const prefillType = searchParams.get('workflow_type') ?? '';\n const prefillQueue = searchParams.get('task_queue') ?? '';\n if (!prefillType && !prefillQueue) return EMPTY_FORM;\n return { ...EMPTY_FORM, workflow_type: prefillType, task_queue: prefillQueue };\n }, [isNew, searchParams]);\n\n const [form, setForm] = useState<ConfigFormState>(prefillForm);\n const [schemaError, setSchemaError] = useState('');\n const [initialized, setInitialized] = useState(false);\n const step = parseInt(searchParams.get('step') || '1', 10);\n const setStep = useCallback((s: number) => {\n setSearchParams((prev) => {\n const next = new URLSearchParams(prev);\n next.set('step', String(s));\n return next;\n }, { replace: false });\n }, [setSearchParams]);\n\n\n useEffect(() => {\n if (initialized) return;\n if (isNew) {\n setForm(prefillForm);\n setInitialized(true);\n return;\n }\n if (editing) {\n setForm(configToForm(editing));\n setInitialized(true);\n }\n }, [editing, isNew, initialized, prefillForm]);\n\n const set = (field: keyof ConfigFormState, value: string | boolean) =>\n setForm((f) => ({ ...f, [field]: value }));\n\n // ── Save ────────────────────────────────────────────────────────────────\n\n const handleSave = () => {\n if (!form.workflow_type.trim()) return;\n setSchemaError('');\n\n let envelope_schema: Record<string, unknown> | null = null;\n let resolver_schema: Record<string, unknown> | null = null;\n\n try {\n if (form.envelope_schema.trim()) envelope_schema = JSON.parse(form.envelope_schema);\n } catch {\n setSchemaError('Invalid JSON in Envelope Schema');\n return;\n }\n try {\n if (form.resolver_schema.trim()) resolver_schema = JSON.parse(form.resolver_schema);\n } catch {\n setSchemaError('Invalid JSON in Resolver Schema');\n return;\n }\n\n upsert.mutate(\n {\n workflow_type: form.workflow_type.trim(),\n description: form.description.trim() || null,\n task_queue: form.task_queue.trim() || null,\n default_role: form.default_role.trim() || 'reviewer',\n invocable: form.invocable,\n roles: splitCsv(form.roles),\n invocation_roles: splitCsv(form.invocation_roles),\n consumes: splitCsv(form.consumes),\n envelope_schema,\n resolver_schema,\n cron_schedule: form.cron_schedule.trim() || null,\n execute_as: form.execute_as.trim() || null,\n },\n {\n onSuccess: () => {\n navigate('/workflows/registry');\n },\n },\n );\n };\n\n // ── Loading / Not found ──────────────────────────────────────────────────\n\n if (isLoading) {\n return (\n <div className=\"animate-pulse space-y-4\">\n <div className=\"h-8 bg-surface-sunken rounded w-48\" />\n <div className=\"h-60 bg-surface-sunken rounded\" />\n </div>\n );\n }\n\n if (!isNew && !editing) {\n return <p className=\"text-sm text-text-secondary\">Config not found.</p>;\n }\n\n // ── Render ──────────────────────────────────────────────────────────────\n\n const isLast = step === STEP_LABELS.length;\n return (\n <div>\n <PageHeader title={isNew ? 'Register Workflow' : editing?.workflow_type ?? ''} />\n\n <div className=\"max-w-3xl\">\n <StepIndicator steps={STEP_LABELS} currentStep={step - 1} onStepClick={(i) => setStep(i + 1)} />\n\n <div className=\"min-h-[360px] py-2\">\n {step === 1 && <BasicsStep form={form} set={set} editing={!!editing} durableTypes={unregisteredTypes} />}\n {step === 2 && <AccessStep form={form} set={set} />}\n {step === 3 && <SchemasStep form={form} set={set} />}\n </div>\n\n {(schemaError || upsert.error) && (\n <p className=\"text-xs text-status-error mt-4\">\n {schemaError || (upsert.error as Error).message}\n </p>\n )}\n\n {/* Navigation */}\n <div className=\"flex justify-between items-center pt-4 border-t border-surface-border mt-4\">\n <div>\n {step > 1 && (\n <button\n onClick={() => setStep(step - 1)}\n className=\"btn-secondary text-xs\"\n >\n Back\n </button>\n )}\n </div>\n <div className=\"flex gap-3\">\n <button onClick={() => navigate('/workflows/registry')} className=\"btn-ghost text-xs\">\n Cancel\n </button>\n {isLast ? (\n <button\n onClick={handleSave}\n disabled={!isStepValid(step, form) || upsert.isPending}\n className=\"btn-primary text-xs\"\n >\n {upsert.isPending ? 'Saving...' : editing ? 'Save' : 'Create'}\n </button>\n ) : (\n <button\n onClick={() => setStep(step + 1)}\n disabled={!isStepValid(step, form)}\n className=\"btn-primary text-xs\"\n >\n Next\n </button>\n )}\n </div>\n </div>\n\n </div>\n </div>\n );\n}\n"],"names":["matchesSearch","wf","search","q","WorkflowConfigsPage","navigate","useNavigate","data","isLoading","useDiscoveredWorkflows","deleteConfig","useDeleteWorkflowConfig","filters","setFilter","useFilterParams","searchInput","setSearchInput","useState","confirmDelete","setConfirmDelete","useEffect","timer","allWorkflows","queues","useMemo","w","roles","workflows","result","columns","row","jsxs","jsx","WorkflowPill","TaskQueuePill","ShieldCheck","r","RolePill","RowActionGroup","RowAction","ShieldOff","ShieldPlus","handleDelete","handleRowClick","PageHeader","FilterBar","e","FilterSelect","v","DataTable","ConfirmDeleteModal","Fragment","StepIndicator","steps","currentStep","onStepClick","label","i","done","active","clickable","splitCsv","s","EMPTY_FORM","configToForm","c","STEP_LABELS","jsonValid","isStepValid","step","form","labelCls","hintCls","jsonCls","RolePicker","selected","onChange","single","placeholder","useRoles","allRoles","open","setOpen","ref","useRef","handler","toggle","role","remove","placeholderText","User","X","ChevronDown","isSelected","Check","WorkflowPicker","options","wfType","t","Workflow","csvToArray","csv","arrayToCsv","arr","BasicsStep","set","editing","durableTypes","showPickList","type","AccessStep","configs","useWorkflowConfigs","consumesOptions","SchemasStep","BotPicker","botId","WorkflowConfigDetailPage","workflowType","useParams","isNew","upsert","useUpsertWorkflowConfig","SYSTEM_WORKFLOWS","jobsData","useJobs","unregisteredTypes","registeredSet","j","searchParams","setSearchParams","useSearchParams","prefillForm","prefillType","prefillQueue","setForm","schemaError","setSchemaError","initialized","setInitialized","setStep","useCallback","prev","next","field","value","f","handleSave","envelope_schema","resolver_schema","isLast"],"mappings":"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"}
1
+ {"version":3,"file":"index-BOeA-gfK.js","sources":["../../src/pages/workflows/registry/WorkflowConfigsPage.tsx","../../src/components/common/layout/StepIndicator.tsx","../../src/lib/parse.ts","../../src/pages/workflows/registry/config-form-types.ts","../../src/components/common/form/RolePicker.tsx","../../src/components/common/form/WorkflowPicker.tsx","../../src/pages/workflows/registry/ConfigWizardSteps.tsx","../../src/pages/workflows/registry/WorkflowConfigDetailPage.tsx"],"sourcesContent":["import { useState, useEffect, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport {\n useDiscoveredWorkflows,\n useDeleteWorkflowConfig,\n} from '../../../api/workflows';\nimport { ShieldCheck, ShieldPlus, ShieldOff } from 'lucide-react';\nimport { DataTable, type Column } from '../../../components/common/data/DataTable';\nimport { ConfirmDeleteModal } from '../../../components/common/modal/ConfirmDeleteModal';\nimport { FilterBar, FilterSelect } from '../../../components/common/data/FilterBar';\nimport { RowAction, RowActionGroup } from '../../../components/common/layout/RowActions';\nimport { useFilterParams } from '../../../hooks/useFilterParams';\nimport type { DiscoveredWorkflow } from '../../../api/types';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { RolePill } from '../../../components/common/display/RolePill';\nimport { TaskQueuePill } from '../../../components/common/display/TaskQueuePill';\nimport { WorkflowPill } from '../../../components/common/display/WorkflowPill';\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\nfunction matchesSearch(wf: DiscoveredWorkflow, search: string): boolean {\n const q = search.toLowerCase();\n return (\n wf.workflow_type.toLowerCase().includes(q) ||\n (wf.description ?? '').toLowerCase().includes(q)\n );\n}\n\n// ── Page ──────────────────────────────────────────────────────────────────────\n\nexport function WorkflowConfigsPage() {\n const navigate = useNavigate();\n const { data, isLoading } = useDiscoveredWorkflows();\n const deleteConfig = useDeleteWorkflowConfig();\n const { filters, setFilter } = useFilterParams({\n filters: { search: '', queue: '', role: '', tier: '' },\n });\n\n const [searchInput, setSearchInput] = useState(filters.search);\n const [confirmDelete, setConfirmDelete] = useState<string | null>(null);\n\n // Debounce search input\n useEffect(() => {\n if (searchInput === filters.search) return;\n const timer = setTimeout(() => setFilter('search', searchInput), 300);\n return () => clearTimeout(timer);\n }, [searchInput, setFilter, filters.search]);\n\n const allWorkflows = data ?? [];\n\n // Derive facet options from data\n const queues = useMemo(\n () => [...new Set(allWorkflows.map((w) => w.task_queue).filter(Boolean) as string[])].sort(),\n [allWorkflows],\n );\n const roles = useMemo(\n () => [...new Set(allWorkflows.flatMap((w) => w.roles ?? []))].sort(),\n [allWorkflows],\n );\n\n // Apply client-side filters\n const workflows = useMemo(() => {\n let result = allWorkflows;\n if (filters.search) result = result.filter((w) => matchesSearch(w, filters.search));\n if (filters.queue) result = result.filter((w) => w.task_queue === filters.queue);\n if (filters.role) result = result.filter((w) => (w.roles ?? []).includes(filters.role));\n if (filters.tier === 'certified') result = result.filter((w) => w.registered);\n if (filters.tier === 'durable') result = result.filter((w) => !w.registered);\n return result;\n }, [allWorkflows, filters]);\n\n const columns: Column<DiscoveredWorkflow>[] = [\n {\n key: 'workflow_type',\n label: 'Workflow',\n render: (row) => (\n <div className=\"min-w-0\">\n <WorkflowPill type={row.workflow_type} />\n {row.description && (\n <p className=\"text-[10px] text-text-tertiary mt-0.5 truncate\">{row.description}</p>\n )}\n </div>\n ),\n },\n {\n key: 'task_queue',\n label: 'Queue',\n render: (row) => row.task_queue ? <TaskQueuePill queue={row.task_queue} /> : <span className=\"text-xs text-text-tertiary\">—</span>,\n className: 'whitespace-nowrap',\n },\n {\n key: 'registered',\n label: 'Tier',\n render: (row) => row.registered\n ? <span className=\"inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] font-medium bg-accent/10 text-accent\"><ShieldCheck className=\"w-3 h-3\" />Certified</span>\n : <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-[10px] font-medium bg-surface-sunken text-text-tertiary\">Durable</span>,\n className: 'whitespace-nowrap',\n },\n {\n key: 'roles',\n label: 'Roles',\n render: (row) => row.registered ? (\n <div className=\"flex gap-1 flex-wrap\">\n {(row.roles ?? []).map((r) => (\n <RolePill key={r} role={r} />\n ))}\n {(!row.roles || row.roles.length === 0) && <span className=\"text-xs text-text-tertiary\">—</span>}\n </div>\n ) : (\n <span className=\"text-xs text-text-tertiary\">—</span>\n ),\n },\n {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n {row.registered ? (\n <RowAction\n icon={ShieldOff}\n title=\"De-certify workflow\"\n onClick={() => setConfirmDelete(row.workflow_type)}\n colorClass=\"text-text-tertiary hover:text-status-warning\"\n />\n ) : (\n <RowAction\n icon={ShieldPlus}\n title=\"Certify workflow\"\n onClick={() => navigate(`/workflows/registry/new?workflow_type=${encodeURIComponent(row.workflow_type)}&task_queue=${encodeURIComponent(row.task_queue ?? '')}`)}\n colorClass=\"text-text-tertiary hover:text-status-success\"\n />\n )}\n </RowActionGroup>\n ),\n className: 'w-16 text-right',\n },\n ];\n\n const handleDelete = () => {\n if (!confirmDelete) return;\n deleteConfig.mutate(confirmDelete, {\n onSuccess: () => setConfirmDelete(null),\n });\n };\n\n const handleRowClick = (row: DiscoveredWorkflow) => {\n if (row.registered) {\n navigate(`/workflows/registry/${encodeURIComponent(row.workflow_type)}`);\n } else {\n navigate(`/workflows/registry/new?workflow_type=${encodeURIComponent(row.workflow_type)}&task_queue=${encodeURIComponent(row.task_queue ?? '')}`);\n }\n };\n\n return (\n <div>\n <PageHeader\n title=\"Workflow Registry\"\n actions={\n <button\n onClick={() => navigate('/workflows/registry/new')}\n className=\"btn-primary text-xs\"\n >\n Register Workflow\n </button>\n }\n />\n\n <FilterBar>\n <input\n type=\"text\"\n placeholder=\"Search workflow type...\"\n value={searchInput}\n onChange={(e) => setSearchInput(e.target.value)}\n className=\"input text-[11px] py-1 px-2 w-56\"\n />\n <FilterSelect\n label=\"Queue\"\n value={filters.queue}\n onChange={(v) => setFilter('queue', v)}\n options={queues.map((q) => ({ value: q, label: q }))}\n />\n <FilterSelect\n label=\"Tier\"\n value={filters.tier}\n onChange={(v) => setFilter('tier', v)}\n options={[\n { value: 'certified', label: 'Certified' },\n { value: 'durable', label: 'Durable' },\n ]}\n />\n <FilterSelect\n label=\"Role\"\n value={filters.role}\n onChange={(v) => setFilter('role', v)}\n options={roles.map((r) => ({ value: r, label: r }))}\n />\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={workflows}\n keyFn={(row) => row.workflow_type}\n onRowClick={handleRowClick}\n isLoading={isLoading}\n emptyMessage=\"No workflows found\"\n />\n\n {/* Delete confirmation modal */}\n <ConfirmDeleteModal\n open={!!confirmDelete}\n onClose={() => setConfirmDelete(null)}\n onConfirm={handleDelete}\n title=\"De-certify Workflow\"\n description={<>Remove certification from <span className=\"font-mono font-medium text-text-primary\">{confirmDelete}</span>? This removes interceptor guarantees, escalation chains, and invocation role constraints. The workflow will continue running as a standard durable workflow.</>}\n isPending={deleteConfig.isPending}\n error={deleteConfig.error as Error | null}\n />\n </div>\n );\n}\n","interface StepIndicatorProps {\n steps: string[];\n currentStep: number;\n onStepClick?: (step: number) => void;\n}\n\nexport function StepIndicator({ steps, currentStep, onStepClick }: StepIndicatorProps) {\n return (\n <div className=\"flex items-center justify-center gap-1 pb-4 border-b border-surface-border mb-4\">\n {steps.map((label, i) => {\n const done = i < currentStep;\n const active = i === currentStep;\n const clickable = !!onStepClick;\n return (\n <div key={label} className=\"flex items-center gap-1\">\n {i > 0 && (\n <div className={`w-4 h-px ${done ? 'bg-accent' : 'bg-surface-border'}`} />\n )}\n <button\n type=\"button\"\n onClick={clickable ? () => onStepClick(i) : undefined}\n className={`flex items-center gap-1 ${clickable ? 'cursor-pointer' : 'cursor-default'}`}\n >\n <span\n className={`w-5 h-5 rounded-full text-[10px] font-semibold flex items-center justify-center shrink-0 transition-colors ${\n active\n ? 'bg-accent text-text-inverse'\n : done\n ? 'bg-accent-muted text-accent'\n : 'bg-surface-sunken text-text-tertiary'\n } ${clickable && !active ? 'hover:bg-accent-muted hover:text-accent' : ''}`}\n >\n {i + 1}\n </span>\n <span\n className={`text-[10px] font-semibold uppercase tracking-wider whitespace-nowrap transition-colors ${\n active ? 'text-text-primary' : 'text-text-tertiary'\n } ${clickable && !active ? 'hover:text-text-primary' : ''}`}\n >\n {label}\n </span>\n </button>\n </div>\n );\n })}\n </div>\n );\n}\n","export function splitCsv(s: string): string[] {\n return s\n .split(',')\n .map((v) => v.trim())\n .filter(Boolean);\n}\n\nexport function safeParseJson<T = unknown>(\n json: string,\n): { ok: true; data: T } | { ok: false; error: string } {\n try {\n return { ok: true, data: JSON.parse(json) as T };\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : 'Invalid JSON';\n return { ok: false, error: message };\n }\n}\n","import type { LTWorkflowConfig } from '../../../api/types';\n\nexport interface ConfigFormState {\n workflow_type: string;\n description: string;\n task_queue: string;\n default_role: string;\n invocable: boolean;\n roles: string;\n invocation_roles: string;\n consumes: string;\n envelope_schema: string;\n resolver_schema: string;\n cron_schedule: string;\n execute_as: string;\n}\n\nexport const EMPTY_FORM: ConfigFormState = {\n workflow_type: '',\n description: '',\n task_queue: '',\n default_role: 'reviewer',\n invocable: false,\n roles: '',\n invocation_roles: '',\n consumes: '',\n envelope_schema: '',\n resolver_schema: '',\n cron_schedule: '',\n execute_as: '',\n};\n\nexport function configToForm(c: LTWorkflowConfig): ConfigFormState {\n return {\n workflow_type: c.workflow_type,\n description: c.description ?? '',\n task_queue: c.task_queue ?? '',\n default_role: c.default_role,\n invocable: c.invocable,\n roles: (c.roles ?? []).join(', '),\n invocation_roles: (c.invocation_roles ?? []).join(', '),\n consumes: (c.consumes ?? []).join(', '),\n envelope_schema: c.envelope_schema ? JSON.stringify(c.envelope_schema, null, 2) : '',\n resolver_schema: c.resolver_schema ? JSON.stringify(c.resolver_schema, null, 2) : '',\n cron_schedule: c.cron_schedule ?? '',\n execute_as: c.execute_as ?? '',\n };\n}\n\nexport const STEP_LABELS = ['Identity', 'Escalation', 'Invocation & Schemas'];\n\nexport function jsonValid(v: string): boolean {\n if (!v.trim()) return true;\n try { JSON.parse(v); return true; } catch { return false; }\n}\n\nexport function isStepValid(step: number, form: ConfigFormState): boolean {\n if (step === 1) return !!form.workflow_type.trim();\n if (step === 3) return jsonValid(form.envelope_schema) && jsonValid(form.resolver_schema);\n return true;\n}\n\nexport const labelCls = 'block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1';\nexport const hintCls = 'text-[10px] text-text-tertiary mt-2 leading-relaxed';\nexport const jsonCls = 'input font-mono text-[11px] w-full leading-relaxed tabular-nums';\n\nexport const DEFAULT_ENVELOPE = '{\\n \"data\": {},\\n \"metadata\": {}\\n}';\n","import { useState, useRef, useEffect } from 'react';\nimport { User, X, ChevronDown, Check } from 'lucide-react';\nimport { useRoles } from '../../../api/roles';\n\ninterface RolePickerProps {\n selected: string[];\n onChange: (roles: string[]) => void;\n /** Only allow one selection */\n single?: boolean;\n placeholder?: string;\n}\n\nexport function RolePicker({ selected, onChange, single, placeholder }: RolePickerProps) {\n const { data } = useRoles();\n const allRoles = data?.roles ?? [];\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, []);\n\n const toggle = (role: string) => {\n if (single) {\n onChange(selected.includes(role) ? [] : [role]);\n setOpen(false);\n } else {\n onChange(\n selected.includes(role)\n ? selected.filter((r) => r !== role)\n : [...selected, role],\n );\n }\n };\n\n const remove = (role: string) => {\n onChange(selected.filter((r) => r !== role));\n };\n\n const placeholderText = placeholder ?? (single ? 'Select role...' : 'Add roles...');\n\n return (\n <div ref={ref} className=\"relative\">\n {/* Selected pills + trigger */}\n <button\n type=\"button\"\n onClick={() => setOpen(!open)}\n className=\"flex flex-wrap items-center gap-1.5 w-full min-h-[34px] px-2 py-1.5 bg-surface-sunken border border-surface-border rounded-md text-left cursor-pointer hover:border-accent/40 transition-colors focus:ring-1 focus:ring-accent focus:outline-none\"\n >\n {selected.length === 0 && (\n <span className=\"text-xs text-text-tertiary\">{placeholderText}</span>\n )}\n {selected.map((role) => (\n <span\n key={role}\n className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-lg bg-accent/[0.08] text-text-secondary text-[11px]\"\n >\n <User className=\"w-2.5 h-2.5 shrink-0 text-accent/75\" />\n {role}\n <span\n role=\"button\"\n onClick={(e) => { e.stopPropagation(); remove(role); }}\n className=\"ml-0.5 hover:text-status-error transition-colors\"\n >\n <X className=\"w-2.5 h-2.5\" />\n </span>\n </span>\n ))}\n <ChevronDown className={`w-3.5 h-3.5 ml-auto shrink-0 text-text-tertiary transition-transform ${open ? 'rotate-180' : ''}`} />\n </button>\n\n {/* Dropdown */}\n {open && (\n <div className=\"absolute z-20 mt-1 w-full bg-white border border-surface-border rounded-md shadow-lg max-h-48 overflow-y-auto\">\n {allRoles.length === 0 ? (\n <p className=\"px-3 py-2 text-xs text-text-tertiary\">No roles defined</p>\n ) : (\n allRoles.map((role) => {\n const isSelected = selected.includes(role);\n return (\n <button\n key={role}\n type=\"button\"\n onClick={() => toggle(role)}\n className={`flex items-center gap-2 w-full px-3 py-1.5 text-left text-xs transition-colors ${\n isSelected\n ? 'bg-accent/[0.06] text-accent'\n : 'text-text-primary hover:bg-surface-sunken'\n }`}\n >\n <User className=\"w-3 h-3 shrink-0 text-accent/60\" />\n <span className=\"flex-1\">{role}</span>\n {isSelected && <Check className=\"w-3 h-3 shrink-0\" />}\n </button>\n );\n })\n )}\n </div>\n )}\n </div>\n );\n}\n","import { useState, useRef, useEffect } from 'react';\nimport { Workflow, X, ChevronDown, Check } from 'lucide-react';\n\ninterface WorkflowPickerProps {\n options: string[];\n selected: string[];\n onChange: (workflows: string[]) => void;\n placeholder?: string;\n}\n\nexport function WorkflowPicker({ options, selected, onChange, placeholder }: WorkflowPickerProps) {\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, []);\n\n const toggle = (wfType: string) => {\n onChange(\n selected.includes(wfType)\n ? selected.filter((t) => t !== wfType)\n : [...selected, wfType],\n );\n };\n\n const remove = (wfType: string) => {\n onChange(selected.filter((t) => t !== wfType));\n };\n\n const placeholderText = placeholder ?? 'Add workflows...';\n\n return (\n <div ref={ref} className=\"relative\">\n <button\n type=\"button\"\n onClick={() => setOpen(!open)}\n className=\"flex flex-wrap items-center gap-1.5 w-full min-h-[34px] px-2 py-1.5 bg-surface-sunken border border-surface-border rounded-md text-left cursor-pointer hover:border-accent/40 transition-colors focus:ring-1 focus:ring-accent focus:outline-none\"\n >\n {selected.length === 0 && (\n <span className=\"text-xs text-text-tertiary\">{placeholderText}</span>\n )}\n {selected.map((wfType) => (\n <span\n key={wfType}\n className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-lg bg-accent/[0.08] text-text-secondary text-[11px] font-mono\"\n >\n <Workflow className=\"w-2.5 h-2.5 shrink-0 text-accent/75\" />\n {wfType}\n <span\n role=\"button\"\n onClick={(e) => { e.stopPropagation(); remove(wfType); }}\n className=\"ml-0.5 hover:text-status-error transition-colors\"\n >\n <X className=\"w-2.5 h-2.5\" />\n </span>\n </span>\n ))}\n <ChevronDown className={`w-3.5 h-3.5 ml-auto shrink-0 text-text-tertiary transition-transform ${open ? 'rotate-180' : ''}`} />\n </button>\n\n {open && (\n <div className=\"absolute z-20 mt-1 w-full bg-white border border-surface-border rounded-md shadow-lg max-h-48 overflow-y-auto\">\n {options.length === 0 ? (\n <p className=\"px-3 py-2 text-xs text-text-tertiary\">No registered workflows</p>\n ) : (\n options.map((wfType) => {\n const isSelected = selected.includes(wfType);\n return (\n <button\n key={wfType}\n type=\"button\"\n onClick={() => toggle(wfType)}\n className={`flex items-center gap-2 w-full px-3 py-1.5 text-left text-xs font-mono transition-colors ${\n isSelected\n ? 'bg-accent/[0.06] text-accent'\n : 'text-text-primary hover:bg-surface-sunken'\n }`}\n >\n <Workflow className=\"w-3 h-3 shrink-0 text-accent/60\" />\n <span className=\"flex-1\">{wfType}</span>\n {isSelected && <Check className=\"w-3 h-3 shrink-0\" />}\n </button>\n );\n })\n )}\n </div>\n )}\n </div>\n );\n}\n","import { labelCls, hintCls, jsonCls, jsonValid } from './config-form-types';\nimport type { ConfigFormState } from './config-form-types';\nimport { RolePicker } from '../../../components/common/form/RolePicker';\nimport { WorkflowPicker } from '../../../components/common/form/WorkflowPicker';\nimport { BotPicker } from '../../../components/common/form/BotPicker';\nimport { useWorkflowConfigs } from '../../../api/workflows';\nimport { splitCsv } from '../../../lib/parse';\n\ninterface StepProps {\n form: ConfigFormState;\n set: (field: keyof ConfigFormState, value: string | boolean) => void;\n}\n\ninterface BasicsStepProps extends StepProps {\n editing: boolean;\n durableTypes?: string[];\n}\n\n// ── Helpers ────────────────────────────────────────────────────────────────────\n\nfunction csvToArray(csv: string): string[] {\n return splitCsv(csv);\n}\n\nfunction arrayToCsv(arr: string[]): string {\n return arr.join(', ');\n}\n\n// ── Step 1: Identity ────────────────────────────────────────────────────────\n\nexport function BasicsStep({ form, set, editing, durableTypes = [] }: BasicsStepProps) {\n const showPickList = !editing && durableTypes.length > 0;\n\n return (\n <div className=\"space-y-5\">\n <div>\n <label className={labelCls}>Workflow Type</label>\n {showPickList && !form.workflow_type ? (\n <div className=\"space-y-2\">\n <p className=\"text-xs text-text-secondary\">\n Select a durable workflow to register as certified:\n </p>\n <div className=\"grid gap-1\">\n {durableTypes.map((type) => (\n <button\n key={type}\n onClick={() => set('workflow_type', type)}\n className=\"flex items-center gap-2 px-3 py-2 text-left text-xs font-mono rounded-md border border-surface-border hover:border-accent/50 hover:bg-accent/[0.04] transition-colors\"\n >\n {type}\n </button>\n ))}\n </div>\n <div className=\"flex items-center gap-2 pt-1\">\n <span className=\"text-[10px] text-text-tertiary\">or</span>\n <input\n type=\"text\"\n onChange={(e) => set('workflow_type', e.target.value)}\n placeholder=\"Enter a workflow type manually\"\n className=\"input font-mono text-xs flex-1\"\n />\n </div>\n </div>\n ) : (\n <>\n <input\n type=\"text\"\n value={form.workflow_type}\n onChange={(e) => set('workflow_type', e.target.value)}\n disabled={editing}\n placeholder=\"reviewContent\"\n className=\"input font-mono text-xs w-full\"\n />\n {!editing && form.workflow_type && durableTypes.length > 0 && (\n <button\n onClick={() => set('workflow_type', '')}\n className=\"text-[10px] text-accent hover:underline mt-1\"\n >\n Choose from durable workflows\n </button>\n )}\n </>\n )}\n <p className={hintCls}>\n Registering a durable workflow makes it certified — the interceptor wraps every execution so failures escalate instead of throwing.\n </p>\n </div>\n\n <div>\n <label className={labelCls}>Description</label>\n <input\n type=\"text\"\n value={form.description}\n onChange={(e) => set('description', e.target.value)}\n placeholder=\"AI-powered content moderation with human escalation\"\n className=\"input text-xs w-full\"\n />\n </div>\n\n <div>\n <label className={labelCls}>Task Queue</label>\n <input\n type=\"text\"\n value={form.task_queue}\n onChange={(e) => set('task_queue', e.target.value)}\n placeholder=\"lt-review\"\n className=\"input font-mono text-xs w-full\"\n />\n <p className={hintCls}>\n Durable task queue this workflow listens on\n </p>\n </div>\n </div>\n );\n}\n\n// ── Step 2: Escalation ──────────────────────────────────────────────────────\n\nexport function AccessStep({ form, set }: StepProps) {\n const { data: configs } = useWorkflowConfigs();\n const consumesOptions = (configs ?? [])\n .map((c) => c.workflow_type)\n .filter((t) => t !== form.workflow_type);\n\n return (\n <div className=\"space-y-5\">\n <p className=\"text-xs text-text-secondary leading-relaxed\">\n Configure how escalations are routed and who can interact with this workflow.\n </p>\n\n <div>\n <label className={labelCls}>Default Escalation Role</label>\n <RolePicker\n selected={csvToArray(form.default_role)}\n onChange={(roles) => set('default_role', roles[0] ?? '')}\n single\n placeholder=\"Select escalation role...\"\n />\n <p className={hintCls}>\n When this workflow escalates, assign to users with this role\n </p>\n </div>\n\n <div>\n <label className={labelCls}>Escalation Roles</label>\n <RolePicker\n selected={csvToArray(form.roles)}\n onChange={(roles) => set('roles', arrayToCsv(roles))}\n placeholder=\"Select who can resolve escalations...\"\n />\n <p className={hintCls}>\n Users with any of these roles can claim and resolve escalations from this workflow.\n </p>\n </div>\n\n <div>\n <label className={labelCls}>Consumes</label>\n <WorkflowPicker\n options={consumesOptions}\n selected={csvToArray(form.consumes)}\n onChange={(workflows) => set('consumes', arrayToCsv(workflows))}\n placeholder=\"Select workflow dependencies...\"\n />\n <p className={hintCls}>\n Output from these upstream workflows will be injected into the input envelope for this workflow.\n </p>\n </div>\n </div>\n );\n}\n\n// ── Step 3: Invocation & Schemas ────────────────────────────────────────────\n\nexport function SchemasStep({ form, set }: StepProps) {\n return (\n <div className=\"space-y-5\">\n {/* Invocable toggle */}\n <div className=\"flex gap-6 pt-1\">\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={form.invocable}\n onChange={(e) => set('invocable', e.target.checked)}\n className=\"w-4 h-4 rounded border-border accent-accent\"\n />\n <span className=\"text-xs text-text-primary font-medium\">Invocable</span>\n </label>\n </div>\n <p className={hintCls}>\n Allow this workflow to be started from the dashboard or API.\n </p>\n\n {form.invocable && (\n <>\n {/* Run As */}\n <div>\n <label className={labelCls}>Run As</label>\n <BotPicker\n selected={form.execute_as}\n onChange={(botId) => set('execute_as', botId)}\n />\n <p className={hintCls}>\n Choose a bot to execute this workflow under its identity and credentials.\n Default runs as the invoking user.\n </p>\n </div>\n\n {/* Invocation roles */}\n <div>\n <label className={labelCls}>Invocation Roles</label>\n <RolePicker\n selected={csvToArray(form.invocation_roles)}\n onChange={(roles) => set('invocation_roles', arrayToCsv(roles))}\n placeholder=\"Select who can start this workflow...\"\n />\n <p className={hintCls}>\n Only users with these roles can start this workflow.\n Leave empty to allow all authenticated users.\n </p>\n </div>\n\n {/* Envelope schema */}\n <div>\n <label className={labelCls}>Envelope Schema</label>\n <textarea\n value={form.envelope_schema}\n onChange={(e) => set('envelope_schema', e.target.value)}\n placeholder={`{\\n \"data\": {\\n \"contentId\": \"example-123\",\\n \"content\": \"Text to review\"\\n },\\n \"metadata\": {\\n \"source\": \"dashboard\"\\n }\\n}`}\n className={jsonCls}\n rows={8}\n spellCheck={false}\n />\n <p className={hintCls}>\n Pre-fills the JSON editor when invoking this workflow.\n Should include <span className=\"font-mono\">data</span> (workflow input) and optional <span className=\"font-mono\">metadata</span> (context).\n </p>\n {form.envelope_schema.trim() && !jsonValid(form.envelope_schema) && (\n <p className=\"text-[10px] text-status-error mt-1\">Invalid JSON</p>\n )}\n </div>\n </>\n )}\n\n {!form.invocable && (\n <div className=\"py-4 px-4 bg-surface-sunken/50 rounded-md text-center\">\n <p className=\"text-xs text-text-tertiary\">\n Enable <span className=\"font-medium text-text-secondary\">Invocable</span> above to configure who can start this workflow and set an input template.\n </p>\n </div>\n )}\n\n {/* Resolver schema — always available */}\n <div>\n <label className={labelCls}>Resolver Schema</label>\n <textarea\n value={form.resolver_schema}\n onChange={(e) => set('resolver_schema', e.target.value)}\n placeholder={`{\\n \"approved\": true,\\n \"analysis\": {\\n \"confidence\": 0.95,\\n \"flags\": [],\\n \"summary\": \"Content meets guidelines\"\\n }\\n}`}\n className={jsonCls}\n rows={8}\n spellCheck={false}\n />\n <p className={hintCls}>\n The shape of data a human or AI provides when resolving an escalation from this workflow.\n Pre-fills the JSON editor in the escalation resolution form.\n </p>\n {form.resolver_schema.trim() && !jsonValid(form.resolver_schema) && (\n <p className=\"text-[10px] text-status-error mt-1\">Invalid JSON</p>\n )}\n </div>\n </div>\n );\n}\n","import { useState, useEffect, useCallback, useMemo } from 'react';\nimport { useParams, useNavigate, useSearchParams } from 'react-router-dom';\nimport { useWorkflowConfigs, useUpsertWorkflowConfig, useJobs } from '../../../api/workflows';\nimport { StepIndicator } from '../../../components/common/layout/StepIndicator';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { splitCsv } from '../../../lib/parse';\nimport { EMPTY_FORM, configToForm, STEP_LABELS, isStepValid } from './config-form-types';\nimport type { ConfigFormState } from './config-form-types';\nimport { BasicsStep, AccessStep, SchemasStep } from './ConfigWizardSteps';\n\nexport function WorkflowConfigDetailPage() {\n const { workflowType } = useParams<{ workflowType: string }>();\n const isNew = !workflowType;\n const navigate = useNavigate();\n const { data: configs, isLoading } = useWorkflowConfigs();\n const upsert = useUpsertWorkflowConfig();\n\n const editing = configs?.find((c) => c.workflow_type === workflowType) ?? null;\n\n // Fetch known workflow types from jobs to build the pick-list.\n // System workflows (triage, query, routing pipelines) are excluded —\n // they serve the discovery/compilation layer, not user-authored flows.\n const SYSTEM_WORKFLOWS = new Set([\n 'mcpQuery',\n 'mcpDeterministic',\n 'mcpQueryRouter',\n 'mcpTriage',\n 'mcpTriageRouter',\n 'mcpTriageDeterministic',\n 'insightQuery',\n ]);\n const { data: jobsData } = useJobs({ limit: 500 });\n const unregisteredTypes = useMemo(() => {\n const registeredSet = new Set((configs ?? []).map((c) => c.workflow_type));\n const allEntities = new Set((jobsData?.jobs ?? []).map((j) => j.entity));\n return [...allEntities]\n .filter((e) => !registeredSet.has(e) && !SYSTEM_WORKFLOWS.has(e))\n .sort();\n }, [configs, jobsData]);\n\n // Step via URL search param for browser history\n const [searchParams, setSearchParams] = useSearchParams();\n\n // Pre-fill from URL search params when creating new\n const prefillForm = useMemo((): ConfigFormState => {\n if (!isNew) return EMPTY_FORM;\n const prefillType = searchParams.get('workflow_type') ?? '';\n const prefillQueue = searchParams.get('task_queue') ?? '';\n if (!prefillType && !prefillQueue) return EMPTY_FORM;\n return { ...EMPTY_FORM, workflow_type: prefillType, task_queue: prefillQueue };\n }, [isNew, searchParams]);\n\n const [form, setForm] = useState<ConfigFormState>(prefillForm);\n const [schemaError, setSchemaError] = useState('');\n const [initialized, setInitialized] = useState(false);\n const step = parseInt(searchParams.get('step') || '1', 10);\n const setStep = useCallback((s: number) => {\n setSearchParams((prev) => {\n const next = new URLSearchParams(prev);\n next.set('step', String(s));\n return next;\n }, { replace: false });\n }, [setSearchParams]);\n\n\n useEffect(() => {\n if (initialized) return;\n if (isNew) {\n setForm(prefillForm);\n setInitialized(true);\n return;\n }\n if (editing) {\n setForm(configToForm(editing));\n setInitialized(true);\n }\n }, [editing, isNew, initialized, prefillForm]);\n\n const set = (field: keyof ConfigFormState, value: string | boolean) =>\n setForm((f) => ({ ...f, [field]: value }));\n\n // ── Save ────────────────────────────────────────────────────────────────\n\n const handleSave = () => {\n if (!form.workflow_type.trim()) return;\n setSchemaError('');\n\n let envelope_schema: Record<string, unknown> | null = null;\n let resolver_schema: Record<string, unknown> | null = null;\n\n try {\n if (form.envelope_schema.trim()) envelope_schema = JSON.parse(form.envelope_schema);\n } catch {\n setSchemaError('Invalid JSON in Envelope Schema');\n return;\n }\n try {\n if (form.resolver_schema.trim()) resolver_schema = JSON.parse(form.resolver_schema);\n } catch {\n setSchemaError('Invalid JSON in Resolver Schema');\n return;\n }\n\n upsert.mutate(\n {\n workflow_type: form.workflow_type.trim(),\n description: form.description.trim() || null,\n task_queue: form.task_queue.trim() || null,\n default_role: form.default_role.trim() || 'reviewer',\n invocable: form.invocable,\n roles: splitCsv(form.roles),\n invocation_roles: splitCsv(form.invocation_roles),\n consumes: splitCsv(form.consumes),\n envelope_schema,\n resolver_schema,\n cron_schedule: form.cron_schedule.trim() || null,\n execute_as: form.execute_as.trim() || null,\n },\n {\n onSuccess: () => {\n navigate('/workflows/registry');\n },\n },\n );\n };\n\n // ── Loading / Not found ──────────────────────────────────────────────────\n\n if (isLoading) {\n return (\n <div className=\"animate-pulse space-y-4\">\n <div className=\"h-8 bg-surface-sunken rounded w-48\" />\n <div className=\"h-60 bg-surface-sunken rounded\" />\n </div>\n );\n }\n\n if (!isNew && !editing) {\n return <p className=\"text-sm text-text-secondary\">Config not found.</p>;\n }\n\n // ── Render ──────────────────────────────────────────────────────────────\n\n const isLast = step === STEP_LABELS.length;\n return (\n <div>\n <PageHeader title={isNew ? 'Register Workflow' : editing?.workflow_type ?? ''} />\n\n <div className=\"max-w-3xl\">\n <StepIndicator steps={STEP_LABELS} currentStep={step - 1} onStepClick={(i) => setStep(i + 1)} />\n\n <div className=\"min-h-[360px] py-2\">\n {step === 1 && <BasicsStep form={form} set={set} editing={!!editing} durableTypes={unregisteredTypes} />}\n {step === 2 && <AccessStep form={form} set={set} />}\n {step === 3 && <SchemasStep form={form} set={set} />}\n </div>\n\n {(schemaError || upsert.error) && (\n <p className=\"text-xs text-status-error mt-4\">\n {schemaError || (upsert.error as Error).message}\n </p>\n )}\n\n {/* Navigation */}\n <div className=\"flex justify-between items-center pt-4 border-t border-surface-border mt-4\">\n <div>\n {step > 1 && (\n <button\n onClick={() => setStep(step - 1)}\n className=\"btn-secondary text-xs\"\n >\n Back\n </button>\n )}\n </div>\n <div className=\"flex gap-3\">\n <button onClick={() => navigate('/workflows/registry')} className=\"btn-ghost text-xs\">\n Cancel\n </button>\n {isLast ? (\n <button\n onClick={handleSave}\n disabled={!isStepValid(step, form) || upsert.isPending}\n className=\"btn-primary text-xs\"\n >\n {upsert.isPending ? 'Saving...' : editing ? 'Save' : 'Create'}\n </button>\n ) : (\n <button\n onClick={() => setStep(step + 1)}\n disabled={!isStepValid(step, form)}\n className=\"btn-primary text-xs\"\n >\n Next\n </button>\n )}\n </div>\n </div>\n\n </div>\n </div>\n );\n}\n"],"names":["matchesSearch","wf","search","q","WorkflowConfigsPage","navigate","useNavigate","data","isLoading","useDiscoveredWorkflows","deleteConfig","useDeleteWorkflowConfig","filters","setFilter","useFilterParams","searchInput","setSearchInput","useState","confirmDelete","setConfirmDelete","useEffect","timer","allWorkflows","queues","useMemo","w","roles","workflows","result","columns","row","jsxDEV","WorkflowPill","TaskQueuePill","ShieldCheck","r","RolePill","RowActionGroup","RowAction","ShieldOff","ShieldPlus","handleDelete","handleRowClick","PageHeader","FilterBar","e","FilterSelect","v","DataTable","ConfirmDeleteModal","Fragment","StepIndicator","steps","currentStep","onStepClick","label","i","done","active","clickable","splitCsv","EMPTY_FORM","configToForm","c","STEP_LABELS","jsonValid","isStepValid","step","form","labelCls","hintCls","jsonCls","RolePicker","selected","onChange","single","placeholder","useRoles","allRoles","open","setOpen","ref","useRef","handler","toggle","role","remove","placeholderText","User","X","ChevronDown","isSelected","Check","WorkflowPicker","options","wfType","t","Workflow","csvToArray","csv","arrayToCsv","arr","BasicsStep","set","editing","durableTypes","showPickList","type","AccessStep","configs","useWorkflowConfigs","consumesOptions","SchemasStep","BotPicker","botId","WorkflowConfigDetailPage","workflowType","useParams","isNew","upsert","useUpsertWorkflowConfig","SYSTEM_WORKFLOWS","jobsData","useJobs","unregisteredTypes","registeredSet","j","searchParams","setSearchParams","useSearchParams","prefillForm","prefillType","prefillQueue","setForm","schemaError","setSchemaError","initialized","setInitialized","setStep","useCallback","s","prev","next","field","value","f","handleSave","envelope_schema","resolver_schema","isLast"],"mappings":"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"}