@hotmeshio/long-tail 0.14.3 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (305) hide show
  1. package/README.md +23 -9
  2. package/build/api/escalations/create.js +18 -0
  3. package/build/api/escalations/index.d.ts +1 -0
  4. package/build/api/escalations/index.js +3 -1
  5. package/build/api/escalations/lookups.d.ts +20 -0
  6. package/build/api/escalations/lookups.js +90 -0
  7. package/build/api/escalations/metadata.d.ts +1 -1
  8. package/build/api/escalations/metadata.js +4 -4
  9. package/build/api/escalations/resolve.d.ts +1 -1
  10. package/build/api/escalations/resolve.js +6 -6
  11. package/build/api/knowledge.d.ts +9 -0
  12. package/build/api/knowledge.js +24 -0
  13. package/build/bin/ltc.js +10 -0
  14. package/build/index.d.ts +1 -1
  15. package/build/index.js +3 -2
  16. package/build/lib/cli/commands/escalations.d.ts +3 -0
  17. package/build/lib/cli/commands/escalations.js +25 -0
  18. package/build/lib/cli/commands/knowledge.d.ts +5 -0
  19. package/build/lib/cli/commands/knowledge.js +17 -2
  20. package/build/lib/cli/scanner.js +2 -0
  21. package/build/lib/db/schemas/033_knowledge_versions.sql +33 -0
  22. package/build/routes/escalations/single.js +10 -0
  23. package/build/routes/knowledge.js +35 -2
  24. package/build/sdk/index.d.ts +5 -0
  25. package/build/sdk/index.js +3 -0
  26. package/build/services/diagnostics/patterns.js +1 -1
  27. package/build/services/escalation/crud.d.ts +3 -3
  28. package/build/services/escalation/crud.js +9 -2
  29. package/build/services/escalation/resolver-validation.js +6 -0
  30. package/build/services/escalation/sql.d.ts +1 -1
  31. package/build/services/escalation/sql.js +1 -1
  32. package/build/services/knowledge/index.d.ts +18 -0
  33. package/build/services/knowledge/index.js +52 -0
  34. package/build/services/knowledge/lookup-cache.d.ts +29 -0
  35. package/build/services/knowledge/lookup-cache.js +94 -0
  36. package/build/services/knowledge/sql.d.ts +2 -0
  37. package/build/services/knowledge/sql.js +14 -0
  38. package/build/services/mcp/server-tools.js +30 -0
  39. package/build/services/orchestrator/condition.d.ts +33 -13
  40. package/build/services/orchestrator/condition.js +41 -14
  41. package/build/services/yaml-workflow/durable-compiler/parser.js +4 -1
  42. package/build/shared/form-validation/ctx-path.d.ts +12 -0
  43. package/build/shared/form-validation/ctx-path.js +56 -0
  44. package/build/shared/form-validation/field-validator.d.ts +4 -2
  45. package/build/shared/form-validation/field-validator.js +25 -19
  46. package/build/shared/form-validation/index.d.ts +3 -0
  47. package/build/shared/form-validation/index.js +3 -0
  48. package/build/shared/form-validation/validate-resolver-payload.d.ts +2 -0
  49. package/build/shared/form-validation/validate-resolver-payload.js +19 -0
  50. package/build/shared/form-validation/x-lt-help.d.ts +1 -1
  51. package/build/shared/form-validation/x-lt-help.js +2 -1
  52. package/build/shared/form-validation/x-lt-options.d.ts +7 -0
  53. package/build/shared/form-validation/x-lt-options.js +63 -0
  54. package/build/shared/form-validation/x-lt-require-sum.d.ts +30 -0
  55. package/build/shared/form-validation/x-lt-require-sum.js +59 -0
  56. package/build/system/activities/knowledge.d.ts +3 -0
  57. package/build/system/activities/knowledge.js +5 -2
  58. package/build/system/activities/sql.d.ts +6 -10
  59. package/build/system/activities/sql.js +105 -49
  60. package/build/system/mcp-servers/admin/schemas.d.ts +4 -4
  61. package/build/system/mcp-servers/knowledge.js +23 -2
  62. package/build/system/seed/tool-manifests-escalation.js +12 -0
  63. package/build/system/seed/tool-manifests-knowledge.d.ts +36 -0
  64. package/build/system/seed/tool-manifests-knowledge.js +15 -1
  65. package/build/tsconfig.tsbuildinfo +1 -1
  66. package/build/types/escalation.d.ts +37 -3
  67. package/build/types/escalation.js +42 -2
  68. package/dashboard/dist/assets/{AdminDashboard-BS3wd7Zg.js → AdminDashboard-BVgjY4zN.js} +2 -2
  69. package/dashboard/dist/assets/{AdminDashboard-BS3wd7Zg.js.map → AdminDashboard-BVgjY4zN.js.map} +1 -1
  70. package/dashboard/dist/assets/{AgentConfigPage-4C9aU0dj.js → AgentConfigPage-ChL59YL5.js} +6 -6
  71. package/dashboard/dist/assets/AgentConfigPage-ChL59YL5.js.map +1 -0
  72. package/dashboard/dist/assets/{AgentDetailPage-B6uvDnMF.js → AgentDetailPage-IJfgCOIF.js} +2 -2
  73. package/dashboard/dist/assets/AgentDetailPage-IJfgCOIF.js.map +1 -0
  74. package/dashboard/dist/assets/{AgentsPage-vtxdvdrQ.js → AgentsPage-C7PnPXz_.js} +2 -2
  75. package/dashboard/dist/assets/{AgentsPage-vtxdvdrQ.js.map → AgentsPage-C7PnPXz_.js.map} +1 -1
  76. package/dashboard/dist/assets/AvailableEscalationsPage-C5f2rqHa.js +2 -0
  77. package/dashboard/dist/assets/{AvailableEscalationsPage-C9VKPhD6.js.map → AvailableEscalationsPage-C5f2rqHa.js.map} +1 -1
  78. package/dashboard/dist/assets/{BotPicker-CkY9u7nD.js → BotPicker-CBf6bHLV.js} +2 -2
  79. package/dashboard/dist/assets/{BotPicker-CkY9u7nD.js.map → BotPicker-CBf6bHLV.js.map} +1 -1
  80. package/dashboard/dist/assets/{BulkAssignModal-OIbUDYlC.js → BulkAssignModal-CkxoPByA.js} +2 -2
  81. package/dashboard/dist/assets/{BulkAssignModal-OIbUDYlC.js.map → BulkAssignModal-CkxoPByA.js.map} +1 -1
  82. package/dashboard/dist/assets/CapabilitiesPage-D7USh3F0.js +2 -0
  83. package/dashboard/dist/assets/{CapabilitiesPage-Bkbq_GO6.js.map → CapabilitiesPage-D7USh3F0.js.map} +1 -1
  84. package/dashboard/dist/assets/{CollapsibleSection-Zuz9HkFL.js → CollapsibleSection-DfPpAIxa.js} +2 -2
  85. package/dashboard/dist/assets/{CollapsibleSection-Zuz9HkFL.js.map → CollapsibleSection-DfPpAIxa.js.map} +1 -1
  86. package/dashboard/dist/assets/CountdownTimer-DVL7WIcE.js +2 -0
  87. package/dashboard/dist/assets/CountdownTimer-DVL7WIcE.js.map +1 -0
  88. package/dashboard/dist/assets/{CredentialsPage-CAmDMnzV.js → CredentialsPage-BHZ5SKIu.js} +2 -2
  89. package/dashboard/dist/assets/{CredentialsPage-CAmDMnzV.js.map → CredentialsPage-BHZ5SKIu.js.map} +1 -1
  90. package/dashboard/dist/assets/{CronLabel-DX2woCPZ.js → CronLabel-wE8Hms6c.js} +2 -2
  91. package/dashboard/dist/assets/{CronLabel-DX2woCPZ.js.map → CronLabel-wE8Hms6c.js.map} +1 -1
  92. package/dashboard/dist/assets/{DropZone-7UoXQ4qL.js → DropZone-Pv-v5RAs.js} +2 -2
  93. package/dashboard/dist/assets/{DropZone-7UoXQ4qL.js.map → DropZone-Pv-v5RAs.js.map} +1 -1
  94. package/dashboard/dist/assets/{ElapsedCell-D2old1NF.js → ElapsedCell-B4VxKHpw.js} +2 -2
  95. package/dashboard/dist/assets/{ElapsedCell-D2old1NF.js.map → ElapsedCell-B4VxKHpw.js.map} +1 -1
  96. package/dashboard/dist/assets/{EntityTimelinePanel-m9baDiW0.js → EntityTimelinePanel-CFbQDHOj.js} +2 -2
  97. package/dashboard/dist/assets/{EntityTimelinePanel-m9baDiW0.js.map → EntityTimelinePanel-CFbQDHOj.js.map} +1 -1
  98. package/dashboard/dist/assets/{EscalationListSchemaPage-BPr7Ou8c.js → EscalationListSchemaPage-YTgexl4f.js} +2 -2
  99. package/dashboard/dist/assets/{EscalationListSchemaPage-BPr7Ou8c.js.map → EscalationListSchemaPage-YTgexl4f.js.map} +1 -1
  100. package/dashboard/dist/assets/{EscalationSchemaPage-83n5JyAh.js → EscalationSchemaPage-Sjk05eHP.js} +2 -2
  101. package/dashboard/dist/assets/{EscalationSchemaPage-83n5JyAh.js.map → EscalationSchemaPage-Sjk05eHP.js.map} +1 -1
  102. package/dashboard/dist/assets/{EscalationsOverview-CDJ5wRlq.js → EscalationsOverview-gHWPjUpZ.js} +2 -2
  103. package/dashboard/dist/assets/{EscalationsOverview-CDJ5wRlq.js.map → EscalationsOverview-gHWPjUpZ.js.map} +1 -1
  104. package/dashboard/dist/assets/{EventTable-DRUHkKtv.js → EventTable-C9lHQ57t.js} +2 -2
  105. package/dashboard/dist/assets/{EventTable-DRUHkKtv.js.map → EventTable-C9lHQ57t.js.map} +1 -1
  106. package/dashboard/dist/assets/{FilterBar-C06DK5Oa.js → FilterBar-BY--ANxv.js} +2 -2
  107. package/dashboard/dist/assets/{FilterBar-C06DK5Oa.js.map → FilterBar-BY--ANxv.js.map} +1 -1
  108. package/dashboard/dist/assets/{GraphInvokePage-DSlyTmyq.js → GraphInvokePage-B-Oo5s-W.js} +2 -2
  109. package/dashboard/dist/assets/{GraphInvokePage-DSlyTmyq.js.map → GraphInvokePage-B-Oo5s-W.js.map} +1 -1
  110. package/dashboard/dist/assets/{HomePage-DXzDBkQV.js → HomePage-BrcjKOaJ.js} +2 -2
  111. package/dashboard/dist/assets/{HomePage-DXzDBkQV.js.map → HomePage-BrcjKOaJ.js.map} +1 -1
  112. package/dashboard/dist/assets/ListToolbar-D5TQ4X_M.js +2 -0
  113. package/dashboard/dist/assets/{ListToolbar-BvpGFFYp.js.map → ListToolbar-D5TQ4X_M.js.map} +1 -1
  114. package/dashboard/dist/assets/{McpOverview-C2atR_B6.js → McpOverview-jlukVWQ7.js} +2 -2
  115. package/dashboard/dist/assets/{McpOverview-C2atR_B6.js.map → McpOverview-jlukVWQ7.js.map} +1 -1
  116. package/dashboard/dist/assets/{McpQueryDetailPage-BUxPspjB.js → McpQueryDetailPage-BWKbvJSd.js} +3 -3
  117. package/dashboard/dist/assets/{McpQueryDetailPage-BUxPspjB.js.map → McpQueryDetailPage-BWKbvJSd.js.map} +1 -1
  118. package/dashboard/dist/assets/McpQueryPage-BH2Pon4M.js +2 -0
  119. package/dashboard/dist/assets/{McpQueryPage-CM_Fgl9G.js.map → McpQueryPage-BH2Pon4M.js.map} +1 -1
  120. package/dashboard/dist/assets/{McpRunDetailPage-Bo9vXQBA.js → McpRunDetailPage-kUnq2QSO.js} +2 -2
  121. package/dashboard/dist/assets/{McpRunDetailPage-Bo9vXQBA.js.map → McpRunDetailPage-kUnq2QSO.js.map} +1 -1
  122. package/dashboard/dist/assets/{McpRunsPage-BwsgvGtg.js → McpRunsPage-BTucgt64.js} +2 -2
  123. package/dashboard/dist/assets/{McpRunsPage-BwsgvGtg.js.map → McpRunsPage-BTucgt64.js.map} +1 -1
  124. package/dashboard/dist/assets/{NamespacePill-CKp_9EaI.js → NamespacePill-DONj6eUU.js} +2 -2
  125. package/dashboard/dist/assets/{NamespacePill-CKp_9EaI.js.map → NamespacePill-DONj6eUU.js.map} +1 -1
  126. package/dashboard/dist/assets/{OperationsPage-BftWAJ9m.js → OperationsPage-Cp8WL-ld.js} +3 -3
  127. package/dashboard/dist/assets/{OperationsPage-BftWAJ9m.js.map → OperationsPage-Cp8WL-ld.js.map} +1 -1
  128. package/dashboard/dist/assets/{OperatorDashboard-CKjrYYFi.js → OperatorDashboard-wHyeLWzX.js} +2 -2
  129. package/dashboard/dist/assets/{OperatorDashboard-CKjrYYFi.js.map → OperatorDashboard-wHyeLWzX.js.map} +1 -1
  130. package/dashboard/dist/assets/{PageHeader-CDDpHpdv.js → PageHeader-CFVw67M6.js} +2 -2
  131. package/dashboard/dist/assets/{PageHeader-CDDpHpdv.js.map → PageHeader-CFVw67M6.js.map} +1 -1
  132. package/dashboard/dist/assets/{PageHeaderWithStats-DIWH6fRv.js → PageHeaderWithStats-D9tQxILm.js} +2 -2
  133. package/dashboard/dist/assets/{PageHeaderWithStats-DIWH6fRv.js.map → PageHeaderWithStats-D9tQxILm.js.map} +1 -1
  134. package/dashboard/dist/assets/{PersonaDetailPage-BsIPtBxZ.js → PersonaDetailPage-BXlTqLDK.js} +2 -2
  135. package/dashboard/dist/assets/{PersonaDetailPage-BsIPtBxZ.js.map → PersonaDetailPage-BXlTqLDK.js.map} +1 -1
  136. package/dashboard/dist/assets/{PersonasPage-62hANmNf.js → PersonasPage-DlmdJ3Dm.js} +2 -2
  137. package/dashboard/dist/assets/{PersonasPage-62hANmNf.js.map → PersonasPage-DlmdJ3Dm.js.map} +1 -1
  138. package/dashboard/dist/assets/{ProcessDetailPage-DS_t9DcR.js → ProcessDetailPage-D88ocvmT.js} +2 -2
  139. package/dashboard/dist/assets/{ProcessDetailPage-DS_t9DcR.js.map → ProcessDetailPage-D88ocvmT.js.map} +1 -1
  140. package/dashboard/dist/assets/{ProcessesListPage-Ch2tSICc.js → ProcessesListPage-DpXm-KtK.js} +2 -2
  141. package/dashboard/dist/assets/{ProcessesListPage-Ch2tSICc.js.map → ProcessesListPage-DpXm-KtK.js.map} +1 -1
  142. package/dashboard/dist/assets/{RoleDetailPage-DVbtnTvn.js → RoleDetailPage-DE2Rj2QE.js} +2 -2
  143. package/dashboard/dist/assets/{RoleDetailPage-DVbtnTvn.js.map → RoleDetailPage-DE2Rj2QE.js.map} +1 -1
  144. package/dashboard/dist/assets/{RolePill-C0hExOmI.js → RolePill-Di_5hfvw.js} +2 -2
  145. package/dashboard/dist/assets/{RolePill-C0hExOmI.js.map → RolePill-Di_5hfvw.js.map} +1 -1
  146. package/dashboard/dist/assets/{RolesPage-CK6FjD5P.js → RolesPage-CZSvJlsz.js} +2 -2
  147. package/dashboard/dist/assets/{RolesPage-CK6FjD5P.js.map → RolesPage-CZSvJlsz.js.map} +1 -1
  148. package/dashboard/dist/assets/{RunAsSelector-ImueSaJ4.js → RunAsSelector-BawZcqAk.js} +2 -2
  149. package/dashboard/dist/assets/{RunAsSelector-ImueSaJ4.js.map → RunAsSelector-BawZcqAk.js.map} +1 -1
  150. package/dashboard/dist/assets/{ScanCodesPage-CDqLJuCq.js → ScanCodesPage-DSlpA9kK.js} +2 -2
  151. package/dashboard/dist/assets/{ScanCodesPage-CDqLJuCq.js.map → ScanCodesPage-DSlpA9kK.js.map} +1 -1
  152. package/dashboard/dist/assets/{ScanSchemeDetailPage-DO6qtJdM.js → ScanSchemeDetailPage-BK4hisGD.js} +2 -2
  153. package/dashboard/dist/assets/{ScanSchemeDetailPage-DO6qtJdM.js.map → ScanSchemeDetailPage-BK4hisGD.js.map} +1 -1
  154. package/dashboard/dist/assets/{ScanStationPage-ID3xMhds.js → ScanStationPage-D3QjajFD.js} +2 -2
  155. package/dashboard/dist/assets/{ScanStationPage-ID3xMhds.js.map → ScanStationPage-D3QjajFD.js.map} +1 -1
  156. package/dashboard/dist/assets/{ScopeBadge-BBQvz4pj.js → ScopeBadge-CqIIeWjK.js} +2 -2
  157. package/dashboard/dist/assets/{ScopeBadge-BBQvz4pj.js.map → ScopeBadge-CqIIeWjK.js.map} +1 -1
  158. package/dashboard/dist/assets/{StickyPagination-XA1krmz5.js → StickyPagination-BfZwU2NR.js} +2 -2
  159. package/dashboard/dist/assets/{StickyPagination-XA1krmz5.js.map → StickyPagination-BfZwU2NR.js.map} +1 -1
  160. package/dashboard/dist/assets/{StreamMessageDetail-DziA1g1e.js → StreamMessageDetail-C7zIHX5D.js} +2 -2
  161. package/dashboard/dist/assets/{StreamMessageDetail-DziA1g1e.js.map → StreamMessageDetail-C7zIHX5D.js.map} +1 -1
  162. package/dashboard/dist/assets/{SwimlaneTimeline-DTNEnHiF.js → SwimlaneTimeline-DNSo8AT8.js} +2 -2
  163. package/dashboard/dist/assets/{SwimlaneTimeline-DTNEnHiF.js.map → SwimlaneTimeline-DNSo8AT8.js.map} +1 -1
  164. package/dashboard/dist/assets/{TagInput-BXxXs1JD.js → TagInput-BLwxTNsI.js} +2 -2
  165. package/dashboard/dist/assets/{TagInput-BXxXs1JD.js.map → TagInput-BLwxTNsI.js.map} +1 -1
  166. package/dashboard/dist/assets/{TaskDetailPage-U19sJHAI.js → TaskDetailPage-BOJ8pwh3.js} +2 -2
  167. package/dashboard/dist/assets/{TaskDetailPage-U19sJHAI.js.map → TaskDetailPage-BOJ8pwh3.js.map} +1 -1
  168. package/dashboard/dist/assets/{TaskQueuePill-BKGJBVZG.js → TaskQueuePill-DVgcqd-h.js} +2 -2
  169. package/dashboard/dist/assets/{TaskQueuePill-BKGJBVZG.js.map → TaskQueuePill-DVgcqd-h.js.map} +1 -1
  170. package/dashboard/dist/assets/{TasksListPage-jc4Xk7kI.js → TasksListPage-C4CYqZf8.js} +2 -2
  171. package/dashboard/dist/assets/{TasksListPage-jc4Xk7kI.js.map → TasksListPage-C4CYqZf8.js.map} +1 -1
  172. package/dashboard/dist/assets/{TimeAgo-GWgJ0LVq.js → TimeAgo-JRPi9IEd.js} +2 -2
  173. package/dashboard/dist/assets/{TimeAgo-GWgJ0LVq.js.map → TimeAgo-JRPi9IEd.js.map} +1 -1
  174. package/dashboard/dist/assets/{TimestampCell-Dk1TVsFV.js → TimestampCell-BVYyU-nl.js} +2 -2
  175. package/dashboard/dist/assets/{TimestampCell-Dk1TVsFV.js.map → TimestampCell-BVYyU-nl.js.map} +1 -1
  176. package/dashboard/dist/assets/{ToolPill-BY6zLSfA.js → ToolPill-C6hkOqPx.js} +2 -2
  177. package/dashboard/dist/assets/{ToolPill-BY6zLSfA.js.map → ToolPill-C6hkOqPx.js.map} +1 -1
  178. package/dashboard/dist/assets/{ToolTestPanel-BKcqnR68.js → ToolTestPanel-IGrd44Au.js} +2 -2
  179. package/dashboard/dist/assets/{ToolTestPanel-BKcqnR68.js.map → ToolTestPanel-IGrd44Au.js.map} +1 -1
  180. package/dashboard/dist/assets/{TopicDetailPage-D8GcDu_0.js → TopicDetailPage-DhianNey.js} +3 -3
  181. package/dashboard/dist/assets/{TopicDetailPage-D8GcDu_0.js.map → TopicDetailPage-DhianNey.js.map} +1 -1
  182. package/dashboard/dist/assets/{TopicsPage-BT9LV3yH.js → TopicsPage-Glhqz_Nv.js} +2 -2
  183. package/dashboard/dist/assets/{TopicsPage-BT9LV3yH.js.map → TopicsPage-Glhqz_Nv.js.map} +1 -1
  184. package/dashboard/dist/assets/{UserName-BrwZnLjU.js → UserName-CD9OqhNI.js} +2 -2
  185. package/dashboard/dist/assets/{UserName-BrwZnLjU.js.map → UserName-CD9OqhNI.js.map} +1 -1
  186. package/dashboard/dist/assets/{WorkflowExecutionPage-CldfHwky.js → WorkflowExecutionPage-8Q2438Ry.js} +2 -2
  187. package/dashboard/dist/assets/{WorkflowExecutionPage-CldfHwky.js.map → WorkflowExecutionPage-8Q2438Ry.js.map} +1 -1
  188. package/dashboard/dist/assets/{WorkflowPill-qp5UF3-y.js → WorkflowPill-CN-952iI.js} +2 -2
  189. package/dashboard/dist/assets/{WorkflowPill-qp5UF3-y.js.map → WorkflowPill-CN-952iI.js.map} +1 -1
  190. package/dashboard/dist/assets/{WorkflowsDashboard-DkyGkxW1.js → WorkflowsDashboard-CkAoYT86.js} +2 -2
  191. package/dashboard/dist/assets/{WorkflowsDashboard-DkyGkxW1.js.map → WorkflowsDashboard-CkAoYT86.js.map} +1 -1
  192. package/dashboard/dist/assets/{WorkflowsOverview-DACADuUE.js → WorkflowsOverview-Zh_EidMp.js} +2 -2
  193. package/dashboard/dist/assets/{WorkflowsOverview-DACADuUE.js.map → WorkflowsOverview-Zh_EidMp.js.map} +1 -1
  194. package/dashboard/dist/assets/{YamlWorkflowDetailPage-DSAjzido.js → YamlWorkflowDetailPage-BKJbFT8C.js} +2 -2
  195. package/dashboard/dist/assets/{YamlWorkflowDetailPage-DSAjzido.js.map → YamlWorkflowDetailPage-BKJbFT8C.js.map} +1 -1
  196. package/dashboard/dist/assets/{YamlWorkflowsPage-CqoSFz5B.js → YamlWorkflowsPage-DK1z6iFt.js} +2 -2
  197. package/dashboard/dist/assets/{YamlWorkflowsPage-CqoSFz5B.js.map → YamlWorkflowsPage-DK1z6iFt.js.map} +1 -1
  198. package/dashboard/dist/assets/{agents-Cg_e-aaf.js → agents-BEASyYpg.js} +2 -2
  199. package/dashboard/dist/assets/{agents-Cg_e-aaf.js.map → agents-BEASyYpg.js.map} +1 -1
  200. package/dashboard/dist/assets/{bots-B047yNJ0.js → bots-CaXqSHat.js} +2 -2
  201. package/dashboard/dist/assets/{bots-B047yNJ0.js.map → bots-CaXqSHat.js.map} +1 -1
  202. package/dashboard/dist/assets/{capabilities-CI1dbCDk.js → capabilities-Cijq-qev.js} +2 -2
  203. package/dashboard/dist/assets/{capabilities-CI1dbCDk.js.map → capabilities-Cijq-qev.js.map} +1 -1
  204. package/dashboard/dist/assets/{controlplane-Cy7snw7f.js → controlplane-HGuRC7AW.js} +2 -2
  205. package/dashboard/dist/assets/{controlplane-Cy7snw7f.js.map → controlplane-HGuRC7AW.js.map} +1 -1
  206. package/dashboard/dist/assets/{escalation-columns-BNrONMYj.js → escalation-columns-BLVz8XCP.js} +2 -2
  207. package/dashboard/dist/assets/{escalation-columns-BNrONMYj.js.map → escalation-columns-BLVz8XCP.js.map} +1 -1
  208. package/dashboard/dist/assets/index-BJDAXUzO.js +2 -0
  209. package/dashboard/dist/assets/index-BJDAXUzO.js.map +1 -0
  210. package/dashboard/dist/assets/{index-DVtIMrTb.js → index-CEIp6WWg.js} +2 -2
  211. package/dashboard/dist/assets/{index-DVtIMrTb.js.map → index-CEIp6WWg.js.map} +1 -1
  212. package/dashboard/dist/assets/index-CK_ohh6Q.js +3 -0
  213. package/dashboard/dist/assets/index-CK_ohh6Q.js.map +1 -0
  214. package/dashboard/dist/assets/{index-DAUV3eJ-.js → index-CLQ0HBHR.js} +2 -2
  215. package/dashboard/dist/assets/{index-DAUV3eJ-.js.map → index-CLQ0HBHR.js.map} +1 -1
  216. package/dashboard/dist/assets/{index-COKZW8Xx.js → index-Cg0vCZng.js} +2 -2
  217. package/dashboard/dist/assets/{index-COKZW8Xx.js.map → index-Cg0vCZng.js.map} +1 -1
  218. package/dashboard/dist/assets/{index-lGfBW1PB.js → index-CgXVDPW-.js} +31 -31
  219. package/dashboard/dist/assets/index-CgXVDPW-.js.map +1 -0
  220. package/dashboard/dist/assets/index-ClY0ihQ5.js +2 -0
  221. package/dashboard/dist/assets/{index-X3_AxcUk.js.map → index-ClY0ihQ5.js.map} +1 -1
  222. package/dashboard/dist/assets/{index-C_y0lQ_o.js → index-D2OU2MJb.js} +2 -2
  223. package/dashboard/dist/assets/{index-C_y0lQ_o.js.map → index-D2OU2MJb.js.map} +1 -1
  224. package/dashboard/dist/assets/{index-Bf3hVGXZ.js → index-IkgBE7e_.js} +2 -2
  225. package/dashboard/dist/assets/{index-Bf3hVGXZ.js.map → index-IkgBE7e_.js.map} +1 -1
  226. package/dashboard/dist/assets/{index-B6Grf1WQ.js → index-Xi3LO4Ye.js} +4 -4
  227. package/dashboard/dist/assets/{index-B6Grf1WQ.js.map → index-Xi3LO4Ye.js.map} +1 -1
  228. package/dashboard/dist/assets/{index-Bxd2sXqz.js → index-YMd3ZiPd.js} +2 -2
  229. package/dashboard/dist/assets/{index-Bxd2sXqz.js.map → index-YMd3ZiPd.js.map} +1 -1
  230. package/dashboard/dist/assets/{index-Uk6N1qiH.js → index-t1JXcmBG.js} +2 -2
  231. package/dashboard/dist/assets/{index-Uk6N1qiH.js.map → index-t1JXcmBG.js.map} +1 -1
  232. package/dashboard/dist/assets/{index-DyTb77Jb.js → index-tCDjx1kF.js} +2 -2
  233. package/dashboard/dist/assets/{index-DyTb77Jb.js.map → index-tCDjx1kF.js.map} +1 -1
  234. package/dashboard/dist/assets/knowledge-DpaUJtVW.js +2 -0
  235. package/dashboard/dist/assets/knowledge-DpaUJtVW.js.map +1 -0
  236. package/dashboard/dist/assets/{mcp-D889kZ-c.js → mcp-BkkLq6OE.js} +2 -2
  237. package/dashboard/dist/assets/{mcp-D889kZ-c.js.map → mcp-BkkLq6OE.js.map} +1 -1
  238. package/dashboard/dist/assets/{mcp-query-Cs9J2pVT.js → mcp-query-DeXu3La5.js} +2 -2
  239. package/dashboard/dist/assets/{mcp-query-Cs9J2pVT.js.map → mcp-query-DeXu3La5.js.map} +1 -1
  240. package/dashboard/dist/assets/{personas-xHB16O-Q.js → personas-BRbKVVko.js} +2 -2
  241. package/dashboard/dist/assets/{personas-xHB16O-Q.js.map → personas-BRbKVVko.js.map} +1 -1
  242. package/dashboard/dist/assets/{pipelines-DnTPjw1v.js → pipelines-B7xo92sK.js} +2 -2
  243. package/dashboard/dist/assets/{pipelines-DnTPjw1v.js.map → pipelines-B7xo92sK.js.map} +1 -1
  244. package/dashboard/dist/assets/{tasks-BcDvp6dL.js → tasks-BGyqM1Ho.js} +2 -2
  245. package/dashboard/dist/assets/{tasks-BcDvp6dL.js.map → tasks-BGyqM1Ho.js.map} +1 -1
  246. package/dashboard/dist/assets/{topics-DXw6BNy5.js → topics-I81rKc75.js} +2 -2
  247. package/dashboard/dist/assets/{topics-DXw6BNy5.js.map → topics-I81rKc75.js.map} +1 -1
  248. package/dashboard/dist/assets/{useEventHooks-C-bsD8zP.js → useEventHooks-CjV3uNxt.js} +2 -2
  249. package/dashboard/dist/assets/{useEventHooks-C-bsD8zP.js.map → useEventHooks-CjV3uNxt.js.map} +1 -1
  250. package/dashboard/dist/assets/{useNamespace-wZCsEF6O.js → useNamespace-B-HMdRka.js} +2 -2
  251. package/dashboard/dist/assets/{useNamespace-wZCsEF6O.js.map → useNamespace-B-HMdRka.js.map} +1 -1
  252. package/dashboard/dist/assets/{useYamlActivityEvents-Cu_o4-ow.js → useYamlActivityEvents-CNsAlsgz.js} +2 -2
  253. package/dashboard/dist/assets/{useYamlActivityEvents-Cu_o4-ow.js.map → useYamlActivityEvents-CNsAlsgz.js.map} +1 -1
  254. package/dashboard/dist/assets/{users-XpCq_umD.js → users-DiTqBepm.js} +2 -2
  255. package/dashboard/dist/assets/{users-XpCq_umD.js.map → users-DiTqBepm.js.map} +1 -1
  256. package/dashboard/dist/assets/{vendor-icons-BgsXTN4h.js → vendor-icons-h-jlRSb9.js} +141 -146
  257. package/dashboard/dist/assets/vendor-icons-h-jlRSb9.js.map +1 -0
  258. package/dashboard/dist/assets/{workflows-CMxHVqQ8.js → workflows-TA0p_3B8.js} +2 -2
  259. package/dashboard/dist/assets/{workflows-CMxHVqQ8.js.map → workflows-TA0p_3B8.js.map} +1 -1
  260. package/dashboard/dist/assets/{yaml-workflows-kxOF5yEC.js → yaml-workflows-DN9-DBnQ.js} +2 -2
  261. package/dashboard/dist/assets/{yaml-workflows-kxOF5yEC.js.map → yaml-workflows-DN9-DBnQ.js.map} +1 -1
  262. package/dashboard/dist/index.html +2 -2
  263. package/docs/api/http/escalations.md +31 -8
  264. package/docs/api/http/knowledge.md +24 -2
  265. package/docs/api/http/roles.md +1 -1
  266. package/docs/api/mcp/admin.md +1 -1
  267. package/docs/api/mcp/human-queue.md +14 -0
  268. package/docs/api/mcp/knowledge.md +17 -1
  269. package/docs/api/sdk/escalations.md +38 -15
  270. package/docs/api/sdk/knowledge.md +27 -0
  271. package/docs/api/sdk/roles.md +1 -1
  272. package/docs/compilation.md +1 -1
  273. package/docs/compiler.md +2 -2
  274. package/docs/dashboard.md +1 -1
  275. package/docs/data.md +3 -3
  276. package/docs/hitl/escalation.md +14 -12
  277. package/docs/hitl/form.md +1 -0
  278. package/docs/hitl/iframe.md +2 -2
  279. package/docs/hitl/lookups.md +134 -0
  280. package/docs/hitl/resolution.md +4 -4
  281. package/docs/hitl/roles.md +4 -4
  282. package/docs/hitl/x-lt-show-if.md +1 -1
  283. package/docs/hitl/x-lt-transition.md +2 -2
  284. package/docs/hitl/x-lt-validation.md +64 -2
  285. package/docs/hitl/x-lt-widget.md +2 -2
  286. package/docs/hitl-guide.md +8 -2
  287. package/docs/story.md +1 -1
  288. package/package.json +1 -1
  289. package/dashboard/dist/assets/AgentConfigPage-4C9aU0dj.js.map +0 -1
  290. package/dashboard/dist/assets/AgentDetailPage-B6uvDnMF.js.map +0 -1
  291. package/dashboard/dist/assets/AvailableEscalationsPage-C9VKPhD6.js +0 -2
  292. package/dashboard/dist/assets/CapabilitiesPage-Bkbq_GO6.js +0 -2
  293. package/dashboard/dist/assets/CountdownTimer-CGnk4Bw_.js +0 -2
  294. package/dashboard/dist/assets/CountdownTimer-CGnk4Bw_.js.map +0 -1
  295. package/dashboard/dist/assets/ListToolbar-BvpGFFYp.js +0 -2
  296. package/dashboard/dist/assets/McpQueryPage-CM_Fgl9G.js +0 -2
  297. package/dashboard/dist/assets/index-Ds5rGe-i.js +0 -3
  298. package/dashboard/dist/assets/index-Ds5rGe-i.js.map +0 -1
  299. package/dashboard/dist/assets/index-X3_AxcUk.js +0 -2
  300. package/dashboard/dist/assets/index-lGfBW1PB.js.map +0 -1
  301. package/dashboard/dist/assets/index-nUmEwQrg.js +0 -2
  302. package/dashboard/dist/assets/index-nUmEwQrg.js.map +0 -1
  303. package/dashboard/dist/assets/knowledge-DsIUzscY.js +0 -2
  304. package/dashboard/dist/assets/knowledge-DsIUzscY.js.map +0 -1
  305. package/dashboard/dist/assets/vendor-icons-BgsXTN4h.js.map +0 -1
