@hotmeshio/long-tail 0.5.11 → 0.6.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.
- package/README.md +1 -0
- package/build/api/diagnostics.d.ts +5 -0
- package/build/api/diagnostics.js +5 -1
- package/build/api/escalations/bulk.js +9 -1
- package/build/api/escalations/cancel.js +5 -7
- package/build/api/escalations/claim.js +18 -15
- package/build/api/escalations/create.d.ts +6 -0
- package/build/api/escalations/create.js +11 -8
- package/build/api/escalations/facets.d.ts +18 -0
- package/build/api/escalations/facets.js +115 -0
- package/build/api/escalations/helpers.d.ts +70 -1
- package/build/api/escalations/helpers.js +101 -7
- package/build/api/escalations/index.d.ts +3 -2
- package/build/api/escalations/index.js +7 -1
- package/build/api/escalations/list.d.ts +23 -2
- package/build/api/escalations/list.js +111 -10
- package/build/api/escalations/metadata.js +22 -27
- package/build/api/escalations/resolve.d.ts +19 -1
- package/build/api/escalations/resolve.js +111 -26
- package/build/api/escalations/single.js +8 -8
- package/build/api/settings.d.ts +1 -1
- package/build/api/settings.js +3 -1
- package/build/api/users.d.ts +6 -0
- package/build/api/users.js +29 -1
- package/build/api/workflows/invocation.d.ts +6 -0
- package/build/api/workflows/invocation.js +6 -2
- package/build/bin/ltc.js +40 -0
- package/build/lib/cli/commands/escalations.d.ts +36 -0
- package/build/lib/cli/commands/escalations.js +98 -0
- package/build/lib/db/schemas/001_schema.sql +10 -5
- package/build/lib/db/schemas/012_lt_tasks_workflow_id_unique.sql +20 -0
- package/build/lib/db/schemas/013_role_scope.sql +37 -0
- package/build/modules/features.d.ts +19 -0
- package/build/modules/features.js +16 -0
- package/build/modules/version.d.ts +10 -5
- package/build/modules/version.js +27 -11
- package/build/routes/diagnostics.js +15 -2
- package/build/routes/escalations/facets.d.ts +7 -0
- package/build/routes/escalations/facets.js +81 -0
- package/build/routes/escalations/index.js +3 -0
- package/build/routes/escalations/list.js +48 -0
- package/build/routes/escalations/resolve.js +22 -4
- package/build/routes/users.js +9 -5
- package/build/routes/workflows/invocation.js +12 -4
- package/build/sdk/index.d.ts +35 -2
- package/build/sdk/index.js +7 -0
- package/build/services/diagnostics/index.d.ts +40 -6
- package/build/services/diagnostics/index.js +54 -5
- package/build/services/escalation/crud.d.ts +56 -6
- package/build/services/escalation/crud.js +102 -31
- package/build/services/escalation/facet-sql.d.ts +18 -0
- package/build/services/escalation/facet-sql.js +118 -0
- package/build/services/escalation/facets.d.ts +45 -0
- package/build/services/escalation/facets.js +218 -0
- package/build/services/escalation/index.d.ts +1 -0
- package/build/services/escalation/index.js +8 -1
- package/build/services/escalation/queries.d.ts +47 -0
- package/build/services/escalation/queries.js +185 -2
- package/build/services/escalation/sql.d.ts +15 -2
- package/build/services/escalation/sql.js +80 -3
- package/build/services/interceptor/activities/escalation.d.ts +2 -0
- package/build/services/interceptor/activities/escalation.js +1 -1
- package/build/services/interceptor/lifecycle.js +4 -0
- package/build/services/mcp/server-tools.js +10 -4
- package/build/services/orchestrator/condition.js +6 -2
- package/build/services/role/index.js +2 -3
- package/build/services/role/sql.d.ts +8 -0
- package/build/services/role/sql.js +17 -1
- package/build/services/task/crud.js +22 -14
- package/build/services/task/process.js +3 -21
- package/build/services/task/resolve.d.ts +5 -3
- package/build/services/task/resolve.js +9 -6
- package/build/services/task/sql.d.ts +30 -2
- package/build/services/task/sql.js +72 -2
- package/build/services/user/crud.d.ts +1 -0
- package/build/services/user/crud.js +29 -11
- package/build/services/user/index.d.ts +2 -1
- package/build/services/user/index.js +12 -1
- package/build/services/user/rbac.d.ts +18 -0
- package/build/services/user/rbac.js +27 -0
- package/build/services/user/roles.d.ts +7 -2
- package/build/services/user/roles.js +21 -5
- package/build/services/user/scope.d.ts +22 -0
- package/build/services/user/scope.js +50 -0
- package/build/services/user/seed-admin.js +34 -17
- package/build/services/user/sql.d.ts +18 -7
- package/build/services/user/sql.js +38 -13
- package/build/services/user/sso-provision.js +41 -24
- package/build/services/user/types.d.ts +9 -5
- package/build/start/adapters.js +3 -0
- package/build/system/mcp-servers/admin/diagnostics.d.ts +5 -4
- package/build/system/mcp-servers/admin/diagnostics.js +12 -10
- package/build/system/mcp-servers/admin/escalations.d.ts +6 -0
- package/build/system/mcp-servers/admin/escalations.js +247 -54
- package/build/system/mcp-servers/admin/index.js +3 -3
- package/build/system/mcp-servers/admin/schemas.d.ts +417 -3
- package/build/system/mcp-servers/admin/schemas.js +101 -5
- package/build/system/mcp-servers/admin/users.js +28 -2
- package/build/system/mcp-servers/admin/workflows.js +23 -12
- package/build/system/seed/tool-manifests-admin.d.ts +1324 -562
- package/build/system/seed/tool-manifests-admin.js +10 -2
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/envelope.d.ts +7 -0
- package/build/types/facets.d.ts +60 -0
- package/build/types/facets.js +10 -0
- package/build/types/index.d.ts +2 -1
- package/build/types/startup.d.ts +9 -0
- package/build/types/user.d.ts +11 -0
- package/dashboard/dist/assets/AdminDashboard-2CZ8py9X.js +2 -0
- package/dashboard/dist/assets/{AdminDashboard-DZpduYdW.js.map → AdminDashboard-2CZ8py9X.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-SFnHMIP6.js → AgentConfigPage-D68sodgo.js} +7 -7
- package/dashboard/dist/assets/{AgentConfigPage-SFnHMIP6.js.map → AgentConfigPage-D68sodgo.js.map} +1 -1
- package/dashboard/dist/assets/AgentDetailPage-BmhuWbKi.js +4 -0
- package/dashboard/dist/assets/AgentDetailPage-BmhuWbKi.js.map +1 -0
- package/dashboard/dist/assets/AgentsPage-C4SKQVeU.js +2 -0
- package/dashboard/dist/assets/AgentsPage-C4SKQVeU.js.map +1 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-9RBEYwkt.js +2 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-9RBEYwkt.js.map +1 -0
- package/dashboard/dist/assets/{BotPicker-Dse2jW4b.js → BotPicker-D-FvXJOM.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-Dse2jW4b.js.map → BotPicker-D-FvXJOM.js.map} +1 -1
- package/dashboard/dist/assets/CapabilitiesPage-ByDf6WJr.js +2 -0
- package/dashboard/dist/assets/{CapabilitiesPage-DTfKCzBQ.js.map → CapabilitiesPage-ByDf6WJr.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-8vf38J6K.js → CollapsibleSection-BjGNYEvh.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-8vf38J6K.js.map → CollapsibleSection-BjGNYEvh.js.map} +1 -1
- package/dashboard/dist/assets/CopyableId-blg-gZvT.js +2 -0
- package/dashboard/dist/assets/CopyableId-blg-gZvT.js.map +1 -0
- package/dashboard/dist/assets/{CredentialsPage-7C4M-hrH.js → CredentialsPage-DvCA-wQN.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-7C4M-hrH.js.map → CredentialsPage-DvCA-wQN.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-DrGWtaSY.js → CronLabel-DBMurd_c.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-DrGWtaSY.js.map → CronLabel-DBMurd_c.js.map} +1 -1
- package/dashboard/dist/assets/{CustomDurationPicker-Vcmr4LiR.js → CustomDurationPicker-DHflFoEa.js} +2 -2
- package/dashboard/dist/assets/{CustomDurationPicker-Vcmr4LiR.js.map → CustomDurationPicker-DHflFoEa.js.map} +1 -1
- package/dashboard/dist/assets/{DropZone-Dwpgbueb.js → DropZone-CUtdp99Z.js} +2 -2
- package/dashboard/dist/assets/{DropZone-Dwpgbueb.js.map → DropZone-CUtdp99Z.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-BNexhR5d.js → ElapsedCell-CSjcVOpo.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-BNexhR5d.js.map → ElapsedCell-CSjcVOpo.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-BI3DEwYP.js → EscalationsOverview-BUqRNJbK.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-BI3DEwYP.js.map → EscalationsOverview-BUqRNJbK.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-CwvX_L9t.js → EventTable-Chz-6XPE.js} +2 -2
- package/dashboard/dist/assets/{EventTable-CwvX_L9t.js.map → EventTable-Chz-6XPE.js.map} +1 -1
- package/dashboard/dist/assets/{GraphInvokePage-C-3b8WK0.js → GraphInvokePage-BXdgciWg.js} +2 -2
- package/dashboard/dist/assets/{GraphInvokePage-C-3b8WK0.js.map → GraphInvokePage-BXdgciWg.js.map} +1 -1
- package/dashboard/dist/assets/{HomePage-BS_-jcHr.js → HomePage-CEMxnk0r.js} +2 -2
- package/dashboard/dist/assets/{HomePage-BS_-jcHr.js.map → HomePage-CEMxnk0r.js.map} +1 -1
- package/dashboard/dist/assets/{ListToolbar-BH9rwQVE.js → ListToolbar-_73JCdbB.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar-BH9rwQVE.js.map → ListToolbar-_73JCdbB.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-C9iOdE7E.js → McpOverview-DfdqxhSz.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-C9iOdE7E.js.map → McpOverview-DfdqxhSz.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-DMN-yqvJ.js → McpQueryDetailPage-DPAljieY.js} +2 -2
- package/dashboard/dist/assets/{McpQueryDetailPage-DMN-yqvJ.js.map → McpQueryDetailPage-DPAljieY.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryPage-D5cSziYS.js +2 -0
- package/dashboard/dist/assets/McpQueryPage-D5cSziYS.js.map +1 -0
- package/dashboard/dist/assets/{McpRunDetailPage-Wb47sRvo.js → McpRunDetailPage-DwNb9wZg.js} +2 -2
- package/dashboard/dist/assets/{McpRunDetailPage-Wb47sRvo.js.map → McpRunDetailPage-DwNb9wZg.js.map} +1 -1
- package/dashboard/dist/assets/McpRunsPage-O5H6yStl.js +2 -0
- package/dashboard/dist/assets/McpRunsPage-O5H6yStl.js.map +1 -0
- package/dashboard/dist/assets/{NamespacePill-DnJl4Lre.js → NamespacePill-uW-xOedj.js} +2 -2
- package/dashboard/dist/assets/{NamespacePill-DnJl4Lre.js.map → NamespacePill-uW-xOedj.js.map} +1 -1
- package/dashboard/dist/assets/OperatorDashboard-DYw9Ekv5.js +2 -0
- package/dashboard/dist/assets/OperatorDashboard-DYw9Ekv5.js.map +1 -0
- package/dashboard/dist/assets/PageHeader-DVOZjBfL.js +2 -0
- package/dashboard/dist/assets/PageHeader-DVOZjBfL.js.map +1 -0
- package/dashboard/dist/assets/{PageHeaderWithStats-BuKc9MKt.js → PageHeaderWithStats-DtTpDHOd.js} +2 -2
- package/dashboard/dist/assets/{PageHeaderWithStats-BuKc9MKt.js.map → PageHeaderWithStats-DtTpDHOd.js.map} +1 -1
- package/dashboard/dist/assets/PriorityBadge-B4ykBH7f.js +2 -0
- package/dashboard/dist/assets/PriorityBadge-B4ykBH7f.js.map +1 -0
- package/dashboard/dist/assets/{ProcessDetailPage-CvPx-h8y.js → ProcessDetailPage-B0Dokcx9.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-CvPx-h8y.js.map → ProcessDetailPage-B0Dokcx9.js.map} +1 -1
- package/dashboard/dist/assets/ProcessesListPage-Cc87WIjL.js +2 -0
- package/dashboard/dist/assets/ProcessesListPage-Cc87WIjL.js.map +1 -0
- package/dashboard/dist/assets/RolePill-BaW-30TC.js +2 -0
- package/dashboard/dist/assets/RolePill-BaW-30TC.js.map +1 -0
- package/dashboard/dist/assets/{RolesPage-W5ZjOHpg.js → RolesPage-cp6PiF08.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-W5ZjOHpg.js.map → RolesPage-cp6PiF08.js.map} +1 -1
- package/dashboard/dist/assets/RowActions-BA9L9djf.js +2 -0
- package/dashboard/dist/assets/RowActions-BA9L9djf.js.map +1 -0
- package/dashboard/dist/assets/{RunAsSelector-CvxGTNGT.js → RunAsSelector-2LWkjSnO.js} +2 -2
- package/dashboard/dist/assets/{RunAsSelector-CvxGTNGT.js.map → RunAsSelector-2LWkjSnO.js.map} +1 -1
- package/dashboard/dist/assets/{StickyPagination-BWhFSr2d.js → StickyPagination-BQEm--kI.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-BWhFSr2d.js.map → StickyPagination-BQEm--kI.js.map} +1 -1
- package/dashboard/dist/assets/StreamMessageDetail-BTtw3GjX.js +2 -0
- package/dashboard/dist/assets/{StreamMessageDetail-BF0tM0cd.js.map → StreamMessageDetail-BTtw3GjX.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-Bv-KHY9s.js → SwimlaneTimeline-DdXxP4fO.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-Bv-KHY9s.js.map → SwimlaneTimeline-DdXxP4fO.js.map} +1 -1
- package/dashboard/dist/assets/{TagInput-B00uqhjX.js → TagInput-x9XTuqMb.js} +2 -2
- package/dashboard/dist/assets/{TagInput-B00uqhjX.js.map → TagInput-x9XTuqMb.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-Bzb_fuLy.js → TaskDetailPage-B8veYG4X.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-Bzb_fuLy.js.map → TaskDetailPage-B8veYG4X.js.map} +1 -1
- package/dashboard/dist/assets/{TaskQueuePill-CUsofm0X.js → TaskQueuePill-DSEQZ-HT.js} +2 -2
- package/dashboard/dist/assets/{TaskQueuePill-CUsofm0X.js.map → TaskQueuePill-DSEQZ-HT.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-CBezWaZL.js → TasksListPage-CsN1gZj5.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-CBezWaZL.js.map → TasksListPage-CsN1gZj5.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-CKHfTzat.js → TimeAgo-n182EcLx.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-CKHfTzat.js.map → TimeAgo-n182EcLx.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-Dsje8GH-.js → TimestampCell-2dlcQAfX.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-Dsje8GH-.js.map → TimestampCell-2dlcQAfX.js.map} +1 -1
- package/dashboard/dist/assets/{ToolPill-DjvedZSn.js → ToolPill-B_e4eT77.js} +2 -2
- package/dashboard/dist/assets/{ToolPill-DjvedZSn.js.map → ToolPill-B_e4eT77.js.map} +1 -1
- package/dashboard/dist/assets/{ToolTestPanel-3OcG18e5.js → ToolTestPanel-Bhnncc6M.js} +2 -2
- package/dashboard/dist/assets/{ToolTestPanel-3OcG18e5.js.map → ToolTestPanel-Bhnncc6M.js.map} +1 -1
- package/dashboard/dist/assets/{TopicDetailPage-DCtv91hH.js → TopicDetailPage-29lsNsqI.js} +3 -3
- package/dashboard/dist/assets/{TopicDetailPage-DCtv91hH.js.map → TopicDetailPage-29lsNsqI.js.map} +1 -1
- package/dashboard/dist/assets/{TopicsPage-DVGSNc_E.js → TopicsPage-KJ7_LAvo.js} +2 -2
- package/dashboard/dist/assets/{TopicsPage-DVGSNc_E.js.map → TopicsPage-KJ7_LAvo.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-xHAgkk8M.js → UserName-CMoFi9zb.js} +2 -2
- package/dashboard/dist/assets/{UserName-xHAgkk8M.js.map → UserName-CMoFi9zb.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-CWNxsS8a.js → WorkflowExecutionPage-Cymfx-Bp.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-CWNxsS8a.js.map → WorkflowExecutionPage-Cymfx-Bp.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowPill-F1oKUzmc.js → WorkflowPill-B66_AnaY.js} +2 -2
- package/dashboard/dist/assets/{WorkflowPill-F1oKUzmc.js.map → WorkflowPill-B66_AnaY.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowsDashboard-CqLN8spd.js +2 -0
- package/dashboard/dist/assets/WorkflowsDashboard-CqLN8spd.js.map +1 -0
- package/dashboard/dist/assets/{WorkflowsOverview-e7jWSj_n.js → WorkflowsOverview-0Rc2WT6q.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-e7jWSj_n.js.map → WorkflowsOverview-0Rc2WT6q.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-CdAeam76.js → YamlWorkflowDetailPage-CARQ7_LN.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-CdAeam76.js.map → YamlWorkflowDetailPage-CARQ7_LN.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowsPage-S_gKs2Di.js → YamlWorkflowsPage-B-7sz1nf.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowsPage-S_gKs2Di.js.map → YamlWorkflowsPage-B-7sz1nf.js.map} +1 -1
- package/dashboard/dist/assets/{agents-JE4aL07D.js → agents-zM43d5Yf.js} +2 -2
- package/dashboard/dist/assets/{agents-JE4aL07D.js.map → agents-zM43d5Yf.js.map} +1 -1
- package/dashboard/dist/assets/api-path-u2Jf9QXS.js +2 -0
- package/dashboard/dist/assets/api-path-u2Jf9QXS.js.map +1 -0
- package/dashboard/dist/assets/{bots-cAzKkDtQ.js → bots-D5BasOGz.js} +2 -2
- package/dashboard/dist/assets/{bots-cAzKkDtQ.js.map → bots-D5BasOGz.js.map} +1 -1
- package/dashboard/dist/assets/{capabilities-RBFXLAXF.js → capabilities-BT3PW9CZ.js} +2 -2
- package/dashboard/dist/assets/{capabilities-RBFXLAXF.js.map → capabilities-BT3PW9CZ.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-DGhv3rwI.js → controlplane-NpJr49rN.js} +2 -2
- package/dashboard/dist/assets/{controlplane-DGhv3rwI.js.map → controlplane-NpJr49rN.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-ne7dIaPa.js → escalation-DrzQolPG.js} +2 -2
- package/dashboard/dist/assets/{escalation-ne7dIaPa.js.map → escalation-DrzQolPG.js.map} +1 -1
- package/dashboard/dist/assets/escalation-columns-QzwmtD60.js +2 -0
- package/dashboard/dist/assets/escalation-columns-QzwmtD60.js.map +1 -0
- package/dashboard/dist/assets/index-B5w4Gjyk.js +6 -0
- package/dashboard/dist/assets/index-B5w4Gjyk.js.map +1 -0
- package/dashboard/dist/assets/{index-CByjpYlU.js → index-BCT4kqGR.js} +2 -2
- package/dashboard/dist/assets/{index-CByjpYlU.js.map → index-BCT4kqGR.js.map} +1 -1
- package/dashboard/dist/assets/{index-CgyucK0e.js → index-C69XvBfg.js} +2 -2
- package/dashboard/dist/assets/{index-CgyucK0e.js.map → index-C69XvBfg.js.map} +1 -1
- package/dashboard/dist/assets/index-CHw4Fl0t.css +1 -0
- package/dashboard/dist/assets/index-C_NwHTMh.js +2 -0
- package/dashboard/dist/assets/index-C_NwHTMh.js.map +1 -0
- package/dashboard/dist/assets/{index-DgzgRTNg.js → index-Cq0trGqf.js} +2 -2
- package/dashboard/dist/assets/{index-DgzgRTNg.js.map → index-Cq0trGqf.js.map} +1 -1
- package/dashboard/dist/assets/{index-DPJW96d2.js → index-DE0r9SEX.js} +26 -26
- package/dashboard/dist/assets/index-DE0r9SEX.js.map +1 -0
- package/dashboard/dist/assets/{index-BTqhAT6p.js → index-DH_CiD0W.js} +2 -2
- package/dashboard/dist/assets/{index-BTqhAT6p.js.map → index-DH_CiD0W.js.map} +1 -1
- package/dashboard/dist/assets/{index-C2l4GcZ7.js → index-K23FdS-T.js} +3 -3
- package/dashboard/dist/assets/{index-C2l4GcZ7.js.map → index-K23FdS-T.js.map} +1 -1
- package/dashboard/dist/assets/index-f6K1UNrn.js +2 -0
- package/dashboard/dist/assets/index-f6K1UNrn.js.map +1 -0
- package/dashboard/dist/assets/{index-BbJuC9kg.js → index-qr1fndqM.js} +2 -2
- package/dashboard/dist/assets/{index-BbJuC9kg.js.map → index-qr1fndqM.js.map} +1 -1
- package/dashboard/dist/assets/index-vKTvJ_li.js +2 -0
- package/dashboard/dist/assets/index-vKTvJ_li.js.map +1 -0
- package/dashboard/dist/assets/{index-CQDn-bLr.js → index-y-3ODtEE.js} +2 -2
- package/dashboard/dist/assets/{index-CQDn-bLr.js.map → index-y-3ODtEE.js.map} +1 -1
- package/dashboard/dist/assets/{index-QxAYCJ1S.js → index-y56Ds-LB.js} +2 -2
- package/dashboard/dist/assets/{index-QxAYCJ1S.js.map → index-y56Ds-LB.js.map} +1 -1
- package/dashboard/dist/assets/{knowledge-DzRpsm3D.js → knowledge-DSSATOTX.js} +2 -2
- package/dashboard/dist/assets/{knowledge-DzRpsm3D.js.map → knowledge-DSSATOTX.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-B1lc6nL4.js → mcp-CfJFVo5k.js} +2 -2
- package/dashboard/dist/assets/{mcp-B1lc6nL4.js.map → mcp-CfJFVo5k.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-CXuweaN3.js → mcp-query-DKVx2Q-X.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-CXuweaN3.js.map → mcp-query-DKVx2Q-X.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-D4VLWDvu.js → pipelines-BSWzE-6M.js} +2 -2
- package/dashboard/dist/assets/{pipelines-D4VLWDvu.js.map → pipelines-BSWzE-6M.js.map} +1 -1
- package/dashboard/dist/assets/{roles-CSpHRRu8.js → roles-t9HzhI5N.js} +2 -2
- package/dashboard/dist/assets/{roles-CSpHRRu8.js.map → roles-t9HzhI5N.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-CWUsKhM4.js → tasks-B7rUihoH.js} +2 -2
- package/dashboard/dist/assets/{tasks-CWUsKhM4.js.map → tasks-B7rUihoH.js.map} +1 -1
- package/dashboard/dist/assets/{topics-BXwstrzB.js → topics-PC2fEiyD.js} +2 -2
- package/dashboard/dist/assets/{topics-BXwstrzB.js.map → topics-PC2fEiyD.js.map} +1 -1
- package/dashboard/dist/assets/useDebouncedValue-BA5S7V54.js +2 -0
- package/dashboard/dist/assets/useDebouncedValue-BA5S7V54.js.map +1 -0
- package/dashboard/dist/assets/{useEventHooks-CjygrbYy.js → useEventHooks-DK9mw1cI.js} +2 -2
- package/dashboard/dist/assets/{useEventHooks-CjygrbYy.js.map → useEventHooks-DK9mw1cI.js.map} +1 -1
- package/dashboard/dist/assets/{useNamespace-CsepDyR5.js → useNamespace-3IjtUtAw.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-CsepDyR5.js.map → useNamespace-3IjtUtAw.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-gWIG6akB.js → useYamlActivityEvents-uxukp3gO.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-gWIG6akB.js.map → useYamlActivityEvents-uxukp3gO.js.map} +1 -1
- package/dashboard/dist/assets/users-CC4B5Fm5.js +2 -0
- package/dashboard/dist/assets/users-CC4B5Fm5.js.map +1 -0
- package/dashboard/dist/assets/{vendor-icons-Dj2F0Jrb.js → vendor-icons-Dy5Jpknf.js} +114 -109
- package/dashboard/dist/assets/vendor-icons-Dy5Jpknf.js.map +1 -0
- package/dashboard/dist/assets/{workflows-C7Cam2Ok.js → workflows-S7MF1nNk.js} +2 -2
- package/dashboard/dist/assets/{workflows-C7Cam2Ok.js.map → workflows-S7MF1nNk.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-ChUOE22W.js → yaml-workflows-WfdaMHNn.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-ChUOE22W.js.map → yaml-workflows-WfdaMHNn.js.map} +1 -1
- package/dashboard/dist/index.html +3 -3
- package/docs/api/http/escalations.md +131 -10
- package/docs/api/http/roles.md +44 -9
- package/docs/api/http/users.md +15 -6
- package/docs/api/mcp/admin.md +164 -14
- package/docs/api/mcp/human-queue.md +34 -2
- package/docs/api/sdk/escalations.md +155 -2
- package/docs/api/sdk/roles.md +11 -0
- package/docs/api/sdk/users.md +26 -1
- package/docs/auth.md +1 -1
- package/docs/dashboard.md +5 -4
- package/docs/data.md +9 -2
- package/docs/faceted-routing.md +221 -0
- package/docs/hitl-guide.md +50 -0
- package/docs/iam.md +31 -0
- package/docs/mcp.md +8 -0
- package/package.json +2 -2
- package/dashboard/dist/assets/AdminDashboard-DZpduYdW.js +0 -2
- package/dashboard/dist/assets/AgentDetailPage-C-2iSaDs.js +0 -4
- package/dashboard/dist/assets/AgentDetailPage-C-2iSaDs.js.map +0 -1
- package/dashboard/dist/assets/AgentsPage-C3FztFd_.js +0 -2
- package/dashboard/dist/assets/AgentsPage-C3FztFd_.js.map +0 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-DIqdBCwe.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-DIqdBCwe.js.map +0 -1
- package/dashboard/dist/assets/CapabilitiesPage-DTfKCzBQ.js +0 -2
- package/dashboard/dist/assets/CopyableId-DaT0ZRHg.js +0 -2
- package/dashboard/dist/assets/CopyableId-DaT0ZRHg.js.map +0 -1
- package/dashboard/dist/assets/McpQueryPage-Db1LUKVs.js +0 -2
- package/dashboard/dist/assets/McpQueryPage-Db1LUKVs.js.map +0 -1
- package/dashboard/dist/assets/McpRunsPage--tgT5uo7.js +0 -2
- package/dashboard/dist/assets/McpRunsPage--tgT5uo7.js.map +0 -1
- package/dashboard/dist/assets/OperatorDashboard-BWVUbJkZ.js +0 -2
- package/dashboard/dist/assets/OperatorDashboard-BWVUbJkZ.js.map +0 -1
- package/dashboard/dist/assets/PageHeader-Bnt2iQQa.js +0 -2
- package/dashboard/dist/assets/PageHeader-Bnt2iQQa.js.map +0 -1
- package/dashboard/dist/assets/PriorityBadge-DfQY9St9.js +0 -2
- package/dashboard/dist/assets/PriorityBadge-DfQY9St9.js.map +0 -1
- package/dashboard/dist/assets/ProcessesListPage-CWiRM_h3.js +0 -2
- package/dashboard/dist/assets/ProcessesListPage-CWiRM_h3.js.map +0 -1
- package/dashboard/dist/assets/RolePill-DQTT1s9v.js +0 -2
- package/dashboard/dist/assets/RolePill-DQTT1s9v.js.map +0 -1
- package/dashboard/dist/assets/RowActions-Dg-Fsm5O.js +0 -2
- package/dashboard/dist/assets/RowActions-Dg-Fsm5O.js.map +0 -1
- package/dashboard/dist/assets/StreamMessageDetail-BF0tM0cd.js +0 -2
- package/dashboard/dist/assets/WorkflowsDashboard-M13lIaw7.js +0 -2
- package/dashboard/dist/assets/WorkflowsDashboard-M13lIaw7.js.map +0 -1
- package/dashboard/dist/assets/escalation-columns-DqTkKbCv.js +0 -2
- package/dashboard/dist/assets/escalation-columns-DqTkKbCv.js.map +0 -1
- package/dashboard/dist/assets/index-CEpw_Fh8.js +0 -2
- package/dashboard/dist/assets/index-CEpw_Fh8.js.map +0 -1
- package/dashboard/dist/assets/index-ClvYSNZd.css +0 -1
- package/dashboard/dist/assets/index-CucXk58o.js +0 -6
- package/dashboard/dist/assets/index-CucXk58o.js.map +0 -1
- package/dashboard/dist/assets/index-DPJW96d2.js.map +0 -1
- package/dashboard/dist/assets/index-DeZhNCf5.js +0 -2
- package/dashboard/dist/assets/index-DeZhNCf5.js.map +0 -1
- package/dashboard/dist/assets/index-Do8Xp3pa.js +0 -2
- package/dashboard/dist/assets/index-Do8Xp3pa.js.map +0 -1
- package/dashboard/dist/assets/users-DvhHbR0R.js +0 -2
- package/dashboard/dist/assets/users-DvhHbR0R.js.map +0 -1
- package/dashboard/dist/assets/vendor-icons-Dj2F0Jrb.js.map +0 -1
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.registerFacetRoutes = registerFacetRoutes;
|
|
37
|
+
const api = __importStar(require("../../api/escalations"));
|
|
38
|
+
/**
|
|
39
|
+
* Faceted-routing HTTP surface — pond search + batch claim. Each operation targets a
|
|
40
|
+
* single pond `role` and is RBAC-scoped to it (the api layer enforces the gate). These
|
|
41
|
+
* mirror the SDK `escalations.searchByFacets / claimGroups / claimByFacets`.
|
|
42
|
+
*/
|
|
43
|
+
function registerFacetRoutes(router) {
|
|
44
|
+
/**
|
|
45
|
+
* POST /api/escalations/search-by-facets
|
|
46
|
+
* Item-level faceted search over a pond, scoped to the caller's role.
|
|
47
|
+
* Body: FacetQuery — { role, status?, available?, facets?, orderBy?, limit?, offset? }
|
|
48
|
+
*/
|
|
49
|
+
router.post('/search-by-facets', async (req, res) => {
|
|
50
|
+
const result = await api.searchByFacets(req.body ?? {}, req.auth);
|
|
51
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
52
|
+
});
|
|
53
|
+
/**
|
|
54
|
+
* POST /api/escalations/claim-groups
|
|
55
|
+
* Batch-claim complete origin groups in priority order, assigned to the caller.
|
|
56
|
+
* Body: { query: FacetQuery, limit?, durationMinutes?, sizeFacet? }
|
|
57
|
+
*/
|
|
58
|
+
router.post('/claim-groups', async (req, res) => {
|
|
59
|
+
const result = await api.claimGroups({
|
|
60
|
+
query: req.body?.query,
|
|
61
|
+
limit: req.body?.limit,
|
|
62
|
+
durationMinutes: req.body?.durationMinutes,
|
|
63
|
+
sizeFacet: req.body?.sizeFacet,
|
|
64
|
+
}, req.auth);
|
|
65
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
66
|
+
});
|
|
67
|
+
/**
|
|
68
|
+
* POST /api/escalations/claim-by-facets
|
|
69
|
+
* Batch-claim individual rows (FOR UPDATE SKIP LOCKED), assigned to the caller.
|
|
70
|
+
* Body: { query: FacetQuery, limit?, durationMinutes?, allOrNone? }
|
|
71
|
+
*/
|
|
72
|
+
router.post('/claim-by-facets', async (req, res) => {
|
|
73
|
+
const result = await api.claimByFacets({
|
|
74
|
+
query: req.body?.query,
|
|
75
|
+
limit: req.body?.limit,
|
|
76
|
+
durationMinutes: req.body?.durationMinutes,
|
|
77
|
+
allOrNone: req.body?.allOrNone,
|
|
78
|
+
}, req.auth);
|
|
79
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
80
|
+
});
|
|
81
|
+
}
|
|
@@ -6,6 +6,7 @@ const bulk_1 = require("./bulk");
|
|
|
6
6
|
const metadata_1 = require("./metadata");
|
|
7
7
|
const single_1 = require("./single");
|
|
8
8
|
const resolve_1 = require("./resolve");
|
|
9
|
+
const facets_1 = require("./facets");
|
|
9
10
|
const router = (0, express_1.Router)();
|
|
10
11
|
// Registration order matters: literal paths before parameterized /:id routes.
|
|
11
12
|
// GET /, /available, /types, /stats
|
|
@@ -15,6 +16,8 @@ const router = (0, express_1.Router)();
|
|
|
15
16
|
(0, bulk_1.registerBulkRoutes)(router);
|
|
16
17
|
// GET /by-metadata, POST /claim-by-metadata, POST /resolve-by-metadata
|
|
17
18
|
(0, metadata_1.registerMetadataRoutes)(router);
|
|
19
|
+
// POST /search-by-facets, /claim-groups, /claim-by-facets
|
|
20
|
+
(0, facets_1.registerFacetRoutes)(router);
|
|
18
21
|
// PATCH /:id/escalate, GET /by-workflow/:workflowId,
|
|
19
22
|
// GET /:id, POST /:id/claim, POST /:id/release
|
|
20
23
|
(0, single_1.registerSingleRoutes)(router);
|
|
@@ -35,6 +35,21 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.registerListRoutes = registerListRoutes;
|
|
37
37
|
const api = __importStar(require("../../api/escalations"));
|
|
38
|
+
/**
|
|
39
|
+
* Parse a JSON-encoded query param (facets/block/range/exists/orderBy/roles) so the
|
|
40
|
+
* full faceted query rides on a GET URL — keeps the dashboard's copy-URL/curl path
|
|
41
|
+
* reproducible. Returns undefined on absent/invalid JSON (never throws to the caller).
|
|
42
|
+
*/
|
|
43
|
+
function jsonParam(v) {
|
|
44
|
+
if (typeof v !== 'string' || !v)
|
|
45
|
+
return undefined;
|
|
46
|
+
try {
|
|
47
|
+
return JSON.parse(v);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
38
53
|
function registerListRoutes(router) {
|
|
39
54
|
/**
|
|
40
55
|
* POST /api/escalations
|
|
@@ -55,6 +70,13 @@ function registerListRoutes(router) {
|
|
|
55
70
|
envelope: req.body?.envelope,
|
|
56
71
|
metadata: req.body?.metadata,
|
|
57
72
|
escalation_payload: req.body?.escalation_payload,
|
|
73
|
+
// Workflow-linkage (optional): an advert for a running workflow.
|
|
74
|
+
origin_id: req.body?.origin_id,
|
|
75
|
+
parent_id: req.body?.parent_id,
|
|
76
|
+
task_id: req.body?.task_id,
|
|
77
|
+
workflow_id: req.body?.workflow_id,
|
|
78
|
+
task_queue: req.body?.task_queue,
|
|
79
|
+
workflow_type: req.body?.workflow_type,
|
|
58
80
|
}, req.auth);
|
|
59
81
|
res.status(result.status).json(result.data ?? { error: result.error });
|
|
60
82
|
});
|
|
@@ -76,6 +98,15 @@ function registerListRoutes(router) {
|
|
|
76
98
|
offset: req.query.offset ? parseInt(req.query.offset, 10) : undefined,
|
|
77
99
|
sort_by: req.query.sort_by,
|
|
78
100
|
order: req.query.order,
|
|
101
|
+
search: req.query.search,
|
|
102
|
+
// Faceted query elements (JSON-encoded on the URL).
|
|
103
|
+
roles: jsonParam(req.query.roles),
|
|
104
|
+
facets: jsonParam(req.query.facets),
|
|
105
|
+
block: jsonParam(req.query.block),
|
|
106
|
+
range: jsonParam(req.query.range),
|
|
107
|
+
exists: jsonParam(req.query.exists),
|
|
108
|
+
orderBy: jsonParam(req.query.orderBy),
|
|
109
|
+
available: req.query.available != null ? req.query.available === 'true' : undefined,
|
|
79
110
|
}, req.auth);
|
|
80
111
|
res.status(result.status).json(result.data ?? { error: result.error });
|
|
81
112
|
});
|
|
@@ -94,6 +125,14 @@ function registerListRoutes(router) {
|
|
|
94
125
|
offset: req.query.offset ? parseInt(req.query.offset, 10) : undefined,
|
|
95
126
|
sort_by: req.query.sort_by,
|
|
96
127
|
order: req.query.order,
|
|
128
|
+
search: req.query.search,
|
|
129
|
+
// Faceted query elements (JSON-encoded on the URL).
|
|
130
|
+
roles: jsonParam(req.query.roles),
|
|
131
|
+
facets: jsonParam(req.query.facets),
|
|
132
|
+
block: jsonParam(req.query.block),
|
|
133
|
+
range: jsonParam(req.query.range),
|
|
134
|
+
exists: jsonParam(req.query.exists),
|
|
135
|
+
orderBy: jsonParam(req.query.orderBy),
|
|
97
136
|
}, req.auth);
|
|
98
137
|
res.status(result.status).json(result.data ?? { error: result.error });
|
|
99
138
|
});
|
|
@@ -105,6 +144,15 @@ function registerListRoutes(router) {
|
|
|
105
144
|
const result = await api.listDistinctTypes();
|
|
106
145
|
res.status(result.status).json(result.data ?? { error: result.error });
|
|
107
146
|
});
|
|
147
|
+
/**
|
|
148
|
+
* GET /api/escalations/facet-keys
|
|
149
|
+
* Distinct top-level metadata facet keys visible to the caller (role-scoped).
|
|
150
|
+
* Powers the faceted-query UI's key autocomplete.
|
|
151
|
+
*/
|
|
152
|
+
router.get('/facet-keys', async (req, res) => {
|
|
153
|
+
const result = await api.listFacetKeys(undefined, req.auth);
|
|
154
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
155
|
+
});
|
|
108
156
|
/**
|
|
109
157
|
* GET /api/escalations/stats
|
|
110
158
|
* Aggregated escalation statistics.
|
|
@@ -42,10 +42,28 @@ function registerResolveRoutes(router) {
|
|
|
42
42
|
* waiting workflow in place. For webhook callers that know the deterministic
|
|
43
43
|
* signal id. Literal single-segment path — registered before /:id/resolve so
|
|
44
44
|
* it is never shadowed by the parameterized route.
|
|
45
|
-
* Body: { signalKey: string, resolverPayload: Record<string, any> }
|
|
45
|
+
* Body: { signalKey: string, resolverPayload: Record<string, any>, metadata?: Record<string, any> }
|
|
46
46
|
*/
|
|
47
47
|
router.post('/resolve-by-signal-key', async (req, res) => {
|
|
48
|
-
const result = await api.resolveBySignalKey({
|
|
48
|
+
const result = await api.resolveBySignalKey({
|
|
49
|
+
signalKey: req.body?.signalKey,
|
|
50
|
+
resolverPayload: req.body?.resolverPayload,
|
|
51
|
+
metadata: req.body?.metadata,
|
|
52
|
+
}, req.auth);
|
|
53
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
54
|
+
});
|
|
55
|
+
/**
|
|
56
|
+
* POST /api/escalations/resolve-by-ids
|
|
57
|
+
* Resolve a SET of escalations by id in one guarded statement (set-based sibling of
|
|
58
|
+
* /:id/resolve). RBAC: scoped callers may only resolve rows whose role they hold.
|
|
59
|
+
* Body: { ids: string[], resolverPayload: Record<string, any>, metadata?: Record<string, any> }
|
|
60
|
+
*/
|
|
61
|
+
router.post('/resolve-by-ids', async (req, res) => {
|
|
62
|
+
const result = await api.resolveByIds({
|
|
63
|
+
ids: req.body?.ids,
|
|
64
|
+
resolverPayload: req.body?.resolverPayload,
|
|
65
|
+
metadata: req.body?.metadata,
|
|
66
|
+
}, req.auth);
|
|
49
67
|
res.status(result.status).json(result.data ?? { error: result.error });
|
|
50
68
|
});
|
|
51
69
|
/**
|
|
@@ -53,10 +71,10 @@ function registerResolveRoutes(router) {
|
|
|
53
71
|
* Resolve a pending escalation with a human-provided payload. Routes by
|
|
54
72
|
* escalation shape: efficient (signal_key) resumes the job in place; legacy
|
|
55
73
|
* paths signal via routing metadata or re-run the original workflow.
|
|
56
|
-
* Body: { resolverPayload: Record<string, any> }
|
|
74
|
+
* Body: { resolverPayload: Record<string, any>, metadata?: Record<string, any> }
|
|
57
75
|
*/
|
|
58
76
|
router.post('/:id/resolve', async (req, res) => {
|
|
59
|
-
const result = await api.resolveEscalation({ id: req.params.id, resolverPayload: req.body?.resolverPayload }, req.auth);
|
|
77
|
+
const result = await api.resolveEscalation({ id: req.params.id, resolverPayload: req.body?.resolverPayload, metadata: req.body?.metadata }, req.auth);
|
|
60
78
|
res.status(result.status).json(result.data ?? { error: result.error });
|
|
61
79
|
});
|
|
62
80
|
}
|
package/build/routes/users.js
CHANGED
|
@@ -41,13 +41,14 @@ const router = (0, express_1.Router)();
|
|
|
41
41
|
/**
|
|
42
42
|
* GET /api/users
|
|
43
43
|
* List users with optional filters.
|
|
44
|
-
* Query: ?role=reviewer&roleType=admin&status=active&limit=50&offset=0
|
|
44
|
+
* Query: ?role=reviewer&roleType=admin&status=active&search=ada&limit=50&offset=0
|
|
45
45
|
*/
|
|
46
46
|
router.get('/', async (req, res) => {
|
|
47
47
|
const result = await api.listUsers({
|
|
48
48
|
role: req.query.role,
|
|
49
49
|
roleType: req.query.roleType,
|
|
50
50
|
status: req.query.status,
|
|
51
|
+
search: req.query.search,
|
|
51
52
|
limit: req.query.limit ? parseInt(req.query.limit, 10) : undefined,
|
|
52
53
|
offset: req.query.offset ? parseInt(req.query.offset, 10) : undefined,
|
|
53
54
|
});
|
|
@@ -99,15 +100,18 @@ router.get('/:id/roles', async (req, res) => {
|
|
|
99
100
|
/**
|
|
100
101
|
* POST /api/users/:id/roles
|
|
101
102
|
* Add a role to a user.
|
|
102
|
-
* Body: { role, type } — type must be superadmin,
|
|
103
|
+
* Body: { role, type, read_scope?, write_scope? } — type must be superadmin,
|
|
104
|
+
* admin, or member. read_scope (self|all) and write_scope (none|self|all) refine
|
|
105
|
+
* a member's work surface; they default to all/all and are ignored for admin/superadmin.
|
|
103
106
|
*
|
|
104
|
-
* Scoping rules:
|
|
107
|
+
* Scoping rules (management tier):
|
|
105
108
|
* - superadmin: can assign any role/type
|
|
106
109
|
* - engineer: can assign up to admin type, but never superadmin type
|
|
107
110
|
* - role/admin (non-builder): can only assign member/admin for roles they hold
|
|
111
|
+
* A caller who may assign a role may set any work-surface scope on it.
|
|
108
112
|
*/
|
|
109
113
|
router.post('/:id/roles', auth_1.requireAdmin, async (req, res) => {
|
|
110
|
-
const { role, type } = req.body || {};
|
|
114
|
+
const { role, type, read_scope, write_scope } = req.body || {};
|
|
111
115
|
const userId = req.auth.userId;
|
|
112
116
|
// Superadmin bypasses all scoping
|
|
113
117
|
const { isSuperAdmin } = await Promise.resolve().then(() => __importStar(require('../services/user/rbac')));
|
|
@@ -129,7 +133,7 @@ router.post('/:id/roles', auth_1.requireAdmin, async (req, res) => {
|
|
|
129
133
|
}
|
|
130
134
|
}
|
|
131
135
|
}
|
|
132
|
-
const result = await api.addUserRole({ id: req.params.id, role, type });
|
|
136
|
+
const result = await api.addUserRole({ id: req.params.id, role, type, read_scope, write_scope });
|
|
133
137
|
res.status(result.status).json(result.data ?? { error: result.error });
|
|
134
138
|
});
|
|
135
139
|
/**
|
|
@@ -66,19 +66,27 @@ router.post('/:type/invoke', async (req, res) => {
|
|
|
66
66
|
// ── Workflow observation ────────────────────────────────────────────────────
|
|
67
67
|
/**
|
|
68
68
|
* GET /api/workflows/:workflowId/status
|
|
69
|
-
* Get the status of a workflow.
|
|
69
|
+
* Get the status of a workflow. Optional `app_id` query param selects the
|
|
70
|
+
* HotMesh namespace for resolution (default: durable).
|
|
70
71
|
*/
|
|
71
72
|
router.get('/:workflowId/status', async (req, res) => {
|
|
72
|
-
const result = await api.getWorkflowStatus({
|
|
73
|
+
const result = await api.getWorkflowStatus({
|
|
74
|
+
workflowId: req.params.workflowId,
|
|
75
|
+
appId: typeof req.query.app_id === 'string' ? req.query.app_id : undefined,
|
|
76
|
+
});
|
|
73
77
|
res.status(result.status).json(result.data ?? { error: result.error });
|
|
74
78
|
});
|
|
75
79
|
/**
|
|
76
80
|
* GET /api/workflows/:workflowId/result
|
|
77
81
|
* Return the workflow result if complete, or 202 if still running.
|
|
78
|
-
* Never blocks — always returns immediately.
|
|
82
|
+
* Never blocks — always returns immediately. Optional `app_id` query param
|
|
83
|
+
* selects the HotMesh namespace for resolution (default: durable).
|
|
79
84
|
*/
|
|
80
85
|
router.get('/:workflowId/result', async (req, res) => {
|
|
81
|
-
const result = await api.getWorkflowResult({
|
|
86
|
+
const result = await api.getWorkflowResult({
|
|
87
|
+
workflowId: req.params.workflowId,
|
|
88
|
+
appId: typeof req.query.app_id === 'string' ? req.query.app_id : undefined,
|
|
89
|
+
});
|
|
82
90
|
res.status(result.status).json(result.data ?? { error: result.error });
|
|
83
91
|
});
|
|
84
92
|
/**
|
package/build/sdk/index.d.ts
CHANGED
|
@@ -82,6 +82,12 @@ export declare function createClient(options?: LTClientOptions): {
|
|
|
82
82
|
envelope?: string;
|
|
83
83
|
metadata?: Record<string, any>;
|
|
84
84
|
escalation_payload?: string;
|
|
85
|
+
origin_id?: string;
|
|
86
|
+
parent_id?: string;
|
|
87
|
+
task_id?: string;
|
|
88
|
+
workflow_id?: string;
|
|
89
|
+
task_queue?: string;
|
|
90
|
+
workflow_type?: string;
|
|
85
91
|
}, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
|
|
86
92
|
list: (input: {
|
|
87
93
|
status?: string;
|
|
@@ -95,7 +101,8 @@ export declare function createClient(options?: LTClientOptions): {
|
|
|
95
101
|
offset?: number;
|
|
96
102
|
sort_by?: string;
|
|
97
103
|
order?: string;
|
|
98
|
-
|
|
104
|
+
search?: string;
|
|
105
|
+
} & import("../api/escalations/list").FacetInput, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
|
|
99
106
|
listAvailable: (input: {
|
|
100
107
|
role?: string;
|
|
101
108
|
type?: string;
|
|
@@ -105,8 +112,10 @@ export declare function createClient(options?: LTClientOptions): {
|
|
|
105
112
|
offset?: number;
|
|
106
113
|
sort_by?: string;
|
|
107
114
|
order?: string;
|
|
108
|
-
|
|
115
|
+
search?: string;
|
|
116
|
+
} & import("../api/escalations/list").FacetInput, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
|
|
109
117
|
listTypes: typeof escalationsApi.listDistinctTypes;
|
|
118
|
+
listFacetKeys: (input: unknown, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
|
|
110
119
|
getStats: (input: {
|
|
111
120
|
period?: string;
|
|
112
121
|
}, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
|
|
@@ -129,6 +138,17 @@ export declare function createClient(options?: LTClientOptions): {
|
|
|
129
138
|
resolve: (input: {
|
|
130
139
|
id: string;
|
|
131
140
|
resolverPayload: Record<string, any>;
|
|
141
|
+
metadata?: Record<string, any>;
|
|
142
|
+
}, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
|
|
143
|
+
resolveBySignalKey: (input: {
|
|
144
|
+
signalKey: string;
|
|
145
|
+
resolverPayload: Record<string, any>;
|
|
146
|
+
metadata?: Record<string, any>;
|
|
147
|
+
}, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
|
|
148
|
+
resolveByIds: (input: {
|
|
149
|
+
ids: string[];
|
|
150
|
+
resolverPayload: Record<string, any>;
|
|
151
|
+
metadata?: Record<string, any>;
|
|
132
152
|
}, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
|
|
133
153
|
releaseExpired: typeof escalationsApi.releaseExpiredClaims;
|
|
134
154
|
updatePriority: (input: {
|
|
@@ -174,6 +194,19 @@ export declare function createClient(options?: LTClientOptions): {
|
|
|
174
194
|
assignee?: string;
|
|
175
195
|
metadata?: Record<string, any>;
|
|
176
196
|
}, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
|
|
197
|
+
searchByFacets: (input: import("..").FacetQuery, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
|
|
198
|
+
claimGroups: (input: {
|
|
199
|
+
query: import("..").FacetQuery;
|
|
200
|
+
limit?: number;
|
|
201
|
+
durationMinutes?: number;
|
|
202
|
+
sizeFacet?: string;
|
|
203
|
+
}, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
|
|
204
|
+
claimByFacets: (input: {
|
|
205
|
+
query: import("..").FacetQuery;
|
|
206
|
+
limit?: number;
|
|
207
|
+
durationMinutes?: number;
|
|
208
|
+
allOrNone?: boolean;
|
|
209
|
+
}, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
|
|
177
210
|
};
|
|
178
211
|
workflows: {
|
|
179
212
|
invoke: (input: {
|
package/build/sdk/index.js
CHANGED
|
@@ -117,6 +117,7 @@ function createClient(options = {}) {
|
|
|
117
117
|
list: bindAuth(escalationsApi.listEscalations, auth),
|
|
118
118
|
listAvailable: bindAuth(escalationsApi.listAvailableEscalations, auth),
|
|
119
119
|
listTypes: escalationsApi.listDistinctTypes,
|
|
120
|
+
listFacetKeys: bindAuth(escalationsApi.listFacetKeys, auth),
|
|
120
121
|
getStats: bindAuth(escalationsApi.getEscalationStats, auth),
|
|
121
122
|
get: bindAuth(escalationsApi.getEscalation, auth),
|
|
122
123
|
getByWorkflowId: escalationsApi.getEscalationsByWorkflowId,
|
|
@@ -124,6 +125,8 @@ function createClient(options = {}) {
|
|
|
124
125
|
claim: bindAuth(escalationsApi.claimEscalation, auth),
|
|
125
126
|
release: bindAuth(escalationsApi.releaseEscalation, auth),
|
|
126
127
|
resolve: bindAuth(escalationsApi.resolveEscalation, auth),
|
|
128
|
+
resolveBySignalKey: bindAuth(escalationsApi.resolveBySignalKey, auth),
|
|
129
|
+
resolveByIds: bindAuth(escalationsApi.resolveByIds, auth),
|
|
127
130
|
releaseExpired: escalationsApi.releaseExpiredClaims,
|
|
128
131
|
updatePriority: bindAuth(escalationsApi.updatePriority, auth),
|
|
129
132
|
bulkClaim: bindAuth(escalationsApi.bulkClaim, auth),
|
|
@@ -133,6 +136,10 @@ function createClient(options = {}) {
|
|
|
133
136
|
findByMetadata: bindAuth(escalationsApi.findByMetadata, auth),
|
|
134
137
|
claimByMetadata: bindAuth(escalationsApi.claimByMetadata, auth),
|
|
135
138
|
resolveByMetadata: bindAuth(escalationsApi.resolveByMetadata, auth),
|
|
139
|
+
// Faceted-routing surface (pond search + batch claim), RBAC-scoped to the caller's role.
|
|
140
|
+
searchByFacets: bindAuth(escalationsApi.searchByFacets, auth),
|
|
141
|
+
claimGroups: bindAuth(escalationsApi.claimGroups, auth),
|
|
142
|
+
claimByFacets: bindAuth(escalationsApi.claimByFacets, auth),
|
|
136
143
|
},
|
|
137
144
|
// ── Workflows ──────────────────────────────────────────────────────────
|
|
138
145
|
workflows: {
|
|
@@ -17,6 +17,21 @@ export interface StreamSummary {
|
|
|
17
17
|
pending: number;
|
|
18
18
|
in_flight: number;
|
|
19
19
|
}
|
|
20
|
+
/** A large string field replaced with a bounded summary instead of the full payload. */
|
|
21
|
+
export interface TruncatedString {
|
|
22
|
+
bytes: number;
|
|
23
|
+
preview: string;
|
|
24
|
+
truncated: true;
|
|
25
|
+
}
|
|
26
|
+
/** Pointer to the stream browser for the raw, untruncated message payloads. */
|
|
27
|
+
export interface RawMessagesHint {
|
|
28
|
+
hint: string;
|
|
29
|
+
jid: string;
|
|
30
|
+
}
|
|
31
|
+
/** A stream message whose large `message` payload may have been summarized. */
|
|
32
|
+
export type SummarizedStreamMessage = Omit<StreamMessage, 'message'> & {
|
|
33
|
+
message: string | TruncatedString;
|
|
34
|
+
};
|
|
20
35
|
export interface JobDiagnosis {
|
|
21
36
|
workflow_id: string;
|
|
22
37
|
app_id: string;
|
|
@@ -32,18 +47,37 @@ export interface JobDiagnosis {
|
|
|
32
47
|
stream_summary: StreamSummary;
|
|
33
48
|
escalation: EscalationSummary;
|
|
34
49
|
findings: Finding[];
|
|
35
|
-
execution_events: unknown[];
|
|
36
50
|
/** Total events before any cap was applied (execution_events may be truncated to the most recent `maxEvents`). */
|
|
37
51
|
total_events: number;
|
|
38
52
|
events_truncated: boolean;
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
53
|
+
/**
|
|
54
|
+
* Full event timeline — present only when `include` contains `'events'` (or
|
|
55
|
+
* `verbosity: 'full'`). Large string attributes are summarized to
|
|
56
|
+
* `{ bytes, preview, truncated }`. Omitted by default to keep the verdict compact.
|
|
57
|
+
*/
|
|
58
|
+
execution_events?: unknown[];
|
|
59
|
+
/**
|
|
60
|
+
* Raw engine + worker stream messages — present only when `include` contains
|
|
61
|
+
* `'streams'` (or `verbosity: 'full'`). Large `message` payloads are summarized.
|
|
62
|
+
* Omitted by default; see `raw_messages` for where to fetch the full payloads.
|
|
63
|
+
*/
|
|
64
|
+
stream_messages?: {
|
|
65
|
+
worker: SummarizedStreamMessage[];
|
|
66
|
+
engine: SummarizedStreamMessage[];
|
|
42
67
|
};
|
|
68
|
+
/** Pointer to `list_stream_messages` for the raw payloads (present when streams are omitted). */
|
|
69
|
+
raw_messages?: RawMessagesHint;
|
|
43
70
|
}
|
|
44
|
-
export
|
|
71
|
+
export type DiagnoseVerbosity = 'summary' | 'full';
|
|
72
|
+
export type DiagnoseSection = 'events' | 'streams';
|
|
73
|
+
export interface DiagnoseOptions {
|
|
45
74
|
maxEvents?: number;
|
|
46
|
-
|
|
75
|
+
/** Heavy sections to include in the response. Default: none (verdict only). */
|
|
76
|
+
include?: DiagnoseSection[];
|
|
77
|
+
/** Shorthand: `'full'` includes both events and streams; `'summary'` (default) includes neither. */
|
|
78
|
+
verbosity?: DiagnoseVerbosity;
|
|
79
|
+
}
|
|
80
|
+
export declare function diagnoseJob(workflowId: string, appId?: string, options?: DiagnoseOptions): Promise<JobDiagnosis>;
|
|
47
81
|
export declare function findStalledJobs(params: {
|
|
48
82
|
appId?: string;
|
|
49
83
|
idleMinutes?: number;
|
|
@@ -88,10 +88,39 @@ const ORPHANED_SIGNALS = (appId) => `
|
|
|
88
88
|
`;
|
|
89
89
|
/** Default cap on events returned in the payload — keeps a high-activity workflow from returning a huge response. */
|
|
90
90
|
const DEFAULT_MAX_EVENTS = 500;
|
|
91
|
+
/** Strings larger than this (UTF-8 bytes) are summarized rather than returned in full. */
|
|
92
|
+
const LARGE_STRING_BYTES = 1024;
|
|
93
|
+
/** How many leading characters of a summarized string to keep as a preview. */
|
|
94
|
+
const PREVIEW_CHARS = 200;
|
|
95
|
+
/** Recursion depth cap for summarizing nested event attributes. */
|
|
96
|
+
const SUMMARIZE_MAX_DEPTH = 6;
|
|
97
|
+
/** Replace an over-threshold string with a bounded summary; pass small strings through unchanged. */
|
|
98
|
+
function summarizeString(value) {
|
|
99
|
+
const bytes = Buffer.byteLength(value, 'utf8');
|
|
100
|
+
if (bytes <= LARGE_STRING_BYTES)
|
|
101
|
+
return value;
|
|
102
|
+
return { bytes, preview: value.slice(0, PREVIEW_CHARS), truncated: true };
|
|
103
|
+
}
|
|
104
|
+
/** Recursively summarize large string leaves in an event attribute tree (result/output/input/error payloads). */
|
|
105
|
+
function summarizeDeep(value, depth = 0) {
|
|
106
|
+
if (typeof value === 'string')
|
|
107
|
+
return summarizeString(value);
|
|
108
|
+
if (value === null || typeof value !== 'object' || depth >= SUMMARIZE_MAX_DEPTH)
|
|
109
|
+
return value;
|
|
110
|
+
if (Array.isArray(value))
|
|
111
|
+
return value.map((v) => summarizeDeep(v, depth + 1));
|
|
112
|
+
const out = {};
|
|
113
|
+
for (const [k, v] of Object.entries(value)) {
|
|
114
|
+
out[k] = summarizeDeep(v, depth + 1);
|
|
115
|
+
}
|
|
116
|
+
return out;
|
|
117
|
+
}
|
|
91
118
|
// ── diagnoseJob ──────────────────────────────────────────────────────────────
|
|
92
119
|
async function diagnoseJob(workflowId, appId = 'durable', options = {}) {
|
|
93
120
|
const pool = (0, db_1.getPool)();
|
|
94
121
|
const maxEvents = Math.max(options.maxEvents ?? DEFAULT_MAX_EVENTS, 1);
|
|
122
|
+
const includeEvents = options.verbosity === 'full' || !!options.include?.includes('events');
|
|
123
|
+
const includeStreams = options.verbosity === 'full' || !!options.include?.includes('streams');
|
|
95
124
|
let resolved;
|
|
96
125
|
try {
|
|
97
126
|
resolved = await (0, resolve_1.resolveWorkflowHandle)(workflowId);
|
|
@@ -135,7 +164,7 @@ async function diagnoseJob(workflowId, appId = 'durable', options = {}) {
|
|
|
135
164
|
const findings = execution
|
|
136
165
|
? (0, patterns_1.matchPatterns)(execution, workerMessages, engineMessages, escalationRow)
|
|
137
166
|
: [{ condition: 'export_unavailable', confidence: 0.9, severity: 'warning', evidence: ['Execution export unavailable — job may have expired or HotMesh engine is not running'], guidance: [] }];
|
|
138
|
-
|
|
167
|
+
const diagnosis = {
|
|
139
168
|
workflow_id: workflowId,
|
|
140
169
|
app_id: appId,
|
|
141
170
|
status,
|
|
@@ -153,11 +182,33 @@ async function diagnoseJob(workflowId, appId = 'durable', options = {}) {
|
|
|
153
182
|
created_at: escalationRow?.created_at ?? null,
|
|
154
183
|
},
|
|
155
184
|
findings,
|
|
156
|
-
execution_events: cappedEvents,
|
|
157
185
|
total_events: events.length,
|
|
158
186
|
events_truncated: eventsTruncated,
|
|
159
|
-
stream_messages: { worker: workerMessages, engine: engineMessages },
|
|
160
187
|
};
|
|
188
|
+
// Heavy sections are opt-in. Large string payloads are summarized either way
|
|
189
|
+
// so an included section can't reintroduce the 100–200KB blow-up.
|
|
190
|
+
if (includeEvents) {
|
|
191
|
+
diagnosis.execution_events = cappedEvents.map((e) => e && typeof e === 'object'
|
|
192
|
+
? { ...e, attributes: summarizeDeep(e.attributes) }
|
|
193
|
+
: e);
|
|
194
|
+
}
|
|
195
|
+
if (includeStreams) {
|
|
196
|
+
diagnosis.stream_messages = {
|
|
197
|
+
worker: summarizeMessages(workerMessages),
|
|
198
|
+
engine: summarizeMessages(engineMessages),
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
diagnosis.raw_messages = {
|
|
203
|
+
hint: 'Use list_stream_messages (Control Plane) filtered by jid (and aid/dad) for the full raw message payloads.',
|
|
204
|
+
jid: workflowId,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
return diagnosis;
|
|
208
|
+
}
|
|
209
|
+
/** Summarize the large `message` payload of each stream message; everything else passes through. */
|
|
210
|
+
function summarizeMessages(messages) {
|
|
211
|
+
return messages.map((m) => ({ ...m, message: summarizeString(m.message) }));
|
|
161
212
|
}
|
|
162
213
|
// ── findStalledJobs ──────────────────────────────────────────────────────────
|
|
163
214
|
async function findStalledJobs(params) {
|
|
@@ -200,9 +251,7 @@ function notFound(workflowId, appId) {
|
|
|
200
251
|
stream_summary: { worker_total: 0, engine_total: 0, dead_lettered: 0, pending: 0, in_flight: 0 },
|
|
201
252
|
escalation: { exists: false, id: null, status: null, signal_key: null, role: null, type: null, created_at: null },
|
|
202
253
|
findings: [{ condition: 'not_found', confidence: 1, severity: 'critical', evidence: ['Workflow ID not found — no task record or job entity'], guidance: [] }],
|
|
203
|
-
execution_events: [],
|
|
204
254
|
total_events: 0,
|
|
205
255
|
events_truncated: false,
|
|
206
|
-
stream_messages: { worker: [], engine: [] },
|
|
207
256
|
};
|
|
208
257
|
}
|