@hotmeshio/long-tail 0.10.13 → 0.11.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 +2 -4
- package/build/api/escalations/analytics.d.ts +6 -0
- package/build/api/escalations/analytics.js +123 -0
- package/build/api/escalations/index.d.ts +1 -0
- package/build/api/escalations/index.js +4 -1
- package/build/api/escalations/metadata.js +1 -1
- package/build/api/escalations/resolve.js +4 -4
- package/build/api/roles.d.ts +4 -0
- package/build/api/roles.js +8 -0
- package/build/api/scan-codes/choice.d.ts +11 -0
- package/build/api/scan-codes/choice.js +136 -0
- package/build/api/scan-codes/context.d.ts +24 -0
- package/build/api/scan-codes/context.js +86 -0
- package/build/api/scan-codes/execute.d.ts +1 -0
- package/build/api/scan-codes/execute.js +49 -244
- package/build/api/scan-codes/identity.d.ts +18 -0
- package/build/api/scan-codes/identity.js +116 -0
- package/build/api/scan-codes/index.d.ts +2 -0
- package/build/api/scan-codes/index.js +6 -1
- package/build/api/scan-codes/locate.d.ts +14 -0
- package/build/api/scan-codes/locate.js +127 -0
- package/build/api/scan-codes/present.d.ts +9 -0
- package/build/api/scan-codes/present.js +59 -0
- package/build/api/scan-codes/verbs.d.ts +15 -0
- package/build/api/scan-codes/verbs.js +205 -0
- package/build/bin/ltc.js +33 -0
- package/build/lib/cli/commands/escalations.d.ts +31 -0
- package/build/lib/cli/commands/escalations.js +88 -0
- package/build/lib/db/schemas/028_role_entity_facet.sql +18 -0
- package/build/lib/db/schemas/029_scan_scheme_kind.sql +31 -0
- package/build/modules/config.d.ts +5 -0
- package/build/modules/config.js +12 -0
- package/build/routes/escalations/acting.d.ts +12 -0
- package/build/routes/escalations/acting.js +25 -0
- package/build/routes/escalations/analytics.d.ts +8 -0
- package/build/routes/escalations/analytics.js +63 -0
- package/build/routes/escalations/index.js +3 -0
- package/build/routes/escalations/resolve.js +8 -1
- package/build/routes/escalations/single.js +13 -4
- package/build/routes/roles.js +1 -1
- package/build/routes/scan-codes.js +28 -2
- package/build/scripts/ortho-populate.js +14 -0
- package/build/scripts/printer-cycle.d.ts +25 -0
- package/build/scripts/printer-cycle.js +169 -0
- package/build/scripts/twin-farm.js +19 -5
- package/build/sdk/index.d.ts +2 -0
- package/build/sdk/index.js +3 -0
- package/build/services/escalation/aggregate-sql.d.ts +36 -0
- package/build/services/escalation/aggregate-sql.js +253 -0
- package/build/services/escalation/aggregate-validate.d.ts +57 -0
- package/build/services/escalation/aggregate-validate.js +218 -0
- package/build/services/escalation/aggregates.d.ts +26 -0
- package/build/services/escalation/aggregates.js +204 -0
- package/build/services/escalation/client.js +57 -21
- package/build/services/escalation/facet-sql.js +17 -0
- package/build/services/escalation/index.d.ts +2 -0
- package/build/services/escalation/index.js +8 -1
- package/build/services/escalation/metrics-cache.d.ts +18 -0
- package/build/services/escalation/metrics-cache.js +47 -1
- package/build/services/escalation/queries.js +2 -0
- package/build/services/escalation/resolver-validation.d.ts +1 -1
- package/build/services/escalation/resolver-validation.js +12 -5
- package/build/services/escalation/submit-guard.d.ts +29 -0
- package/build/services/escalation/submit-guard.js +57 -0
- package/build/services/iam/acting-identity.d.ts +16 -0
- package/build/services/iam/acting-identity.js +60 -0
- package/build/services/role/index.js +2 -0
- package/build/services/role/sql.d.ts +10 -2
- package/build/services/role/sql.js +14 -1
- package/build/services/role/types.d.ts +16 -0
- package/build/services/scan-code/read.js +4 -0
- package/build/services/scan-code/sql.d.ts +4 -4
- package/build/services/scan-code/sql.js +14 -8
- package/build/services/scan-code/validate.d.ts +2 -0
- package/build/services/scan-code/validate.js +86 -0
- package/build/services/scan-code/write.d.ts +4 -0
- package/build/services/scan-code/write.js +16 -2
- package/build/services/user/crud.d.ts +6 -0
- package/build/services/user/crud.js +16 -0
- package/build/services/user/index.d.ts +1 -1
- package/build/services/user/index.js +2 -1
- package/build/services/user/sql.d.ts +8 -0
- package/build/services/user/sql.js +9 -1
- package/build/shared/form-validation/index.d.ts +4 -0
- package/build/shared/form-validation/index.js +4 -0
- package/build/shared/form-validation/x-lt-labels.d.ts +28 -0
- package/build/shared/form-validation/x-lt-labels.js +42 -0
- package/build/shared/form-validation/x-lt-query.d.ts +56 -0
- package/build/shared/form-validation/x-lt-query.js +49 -0
- package/build/shared/form-validation/x-lt-submit-guard.d.ts +46 -0
- package/build/shared/form-validation/x-lt-submit-guard.js +25 -0
- package/build/shared/form-validation/x-lt-submit-on-claim.d.ts +22 -0
- package/build/shared/form-validation/x-lt-submit-on-claim.js +28 -0
- package/build/system/mcp-servers/admin/escalations.js +34 -0
- package/build/system/mcp-servers/admin/scan-codes.js +17 -1
- package/build/system/mcp-servers/admin/schemas.d.ts +643 -25
- package/build/system/mcp-servers/admin/schemas.js +127 -19
- package/build/system/mcp-servers/admin/users.js +3 -1
- package/build/system/mcp-servers/human-queue-schemas.d.ts +2 -2
- package/build/system/seed/tool-manifests-admin.d.ts +2283 -0
- package/build/system/seed/tool-manifests-admin.js +8 -5
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/analytics.d.ts +154 -0
- package/build/types/analytics.js +14 -0
- package/build/types/facets.d.ts +13 -0
- package/build/types/index.d.ts +5 -2
- package/build/types/index.js +5 -1
- package/build/types/scan-choice.d.ts +49 -0
- package/build/types/scan-choice.js +9 -0
- package/build/types/scan-code.d.ts +72 -1
- package/build/types/scan-code.js +30 -1
- package/dashboard/dist/assets/{AdminDashboard-Bv3pHBzn.js → AdminDashboard-DJ3LJQ09.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-Bv3pHBzn.js.map → AdminDashboard-DJ3LJQ09.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-Dk2zlvDb.js → AgentConfigPage-BMMvaD0z.js} +2 -2
- package/dashboard/dist/assets/{AgentConfigPage-Dk2zlvDb.js.map → AgentConfigPage-BMMvaD0z.js.map} +1 -1
- package/dashboard/dist/assets/{AgentDetailPage-DUno6EGs.js → AgentDetailPage-C6wfsnRe.js} +2 -2
- package/dashboard/dist/assets/{AgentDetailPage-DUno6EGs.js.map → AgentDetailPage-C6wfsnRe.js.map} +1 -1
- package/dashboard/dist/assets/AgentsPage-Cwqka7nE.js +2 -0
- package/dashboard/dist/assets/{AgentsPage-CToVu1qj.js.map → AgentsPage-Cwqka7nE.js.map} +1 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-CVlG_AVC.js +2 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-CVlG_AVC.js.map +1 -0
- package/dashboard/dist/assets/{BotPicker-DQOpVB4M.js → BotPicker-BBkJBXZB.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-DQOpVB4M.js.map → BotPicker-BBkJBXZB.js.map} +1 -1
- package/dashboard/dist/assets/{CapabilitiesPage-Dmf46PUJ.js → CapabilitiesPage-wxmE4917.js} +2 -2
- package/dashboard/dist/assets/{CapabilitiesPage-Dmf46PUJ.js.map → CapabilitiesPage-wxmE4917.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-CDADefUY.js → CollapsibleSection-B3FsrHwH.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-CDADefUY.js.map → CollapsibleSection-B3FsrHwH.js.map} +1 -1
- package/dashboard/dist/assets/CountdownTimer-B3nCqJdC.js +2 -0
- package/dashboard/dist/assets/CountdownTimer-B3nCqJdC.js.map +1 -0
- package/dashboard/dist/assets/{CredentialsPage-8LIEvomi.js → CredentialsPage-Bv875IHe.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-8LIEvomi.js.map → CredentialsPage-Bv875IHe.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-CK3WSsM5.js → CronLabel-CSzjWuwj.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-CK3WSsM5.js.map → CronLabel-CSzjWuwj.js.map} +1 -1
- package/dashboard/dist/assets/{CustomDurationPicker-FPmlA6cE.js → CustomDurationPicker-CCpqf3e4.js} +2 -2
- package/dashboard/dist/assets/{CustomDurationPicker-FPmlA6cE.js.map → CustomDurationPicker-CCpqf3e4.js.map} +1 -1
- package/dashboard/dist/assets/{DropZone-CL9gA7pu.js → DropZone-CJkk-U3o.js} +2 -2
- package/dashboard/dist/assets/{DropZone-CL9gA7pu.js.map → DropZone-CJkk-U3o.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-BZVkVxE0.js → ElapsedCell-WV6pUaKo.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-BZVkVxE0.js.map → ElapsedCell-WV6pUaKo.js.map} +1 -1
- package/dashboard/dist/assets/EntityTimelinePanel-DrL86Yrf.js +2 -0
- package/dashboard/dist/assets/EntityTimelinePanel-DrL86Yrf.js.map +1 -0
- package/dashboard/dist/assets/{EscalationListSchemaPage-kYLdUtZX.js → EscalationListSchemaPage-CTQCALw4.js} +3 -3
- package/dashboard/dist/assets/{EscalationListSchemaPage-kYLdUtZX.js.map → EscalationListSchemaPage-CTQCALw4.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationSchemaPage-kUmCDivo.js → EscalationSchemaPage-D_UgP0pv.js} +3 -3
- package/dashboard/dist/assets/{EscalationSchemaPage-kUmCDivo.js.map → EscalationSchemaPage-D_UgP0pv.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-D17auO-m.js → EscalationsOverview-DuIUyxr0.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-D17auO-m.js.map → EscalationsOverview-DuIUyxr0.js.map} +1 -1
- package/dashboard/dist/assets/EventTable-BV6unphX.js +2 -0
- package/dashboard/dist/assets/EventTable-BV6unphX.js.map +1 -0
- package/dashboard/dist/assets/FilterBar-DYFgzXNB.js +2 -0
- package/dashboard/dist/assets/FilterBar-DYFgzXNB.js.map +1 -0
- package/dashboard/dist/assets/{GraphInvokePage-D11uOnZi.js → GraphInvokePage-BGHVUipJ.js} +2 -2
- package/dashboard/dist/assets/{GraphInvokePage-D11uOnZi.js.map → GraphInvokePage-BGHVUipJ.js.map} +1 -1
- package/dashboard/dist/assets/HomePage-B-S2cK3E.js +2 -0
- package/dashboard/dist/assets/{HomePage-Bcq10Bxx.js.map → HomePage-B-S2cK3E.js.map} +1 -1
- package/dashboard/dist/assets/ListToolbar-Bl7F3A28.js +2 -0
- package/dashboard/dist/assets/{ListToolbar-IPXsTb3Q.js.map → ListToolbar-Bl7F3A28.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-Dx2j0KkF.js → McpOverview-_T9IsCD_.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-Dx2j0KkF.js.map → McpOverview-_T9IsCD_.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-CzF_bna8.js → McpQueryDetailPage-DtsVqKPw.js} +2 -2
- package/dashboard/dist/assets/{McpQueryDetailPage-CzF_bna8.js.map → McpQueryDetailPage-DtsVqKPw.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryPage-DX5u-1bx.js +2 -0
- package/dashboard/dist/assets/{McpQueryPage-CNsuiw_q.js.map → McpQueryPage-DX5u-1bx.js.map} +1 -1
- package/dashboard/dist/assets/McpRunDetailPage-BhcqqtYS.js +2 -0
- package/dashboard/dist/assets/McpRunDetailPage-BhcqqtYS.js.map +1 -0
- package/dashboard/dist/assets/{McpRunsPage-CK96s3Nt.js → McpRunsPage-L-1y8wnX.js} +2 -2
- package/dashboard/dist/assets/{McpRunsPage-CK96s3Nt.js.map → McpRunsPage-L-1y8wnX.js.map} +1 -1
- package/dashboard/dist/assets/{NamespacePill-B9Vc_Pz2.js → NamespacePill-in1SLd0W.js} +2 -2
- package/dashboard/dist/assets/{NamespacePill-B9Vc_Pz2.js.map → NamespacePill-in1SLd0W.js.map} +1 -1
- package/dashboard/dist/assets/OperationsPage-i8KcDpKo.js +3 -0
- package/dashboard/dist/assets/OperationsPage-i8KcDpKo.js.map +1 -0
- package/dashboard/dist/assets/OperatorDashboard-CIbDzOlh.js +2 -0
- package/dashboard/dist/assets/{OperatorDashboard-C-jE0IRA.js.map → OperatorDashboard-CIbDzOlh.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeader-Ce4GcIYo.js → PageHeader-BJgWMZtw.js} +2 -2
- package/dashboard/dist/assets/{PageHeader-Ce4GcIYo.js.map → PageHeader-BJgWMZtw.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeaderWithStats-Ck0KZvXD.js → PageHeaderWithStats-Ccio4vyG.js} +2 -2
- package/dashboard/dist/assets/{PageHeaderWithStats-Ck0KZvXD.js.map → PageHeaderWithStats-Ccio4vyG.js.map} +1 -1
- package/dashboard/dist/assets/{PersonaDetailPage-CJ6jqo7h.js → PersonaDetailPage-BOaf0TW1.js} +2 -2
- package/dashboard/dist/assets/{PersonaDetailPage-CJ6jqo7h.js.map → PersonaDetailPage-BOaf0TW1.js.map} +1 -1
- package/dashboard/dist/assets/{PersonasPage-D8hL3kL5.js → PersonasPage-DSdRb90f.js} +2 -2
- package/dashboard/dist/assets/{PersonasPage-D8hL3kL5.js.map → PersonasPage-DSdRb90f.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-Vnx8Z5_y.js → ProcessDetailPage-DN9NqfeP.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-Vnx8Z5_y.js.map → ProcessDetailPage-DN9NqfeP.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-DRYtvS3N.js → ProcessesListPage-CfQEWaD4.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-DRYtvS3N.js.map → ProcessesListPage-CfQEWaD4.js.map} +1 -1
- package/dashboard/dist/assets/RoleDetailPage-BC5HL7ls.js +8 -0
- package/dashboard/dist/assets/RoleDetailPage-BC5HL7ls.js.map +1 -0
- package/dashboard/dist/assets/{RolePill-CnuBPhPw.js → RolePill-BNAP-uK6.js} +2 -2
- package/dashboard/dist/assets/{RolePill-CnuBPhPw.js.map → RolePill-BNAP-uK6.js.map} +1 -1
- package/dashboard/dist/assets/RolesPage-DCnW0VmD.js +2 -0
- package/dashboard/dist/assets/RolesPage-DCnW0VmD.js.map +1 -0
- package/dashboard/dist/assets/RunAsSelector-twbuX7fB.js +2 -0
- package/dashboard/dist/assets/{RunAsSelector-CS3KQ-BF.js.map → RunAsSelector-twbuX7fB.js.map} +1 -1
- package/dashboard/dist/assets/ScanCodesPage-CPNg6K--.js +2 -0
- package/dashboard/dist/assets/ScanCodesPage-CPNg6K--.js.map +1 -0
- package/dashboard/dist/assets/ScanSchemeDetailPage-DyLmCamO.js +2 -0
- package/dashboard/dist/assets/ScanSchemeDetailPage-DyLmCamO.js.map +1 -0
- package/dashboard/dist/assets/ScanStationPage-DoZccU5B.js +2 -0
- package/dashboard/dist/assets/ScanStationPage-DoZccU5B.js.map +1 -0
- package/dashboard/dist/assets/{ScopeBadge-BUpYpS3x.js → ScopeBadge-BG7KkZ8Q.js} +2 -2
- package/dashboard/dist/assets/{ScopeBadge-BUpYpS3x.js.map → ScopeBadge-BG7KkZ8Q.js.map} +1 -1
- package/dashboard/dist/assets/SegmentedTabs-DXNzY05q.js +2 -0
- package/dashboard/dist/assets/SegmentedTabs-DXNzY05q.js.map +1 -0
- package/dashboard/dist/assets/StickyPagination-DIeYMPPd.js +2 -0
- package/dashboard/dist/assets/StickyPagination-DIeYMPPd.js.map +1 -0
- package/dashboard/dist/assets/{StreamMessageDetail-DyJyZwBl.js → StreamMessageDetail-gU4CUeQI.js} +2 -2
- package/dashboard/dist/assets/{StreamMessageDetail-DyJyZwBl.js.map → StreamMessageDetail-gU4CUeQI.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-BlzV74V5.js → SwimlaneTimeline-Br-nBA4l.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-BlzV74V5.js.map → SwimlaneTimeline-Br-nBA4l.js.map} +1 -1
- package/dashboard/dist/assets/{TagInput-BbZ25nNe.js → TagInput-CvM5n6ww.js} +2 -2
- package/dashboard/dist/assets/{TagInput-BbZ25nNe.js.map → TagInput-CvM5n6ww.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-B0p_Z4J_.js → TaskDetailPage-_9cr_R0u.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-B0p_Z4J_.js.map → TaskDetailPage-_9cr_R0u.js.map} +1 -1
- package/dashboard/dist/assets/{TaskQueuePill-D0QKBrN3.js → TaskQueuePill-D4JPHXOq.js} +2 -2
- package/dashboard/dist/assets/{TaskQueuePill-D0QKBrN3.js.map → TaskQueuePill-D4JPHXOq.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-CiGR2QiQ.js → TasksListPage-DVENC9Jp.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-CiGR2QiQ.js.map → TasksListPage-DVENC9Jp.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-D_DA9ucC.js → TimeAgo-C9yYnOui.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-D_DA9ucC.js.map → TimeAgo-C9yYnOui.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-C7rkC9nh.js → TimestampCell-DoB8cYgw.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-C7rkC9nh.js.map → TimestampCell-DoB8cYgw.js.map} +1 -1
- package/dashboard/dist/assets/{ToolPill-8xY9rkoc.js → ToolPill-BUjbC-Tj.js} +2 -2
- package/dashboard/dist/assets/{ToolPill-8xY9rkoc.js.map → ToolPill-BUjbC-Tj.js.map} +1 -1
- package/dashboard/dist/assets/{ToolTestPanel-E8efYGYs.js → ToolTestPanel-CBtsIP8K.js} +2 -2
- package/dashboard/dist/assets/{ToolTestPanel-E8efYGYs.js.map → ToolTestPanel-CBtsIP8K.js.map} +1 -1
- package/dashboard/dist/assets/{TopicDetailPage-B455XrRc.js → TopicDetailPage-mR4Jaz83.js} +4 -4
- package/dashboard/dist/assets/{TopicDetailPage-B455XrRc.js.map → TopicDetailPage-mR4Jaz83.js.map} +1 -1
- package/dashboard/dist/assets/TopicsPage-CP7HFxIC.js +2 -0
- package/dashboard/dist/assets/{TopicsPage-1VAc29Qw.js.map → TopicsPage-CP7HFxIC.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-DikzjQHJ.js → UserName-BnLF6yhz.js} +2 -2
- package/dashboard/dist/assets/{UserName-DikzjQHJ.js.map → UserName-BnLF6yhz.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowExecutionPage-xL956RZi.js +2 -0
- package/dashboard/dist/assets/WorkflowExecutionPage-xL956RZi.js.map +1 -0
- package/dashboard/dist/assets/{WorkflowPill-Da406nEj.js → WorkflowPill-tXU0-eXu.js} +2 -2
- package/dashboard/dist/assets/{WorkflowPill-Da406nEj.js.map → WorkflowPill-tXU0-eXu.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowsDashboard-B-u7zFKM.js +2 -0
- package/dashboard/dist/assets/{WorkflowsDashboard-BMQd_0tW.js.map → WorkflowsDashboard-B-u7zFKM.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-CdxjVifp.js → WorkflowsOverview-CqZVarK-.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-CdxjVifp.js.map → WorkflowsOverview-CqZVarK-.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-DNVffIXa.js → YamlWorkflowDetailPage-DiFLavW0.js} +10 -10
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-DNVffIXa.js.map → YamlWorkflowDetailPage-DiFLavW0.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowsPage-BGP8wuos.js → YamlWorkflowsPage-BuQM6uZA.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowsPage-BGP8wuos.js.map → YamlWorkflowsPage-BuQM6uZA.js.map} +1 -1
- package/dashboard/dist/assets/{agents-BZJLIJ4h.js → agents-DU9GPovp.js} +2 -2
- package/dashboard/dist/assets/{agents-BZJLIJ4h.js.map → agents-DU9GPovp.js.map} +1 -1
- package/dashboard/dist/assets/{bots-ClLcDGJb.js → bots-Cy-Hmg7w.js} +2 -2
- package/dashboard/dist/assets/{bots-ClLcDGJb.js.map → bots-Cy-Hmg7w.js.map} +1 -1
- package/dashboard/dist/assets/capabilities-sSJJqrp-.js +2 -0
- package/dashboard/dist/assets/{capabilities-IaCcS7ge.js.map → capabilities-sSJJqrp-.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-Zi4m_MSx.js → controlplane-TVCjDHQ-.js} +2 -2
- package/dashboard/dist/assets/{controlplane-Zi4m_MSx.js.map → controlplane-TVCjDHQ-.js.map} +1 -1
- package/dashboard/dist/assets/escalation-columns-BpkjKYGd.js +2 -0
- package/dashboard/dist/assets/escalation-columns-BpkjKYGd.js.map +1 -0
- package/dashboard/dist/assets/index-5TblaCXQ.css +1 -0
- package/dashboard/dist/assets/index-7BP6FaCZ.js +2 -0
- package/dashboard/dist/assets/{index-Dldi3Q3M.js.map → index-7BP6FaCZ.js.map} +1 -1
- package/dashboard/dist/assets/{index-BzkE48xJ.js → index-B7IaBPBg.js} +4 -4
- package/dashboard/dist/assets/{index-BzkE48xJ.js.map → index-B7IaBPBg.js.map} +1 -1
- package/dashboard/dist/assets/index-BE0phFw0.js +2 -0
- package/dashboard/dist/assets/{index-CLmZaNTK.js.map → index-BE0phFw0.js.map} +1 -1
- package/dashboard/dist/assets/{index-BqGnhkh0.js → index-BYNN9N1T.js} +2 -2
- package/dashboard/dist/assets/{index-BqGnhkh0.js.map → index-BYNN9N1T.js.map} +1 -1
- package/dashboard/dist/assets/{index-kiKZresb.js → index-CLPVqbVY.js} +2 -2
- package/dashboard/dist/assets/{index-kiKZresb.js.map → index-CLPVqbVY.js.map} +1 -1
- package/dashboard/dist/assets/{index-C3o4OisO.js → index-Cfv86_L9.js} +2 -2
- package/dashboard/dist/assets/{index-C3o4OisO.js.map → index-Cfv86_L9.js.map} +1 -1
- package/dashboard/dist/assets/{index-yGNt29V9.js → index-CtwbQ_-m.js} +2 -2
- package/dashboard/dist/assets/{index-yGNt29V9.js.map → index-CtwbQ_-m.js.map} +1 -1
- package/dashboard/dist/assets/index-DOai950R.js +3 -0
- package/dashboard/dist/assets/index-DOai950R.js.map +1 -0
- package/dashboard/dist/assets/index-DTtHNC-D.js +5 -0
- package/dashboard/dist/assets/{index-CvNBdkB1.js.map → index-DTtHNC-D.js.map} +1 -1
- package/dashboard/dist/assets/{index-CJu2PBNx.js → index-DsWnVyVN.js} +2 -2
- package/dashboard/dist/assets/{index-CJu2PBNx.js.map → index-DsWnVyVN.js.map} +1 -1
- package/dashboard/dist/assets/{index-D0zFReGL.js → index-Dy-MMYti.js} +2 -2
- package/dashboard/dist/assets/{index-D0zFReGL.js.map → index-Dy-MMYti.js.map} +1 -1
- package/dashboard/dist/assets/index-errgQT5x.js +65 -0
- package/dashboard/dist/assets/index-errgQT5x.js.map +1 -0
- package/dashboard/dist/assets/{index-CmnNqpWg.js → index-fgBDhnI6.js} +2 -2
- package/dashboard/dist/assets/{index-CmnNqpWg.js.map → index-fgBDhnI6.js.map} +1 -1
- package/dashboard/dist/assets/{knowledge-DWLxGTib.js → knowledge-arh4NfmL.js} +2 -2
- package/dashboard/dist/assets/{knowledge-DWLxGTib.js.map → knowledge-arh4NfmL.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-B6AARZ2I.js → mcp-QGf5jHCo.js} +2 -2
- package/dashboard/dist/assets/{mcp-B6AARZ2I.js.map → mcp-QGf5jHCo.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-DrkvBU3a.js → mcp-query-BEJN1nMZ.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-DrkvBU3a.js.map → mcp-query-BEJN1nMZ.js.map} +1 -1
- package/dashboard/dist/assets/{personas-Cmz2SAEU.js → personas-DYtw1COf.js} +2 -2
- package/dashboard/dist/assets/{personas-Cmz2SAEU.js.map → personas-DYtw1COf.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-CSgfVCMy.js → pipelines-Byi6PnbE.js} +2 -2
- package/dashboard/dist/assets/{pipelines-CSgfVCMy.js.map → pipelines-Byi6PnbE.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-UOtUkDk-.js → tasks-D0SQdENz.js} +2 -2
- package/dashboard/dist/assets/{tasks-UOtUkDk-.js.map → tasks-D0SQdENz.js.map} +1 -1
- package/dashboard/dist/assets/{topics-Df5hGh6o.js → topics-DgDv5ZXP.js} +2 -2
- package/dashboard/dist/assets/{topics-Df5hGh6o.js.map → topics-DgDv5ZXP.js.map} +1 -1
- package/dashboard/dist/assets/useEventHooks-DZaYzE7s.js +2 -0
- package/dashboard/dist/assets/{useEventHooks-PDbuSJ12.js.map → useEventHooks-DZaYzE7s.js.map} +1 -1
- package/dashboard/dist/assets/{useNamespace-tZSOlge3.js → useNamespace-C1OqiNXN.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-tZSOlge3.js.map → useNamespace-C1OqiNXN.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-CINLzE32.js → useYamlActivityEvents-CkmXDm-Z.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-CINLzE32.js.map → useYamlActivityEvents-CkmXDm-Z.js.map} +1 -1
- package/dashboard/dist/assets/{users-G8qwyZKS.js → users-D4DCFPH1.js} +2 -2
- package/dashboard/dist/assets/{users-G8qwyZKS.js.map → users-D4DCFPH1.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-BpZiWH2f.js → vendor-icons-BxuyFxH2.js} +156 -136
- package/dashboard/dist/assets/vendor-icons-BxuyFxH2.js.map +1 -0
- package/dashboard/dist/assets/{workflows-DbPqi1TW.js → workflows-qyc0ku_5.js} +2 -2
- package/dashboard/dist/assets/{workflows-DbPqi1TW.js.map → workflows-qyc0ku_5.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-DozD8hpR.js → yaml-workflows-DWFww9Xn.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-DozD8hpR.js.map → yaml-workflows-DWFww9Xn.js.map} +1 -1
- package/dashboard/dist/index.html +3 -3
- package/docs/api/http/escalations.md +133 -0
- package/docs/api/http/roles.md +6 -0
- package/docs/api/mcp/admin.md +53 -0
- package/docs/api/sdk/escalations.md +58 -0
- package/docs/cli.md +11 -0
- package/docs/dashboard.md +22 -20
- package/docs/data.md +12 -4
- package/docs/design-principles.md +9 -7
- package/docs/escalation-analytics.md +251 -0
- package/docs/hitl/roles.md +1 -1
- package/docs/hitl/x-lt-embed.md +8 -4
- package/docs/hitl/x-lt-footer.md +67 -0
- package/docs/hitl/x-lt-list-schema.md +10 -3
- package/docs/hitl-guide.md +11 -2
- package/docs/iam.md +12 -0
- package/docs/operations.md +17 -0
- package/docs/scan-codes.md +112 -0
- package/docs/sdk.md +1 -1
- package/package.json +2 -1
- package/dashboard/dist/assets/AgentsPage-CToVu1qj.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-DldboL4W.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-DldboL4W.js.map +0 -1
- package/dashboard/dist/assets/CountdownTimer-DPjIkerB.js +0 -2
- package/dashboard/dist/assets/CountdownTimer-DPjIkerB.js.map +0 -1
- package/dashboard/dist/assets/EventTable-CwPWl163.js +0 -2
- package/dashboard/dist/assets/EventTable-CwPWl163.js.map +0 -1
- package/dashboard/dist/assets/FilterBar-D7GghUsU.js +0 -2
- package/dashboard/dist/assets/FilterBar-D7GghUsU.js.map +0 -1
- package/dashboard/dist/assets/HomePage-Bcq10Bxx.js +0 -2
- package/dashboard/dist/assets/ListToolbar-IPXsTb3Q.js +0 -2
- package/dashboard/dist/assets/McpQueryPage-CNsuiw_q.js +0 -2
- package/dashboard/dist/assets/McpRunDetailPage-BJguEMS0.js +0 -2
- package/dashboard/dist/assets/McpRunDetailPage-BJguEMS0.js.map +0 -1
- package/dashboard/dist/assets/OperationsPage-DvWrLuH6.js +0 -2
- package/dashboard/dist/assets/OperationsPage-DvWrLuH6.js.map +0 -1
- package/dashboard/dist/assets/OperatorDashboard-C-jE0IRA.js +0 -2
- package/dashboard/dist/assets/RoleDetailPage-BKkUvTO-.js +0 -8
- package/dashboard/dist/assets/RoleDetailPage-BKkUvTO-.js.map +0 -1
- package/dashboard/dist/assets/RolesPage-BHzWK9n6.js +0 -2
- package/dashboard/dist/assets/RolesPage-BHzWK9n6.js.map +0 -1
- package/dashboard/dist/assets/RunAsSelector-CS3KQ-BF.js +0 -2
- package/dashboard/dist/assets/ScanCodesPage-BW4P4zWf.js +0 -2
- package/dashboard/dist/assets/ScanCodesPage-BW4P4zWf.js.map +0 -1
- package/dashboard/dist/assets/ScanSchemeDetailPage-BLykA4j-.js +0 -2
- package/dashboard/dist/assets/ScanSchemeDetailPage-BLykA4j-.js.map +0 -1
- package/dashboard/dist/assets/StickyPagination-hMrnLXde.js +0 -2
- package/dashboard/dist/assets/StickyPagination-hMrnLXde.js.map +0 -1
- package/dashboard/dist/assets/TopicsPage-1VAc29Qw.js +0 -2
- package/dashboard/dist/assets/WorkflowExecutionPage-C15GSAoe.js +0 -2
- package/dashboard/dist/assets/WorkflowExecutionPage-C15GSAoe.js.map +0 -1
- package/dashboard/dist/assets/WorkflowsDashboard-BMQd_0tW.js +0 -2
- package/dashboard/dist/assets/capabilities-IaCcS7ge.js +0 -2
- package/dashboard/dist/assets/escalation-columns-BY2mg9DY.js +0 -2
- package/dashboard/dist/assets/escalation-columns-BY2mg9DY.js.map +0 -1
- package/dashboard/dist/assets/index-CLmZaNTK.js +0 -2
- package/dashboard/dist/assets/index-CfAi1OsI.js +0 -65
- package/dashboard/dist/assets/index-CfAi1OsI.js.map +0 -1
- package/dashboard/dist/assets/index-CvNBdkB1.js +0 -5
- package/dashboard/dist/assets/index-Dldi3Q3M.js +0 -2
- package/dashboard/dist/assets/index-mKcQGi2B.js +0 -3
- package/dashboard/dist/assets/index-mKcQGi2B.js.map +0 -1
- package/dashboard/dist/assets/index-zQiUPfxA.css +0 -1
- package/dashboard/dist/assets/useEventHooks-PDbuSJ12.js +0 -2
- package/dashboard/dist/assets/vendor-icons-BpZiWH2f.js.map +0 -1
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* x-lt-labels — configurable copy for the standard escalation footer. A
|
|
3
|
+
* form_schema may declare, at its schema root, an object that renames the
|
|
4
|
+
* footer's action controls. Each key is a standard target; its value is the
|
|
5
|
+
* label to render in place of the default.
|
|
6
|
+
*
|
|
7
|
+
* x-lt-labels object — { claim, cancel, submit, escalate, release }
|
|
8
|
+
*
|
|
9
|
+
* ```jsonc
|
|
10
|
+
* { "x-lt-labels": { "claim": "Claim and Submit", "submit": "Approve" } }
|
|
11
|
+
* ```
|
|
12
|
+
*
|
|
13
|
+
* Only the five known targets are read; unknown keys and non-string values are
|
|
14
|
+
* ignored. Any target the schema omits keeps its default label, so a schema
|
|
15
|
+
* overrides just the controls it cares about.
|
|
16
|
+
*/
|
|
17
|
+
export declare const X_LT_LABELS = "x-lt-labels";
|
|
18
|
+
/** The footer controls a schema may rename. */
|
|
19
|
+
export declare const FOOTER_LABEL_TARGETS: readonly ["claim", "cancel", "submit", "escalate", "release"];
|
|
20
|
+
export type FooterLabelTarget = (typeof FOOTER_LABEL_TARGETS)[number];
|
|
21
|
+
/** A partial map of target → override label. Absent targets keep their default. */
|
|
22
|
+
export type FooterLabels = Partial<Record<FooterLabelTarget, string>>;
|
|
23
|
+
/**
|
|
24
|
+
* The schema's footer label overrides, or an empty map when none are declared.
|
|
25
|
+
* Reads only the known targets; a non-object `x-lt-labels`, unknown keys, and
|
|
26
|
+
* blank or non-string values are dropped.
|
|
27
|
+
*/
|
|
28
|
+
export declare function readFooterLabels(schema: Record<string, unknown> | null | undefined): FooterLabels;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* x-lt-labels — configurable copy for the standard escalation footer. A
|
|
4
|
+
* form_schema may declare, at its schema root, an object that renames the
|
|
5
|
+
* footer's action controls. Each key is a standard target; its value is the
|
|
6
|
+
* label to render in place of the default.
|
|
7
|
+
*
|
|
8
|
+
* x-lt-labels object — { claim, cancel, submit, escalate, release }
|
|
9
|
+
*
|
|
10
|
+
* ```jsonc
|
|
11
|
+
* { "x-lt-labels": { "claim": "Claim and Submit", "submit": "Approve" } }
|
|
12
|
+
* ```
|
|
13
|
+
*
|
|
14
|
+
* Only the five known targets are read; unknown keys and non-string values are
|
|
15
|
+
* ignored. Any target the schema omits keeps its default label, so a schema
|
|
16
|
+
* overrides just the controls it cares about.
|
|
17
|
+
*/
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.FOOTER_LABEL_TARGETS = exports.X_LT_LABELS = void 0;
|
|
20
|
+
exports.readFooterLabels = readFooterLabels;
|
|
21
|
+
exports.X_LT_LABELS = 'x-lt-labels';
|
|
22
|
+
/** The footer controls a schema may rename. */
|
|
23
|
+
exports.FOOTER_LABEL_TARGETS = ['claim', 'cancel', 'submit', 'escalate', 'release'];
|
|
24
|
+
/**
|
|
25
|
+
* The schema's footer label overrides, or an empty map when none are declared.
|
|
26
|
+
* Reads only the known targets; a non-object `x-lt-labels`, unknown keys, and
|
|
27
|
+
* blank or non-string values are dropped.
|
|
28
|
+
*/
|
|
29
|
+
function readFooterLabels(schema) {
|
|
30
|
+
const raw = schema?.[exports.X_LT_LABELS];
|
|
31
|
+
if (!raw || typeof raw !== 'object' || Array.isArray(raw))
|
|
32
|
+
return {};
|
|
33
|
+
const source = raw;
|
|
34
|
+
const labels = {};
|
|
35
|
+
for (const target of exports.FOOTER_LABEL_TARGETS) {
|
|
36
|
+
const value = source[target];
|
|
37
|
+
if (typeof value === 'string' && value.trim().length > 0) {
|
|
38
|
+
labels[target] = value.trim();
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return labels;
|
|
42
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { ShowIfContext } from './x-lt-show-if';
|
|
2
|
+
/**
|
|
3
|
+
* The embedded escalation query shape shared by `x-lt-query` (escalation-list
|
|
4
|
+
* widget) and `x-lt-submit-guard.query` (form-level submit gate). String
|
|
5
|
+
* values inside `facets` support `{{domain.path}}` token interpolation against
|
|
6
|
+
* the host escalation's context. Isomorphic: the dashboard renders embeds from
|
|
7
|
+
* it, and the API layer enforces the submit gate from the identical mapping.
|
|
8
|
+
*
|
|
9
|
+
* `assigned` is the ownership scope. Ownership is not a separate list — it is
|
|
10
|
+
* one more dimension of the same faceted query language the escalation API
|
|
11
|
+
* composes server-side ("claimed" is the implied status: pending, held, claim
|
|
12
|
+
* window live):
|
|
13
|
+
* - `"me"` — rows claimed by the viewing user (the walk case: I walk what I own)
|
|
14
|
+
* - `"any"` — all matching rows regardless of claim state
|
|
15
|
+
* - omitted — available rows only (unclaimed, or claim window lapsed)
|
|
16
|
+
*/
|
|
17
|
+
export interface EmbedQuery {
|
|
18
|
+
role?: string;
|
|
19
|
+
status?: string;
|
|
20
|
+
facets?: Record<string, string>;
|
|
21
|
+
limit?: number;
|
|
22
|
+
assigned?: 'me' | 'any';
|
|
23
|
+
/** Superseded by `assigned`; honored only when `assigned` is omitted. */
|
|
24
|
+
available?: boolean;
|
|
25
|
+
}
|
|
26
|
+
/** Interpolate `{{domain.path}}` tokens in every string value of the facets map. */
|
|
27
|
+
export declare function resolveQueryFacets(facets: Record<string, string> | undefined, ctx: ShowIfContext): Record<string, unknown>;
|
|
28
|
+
/** The escalation-query params an EmbedQuery resolves to — the exact input
|
|
29
|
+
* shape of `useEscalations`, so every embed surface queries identically. */
|
|
30
|
+
export interface ScopedQueryParams {
|
|
31
|
+
role?: string;
|
|
32
|
+
status: string;
|
|
33
|
+
facets: Record<string, unknown>;
|
|
34
|
+
assigned_to?: string;
|
|
35
|
+
available?: boolean;
|
|
36
|
+
limit?: number;
|
|
37
|
+
enabled: boolean;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Resolve an EmbedQuery into concrete escalation-query params — the ONE
|
|
41
|
+
* mapping every embed surface (escalation-list, x-lt-actions, x-lt-submit-guard)
|
|
42
|
+
* consumes, so the visible rows and any count derived from the same query can
|
|
43
|
+
* never disagree.
|
|
44
|
+
*
|
|
45
|
+
* Ownership scope translates into the faceted query language:
|
|
46
|
+
* - `assigned: "me"` → `assigned_to = viewer AND available = false` — the
|
|
47
|
+
* implied "claimed" status (pending + live claim window held by the viewer)
|
|
48
|
+
* - `assigned: "any"` → no ownership constraint
|
|
49
|
+
* - omitted → `available = true` (the unclaimed pool; a declared
|
|
50
|
+
* legacy `available` value is honored)
|
|
51
|
+
*
|
|
52
|
+
* When `assigned: "me"` and no viewer id is supplied (a surface with no
|
|
53
|
+
* resolving user, e.g. an MCP resolve), the scope cannot be evaluated —
|
|
54
|
+
* `enabled` is false rather than silently widening to another scope.
|
|
55
|
+
*/
|
|
56
|
+
export declare function resolveScopedQuery(query: EmbedQuery, ctx: ShowIfContext, viewerId: string | undefined): ScopedQueryParams;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveQueryFacets = resolveQueryFacets;
|
|
4
|
+
exports.resolveScopedQuery = resolveScopedQuery;
|
|
5
|
+
const x_lt_help_1 = require("./x-lt-help");
|
|
6
|
+
/** Interpolate `{{domain.path}}` tokens in every string value of the facets map. */
|
|
7
|
+
function resolveQueryFacets(facets, ctx) {
|
|
8
|
+
if (!facets)
|
|
9
|
+
return {};
|
|
10
|
+
const resolved = {};
|
|
11
|
+
for (const [k, v] of Object.entries(facets)) {
|
|
12
|
+
resolved[k] = typeof v === 'string' ? (0, x_lt_help_1.interpolateHelp)(v, ctx) : v;
|
|
13
|
+
}
|
|
14
|
+
return resolved;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Resolve an EmbedQuery into concrete escalation-query params — the ONE
|
|
18
|
+
* mapping every embed surface (escalation-list, x-lt-actions, x-lt-submit-guard)
|
|
19
|
+
* consumes, so the visible rows and any count derived from the same query can
|
|
20
|
+
* never disagree.
|
|
21
|
+
*
|
|
22
|
+
* Ownership scope translates into the faceted query language:
|
|
23
|
+
* - `assigned: "me"` → `assigned_to = viewer AND available = false` — the
|
|
24
|
+
* implied "claimed" status (pending + live claim window held by the viewer)
|
|
25
|
+
* - `assigned: "any"` → no ownership constraint
|
|
26
|
+
* - omitted → `available = true` (the unclaimed pool; a declared
|
|
27
|
+
* legacy `available` value is honored)
|
|
28
|
+
*
|
|
29
|
+
* When `assigned: "me"` and no viewer id is supplied (a surface with no
|
|
30
|
+
* resolving user, e.g. an MCP resolve), the scope cannot be evaluated —
|
|
31
|
+
* `enabled` is false rather than silently widening to another scope.
|
|
32
|
+
*/
|
|
33
|
+
function resolveScopedQuery(query, ctx, viewerId) {
|
|
34
|
+
const facets = resolveQueryFacets(query.facets, ctx);
|
|
35
|
+
const base = {
|
|
36
|
+
role: query.role,
|
|
37
|
+
status: query.status ?? 'pending',
|
|
38
|
+
facets,
|
|
39
|
+
limit: query.limit,
|
|
40
|
+
enabled: !!(query.role || Object.keys(facets).length),
|
|
41
|
+
};
|
|
42
|
+
if (query.assigned === 'me') {
|
|
43
|
+
return { ...base, assigned_to: viewerId, available: false, enabled: base.enabled && !!viewerId };
|
|
44
|
+
}
|
|
45
|
+
if (query.assigned === 'any') {
|
|
46
|
+
return base;
|
|
47
|
+
}
|
|
48
|
+
return { ...base, available: query.available ?? true };
|
|
49
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* x-lt-submit-guard — a query precondition on the resolve. A form_schema may
|
|
3
|
+
* declare, at its root, that the escalation cannot be resolved while an embedded
|
|
4
|
+
* escalation query still returns rows: the parent references a set of children
|
|
5
|
+
* (commonly claimed by the same person) that must all be completed first, a
|
|
6
|
+
* to-do list that empties as children resolve.
|
|
7
|
+
*
|
|
8
|
+
* "x-lt-submit-guard": {
|
|
9
|
+
* "query": { "role": "print-harvest", "status": "pending",
|
|
10
|
+
* "assigned": "me",
|
|
11
|
+
* "facets": { "walkId": "{{metadata.walkId}}" } },
|
|
12
|
+
* "mustBeEmpty": true, // the only mode today; defaults true
|
|
13
|
+
* "message": "{{count}} plates still pending — bag them before closing.",
|
|
14
|
+
* "autoResolveWhenEmpty": true // auto-submit the parent once empty
|
|
15
|
+
* }
|
|
16
|
+
*
|
|
17
|
+
* The gate is isomorphic. The dashboard disables the submit while the query
|
|
18
|
+
* returns rows (UI honesty), and the API layer enforces the same precondition
|
|
19
|
+
* for `enforce_schema` roles so a raw-API resolve is rejected too. Only a
|
|
20
|
+
* confirmed empty result (a successful read with zero rows) clears the gate — a
|
|
21
|
+
* 403 or any error never does.
|
|
22
|
+
*
|
|
23
|
+
* `autoResolveWhenEmpty` closes the loop: the moment the query is confirmed
|
|
24
|
+
* empty, the claimed parent auto-submits — checked on page-load and after each
|
|
25
|
+
* inline child-resolve — so a set of escalations completes with no extra click.
|
|
26
|
+
*/
|
|
27
|
+
import type { EmbedQuery } from './x-lt-query';
|
|
28
|
+
export declare const X_LT_SUBMIT_GUARD = "x-lt-submit-guard";
|
|
29
|
+
export interface SubmitGuardDef {
|
|
30
|
+
query: EmbedQuery;
|
|
31
|
+
/** The gate condition; defaults to true (the only supported mode today). */
|
|
32
|
+
mustBeEmpty?: boolean;
|
|
33
|
+
/** Shown beside the disabled submit. `{{count}}` and `{{domain.path}}` tokens interpolate. */
|
|
34
|
+
message?: string;
|
|
35
|
+
/** When true, auto-submit the claimed parent the moment the query is confirmed empty. */
|
|
36
|
+
autoResolveWhenEmpty?: boolean;
|
|
37
|
+
}
|
|
38
|
+
export declare const SUBMIT_GUARD_DEFAULT_MESSAGE = "{{count}} related items are still pending";
|
|
39
|
+
/** The schema's submit-guard, or undefined when it declares none. */
|
|
40
|
+
export declare function readSubmitGuard(schema: Record<string, unknown> | null | undefined): SubmitGuardDef | undefined;
|
|
41
|
+
/**
|
|
42
|
+
* Whether a guard blocks the resolve given the query's row count. `mustBeEmpty`
|
|
43
|
+
* defaults to true, so any matching row blocks. A pure decision — the caller
|
|
44
|
+
* supplies the count from a confirmed read (never an error/loading state).
|
|
45
|
+
*/
|
|
46
|
+
export declare function guardBlocks(count: number, guard: SubmitGuardDef | undefined): boolean;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SUBMIT_GUARD_DEFAULT_MESSAGE = exports.X_LT_SUBMIT_GUARD = void 0;
|
|
4
|
+
exports.readSubmitGuard = readSubmitGuard;
|
|
5
|
+
exports.guardBlocks = guardBlocks;
|
|
6
|
+
exports.X_LT_SUBMIT_GUARD = 'x-lt-submit-guard';
|
|
7
|
+
exports.SUBMIT_GUARD_DEFAULT_MESSAGE = '{{count}} related items are still pending';
|
|
8
|
+
/** The schema's submit-guard, or undefined when it declares none. */
|
|
9
|
+
function readSubmitGuard(schema) {
|
|
10
|
+
const raw = schema?.[exports.X_LT_SUBMIT_GUARD];
|
|
11
|
+
if (!raw || typeof raw !== 'object' || Array.isArray(raw))
|
|
12
|
+
return undefined;
|
|
13
|
+
const guard = raw;
|
|
14
|
+
if (!guard.query || typeof guard.query !== 'object')
|
|
15
|
+
return undefined;
|
|
16
|
+
return guard;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Whether a guard blocks the resolve given the query's row count. `mustBeEmpty`
|
|
20
|
+
* defaults to true, so any matching row blocks. A pure decision — the caller
|
|
21
|
+
* supplies the count from a confirmed read (never an error/loading state).
|
|
22
|
+
*/
|
|
23
|
+
function guardBlocks(count, guard) {
|
|
24
|
+
return !!guard && guard.mustBeEmpty !== false && count > 0;
|
|
25
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* x-lt-submit-on-claim — a one-gesture claim. A form_schema may declare, at its
|
|
3
|
+
* schema root, that claiming one of its escalations should also resolve it in
|
|
4
|
+
* the same gesture, submitting whatever the form currently holds (its seeded
|
|
5
|
+
* defaults). The person clicks Claim once and the work item advances — no
|
|
6
|
+
* second Submit step.
|
|
7
|
+
*
|
|
8
|
+
* x-lt-submit-on-claim boolean — opt in to claim-and-submit
|
|
9
|
+
*
|
|
10
|
+
* It is opt-in and defaults off. Pair it with `x-lt-labels` to rename the Claim
|
|
11
|
+
* button ("Claim and Submit") so the single gesture reads honestly. When the
|
|
12
|
+
* seeded defaults fail validation the claim still lands; the page drops into the
|
|
13
|
+
* normal claimed state with the field errors surfaced, so the person finishes
|
|
14
|
+
* the form by hand.
|
|
15
|
+
*/
|
|
16
|
+
export declare const X_LT_SUBMIT_ON_CLAIM = "x-lt-submit-on-claim";
|
|
17
|
+
/**
|
|
18
|
+
* Whether the schema opts into claim-and-submit. Truthy `x-lt-submit-on-claim`
|
|
19
|
+
* turns it on; anything else (absent, false) leaves the standard two-step claim
|
|
20
|
+
* then submit.
|
|
21
|
+
*/
|
|
22
|
+
export declare function readSubmitOnClaim(schema: Record<string, unknown> | null | undefined): boolean;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* x-lt-submit-on-claim — a one-gesture claim. A form_schema may declare, at its
|
|
4
|
+
* schema root, that claiming one of its escalations should also resolve it in
|
|
5
|
+
* the same gesture, submitting whatever the form currently holds (its seeded
|
|
6
|
+
* defaults). The person clicks Claim once and the work item advances — no
|
|
7
|
+
* second Submit step.
|
|
8
|
+
*
|
|
9
|
+
* x-lt-submit-on-claim boolean — opt in to claim-and-submit
|
|
10
|
+
*
|
|
11
|
+
* It is opt-in and defaults off. Pair it with `x-lt-labels` to rename the Claim
|
|
12
|
+
* button ("Claim and Submit") so the single gesture reads honestly. When the
|
|
13
|
+
* seeded defaults fail validation the claim still lands; the page drops into the
|
|
14
|
+
* normal claimed state with the field errors surfaced, so the person finishes
|
|
15
|
+
* the form by hand.
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.X_LT_SUBMIT_ON_CLAIM = void 0;
|
|
19
|
+
exports.readSubmitOnClaim = readSubmitOnClaim;
|
|
20
|
+
exports.X_LT_SUBMIT_ON_CLAIM = 'x-lt-submit-on-claim';
|
|
21
|
+
/**
|
|
22
|
+
* Whether the schema opts into claim-and-submit. Truthy `x-lt-submit-on-claim`
|
|
23
|
+
* turns it on; anything else (absent, false) leaves the standard two-step claim
|
|
24
|
+
* then submit.
|
|
25
|
+
*/
|
|
26
|
+
function readSubmitOnClaim(schema) {
|
|
27
|
+
return !!schema?.[exports.X_LT_SUBMIT_ON_CLAIM];
|
|
28
|
+
}
|
|
@@ -259,6 +259,40 @@ function registerEscalationTools(server) {
|
|
|
259
259
|
}
|
|
260
260
|
return { content: [{ type: 'text', text: JSON.stringify(result.data) }] };
|
|
261
261
|
});
|
|
262
|
+
// mirrors POST /api/escalations/aggregate-by-facets
|
|
263
|
+
server.registerTool('aggregate_by_facets', {
|
|
264
|
+
title: 'Aggregate by Facets',
|
|
265
|
+
description: 'Grouped analytics over the escalation intervals. Every escalation is one open ' +
|
|
266
|
+
'interval [created_at, ended_at); this tool reads it two ways: membership (rows or, ' +
|
|
267
|
+
'with distinctBy, distinct entities open at an instant — a past asOf reconstructs the ' +
|
|
268
|
+
'live set then) and dwell (open-seconds per group within a half-open [from,to) window). ' +
|
|
269
|
+
'Group by role/subtype/status columns plus metadata facet keys; optional states[] label ' +
|
|
270
|
+
'each group. One call replaces N per-filter count round-trips. The filter takes the WHAT ' +
|
|
271
|
+
'fields only — status/available/jeopardy are rejected (liveness derives from the measure).',
|
|
272
|
+
inputSchema: schemas_1.aggregateByFacetsSchema,
|
|
273
|
+
}, async (args) => {
|
|
274
|
+
const result = await escalationApi.aggregateByFacets(args, await systemAuth());
|
|
275
|
+
if (result.error) {
|
|
276
|
+
return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
|
|
277
|
+
}
|
|
278
|
+
return { content: [{ type: 'text', text: JSON.stringify(result.data) }] };
|
|
279
|
+
});
|
|
280
|
+
// mirrors POST /api/escalations/timeline-by-facet
|
|
281
|
+
server.registerTool('timeline_by_facet', {
|
|
282
|
+
title: 'Timeline by Facet',
|
|
283
|
+
description: 'One entity\'s ordered interval sequence — every escalation the entity facet ' +
|
|
284
|
+
'(e.g. a machine id) appeared in, as [startedAt, endedAt) spans with durations, in ' +
|
|
285
|
+
'created_at order. Open intervals report endedAt: null. Gaps between consecutive ' +
|
|
286
|
+
'intervals are untracked time and are preserved, not filled. The entity facet value ' +
|
|
287
|
+
'must be stored as a JSON string (GIN containment match).',
|
|
288
|
+
inputSchema: schemas_1.timelineByFacetSchema,
|
|
289
|
+
}, async (args) => {
|
|
290
|
+
const result = await escalationApi.timelineByFacet(args, await systemAuth());
|
|
291
|
+
if (result.error) {
|
|
292
|
+
return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
|
|
293
|
+
}
|
|
294
|
+
return { content: [{ type: 'text', text: JSON.stringify(result.data) }] };
|
|
295
|
+
});
|
|
262
296
|
// mirrors POST /api/escalations/claim-groups
|
|
263
297
|
server.registerTool('claim_groups', {
|
|
264
298
|
title: 'Claim Groups',
|
|
@@ -56,7 +56,23 @@ function registerScanCodeTools(server) {
|
|
|
56
56
|
'no_match_fallback, unconfigured, invalid_code, forbidden, conflict).',
|
|
57
57
|
inputSchema: schemas_1.executeScanCodeSchema,
|
|
58
58
|
}, async (args) => {
|
|
59
|
-
const result = await scanCodesApi.executeScanCode({
|
|
59
|
+
const result = await scanCodesApi.executeScanCode({
|
|
60
|
+
code: args.code,
|
|
61
|
+
actingToken: args.actingToken,
|
|
62
|
+
previousActingToken: args.previousActingToken,
|
|
63
|
+
}, await systemAuth());
|
|
64
|
+
return asText(result.data ?? { error: result.error });
|
|
65
|
+
});
|
|
66
|
+
// mirrors POST /api/scan-codes/execute-choice
|
|
67
|
+
server.registerTool('execute_scan_choice', {
|
|
68
|
+
title: 'Execute Scan Choice',
|
|
69
|
+
description: 'Execute one choice presented by a PRESENT step (the info-choice screen). ' +
|
|
70
|
+
'The pointer (scheme/category/step/choice + escalationId) is re-validated ' +
|
|
71
|
+
'against live config, the row\'s current state, the acting-identity gate, ' +
|
|
72
|
+
'and RBAC before the verb runs.',
|
|
73
|
+
inputSchema: schemas_1.executeScanChoiceSchema,
|
|
74
|
+
}, async (args) => {
|
|
75
|
+
const result = await scanCodesApi.executeScanChoice(args, await systemAuth());
|
|
60
76
|
return asText(result.data ?? { error: result.error });
|
|
61
77
|
});
|
|
62
78
|
// mirrors GET /api/scan-codes/schemes
|