@@ -1,2 +1,2 @@
1
- import{a as d,j as t}from"./vendor-query-RUZdMvN6.js";import{E as z}from"./ElapsedCell-D2old1NF.js";import{L as A,b as v}from"./index-lGfBW1PB.js";import{u as E,d as L,b as $}from"./workflows-CMxHVqQ8.js";import{u as M}from"./useNamespace-wZCsEF6O.js";import{b as I}from"./useEventHooks-C-bsD8zP.js";import{u as U}from"./useFilterParams-crmlBw_l.js";import{b as O}from"./api-path-u2Jf9QXS.js";import{D as B}from"./DataTable-DFPMeqyQ.js";import{W as H}from"./WorkflowPill-qp5UF3-y.js";import{P as J}from"./PageHeader-CDDpHpdv.js";import{F as V,c as f,b as x}from"./FilterBar-C06DK5Oa.js";import{S as G}from"./StickyPagination-XA1krmz5.js";import{L as q}from"./ListToolbar-BvpGFFYp.js";import{R as K,a as k}from"./RowActions-eYrzgQSj.js";import{J as Q,a1 as X}from"./vendor-icons-BgsXTN4h.js";import{u as Y}from"./vendor-react-CdqEC2zv.js";import"./controlplane-Cy7snw7f.js";import"./EmptyState-lpUFYfun.js";const Z={running:"in_progress",completed:"completed",failed:"failed"},ee={in_progress:"bg-status-active",completed:"bg-status-success",failed:"bg-status-error"},te={running:"text-status-active",completed:"text-status-success",failed:"text-status-error"};function se(p,n,m,l,a){return[{key:"workflow_id",label:"Workflow ID",render:e=>{const o=ee[Z[e.status]??e.status]??"bg-status-pending",r=e.status==="running"?" animate-pulse":"";return t.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[t.jsx("span",{className:`w-2.5 h-2.5 shrink-0 rounded-full dot-ring ${o}${r}`,title:e.status}),t.jsx("span",{className:"font-mono text-xs text-text-primary truncate",children:e.workflow_id})]})}},{key:"entity",label:"Type",render:e=>t.jsx(H,{type:e.entity,variant:a.get(e.entity)??"durable",size:"xs"}),className:"w-44 shrink-0"},{key:"created_at",label:"Created",render:e=>t.jsx(v,{date:e.created_at,format:"relative",className:"text-xs text-text-secondary whitespace-nowrap"}),className:"w-32",sortable:!0},{key:"updated_at",label:"Updated",render:e=>t.jsx(v,{date:e.updated_at,format:"relative",className:"text-xs text-text-secondary whitespace-nowrap"}),className:"w-32",sortable:!0},{key:"duration",label:"Duration",render:e=>t.jsx(z,{startDate:e.created_at,endDate:e.status==="running"?null:e.updated_at,isLive:e.status==="running"}),className:"w-28"},{key:"actions",label:"",render:e=>t.jsxs(K,{children:[t.jsx(k,{icon:Q,title:`Filter by ${e.entity}`,onClick:()=>p(e.entity)}),t.jsx("button",{onClick:o=>{o.stopPropagation(),n(e.status)},className:"opacity-0 group-hover/row:opacity-100 transition-opacity",title:`Filter by ${e.status}`,children:t.jsx("svg",{className:`w-[18px] h-[18px] ${te[e.status]??"text-text-tertiary"} hover:opacity-70`,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:1.5,children:t.jsx("circle",{cx:"12",cy:"12",r:"6"})})}),m&&t.jsx(k,{icon:X,title:"View config",onClick:()=>l(`/workflows/registry/${encodeURIComponent(e.entity)}`)})]}),className:"w-24 text-right"}]}function ke({tier:p="all"}){I();const n=Y(),{isSuperAdmin:m}=A(),{namespace:l}=M(),{filters:a,setFilter:e,pagination:o,sort:r,setSort:j}=U({filters:{search:"",entity:"",status:"",tier:p}}),c=a.tier||"all",g=c==="certified"?"true":c==="durable"?"false":void 0,{data:b}=E(),{data:y}=L(),S=d.useMemo(()=>{const s=new Map;for(const w of y??[])s.set(w.workflow_type,w.tier??"durable");return s},[y]),_=se(s=>e("entity",s),s=>e("status",s),m,n,S),[u,C]=d.useState(a.search);d.useEffect(()=>{if(u===a.search)return;const s=setTimeout(()=>e("search",u),300);return()=>clearTimeout(s)},[u,e,a.search]);const{data:i,isLoading:N,refetch:P,isFetching:T}=$({limit:o.pageSize,offset:o.offset,entity:a.entity||void 0,search:a.search||void 0,status:a.status||void 0,sort_by:r.sort_by||"created_at",order:r.order||"desc",registered:g,namespace:l||void 0}),h=(i==null?void 0:i.total)??0,F=(i==null?void 0:i.jobs)??[],D=d.useMemo(()=>[...new Set((b??[]).map(s=>s.workflow_type))].sort(),[b]),R="Workflow Executions",W=c==="certified"?"No certified workflow executions found":c==="durable"?"No durable workflow executions found":"No workflow executions found";return t.jsxs("div",{children:[t.jsx(J,{title:R,docsHash:"#docs:dashboard.md:procedural-executions"}),t.jsxs(V,{actions:t.jsx(q,{onRefresh:()=>P(),isFetching:T,apiPath:O("/workflow-states/jobs",{limit:o.pageSize,offset:o.offset,entity:a.entity||void 0,search:a.search||void 0,status:a.status||void 0,sort_by:r.sort_by||"created_at",order:r.order||"desc",registered:g,namespace:l||void 0})}),children:[t.jsx("input",{type:"text",placeholder:"Search workflow ID...",value:u,onChange:s=>C(s.target.value),className:"input text-2xs py-1 px-2 w-56"}),t.jsx(f,{}),t.jsx(x,{label:"Type",value:a.entity,onChange:s=>e("entity",s),options:D.map(s=>({value:s,label:s}))}),t.jsx(f,{}),t.jsx(x,{label:"Status",value:a.status,onChange:s=>e("status",s),options:[{value:"running",label:"Running"},{value:"completed",label:"Completed"},{value:"failed",label:"Failed"}]}),t.jsx(f,{}),t.jsx(x,{label:"Tier",value:a.tier==="all"?"":a.tier,onChange:s=>e("tier",s||"all"),options:[{value:"certified",label:"Certified"},{value:"durable",label:"Durable"}]})]}),t.jsx(B,{columns:_,data:F,keyFn:s=>s.workflow_id,onRowClick:s=>n(`/workflows/executions/${s.workflow_id}`),isLoading:N,emptyMessage:W,sort:r,onSort:j}),t.jsx(G,{page:o.page,totalPages:o.totalPages(h),onPageChange:o.setPage,total:h,pageSize:o.pageSize,onPageSizeChange:o.setPageSize})]})}export{ke as WorkflowsDashboard};
2
- //# sourceMappingURL=WorkflowsDashboard-DkyGkxW1.js.map
1
+ import{a as d,j as t}from"./vendor-query-RUZdMvN6.js";import{E as z}from"./ElapsedCell-B4VxKHpw.js";import{L as A,b as v}from"./index-CgXVDPW-.js";import{u as E,d as L,b as $}from"./workflows-TA0p_3B8.js";import{u as M}from"./useNamespace-B-HMdRka.js";import{b as I}from"./useEventHooks-CjV3uNxt.js";import{u as U}from"./useFilterParams-crmlBw_l.js";import{b as H}from"./api-path-u2Jf9QXS.js";import{D as O}from"./DataTable-DFPMeqyQ.js";import{W as B}from"./WorkflowPill-CN-952iI.js";import{P as V}from"./PageHeader-CFVw67M6.js";import{F as G,c as f,b as x}from"./FilterBar-BY--ANxv.js";import{S as J}from"./StickyPagination-BfZwU2NR.js";import{L as q}from"./ListToolbar-D5TQ4X_M.js";import{R as K,a as k}from"./RowActions-eYrzgQSj.js";import{H as Q,a0 as X}from"./vendor-icons-h-jlRSb9.js";import{u as Y}from"./vendor-react-CdqEC2zv.js";import"./controlplane-HGuRC7AW.js";import"./EmptyState-lpUFYfun.js";const Z={running:"in_progress",completed:"completed",failed:"failed"},ee={in_progress:"bg-status-active",completed:"bg-status-success",failed:"bg-status-error"},te={running:"text-status-active",completed:"text-status-success",failed:"text-status-error"};function se(p,n,m,l,a){return[{key:"workflow_id",label:"Workflow ID",render:e=>{const o=ee[Z[e.status]??e.status]??"bg-status-pending",r=e.status==="running"?" animate-pulse":"";return t.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[t.jsx("span",{className:`w-2.5 h-2.5 shrink-0 rounded-full dot-ring ${o}${r}`,title:e.status}),t.jsx("span",{className:"font-mono text-xs text-text-primary truncate",children:e.workflow_id})]})}},{key:"entity",label:"Type",render:e=>t.jsx(B,{type:e.entity,variant:a.get(e.entity)??"durable",size:"xs"}),className:"w-44 shrink-0"},{key:"created_at",label:"Created",render:e=>t.jsx(v,{date:e.created_at,format:"relative",className:"text-xs text-text-secondary whitespace-nowrap"}),className:"w-32",sortable:!0},{key:"updated_at",label:"Updated",render:e=>t.jsx(v,{date:e.updated_at,format:"relative",className:"text-xs text-text-secondary whitespace-nowrap"}),className:"w-32",sortable:!0},{key:"duration",label:"Duration",render:e=>t.jsx(z,{startDate:e.created_at,endDate:e.status==="running"?null:e.updated_at,isLive:e.status==="running"}),className:"w-28"},{key:"actions",label:"",render:e=>t.jsxs(K,{children:[t.jsx(k,{icon:Q,title:`Filter by ${e.entity}`,onClick:()=>p(e.entity)}),t.jsx("button",{onClick:o=>{o.stopPropagation(),n(e.status)},className:"opacity-0 group-hover/row:opacity-100 transition-opacity",title:`Filter by ${e.status}`,children:t.jsx("svg",{className:`w-[18px] h-[18px] ${te[e.status]??"text-text-tertiary"} hover:opacity-70`,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:1.5,children:t.jsx("circle",{cx:"12",cy:"12",r:"6"})})}),m&&t.jsx(k,{icon:X,title:"View config",onClick:()=>l(`/workflows/registry/${encodeURIComponent(e.entity)}`)})]}),className:"w-24 text-right"}]}function ke({tier:p="all"}){I();const n=Y(),{isSuperAdmin:m}=A(),{namespace:l}=M(),{filters:a,setFilter:e,pagination:o,sort:r,setSort:j}=U({filters:{search:"",entity:"",status:"",tier:p}}),c=a.tier||"all",g=c==="certified"?"true":c==="durable"?"false":void 0,{data:b}=E(),{data:y}=L(),S=d.useMemo(()=>{const s=new Map;for(const w of y??[])s.set(w.workflow_type,w.tier??"durable");return s},[y]),_=se(s=>e("entity",s),s=>e("status",s),m,n,S),[u,C]=d.useState(a.search);d.useEffect(()=>{if(u===a.search)return;const s=setTimeout(()=>e("search",u),300);return()=>clearTimeout(s)},[u,e,a.search]);const{data:i,isLoading:N,refetch:P,isFetching:T}=$({limit:o.pageSize,offset:o.offset,entity:a.entity||void 0,search:a.search||void 0,status:a.status||void 0,sort_by:r.sort_by||"created_at",order:r.order||"desc",registered:g,namespace:l||void 0}),h=(i==null?void 0:i.total)??0,F=(i==null?void 0:i.jobs)??[],D=d.useMemo(()=>[...new Set((b??[]).map(s=>s.workflow_type))].sort(),[b]),R="Workflow Executions",W=c==="certified"?"No certified workflow executions found":c==="durable"?"No durable workflow executions found":"No workflow executions found";return t.jsxs("div",{children:[t.jsx(V,{title:R,docsHash:"#docs:dashboard.md:procedural-executions"}),t.jsxs(G,{actions:t.jsx(q,{onRefresh:()=>P(),isFetching:T,apiPath:H("/workflow-states/jobs",{limit:o.pageSize,offset:o.offset,entity:a.entity||void 0,search:a.search||void 0,status:a.status||void 0,sort_by:r.sort_by||"created_at",order:r.order||"desc",registered:g,namespace:l||void 0})}),children:[t.jsx("input",{type:"text",placeholder:"Search workflow ID...",value:u,onChange:s=>C(s.target.value),className:"input text-2xs py-1 px-2 w-56"}),t.jsx(f,{}),t.jsx(x,{label:"Type",value:a.entity,onChange:s=>e("entity",s),options:D.map(s=>({value:s,label:s}))}),t.jsx(f,{}),t.jsx(x,{label:"Status",value:a.status,onChange:s=>e("status",s),options:[{value:"running",label:"Running"},{value:"completed",label:"Completed"},{value:"failed",label:"Failed"}]}),t.jsx(f,{}),t.jsx(x,{label:"Tier",value:a.tier==="all"?"":a.tier,onChange:s=>e("tier",s||"all"),options:[{value:"certified",label:"Certified"},{value:"durable",label:"Durable"}]})]}),t.jsx(O,{columns:_,data:F,keyFn:s=>s.workflow_id,onRowClick:s=>n(`/workflows/executions/${s.workflow_id}`),isLoading:N,emptyMessage:W,sort:r,onSort:j}),t.jsx(J,{page:o.page,totalPages:o.totalPages(h),onPageChange:o.setPage,total:h,pageSize:o.pageSize,onPageSizeChange:o.setPageSize})]})}export{ke as WorkflowsDashboard};
2
+ //# sourceMappingURL=WorkflowsDashboard-CkAoYT86.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WorkflowsDashboard-DkyGkxW1.js","sources":["../../src/pages/workflows/WorkflowsDashboard.tsx"],"sourcesContent":["import { useState, useEffect, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { Filter, Settings } from 'lucide-react';\nimport { ElapsedCell } from '../../components/common/display/ElapsedCell';\nimport { DateValue } from '../../components/common/display/DateValue';\nimport { useJobs, useWorkflowConfigs, useDiscoveredWorkflows } from '../../api/workflows';\nimport { useAuth } from '../../hooks/useAuth';\nimport { useNamespace } from '../../hooks/useNamespace';\nimport { useWorkflowListEvents } from '../../hooks/useEventHooks';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { buildApiPath } from '../../lib/api-path';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { FilterBar, FilterSelect, FilterDivider } from '../../components/common/data/FilterBar';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { RowAction, RowActionGroup } from '../../components/common/layout/RowActions';\nimport type { LTJob, WorkflowTier } from '../../api/types';\n\nexport type ExecutionsTier = 'all' | 'certified' | 'durable';\n\nconst jobStatusMap: Record<string, string> = {\n running: 'in_progress',\n completed: 'completed',\n failed: 'failed',\n};\n\nconst STATUS_DOT: Record<string, string> = {\n in_progress: 'bg-status-active',\n completed: 'bg-status-success',\n failed: 'bg-status-error',\n};\n\nconst STATUS_COLORS: Record<string, string> = {\n running: 'text-status-active',\n completed: 'text-status-success',\n failed: 'text-status-error',\n};\n\nfunction buildColumns(\n onFilterEntity: (entity: string) => void,\n onFilterStatus: (status: string) => void,\n isSuperAdmin: boolean,\n navigate: (path: string) => void,\n tierMap: Map<string, WorkflowTier>,\n): Column<LTJob>[] {\n return [\n {\n key: 'workflow_id',\n label: 'Workflow ID',\n render: (row) => {\n const dotClass = STATUS_DOT[jobStatusMap[row.status] ?? row.status] ?? 'bg-status-pending';\n const pulseClass = row.status === 'running' ? ' animate-pulse' : '';\n return (\n <div className=\"flex items-center gap-2 min-w-0\">\n <span className={`w-2.5 h-2.5 shrink-0 rounded-full dot-ring ${dotClass}${pulseClass}`} title={row.status} />\n <span className=\"font-mono text-xs text-text-primary truncate\">{row.workflow_id}</span>\n </div>\n );\n },\n },\n {\n key: 'entity',\n label: 'Type',\n render: (row) => <WorkflowPill type={row.entity} variant={tierMap.get(row.entity) ?? 'durable'} size=\"xs\" />,\n className: 'w-44 shrink-0',\n },\n {\n key: 'created_at',\n label: 'Created',\n render: (row) => <DateValue date={row.created_at} format=\"relative\" className=\"text-xs text-text-secondary whitespace-nowrap\" />,\n className: 'w-32',\n sortable: true,\n },\n {\n key: 'updated_at',\n label: 'Updated',\n render: (row) => <DateValue date={row.updated_at} format=\"relative\" className=\"text-xs text-text-secondary whitespace-nowrap\" />,\n className: 'w-32',\n sortable: true,\n },\n {\n key: 'duration',\n label: 'Duration',\n render: (row) => (\n <ElapsedCell\n startDate={row.created_at}\n endDate={row.status === 'running' ? null : row.updated_at}\n isLive={row.status === 'running'}\n />\n ),\n className: 'w-28',\n },\n {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n <RowAction\n icon={Filter}\n title={`Filter by ${row.entity}`}\n onClick={() => onFilterEntity(row.entity)}\n />\n <button\n onClick={(e) => { e.stopPropagation(); onFilterStatus(row.status); }}\n className=\"opacity-0 group-hover/row:opacity-100 transition-opacity\"\n title={`Filter by ${row.status}`}\n >\n <svg className={`w-[18px] h-[18px] ${STATUS_COLORS[row.status] ?? 'text-text-tertiary'} hover:opacity-70`} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5}>\n <circle cx=\"12\" cy=\"12\" r=\"6\" />\n </svg>\n </button>\n {isSuperAdmin && (\n <RowAction\n icon={Settings}\n title=\"View config\"\n onClick={() => navigate(`/workflows/registry/${encodeURIComponent(row.entity)}`)}\n />\n )}\n </RowActionGroup>\n ),\n className: 'w-24 text-right',\n },\n ];\n}\n\nexport function WorkflowsDashboard({ tier: initialTier = 'all' }: { tier?: ExecutionsTier }) {\n useWorkflowListEvents();\n const navigate = useNavigate();\n const { isSuperAdmin } = useAuth();\n const { namespace } = useNamespace();\n\n const { filters, setFilter, pagination, sort, setSort } = useFilterParams({\n filters: { search: '', entity: '', status: '', tier: initialTier },\n });\n\n const activeTier = (filters.tier || 'all') as ExecutionsTier;\n\n // Map tier to server-side registered filter\n const registeredFilter = activeTier === 'certified' ? 'true'\n : activeTier === 'durable' ? 'false'\n : undefined;\n\n const { data: configs } = useWorkflowConfigs();\n const { data: discoveredData } = useDiscoveredWorkflows();\n\n const tierMap = useMemo(() => {\n const map = new Map<string, WorkflowTier>();\n for (const dw of discoveredData ?? []) {\n map.set(dw.workflow_type, dw.tier ?? 'durable');\n }\n return map;\n }, [discoveredData]);\n\n const columns = buildColumns(\n (entity) => setFilter('entity', entity),\n (status) => setFilter('status', status),\n isSuperAdmin,\n navigate,\n tierMap,\n );\n const [searchInput, setSearchInput] = useState(filters.search);\n\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 { data: jobsData, isLoading, refetch, isFetching } = useJobs({\n limit: pagination.pageSize,\n offset: pagination.offset,\n entity: filters.entity || undefined,\n search: filters.search || undefined,\n status: filters.status || undefined,\n sort_by: sort.sort_by || 'created_at',\n order: sort.order || 'desc',\n registered: registeredFilter,\n namespace: namespace || undefined,\n });\n\n const total = jobsData?.total ?? 0;\n const jobs = jobsData?.jobs ?? [];\n\n const entities = useMemo(() => {\n return [...new Set((configs ?? []).map((c) => c.workflow_type))].sort();\n }, [configs]);\n\n const pageTitle = 'Workflow Executions';\n\n const emptyMessage = activeTier === 'certified'\n ? 'No certified workflow executions found'\n : activeTier === 'durable'\n ? 'No durable workflow executions found'\n : 'No workflow executions found';\n\n return (\n <div>\n <PageHeader title={pageTitle} docsHash=\"#docs:dashboard.md:procedural-executions\" />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={buildApiPath('/workflow-states/jobs', {\n limit: pagination.pageSize,\n offset: pagination.offset,\n entity: filters.entity || undefined,\n search: filters.search || undefined,\n status: filters.status || undefined,\n sort_by: sort.sort_by || 'created_at',\n order: sort.order || 'desc',\n registered: registeredFilter,\n namespace: namespace || undefined,\n })}\n />\n }>\n <input\n type=\"text\"\n placeholder=\"Search workflow ID...\"\n value={searchInput}\n onChange={(e) => setSearchInput(e.target.value)}\n className=\"input text-2xs py-1 px-2 w-56\"\n />\n <FilterDivider />\n <FilterSelect\n label=\"Type\"\n value={filters.entity}\n onChange={(v) => setFilter('entity', v)}\n options={entities.map((e) => ({ value: e, label: e }))}\n />\n <FilterDivider />\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={[\n { value: 'running', label: 'Running' },\n { value: 'completed', label: 'Completed' },\n { value: 'failed', label: 'Failed' },\n ]}\n />\n <FilterDivider />\n <FilterSelect\n label=\"Tier\"\n value={filters.tier === 'all' ? '' : filters.tier}\n onChange={(v) => setFilter('tier', v || 'all')}\n options={[\n { value: 'certified', label: 'Certified' },\n { value: 'durable', label: 'Durable' },\n ]}\n />\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={jobs}\n keyFn={(row) => row.workflow_id}\n onRowClick={(row) => navigate(`/workflows/executions/${row.workflow_id}`)}\n isLoading={isLoading}\n emptyMessage={emptyMessage}\n sort={sort}\n onSort={setSort}\n />\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n </div>\n );\n}\n"],"names":["jobStatusMap","STATUS_DOT","STATUS_COLORS","buildColumns","onFilterEntity","onFilterStatus","isSuperAdmin","navigate","tierMap","row","dotClass","pulseClass","jsxs","jsx","WorkflowPill","DateValue","ElapsedCell","RowActionGroup","RowAction","Filter","e","Settings","WorkflowsDashboard","initialTier","useWorkflowListEvents","useNavigate","useAuth","namespace","useNamespace","filters","setFilter","pagination","sort","setSort","useFilterParams","activeTier","registeredFilter","configs","useWorkflowConfigs","discoveredData","useDiscoveredWorkflows","useMemo","map","dw","columns","entity","status","searchInput","setSearchInput","useState","useEffect","timer","jobsData","isLoading","refetch","isFetching","useJobs","total","jobs","entities","c","pageTitle","emptyMessage","PageHeader","FilterBar","ListToolbar","buildApiPath","FilterDivider","FilterSelect","v","DataTable","StickyPagination"],"mappings":"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"}
1
+ {"version":3,"file":"WorkflowsDashboard-CkAoYT86.js","sources":["../../src/pages/workflows/WorkflowsDashboard.tsx"],"sourcesContent":["import { useState, useEffect, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { Filter, Settings } from 'lucide-react';\nimport { ElapsedCell } from '../../components/common/display/ElapsedCell';\nimport { DateValue } from '../../components/common/display/DateValue';\nimport { useJobs, useWorkflowConfigs, useDiscoveredWorkflows } from '../../api/workflows';\nimport { useAuth } from '../../hooks/useAuth';\nimport { useNamespace } from '../../hooks/useNamespace';\nimport { useWorkflowListEvents } from '../../hooks/useEventHooks';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { buildApiPath } from '../../lib/api-path';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { FilterBar, FilterSelect, FilterDivider } from '../../components/common/data/FilterBar';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { RowAction, RowActionGroup } from '../../components/common/layout/RowActions';\nimport type { LTJob, WorkflowTier } from '../../api/types';\n\nexport type ExecutionsTier = 'all' | 'certified' | 'durable';\n\nconst jobStatusMap: Record<string, string> = {\n running: 'in_progress',\n completed: 'completed',\n failed: 'failed',\n};\n\nconst STATUS_DOT: Record<string, string> = {\n in_progress: 'bg-status-active',\n completed: 'bg-status-success',\n failed: 'bg-status-error',\n};\n\nconst STATUS_COLORS: Record<string, string> = {\n running: 'text-status-active',\n completed: 'text-status-success',\n failed: 'text-status-error',\n};\n\nfunction buildColumns(\n onFilterEntity: (entity: string) => void,\n onFilterStatus: (status: string) => void,\n isSuperAdmin: boolean,\n navigate: (path: string) => void,\n tierMap: Map<string, WorkflowTier>,\n): Column<LTJob>[] {\n return [\n {\n key: 'workflow_id',\n label: 'Workflow ID',\n render: (row) => {\n const dotClass = STATUS_DOT[jobStatusMap[row.status] ?? row.status] ?? 'bg-status-pending';\n const pulseClass = row.status === 'running' ? ' animate-pulse' : '';\n return (\n <div className=\"flex items-center gap-2 min-w-0\">\n <span className={`w-2.5 h-2.5 shrink-0 rounded-full dot-ring ${dotClass}${pulseClass}`} title={row.status} />\n <span className=\"font-mono text-xs text-text-primary truncate\">{row.workflow_id}</span>\n </div>\n );\n },\n },\n {\n key: 'entity',\n label: 'Type',\n render: (row) => <WorkflowPill type={row.entity} variant={tierMap.get(row.entity) ?? 'durable'} size=\"xs\" />,\n className: 'w-44 shrink-0',\n },\n {\n key: 'created_at',\n label: 'Created',\n render: (row) => <DateValue date={row.created_at} format=\"relative\" className=\"text-xs text-text-secondary whitespace-nowrap\" />,\n className: 'w-32',\n sortable: true,\n },\n {\n key: 'updated_at',\n label: 'Updated',\n render: (row) => <DateValue date={row.updated_at} format=\"relative\" className=\"text-xs text-text-secondary whitespace-nowrap\" />,\n className: 'w-32',\n sortable: true,\n },\n {\n key: 'duration',\n label: 'Duration',\n render: (row) => (\n <ElapsedCell\n startDate={row.created_at}\n endDate={row.status === 'running' ? null : row.updated_at}\n isLive={row.status === 'running'}\n />\n ),\n className: 'w-28',\n },\n {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n <RowAction\n icon={Filter}\n title={`Filter by ${row.entity}`}\n onClick={() => onFilterEntity(row.entity)}\n />\n <button\n onClick={(e) => { e.stopPropagation(); onFilterStatus(row.status); }}\n className=\"opacity-0 group-hover/row:opacity-100 transition-opacity\"\n title={`Filter by ${row.status}`}\n >\n <svg className={`w-[18px] h-[18px] ${STATUS_COLORS[row.status] ?? 'text-text-tertiary'} hover:opacity-70`} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5}>\n <circle cx=\"12\" cy=\"12\" r=\"6\" />\n </svg>\n </button>\n {isSuperAdmin && (\n <RowAction\n icon={Settings}\n title=\"View config\"\n onClick={() => navigate(`/workflows/registry/${encodeURIComponent(row.entity)}`)}\n />\n )}\n </RowActionGroup>\n ),\n className: 'w-24 text-right',\n },\n ];\n}\n\nexport function WorkflowsDashboard({ tier: initialTier = 'all' }: { tier?: ExecutionsTier }) {\n useWorkflowListEvents();\n const navigate = useNavigate();\n const { isSuperAdmin } = useAuth();\n const { namespace } = useNamespace();\n\n const { filters, setFilter, pagination, sort, setSort } = useFilterParams({\n filters: { search: '', entity: '', status: '', tier: initialTier },\n });\n\n const activeTier = (filters.tier || 'all') as ExecutionsTier;\n\n // Map tier to server-side registered filter\n const registeredFilter = activeTier === 'certified' ? 'true'\n : activeTier === 'durable' ? 'false'\n : undefined;\n\n const { data: configs } = useWorkflowConfigs();\n const { data: discoveredData } = useDiscoveredWorkflows();\n\n const tierMap = useMemo(() => {\n const map = new Map<string, WorkflowTier>();\n for (const dw of discoveredData ?? []) {\n map.set(dw.workflow_type, dw.tier ?? 'durable');\n }\n return map;\n }, [discoveredData]);\n\n const columns = buildColumns(\n (entity) => setFilter('entity', entity),\n (status) => setFilter('status', status),\n isSuperAdmin,\n navigate,\n tierMap,\n );\n const [searchInput, setSearchInput] = useState(filters.search);\n\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 { data: jobsData, isLoading, refetch, isFetching } = useJobs({\n limit: pagination.pageSize,\n offset: pagination.offset,\n entity: filters.entity || undefined,\n search: filters.search || undefined,\n status: filters.status || undefined,\n sort_by: sort.sort_by || 'created_at',\n order: sort.order || 'desc',\n registered: registeredFilter,\n namespace: namespace || undefined,\n });\n\n const total = jobsData?.total ?? 0;\n const jobs = jobsData?.jobs ?? [];\n\n const entities = useMemo(() => {\n return [...new Set((configs ?? []).map((c) => c.workflow_type))].sort();\n }, [configs]);\n\n const pageTitle = 'Workflow Executions';\n\n const emptyMessage = activeTier === 'certified'\n ? 'No certified workflow executions found'\n : activeTier === 'durable'\n ? 'No durable workflow executions found'\n : 'No workflow executions found';\n\n return (\n <div>\n <PageHeader title={pageTitle} docsHash=\"#docs:dashboard.md:procedural-executions\" />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={buildApiPath('/workflow-states/jobs', {\n limit: pagination.pageSize,\n offset: pagination.offset,\n entity: filters.entity || undefined,\n search: filters.search || undefined,\n status: filters.status || undefined,\n sort_by: sort.sort_by || 'created_at',\n order: sort.order || 'desc',\n registered: registeredFilter,\n namespace: namespace || undefined,\n })}\n />\n }>\n <input\n type=\"text\"\n placeholder=\"Search workflow ID...\"\n value={searchInput}\n onChange={(e) => setSearchInput(e.target.value)}\n className=\"input text-2xs py-1 px-2 w-56\"\n />\n <FilterDivider />\n <FilterSelect\n label=\"Type\"\n value={filters.entity}\n onChange={(v) => setFilter('entity', v)}\n options={entities.map((e) => ({ value: e, label: e }))}\n />\n <FilterDivider />\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={[\n { value: 'running', label: 'Running' },\n { value: 'completed', label: 'Completed' },\n { value: 'failed', label: 'Failed' },\n ]}\n />\n <FilterDivider />\n <FilterSelect\n label=\"Tier\"\n value={filters.tier === 'all' ? '' : filters.tier}\n onChange={(v) => setFilter('tier', v || 'all')}\n options={[\n { value: 'certified', label: 'Certified' },\n { value: 'durable', label: 'Durable' },\n ]}\n />\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={jobs}\n keyFn={(row) => row.workflow_id}\n onRowClick={(row) => navigate(`/workflows/executions/${row.workflow_id}`)}\n isLoading={isLoading}\n emptyMessage={emptyMessage}\n sort={sort}\n onSort={setSort}\n />\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n </div>\n );\n}\n"],"names":["jobStatusMap","STATUS_DOT","STATUS_COLORS","buildColumns","onFilterEntity","onFilterStatus","isSuperAdmin","navigate","tierMap","row","dotClass","pulseClass","jsxs","jsx","WorkflowPill","DateValue","ElapsedCell","RowActionGroup","RowAction","Filter","e","Settings","WorkflowsDashboard","initialTier","useWorkflowListEvents","useNavigate","useAuth","namespace","useNamespace","filters","setFilter","pagination","sort","setSort","useFilterParams","activeTier","registeredFilter","configs","useWorkflowConfigs","discoveredData","useDiscoveredWorkflows","useMemo","map","dw","columns","entity","status","searchInput","setSearchInput","useState","useEffect","timer","jobsData","isLoading","refetch","isFetching","useJobs","total","jobs","entities","c","pageTitle","emptyMessage","PageHeader","FilterBar","ListToolbar","buildApiPath","FilterDivider","FilterSelect","v","DataTable","StickyPagination"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{a as x,j as t}from"./vendor-query-RUZdMvN6.js";import{b as C,u as k}from"./workflows-CMxHVqQ8.js";import{b as $}from"./useEventHooks-C-bsD8zP.js";import{P as D}from"./PageHeader-CDDpHpdv.js";import{S as h}from"./StatCard-BXQ8dD9Y.js";import{u as w}from"./vendor-react-CdqEC2zv.js";import"./index-lGfBW1PB.js";import"./vendor-icons-BgsXTN4h.js";const v=[{label:"1h",ms:36e5},{label:"24h",ms:864e5},{label:"7d",ms:6048e5},{label:"30d",ms:2592e6}];function T(r){return r<1e3?`${Math.round(r)}ms`:r<6e4?`${(r/1e3).toFixed(1)}s`:r<36e5?`${(r/6e4).toFixed(1)}m`:`${(r/36e5).toFixed(1)}h`}function p({value:r,colorClass:o,onClick:f}){return r===0?t.jsx("span",{className:"text-text-tertiary",children:"0"}):t.jsx("button",{onClick:f,className:`${o} hover:underline tabular-nums font-medium`,children:r})}function _(){$();const r=w(),[o,f]=x.useState("24h"),{data:c}=C({limit:500}),{data:g}=k(),b=x.useMemo(()=>{const e=v.find(i=>i.label===o);return Date.now()-e.ms},[o]),n=x.useMemo(()=>((c==null?void 0:c.jobs)??[]).filter(e=>new Date(e.created_at).getTime()>=b),[c==null?void 0:c.jobs,b]),j=x.useMemo(()=>{const e=new Map;for(const a of n){const s=e.get(a.entity)??{total:0,running:0,completed:0,failed:0,durations:[]};if(s.total++,a.status==="running"&&s.running++,a.status==="completed"){s.completed++;const m=new Date(a.updated_at).getTime()-new Date(a.created_at).getTime();m>0&&s.durations.push(m)}a.status==="failed"&&s.failed++,e.set(a.entity,s)}const i=[];for(const[a,s]of e)i.push({type:a,...s,avgDuration:s.durations.length>0?s.durations.reduce((m,N)=>m+N,0)/s.durations.length:null});return i.sort((a,s)=>s.total-a.total)},[n]),u=x.useMemo(()=>({total:n.length,running:n.filter(e=>e.status==="running").length,completed:n.filter(e=>e.status==="completed").length,failed:n.filter(e=>e.status==="failed").length}),[n]),y=(g==null?void 0:g.length)??0,l=(e,i)=>{const a=new URLSearchParams;e&&a.set("entity",e),i&&a.set("status",i);const s=a.toString();r(`/workflows/executions${s?`?${s}`:""}`)},d="pb-2 text-2xs font-semibold uppercase tracking-widest text-text-tertiary";return t.jsxs("div",{children:[t.jsx(D,{title:"Workflows",actions:t.jsxs("span",{className:"text-xs text-text-tertiary",children:[y," certified type",y!==1?"s":""]})}),t.jsx("div",{className:"flex items-center gap-1 mb-6",children:v.map(e=>t.jsx("button",{onClick:()=>f(e.label),className:`px-3 py-1 text-xs rounded-full transition-colors ${o===e.label?"bg-accent text-text-inverse":"text-text-tertiary hover:text-text-primary hover:bg-surface-hover"}`,children:e.label},e.label))}),t.jsxs("div",{className:"grid grid-cols-4 gap-4 mb-8",children:[t.jsx(h,{label:"Total",value:u.total,onClick:()=>l()}),t.jsx(h,{label:"Running",value:u.running,colorClass:"text-status-active",onClick:()=>l(void 0,"running")}),t.jsx(h,{label:"Completed",value:u.completed,colorClass:"text-status-success",onClick:()=>l(void 0,"completed")}),t.jsx(h,{label:"Failed",value:u.failed,colorClass:"text-status-error",onClick:()=>l(void 0,"failed")})]}),j.length>0&&t.jsxs("table",{className:"w-full text-left",children:[t.jsx("thead",{children:t.jsxs("tr",{className:"border-b border-surface-border",children:[t.jsx("th",{className:d,children:"Type"}),t.jsx("th",{className:`${d} text-right w-20`,children:"Total"}),t.jsx("th",{className:`${d} text-right w-20`,children:"Running"}),t.jsx("th",{className:`${d} text-right w-24`,children:"Completed"}),t.jsx("th",{className:`${d} text-right w-20`,children:"Failed"}),t.jsx("th",{className:`${d} text-right w-28`,children:"Avg Duration"})]})}),t.jsx("tbody",{children:j.map(e=>t.jsxs("tr",{className:"border-b border-surface-border last:border-b-0",children:[t.jsx("td",{className:"py-3 text-sm font-mono text-text-primary",children:t.jsx("button",{onClick:()=>l(e.type),className:"hover:text-accent hover:underline",children:e.type})}),t.jsx("td",{className:"py-3 text-sm text-right",children:t.jsx(p,{value:e.total,colorClass:"text-text-secondary",onClick:()=>l(e.type)})}),t.jsx("td",{className:"py-3 text-sm text-right",children:t.jsx(p,{value:e.running,colorClass:"text-status-active",onClick:()=>l(e.type,"running")})}),t.jsx("td",{className:"py-3 text-sm text-right",children:t.jsx(p,{value:e.completed,colorClass:"text-status-success",onClick:()=>l(e.type,"completed")})}),t.jsx("td",{className:"py-3 text-sm text-right",children:t.jsx(p,{value:e.failed,colorClass:"text-status-error",onClick:()=>l(e.type,"failed")})}),t.jsx("td",{className:"py-3 text-sm font-mono text-text-secondary text-right",children:e.avgDuration!==null?T(e.avgDuration):"—"})]},e.type))})]}),j.length===0&&t.jsx("div",{className:"py-16 text-center",children:t.jsxs("p",{className:"text-sm text-text-tertiary",children:["No workflow activity in the last ",o]})})]})}export{_ as WorkflowsOverview};
2
- //# sourceMappingURL=WorkflowsOverview-DACADuUE.js.map
1
+ import{a as x,j as t}from"./vendor-query-RUZdMvN6.js";import{b as C,u as k}from"./workflows-TA0p_3B8.js";import{b as $}from"./useEventHooks-CjV3uNxt.js";import{P as D}from"./PageHeader-CFVw67M6.js";import{S as h}from"./StatCard-BXQ8dD9Y.js";import{u as w}from"./vendor-react-CdqEC2zv.js";import"./index-CgXVDPW-.js";import"./vendor-icons-h-jlRSb9.js";const v=[{label:"1h",ms:36e5},{label:"24h",ms:864e5},{label:"7d",ms:6048e5},{label:"30d",ms:2592e6}];function T(r){return r<1e3?`${Math.round(r)}ms`:r<6e4?`${(r/1e3).toFixed(1)}s`:r<36e5?`${(r/6e4).toFixed(1)}m`:`${(r/36e5).toFixed(1)}h`}function p({value:r,colorClass:o,onClick:f}){return r===0?t.jsx("span",{className:"text-text-tertiary",children:"0"}):t.jsx("button",{onClick:f,className:`${o} hover:underline tabular-nums font-medium`,children:r})}function _(){$();const r=w(),[o,f]=x.useState("24h"),{data:c}=C({limit:500}),{data:g}=k(),b=x.useMemo(()=>{const e=v.find(i=>i.label===o);return Date.now()-e.ms},[o]),n=x.useMemo(()=>((c==null?void 0:c.jobs)??[]).filter(e=>new Date(e.created_at).getTime()>=b),[c==null?void 0:c.jobs,b]),j=x.useMemo(()=>{const e=new Map;for(const a of n){const s=e.get(a.entity)??{total:0,running:0,completed:0,failed:0,durations:[]};if(s.total++,a.status==="running"&&s.running++,a.status==="completed"){s.completed++;const m=new Date(a.updated_at).getTime()-new Date(a.created_at).getTime();m>0&&s.durations.push(m)}a.status==="failed"&&s.failed++,e.set(a.entity,s)}const i=[];for(const[a,s]of e)i.push({type:a,...s,avgDuration:s.durations.length>0?s.durations.reduce((m,N)=>m+N,0)/s.durations.length:null});return i.sort((a,s)=>s.total-a.total)},[n]),u=x.useMemo(()=>({total:n.length,running:n.filter(e=>e.status==="running").length,completed:n.filter(e=>e.status==="completed").length,failed:n.filter(e=>e.status==="failed").length}),[n]),y=(g==null?void 0:g.length)??0,l=(e,i)=>{const a=new URLSearchParams;e&&a.set("entity",e),i&&a.set("status",i);const s=a.toString();r(`/workflows/executions${s?`?${s}`:""}`)},d="pb-2 text-2xs font-semibold uppercase tracking-widest text-text-tertiary";return t.jsxs("div",{children:[t.jsx(D,{title:"Workflows",actions:t.jsxs("span",{className:"text-xs text-text-tertiary",children:[y," certified type",y!==1?"s":""]})}),t.jsx("div",{className:"flex items-center gap-1 mb-6",children:v.map(e=>t.jsx("button",{onClick:()=>f(e.label),className:`px-3 py-1 text-xs rounded-full transition-colors ${o===e.label?"bg-accent text-text-inverse":"text-text-tertiary hover:text-text-primary hover:bg-surface-hover"}`,children:e.label},e.label))}),t.jsxs("div",{className:"grid grid-cols-4 gap-4 mb-8",children:[t.jsx(h,{label:"Total",value:u.total,onClick:()=>l()}),t.jsx(h,{label:"Running",value:u.running,colorClass:"text-status-active",onClick:()=>l(void 0,"running")}),t.jsx(h,{label:"Completed",value:u.completed,colorClass:"text-status-success",onClick:()=>l(void 0,"completed")}),t.jsx(h,{label:"Failed",value:u.failed,colorClass:"text-status-error",onClick:()=>l(void 0,"failed")})]}),j.length>0&&t.jsxs("table",{className:"w-full text-left",children:[t.jsx("thead",{children:t.jsxs("tr",{className:"border-b border-surface-border",children:[t.jsx("th",{className:d,children:"Type"}),t.jsx("th",{className:`${d} text-right w-20`,children:"Total"}),t.jsx("th",{className:`${d} text-right w-20`,children:"Running"}),t.jsx("th",{className:`${d} text-right w-24`,children:"Completed"}),t.jsx("th",{className:`${d} text-right w-20`,children:"Failed"}),t.jsx("th",{className:`${d} text-right w-28`,children:"Avg Duration"})]})}),t.jsx("tbody",{children:j.map(e=>t.jsxs("tr",{className:"border-b border-surface-border last:border-b-0",children:[t.jsx("td",{className:"py-3 text-sm font-mono text-text-primary",children:t.jsx("button",{onClick:()=>l(e.type),className:"hover:text-accent hover:underline",children:e.type})}),t.jsx("td",{className:"py-3 text-sm text-right",children:t.jsx(p,{value:e.total,colorClass:"text-text-secondary",onClick:()=>l(e.type)})}),t.jsx("td",{className:"py-3 text-sm text-right",children:t.jsx(p,{value:e.running,colorClass:"text-status-active",onClick:()=>l(e.type,"running")})}),t.jsx("td",{className:"py-3 text-sm text-right",children:t.jsx(p,{value:e.completed,colorClass:"text-status-success",onClick:()=>l(e.type,"completed")})}),t.jsx("td",{className:"py-3 text-sm text-right",children:t.jsx(p,{value:e.failed,colorClass:"text-status-error",onClick:()=>l(e.type,"failed")})}),t.jsx("td",{className:"py-3 text-sm font-mono text-text-secondary text-right",children:e.avgDuration!==null?T(e.avgDuration):"—"})]},e.type))})]}),j.length===0&&t.jsx("div",{className:"py-16 text-center",children:t.jsxs("p",{className:"text-sm text-text-tertiary",children:["No workflow activity in the last ",o]})})]})}export{_ as WorkflowsOverview};
2
+ //# sourceMappingURL=WorkflowsOverview-Zh_EidMp.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WorkflowsOverview-DACADuUE.js","sources":["../../src/pages/workflows/WorkflowsOverview.tsx"],"sourcesContent":["import { useState, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { useJobs, useWorkflowConfigs } from '../../api/workflows';\nimport { useWorkflowListEvents } from '../../hooks/useEventHooks';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { StatCard } from '../../components/common/data/StatCard';\n\n// ── Duration filter ──────────────────────────────────────────────────────────\n\nconst DURATIONS = [\n { label: '1h', ms: 3_600_000 },\n { label: '24h', ms: 86_400_000 },\n { label: '7d', ms: 604_800_000 },\n { label: '30d', ms: 2_592_000_000 },\n] as const;\n\ntype DurationLabel = (typeof DURATIONS)[number]['label'];\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${Math.round(ms)}ms`;\n if (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`;\n if (ms < 3_600_000) return `${(ms / 60_000).toFixed(1)}m`;\n return `${(ms / 3_600_000).toFixed(1)}h`;\n}\n\ninterface TypeStats {\n type: string;\n total: number;\n running: number;\n completed: number;\n failed: number;\n avgDuration: number | null;\n}\n\n// ── Clickable stat cell ──────────────────────────────────────────────────────\n\nfunction StatCell({\n value,\n colorClass,\n onClick,\n}: {\n value: number;\n colorClass: string;\n onClick: () => void;\n}) {\n if (value === 0) {\n return <span className=\"text-text-tertiary\">0</span>;\n }\n return (\n <button\n onClick={onClick}\n className={`${colorClass} hover:underline tabular-nums font-medium`}\n >\n {value}\n </button>\n );\n}\n\n// ── Page ─────────────────────────────────────────────────────────────────────\n\nexport function WorkflowsOverview() {\n useWorkflowListEvents();\n const navigate = useNavigate();\n const [duration, setDuration] = useState<DurationLabel>('24h');\n\n const { data: allJobs } = useJobs({ limit: 500 });\n const { data: configs } = useWorkflowConfigs();\n\n const cutoff = useMemo(() => {\n const d = DURATIONS.find((d) => d.label === duration)!;\n return Date.now() - d.ms;\n }, [duration]);\n\n const jobs = useMemo(\n () => (allJobs?.jobs ?? []).filter((j) => new Date(j.created_at).getTime() >= cutoff),\n [allJobs?.jobs, cutoff],\n );\n\n const byType = useMemo(() => {\n const map = new Map<string, { total: number; running: number; completed: number; failed: number; durations: number[] }>();\n for (const j of jobs) {\n const entry = map.get(j.entity) ?? { total: 0, running: 0, completed: 0, failed: 0, durations: [] };\n entry.total++;\n if (j.status === 'running') entry.running++;\n if (j.status === 'completed') {\n entry.completed++;\n const dur = new Date(j.updated_at).getTime() - new Date(j.created_at).getTime();\n if (dur > 0) entry.durations.push(dur);\n }\n if (j.status === 'failed') entry.failed++;\n map.set(j.entity, entry);\n }\n\n const result: TypeStats[] = [];\n for (const [type, stats] of map) {\n result.push({\n type,\n ...stats,\n avgDuration: stats.durations.length > 0\n ? stats.durations.reduce((a, b) => a + b, 0) / stats.durations.length\n : null,\n });\n }\n return result.sort((a, b) => b.total - a.total);\n }, [jobs]);\n\n // Totals\n const totals = useMemo(() => ({\n total: jobs.length,\n running: jobs.filter((j) => j.status === 'running').length,\n completed: jobs.filter((j) => j.status === 'completed').length,\n failed: jobs.filter((j) => j.status === 'failed').length,\n }), [jobs]);\n\n const registered = configs?.length ?? 0;\n\n const goToList = (entity?: string, status?: string) => {\n const params = new URLSearchParams();\n if (entity) params.set('entity', entity);\n if (status) params.set('status', status);\n const qs = params.toString();\n navigate(`/workflows/executions${qs ? `?${qs}` : ''}`);\n };\n\n const thCls = 'pb-2 text-2xs font-semibold uppercase tracking-widest text-text-tertiary';\n\n return (\n <div>\n <PageHeader\n title=\"Workflows\"\n actions={\n <span className=\"text-xs text-text-tertiary\">\n {registered} certified type{registered !== 1 ? 's' : ''}\n </span>\n }\n />\n\n {/* Duration tabs */}\n <div className=\"flex items-center gap-1 mb-6\">\n {DURATIONS.map((d) => (\n <button\n key={d.label}\n onClick={() => setDuration(d.label)}\n className={`px-3 py-1 text-xs rounded-full transition-colors ${\n duration === d.label\n ? 'bg-accent text-text-inverse'\n : 'text-text-tertiary hover:text-text-primary hover:bg-surface-hover'\n }`}\n >\n {d.label}\n </button>\n ))}\n </div>\n\n {/* Summary cards */}\n <div className=\"grid grid-cols-4 gap-4 mb-8\">\n <StatCard label=\"Total\" value={totals.total} onClick={() => goToList()} />\n <StatCard label=\"Running\" value={totals.running} colorClass=\"text-status-active\" onClick={() => goToList(undefined, 'running')} />\n <StatCard label=\"Completed\" value={totals.completed} colorClass=\"text-status-success\" onClick={() => goToList(undefined, 'completed')} />\n <StatCard label=\"Failed\" value={totals.failed} colorClass=\"text-status-error\" onClick={() => goToList(undefined, 'failed')} />\n </div>\n\n {/* By-type table */}\n {byType.length > 0 && (\n <table className=\"w-full text-left\">\n <thead>\n <tr className=\"border-b border-surface-border\">\n <th className={thCls}>Type</th>\n <th className={`${thCls} text-right w-20`}>Total</th>\n <th className={`${thCls} text-right w-20`}>Running</th>\n <th className={`${thCls} text-right w-24`}>Completed</th>\n <th className={`${thCls} text-right w-20`}>Failed</th>\n <th className={`${thCls} text-right w-28`}>Avg Duration</th>\n </tr>\n </thead>\n <tbody>\n {byType.map((row) => (\n <tr key={row.type} className=\"border-b border-surface-border last:border-b-0\">\n <td className=\"py-3 text-sm font-mono text-text-primary\">\n <button\n onClick={() => goToList(row.type)}\n className=\"hover:text-accent hover:underline\"\n >\n {row.type}\n </button>\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.total} colorClass=\"text-text-secondary\" onClick={() => goToList(row.type)} />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.running} colorClass=\"text-status-active\" onClick={() => goToList(row.type, 'running')} />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.completed} colorClass=\"text-status-success\" onClick={() => goToList(row.type, 'completed')} />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.failed} colorClass=\"text-status-error\" onClick={() => goToList(row.type, 'failed')} />\n </td>\n <td className=\"py-3 text-sm font-mono text-text-secondary text-right\">\n {row.avgDuration !== null ? formatDuration(row.avgDuration) : '—'}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n )}\n\n {byType.length === 0 && (\n <div className=\"py-16 text-center\">\n <p className=\"text-sm text-text-tertiary\">\n No workflow activity in the last {duration}\n </p>\n </div>\n )}\n </div>\n );\n}"],"names":["DURATIONS","formatDuration","ms","StatCell","value","colorClass","onClick","jsx","WorkflowsOverview","useWorkflowListEvents","navigate","useNavigate","duration","setDuration","useState","allJobs","useJobs","configs","useWorkflowConfigs","cutoff","useMemo","d","jobs","j","byType","map","entry","dur","result","type","stats","a","b","totals","registered","goToList","entity","status","params","qs","thCls","PageHeader","jsxs","StatCard","row"],"mappings":"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"}
1
+ {"version":3,"file":"WorkflowsOverview-Zh_EidMp.js","sources":["../../src/pages/workflows/WorkflowsOverview.tsx"],"sourcesContent":["import { useState, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { useJobs, useWorkflowConfigs } from '../../api/workflows';\nimport { useWorkflowListEvents } from '../../hooks/useEventHooks';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { StatCard } from '../../components/common/data/StatCard';\n\n// ── Duration filter ──────────────────────────────────────────────────────────\n\nconst DURATIONS = [\n { label: '1h', ms: 3_600_000 },\n { label: '24h', ms: 86_400_000 },\n { label: '7d', ms: 604_800_000 },\n { label: '30d', ms: 2_592_000_000 },\n] as const;\n\ntype DurationLabel = (typeof DURATIONS)[number]['label'];\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${Math.round(ms)}ms`;\n if (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`;\n if (ms < 3_600_000) return `${(ms / 60_000).toFixed(1)}m`;\n return `${(ms / 3_600_000).toFixed(1)}h`;\n}\n\ninterface TypeStats {\n type: string;\n total: number;\n running: number;\n completed: number;\n failed: number;\n avgDuration: number | null;\n}\n\n// ── Clickable stat cell ──────────────────────────────────────────────────────\n\nfunction StatCell({\n value,\n colorClass,\n onClick,\n}: {\n value: number;\n colorClass: string;\n onClick: () => void;\n}) {\n if (value === 0) {\n return <span className=\"text-text-tertiary\">0</span>;\n }\n return (\n <button\n onClick={onClick}\n className={`${colorClass} hover:underline tabular-nums font-medium`}\n >\n {value}\n </button>\n );\n}\n\n// ── Page ─────────────────────────────────────────────────────────────────────\n\nexport function WorkflowsOverview() {\n useWorkflowListEvents();\n const navigate = useNavigate();\n const [duration, setDuration] = useState<DurationLabel>('24h');\n\n const { data: allJobs } = useJobs({ limit: 500 });\n const { data: configs } = useWorkflowConfigs();\n\n const cutoff = useMemo(() => {\n const d = DURATIONS.find((d) => d.label === duration)!;\n return Date.now() - d.ms;\n }, [duration]);\n\n const jobs = useMemo(\n () => (allJobs?.jobs ?? []).filter((j) => new Date(j.created_at).getTime() >= cutoff),\n [allJobs?.jobs, cutoff],\n );\n\n const byType = useMemo(() => {\n const map = new Map<string, { total: number; running: number; completed: number; failed: number; durations: number[] }>();\n for (const j of jobs) {\n const entry = map.get(j.entity) ?? { total: 0, running: 0, completed: 0, failed: 0, durations: [] };\n entry.total++;\n if (j.status === 'running') entry.running++;\n if (j.status === 'completed') {\n entry.completed++;\n const dur = new Date(j.updated_at).getTime() - new Date(j.created_at).getTime();\n if (dur > 0) entry.durations.push(dur);\n }\n if (j.status === 'failed') entry.failed++;\n map.set(j.entity, entry);\n }\n\n const result: TypeStats[] = [];\n for (const [type, stats] of map) {\n result.push({\n type,\n ...stats,\n avgDuration: stats.durations.length > 0\n ? stats.durations.reduce((a, b) => a + b, 0) / stats.durations.length\n : null,\n });\n }\n return result.sort((a, b) => b.total - a.total);\n }, [jobs]);\n\n // Totals\n const totals = useMemo(() => ({\n total: jobs.length,\n running: jobs.filter((j) => j.status === 'running').length,\n completed: jobs.filter((j) => j.status === 'completed').length,\n failed: jobs.filter((j) => j.status === 'failed').length,\n }), [jobs]);\n\n const registered = configs?.length ?? 0;\n\n const goToList = (entity?: string, status?: string) => {\n const params = new URLSearchParams();\n if (entity) params.set('entity', entity);\n if (status) params.set('status', status);\n const qs = params.toString();\n navigate(`/workflows/executions${qs ? `?${qs}` : ''}`);\n };\n\n const thCls = 'pb-2 text-2xs font-semibold uppercase tracking-widest text-text-tertiary';\n\n return (\n <div>\n <PageHeader\n title=\"Workflows\"\n actions={\n <span className=\"text-xs text-text-tertiary\">\n {registered} certified type{registered !== 1 ? 's' : ''}\n </span>\n }\n />\n\n {/* Duration tabs */}\n <div className=\"flex items-center gap-1 mb-6\">\n {DURATIONS.map((d) => (\n <button\n key={d.label}\n onClick={() => setDuration(d.label)}\n className={`px-3 py-1 text-xs rounded-full transition-colors ${\n duration === d.label\n ? 'bg-accent text-text-inverse'\n : 'text-text-tertiary hover:text-text-primary hover:bg-surface-hover'\n }`}\n >\n {d.label}\n </button>\n ))}\n </div>\n\n {/* Summary cards */}\n <div className=\"grid grid-cols-4 gap-4 mb-8\">\n <StatCard label=\"Total\" value={totals.total} onClick={() => goToList()} />\n <StatCard label=\"Running\" value={totals.running} colorClass=\"text-status-active\" onClick={() => goToList(undefined, 'running')} />\n <StatCard label=\"Completed\" value={totals.completed} colorClass=\"text-status-success\" onClick={() => goToList(undefined, 'completed')} />\n <StatCard label=\"Failed\" value={totals.failed} colorClass=\"text-status-error\" onClick={() => goToList(undefined, 'failed')} />\n </div>\n\n {/* By-type table */}\n {byType.length > 0 && (\n <table className=\"w-full text-left\">\n <thead>\n <tr className=\"border-b border-surface-border\">\n <th className={thCls}>Type</th>\n <th className={`${thCls} text-right w-20`}>Total</th>\n <th className={`${thCls} text-right w-20`}>Running</th>\n <th className={`${thCls} text-right w-24`}>Completed</th>\n <th className={`${thCls} text-right w-20`}>Failed</th>\n <th className={`${thCls} text-right w-28`}>Avg Duration</th>\n </tr>\n </thead>\n <tbody>\n {byType.map((row) => (\n <tr key={row.type} className=\"border-b border-surface-border last:border-b-0\">\n <td className=\"py-3 text-sm font-mono text-text-primary\">\n <button\n onClick={() => goToList(row.type)}\n className=\"hover:text-accent hover:underline\"\n >\n {row.type}\n </button>\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.total} colorClass=\"text-text-secondary\" onClick={() => goToList(row.type)} />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.running} colorClass=\"text-status-active\" onClick={() => goToList(row.type, 'running')} />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.completed} colorClass=\"text-status-success\" onClick={() => goToList(row.type, 'completed')} />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.failed} colorClass=\"text-status-error\" onClick={() => goToList(row.type, 'failed')} />\n </td>\n <td className=\"py-3 text-sm font-mono text-text-secondary text-right\">\n {row.avgDuration !== null ? formatDuration(row.avgDuration) : '—'}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n )}\n\n {byType.length === 0 && (\n <div className=\"py-16 text-center\">\n <p className=\"text-sm text-text-tertiary\">\n No workflow activity in the last {duration}\n </p>\n </div>\n )}\n </div>\n );\n}"],"names":["DURATIONS","formatDuration","ms","StatCell","value","colorClass","onClick","jsx","WorkflowsOverview","useWorkflowListEvents","navigate","useNavigate","duration","setDuration","useState","allJobs","useJobs","configs","useWorkflowConfigs","cutoff","useMemo","d","jobs","j","byType","map","entry","dur","result","type","stats","a","b","totals","registered","goToList","entity","status","params","qs","thCls","PageHeader","jsxs","StatCard","row"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import{j as p}from"./vendor-query-RUZdMvN6.js";import{c as vn,d as An}from"./yaml-workflows-kxOF5yEC.js";import{S as yn}from"./StatusBadge-BDeUwPtb.js";import{N as _n}from"./NamespacePill-CKp_9EaI.js";import{a0 as Cn}from"./index-lGfBW1PB.js";import{B as wn,i as bn,K as Sn,p as se,W as En,af as Nn,at as Fn}from"./vendor-icons-BgsXTN4h.js";import{e as Tn,u as kn}from"./vendor-react-CdqEC2zv.js";/*! js-yaml 4.1.1 https://github.com/nodeca/js-yaml @license MIT */function Te(e){return typeof e>"u"||e===null}function On(e){return typeof e=="object"&&e!==null}function In(e){return Array.isArray(e)?e:Te(e)?[]:[e]}function jn(e,n){var i,l,r,u;if(n)for(u=Object.keys(n),i=0,l=u.length;i<l;i+=1)r=u[i],e[r]=n[r];return e}function Ln(e,n){var i="",l;for(l=0;l<n;l+=1)i+=e;return i}function Rn(e){return e===0&&Number.NEGATIVE_INFINITY===1/e}var Dn=Te,Mn=On,Yn=In,Bn=Ln,Pn=Rn,Hn=jn,_={isNothing:Dn,isObject:Mn,toArray:Yn,repeat:Bn,isNegativeZero:Pn,extend:Hn};function ke(e,n){var i="",l=e.reason||"(unknown reason)";return e.mark?(e.mark.name&&(i+='in "'+e.mark.name+'" '),i+="("+(e.mark.line+1)+":"+(e.mark.column+1)+")",!n&&e.mark.snippet&&(i+=`
1
+ import{j as p}from"./vendor-query-RUZdMvN6.js";import{c as vn,d as An}from"./yaml-workflows-DN9-DBnQ.js";import{S as yn}from"./StatusBadge-BDeUwPtb.js";import{N as _n}from"./NamespacePill-DONj6eUU.js";import{a0 as Cn}from"./index-CgXVDPW-.js";import{B as wn,i as bn,J as Sn,n as se,W as En,ae as Nn,at as Fn}from"./vendor-icons-h-jlRSb9.js";import{e as Tn,u as kn}from"./vendor-react-CdqEC2zv.js";/*! js-yaml 4.1.1 https://github.com/nodeca/js-yaml @license MIT */function Te(e){return typeof e>"u"||e===null}function On(e){return typeof e=="object"&&e!==null}function In(e){return Array.isArray(e)?e:Te(e)?[]:[e]}function jn(e,n){var i,l,r,u;if(n)for(u=Object.keys(n),i=0,l=u.length;i<l;i+=1)r=u[i],e[r]=n[r];return e}function Ln(e,n){var i="",l;for(l=0;l<n;l+=1)i+=e;return i}function Rn(e){return e===0&&Number.NEGATIVE_INFINITY===1/e}var Dn=Te,Mn=On,Yn=In,Bn=Ln,Pn=Rn,Hn=jn,_={isNothing:Dn,isObject:Mn,toArray:Yn,repeat:Bn,isNegativeZero:Pn,extend:Hn};function ke(e,n){var i="",l=e.reason||"(unknown reason)";return e.mark?(e.mark.name&&(i+='in "'+e.mark.name+'" '),i+="("+(e.mark.line+1)+":"+(e.mark.column+1)+")",!n&&e.mark.snippet&&(i+=`
2
2
 
3
3
  `+e.mark.snippet),l+" "+i):l}function P(e,n){Error.call(this),this.name="YAMLException",this.reason=e,this.mark=n,this.message=ke(this,!1),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack||""}P.prototype=Object.create(Error.prototype);P.prototype.constructor=P;P.prototype.toString=function(n){return this.name+": "+ke(this,n)};var b=P;function X(e,n,i,l,r){var u="",o="",c=Math.floor(r/2)-1;return l-n>c&&(u=" ... ",n=l-c+u.length),i-l>c&&(o=" ...",i=l+c-o.length),{str:u+e.slice(n,i).replace(/\t/g,"→")+o,pos:l-n+u.length}}function Z(e,n){return _.repeat(" ",n-e.length)+e}function Un(e,n){if(n=Object.create(n||null),!e.buffer)return null;n.maxLength||(n.maxLength=79),typeof n.indent!="number"&&(n.indent=1),typeof n.linesBefore!="number"&&(n.linesBefore=3),typeof n.linesAfter!="number"&&(n.linesAfter=2);for(var i=/\r?\n|\r|\0/g,l=[0],r=[],u,o=-1;u=i.exec(e.buffer);)r.push(u.index),l.push(u.index+u[0].length),e.position<=u.index&&o<0&&(o=l.length-2);o<0&&(o=l.length-1);var c="",a,t,s=Math.min(e.line+n.linesAfter,r.length).toString().length,f=n.maxLength-(n.indent+s+3);for(a=1;a<=n.linesBefore&&!(o-a<0);a++)t=X(e.buffer,l[o-a],r[o-a],e.position-(l[o]-l[o-a]),f),c=_.repeat(" ",n.indent)+Z((e.line-a+1).toString(),s)+" | "+t.str+`
4
4
  `+c;for(t=X(e.buffer,l[o],r[o],e.position,f),c+=_.repeat(" ",n.indent)+Z((e.line+1).toString(),s)+" | "+t.str+`
@@ -30,4 +30,4 @@ import{j as p}from"./vendor-query-RUZdMvN6.js";import{c as vn,d as An}from"./yam
30
30
  `,e.length-r>n&&o>r?a+=e.slice(r,o)+`
31
31
  `+e.slice(o+1):a+=e.slice(r),a.slice(1)}function Fr(e){for(var n="",i=0,l,r=0;r<e.length;i>=65536?r+=2:r++)i=B(e,r),l=w[i],!l&&q(i)?(n+=e[r],i>=65536&&(n+=e[r+1])):n+=l||Ar(i);return n}function Tr(e,n,i){var l="",r=e.tag,u,o,c;for(u=0,o=i.length;u<o;u+=1)c=i[u],e.replacer&&(c=e.replacer.call(i,String(u),c)),(F(e,n,c,!1,!1)||typeof c>"u"&&F(e,n,null,!1,!1))&&(l!==""&&(l+=","+(e.condenseFlow?"":" ")),l+=e.dump);e.tag=r,e.dump="["+l+"]"}function Ee(e,n,i,l){var r="",u=e.tag,o,c,a;for(o=0,c=i.length;o<c;o+=1)a=i[o],e.replacer&&(a=e.replacer.call(i,String(o),a)),(F(e,n+1,a,!0,!0,!1,!0)||typeof a>"u"&&F(e,n+1,null,!0,!0,!1,!0))&&((!l||r!=="")&&(r+=ie(e,n)),e.dump&&H===e.dump.charCodeAt(0)?r+="-":r+="- ",r+=e.dump);e.tag=u,e.dump=r||"[]"}function kr(e,n,i){var l="",r=e.tag,u=Object.keys(i),o,c,a,t,s;for(o=0,c=u.length;o<c;o+=1)s="",l!==""&&(s+=", "),e.condenseFlow&&(s+='"'),a=u[o],t=i[a],e.replacer&&(t=e.replacer.call(i,a,t)),F(e,n,a,!1,!1)&&(e.dump.length>1024&&(s+="? "),s+=e.dump+(e.condenseFlow?'"':"")+":"+(e.condenseFlow?"":" "),F(e,n,t,!1,!1)&&(s+=e.dump,l+=s));e.tag=r,e.dump="{"+l+"}"}function Or(e,n,i,l){var r="",u=e.tag,o=Object.keys(i),c,a,t,s,f,h;if(e.sortKeys===!0)o.sort();else if(typeof e.sortKeys=="function")o.sort(e.sortKeys);else if(e.sortKeys)throw new b("sortKeys must be a boolean or a function");for(c=0,a=o.length;c<a;c+=1)h="",(!l||r!=="")&&(h+=ie(e,n)),t=o[c],s=i[t],e.replacer&&(s=e.replacer.call(i,t,s)),F(e,n+1,t,!0,!0,!0)&&(f=e.tag!==null&&e.tag!=="?"||e.dump&&e.dump.length>1024,f&&(e.dump&&H===e.dump.charCodeAt(0)?h+="?":h+="? "),h+=e.dump,f&&(h+=ie(e,n)),F(e,n+1,s,!0,f)&&(e.dump&&H===e.dump.charCodeAt(0)?h+=":":h+=": ",h+=e.dump,r+=h));e.tag=u,e.dump=r||"{}"}function Ne(e,n,i){var l,r,u,o,c,a;for(r=i?e.explicitTypes:e.implicitTypes,u=0,o=r.length;u<o;u+=1)if(c=r[u],(c.instanceOf||c.predicate)&&(!c.instanceOf||typeof n=="object"&&n instanceof c.instanceOf)&&(!c.predicate||c.predicate(n))){if(i?c.multi&&c.representName?e.tag=c.representName(n):e.tag=c.tag:e.tag="?",c.represent){if(a=e.styleMap[c.tag]||c.defaultStyle,cn.call(c.represent)==="[object Function]")l=c.represent(n,a);else if(an.call(c.represent,a))l=c.represent[a](n,a);else throw new b("!<"+c.tag+'> tag resolver accepts not "'+a+'" style');e.dump=l}return!0}return!1}function F(e,n,i,l,r,u,o){e.tag=null,e.dump=i,Ne(e,i,!1)||Ne(e,i,!0);var c=cn.call(e.dump),a=l,t;l&&(l=e.flowLevel<0||e.flowLevel>n);var s=c==="[object Object]"||c==="[object Array]",f,h;if(s&&(f=e.duplicates.indexOf(i),h=f!==-1),(e.tag!==null&&e.tag!=="?"||h||e.indent!==2&&n>0)&&(r=!1),h&&e.usedDuplicates[f])e.dump="*ref_"+f;else{if(s&&h&&!e.usedDuplicates[f]&&(e.usedDuplicates[f]=!0),c==="[object Object]")l&&Object.keys(e.dump).length!==0?(Or(e,n,e.dump,r),h&&(e.dump="&ref_"+f+e.dump)):(kr(e,n,e.dump),h&&(e.dump="&ref_"+f+" "+e.dump));else if(c==="[object Array]")l&&e.dump.length!==0?(e.noArrayIndent&&!o&&n>0?Ee(e,n-1,e.dump,r):Ee(e,n,e.dump,r),h&&(e.dump="&ref_"+f+e.dump)):(Tr(e,n,e.dump),h&&(e.dump="&ref_"+f+" "+e.dump));else if(c==="[object String]")e.tag!=="?"&&Er(e,e.dump,n,u,a);else{if(c==="[object Undefined]")return!1;if(e.skipInvalid)return!1;throw new b("unacceptable kind of an object to dump "+c)}e.tag!==null&&e.tag!=="?"&&(t=encodeURI(e.tag[0]==="!"?e.tag.slice(1):e.tag).replace(/!/g,"%21"),e.tag[0]==="!"?t="!"+t:t.slice(0,18)==="tag:yaml.org,2002:"?t="!!"+t.slice(18):t="!<"+t+">",e.dump=t+" "+e.dump)}return!0}function Ir(e,n){var i=[],l=[],r,u;for(le(e,i,l),r=0,u=l.length;r<u;r+=1)n.duplicates.push(i[l[r]]);n.usedDuplicates=new Array(u)}function le(e,n,i){var l,r,u;if(e!==null&&typeof e=="object")if(r=n.indexOf(e),r!==-1)i.indexOf(r)===-1&&i.push(r);else if(n.push(e),Array.isArray(e))for(r=0,u=e.length;r<u;r+=1)le(e[r],n,i);else for(l=Object.keys(e),r=0,u=l.length;r<u;r+=1)le(e[l[r]],n,i)}function jr(e,n){n=n||{};var i=new _r(n);i.noRefs||Ir(e,i);var l=e;return i.replacer&&(l=i.replacer.call({"":l},"",l)),F(i,0,l,!0,!0)?i.dump+`
32
32
  `:""}var Lr=jr,Rr={dump:Lr};function pe(e,n){return function(){throw new Error("Function yaml."+e+" is removed in js-yaml 4. Use yaml."+n+" instead, which is now safe by default.")}}var Dr=C,Mr=Oe,Yr=Re,Br=Pe,Pr=He,Hr=ce,Ur=un.load,qr=un.loadAll,Kr=Rr.dump,Wr=b,Gr={binary:Ge,float:Be,map:Le,null:De,pairs:Qe,set:Ve,timestamp:Ke,bool:Me,int:Ye,merge:We,omap:$e,seq:je,str:Ie},$r=pe("safeLoad","load"),Qr=pe("safeLoadAll","loadAll"),Vr=pe("safeDump","dump"),Xr={Type:Dr,Schema:Mr,FAILSAFE_SCHEMA:Yr,JSON_SCHEMA:Br,CORE_SCHEMA:Pr,DEFAULT_SCHEMA:Hr,load:Ur,loadAll:qr,dump:Kr,YAMLException:Wr,types:Gr,safeLoad:$r,safeLoadAll:Qr,safeDump:Vr};function Zr({children:e,className:n=""}){return p.jsx("span",{className:`px-2 py-0.5 text-2xs bg-surface-sunken rounded-full text-text-secondary ${n}`,children:e})}function j({icon:e,color:n,children:i}){return p.jsxs("div",{className:"flex items-center gap-2 mb-3 pb-2 border-b border-surface-border",children:[p.jsx(e,{className:`w-4 h-4 ${n}`,strokeWidth:1.5}),p.jsx("h2",{className:"section-h2",children:i})]})}function oe({text:e}){return p.jsx("p",{className:"text-2xs text-text-quaternary py-2",children:e})}function L({label:e,children:n}){return p.jsxs("div",{className:"flex items-baseline justify-between py-2 gap-4",children:[p.jsx("span",{className:"text-2xs uppercase tracking-widest text-text-quaternary shrink-0",children:e}),p.jsx("span",{className:"text-xs text-text-primary text-right min-w-0 truncate",children:n})]})}function J(e){return e?new Date(e).toLocaleString("en-US",{dateStyle:"medium",timeStyle:"short"}):"—"}function zr(e){const n=(e==null?void 0:e.properties)??{};return Object.entries(n).map(([i,l])=>({key:i,type:(l==null?void 0:l.type)??"any",description:(l==null?void 0:l.description)??""}))}function Fe({schema:e,empty:n}){const i=zr(e);return i.length===0?p.jsx(oe,{text:n}):p.jsx("div",{className:"divide-y divide-surface-border/30",children:i.map(l=>p.jsxs("div",{className:"py-2",children:[p.jsxs("div",{className:"flex items-baseline gap-2",children:[p.jsx("code",{className:"text-xs font-mono text-text-primary",children:l.key}),p.jsx("span",{className:"text-2xs font-mono text-text-quaternary",children:l.type})]}),l.description&&p.jsx("p",{className:"text-2xs text-text-tertiary mt-0.5 leading-snug",children:l.description})]},l.key))})}function ul(){var a;const{id:e=""}=Tn(),n=kn(),{data:i,isLoading:l}=vn(e),{data:r}=An(e),u=(r==null?void 0:r.versions)??[];if(l||!i)return p.jsxs("div",{className:"animate-pulse space-y-4",children:[p.jsx("div",{className:"h-8 bg-surface-sunken rounded w-64"}),p.jsx("div",{className:"h-40 bg-surface-sunken rounded"})]});const o=i.activity_manifest??[],c=(()=>{var s,f,h,x;const t=i.output_schema;if(t&&Object.keys(t).length>0)return t;try{const m=Xr.load(i.yaml_content);return((x=(h=(f=(s=m==null?void 0:m.app)==null?void 0:s.graphs)==null?void 0:f[0])==null?void 0:h.output)==null?void 0:x.schema)??void 0}catch{return}})();return p.jsxs("div",{children:[p.jsxs("div",{className:"flex items-start justify-between mb-3",children:[p.jsxs("div",{className:"flex items-center gap-2",children:[p.jsx("h1",{className:"text-3xl font-light text-text-primary font-mono",children:i.graph_topic}),p.jsx("button",{onClick:()=>{window.location.hash="#docs:dashboard.md:graph-workflows"},className:"text-text-quaternary hover:text-accent transition-colors mt-1",title:"Docs",children:p.jsx(wn,{className:"w-4 h-4",strokeWidth:1.5})})]}),p.jsx("div",{className:"flex items-center gap-3",children:i.status==="active"&&p.jsxs("button",{onClick:()=>n(`/mcp/workflows/invoke?id=${i.id}`),className:"flex items-center gap-1.5 px-4 py-1.5 text-xs rounded-md bg-accent text-text-inverse hover:bg-accent-hover transition-colors",children:[p.jsx(bn,{className:"w-3 h-3"})," Run"]})})]}),p.jsxs("div",{className:"flex items-center gap-3 mb-2",children:[p.jsx(yn,{status:i.status}),p.jsx(_n,{namespace:i.app_id}),p.jsxs("span",{className:"text-2xs font-mono text-text-quaternary",children:["v",i.content_version]})]}),i.description&&p.jsx("div",{className:"text-sm text-text-secondary mb-8 max-w-2xl leading-relaxed",children:p.jsx(Cn,{content:i.description})}),((a=i.tags)==null?void 0:a.length)>0&&p.jsx("div",{className:"flex items-center gap-1.5 mb-10",children:i.tags.map(t=>p.jsx(Zr,{children:t},t))}),p.jsxs("div",{className:"grid grid-cols-1 @wall:grid-cols-3 gap-x-14 gap-y-10 mb-12",children:[p.jsxs("div",{children:[p.jsx(j,{icon:Sn,color:"text-accent",children:"Overview"}),p.jsxs("div",{className:"divide-y divide-surface-border/30",children:[p.jsx(L,{label:"Topic",children:p.jsx("code",{className:"font-mono",children:i.graph_topic})}),p.jsx(L,{label:"Namespace",children:p.jsx("code",{className:"font-mono",children:i.app_id})}),p.jsx(L,{label:"App version",children:i.app_version}),p.jsx(L,{label:"Runs as",children:i.execute_as||"caller"}),p.jsx(L,{label:"Deployed",children:J(i.deployed_at)}),p.jsx(L,{label:"Activated",children:J(i.activated_at)})]})]}),p.jsxs("div",{className:"space-y-10",children:[p.jsxs("div",{children:[p.jsx(j,{icon:se,color:"text-accent",children:"Input"}),p.jsx(Fe,{schema:i.input_schema,empty:"No declared input fields"})]}),p.jsxs("div",{children:[p.jsx(j,{icon:se,color:"text-accent",children:"Output"}),p.jsx(Fe,{schema:c,empty:"No declared output fields"})]})]}),p.jsxs("div",{children:[p.jsx(j,{icon:En,color:"text-accent",children:"Graph"}),o.length===0?p.jsx(oe,{text:"A single trigger maps the input straight to the output — see the graph definition below."}):p.jsx("div",{className:"divide-y divide-surface-border/30",children:o.map(t=>p.jsxs("div",{className:"flex items-center justify-between py-2 gap-3",children:[p.jsxs("div",{className:"min-w-0",children:[p.jsx("code",{className:"text-xs font-mono text-text-primary",children:t.title||t.activity_id}),t.topic&&p.jsx("p",{className:"text-2xs font-mono text-text-quaternary truncate",children:t.topic})]}),p.jsx("span",{className:"text-2xs uppercase tracking-widest text-text-quaternary shrink-0",children:t.tool_source||t.type})]},t.activity_id))})]})]}),p.jsxs("div",{className:"mb-12",children:[p.jsx(j,{icon:Nn,color:"text-accent",children:"Definition"}),p.jsx("pre",{className:"text-2xs font-mono text-text-secondary bg-surface-sunken/50 rounded-md p-4 overflow-x-auto leading-relaxed",children:i.yaml_content})]}),p.jsxs("div",{children:[p.jsxs(j,{icon:Fn,color:"text-accent",children:["Versions (",u.length,")"]}),u.length===0?p.jsx(oe,{text:"No prior versions"}):p.jsx("div",{className:"divide-y divide-surface-border/30",children:u.map(t=>p.jsxs("div",{className:"flex items-center justify-between py-2 gap-3",children:[p.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[p.jsxs("span",{className:"text-xs font-mono text-text-primary",children:["v",t.version]}),t.change_summary&&p.jsx("span",{className:"text-2xs text-text-tertiary truncate",children:t.change_summary})]}),p.jsx("span",{className:"text-2xs text-text-quaternary shrink-0",children:J(t.created_at)})]},t.id))})]})]})}export{ul as YamlWorkflowDetailPage};
33
- //# sourceMappingURL=YamlWorkflowDetailPage-DSAjzido.js.map
33
+ //# sourceMappingURL=YamlWorkflowDetailPage-BKJbFT8C.js.map