@hotmeshio/long-tail 0.10.10 → 0.10.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/api/escalations/list.d.ts +1 -0
- package/build/api/escalations/list.js +12 -4
- package/build/api/escalations/metadata.d.ts +11 -0
- package/build/api/escalations/metadata.js +27 -7
- package/build/api/roles.d.ts +2 -0
- package/build/api/roles.js +4 -0
- package/build/api/scan-codes/config.d.ts +22 -0
- package/build/api/scan-codes/config.js +136 -0
- package/build/api/scan-codes/execute.d.ts +9 -0
- package/build/api/scan-codes/execute.js +372 -0
- package/build/api/scan-codes/index.d.ts +2 -0
- package/build/api/scan-codes/index.js +14 -0
- package/build/lib/db/schemas/025_ops_home_default.sql +11 -0
- package/build/lib/db/schemas/026_scan_codes.sql +51 -0
- package/build/lib/db/schemas/027_scan_codes_reindex.sql +23 -0
- package/build/lib/events/system-events.js +4 -0
- package/build/modules/features.d.ts +17 -0
- package/build/modules/features.js +2 -0
- package/build/routes/escalations/list.js +1 -0
- package/build/routes/index.js +2 -0
- package/build/routes/scan-codes.d.ts +2 -0
- package/build/routes/scan-codes.js +138 -0
- package/build/sdk/index.d.ts +4 -0
- package/build/services/escalation/crud.d.ts +1 -1
- package/build/services/escalation/crud.js +4 -2
- package/build/services/escalation/queries.d.ts +1 -0
- package/build/services/escalation/queries.js +2 -0
- package/build/services/escalation/sql.d.ts +11 -6
- package/build/services/escalation/sql.js +20 -20
- package/build/services/role/index.js +1 -0
- package/build/services/role/sql.d.ts +6 -2
- package/build/services/role/sql.js +11 -2
- package/build/services/role/types.d.ts +9 -0
- package/build/services/scan-code/index.d.ts +4 -0
- package/build/services/scan-code/index.js +21 -0
- package/build/services/scan-code/parse.d.ts +35 -0
- package/build/services/scan-code/parse.js +108 -0
- package/build/services/scan-code/read.d.ts +5 -0
- package/build/services/scan-code/read.js +50 -0
- package/build/services/scan-code/sql.d.ts +10 -0
- package/build/services/scan-code/sql.js +57 -0
- package/build/services/scan-code/validate.d.ts +12 -0
- package/build/services/scan-code/validate.js +78 -0
- package/build/services/scan-code/write.d.ts +26 -0
- package/build/services/scan-code/write.js +71 -0
- package/build/shared/form-validation/index.d.ts +1 -0
- package/build/shared/form-validation/index.js +1 -0
- package/build/shared/form-validation/x-lt-transition.d.ts +47 -0
- package/build/shared/form-validation/x-lt-transition.js +65 -0
- package/build/system/mcp-servers/admin/index.d.ts +1 -0
- package/build/system/mcp-servers/admin/index.js +5 -2
- package/build/system/mcp-servers/admin/scan-codes.d.ts +10 -0
- package/build/system/mcp-servers/admin/scan-codes.js +111 -0
- package/build/system/mcp-servers/admin/schemas.d.ts +235 -14
- package/build/system/mcp-servers/admin/schemas.js +51 -0
- package/build/system/mcp-servers/admin/users.js +1 -0
- package/build/system/seed/tool-manifests-admin.d.ts +1462 -0
- package/build/system/seed/tool-manifests-admin.js +7 -1
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/events.d.ts +9 -0
- package/build/types/index.d.ts +2 -0
- package/build/types/index.js +10 -1
- package/build/types/scan-code.d.ts +183 -0
- package/build/types/scan-code.js +80 -0
- package/build/types/startup.d.ts +14 -0
- package/dashboard/dist/assets/{AdminDashboard-cGYuppUP.js → AdminDashboard-Bv3pHBzn.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-cGYuppUP.js.map → AdminDashboard-Bv3pHBzn.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-DwaUyoCy.js → AgentConfigPage-Dk2zlvDb.js} +6 -6
- package/dashboard/dist/assets/{AgentConfigPage-DwaUyoCy.js.map → AgentConfigPage-Dk2zlvDb.js.map} +1 -1
- package/dashboard/dist/assets/{AgentDetailPage-DxpFaltM.js → AgentDetailPage-DUno6EGs.js} +2 -2
- package/dashboard/dist/assets/{AgentDetailPage-DxpFaltM.js.map → AgentDetailPage-DUno6EGs.js.map} +1 -1
- package/dashboard/dist/assets/{AgentsPage-ByOoA8oT.js → AgentsPage-CToVu1qj.js} +2 -2
- package/dashboard/dist/assets/{AgentsPage-ByOoA8oT.js.map → AgentsPage-CToVu1qj.js.map} +1 -1
- package/dashboard/dist/assets/{AutoGrowTextarea-y-oNY51_.js → AutoGrowTextarea-DgEQeRQw.js} +2 -2
- package/dashboard/dist/assets/{AutoGrowTextarea-y-oNY51_.js.map → AutoGrowTextarea-DgEQeRQw.js.map} +1 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-DldboL4W.js +2 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-DldboL4W.js.map +1 -0
- package/dashboard/dist/assets/BotPicker-DQOpVB4M.js +2 -0
- package/dashboard/dist/assets/{BotPicker-Dohv8dhR.js.map → BotPicker-DQOpVB4M.js.map} +1 -1
- package/dashboard/dist/assets/{CapabilitiesPage-DeijFG3J.js → CapabilitiesPage-Dmf46PUJ.js} +2 -2
- package/dashboard/dist/assets/{CapabilitiesPage-DeijFG3J.js.map → CapabilitiesPage-Dmf46PUJ.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-BPNwS4eO.js → CollapsibleSection-CDADefUY.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-BPNwS4eO.js.map → CollapsibleSection-CDADefUY.js.map} +1 -1
- package/dashboard/dist/assets/{ConfirmDeleteModal-DD7SEMeX.js → ConfirmDeleteModal-CQsJUzEa.js} +2 -2
- package/dashboard/dist/assets/{ConfirmDeleteModal-DD7SEMeX.js.map → ConfirmDeleteModal-CQsJUzEa.js.map} +1 -1
- package/dashboard/dist/assets/{CopyableId-BpB-NvDh.js → CopyableId-4Lqlc5cU.js} +2 -2
- package/dashboard/dist/assets/{CopyableId-BpB-NvDh.js.map → CopyableId-4Lqlc5cU.js.map} +1 -1
- package/dashboard/dist/assets/CountdownTimer-DPjIkerB.js +2 -0
- package/dashboard/dist/assets/{CountdownTimer-BF71ldGF.js.map → CountdownTimer-DPjIkerB.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-oeNmMzTM.js → CredentialsPage-8LIEvomi.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-oeNmMzTM.js.map → CredentialsPage-8LIEvomi.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-CebR1m2k.js → CronLabel-CK3WSsM5.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-CebR1m2k.js.map → CronLabel-CK3WSsM5.js.map} +1 -1
- package/dashboard/dist/assets/{CustomDurationPicker-Bh9QdBVw.js → CustomDurationPicker-FPmlA6cE.js} +2 -2
- package/dashboard/dist/assets/{CustomDurationPicker-Bh9QdBVw.js.map → CustomDurationPicker-FPmlA6cE.js.map} +1 -1
- package/dashboard/dist/assets/{DataTable-BTu2AaEl.js → DataTable-Bir0Xs1p.js} +2 -2
- package/dashboard/dist/assets/{DataTable-BTu2AaEl.js.map → DataTable-Bir0Xs1p.js.map} +1 -1
- package/dashboard/dist/assets/{DropZone-Bavzt2QR.js → DropZone-CL9gA7pu.js} +2 -2
- package/dashboard/dist/assets/{DropZone-Bavzt2QR.js.map → DropZone-CL9gA7pu.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-Caa6CU_y.js → ElapsedCell-BZVkVxE0.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-Caa6CU_y.js.map → ElapsedCell-BZVkVxE0.js.map} +1 -1
- package/dashboard/dist/assets/{EmptyState-BcsfPq9T.js → EmptyState-lpUFYfun.js} +2 -2
- package/dashboard/dist/assets/{EmptyState-BcsfPq9T.js.map → EmptyState-lpUFYfun.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationListSchemaPage-CAGfq0eK.js → EscalationListSchemaPage-kYLdUtZX.js} +3 -3
- package/dashboard/dist/assets/{EscalationListSchemaPage-CAGfq0eK.js.map → EscalationListSchemaPage-kYLdUtZX.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationSchemaPage-qDD4ur6P.js → EscalationSchemaPage-kUmCDivo.js} +3 -3
- package/dashboard/dist/assets/{EscalationSchemaPage-qDD4ur6P.js.map → EscalationSchemaPage-kUmCDivo.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-CC1wRTzy.js → EscalationsOverview-D17auO-m.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-CC1wRTzy.js.map → EscalationsOverview-D17auO-m.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-4JeTcXr_.js → EventTable-CwPWl163.js} +2 -2
- package/dashboard/dist/assets/{EventTable-4JeTcXr_.js.map → EventTable-CwPWl163.js.map} +1 -1
- package/dashboard/dist/assets/{FilterBar-BOV8DWIO.js → FilterBar-D7GghUsU.js} +2 -2
- package/dashboard/dist/assets/{FilterBar-BOV8DWIO.js.map → FilterBar-D7GghUsU.js.map} +1 -1
- package/dashboard/dist/assets/{GraphInvokePage-C0i1speW.js → GraphInvokePage-D11uOnZi.js} +2 -2
- package/dashboard/dist/assets/{GraphInvokePage-C0i1speW.js.map → GraphInvokePage-D11uOnZi.js.map} +1 -1
- package/dashboard/dist/assets/HomePage-Bcq10Bxx.js +2 -0
- package/dashboard/dist/assets/HomePage-Bcq10Bxx.js.map +1 -0
- package/dashboard/dist/assets/ListToolbar-IPXsTb3Q.js +2 -0
- package/dashboard/dist/assets/ListToolbar-IPXsTb3Q.js.map +1 -0
- package/dashboard/dist/assets/{McpOverview-Chn2zIXr.js → McpOverview-Dx2j0KkF.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-Chn2zIXr.js.map → McpOverview-Dx2j0KkF.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-Cv1FKrvw.js → McpQueryDetailPage-CzF_bna8.js} +3 -3
- package/dashboard/dist/assets/{McpQueryDetailPage-Cv1FKrvw.js.map → McpQueryDetailPage-CzF_bna8.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryPage-Dzn8JE4E.js → McpQueryPage-CNsuiw_q.js} +2 -2
- package/dashboard/dist/assets/{McpQueryPage-Dzn8JE4E.js.map → McpQueryPage-CNsuiw_q.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunDetailPage-CuNtR4Ed.js → McpRunDetailPage-BJguEMS0.js} +2 -2
- package/dashboard/dist/assets/{McpRunDetailPage-CuNtR4Ed.js.map → McpRunDetailPage-BJguEMS0.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunsPage-C8iifeKN.js → McpRunsPage-CK96s3Nt.js} +2 -2
- package/dashboard/dist/assets/{McpRunsPage-C8iifeKN.js.map → McpRunsPage-CK96s3Nt.js.map} +1 -1
- package/dashboard/dist/assets/{Modal-CA2Iv02H.js → Modal-BU7No9NH.js} +2 -2
- package/dashboard/dist/assets/{Modal-CA2Iv02H.js.map → Modal-BU7No9NH.js.map} +1 -1
- package/dashboard/dist/assets/{NamespacePill-ep9Zmokr.js → NamespacePill-B9Vc_Pz2.js} +2 -2
- package/dashboard/dist/assets/{NamespacePill-ep9Zmokr.js.map → NamespacePill-B9Vc_Pz2.js.map} +1 -1
- package/dashboard/dist/assets/OperationsPage-DvWrLuH6.js +2 -0
- package/dashboard/dist/assets/OperationsPage-DvWrLuH6.js.map +1 -0
- package/dashboard/dist/assets/OperatorDashboard-C-jE0IRA.js +2 -0
- package/dashboard/dist/assets/OperatorDashboard-C-jE0IRA.js.map +1 -0
- package/dashboard/dist/assets/{PageHeader-Bw8RNkqR.js → PageHeader-Ce4GcIYo.js} +2 -2
- package/dashboard/dist/assets/{PageHeader-Bw8RNkqR.js.map → PageHeader-Ce4GcIYo.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeaderWithStats-NR_4idn6.js → PageHeaderWithStats-Ck0KZvXD.js} +2 -2
- package/dashboard/dist/assets/{PageHeaderWithStats-NR_4idn6.js.map → PageHeaderWithStats-Ck0KZvXD.js.map} +1 -1
- package/dashboard/dist/assets/{PersonaDetailPage-DKILoUqL.js → PersonaDetailPage-CJ6jqo7h.js} +2 -2
- package/dashboard/dist/assets/{PersonaDetailPage-DKILoUqL.js.map → PersonaDetailPage-CJ6jqo7h.js.map} +1 -1
- package/dashboard/dist/assets/{PersonasPage-qvzHTrFw.js → PersonasPage-D8hL3kL5.js} +2 -2
- package/dashboard/dist/assets/{PersonasPage-qvzHTrFw.js.map → PersonasPage-D8hL3kL5.js.map} +1 -1
- package/dashboard/dist/assets/{PriorityBadge-CCERr9vQ.js → PriorityBadge-BETdj4M-.js} +2 -2
- package/dashboard/dist/assets/{PriorityBadge-CCERr9vQ.js.map → PriorityBadge-BETdj4M-.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-C3LfeKvi.js → ProcessDetailPage-Vnx8Z5_y.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-C3LfeKvi.js.map → ProcessDetailPage-Vnx8Z5_y.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-OoZ_u4ty.js → ProcessesListPage-DRYtvS3N.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-OoZ_u4ty.js.map → ProcessesListPage-DRYtvS3N.js.map} +1 -1
- package/dashboard/dist/assets/RoleDetailPage-BKkUvTO-.js +8 -0
- package/dashboard/dist/assets/RoleDetailPage-BKkUvTO-.js.map +1 -0
- package/dashboard/dist/assets/{RolePill-TySZq7dB.js → RolePill-CnuBPhPw.js} +2 -2
- package/dashboard/dist/assets/{RolePill-TySZq7dB.js.map → RolePill-CnuBPhPw.js.map} +1 -1
- package/dashboard/dist/assets/RolesPage-BHzWK9n6.js +2 -0
- package/dashboard/dist/assets/{RolesPage-CNueMVuJ.js.map → RolesPage-BHzWK9n6.js.map} +1 -1
- package/dashboard/dist/assets/{RowActions-BA9L9djf.js → RowActions-eYrzgQSj.js} +2 -2
- package/dashboard/dist/assets/{RowActions-BA9L9djf.js.map → RowActions-eYrzgQSj.js.map} +1 -1
- package/dashboard/dist/assets/{RunAsSelector-CwWEpiSF.js → RunAsSelector-CS3KQ-BF.js} +2 -2
- package/dashboard/dist/assets/{RunAsSelector-CwWEpiSF.js.map → RunAsSelector-CS3KQ-BF.js.map} +1 -1
- package/dashboard/dist/assets/ScanCodesPage-BW4P4zWf.js +2 -0
- package/dashboard/dist/assets/ScanCodesPage-BW4P4zWf.js.map +1 -0
- package/dashboard/dist/assets/ScanSchemeDetailPage-BLykA4j-.js +2 -0
- package/dashboard/dist/assets/ScanSchemeDetailPage-BLykA4j-.js.map +1 -0
- package/dashboard/dist/assets/{ScopeBadge-C7Uixtmk.js → ScopeBadge-BUpYpS3x.js} +2 -2
- package/dashboard/dist/assets/{ScopeBadge-C7Uixtmk.js.map → ScopeBadge-BUpYpS3x.js.map} +1 -1
- package/dashboard/dist/assets/{StatCard-Ca-ngCaD.js → StatCard-BXQ8dD9Y.js} +2 -2
- package/dashboard/dist/assets/{StatCard-Ca-ngCaD.js.map → StatCard-BXQ8dD9Y.js.map} +1 -1
- package/dashboard/dist/assets/{StatusBadge-BwUvykDo.js → StatusBadge-DkgllZHv.js} +2 -2
- package/dashboard/dist/assets/{StatusBadge-BwUvykDo.js.map → StatusBadge-DkgllZHv.js.map} +1 -1
- package/dashboard/dist/assets/{StickyPagination-DvIF3kQK.js → StickyPagination-hMrnLXde.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-DvIF3kQK.js.map → StickyPagination-hMrnLXde.js.map} +1 -1
- package/dashboard/dist/assets/{StreamMessageDetail-DkFK_XGD.js → StreamMessageDetail-DyJyZwBl.js} +2 -2
- package/dashboard/dist/assets/{StreamMessageDetail-DkFK_XGD.js.map → StreamMessageDetail-DyJyZwBl.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-CMw-Et6h.js → SwimlaneTimeline-BlzV74V5.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-CMw-Et6h.js.map → SwimlaneTimeline-BlzV74V5.js.map} +1 -1
- package/dashboard/dist/assets/{TagInput-D8gSp48D.js → TagInput-BbZ25nNe.js} +2 -2
- package/dashboard/dist/assets/{TagInput-D8gSp48D.js.map → TagInput-BbZ25nNe.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-BhXuChOf.js → TaskDetailPage-B0p_Z4J_.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-BhXuChOf.js.map → TaskDetailPage-B0p_Z4J_.js.map} +1 -1
- package/dashboard/dist/assets/{TaskQueuePill-CHqolBmU.js → TaskQueuePill-D0QKBrN3.js} +2 -2
- package/dashboard/dist/assets/{TaskQueuePill-CHqolBmU.js.map → TaskQueuePill-D0QKBrN3.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-6JHQQ5QZ.js → TasksListPage-CiGR2QiQ.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-6JHQQ5QZ.js.map → TasksListPage-CiGR2QiQ.js.map} +1 -1
- package/dashboard/dist/assets/TimeAgo-D_DA9ucC.js +2 -0
- package/dashboard/dist/assets/{TimeAgo-CInx-vzY.js.map → TimeAgo-D_DA9ucC.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-Fq17Zrsu.js → TimestampCell-C7rkC9nh.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-Fq17Zrsu.js.map → TimestampCell-C7rkC9nh.js.map} +1 -1
- package/dashboard/dist/assets/{ToolPill-BbgMDhaE.js → ToolPill-8xY9rkoc.js} +2 -2
- package/dashboard/dist/assets/{ToolPill-BbgMDhaE.js.map → ToolPill-8xY9rkoc.js.map} +1 -1
- package/dashboard/dist/assets/{ToolTestPanel-DhjEe59s.js → ToolTestPanel-E8efYGYs.js} +2 -2
- package/dashboard/dist/assets/{ToolTestPanel-DhjEe59s.js.map → ToolTestPanel-E8efYGYs.js.map} +1 -1
- package/dashboard/dist/assets/{TopicDetailPage-DbIdmQpQ.js → TopicDetailPage-B455XrRc.js} +3 -3
- package/dashboard/dist/assets/{TopicDetailPage-DbIdmQpQ.js.map → TopicDetailPage-B455XrRc.js.map} +1 -1
- package/dashboard/dist/assets/{TopicsPage-CAP-GUbr.js → TopicsPage-1VAc29Qw.js} +2 -2
- package/dashboard/dist/assets/{TopicsPage-CAP-GUbr.js.map → TopicsPage-1VAc29Qw.js.map} +1 -1
- package/dashboard/dist/assets/UserName-DikzjQHJ.js +2 -0
- package/dashboard/dist/assets/{UserName-DggcLkSc.js.map → UserName-DikzjQHJ.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-Bmra5fVt.js → WorkflowExecutionPage-C15GSAoe.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-Bmra5fVt.js.map → WorkflowExecutionPage-C15GSAoe.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowPill-CcUUVugA.js → WorkflowPill-Da406nEj.js} +2 -2
- package/dashboard/dist/assets/{WorkflowPill-CcUUVugA.js.map → WorkflowPill-Da406nEj.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsDashboard-BQsZAGYU.js → WorkflowsDashboard-BMQd_0tW.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsDashboard-BQsZAGYU.js.map → WorkflowsDashboard-BMQd_0tW.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-CeliraHZ.js → WorkflowsOverview-CdxjVifp.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-CeliraHZ.js.map → WorkflowsOverview-CdxjVifp.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-DGxlonrV.js → YamlWorkflowDetailPage-DNVffIXa.js} +13 -13
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-DGxlonrV.js.map → YamlWorkflowDetailPage-DNVffIXa.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowsPage-DnT8UiyQ.js → YamlWorkflowsPage-BGP8wuos.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowsPage-DnT8UiyQ.js.map → YamlWorkflowsPage-BGP8wuos.js.map} +1 -1
- package/dashboard/dist/assets/{agents-mRV7m4sh.js → agents-BZJLIJ4h.js} +2 -2
- package/dashboard/dist/assets/{agents-mRV7m4sh.js.map → agents-BZJLIJ4h.js.map} +1 -1
- package/dashboard/dist/assets/{bots-SONCZlCM.js → bots-ClLcDGJb.js} +2 -2
- package/dashboard/dist/assets/{bots-SONCZlCM.js.map → bots-ClLcDGJb.js.map} +1 -1
- package/dashboard/dist/assets/capabilities-IaCcS7ge.js +2 -0
- package/dashboard/dist/assets/{capabilities-DZjCMN32.js.map → capabilities-IaCcS7ge.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-RQNXjna2.js → controlplane-Zi4m_MSx.js} +2 -2
- package/dashboard/dist/assets/{controlplane-RQNXjna2.js.map → controlplane-Zi4m_MSx.js.map} +1 -1
- package/dashboard/dist/assets/escalation-columns-BY2mg9DY.js +2 -0
- package/dashboard/dist/assets/escalation-columns-BY2mg9DY.js.map +1 -0
- package/dashboard/dist/assets/{index-ymm58cTW.js → index-BqGnhkh0.js} +2 -2
- package/dashboard/dist/assets/{index-ymm58cTW.js.map → index-BqGnhkh0.js.map} +1 -1
- package/dashboard/dist/assets/index-BzkE48xJ.js +6 -0
- package/dashboard/dist/assets/index-BzkE48xJ.js.map +1 -0
- package/dashboard/dist/assets/{index-CkeSxuZ0.js → index-C3o4OisO.js} +2 -2
- package/dashboard/dist/assets/{index-CkeSxuZ0.js.map → index-C3o4OisO.js.map} +1 -1
- package/dashboard/dist/assets/{index-DY_hlZCQ.js → index-CJu2PBNx.js} +2 -2
- package/dashboard/dist/assets/{index-DY_hlZCQ.js.map → index-CJu2PBNx.js.map} +1 -1
- package/dashboard/dist/assets/{index-DYKRtstT.js → index-CLmZaNTK.js} +2 -2
- package/dashboard/dist/assets/{index-DYKRtstT.js.map → index-CLmZaNTK.js.map} +1 -1
- package/dashboard/dist/assets/index-CfAi1OsI.js +65 -0
- package/dashboard/dist/assets/index-CfAi1OsI.js.map +1 -0
- package/dashboard/dist/assets/{index-CK-6m8e_.js → index-CmnNqpWg.js} +2 -2
- package/dashboard/dist/assets/{index-CK-6m8e_.js.map → index-CmnNqpWg.js.map} +1 -1
- package/dashboard/dist/assets/{index-DFJF8aWz.js → index-CvNBdkB1.js} +3 -3
- package/dashboard/dist/assets/{index-DFJF8aWz.js.map → index-CvNBdkB1.js.map} +1 -1
- package/dashboard/dist/assets/{index-DbZpL10z.js → index-D0zFReGL.js} +2 -2
- package/dashboard/dist/assets/{index-DbZpL10z.js.map → index-D0zFReGL.js.map} +1 -1
- package/dashboard/dist/assets/{index-C6GsrvX1.js → index-Dldi3Q3M.js} +2 -2
- package/dashboard/dist/assets/{index-C6GsrvX1.js.map → index-Dldi3Q3M.js.map} +1 -1
- package/dashboard/dist/assets/{index-DqsLfO-0.js → index-kiKZresb.js} +2 -2
- package/dashboard/dist/assets/{index-DqsLfO-0.js.map → index-kiKZresb.js.map} +1 -1
- package/dashboard/dist/assets/index-mKcQGi2B.js +3 -0
- package/dashboard/dist/assets/index-mKcQGi2B.js.map +1 -0
- package/dashboard/dist/assets/{index-CxVGlkK6.js → index-yGNt29V9.js} +2 -2
- package/dashboard/dist/assets/{index-CxVGlkK6.js.map → index-yGNt29V9.js.map} +1 -1
- package/dashboard/dist/assets/index-zQiUPfxA.css +1 -0
- package/dashboard/dist/assets/{knowledge-Bawo8u7l.js → knowledge-DWLxGTib.js} +2 -2
- package/dashboard/dist/assets/{knowledge-Bawo8u7l.js.map → knowledge-DWLxGTib.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-CKIpbpRZ.js → mcp-B6AARZ2I.js} +2 -2
- package/dashboard/dist/assets/{mcp-CKIpbpRZ.js.map → mcp-B6AARZ2I.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-vld4hYxQ.js → mcp-query-DrkvBU3a.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-vld4hYxQ.js.map → mcp-query-DrkvBU3a.js.map} +1 -1
- package/dashboard/dist/assets/{personas-BsARc3df.js → personas-Cmz2SAEU.js} +2 -2
- package/dashboard/dist/assets/{personas-BsARc3df.js.map → personas-Cmz2SAEU.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-BTSL-5ko.js → pipelines-CSgfVCMy.js} +2 -2
- package/dashboard/dist/assets/{pipelines-BTSL-5ko.js.map → pipelines-CSgfVCMy.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-DggQdNbj.js → tasks-UOtUkDk-.js} +2 -2
- package/dashboard/dist/assets/{tasks-DggQdNbj.js.map → tasks-UOtUkDk-.js.map} +1 -1
- package/dashboard/dist/assets/{topics-DzAKa34X.js → topics-Df5hGh6o.js} +2 -2
- package/dashboard/dist/assets/{topics-DzAKa34X.js.map → topics-Df5hGh6o.js.map} +1 -1
- package/dashboard/dist/assets/{useDebouncedValue-BA5S7V54.js → useDebouncedValue-C4P2jQuh.js} +2 -2
- package/dashboard/dist/assets/{useDebouncedValue-BA5S7V54.js.map → useDebouncedValue-C4P2jQuh.js.map} +1 -1
- package/dashboard/dist/assets/{useEventHooks-5uI9oI5W.js → useEventHooks-PDbuSJ12.js} +2 -2
- package/dashboard/dist/assets/{useEventHooks-5uI9oI5W.js.map → useEventHooks-PDbuSJ12.js.map} +1 -1
- package/dashboard/dist/assets/{useFilterParams-CvRyYHJN.js → useFilterParams-crmlBw_l.js} +2 -2
- package/dashboard/dist/assets/{useFilterParams-CvRyYHJN.js.map → useFilterParams-crmlBw_l.js.map} +1 -1
- package/dashboard/dist/assets/{useNamespace-CEKzFIqe.js → useNamespace-tZSOlge3.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-CEKzFIqe.js.map → useNamespace-tZSOlge3.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-hHgX1Z50.js → useYamlActivityEvents-CINLzE32.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-hHgX1Z50.js.map → useYamlActivityEvents-CINLzE32.js.map} +1 -1
- package/dashboard/dist/assets/{users-AO8lUyNr.js → users-G8qwyZKS.js} +2 -2
- package/dashboard/dist/assets/{users-AO8lUyNr.js.map → users-G8qwyZKS.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-DN9yGSuM.js → vendor-icons-BpZiWH2f.js} +40 -40
- package/dashboard/dist/assets/vendor-icons-BpZiWH2f.js.map +1 -0
- package/dashboard/dist/assets/{vendor-query-B2UbickB.js → vendor-query-RUZdMvN6.js} +2 -2
- package/dashboard/dist/assets/{vendor-query-B2UbickB.js.map → vendor-query-RUZdMvN6.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-react-BpdAFEQc.js → vendor-react-CdqEC2zv.js} +3 -3
- package/dashboard/dist/assets/{vendor-react-BpdAFEQc.js.map → vendor-react-CdqEC2zv.js.map} +1 -1
- package/dashboard/dist/assets/{workflows-PtnlRK09.js → workflows-DbPqi1TW.js} +2 -2
- package/dashboard/dist/assets/{workflows-PtnlRK09.js.map → workflows-DbPqi1TW.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-DPu3Y8vG.js → yaml-workflows-DozD8hpR.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-DPu3Y8vG.js.map → yaml-workflows-DozD8hpR.js.map} +1 -1
- package/dashboard/dist/index.html +5 -5
- package/docs/dashboard.md +9 -2
- package/docs/design-principles.md +4 -0
- package/docs/hitl/pinned-views.md +3 -3
- package/docs/hitl/x-lt-transition.md +105 -0
- package/docs/operations.md +1 -1
- package/docs/scan-codes.md +243 -0
- package/package.json +2 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-C1vtTvqP.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-C1vtTvqP.js.map +0 -1
- package/dashboard/dist/assets/BotPicker-Dohv8dhR.js +0 -2
- package/dashboard/dist/assets/CountdownTimer-BF71ldGF.js +0 -2
- package/dashboard/dist/assets/HomePage-HPCd8SjF.js +0 -2
- package/dashboard/dist/assets/HomePage-HPCd8SjF.js.map +0 -1
- package/dashboard/dist/assets/ListToolbar-BFHVOba6.js +0 -2
- package/dashboard/dist/assets/ListToolbar-BFHVOba6.js.map +0 -1
- package/dashboard/dist/assets/OperationsPage-flrZ-EJ9.js +0 -2
- package/dashboard/dist/assets/OperationsPage-flrZ-EJ9.js.map +0 -1
- package/dashboard/dist/assets/OperatorDashboard-Dhs2eo8p.js +0 -2
- package/dashboard/dist/assets/OperatorDashboard-Dhs2eo8p.js.map +0 -1
- package/dashboard/dist/assets/RoleDetailPage-D70jTLZm.js +0 -8
- package/dashboard/dist/assets/RoleDetailPage-D70jTLZm.js.map +0 -1
- package/dashboard/dist/assets/RolesPage-CNueMVuJ.js +0 -2
- package/dashboard/dist/assets/TimeAgo-CInx-vzY.js +0 -2
- package/dashboard/dist/assets/UserName-DggcLkSc.js +0 -2
- package/dashboard/dist/assets/capabilities-DZjCMN32.js +0 -2
- package/dashboard/dist/assets/escalation-columns-XLEcZRCg.js +0 -2
- package/dashboard/dist/assets/escalation-columns-XLEcZRCg.js.map +0 -1
- package/dashboard/dist/assets/index-2BwHxjCw.css +0 -1
- package/dashboard/dist/assets/index-D2CfSx_x.js +0 -5
- package/dashboard/dist/assets/index-D2CfSx_x.js.map +0 -1
- package/dashboard/dist/assets/index-Dh3CVChT.js +0 -63
- package/dashboard/dist/assets/index-Dh3CVChT.js.map +0 -1
- package/dashboard/dist/assets/index-iHV3d7o3.js +0 -6
- package/dashboard/dist/assets/index-iHV3d7o3.js.map +0 -1
- package/dashboard/dist/assets/role-display-Dvo2lDpU.js +0 -2
- package/dashboard/dist/assets/role-display-Dvo2lDpU.js.map +0 -1
- package/dashboard/dist/assets/vendor-icons-DN9yGSuM.js.map +0 -1
|
@@ -0,0 +1,372 @@
|
|
|
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.executeScanCode = executeScanCode;
|
|
37
|
+
const scanCodeService = __importStar(require("../../services/scan-code"));
|
|
38
|
+
const escalationService = __importStar(require("../../services/escalation"));
|
|
39
|
+
const metadata_1 = require("../escalations/metadata");
|
|
40
|
+
const create_1 = require("../escalations/create");
|
|
41
|
+
const claim_1 = require("../escalations/claim");
|
|
42
|
+
const helpers_1 = require("../escalations/helpers");
|
|
43
|
+
const types_1 = require("../../types");
|
|
44
|
+
/**
|
|
45
|
+
* Execute a raw scan code: parse → load the rule → walk its steps in order.
|
|
46
|
+
* The first step whose condition matches performs its verb and answers; a
|
|
47
|
+
* step that matches nothing falls through to the next. Every terminal state
|
|
48
|
+
* is a structured 200 outcome — the scan surface reports, it doesn't throw.
|
|
49
|
+
*/
|
|
50
|
+
async function executeScanCode(input, auth) {
|
|
51
|
+
try {
|
|
52
|
+
if (!input.code || typeof input.code !== 'string') {
|
|
53
|
+
return { status: 400, error: 'code is required' };
|
|
54
|
+
}
|
|
55
|
+
// 1. Parse against the configured schemes
|
|
56
|
+
const schemes = await scanCodeService.listScanSchemes();
|
|
57
|
+
const parseResult = scanCodeService.parseScanCode(input.code, schemes);
|
|
58
|
+
if (!parseResult.ok) {
|
|
59
|
+
const { reason, detail } = parseResult.failure;
|
|
60
|
+
const outcome = reason === 'unknown_version' || reason === 'scheme_disabled'
|
|
61
|
+
? types_1.SCAN_OUTCOMES.UNCONFIGURED
|
|
62
|
+
: types_1.SCAN_OUTCOMES.INVALID_CODE;
|
|
63
|
+
return { status: 200, data: { outcome, error: detail } };
|
|
64
|
+
}
|
|
65
|
+
const { parsed, scheme } = parseResult;
|
|
66
|
+
// 2. Load the rule for this category
|
|
67
|
+
const rule = await scanCodeService.getScanRule(parsed.version, parsed.category);
|
|
68
|
+
if (!rule || !rule.enabled) {
|
|
69
|
+
return {
|
|
70
|
+
status: 200,
|
|
71
|
+
data: {
|
|
72
|
+
outcome: types_1.SCAN_OUTCOMES.UNCONFIGURED,
|
|
73
|
+
parsed,
|
|
74
|
+
error: `no scan rule configured for ${parsed.version}:${parsed.category}`,
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
// 3. Walk the steps — first condition match wins
|
|
79
|
+
const ctx = {
|
|
80
|
+
scheme, rule, parsed, scannedAt: new Date().toISOString(), auth,
|
|
81
|
+
};
|
|
82
|
+
for (let i = 0; i < rule.steps.length; i++) {
|
|
83
|
+
const result = await executeStep(rule.steps[i], i, ctx);
|
|
84
|
+
if (result)
|
|
85
|
+
return decorate(result, ctx, i);
|
|
86
|
+
}
|
|
87
|
+
// 4. Nothing matched — the fallback screen is the answer
|
|
88
|
+
return {
|
|
89
|
+
status: 200,
|
|
90
|
+
data: decorateData({ outcome: types_1.SCAN_OUTCOMES.NO_MATCH_FALLBACK, fallback: rule.fallback }, ctx),
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
return { status: 500, error: err.message };
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/** Stamp rule identity + parsed code onto a step result. */
|
|
98
|
+
function decorate(result, ctx, stepIndex) {
|
|
99
|
+
if (result.data && typeof result.data === 'object' && 'outcome' in result.data) {
|
|
100
|
+
result.data = { ...decorateData(result.data, ctx), stepIndex };
|
|
101
|
+
}
|
|
102
|
+
return result;
|
|
103
|
+
}
|
|
104
|
+
function decorateData(data, ctx) {
|
|
105
|
+
return {
|
|
106
|
+
...data,
|
|
107
|
+
parsed: ctx.parsed,
|
|
108
|
+
rule: {
|
|
109
|
+
schemeVersion: ctx.rule.scheme_version,
|
|
110
|
+
category: ctx.rule.category,
|
|
111
|
+
name: ctx.rule.name,
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Execute one step. Returns null when the step's condition matched nothing
|
|
117
|
+
* (fall through) and an LTApiResult for every terminal outcome.
|
|
118
|
+
*/
|
|
119
|
+
async function executeStep(step, index, ctx) {
|
|
120
|
+
// Confirm steps and read verbs only locate — mutation happens after the
|
|
121
|
+
// user confirms, through the standard per-id endpoints.
|
|
122
|
+
if (step.confirm || step.verb === types_1.SCAN_VERBS.SHOW_DETAIL || step.verb === types_1.SCAN_VERBS.SHOW_LIST) {
|
|
123
|
+
return locateStep(step, ctx);
|
|
124
|
+
}
|
|
125
|
+
switch (step.verb) {
|
|
126
|
+
case types_1.SCAN_VERBS.CLAIM:
|
|
127
|
+
case types_1.SCAN_VERBS.CLAIM_SHOW_DETAIL:
|
|
128
|
+
return claimStep(step, ctx);
|
|
129
|
+
case types_1.SCAN_VERBS.RESOLVE:
|
|
130
|
+
return resolveStep(step, ctx);
|
|
131
|
+
case types_1.SCAN_VERBS.ESCALATE:
|
|
132
|
+
return escalateStep(step, ctx);
|
|
133
|
+
case types_1.SCAN_VERBS.RELEASE:
|
|
134
|
+
return releaseStep(step, ctx);
|
|
135
|
+
case types_1.SCAN_VERBS.CANCEL:
|
|
136
|
+
return cancelStep(step, ctx);
|
|
137
|
+
default:
|
|
138
|
+
throw new Error(`unknown scan verb "${step.verb}"`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
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,14 @@
|
|
|
1
|
+
"use strict";
|
|
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;
|
|
4
|
+
var execute_1 = require("./execute");
|
|
5
|
+
Object.defineProperty(exports, "executeScanCode", { enumerable: true, get: function () { return execute_1.executeScanCode; } });
|
|
6
|
+
var config_1 = require("./config");
|
|
7
|
+
Object.defineProperty(exports, "listScanSchemes", { enumerable: true, get: function () { return config_1.listScanSchemes; } });
|
|
8
|
+
Object.defineProperty(exports, "getScanScheme", { enumerable: true, get: function () { return config_1.getScanScheme; } });
|
|
9
|
+
Object.defineProperty(exports, "upsertScanScheme", { enumerable: true, get: function () { return config_1.upsertScanScheme; } });
|
|
10
|
+
Object.defineProperty(exports, "deleteScanScheme", { enumerable: true, get: function () { return config_1.deleteScanScheme; } });
|
|
11
|
+
Object.defineProperty(exports, "listScanRules", { enumerable: true, get: function () { return config_1.listScanRules; } });
|
|
12
|
+
Object.defineProperty(exports, "getScanRule", { enumerable: true, get: function () { return config_1.getScanRule; } });
|
|
13
|
+
Object.defineProperty(exports, "upsertScanRule", { enumerable: true, get: function () { return config_1.upsertScanRule; } });
|
|
14
|
+
Object.defineProperty(exports, "deleteScanRule", { enumerable: true, get: function () { return config_1.deleteScanRule; } });
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
-- Migration 025: Home Pace Board default segment
|
|
2
|
+
--
|
|
3
|
+
-- ops_home_default marks the role whose sequence leads the HOME page's Pace
|
|
4
|
+
-- Board. The board's full view lives on /operations; the home embed shows one
|
|
5
|
+
-- segment, and this flag lets an operator pick which one — a subordinate
|
|
6
|
+
-- setting under ops_visible on Role Detail. Single-holder: setting it on one
|
|
7
|
+
-- role clears it everywhere else in the same atomic statement. When no role
|
|
8
|
+
-- carries it, the home board falls back to the primary (first) segment.
|
|
9
|
+
|
|
10
|
+
ALTER TABLE lt_roles
|
|
11
|
+
ADD COLUMN IF NOT EXISTS ops_home_default BOOLEAN NOT NULL DEFAULT false;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
-- Migration 026: Scan-code schemes and rules
|
|
2
|
+
--
|
|
3
|
+
-- A scan code arrives from a physical input source (barcode scanner, RFID
|
|
4
|
+
-- reader, manual entry) as a plain string encoding version:category:target.
|
|
5
|
+
-- The leading digit (1-9) selects a SCHEME: which escalation metadata facet
|
|
6
|
+
-- the target resolves against and how the string parses (delimited text or
|
|
7
|
+
-- fixed-width digits). The two-digit category selects a RULE: an ordered
|
|
8
|
+
-- list of condition/action steps evaluated against the escalation surface,
|
|
9
|
+
-- plus a fallback screen when no step matches.
|
|
10
|
+
--
|
|
11
|
+
-- Rules are plain config consulted at execute time (like lt_config_workflows);
|
|
12
|
+
-- nothing pins a historical rule, so there is no snapshot table. Provenance
|
|
13
|
+
-- is stamped into escalation metadata by the execute path instead.
|
|
14
|
+
|
|
15
|
+
CREATE TABLE IF NOT EXISTS lt_config_scan_schemes (
|
|
16
|
+
version SMALLINT PRIMARY KEY CHECK (version BETWEEN 1 AND 9),
|
|
17
|
+
name TEXT NOT NULL,
|
|
18
|
+
description TEXT,
|
|
19
|
+
target_facet TEXT NOT NULL,
|
|
20
|
+
encoding TEXT NOT NULL DEFAULT 'fixed'
|
|
21
|
+
CHECK (encoding IN ('fixed', 'delimited')),
|
|
22
|
+
delimiter TEXT NOT NULL DEFAULT ':',
|
|
23
|
+
target_length SMALLINT,
|
|
24
|
+
enabled BOOLEAN NOT NULL DEFAULT TRUE,
|
|
25
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
26
|
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
27
|
+
-- fixed-width parsing needs to know where the target ends
|
|
28
|
+
CONSTRAINT chk_scan_scheme_fixed_length
|
|
29
|
+
CHECK (encoding <> 'fixed' OR target_length IS NOT NULL)
|
|
30
|
+
);
|
|
31
|
+
|
|
32
|
+
CREATE OR REPLACE TRIGGER trg_lt_config_scan_schemes_updated_at
|
|
33
|
+
BEFORE UPDATE ON lt_config_scan_schemes
|
|
34
|
+
FOR EACH ROW EXECUTE FUNCTION lt_set_updated_at();
|
|
35
|
+
|
|
36
|
+
CREATE TABLE IF NOT EXISTS lt_config_scan_actions (
|
|
37
|
+
scheme_version SMALLINT NOT NULL
|
|
38
|
+
REFERENCES lt_config_scan_schemes(version) ON DELETE CASCADE,
|
|
39
|
+
category TEXT NOT NULL CHECK (category ~ '^[0-9]{2}$'),
|
|
40
|
+
name TEXT NOT NULL,
|
|
41
|
+
steps JSONB NOT NULL DEFAULT '[]',
|
|
42
|
+
fallback JSONB NOT NULL DEFAULT '{}',
|
|
43
|
+
enabled BOOLEAN NOT NULL DEFAULT TRUE,
|
|
44
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
45
|
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
46
|
+
PRIMARY KEY (scheme_version, category)
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
CREATE OR REPLACE TRIGGER trg_lt_config_scan_actions_updated_at
|
|
50
|
+
BEFORE UPDATE ON lt_config_scan_actions
|
|
51
|
+
FOR EACH ROW EXECUTE FUNCTION lt_set_updated_at();
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
-- Migration 027: Scan-code numbering inversion
|
|
2
|
+
--
|
|
3
|
+
-- The scheme index moves to the leading TWO digits (10-99) and the category
|
|
4
|
+
-- (rule) index to a single digit (0-9): a code now reads ##:#:target. Two
|
|
5
|
+
-- reasons: a code never starts with a leading zero (some scanners choke on it),
|
|
6
|
+
-- and the top-level "named item" you organize by (the scheme) gets the wider
|
|
7
|
+
-- 90-slot space while each scheme's rules stay a small 0-9 set. The indices are
|
|
8
|
+
-- assigned automatically; operators name entries, never pick numbers.
|
|
9
|
+
--
|
|
10
|
+
-- Old rows (single-digit version, two-digit category) cannot satisfy the new
|
|
11
|
+
-- checks and their codes no longer parse, so the config is cleared and re-seeded.
|
|
12
|
+
|
|
13
|
+
TRUNCATE lt_config_scan_actions, lt_config_scan_schemes;
|
|
14
|
+
|
|
15
|
+
ALTER TABLE lt_config_scan_schemes
|
|
16
|
+
DROP CONSTRAINT IF EXISTS lt_config_scan_schemes_version_check;
|
|
17
|
+
ALTER TABLE lt_config_scan_schemes
|
|
18
|
+
ADD CONSTRAINT lt_config_scan_schemes_version_check CHECK (version BETWEEN 10 AND 99);
|
|
19
|
+
|
|
20
|
+
ALTER TABLE lt_config_scan_actions
|
|
21
|
+
DROP CONSTRAINT IF EXISTS lt_config_scan_actions_category_check;
|
|
22
|
+
ALTER TABLE lt_config_scan_actions
|
|
23
|
+
ADD CONSTRAINT lt_config_scan_actions_category_check CHECK (category ~ '^[0-9]$');
|
|
@@ -44,6 +44,10 @@ function mapSystemEvent(event) {
|
|
|
44
44
|
escalationId: row.id || segments[2],
|
|
45
45
|
originId: row.origin_id || event.origin_id || undefined,
|
|
46
46
|
status: ESCALATION_STATUS_BY_VERB[verb] ?? verb,
|
|
47
|
+
// Assignment provenance rides the SystemEvent envelope, NOT the row (it is
|
|
48
|
+
// not a column). Forward it so a consumer can tell a born-assigned,
|
|
49
|
+
// system-directed hand-off (`claimed` with true) from an interactive claim.
|
|
50
|
+
assignedAtCreation: event.assigned_at_creation,
|
|
47
51
|
data: row,
|
|
48
52
|
timestamp: event.ts,
|
|
49
53
|
};
|
|
@@ -12,6 +12,23 @@ export interface FeatureFlags {
|
|
|
12
12
|
* Default: true. Set `features.dbMaintenance: false` in start config to hide it.
|
|
13
13
|
*/
|
|
14
14
|
dbMaintenance: boolean;
|
|
15
|
+
/**
|
|
16
|
+
* The Pace Board is readable by every authenticated user: station metrics
|
|
17
|
+
* (aggregate queue-shape counts and trends — never item content) span all
|
|
18
|
+
* roles for any login, and the board leads everyone's home page. Default:
|
|
19
|
+
* true. Set `features.publicPaceBoard: false` to scope metrics back to role
|
|
20
|
+
* membership — the right call for deployments that provision external
|
|
21
|
+
* one-time accounts (e.g. a customer resolving a single form).
|
|
22
|
+
*/
|
|
23
|
+
publicPaceBoard: boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Scan-code input on every login: the header scan affordance, the panel,
|
|
26
|
+
* and the global keyboard-wedge capture. Opt-IN: default false — a
|
|
27
|
+
* deployment turns it on with `features.scanCodes: true` when scanners are
|
|
28
|
+
* part of the floor workflow. The scan-code execute/config API stays
|
|
29
|
+
* available either way (the flag gates the dashboard surface).
|
|
30
|
+
*/
|
|
31
|
+
scanCodes: boolean;
|
|
15
32
|
}
|
|
16
33
|
/** Merge a partial set of flags from the start config. Unspecified flags keep their default. */
|
|
17
34
|
export declare function configureFeatureFlags(patch?: Partial<FeatureFlags>): void;
|
|
@@ -4,6 +4,8 @@ exports.configureFeatureFlags = configureFeatureFlags;
|
|
|
4
4
|
exports.getFeatureFlags = getFeatureFlags;
|
|
5
5
|
const DEFAULT_FLAGS = {
|
|
6
6
|
dbMaintenance: true,
|
|
7
|
+
publicPaceBoard: true,
|
|
8
|
+
scanCodes: false,
|
|
7
9
|
};
|
|
8
10
|
let flags = { ...DEFAULT_FLAGS };
|
|
9
11
|
/** Merge a partial set of flags from the start config. Unspecified flags keep their default. */
|
|
@@ -92,6 +92,7 @@ function registerListRoutes(router) {
|
|
|
92
92
|
type: req.query.type,
|
|
93
93
|
subtype: req.query.subtype,
|
|
94
94
|
assigned_to: req.query.assigned_to,
|
|
95
|
+
parent_id: req.query.parent_id,
|
|
95
96
|
claimed: req.query.claimed === 'true',
|
|
96
97
|
priority: req.query.priority ? parseInt(req.query.priority, 10) : undefined,
|
|
97
98
|
limit: req.query.limit ? parseInt(req.query.limit, 10) : undefined,
|
package/build/routes/index.js
CHANGED
|
@@ -36,6 +36,7 @@ const agents_1 = __importDefault(require("./agents"));
|
|
|
36
36
|
const capabilities_1 = __importDefault(require("./capabilities"));
|
|
37
37
|
const topics_1 = __importDefault(require("./topics"));
|
|
38
38
|
const nats_credentials_1 = __importDefault(require("./nats-credentials"));
|
|
39
|
+
const scan_codes_1 = __importDefault(require("./scan-codes"));
|
|
39
40
|
const router = (0, express_1.Router)();
|
|
40
41
|
// Public routes (no auth required — they handle their own auth)
|
|
41
42
|
router.use('/auth', auth_2.default);
|
|
@@ -72,6 +73,7 @@ router.use('/knowledge', knowledge_1.default);
|
|
|
72
73
|
router.use('/agents', agents_1.default);
|
|
73
74
|
router.use('/capabilities', capabilities_1.default);
|
|
74
75
|
router.use('/topics', topics_1.default);
|
|
76
|
+
router.use('/scan-codes', scan_codes_1.default);
|
|
75
77
|
const overview_1 = __importDefault(require("./overview"));
|
|
76
78
|
router.use('/overview', overview_1.default);
|
|
77
79
|
const diagnostics_1 = __importDefault(require("./diagnostics"));
|