@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
|
@@ -35,11 +35,11 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.executeScanCode = executeScanCode;
|
|
37
37
|
const scanCodeService = __importStar(require("../../services/scan-code"));
|
|
38
|
-
const
|
|
39
|
-
const
|
|
40
|
-
const
|
|
41
|
-
const
|
|
42
|
-
const
|
|
38
|
+
const identity_1 = require("./identity");
|
|
39
|
+
const context_1 = require("./context");
|
|
40
|
+
const locate_1 = require("./locate");
|
|
41
|
+
const present_1 = require("./present");
|
|
42
|
+
const verbs_1 = require("./verbs");
|
|
43
43
|
const types_1 = require("../../types");
|
|
44
44
|
/**
|
|
45
45
|
* Execute a raw scan code: parse → load the rule → walk its steps in order.
|
|
@@ -75,9 +75,36 @@ async function executeScanCode(input, auth) {
|
|
|
75
75
|
},
|
|
76
76
|
};
|
|
77
77
|
}
|
|
78
|
+
// 2a. Identity schemes are the badge layer — they mint, never walk steps.
|
|
79
|
+
if (scheme.kind === types_1.SCAN_SCHEME_KINDS.IDENTITY) {
|
|
80
|
+
return (0, identity_1.executeIdentityScan)(parsed, scheme, rule, input.previousActingToken);
|
|
81
|
+
}
|
|
82
|
+
// 2b. A supplied acting grant is exchanged once, up front — the acting
|
|
83
|
+
// user's read scope must govern the locate as much as the mutation. A
|
|
84
|
+
// dead grant terminates loudly; silently degrading to the station
|
|
85
|
+
// identity would misattribute whatever follows.
|
|
86
|
+
let effectiveAuth = auth;
|
|
87
|
+
let acting = false;
|
|
88
|
+
if (input.actingToken) {
|
|
89
|
+
const resolved = await (0, identity_1.resolveActingAuth)(input.actingToken);
|
|
90
|
+
if (!resolved.ok) {
|
|
91
|
+
return {
|
|
92
|
+
status: 200,
|
|
93
|
+
data: {
|
|
94
|
+
outcome: types_1.SCAN_OUTCOMES.NOT_PRIMED,
|
|
95
|
+
parsed,
|
|
96
|
+
notPrimed: rule.notPrimed,
|
|
97
|
+
error: resolved.error,
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
effectiveAuth = resolved.auth;
|
|
102
|
+
acting = true;
|
|
103
|
+
}
|
|
78
104
|
// 3. Walk the steps — first condition match wins
|
|
79
105
|
const ctx = {
|
|
80
|
-
scheme, rule, parsed, scannedAt: new Date().toISOString(),
|
|
106
|
+
scheme, rule, parsed, scannedAt: new Date().toISOString(),
|
|
107
|
+
auth: effectiveAuth, stationAuth: auth, acting,
|
|
81
108
|
};
|
|
82
109
|
for (let i = 0; i < rule.steps.length; i++) {
|
|
83
110
|
const result = await executeStep(rule.steps[i], i, ctx);
|
|
@@ -117,256 +144,34 @@ function decorateData(data, ctx) {
|
|
|
117
144
|
* (fall through) and an LTApiResult for every terminal outcome.
|
|
118
145
|
*/
|
|
119
146
|
async function executeStep(step, index, ctx) {
|
|
147
|
+
// The identity pre-condition: the effective actor must be a real acting
|
|
148
|
+
// identity — a badge grant, or an authenticated user whose own write scope
|
|
149
|
+
// covers the step. A write-incapable shared account can never self-satisfy,
|
|
150
|
+
// so the outcome is the rule's "scan your badge" screen, never a silent or
|
|
151
|
+
// misattributed action.
|
|
152
|
+
if (step.requireActingIdentity && !(await (0, identity_1.actingIdentitySatisfied)(step, ctx))) {
|
|
153
|
+
return (0, context_1.notPrimed)(ctx);
|
|
154
|
+
}
|
|
120
155
|
// Confirm steps and read verbs only locate — mutation happens after the
|
|
121
156
|
// user confirms, through the standard per-id endpoints.
|
|
122
157
|
if (step.confirm || step.verb === types_1.SCAN_VERBS.SHOW_DETAIL || step.verb === types_1.SCAN_VERBS.SHOW_LIST) {
|
|
123
|
-
return locateStep(step, ctx);
|
|
158
|
+
return (0, locate_1.locateStep)(step, ctx);
|
|
124
159
|
}
|
|
125
160
|
switch (step.verb) {
|
|
161
|
+
case types_1.SCAN_VERBS.PRESENT:
|
|
162
|
+
return (0, present_1.presentStep)(step, ctx);
|
|
126
163
|
case types_1.SCAN_VERBS.CLAIM:
|
|
127
164
|
case types_1.SCAN_VERBS.CLAIM_SHOW_DETAIL:
|
|
128
|
-
return claimStep(step, ctx);
|
|
165
|
+
return (0, verbs_1.claimStep)(step, ctx);
|
|
129
166
|
case types_1.SCAN_VERBS.RESOLVE:
|
|
130
|
-
return resolveStep(step, ctx);
|
|
167
|
+
return (0, verbs_1.resolveStep)(step, ctx);
|
|
131
168
|
case types_1.SCAN_VERBS.ESCALATE:
|
|
132
|
-
return escalateStep(step, ctx);
|
|
169
|
+
return (0, verbs_1.escalateStep)(step, ctx);
|
|
133
170
|
case types_1.SCAN_VERBS.RELEASE:
|
|
134
|
-
return releaseStep(step, ctx);
|
|
171
|
+
return (0, verbs_1.releaseStep)(step, ctx);
|
|
135
172
|
case types_1.SCAN_VERBS.CANCEL:
|
|
136
|
-
return cancelStep(step, ctx);
|
|
173
|
+
return (0, verbs_1.cancelStep)(step, ctx);
|
|
137
174
|
default:
|
|
138
175
|
throw new Error(`unknown scan verb "${step.verb}"`);
|
|
139
176
|
}
|
|
140
177
|
}
|
|
141
|
-
// ── Shared pieces ──────────────────────────────────────────────────────────
|
|
142
|
-
function targetFilter(step, ctx) {
|
|
143
|
-
return { [ctx.scheme.target_facet]: ctx.parsed.target, ...(step.query?.facets ?? {}) };
|
|
144
|
-
}
|
|
145
|
-
function templateContext(ctx) {
|
|
146
|
-
return { target: ctx.parsed.target, category: ctx.parsed.category, scannedAt: ctx.scannedAt };
|
|
147
|
-
}
|
|
148
|
-
function provenance(ctx) {
|
|
149
|
-
return {
|
|
150
|
-
[types_1.SCAN_PROVENANCE_KEYS.SCHEME]: ctx.scheme.version,
|
|
151
|
-
[types_1.SCAN_PROVENANCE_KEYS.CATEGORY]: ctx.parsed.category,
|
|
152
|
-
[types_1.SCAN_PROVENANCE_KEYS.ACTION_NAME]: ctx.rule.name,
|
|
153
|
-
[types_1.SCAN_PROVENANCE_KEYS.SCANNED_AT]: ctx.scannedAt,
|
|
154
|
-
};
|
|
155
|
-
}
|
|
156
|
-
function executed(escalation, step) {
|
|
157
|
-
return { status: 200, data: { outcome: types_1.SCAN_OUTCOMES.EXECUTED, verb: step.verb, escalation } };
|
|
158
|
-
}
|
|
159
|
-
// ── Locate (show-detail, show-list, confirm phase 1) ───────────────────────
|
|
160
|
-
async function locateStep(step, ctx) {
|
|
161
|
-
const scope = await (0, helpers_1.getEscalationReadScope)(ctx.auth.userId);
|
|
162
|
-
const availability = step.query?.availability ?? types_1.SCAN_AVAILABILITY.ANY;
|
|
163
|
-
const status = step.query?.status ?? 'pending';
|
|
164
|
-
const wantMany = step.verb === types_1.SCAN_VERBS.SHOW_LIST
|
|
165
|
-
|| step.cardinality === types_1.SCAN_CARDINALITY.MANY;
|
|
166
|
-
const limit = wantMany ? 50 : 2;
|
|
167
|
-
const facets = targetFilter(step, ctx);
|
|
168
|
-
let escalations;
|
|
169
|
-
let total;
|
|
170
|
-
if (availability === types_1.SCAN_AVAILABILITY.MINE) {
|
|
171
|
-
// "mine" = assigned to the caller; self-scope roles qualify because the
|
|
172
|
-
// assigned_to predicate satisfies their visibility branch.
|
|
173
|
-
const readable = [...scope.allRoles, ...scope.selfRoles];
|
|
174
|
-
const roles = (0, metadata_1.restrictScopeRoles)(readable, scope.global, step.query?.roles);
|
|
175
|
-
if (roles !== null && roles.length === 0)
|
|
176
|
-
return null;
|
|
177
|
-
const result = await escalationService.listEscalations({
|
|
178
|
-
metadata: facets,
|
|
179
|
-
status,
|
|
180
|
-
assigned_to: ctx.auth.userId,
|
|
181
|
-
visibleRoles: roles ?? undefined,
|
|
182
|
-
limit,
|
|
183
|
-
});
|
|
184
|
-
escalations = result.escalations;
|
|
185
|
-
total = result.total;
|
|
186
|
-
}
|
|
187
|
-
else {
|
|
188
|
-
const roles = (0, metadata_1.restrictScopeRoles)(scope.allRoles, scope.global, step.query?.roles);
|
|
189
|
-
if (roles !== null && roles.length === 0)
|
|
190
|
-
return null;
|
|
191
|
-
const result = await escalationService.searchByFacets({
|
|
192
|
-
roles: roles ?? undefined,
|
|
193
|
-
facets,
|
|
194
|
-
status,
|
|
195
|
-
available: availability === types_1.SCAN_AVAILABILITY.AVAILABLE
|
|
196
|
-
? true
|
|
197
|
-
: availability === types_1.SCAN_AVAILABILITY.CLAIMED ? false : undefined,
|
|
198
|
-
limit,
|
|
199
|
-
});
|
|
200
|
-
escalations = result.escalations;
|
|
201
|
-
total = result.total;
|
|
202
|
-
}
|
|
203
|
-
if (escalations.length === 0)
|
|
204
|
-
return null;
|
|
205
|
-
if (step.confirm) {
|
|
206
|
-
const target = escalations[0];
|
|
207
|
-
const interpolated = step.params
|
|
208
|
-
? scanCodeService.interpolateScanTemplate(step.params, templateContext(ctx))
|
|
209
|
-
: undefined;
|
|
210
|
-
return {
|
|
211
|
-
status: 200,
|
|
212
|
-
data: {
|
|
213
|
-
outcome: types_1.SCAN_OUTCOMES.CONFIRM_REQUIRED,
|
|
214
|
-
verb: step.verb,
|
|
215
|
-
escalation: target,
|
|
216
|
-
pendingAction: {
|
|
217
|
-
escalationId: target.id,
|
|
218
|
-
verb: step.verb,
|
|
219
|
-
prompt: step.confirm.prompt,
|
|
220
|
-
params: interpolated,
|
|
221
|
-
},
|
|
222
|
-
},
|
|
223
|
-
};
|
|
224
|
-
}
|
|
225
|
-
if (wantMany) {
|
|
226
|
-
return {
|
|
227
|
-
status: 200,
|
|
228
|
-
data: {
|
|
229
|
-
outcome: types_1.SCAN_OUTCOMES.MATCHED_LIST,
|
|
230
|
-
verb: step.verb,
|
|
231
|
-
escalations,
|
|
232
|
-
total,
|
|
233
|
-
listQuery: {
|
|
234
|
-
...step.query,
|
|
235
|
-
targetFacet: ctx.scheme.target_facet,
|
|
236
|
-
target: ctx.parsed.target,
|
|
237
|
-
},
|
|
238
|
-
},
|
|
239
|
-
};
|
|
240
|
-
}
|
|
241
|
-
return executed(escalations[0], step);
|
|
242
|
-
}
|
|
243
|
-
// ── Mutating verbs — each a single atomic operation under the caller's RBAC ─
|
|
244
|
-
async function claimStep(step, ctx) {
|
|
245
|
-
const result = await (0, metadata_1.claimByMetadata)({
|
|
246
|
-
key: ctx.scheme.target_facet,
|
|
247
|
-
value: ctx.parsed.target,
|
|
248
|
-
durationMinutes: step.params?.durationMinutes,
|
|
249
|
-
metadata: { ...interpolatedMetadata(step, ctx), ...provenance(ctx) },
|
|
250
|
-
restrictRoles: step.query?.roles,
|
|
251
|
-
}, ctx.auth);
|
|
252
|
-
if (result.status === 404)
|
|
253
|
-
return null;
|
|
254
|
-
if (result.status === 403)
|
|
255
|
-
return forbidden(result.error);
|
|
256
|
-
if (result.status !== 200)
|
|
257
|
-
return result;
|
|
258
|
-
return executed(result.data.escalation, step);
|
|
259
|
-
}
|
|
260
|
-
async function resolveStep(step, ctx) {
|
|
261
|
-
const result = await (0, metadata_1.resolveByMetadata)({
|
|
262
|
-
key: ctx.scheme.target_facet,
|
|
263
|
-
value: ctx.parsed.target,
|
|
264
|
-
resolverPayload: scanCodeService.interpolateScanTemplate(step.params?.resolverPayload ?? {}, templateContext(ctx)),
|
|
265
|
-
metadata: { ...interpolatedMetadata(step, ctx), ...provenance(ctx) },
|
|
266
|
-
restrictRoles: step.query?.roles,
|
|
267
|
-
extraFacets: step.query?.facets,
|
|
268
|
-
}, ctx.auth);
|
|
269
|
-
if (result.status === 404)
|
|
270
|
-
return null;
|
|
271
|
-
if (result.status === 403)
|
|
272
|
-
return forbidden(result.error);
|
|
273
|
-
if (result.status === 409)
|
|
274
|
-
return conflict(result.error);
|
|
275
|
-
if (result.status !== 200)
|
|
276
|
-
return result;
|
|
277
|
-
const escalation = result.data.escalation
|
|
278
|
-
?? (result.data.escalationId ? { id: result.data.escalationId } : undefined);
|
|
279
|
-
return executed(escalation, step);
|
|
280
|
-
}
|
|
281
|
-
async function escalateStep(step, ctx) {
|
|
282
|
-
// Close the located escalation first when configured — the close doubles as
|
|
283
|
-
// the condition check AND the double-scan guard (second scan finds nothing
|
|
284
|
-
// to close and falls through).
|
|
285
|
-
if (step.params?.closeCurrent === 'resolve') {
|
|
286
|
-
const closed = await resolveStep({ ...step, params: { ...step.params, resolverPayload: step.params?.resolverPayload ?? {} } }, ctx);
|
|
287
|
-
if (closed === null)
|
|
288
|
-
return null;
|
|
289
|
-
if (closed.data?.outcome !== types_1.SCAN_OUTCOMES.EXECUTED)
|
|
290
|
-
return closed;
|
|
291
|
-
}
|
|
292
|
-
else if (step.params?.closeCurrent === 'cancel') {
|
|
293
|
-
const cancelled = await cancelStep(step, ctx);
|
|
294
|
-
if (cancelled === null)
|
|
295
|
-
return null;
|
|
296
|
-
if (cancelled.data?.outcome !== types_1.SCAN_OUTCOMES.EXECUTED)
|
|
297
|
-
return cancelled;
|
|
298
|
-
}
|
|
299
|
-
const created = await (0, create_1.createEscalation)({
|
|
300
|
-
type: step.params?.escalationType ?? 'scan',
|
|
301
|
-
role: step.params.targetRole,
|
|
302
|
-
description: step.params?.description ?? ctx.rule.name,
|
|
303
|
-
metadata: {
|
|
304
|
-
[ctx.scheme.target_facet]: ctx.parsed.target,
|
|
305
|
-
...interpolatedMetadata(step, ctx),
|
|
306
|
-
...provenance(ctx),
|
|
307
|
-
},
|
|
308
|
-
}, ctx.auth);
|
|
309
|
-
if (created.status === 403)
|
|
310
|
-
return forbidden(created.error);
|
|
311
|
-
if (created.status !== 201)
|
|
312
|
-
return created;
|
|
313
|
-
return executed(created.data, step);
|
|
314
|
-
}
|
|
315
|
-
async function releaseStep(step, ctx) {
|
|
316
|
-
// Locate the caller's own claim; release-by-id re-asserts the assignee
|
|
317
|
-
// inside the SDK, so a lost race resolves to 409, never a foreign release.
|
|
318
|
-
const scope = await (0, helpers_1.getEscalationReadScope)(ctx.auth.userId);
|
|
319
|
-
const readable = [...scope.allRoles, ...scope.selfRoles];
|
|
320
|
-
const roles = (0, metadata_1.restrictScopeRoles)(readable, scope.global, step.query?.roles);
|
|
321
|
-
if (roles !== null && roles.length === 0)
|
|
322
|
-
return null;
|
|
323
|
-
const { escalations } = await escalationService.listEscalations({
|
|
324
|
-
metadata: targetFilter(step, ctx),
|
|
325
|
-
status: 'pending',
|
|
326
|
-
assigned_to: ctx.auth.userId,
|
|
327
|
-
visibleRoles: roles ?? undefined,
|
|
328
|
-
limit: 1,
|
|
329
|
-
});
|
|
330
|
-
if (escalations.length === 0)
|
|
331
|
-
return null;
|
|
332
|
-
const result = await (0, claim_1.releaseEscalation)({ id: escalations[0].id }, ctx.auth);
|
|
333
|
-
if (result.status === 403)
|
|
334
|
-
return forbidden(result.error);
|
|
335
|
-
if (result.status === 409)
|
|
336
|
-
return conflict(result.error);
|
|
337
|
-
if (result.status !== 200)
|
|
338
|
-
return result;
|
|
339
|
-
return executed(result.data.escalation, step);
|
|
340
|
-
}
|
|
341
|
-
async function cancelStep(step, ctx) {
|
|
342
|
-
// Claim-as-lock: the atomic claim pins the row to this caller (or extends
|
|
343
|
-
// their claim), serializing concurrent double-scans before the cancel.
|
|
344
|
-
const claimed = await (0, metadata_1.claimByMetadata)({
|
|
345
|
-
key: ctx.scheme.target_facet,
|
|
346
|
-
value: ctx.parsed.target,
|
|
347
|
-
metadata: provenance(ctx),
|
|
348
|
-
restrictRoles: step.query?.roles,
|
|
349
|
-
}, ctx.auth);
|
|
350
|
-
if (claimed.status === 404)
|
|
351
|
-
return null;
|
|
352
|
-
if (claimed.status === 403)
|
|
353
|
-
return forbidden(claimed.error);
|
|
354
|
-
if (claimed.status !== 200)
|
|
355
|
-
return claimed;
|
|
356
|
-
const cancelled = await escalationService.cancelEscalation(claimed.data.escalation.id);
|
|
357
|
-
if (!cancelled)
|
|
358
|
-
return conflict('Escalation is not cancellable (already terminal)');
|
|
359
|
-
return executed(cancelled, step);
|
|
360
|
-
}
|
|
361
|
-
// ── Small result helpers ───────────────────────────────────────────────────
|
|
362
|
-
function interpolatedMetadata(step, ctx) {
|
|
363
|
-
return step.params?.metadata
|
|
364
|
-
? scanCodeService.interpolateScanTemplate(step.params.metadata, templateContext(ctx))
|
|
365
|
-
: {};
|
|
366
|
-
}
|
|
367
|
-
function forbidden(error) {
|
|
368
|
-
return { status: 200, data: { outcome: types_1.SCAN_OUTCOMES.FORBIDDEN, error } };
|
|
369
|
-
}
|
|
370
|
-
function conflict(error) {
|
|
371
|
-
return { status: 200, data: { outcome: types_1.SCAN_OUTCOMES.CONFLICT, error } };
|
|
372
|
-
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type ParsedScanCode, type ScanExecuteResponse, type ScanRule, type ScanScheme, type ScanStep } from '../../types';
|
|
2
|
+
import type { LTApiResult } from '../../types/sdk';
|
|
3
|
+
import type { StepContext } from './context';
|
|
4
|
+
export { resolveActingAuth, type ActingAuthResult } from '../../services/iam/acting-identity';
|
|
5
|
+
/**
|
|
6
|
+
* Resolve an identity scan: badge → user → minted acting grant.
|
|
7
|
+
* Identity schemes never walk steps; the rule's fallback is the
|
|
8
|
+
* unknown-badge screen.
|
|
9
|
+
*/
|
|
10
|
+
export declare function executeIdentityScan(parsed: ParsedScanCode, scheme: ScanScheme, rule: ScanRule, previousActingToken?: string): Promise<LTApiResult<ScanExecuteResponse>>;
|
|
11
|
+
/**
|
|
12
|
+
* The identity pre-condition's satisfaction test. A primed grant always
|
|
13
|
+
* satisfies; without one, the authenticated user satisfies only when their
|
|
14
|
+
* OWN write scope covers the step's roles — their login IS a person identity
|
|
15
|
+
* with authority there. A write-incapable shared account can never
|
|
16
|
+
* self-satisfy.
|
|
17
|
+
*/
|
|
18
|
+
export declare function actingIdentitySatisfied(step: Pick<ScanStep, 'query'>, ctx: StepContext): Promise<boolean>;
|
|
@@ -0,0 +1,116 @@
|
|
|
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.resolveActingAuth = void 0;
|
|
37
|
+
exports.executeIdentityScan = executeIdentityScan;
|
|
38
|
+
exports.actingIdentitySatisfied = actingIdentitySatisfied;
|
|
39
|
+
const userService = __importStar(require("../../services/user"));
|
|
40
|
+
const ephemeral_1 = require("../../services/iam/ephemeral");
|
|
41
|
+
const metadata_1 = require("../escalations/metadata");
|
|
42
|
+
const helpers_1 = require("../escalations/helpers");
|
|
43
|
+
const types_1 = require("../../types");
|
|
44
|
+
var acting_identity_1 = require("../../services/iam/acting-identity");
|
|
45
|
+
Object.defineProperty(exports, "resolveActingAuth", { enumerable: true, get: function () { return acting_identity_1.resolveActingAuth; } });
|
|
46
|
+
// ── Acting identity — the badge layer over the scan surface ────────────────
|
|
47
|
+
//
|
|
48
|
+
// A shared station device signs in as an ordinary read-capable account; the
|
|
49
|
+
// person supplies identity by scanning a badge under an identity-kind scheme.
|
|
50
|
+
// The badge token is an opaque printed credential resolved against a
|
|
51
|
+
// server-side binding (scheme.target_facet names the lt_users.metadata key it
|
|
52
|
+
// matches — never external_id, so a printed username can never impersonate).
|
|
53
|
+
// A match MINTS a grant through the ephemeral keystore: short-TTL, optionally
|
|
54
|
+
// n-use, useless unless exchanged server-side. The grant confers ATTRIBUTION,
|
|
55
|
+
// never privilege — verbs later run under the acting user's own live RBAC.
|
|
56
|
+
/**
|
|
57
|
+
* Resolve an identity scan: badge → user → minted acting grant.
|
|
58
|
+
* Identity schemes never walk steps; the rule's fallback is the
|
|
59
|
+
* unknown-badge screen.
|
|
60
|
+
*/
|
|
61
|
+
async function executeIdentityScan(parsed, scheme, rule, previousActingToken) {
|
|
62
|
+
const user = await userService.getUserByMetadataValue(scheme.target_facet, parsed.target);
|
|
63
|
+
if (!user) {
|
|
64
|
+
return {
|
|
65
|
+
status: 200,
|
|
66
|
+
data: {
|
|
67
|
+
outcome: types_1.SCAN_OUTCOMES.IDENTITY_UNKNOWN,
|
|
68
|
+
parsed,
|
|
69
|
+
rule: { schemeVersion: rule.scheme_version, category: rule.category, name: rule.name },
|
|
70
|
+
fallback: rule.fallback,
|
|
71
|
+
error: 'badge not recognized',
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
// The station is swapping people — the outgoing grant dies now, not at TTL.
|
|
76
|
+
if (previousActingToken) {
|
|
77
|
+
const prev = (0, ephemeral_1.parseEphemeralToken)(previousActingToken);
|
|
78
|
+
if (prev && prev.label === types_1.ACTING_IDENTITY_LABEL) {
|
|
79
|
+
await (0, ephemeral_1.revokeEphemeral)(prev.uuid).catch(() => { });
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
const uuid = await (0, ephemeral_1.storeEphemeral)(user.id, {
|
|
83
|
+
ttlSeconds: scheme.grant_ttl_seconds ?? undefined,
|
|
84
|
+
maxUses: scheme.grant_max_uses,
|
|
85
|
+
label: types_1.ACTING_IDENTITY_LABEL,
|
|
86
|
+
});
|
|
87
|
+
const expiresAt = new Date(Date.now() + (scheme.grant_ttl_seconds ?? 0) * 1000).toISOString();
|
|
88
|
+
return {
|
|
89
|
+
status: 200,
|
|
90
|
+
data: {
|
|
91
|
+
outcome: types_1.SCAN_OUTCOMES.IDENTITY_PRIMED,
|
|
92
|
+
parsed,
|
|
93
|
+
rule: { schemeVersion: rule.scheme_version, category: rule.category, name: rule.name },
|
|
94
|
+
actor: { id: user.id, displayName: user.display_name || user.external_id },
|
|
95
|
+
actingToken: (0, ephemeral_1.formatEphemeralToken)(uuid, types_1.ACTING_IDENTITY_LABEL),
|
|
96
|
+
expiresAt,
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* The identity pre-condition's satisfaction test. A primed grant always
|
|
102
|
+
* satisfies; without one, the authenticated user satisfies only when their
|
|
103
|
+
* OWN write scope covers the step's roles — their login IS a person identity
|
|
104
|
+
* with authority there. A write-incapable shared account can never
|
|
105
|
+
* self-satisfy.
|
|
106
|
+
*/
|
|
107
|
+
async function actingIdentitySatisfied(step, ctx) {
|
|
108
|
+
if (ctx.acting)
|
|
109
|
+
return true;
|
|
110
|
+
const scope = await (0, helpers_1.getEscalationWriteScope)(ctx.stationAuth.userId);
|
|
111
|
+
if (scope.global)
|
|
112
|
+
return true;
|
|
113
|
+
const writable = [...scope.allRoles, ...scope.selfRoles];
|
|
114
|
+
const roles = (0, metadata_1.restrictScopeRoles)(writable, scope.global, step.query?.roles);
|
|
115
|
+
return roles === null || roles.length > 0;
|
|
116
|
+
}
|
|
@@ -1,2 +1,4 @@
|
|
|
1
1
|
export { executeScanCode } from './execute';
|
|
2
|
+
export { executeScanChoice } from './choice';
|
|
3
|
+
export { executeIdentityScan, resolveActingAuth } from './identity';
|
|
2
4
|
export { listScanSchemes, getScanScheme, upsertScanScheme, deleteScanScheme, listScanRules, getScanRule, upsertScanRule, deleteScanRule, } from './config';
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.deleteScanRule = exports.upsertScanRule = exports.getScanRule = exports.listScanRules = exports.deleteScanScheme = exports.upsertScanScheme = exports.getScanScheme = exports.listScanSchemes = exports.executeScanCode = void 0;
|
|
3
|
+
exports.deleteScanRule = exports.upsertScanRule = exports.getScanRule = exports.listScanRules = exports.deleteScanScheme = exports.upsertScanScheme = exports.getScanScheme = exports.listScanSchemes = exports.resolveActingAuth = exports.executeIdentityScan = exports.executeScanChoice = exports.executeScanCode = void 0;
|
|
4
4
|
var execute_1 = require("./execute");
|
|
5
5
|
Object.defineProperty(exports, "executeScanCode", { enumerable: true, get: function () { return execute_1.executeScanCode; } });
|
|
6
|
+
var choice_1 = require("./choice");
|
|
7
|
+
Object.defineProperty(exports, "executeScanChoice", { enumerable: true, get: function () { return choice_1.executeScanChoice; } });
|
|
8
|
+
var identity_1 = require("./identity");
|
|
9
|
+
Object.defineProperty(exports, "executeIdentityScan", { enumerable: true, get: function () { return identity_1.executeIdentityScan; } });
|
|
10
|
+
Object.defineProperty(exports, "resolveActingAuth", { enumerable: true, get: function () { return identity_1.resolveActingAuth; } });
|
|
6
11
|
var config_1 = require("./config");
|
|
7
12
|
Object.defineProperty(exports, "listScanSchemes", { enumerable: true, get: function () { return config_1.listScanSchemes; } });
|
|
8
13
|
Object.defineProperty(exports, "getScanScheme", { enumerable: true, get: function () { return config_1.getScanScheme; } });
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type LTEscalationRecord, type ScanExecuteResponse, type ScanStep } from '../../types';
|
|
2
|
+
import type { LTApiResult } from '../../types/sdk';
|
|
3
|
+
import { type StepContext } from './context';
|
|
4
|
+
/**
|
|
5
|
+
* The scoped locate every read path shares: the scanned target pinned to the
|
|
6
|
+
* scheme's facet, the step's extra guards, and the EFFECTIVE actor's read
|
|
7
|
+
* scope. Returns null when the caller's scope leaves no roles to search.
|
|
8
|
+
*/
|
|
9
|
+
export declare function locateForStep(step: ScanStep, ctx: StepContext, limit: number): Promise<{
|
|
10
|
+
escalations: LTEscalationRecord[];
|
|
11
|
+
total: number;
|
|
12
|
+
} | null>;
|
|
13
|
+
/** Locate for show-detail, show-list, and the confirm phase. */
|
|
14
|
+
export declare function locateStep(step: ScanStep, ctx: StepContext): Promise<LTApiResult<ScanExecuteResponse> | null>;
|
|
@@ -0,0 +1,127 @@
|
|
|
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.locateForStep = locateForStep;
|
|
37
|
+
exports.locateStep = locateStep;
|
|
38
|
+
const scanCodeService = __importStar(require("../../services/scan-code"));
|
|
39
|
+
const escalationService = __importStar(require("../../services/escalation"));
|
|
40
|
+
const metadata_1 = require("../escalations/metadata");
|
|
41
|
+
const helpers_1 = require("../escalations/helpers");
|
|
42
|
+
const types_1 = require("../../types");
|
|
43
|
+
const context_1 = require("./context");
|
|
44
|
+
/**
|
|
45
|
+
* The scoped locate every read path shares: the scanned target pinned to the
|
|
46
|
+
* scheme's facet, the step's extra guards, and the EFFECTIVE actor's read
|
|
47
|
+
* scope. Returns null when the caller's scope leaves no roles to search.
|
|
48
|
+
*/
|
|
49
|
+
async function locateForStep(step, ctx, limit) {
|
|
50
|
+
const scope = await (0, helpers_1.getEscalationReadScope)(ctx.auth.userId);
|
|
51
|
+
const availability = step.query?.availability ?? types_1.SCAN_AVAILABILITY.ANY;
|
|
52
|
+
const status = step.query?.status ?? 'pending';
|
|
53
|
+
const facets = (0, context_1.targetFilter)(step, ctx);
|
|
54
|
+
if (availability === types_1.SCAN_AVAILABILITY.MINE) {
|
|
55
|
+
// "mine" = assigned to the caller; self-scope roles qualify because the
|
|
56
|
+
// assigned_to predicate satisfies their visibility branch.
|
|
57
|
+
const readable = [...scope.allRoles, ...scope.selfRoles];
|
|
58
|
+
const roles = (0, metadata_1.restrictScopeRoles)(readable, scope.global, step.query?.roles);
|
|
59
|
+
if (roles !== null && roles.length === 0)
|
|
60
|
+
return null;
|
|
61
|
+
return escalationService.listEscalations({
|
|
62
|
+
metadata: facets,
|
|
63
|
+
status,
|
|
64
|
+
assigned_to: ctx.auth.userId,
|
|
65
|
+
visibleRoles: roles ?? undefined,
|
|
66
|
+
limit,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
const roles = (0, metadata_1.restrictScopeRoles)(scope.allRoles, scope.global, step.query?.roles);
|
|
70
|
+
if (roles !== null && roles.length === 0)
|
|
71
|
+
return null;
|
|
72
|
+
return escalationService.searchByFacets({
|
|
73
|
+
roles: roles ?? undefined,
|
|
74
|
+
facets,
|
|
75
|
+
status,
|
|
76
|
+
available: availability === types_1.SCAN_AVAILABILITY.AVAILABLE
|
|
77
|
+
? true
|
|
78
|
+
: availability === types_1.SCAN_AVAILABILITY.CLAIMED ? false : undefined,
|
|
79
|
+
limit,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
/** Locate for show-detail, show-list, and the confirm phase. */
|
|
83
|
+
async function locateStep(step, ctx) {
|
|
84
|
+
const wantMany = step.verb === types_1.SCAN_VERBS.SHOW_LIST
|
|
85
|
+
|| step.cardinality === types_1.SCAN_CARDINALITY.MANY;
|
|
86
|
+
const result = await locateForStep(step, ctx, wantMany ? 50 : 2);
|
|
87
|
+
if (!result || result.escalations.length === 0)
|
|
88
|
+
return null;
|
|
89
|
+
const { escalations, total } = result;
|
|
90
|
+
if (step.confirm) {
|
|
91
|
+
const target = escalations[0];
|
|
92
|
+
const interpolated = step.params
|
|
93
|
+
? scanCodeService.interpolateScanTemplate(step.params, (0, context_1.templateContext)(ctx))
|
|
94
|
+
: undefined;
|
|
95
|
+
return {
|
|
96
|
+
status: 200,
|
|
97
|
+
data: {
|
|
98
|
+
outcome: types_1.SCAN_OUTCOMES.CONFIRM_REQUIRED,
|
|
99
|
+
verb: step.verb,
|
|
100
|
+
escalation: target,
|
|
101
|
+
pendingAction: {
|
|
102
|
+
escalationId: target.id,
|
|
103
|
+
verb: step.verb,
|
|
104
|
+
prompt: step.confirm.prompt,
|
|
105
|
+
params: interpolated,
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
if (wantMany) {
|
|
111
|
+
return {
|
|
112
|
+
status: 200,
|
|
113
|
+
data: {
|
|
114
|
+
outcome: types_1.SCAN_OUTCOMES.MATCHED_LIST,
|
|
115
|
+
verb: step.verb,
|
|
116
|
+
escalations,
|
|
117
|
+
total,
|
|
118
|
+
listQuery: {
|
|
119
|
+
...step.query,
|
|
120
|
+
targetFacet: ctx.scheme.target_facet,
|
|
121
|
+
target: ctx.parsed.target,
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
return (0, context_1.executed)(escalations[0], step);
|
|
127
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type ScanExecuteResponse, type ScanStep } from '../../types';
|
|
2
|
+
import type { LTApiResult } from '../../types/sdk';
|
|
3
|
+
import type { StepContext } from './context';
|
|
4
|
+
/**
|
|
5
|
+
* Locate the target and present the step's choices. Choices whose identity
|
|
6
|
+
* requirement is unsatisfied come back withheld — the screen renders the
|
|
7
|
+
* rule's "scan your badge" affordance beside them instead of a dead button.
|
|
8
|
+
*/
|
|
9
|
+
export declare function presentStep(step: ScanStep, ctx: StepContext): Promise<LTApiResult<ScanExecuteResponse> | null>;
|