@hotmeshio/long-tail 0.1.8 → 0.1.10
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.
- package/build/api/escalations.js +40 -5
- package/build/api/tasks.d.ts +25 -1
- package/build/api/tasks.js +49 -0
- package/build/api/workflows.js +8 -1
- package/build/examples/seed.js +18 -0
- package/build/examples/types/envelopes.d.ts +8 -0
- package/build/examples/types/index.d.ts +1 -1
- package/build/examples/workers.js +2 -0
- package/build/examples/workflows/basic-signal/activities.d.ts +17 -0
- package/build/examples/workflows/basic-signal/activities.js +18 -0
- package/build/examples/workflows/basic-signal/index.d.ts +17 -0
- package/build/examples/workflows/basic-signal/index.js +116 -0
- package/build/index.d.ts +1 -0
- package/build/index.js +4 -1
- package/build/lib/db/schemas/002_seed.sql +9 -1
- package/build/modules/ltconfig.d.ts +8 -1
- package/build/modules/ltconfig.js +12 -2
- package/build/routes/tasks.js +23 -0
- package/build/routes/workflows/invocation.js +1 -1
- package/build/sdk/index.d.ts +15 -0
- package/build/sdk/index.js +1 -0
- package/build/services/interceptor/index.js +9 -3
- package/build/services/orchestrator/condition.d.ts +34 -0
- package/build/services/orchestrator/condition.js +92 -0
- package/build/services/workflow-invocation.d.ts +1 -1
- package/build/services/workflow-invocation.js +4 -1
- package/build/start/index.d.ts +24 -0
- package/build/start/index.js +24 -0
- package/build/start/workers.d.ts +6 -8
- package/build/start/workers.js +31 -1
- package/build/system/mcp-servers/admin/workflows.js +5 -0
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/envelope.d.ts +7 -0
- package/build/types/sdk.d.ts +2 -0
- package/build/types/startup.d.ts +29 -2
- package/dashboard/dist/assets/{AdminDashboard-B15jSEV2.js → AdminDashboard-DUrSBQOl.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-B15jSEV2.js.map → AdminDashboard-DUrSBQOl.js.map} +1 -1
- package/dashboard/dist/assets/{AvailableEscalationsPage-0V2yvKak.js → AvailableEscalationsPage-Dbd1qUK_.js} +2 -2
- package/dashboard/dist/assets/{AvailableEscalationsPage-0V2yvKak.js.map → AvailableEscalationsPage-Dbd1qUK_.js.map} +1 -1
- package/dashboard/dist/assets/{BotPicker-B4UxHcek.js → BotPicker-Cg5iNEkm.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-B4UxHcek.js.map → BotPicker-Cg5iNEkm.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-BBexNWVd.js → CollapsibleSection-Kd9UIyeU.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-BBexNWVd.js.map → CollapsibleSection-Kd9UIyeU.js.map} +1 -1
- package/dashboard/dist/assets/{ConfirmDeleteModal-DlPDJSq_.js → ConfirmDeleteModal-DZMgmlof.js} +2 -2
- package/dashboard/dist/assets/{ConfirmDeleteModal-DlPDJSq_.js.map → ConfirmDeleteModal-DZMgmlof.js.map} +1 -1
- package/dashboard/dist/assets/{CopyableId-BxHW1ahb.js → CopyableId-cPFTRm8q.js} +2 -2
- package/dashboard/dist/assets/{CopyableId-BxHW1ahb.js.map → CopyableId-cPFTRm8q.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-Bp_Y1Szk.js → CredentialsPage-DJablIbs.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-Bp_Y1Szk.js.map → CredentialsPage-DJablIbs.js.map} +1 -1
- package/dashboard/dist/assets/{CustomDurationPicker-ByBFqXSO.js → CustomDurationPicker-NgIP6YDW.js} +2 -2
- package/dashboard/dist/assets/{CustomDurationPicker-ByBFqXSO.js.map → CustomDurationPicker-NgIP6YDW.js.map} +1 -1
- package/dashboard/dist/assets/{DataTable-DyIXg-tQ.js → DataTable-CTRhTAfT.js} +2 -2
- package/dashboard/dist/assets/{DataTable-DyIXg-tQ.js.map → DataTable-CTRhTAfT.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-BgnA0qpS.js → ElapsedCell-HcSJ_MMs.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-BgnA0qpS.js.map → ElapsedCell-HcSJ_MMs.js.map} +1 -1
- package/dashboard/dist/assets/{EmptyState-DlMImvgm.js → EmptyState-joNbd4gg.js} +2 -2
- package/dashboard/dist/assets/{EmptyState-DlMImvgm.js.map → EmptyState-joNbd4gg.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-D90kdfw1.js → EscalationsOverview-DpXDnQux.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-D90kdfw1.js.map → EscalationsOverview-DpXDnQux.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-BNxtlgNz.js → EventTable-CYem3v8n.js} +2 -2
- package/dashboard/dist/assets/{EventTable-BNxtlgNz.js.map → EventTable-CYem3v8n.js.map} +1 -1
- package/dashboard/dist/assets/{FilterBar-BTiaAhCx.js → FilterBar-BiO8SOzc.js} +2 -2
- package/dashboard/dist/assets/{FilterBar-BTiaAhCx.js.map → FilterBar-BiO8SOzc.js.map} +1 -1
- package/dashboard/dist/assets/{ListToolbar-BUcagSCn.js → ListToolbar-6yRDh2e9.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar-BUcagSCn.js.map → ListToolbar-6yRDh2e9.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-B-tCvz8C.js → McpOverview-CUgSxkQe.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-B-tCvz8C.js.map → McpOverview-CUgSxkQe.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-DPlF1wYb.js → McpQueryDetailPage-BWbinTM_.js} +2 -2
- package/dashboard/dist/assets/{McpQueryDetailPage-DPlF1wYb.js.map → McpQueryDetailPage-BWbinTM_.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryPage-Bz7AdcfR.js → McpQueryPage-lV6kfDG5.js} +2 -2
- package/dashboard/dist/assets/{McpQueryPage-Bz7AdcfR.js.map → McpQueryPage-lV6kfDG5.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunDetailPage-Di_qpL2V.js → McpRunDetailPage-D6gaxH3_.js} +2 -2
- package/dashboard/dist/assets/{McpRunDetailPage-Di_qpL2V.js.map → McpRunDetailPage-D6gaxH3_.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunsPage-BBgybBEa.js → McpRunsPage-DKvTklh9.js} +2 -2
- package/dashboard/dist/assets/{McpRunsPage-BBgybBEa.js.map → McpRunsPage-DKvTklh9.js.map} +1 -1
- package/dashboard/dist/assets/{Modal-CaJ0gTEa.js → Modal-BuTvD0pz.js} +2 -2
- package/dashboard/dist/assets/{Modal-CaJ0gTEa.js.map → Modal-BuTvD0pz.js.map} +1 -1
- package/dashboard/dist/assets/{OperatorDashboard-DDfMmrmR.js → OperatorDashboard-C9SSV96T.js} +2 -2
- package/dashboard/dist/assets/{OperatorDashboard-DDfMmrmR.js.map → OperatorDashboard-C9SSV96T.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeader-C5D-G5rp.js → PageHeader-BcTVF9ul.js} +2 -2
- package/dashboard/dist/assets/{PageHeader-C5D-G5rp.js.map → PageHeader-BcTVF9ul.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeaderWithStats-DCa2eZh2.js → PageHeaderWithStats-BI7JG5x6.js} +2 -2
- package/dashboard/dist/assets/{PageHeaderWithStats-DCa2eZh2.js.map → PageHeaderWithStats-BI7JG5x6.js.map} +1 -1
- package/dashboard/dist/assets/{PriorityBadge-DTHq6OUZ.js → PriorityBadge-DqVaOU65.js} +2 -2
- package/dashboard/dist/assets/{PriorityBadge-DTHq6OUZ.js.map → PriorityBadge-DqVaOU65.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-fC4dhrd0.js → ProcessDetailPage-hFMhf9qa.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-fC4dhrd0.js.map → ProcessDetailPage-hFMhf9qa.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-CL2MY8uD.js → ProcessesListPage-ByVoBCQ3.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-CL2MY8uD.js.map → ProcessesListPage-ByVoBCQ3.js.map} +1 -1
- package/dashboard/dist/assets/{RolePill-kgKPANly.js → RolePill-D9ZIkYiu.js} +2 -2
- package/dashboard/dist/assets/{RolePill-kgKPANly.js.map → RolePill-D9ZIkYiu.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-Be2lXTHD.js → RolesPage-SMedMuqa.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-Be2lXTHD.js.map → RolesPage-SMedMuqa.js.map} +1 -1
- package/dashboard/dist/assets/{RowActions-DIzJCwqR.js → RowActions-yDhwwDbU.js} +2 -2
- package/dashboard/dist/assets/{RowActions-DIzJCwqR.js.map → RowActions-yDhwwDbU.js.map} +1 -1
- package/dashboard/dist/assets/{StatCard-CRi2Jy6t.js → StatCard-BrBnQFxh.js} +2 -2
- package/dashboard/dist/assets/{StatCard-CRi2Jy6t.js.map → StatCard-BrBnQFxh.js.map} +1 -1
- package/dashboard/dist/assets/{StatusBadge-BETI_8Mr.js → StatusBadge-xgb-lZku.js} +2 -2
- package/dashboard/dist/assets/{StatusBadge-BETI_8Mr.js.map → StatusBadge-xgb-lZku.js.map} +1 -1
- package/dashboard/dist/assets/{StepIndicator-DjpMqCjz.js → StepIndicator-B9ps2SvM.js} +2 -2
- package/dashboard/dist/assets/{StepIndicator-DjpMqCjz.js.map → StepIndicator-B9ps2SvM.js.map} +1 -1
- package/dashboard/dist/assets/{StickyPagination-BZbExQ9t.js → StickyPagination-DTIjBKN3.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-BZbExQ9t.js.map → StickyPagination-DTIjBKN3.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-DZthQyhR.js → SwimlaneTimeline-RK4Yu66z.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-DZthQyhR.js.map → SwimlaneTimeline-RK4Yu66z.js.map} +1 -1
- package/dashboard/dist/assets/{TagInput-CukbOfYn.js → TagInput-CdNUuqk4.js} +2 -2
- package/dashboard/dist/assets/{TagInput-CukbOfYn.js.map → TagInput-CdNUuqk4.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-CIZHIKo9.js → TaskDetailPage-C-nzaNea.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-CIZHIKo9.js.map → TaskDetailPage-C-nzaNea.js.map} +1 -1
- package/dashboard/dist/assets/{TaskQueuePill-Q7DGoysj.js → TaskQueuePill-Lvr2-NzS.js} +2 -2
- package/dashboard/dist/assets/{TaskQueuePill-Q7DGoysj.js.map → TaskQueuePill-Lvr2-NzS.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-CsC9wjb0.js → TasksListPage-DSUmD84y.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-CsC9wjb0.js.map → TasksListPage-DSUmD84y.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-BcOOnJeH.js → TimeAgo-BZdLdrIh.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-BcOOnJeH.js.map → TimeAgo-BZdLdrIh.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-CEMapYDQ.js → TimestampCell-QX_0i5FK.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-CEMapYDQ.js.map → TimestampCell-QX_0i5FK.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-BHoN7iRL.js → UserName-DyZMXcBm.js} +2 -2
- package/dashboard/dist/assets/{UserName-BHoN7iRL.js.map → UserName-DyZMXcBm.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-DawKl1LT.js → WorkflowExecutionPage-DjVxfZaF.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-DawKl1LT.js.map → WorkflowExecutionPage-DjVxfZaF.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowPill-CZqGslD6.js +2 -0
- package/dashboard/dist/assets/WorkflowPill-CZqGslD6.js.map +1 -0
- package/dashboard/dist/assets/WorkflowsDashboard-DZjuiFZ0.js +2 -0
- package/dashboard/dist/assets/WorkflowsDashboard-DZjuiFZ0.js.map +1 -0
- package/dashboard/dist/assets/{WorkflowsOverview-DuhAi_OY.js → WorkflowsOverview-CLnLRpOu.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-DuhAi_OY.js.map → WorkflowsOverview-CLnLRpOu.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowsPage-Dc9xw82a.js → YamlWorkflowsPage-VjdhnLmO.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowsPage-Dc9xw82a.js.map → YamlWorkflowsPage-VjdhnLmO.js.map} +1 -1
- package/dashboard/dist/assets/{bots-Dny-rmmI.js → bots-DIM6lBoY.js} +2 -2
- package/dashboard/dist/assets/{bots-Dny-rmmI.js.map → bots-DIM6lBoY.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-CV0sKNH5.js → escalation-JOTuOqjq.js} +2 -2
- package/dashboard/dist/assets/{escalation-CV0sKNH5.js.map → escalation-JOTuOqjq.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-columns-30CKyoWI.js → escalation-columns-Cyg58nkg.js} +2 -2
- package/dashboard/dist/assets/{escalation-columns-30CKyoWI.js.map → escalation-columns-Cyg58nkg.js.map} +1 -1
- package/dashboard/dist/assets/{helpers-C1-30CzH.js → helpers-B1BDxBZd.js} +2 -2
- package/dashboard/dist/assets/{helpers-C1-30CzH.js.map → helpers-B1BDxBZd.js.map} +1 -1
- package/dashboard/dist/assets/{helpers-C1jaRD-d.js → helpers-BCix9c_m.js} +2 -2
- package/dashboard/dist/assets/{helpers-C1jaRD-d.js.map → helpers-BCix9c_m.js.map} +1 -1
- package/dashboard/dist/assets/{index-D_aJBEAG.js → index-BUK3qR-1.js} +2 -2
- package/dashboard/dist/assets/{index-D_aJBEAG.js.map → index-BUK3qR-1.js.map} +1 -1
- package/dashboard/dist/assets/{index-DnmZbNxk.js → index-BYZX9tOb.js} +5 -5
- package/dashboard/dist/assets/index-BYZX9tOb.js.map +1 -0
- package/dashboard/dist/assets/{index-D-oCWCAS.js → index-BcR6PfpY.js} +2 -2
- package/dashboard/dist/assets/{index-D-oCWCAS.js.map → index-BcR6PfpY.js.map} +1 -1
- package/dashboard/dist/assets/index-BizfauqT.js +6 -0
- package/dashboard/dist/assets/index-BizfauqT.js.map +1 -0
- package/dashboard/dist/assets/{index-CxVB7F4X.js → index-Cf60K3x9.js} +2 -2
- package/dashboard/dist/assets/{index-CxVB7F4X.js.map → index-Cf60K3x9.js.map} +1 -1
- package/dashboard/dist/assets/{index-D0wPM3Ck.js → index-Cg5nfiYX.js} +2 -2
- package/dashboard/dist/assets/{index-D0wPM3Ck.js.map → index-Cg5nfiYX.js.map} +1 -1
- package/dashboard/dist/assets/index-D1wVX50Z.js +15 -0
- package/dashboard/dist/assets/index-D1wVX50Z.js.map +1 -0
- package/dashboard/dist/assets/{index-DHgnkykj.js → index-DDYFpi4l.js} +4 -4
- package/dashboard/dist/assets/index-DDYFpi4l.js.map +1 -0
- package/dashboard/dist/assets/{index-_RBvi7s6.js → index-Di12t56M.js} +2 -2
- package/dashboard/dist/assets/{index-_RBvi7s6.js.map → index-Di12t56M.js.map} +1 -1
- package/dashboard/dist/assets/{index-Dd_U4mLm.js → index-Ds0JoXS2.js} +2 -2
- package/dashboard/dist/assets/{index-Dd_U4mLm.js.map → index-Ds0JoXS2.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-CRFr4L9W.js → mcp-B_xbczAt.js} +2 -2
- package/dashboard/dist/assets/{mcp-CRFr4L9W.js.map → mcp-B_xbczAt.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-DHY2mZBQ.js → mcp-query-B8-P_QoG.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-DHY2mZBQ.js.map → mcp-query-B8-P_QoG.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-runs-BqPHqwAO.js → mcp-runs-CWeZinoF.js} +2 -2
- package/dashboard/dist/assets/{mcp-runs-BqPHqwAO.js.map → mcp-runs-CWeZinoF.js.map} +1 -1
- package/dashboard/dist/assets/{namespaces-TG1aIpo_.js → namespaces-C3WtdO_9.js} +2 -2
- package/dashboard/dist/assets/{namespaces-TG1aIpo_.js.map → namespaces-C3WtdO_9.js.map} +1 -1
- package/dashboard/dist/assets/{roles-DhhLTvXg.js → roles-BDAsPpZG.js} +2 -2
- package/dashboard/dist/assets/{roles-DhhLTvXg.js.map → roles-BDAsPpZG.js.map} +1 -1
- package/dashboard/dist/assets/{settings-D9MBzEeB.js → settings-Ife_UwAp.js} +2 -2
- package/dashboard/dist/assets/{settings-D9MBzEeB.js.map → settings-Ife_UwAp.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-BxmcZoev.js → tasks-BquNDHDI.js} +2 -2
- package/dashboard/dist/assets/{tasks-BxmcZoev.js.map → tasks-BquNDHDI.js.map} +1 -1
- package/dashboard/dist/assets/{useEventHooks-BylecvvI.js → useEventHooks-anv_B2Yy.js} +2 -2
- package/dashboard/dist/assets/{useEventHooks-BylecvvI.js.map → useEventHooks-anv_B2Yy.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-ocmj11e_.js → useYamlActivityEvents-DN-PTgVx.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-ocmj11e_.js.map → useYamlActivityEvents-DN-PTgVx.js.map} +1 -1
- package/dashboard/dist/assets/{users-Ce5r-JAv.js → users-CFcxB4v6.js} +2 -2
- package/dashboard/dist/assets/{users-Ce5r-JAv.js.map → users-CFcxB4v6.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-D1DdudfH.js → vendor-icons-T4r2DSPD.js} +2 -2
- package/dashboard/dist/assets/{vendor-icons-D1DdudfH.js.map → vendor-icons-T4r2DSPD.js.map} +1 -1
- package/dashboard/dist/assets/{workflows-ykIeVbRJ.js → workflows-CeRci9z3.js} +2 -2
- package/dashboard/dist/assets/{workflows-ykIeVbRJ.js.map → workflows-CeRci9z3.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-WypmKYht.js → yaml-workflows-DLwd2BOX.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-WypmKYht.js.map → yaml-workflows-DLwd2BOX.js.map} +1 -1
- package/dashboard/dist/index.html +2 -2
- package/docs/api/http/escalations.md +99 -0
- package/docs/api/http/tasks.md +47 -0
- package/docs/api/sdk/escalations.md +137 -0
- package/docs/api/sdk/tasks.md +40 -1
- package/package.json +1 -1
- package/dashboard/dist/assets/WorkflowPill-CP84Vqeg.js +0 -2
- package/dashboard/dist/assets/WorkflowPill-CP84Vqeg.js.map +0 -1
- package/dashboard/dist/assets/WorkflowsDashboard-QrvVFxtQ.js +0 -2
- package/dashboard/dist/assets/WorkflowsDashboard-QrvVFxtQ.js.map +0 -1
- package/dashboard/dist/assets/index-BUVQ6wmy.js +0 -6
- package/dashboard/dist/assets/index-BUVQ6wmy.js.map +0 -1
- package/dashboard/dist/assets/index-DHgnkykj.js.map +0 -1
- package/dashboard/dist/assets/index-DnmZbNxk.js.map +0 -1
- package/dashboard/dist/assets/index-n7td8zgX.js +0 -17
- package/dashboard/dist/assets/index-n7td8zgX.js.map +0 -1
package/dashboard/dist/assets/{yaml-workflows-WypmKYht.js.map → yaml-workflows-DLwd2BOX.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"yaml-workflows-WypmKYht.js","sources":["../../src/api/yaml-workflows.ts"],"sourcesContent":["import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { apiFetch } from './client';\nimport type { LTYamlWorkflowRecord, LTYamlWorkflowStatus, LTYamlWorkflowVersion } from './types';\n\ninterface YamlWorkflowListResponse {\n workflows: LTYamlWorkflowRecord[];\n total: number;\n}\n\ninterface YamlWorkflowFilters {\n status?: LTYamlWorkflowStatus;\n graph_topic?: string;\n app_id?: string;\n search?: string;\n set_id?: string;\n limit?: number;\n offset?: number;\n}\n\nexport function useYamlWorkflows(filters: YamlWorkflowFilters = {}) {\n const params = new URLSearchParams();\n if (filters.status) params.set('status', filters.status);\n if (filters.graph_topic) params.set('graph_topic', filters.graph_topic);\n if (filters.app_id) params.set('app_id', filters.app_id);\n if (filters.search) params.set('search', filters.search);\n if (filters.set_id) params.set('set_id', filters.set_id);\n if (filters.limit) params.set('limit', String(filters.limit));\n if (filters.offset !== undefined) params.set('offset', String(filters.offset));\n\n return useQuery<YamlWorkflowListResponse>({\n queryKey: ['yamlWorkflows', filters],\n queryFn: () => apiFetch(`/yaml-workflows?${params}`),\n });\n}\n\nexport function useYamlWorkflowAppIds() {\n return useQuery<{ app_ids: string[] }>({\n queryKey: ['yamlWorkflowAppIds'],\n queryFn: () => apiFetch('/yaml-workflows/app-ids'),\n });\n}\n\nexport function useYamlWorkflowByTopic(graphTopic: string | undefined, appId?: string) {\n return useQuery<YamlWorkflowListResponse>({\n queryKey: ['yamlWorkflows', 'byTopic', graphTopic, appId],\n queryFn: () => {\n const params = new URLSearchParams({ graph_topic: graphTopic!, limit: '1' });\n if (appId) params.set('app_id', appId);\n return apiFetch(`/yaml-workflows?${params}`);\n },\n enabled: !!graphTopic,\n });\n}\n\nexport function useYamlWorkflow(id: string) {\n return useQuery<LTYamlWorkflowRecord>({\n queryKey: ['yamlWorkflows', id],\n queryFn: () => apiFetch(`/yaml-workflows/${id}`),\n enabled: !!id,\n });\n}\n\nexport function useCreateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (input: {\n workflow_id: string;\n task_queue: string;\n workflow_name: string;\n name: string;\n description?: string;\n app_id?: string;\n subscribes?: string;\n tags?: string[];\n compilation_feedback?: string;\n }) =>\n apiFetch<LTYamlWorkflowRecord>('/yaml-workflows', {\n method: 'POST',\n body: JSON.stringify(input),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useDeployYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/deploy`, {\n method: 'POST',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useActivateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/activate`, {\n method: 'POST',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useInvokeYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, data, sync, execute_as }: { id: string; data: Record<string, unknown>; sync?: boolean; execute_as?: string }) =>\n apiFetch<{ result?: unknown; job_id?: string }>(`/yaml-workflows/${id}/invoke`, {\n method: 'POST',\n body: JSON.stringify({ data, sync, ...(execute_as ? { execute_as } : {}) }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useRegenerateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, task_queue, compilation_feedback }: { id: string; task_queue?: string; compilation_feedback?: string }) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/regenerate`, {\n method: 'POST',\n body: JSON.stringify({ task_queue, compilation_feedback }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useArchiveYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/archive`, {\n method: 'POST',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useUpdateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, ...updates }: { id: string; yaml_content?: string; name?: string; description?: string; input_schema?: Record<string, unknown>; output_schema?: Record<string, unknown>; tags?: string[]; app_id?: string; graph_topic?: string }) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}`, {\n method: 'PUT',\n body: JSON.stringify(updates),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useDeleteYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<{ deleted: boolean }>(`/yaml-workflows/${id}`, {\n method: 'DELETE',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\n// ── Cron scheduling ─────────────────────────────────────────────\n\nexport function useSetYamlCron() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, cron_schedule, cron_envelope, execute_as }: {\n id: string;\n cron_schedule: string;\n cron_envelope?: Record<string, unknown> | null;\n execute_as?: string | null;\n }) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/cron`, {\n method: 'PUT',\n body: JSON.stringify({ cron_schedule, cron_envelope, execute_as }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useClearYamlCron() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/cron`, {\n method: 'DELETE',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\n// ── Version history ─────────────────────────────────────────────\n\nexport function useYamlWorkflowVersions(id: string) {\n return useQuery<{ versions: LTYamlWorkflowVersion[]; total: number }>({\n queryKey: ['yamlWorkflows', id, 'versions'],\n queryFn: () => apiFetch(`/yaml-workflows/${id}/versions`),\n enabled: !!id,\n });\n}\n\nexport function useYamlWorkflowVersion(id: string, version: number | null) {\n return useQuery<LTYamlWorkflowVersion>({\n queryKey: ['yamlWorkflows', id, 'versions', version],\n queryFn: () => apiFetch(`/yaml-workflows/${id}/versions/${version}`),\n enabled: !!id && version !== null,\n });\n}\n"],"names":["useYamlWorkflows","filters","params","useQuery","apiFetch","useYamlWorkflowAppIds","useYamlWorkflow","id","useCreateYamlWorkflow","queryClient","useQueryClient","useMutation","input","useDeployYamlWorkflow","useActivateYamlWorkflow","useInvokeYamlWorkflow","data","sync","execute_as","useRegenerateYamlWorkflow","task_queue","compilation_feedback","useArchiveYamlWorkflow","useUpdateYamlWorkflow","updates","useDeleteYamlWorkflow","useSetYamlCron","cron_schedule","cron_envelope","useClearYamlCron","useYamlWorkflowVersions","useYamlWorkflowVersion","version"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"yaml-workflows-DLwd2BOX.js","sources":["../../src/api/yaml-workflows.ts"],"sourcesContent":["import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { apiFetch } from './client';\nimport type { LTYamlWorkflowRecord, LTYamlWorkflowStatus, LTYamlWorkflowVersion } from './types';\n\ninterface YamlWorkflowListResponse {\n workflows: LTYamlWorkflowRecord[];\n total: number;\n}\n\ninterface YamlWorkflowFilters {\n status?: LTYamlWorkflowStatus;\n graph_topic?: string;\n app_id?: string;\n search?: string;\n set_id?: string;\n limit?: number;\n offset?: number;\n}\n\nexport function useYamlWorkflows(filters: YamlWorkflowFilters = {}) {\n const params = new URLSearchParams();\n if (filters.status) params.set('status', filters.status);\n if (filters.graph_topic) params.set('graph_topic', filters.graph_topic);\n if (filters.app_id) params.set('app_id', filters.app_id);\n if (filters.search) params.set('search', filters.search);\n if (filters.set_id) params.set('set_id', filters.set_id);\n if (filters.limit) params.set('limit', String(filters.limit));\n if (filters.offset !== undefined) params.set('offset', String(filters.offset));\n\n return useQuery<YamlWorkflowListResponse>({\n queryKey: ['yamlWorkflows', filters],\n queryFn: () => apiFetch(`/yaml-workflows?${params}`),\n });\n}\n\nexport function useYamlWorkflowAppIds() {\n return useQuery<{ app_ids: string[] }>({\n queryKey: ['yamlWorkflowAppIds'],\n queryFn: () => apiFetch('/yaml-workflows/app-ids'),\n });\n}\n\nexport function useYamlWorkflowByTopic(graphTopic: string | undefined, appId?: string) {\n return useQuery<YamlWorkflowListResponse>({\n queryKey: ['yamlWorkflows', 'byTopic', graphTopic, appId],\n queryFn: () => {\n const params = new URLSearchParams({ graph_topic: graphTopic!, limit: '1' });\n if (appId) params.set('app_id', appId);\n return apiFetch(`/yaml-workflows?${params}`);\n },\n enabled: !!graphTopic,\n });\n}\n\nexport function useYamlWorkflow(id: string) {\n return useQuery<LTYamlWorkflowRecord>({\n queryKey: ['yamlWorkflows', id],\n queryFn: () => apiFetch(`/yaml-workflows/${id}`),\n enabled: !!id,\n });\n}\n\nexport function useCreateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (input: {\n workflow_id: string;\n task_queue: string;\n workflow_name: string;\n name: string;\n description?: string;\n app_id?: string;\n subscribes?: string;\n tags?: string[];\n compilation_feedback?: string;\n }) =>\n apiFetch<LTYamlWorkflowRecord>('/yaml-workflows', {\n method: 'POST',\n body: JSON.stringify(input),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useDeployYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/deploy`, {\n method: 'POST',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useActivateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/activate`, {\n method: 'POST',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useInvokeYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, data, sync, execute_as }: { id: string; data: Record<string, unknown>; sync?: boolean; execute_as?: string }) =>\n apiFetch<{ result?: unknown; job_id?: string }>(`/yaml-workflows/${id}/invoke`, {\n method: 'POST',\n body: JSON.stringify({ data, sync, ...(execute_as ? { execute_as } : {}) }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useRegenerateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, task_queue, compilation_feedback }: { id: string; task_queue?: string; compilation_feedback?: string }) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/regenerate`, {\n method: 'POST',\n body: JSON.stringify({ task_queue, compilation_feedback }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useArchiveYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/archive`, {\n method: 'POST',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useUpdateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, ...updates }: { id: string; yaml_content?: string; name?: string; description?: string; input_schema?: Record<string, unknown>; output_schema?: Record<string, unknown>; tags?: string[]; app_id?: string; graph_topic?: string }) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}`, {\n method: 'PUT',\n body: JSON.stringify(updates),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useDeleteYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<{ deleted: boolean }>(`/yaml-workflows/${id}`, {\n method: 'DELETE',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\n// ── Cron scheduling ─────────────────────────────────────────────\n\nexport function useSetYamlCron() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, cron_schedule, cron_envelope, execute_as }: {\n id: string;\n cron_schedule: string;\n cron_envelope?: Record<string, unknown> | null;\n execute_as?: string | null;\n }) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/cron`, {\n method: 'PUT',\n body: JSON.stringify({ cron_schedule, cron_envelope, execute_as }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useClearYamlCron() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/cron`, {\n method: 'DELETE',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\n// ── Version history ─────────────────────────────────────────────\n\nexport function useYamlWorkflowVersions(id: string) {\n return useQuery<{ versions: LTYamlWorkflowVersion[]; total: number }>({\n queryKey: ['yamlWorkflows', id, 'versions'],\n queryFn: () => apiFetch(`/yaml-workflows/${id}/versions`),\n enabled: !!id,\n });\n}\n\nexport function useYamlWorkflowVersion(id: string, version: number | null) {\n return useQuery<LTYamlWorkflowVersion>({\n queryKey: ['yamlWorkflows', id, 'versions', version],\n queryFn: () => apiFetch(`/yaml-workflows/${id}/versions/${version}`),\n enabled: !!id && version !== null,\n });\n}\n"],"names":["useYamlWorkflows","filters","params","useQuery","apiFetch","useYamlWorkflowAppIds","useYamlWorkflow","id","useCreateYamlWorkflow","queryClient","useQueryClient","useMutation","input","useDeployYamlWorkflow","useActivateYamlWorkflow","useInvokeYamlWorkflow","data","sync","execute_as","useRegenerateYamlWorkflow","task_queue","compilation_feedback","useArchiveYamlWorkflow","useUpdateYamlWorkflow","updates","useDeleteYamlWorkflow","useSetYamlCron","cron_schedule","cron_envelope","useClearYamlCron","useYamlWorkflowVersions","useYamlWorkflowVersion","version"],"mappings":"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"}
|
|
@@ -8,10 +8,10 @@
|
|
|
8
8
|
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
9
9
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
10
10
|
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet" />
|
|
11
|
-
<script type="module" crossorigin src="/assets/index-
|
|
11
|
+
<script type="module" crossorigin src="/assets/index-BYZX9tOb.js"></script>
|
|
12
12
|
<link rel="modulepreload" crossorigin href="/assets/vendor-query-DLp59M9_.js">
|
|
13
13
|
<link rel="modulepreload" crossorigin href="/assets/vendor-react-Co3Y8ikm.js">
|
|
14
|
-
<link rel="modulepreload" crossorigin href="/assets/vendor-icons-
|
|
14
|
+
<link rel="modulepreload" crossorigin href="/assets/vendor-icons-T4r2DSPD.js">
|
|
15
15
|
<link rel="stylesheet" crossorigin href="/assets/index-DcIKW-cZ.css">
|
|
16
16
|
</head>
|
|
17
17
|
<body>
|
|
@@ -201,6 +201,20 @@ The new workflow ID follows the pattern `rerun-{escalationId}-{timestamp}`.
|
|
|
201
201
|
|
|
202
202
|
Returned when the escalation has already been resolved.
|
|
203
203
|
|
|
204
|
+
### Signal-based resolution (metadata.signal_id)
|
|
205
|
+
|
|
206
|
+
When an escalation has `metadata.signal_id`, the resolve endpoint signals the running workflow instead of starting a new one. The workflow is still alive — it called `conditionLT(signalId)` and is paused.
|
|
207
|
+
|
|
208
|
+
The resolver payload is augmented with `$escalation_id` before signaling:
|
|
209
|
+
|
|
210
|
+
```json
|
|
211
|
+
{ "approved": true, "notes": "Looks good", "$escalation_id": "esc-a1b2c3d4-..." }
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
The workflow is responsible for resolving the escalation. The `conditionLT()` helper handles this automatically — it strips `$escalation_id`, calls `ltResolveEscalation` as a durable activity, and returns the clean payload.
|
|
215
|
+
|
|
216
|
+
If you use raw `Durable.workflow.condition()` instead, you must resolve the escalation yourself using the `$escalation_id` from the signal data.
|
|
217
|
+
|
|
204
218
|
### What happens during resolution
|
|
205
219
|
|
|
206
220
|
1. The route reads the escalation record and verifies it is still `pending`.
|
|
@@ -209,6 +223,91 @@ Returned when the escalation has already been resolved.
|
|
|
209
223
|
4. It starts a new workflow with the modified envelope on the original task queue.
|
|
210
224
|
5. The LT interceptor detects `envelope.lt.escalationId`, marks the escalation as resolved, and signals the parent orchestrator (if any) that the child workflow has completed.
|
|
211
225
|
|
|
226
|
+
## Resolver form schemas
|
|
227
|
+
|
|
228
|
+
When a reviewer claims an escalation, the dashboard renders a typed form instead of a raw JSON editor — if a schema is available. There are two ways to attach a schema:
|
|
229
|
+
|
|
230
|
+
### Option 1: Workflow config (static)
|
|
231
|
+
|
|
232
|
+
Register a `resolver_schema` in the workflow registry wizard (Step 3, Certification). Every escalation from that workflow type inherits the schema automatically.
|
|
233
|
+
|
|
234
|
+
### Option 2: Escalation metadata (dynamic)
|
|
235
|
+
|
|
236
|
+
Pass `form_schema` inside `metadata` when creating an escalation. This overrides any workflow-level schema and is useful for one-off or dynamically generated forms.
|
|
237
|
+
|
|
238
|
+
```json
|
|
239
|
+
{
|
|
240
|
+
"type": "approval",
|
|
241
|
+
"role": "reviewer",
|
|
242
|
+
"description": "Review deployment to production",
|
|
243
|
+
"metadata": {
|
|
244
|
+
"form_schema": {
|
|
245
|
+
"properties": {
|
|
246
|
+
"approved": {
|
|
247
|
+
"type": "boolean",
|
|
248
|
+
"default": false,
|
|
249
|
+
"description": "Approve this deployment?"
|
|
250
|
+
},
|
|
251
|
+
"environment": {
|
|
252
|
+
"type": "string",
|
|
253
|
+
"enum": ["staging", "production"],
|
|
254
|
+
"description": "Target environment"
|
|
255
|
+
},
|
|
256
|
+
"api_key": {
|
|
257
|
+
"type": "string",
|
|
258
|
+
"format": "password",
|
|
259
|
+
"description": "Deployment API key (stored as ephemeral token)"
|
|
260
|
+
},
|
|
261
|
+
"notes": {
|
|
262
|
+
"type": "string",
|
|
263
|
+
"default": "",
|
|
264
|
+
"description": "Optional reviewer notes"
|
|
265
|
+
},
|
|
266
|
+
"confidence": {
|
|
267
|
+
"type": "number",
|
|
268
|
+
"default": 0,
|
|
269
|
+
"description": "Confidence score (0-1)"
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
### Supported field features
|
|
278
|
+
|
|
279
|
+
| Schema property | Effect |
|
|
280
|
+
|----------------|--------|
|
|
281
|
+
| `type` | Inferred from value at runtime; hints only |
|
|
282
|
+
| `default` | Pre-fills the form field |
|
|
283
|
+
| `description` | Helper text displayed below the field label |
|
|
284
|
+
| `enum` | Renders a dropdown select instead of free text |
|
|
285
|
+
| `format: "password"` | Masks input; value is replaced with a 15-minute ephemeral token on resolution (never stored as plaintext) |
|
|
286
|
+
|
|
287
|
+
### Field type rendering
|
|
288
|
+
|
|
289
|
+
The dashboard infers field types from the default value:
|
|
290
|
+
|
|
291
|
+
| Value type | Renders as |
|
|
292
|
+
|-----------|------------|
|
|
293
|
+
| `boolean` | Checkbox |
|
|
294
|
+
| `number` | Number input |
|
|
295
|
+
| `string` (short) | Text input |
|
|
296
|
+
| `string` (>80 chars) | Textarea |
|
|
297
|
+
| `string` + `enum` | Dropdown select |
|
|
298
|
+
| `string` + `format: "password"` | Password input |
|
|
299
|
+
| `null` | Disabled placeholder |
|
|
300
|
+
| `array` | Read-only tag list |
|
|
301
|
+
| `object` | Nested section with recursive field rendering |
|
|
302
|
+
|
|
303
|
+
### Hidden fields
|
|
304
|
+
|
|
305
|
+
Keys prefixed with `_` (e.g., `_internal_id`) are stored in the payload but hidden from the form UI. The `_form_schema` key is reserved — the dashboard stores the schema itself there for round-trip access during resolution.
|
|
306
|
+
|
|
307
|
+
### Schema priority
|
|
308
|
+
|
|
309
|
+
When both exist, `metadata.form_schema` takes precedence over `resolver_schema` from the workflow config. This lets workflows define a default form while allowing individual escalations to override it.
|
|
310
|
+
|
|
212
311
|
## Release expired claims
|
|
213
312
|
|
|
214
313
|
```
|
package/docs/api/http/tasks.md
CHANGED
|
@@ -2,6 +2,53 @@
|
|
|
2
2
|
|
|
3
3
|
Tasks represent workflow executions tracked by the LT interceptor. A task record is created when a workflow starts and updated when it completes. All endpoints require authentication.
|
|
4
4
|
|
|
5
|
+
## Create task
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
POST /api/tasks
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
**Request body:**
|
|
12
|
+
|
|
13
|
+
| Field | Type | Required | Description |
|
|
14
|
+
|-------|------|----------|-------------|
|
|
15
|
+
| `workflow_id` | `string` | Yes | HotMesh workflow ID |
|
|
16
|
+
| `workflow_type` | `string` | Yes | Registered workflow name |
|
|
17
|
+
| `lt_type` | `string` | Yes | Interceptor classification |
|
|
18
|
+
| `signal_id` | `string` | Yes | HotMesh signal ID for resume/replay |
|
|
19
|
+
| `parent_workflow_id` | `string` | Yes | Orchestrator workflow ID |
|
|
20
|
+
| `task_queue` | `string` | No | Task queue the workflow runs on |
|
|
21
|
+
| `origin_id` | `string` | No | Correlation ID shared by sibling workflows |
|
|
22
|
+
| `parent_id` | `string` | No | Direct parent workflow ID |
|
|
23
|
+
| `envelope` | `string` | No | JSON-serialized input envelope (default: `{}`) |
|
|
24
|
+
| `metadata` | `object` | No | Arbitrary metadata |
|
|
25
|
+
| `priority` | `integer` | No | Numeric priority (default: 2) |
|
|
26
|
+
| `trace_id` | `string` | No | Trace ID for distributed tracing |
|
|
27
|
+
| `span_id` | `string` | No | Span ID for distributed tracing |
|
|
28
|
+
|
|
29
|
+
**Example request:**
|
|
30
|
+
|
|
31
|
+
```json
|
|
32
|
+
{
|
|
33
|
+
"workflow_id": "order-pipeline-abc123",
|
|
34
|
+
"workflow_type": "orderPipeline",
|
|
35
|
+
"lt_type": "workflow",
|
|
36
|
+
"signal_id": "sig-abc123",
|
|
37
|
+
"parent_workflow_id": "order-pipeline-abc123",
|
|
38
|
+
"envelope": "{\"data\":{\"orderId\":\"order-456\"}}"
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
**Response 201:** The created task record.
|
|
43
|
+
|
|
44
|
+
**Response 400:**
|
|
45
|
+
|
|
46
|
+
```json
|
|
47
|
+
{ "error": "workflow_id is required" }
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
5
52
|
## List tasks
|
|
6
53
|
|
|
7
54
|
```
|
|
@@ -2,6 +2,46 @@
|
|
|
2
2
|
|
|
3
3
|
Manage human-in-the-loop escalations -- list, claim, resolve, and bulk-operate on workflow escalations.
|
|
4
4
|
|
|
5
|
+
## create
|
|
6
|
+
|
|
7
|
+
Create an escalation. The caller must hold the target role or be a superadmin.
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
const result = await lt.escalations.create({
|
|
11
|
+
type: 'approval',
|
|
12
|
+
role: 'reviewer',
|
|
13
|
+
description: 'Review deployment to production',
|
|
14
|
+
metadata: {
|
|
15
|
+
form_schema: {
|
|
16
|
+
properties: {
|
|
17
|
+
approved: { type: 'boolean', default: false, description: 'Approve?' },
|
|
18
|
+
environment: { type: 'string', enum: ['staging', 'production'] },
|
|
19
|
+
api_key: { type: 'string', format: 'password', description: 'Deploy key' },
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
**Parameters:**
|
|
27
|
+
|
|
28
|
+
| Field | Type | Required | Description |
|
|
29
|
+
|-------|------|----------|-------------|
|
|
30
|
+
| `type` | `string` | Yes | Escalation category |
|
|
31
|
+
| `role` | `string` | Yes | Target role for the reviewer queue |
|
|
32
|
+
| `subtype` | `string` | No | Subcategory (defaults to `type`) |
|
|
33
|
+
| `description` | `string` | No | Human-readable reason |
|
|
34
|
+
| `priority` | `number` | No | 1 (highest) to 4 (lowest), default: 2 |
|
|
35
|
+
| `envelope` | `string` | No | JSON-serialized workflow envelope |
|
|
36
|
+
| `metadata` | `object` | No | Arbitrary metadata; include `form_schema` for typed resolver forms |
|
|
37
|
+
| `escalation_payload` | `string` | No | JSON context data shown to the reviewer |
|
|
38
|
+
|
|
39
|
+
**Returns:** `LTApiResult<Escalation>` with status 201.
|
|
40
|
+
|
|
41
|
+
**Auth:** Required (RBAC enforced)
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
5
45
|
## list
|
|
6
46
|
|
|
7
47
|
List escalations with optional filters, scoped to the authenticated user's roles.
|
|
@@ -235,6 +275,103 @@ const result = await lt.escalations.resolve({
|
|
|
235
275
|
|
|
236
276
|
---
|
|
237
277
|
|
|
278
|
+
## conditionLT (workflow helper)
|
|
279
|
+
|
|
280
|
+
Wait for a signal and automatically resolve the associated escalation. This is the counterpart to `executeLT` — where `executeLT` wraps `startChild` + `condition`, `conditionLT` wraps `condition` + escalation resolution.
|
|
281
|
+
|
|
282
|
+
```typescript
|
|
283
|
+
import { conditionLT } from '@hotmeshio/long-tail';
|
|
284
|
+
|
|
285
|
+
export async function myWorkflow(envelope: LTEnvelope) {
|
|
286
|
+
const signalId = `approval-${Durable.workflow.workflowId}`;
|
|
287
|
+
|
|
288
|
+
// Create escalation with signal_id in metadata
|
|
289
|
+
await activities.ltCreateEscalation({
|
|
290
|
+
type: 'approval',
|
|
291
|
+
role: 'reviewer',
|
|
292
|
+
workflow_id: Durable.workflow.workflowId,
|
|
293
|
+
workflow_type: 'myWorkflow',
|
|
294
|
+
task_queue: 'my-queue',
|
|
295
|
+
metadata: {
|
|
296
|
+
signal_id: signalId,
|
|
297
|
+
form_schema: {
|
|
298
|
+
properties: {
|
|
299
|
+
approved: { type: 'boolean', default: false },
|
|
300
|
+
notes: { type: 'string', default: '' },
|
|
301
|
+
},
|
|
302
|
+
},
|
|
303
|
+
},
|
|
304
|
+
envelope: JSON.stringify(envelope),
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
// Pause — dashboard signals on resolve
|
|
308
|
+
const decision = await conditionLT<{ approved: boolean; notes: string }>(signalId);
|
|
309
|
+
// decision is clean: { approved: true, notes: "..." }
|
|
310
|
+
// $escalation_id was stripped and the escalation was resolved via durable activity
|
|
311
|
+
}
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
**How it works:**
|
|
315
|
+
|
|
316
|
+
1. The workflow creates an escalation with `metadata.signal_id` pointing to its own signal key
|
|
317
|
+
2. The workflow calls `conditionLT(signalId)` and pauses
|
|
318
|
+
3. A reviewer claims and resolves the escalation in the dashboard
|
|
319
|
+
4. The resolve API injects `$escalation_id` into the payload and signals the workflow
|
|
320
|
+
5. `conditionLT` receives the signal, strips `$escalation_id`, calls `ltResolveEscalation` as a durable activity, and returns the clean payload
|
|
321
|
+
|
|
322
|
+
The escalation resolution happens inside the workflow as a durable activity — crash-safe and transactional within the workflow's execution context.
|
|
323
|
+
|
|
324
|
+
If you use raw `Durable.workflow.condition()` instead, the `$escalation_id` field will be present in the payload and you are responsible for resolving the escalation yourself.
|
|
325
|
+
|
|
326
|
+
---
|
|
327
|
+
|
|
328
|
+
## Resolver form schemas
|
|
329
|
+
|
|
330
|
+
When a reviewer claims an escalation in the dashboard, a typed form is rendered instead of a raw JSON editor — if a schema is available. There are two ways to provide one:
|
|
331
|
+
|
|
332
|
+
**Option 1 — Workflow config (static):** Set `resolver_schema` in the workflow registry wizard (Step 3, Certification). Every escalation from that workflow inherits the schema.
|
|
333
|
+
|
|
334
|
+
**Option 2 — Escalation metadata (dynamic):** Pass `form_schema` inside `metadata` when creating an escalation. This overrides any workflow-level schema.
|
|
335
|
+
|
|
336
|
+
### Schema shape
|
|
337
|
+
|
|
338
|
+
```typescript
|
|
339
|
+
{
|
|
340
|
+
properties: {
|
|
341
|
+
fieldName: {
|
|
342
|
+
type: 'string', // inferred from default value at runtime
|
|
343
|
+
default: 'initial', // pre-fills the form field
|
|
344
|
+
description: 'Helper', // text below the label
|
|
345
|
+
enum: ['a', 'b'], // renders a dropdown select
|
|
346
|
+
format: 'password', // masks input; stored as 15-min ephemeral token
|
|
347
|
+
},
|
|
348
|
+
},
|
|
349
|
+
}
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
### Field rendering by type
|
|
353
|
+
|
|
354
|
+
| Default value | Renders as |
|
|
355
|
+
|--------------|------------|
|
|
356
|
+
| `boolean` | Checkbox |
|
|
357
|
+
| `number` | Number input |
|
|
358
|
+
| `string` (short) | Text input |
|
|
359
|
+
| `string` (>80 chars) | Textarea |
|
|
360
|
+
| `string` + `enum` | Dropdown |
|
|
361
|
+
| `string` + `format: "password"` | Password input (ephemeral token on resolve) |
|
|
362
|
+
| `object` | Nested section with recursive fields |
|
|
363
|
+
| `array` | Read-only tag list |
|
|
364
|
+
|
|
365
|
+
### Hidden fields
|
|
366
|
+
|
|
367
|
+
Keys prefixed with `_` are stored in the payload but hidden from the form. `_form_schema` is reserved for round-trip schema access.
|
|
368
|
+
|
|
369
|
+
### Priority
|
|
370
|
+
|
|
371
|
+
`metadata.form_schema` takes precedence over `resolver_schema` from the workflow config.
|
|
372
|
+
|
|
373
|
+
---
|
|
374
|
+
|
|
238
375
|
## releaseExpired
|
|
239
376
|
|
|
240
377
|
Release all escalation claims past their `assigned_until` deadline.
|
package/docs/api/sdk/tasks.md
CHANGED
|
@@ -1,6 +1,45 @@
|
|
|
1
1
|
# lt.tasks
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Create and query workflow tasks and processes tracked by the Long Tail interceptor.
|
|
4
|
+
|
|
5
|
+
## create
|
|
6
|
+
|
|
7
|
+
Create a new task record.
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
const result = await lt.tasks.create({
|
|
11
|
+
workflow_id: 'order-pipeline-abc123',
|
|
12
|
+
workflow_type: 'orderPipeline',
|
|
13
|
+
lt_type: 'workflow',
|
|
14
|
+
signal_id: 'sig-abc123',
|
|
15
|
+
parent_workflow_id: 'order-pipeline-abc123',
|
|
16
|
+
envelope: '{"data":{"orderId":"order-456"}}',
|
|
17
|
+
});
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
**Parameters:**
|
|
21
|
+
|
|
22
|
+
| Field | Type | Required | Description |
|
|
23
|
+
|-------|------|----------|-------------|
|
|
24
|
+
| `workflow_id` | `string` | Yes | HotMesh workflow ID |
|
|
25
|
+
| `workflow_type` | `string` | Yes | Registered workflow name |
|
|
26
|
+
| `lt_type` | `string` | Yes | Interceptor classification |
|
|
27
|
+
| `signal_id` | `string` | Yes | HotMesh signal ID for resume/replay |
|
|
28
|
+
| `parent_workflow_id` | `string` | Yes | Orchestrator workflow ID |
|
|
29
|
+
| `task_queue` | `string` | No | Task queue the workflow runs on |
|
|
30
|
+
| `origin_id` | `string` | No | Correlation ID shared by sibling workflows |
|
|
31
|
+
| `parent_id` | `string` | No | Direct parent workflow ID |
|
|
32
|
+
| `envelope` | `string` | No | JSON-serialized input envelope (default: `{}`) |
|
|
33
|
+
| `metadata` | `object` | No | Arbitrary metadata |
|
|
34
|
+
| `priority` | `number` | No | Numeric priority (default: 2) |
|
|
35
|
+
| `trace_id` | `string` | No | Trace ID for distributed tracing |
|
|
36
|
+
| `span_id` | `string` | No | Span ID for distributed tracing |
|
|
37
|
+
|
|
38
|
+
**Returns:** `LTApiResult<Task>` with status 201.
|
|
39
|
+
|
|
40
|
+
**Auth:** Required (authenticated user is recorded as `initiated_by`)
|
|
41
|
+
|
|
42
|
+
---
|
|
4
43
|
|
|
5
44
|
## list
|
|
6
45
|
|
package/package.json
CHANGED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as e}from"./index-DnmZbNxk.js";import{e as m,c as p,a1 as d}from"./vendor-icons-D1DdudfH.js";const x={certified:{icon:d,color:"text-status-success"},pipeline:{icon:p,color:"text-purple-400"},durable:{icon:m,color:"text-accent/75"}};function h({type:s,size:o="sm",certified:t,variant:c}){const n=o==="md"?"px-2.5 py-0.5 text-[11px] gap-1.5":"px-2 py-0.5 text-[10px] gap-1",l=o==="md"?"w-3 h-3":"w-2.5 h-2.5",r=c??(t?"certified":"durable"),{icon:i,color:a}=x[r];return e.jsxDEV("span",{className:`inline-flex items-center ${n} font-mono bg-accent/[0.06] text-text-secondary rounded-lg`,children:[e.jsxDEV(i,{className:`${l} shrink-0 ${a}`},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/WorkflowPill.tsx",lineNumber:30,columnNumber:7},this),s]},void 0,!0,{fileName:"/app/dashboard/src/components/common/display/WorkflowPill.tsx",lineNumber:29,columnNumber:5},this)}export{h as W};
|
|
2
|
-
//# sourceMappingURL=WorkflowPill-CP84Vqeg.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"WorkflowPill-CP84Vqeg.js","sources":["../../src/components/common/display/WorkflowPill.tsx"],"sourcesContent":["import { Workflow, ShieldCheck, Wand2 } from 'lucide-react';\n\ntype WorkflowVariant = 'durable' | 'certified' | 'pipeline';\n\ninterface WorkflowPillProps {\n type: string;\n size?: 'sm' | 'md';\n /** @deprecated Use `variant` instead */\n certified?: boolean;\n variant?: WorkflowVariant;\n}\n\nconst VARIANT_CONFIG: Record<WorkflowVariant, { icon: typeof Workflow; color: string }> = {\n certified: { icon: ShieldCheck, color: 'text-status-success' },\n pipeline: { icon: Wand2, color: 'text-purple-400' },\n durable: { icon: Workflow, color: 'text-accent/75' },\n};\n\nexport function WorkflowPill({ type, size = 'sm', certified, variant }: WorkflowPillProps) {\n const sizeClass = size === 'md'\n ? 'px-2.5 py-0.5 text-[11px] gap-1.5'\n : 'px-2 py-0.5 text-[10px] gap-1';\n const iconClass = size === 'md' ? 'w-3 h-3' : 'w-2.5 h-2.5';\n\n const resolved = variant ?? (certified ? 'certified' : 'durable');\n const { icon: Icon, color: iconColor } = VARIANT_CONFIG[resolved];\n\n return (\n <span className={`inline-flex items-center ${sizeClass} font-mono bg-accent/[0.06] text-text-secondary rounded-lg`}>\n <Icon className={`${iconClass} shrink-0 ${iconColor}`} />\n {type}\n </span>\n );\n}\n"],"names":["VARIANT_CONFIG","ShieldCheck","Wand2","Workflow","WorkflowPill","type","size","certified","variant","sizeClass","iconClass","resolved","Icon","iconColor","jsxDEV"],"mappings":"sGAYA,MAAMA,EAAoF,CACxF,UAAW,CAAE,KAAMC,EAAa,MAAO,qBAAA,EACvC,SAAW,CAAE,KAAMC,EAAa,MAAO,iBAAA,EACvC,QAAW,CAAE,KAAMC,EAAc,MAAO,gBAAA,CAC1C,EAEO,SAASC,EAAa,CAAE,KAAAC,EAAM,KAAAC,EAAO,KAAM,UAAAC,EAAW,QAAAC,GAA8B,CACzF,MAAMC,EAAYH,IAAS,KACvB,oCACA,gCACEI,EAAYJ,IAAS,KAAO,UAAY,cAExCK,EAAWH,IAAYD,EAAY,YAAc,WACjD,CAAE,KAAMK,EAAM,MAAOC,CAAA,EAAcb,EAAeW,CAAQ,EAEhE,OACEG,EAAAA,OAAC,OAAA,CAAK,UAAW,4BAA4BL,CAAS,6DACpD,SAAA,CAAAK,EAAAA,OAACF,GAAK,UAAW,GAAGF,CAAS,aAAaG,CAAS,IAAnD,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAuD,EACtDR,CAAA,CAAA,EAFH,OAAA,GAAA,CAAA,SAAA,gEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAGA,CAEJ"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{i as C,j as s}from"./index-DnmZbNxk.js";import{a as m}from"./vendor-query-DLp59M9_.js";import{T as w}from"./TimestampCell-CEMapYDQ.js";import{E as _}from"./ElapsedCell-BgnA0qpS.js";import{u as $,b as T}from"./workflows-ykIeVbRJ.js";import{b as P}from"./useEventHooks-BylecvvI.js";import{u as F}from"./useFilterParams-BUyLHcx_.js";import{D as R}from"./DataTable-DyIXg-tQ.js";import{W as z}from"./WorkflowPill-CP84Vqeg.js";import{P as A}from"./PageHeader-C5D-G5rp.js";import{F as L,b}from"./FilterBar-BTiaAhCx.js";import{S as I}from"./StickyPagination-BZbExQ9t.js";import{L as M}from"./ListToolbar-BUcagSCn.js";import{R as U,a as N}from"./RowActions-DIzJCwqR.js";import{n as O,S as B}from"./vendor-icons-D1DdudfH.js";import{c as G}from"./vendor-react-Co3Y8ikm.js";import"./EmptyState-DlMImvgm.js";const H={running:"in_progress",completed:"completed",failed:"failed"},J={in_progress:"bg-status-active",completed:"bg-status-success",failed:"bg-status-error"},q={running:"text-status-active",completed:"text-status-success",failed:"text-status-error"};function K(f,i,c,o,r){return[{key:"workflow_id",label:"Workflow ID / Type",render:e=>{const t=J[H[e.status]??e.status]??"bg-status-pending",p=e.status==="running"?" animate-pulse":"";return s.jsxDEV("div",{className:"flex items-start gap-2 min-w-0",children:[s.jsxDEV("span",{className:`w-[9px] h-[9px] shrink-0 rounded-full mt-1 ${t}${p}`,title:e.status},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsDashboard.tsx",lineNumber:55,columnNumber:13},this),s.jsxDEV("div",{className:"min-w-0",children:[s.jsxDEV("span",{className:"font-mono text-xs text-text-primary truncate block",children:e.workflow_id},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsDashboard.tsx",lineNumber:57,columnNumber:15},this),s.jsxDEV("div",{className:"mt-0.5",children:s.jsxDEV(z,{type:e.entity,certified:r.has(e.entity)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsDashboard.tsx",lineNumber:61,columnNumber:17},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsDashboard.tsx",lineNumber:60,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsDashboard.tsx",lineNumber:56,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsDashboard.tsx",lineNumber:54,columnNumber:11},this)}},{key:"created_at",label:"Created",render:e=>s.jsxDEV(w,{date:e.created_at},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsDashboard.tsx",lineNumber:71,columnNumber:24},this),className:"w-40",sortable:!0},{key:"updated_at",label:"Updated",render:e=>s.jsxDEV(w,{date:e.updated_at},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsDashboard.tsx",lineNumber:78,columnNumber:24},this),className:"w-40",sortable:!0},{key:"duration",label:"Duration",render:e=>s.jsxDEV(_,{startDate:e.created_at,endDate:e.status==="running"?null:e.updated_at,isLive:e.status==="running"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsDashboard.tsx",lineNumber:86,columnNumber:9},this),className:"w-28"},{key:"actions",label:"",render:e=>s.jsxDEV(U,{children:[s.jsxDEV(N,{icon:O,title:`Filter by ${e.entity}`,onClick:()=>f(e.entity)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsDashboard.tsx",lineNumber:99,columnNumber:11},this),s.jsxDEV("button",{onClick:t=>{t.stopPropagation(),i(e.status)},className:"opacity-0 group-hover/row:opacity-100 transition-opacity",title:`Filter by ${e.status}`,children:s.jsxDEV("svg",{className:`w-[18px] h-[18px] ${q[e.status]??"text-text-tertiary"} hover:opacity-70`,viewBox:"0 0 24 24",fill:"currentColor",children:s.jsxDEV("circle",{cx:"12",cy:"12",r:"6"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsDashboard.tsx",lineNumber:110,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsDashboard.tsx",lineNumber:109,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsDashboard.tsx",lineNumber:104,columnNumber:11},this),c&&s.jsxDEV(N,{icon:B,title:"View config",onClick:()=>o(`/workflows/registry/${encodeURIComponent(e.entity)}`)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsDashboard.tsx",lineNumber:114,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsDashboard.tsx",lineNumber:98,columnNumber:9},this),className:"w-24 text-right"}]}function ce({tier:f="all"}){P();const i=G(),{isSuperAdmin:c}=C(),{filters:o,setFilter:r,pagination:e,sort:t,setSort:p}=F({filters:{search:"",entity:"",status:"",tier:f}}),n=o.tier||"all",k=n==="certified"?"true":n==="durable"?"false":void 0,{data:u}=$(),x=m.useMemo(()=>new Set((u??[]).map(a=>a.workflow_type)),[u]),g=K(a=>r("entity",a),a=>r("status",a),c,i,x),[d,D]=m.useState(o.search);m.useEffect(()=>{if(d===o.search)return;const a=setTimeout(()=>r("search",d),300);return()=>clearTimeout(a)},[d,r,o.search]);const{data:l,isLoading:v,refetch:y,isFetching:E}=T({limit:e.pageSize,offset:e.offset,entity:o.entity||void 0,search:o.search||void 0,status:o.status||void 0,sort_by:t.sort_by||void 0,order:t.sort_by?t.order:void 0,registered:k}),h=(l==null?void 0:l.total)??0,W=(l==null?void 0:l.jobs)??[],j=m.useMemo(()=>[...new Set((u??[]).map(a=>a.workflow_type))].sort(),[u]),S="Durable Executions",V=n==="certified"?"No certified workflow executions found":n==="durable"?"No durable workflow executions found":"No workflow executions found";return s.jsxDEV("div",{children:[s.jsxDEV(A,{title:S},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsDashboard.tsx",lineNumber:193,columnNumber:7},this),s.jsxDEV(L,{actions:s.jsxDEV(M,{onRefresh:()=>y(),isFetching:E,apiPath:`/workflow-states/jobs?limit=${e.pageSize}&offset=${e.offset}${o.entity?`&entity=${o.entity}`:""}${o.search?`&search=${o.search}`:""}${o.status?`&status=${o.status}`:""}${t.sort_by?`&sort_by=${t.sort_by}&order=${t.order}`:""}`},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsDashboard.tsx",lineNumber:196,columnNumber:9},this),children:[s.jsxDEV("input",{type:"text",placeholder:"Search workflow ID...",value:d,onChange:a=>D(a.target.value),className:"input text-[11px] py-1 px-2 w-56"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsDashboard.tsx",lineNumber:202,columnNumber:9},this),s.jsxDEV(b,{label:"Type",value:o.entity,onChange:a=>r("entity",a),options:j.map(a=>({value:a,label:a}))},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsDashboard.tsx",lineNumber:209,columnNumber:9},this),s.jsxDEV(b,{label:"Status",value:o.status,onChange:a=>r("status",a),options:[{value:"running",label:"Running"},{value:"completed",label:"Completed"},{value:"failed",label:"Failed"}]},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsDashboard.tsx",lineNumber:215,columnNumber:9},this),s.jsxDEV(b,{label:"Tier",value:o.tier==="all"?"":o.tier,onChange:a=>r("tier",a||"all"),options:[{value:"certified",label:"Certified"},{value:"durable",label:"Durable"}]},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsDashboard.tsx",lineNumber:225,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsDashboard.tsx",lineNumber:195,columnNumber:7},this),s.jsxDEV(R,{columns:g,data:W,keyFn:a=>a.workflow_id,onRowClick:a=>i(`/workflows/executions/${a.workflow_id}`),isLoading:v,emptyMessage:V,sort:t,onSort:p},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsDashboard.tsx",lineNumber:236,columnNumber:7},this),s.jsxDEV(I,{page:e.page,totalPages:e.totalPages(h),onPageChange:e.setPage,total:h,pageSize:e.pageSize,onPageSizeChange:e.setPageSize},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsDashboard.tsx",lineNumber:247,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsDashboard.tsx",lineNumber:192,columnNumber:5},this)}export{ce as WorkflowsDashboard};
|
|
2
|
-
//# sourceMappingURL=WorkflowsDashboard-QrvVFxtQ.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"WorkflowsDashboard-QrvVFxtQ.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 { TimestampCell } from '../../components/common/display/TimestampCell';\nimport { ElapsedCell } from '../../components/common/display/ElapsedCell';\nimport { useJobs, useWorkflowConfigs } from '../../api/workflows';\nimport { useAuth } from '../../hooks/useAuth';\nimport { useWorkflowListEvents } from '../../hooks/useEventHooks';\nimport { useFilterParams } from '../../hooks/useFilterParams';\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 } 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 } 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 certifiedTypes: Set<string>,\n): Column<LTJob>[] {\n return [\n {\n key: 'workflow_id',\n label: 'Workflow ID / Type',\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-start gap-2 min-w-0\">\n <span className={`w-[9px] h-[9px] shrink-0 rounded-full mt-1 ${dotClass}${pulseClass}`} title={row.status} />\n <div className=\"min-w-0\">\n <span className=\"font-mono text-xs text-text-primary truncate block\">\n {row.workflow_id}\n </span>\n <div className=\"mt-0.5\">\n <WorkflowPill type={row.entity} certified={certifiedTypes.has(row.entity)} />\n </div>\n </div>\n </div>\n );\n },\n },\n {\n key: 'created_at',\n label: 'Created',\n render: (row) => <TimestampCell date={row.created_at} />,\n className: 'w-40',\n sortable: true,\n },\n {\n key: 'updated_at',\n label: 'Updated',\n render: (row) => <TimestampCell date={row.updated_at} />,\n className: 'w-40',\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=\"currentColor\">\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\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\n const certifiedTypes = useMemo(\n () => new Set((configs ?? []).map((c) => c.workflow_type)),\n [configs],\n );\n\n const columns = buildColumns(\n (entity) => setFilter('entity', entity),\n (status) => setFilter('status', status),\n isSuperAdmin,\n navigate,\n certifiedTypes,\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 || undefined,\n order: sort.sort_by ? sort.order : undefined,\n registered: registeredFilter,\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 = 'Durable 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} />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/workflow-states/jobs?limit=${pagination.pageSize}&offset=${pagination.offset}${filters.entity ? `&entity=${filters.entity}` : ''}${filters.search ? `&search=${filters.search}` : ''}${filters.status ? `&status=${filters.status}` : ''}${sort.sort_by ? `&sort_by=${sort.sort_by}&order=${sort.order}` : ''}`}\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-[11px] py-1 px-2 w-56\"\n />\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 <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 <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","certifiedTypes","row","dotClass","pulseClass","jsxDEV","WorkflowPill","TimestampCell","ElapsedCell","RowActionGroup","RowAction","Filter","e","Settings","WorkflowsDashboard","initialTier","useWorkflowListEvents","useNavigate","useAuth","filters","setFilter","pagination","sort","setSort","useFilterParams","activeTier","registeredFilter","configs","useWorkflowConfigs","useMemo","c","columns","entity","status","searchInput","setSearchInput","useState","useEffect","timer","jobsData","isLoading","refetch","isFetching","useJobs","total","jobs","entities","pageTitle","emptyMessage","PageHeader","FilterBar","ListToolbar","FilterSelect","v","DataTable","StickyPagination"],"mappings":"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"}
|