@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,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.listScanSchemes = listScanSchemes;
|
|
4
|
+
exports.getScanScheme = getScanScheme;
|
|
5
|
+
exports.listScanRules = listScanRules;
|
|
6
|
+
exports.getScanRule = getScanRule;
|
|
7
|
+
const db_1 = require("../../lib/db");
|
|
8
|
+
const sql_1 = require("./sql");
|
|
9
|
+
function mapScheme(row) {
|
|
10
|
+
return {
|
|
11
|
+
version: row.version,
|
|
12
|
+
name: row.name,
|
|
13
|
+
description: row.description ?? null,
|
|
14
|
+
target_facet: row.target_facet,
|
|
15
|
+
encoding: row.encoding,
|
|
16
|
+
delimiter: row.delimiter,
|
|
17
|
+
target_length: row.target_length ?? null,
|
|
18
|
+
enabled: row.enabled,
|
|
19
|
+
created_at: row.created_at,
|
|
20
|
+
updated_at: row.updated_at,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function mapRule(row) {
|
|
24
|
+
return {
|
|
25
|
+
scheme_version: row.scheme_version,
|
|
26
|
+
category: row.category,
|
|
27
|
+
name: row.name,
|
|
28
|
+
steps: row.steps ?? [],
|
|
29
|
+
fallback: row.fallback ?? {},
|
|
30
|
+
enabled: row.enabled,
|
|
31
|
+
created_at: row.created_at,
|
|
32
|
+
updated_at: row.updated_at,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
async function listScanSchemes() {
|
|
36
|
+
const { rows } = await (0, db_1.getPool)().query(sql_1.LIST_SCHEMES);
|
|
37
|
+
return rows.map(mapScheme);
|
|
38
|
+
}
|
|
39
|
+
async function getScanScheme(version) {
|
|
40
|
+
const { rows } = await (0, db_1.getPool)().query(sql_1.GET_SCHEME, [version]);
|
|
41
|
+
return rows.length ? mapScheme(rows[0]) : null;
|
|
42
|
+
}
|
|
43
|
+
async function listScanRules(schemeVersion) {
|
|
44
|
+
const { rows } = await (0, db_1.getPool)().query(sql_1.LIST_ACTIONS, [schemeVersion]);
|
|
45
|
+
return rows.map(mapRule);
|
|
46
|
+
}
|
|
47
|
+
async function getScanRule(schemeVersion, category) {
|
|
48
|
+
const { rows } = await (0, db_1.getPool)().query(sql_1.GET_ACTION, [schemeVersion, category]);
|
|
49
|
+
return rows.length ? mapRule(rows[0]) : null;
|
|
50
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare const LIST_SCHEMES = "SELECT * FROM lt_config_scan_schemes ORDER BY version";
|
|
2
|
+
export declare const GET_SCHEME = "SELECT * FROM lt_config_scan_schemes WHERE version = $1";
|
|
3
|
+
export declare const LIST_ACTIONS = "SELECT * FROM lt_config_scan_actions WHERE scheme_version = $1 ORDER BY category";
|
|
4
|
+
export declare const GET_ACTION = "SELECT * FROM lt_config_scan_actions WHERE scheme_version = $1 AND category = $2";
|
|
5
|
+
export declare const UPSERT_SCHEME = "INSERT INTO lt_config_scan_schemes\n (version, name, description, target_facet, encoding, delimiter, target_length, enabled)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8)\nON CONFLICT (version) DO UPDATE SET\n name = EXCLUDED.name,\n description = EXCLUDED.description,\n target_facet = EXCLUDED.target_facet,\n encoding = EXCLUDED.encoding,\n delimiter = EXCLUDED.delimiter,\n target_length = EXCLUDED.target_length,\n enabled = EXCLUDED.enabled\nRETURNING *";
|
|
6
|
+
export declare const DELETE_SCHEME = "DELETE FROM lt_config_scan_schemes WHERE version = $1";
|
|
7
|
+
export declare const UPSERT_ACTION = "INSERT INTO lt_config_scan_actions\n (scheme_version, category, name, steps, fallback, enabled)\nVALUES ($1, $2, $3, $4, $5, $6)\nON CONFLICT (scheme_version, category) DO UPDATE SET\n name = EXCLUDED.name,\n steps = EXCLUDED.steps,\n fallback = EXCLUDED.fallback,\n enabled = EXCLUDED.enabled\nRETURNING *";
|
|
8
|
+
export declare const DELETE_ACTION = "DELETE FROM lt_config_scan_actions WHERE scheme_version = $1 AND category = $2";
|
|
9
|
+
export declare const SEED_SCHEME = "INSERT INTO lt_config_scan_schemes\n (version, name, description, target_facet, encoding, delimiter, target_length, enabled)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8)\nON CONFLICT (version) DO NOTHING";
|
|
10
|
+
export declare const SEED_ACTION = "INSERT INTO lt_config_scan_actions\n (scheme_version, category, name, steps, fallback, enabled)\nVALUES ($1, $2, $3, $4, $5, $6)\nON CONFLICT (scheme_version, category) DO NOTHING";
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ------------------------------------------------------------------ //
|
|
3
|
+
// Read queries //
|
|
4
|
+
// ------------------------------------------------------------------ //
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.SEED_ACTION = exports.SEED_SCHEME = exports.DELETE_ACTION = exports.UPSERT_ACTION = exports.DELETE_SCHEME = exports.UPSERT_SCHEME = exports.GET_ACTION = exports.LIST_ACTIONS = exports.GET_SCHEME = exports.LIST_SCHEMES = void 0;
|
|
7
|
+
exports.LIST_SCHEMES = `\
|
|
8
|
+
SELECT * FROM lt_config_scan_schemes ORDER BY version`;
|
|
9
|
+
exports.GET_SCHEME = `\
|
|
10
|
+
SELECT * FROM lt_config_scan_schemes WHERE version = $1`;
|
|
11
|
+
exports.LIST_ACTIONS = `\
|
|
12
|
+
SELECT * FROM lt_config_scan_actions WHERE scheme_version = $1 ORDER BY category`;
|
|
13
|
+
exports.GET_ACTION = `\
|
|
14
|
+
SELECT * FROM lt_config_scan_actions WHERE scheme_version = $1 AND category = $2`;
|
|
15
|
+
// ------------------------------------------------------------------ //
|
|
16
|
+
// Write / upsert queries //
|
|
17
|
+
// ------------------------------------------------------------------ //
|
|
18
|
+
exports.UPSERT_SCHEME = `\
|
|
19
|
+
INSERT INTO lt_config_scan_schemes
|
|
20
|
+
(version, name, description, target_facet, encoding, delimiter, target_length, enabled)
|
|
21
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
|
|
22
|
+
ON CONFLICT (version) DO UPDATE SET
|
|
23
|
+
name = EXCLUDED.name,
|
|
24
|
+
description = EXCLUDED.description,
|
|
25
|
+
target_facet = EXCLUDED.target_facet,
|
|
26
|
+
encoding = EXCLUDED.encoding,
|
|
27
|
+
delimiter = EXCLUDED.delimiter,
|
|
28
|
+
target_length = EXCLUDED.target_length,
|
|
29
|
+
enabled = EXCLUDED.enabled
|
|
30
|
+
RETURNING *`;
|
|
31
|
+
exports.DELETE_SCHEME = `\
|
|
32
|
+
DELETE FROM lt_config_scan_schemes WHERE version = $1`;
|
|
33
|
+
exports.UPSERT_ACTION = `\
|
|
34
|
+
INSERT INTO lt_config_scan_actions
|
|
35
|
+
(scheme_version, category, name, steps, fallback, enabled)
|
|
36
|
+
VALUES ($1, $2, $3, $4, $5, $6)
|
|
37
|
+
ON CONFLICT (scheme_version, category) DO UPDATE SET
|
|
38
|
+
name = EXCLUDED.name,
|
|
39
|
+
steps = EXCLUDED.steps,
|
|
40
|
+
fallback = EXCLUDED.fallback,
|
|
41
|
+
enabled = EXCLUDED.enabled
|
|
42
|
+
RETURNING *`;
|
|
43
|
+
exports.DELETE_ACTION = `\
|
|
44
|
+
DELETE FROM lt_config_scan_actions WHERE scheme_version = $1 AND category = $2`;
|
|
45
|
+
// ------------------------------------------------------------------ //
|
|
46
|
+
// Seed (insert-if-absent — used at startup, DB is source of truth) //
|
|
47
|
+
// ------------------------------------------------------------------ //
|
|
48
|
+
exports.SEED_SCHEME = `\
|
|
49
|
+
INSERT INTO lt_config_scan_schemes
|
|
50
|
+
(version, name, description, target_facet, encoding, delimiter, target_length, enabled)
|
|
51
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
|
|
52
|
+
ON CONFLICT (version) DO NOTHING`;
|
|
53
|
+
exports.SEED_ACTION = `\
|
|
54
|
+
INSERT INTO lt_config_scan_actions
|
|
55
|
+
(scheme_version, category, name, steps, fallback, enabled)
|
|
56
|
+
VALUES ($1, $2, $3, $4, $5, $6)
|
|
57
|
+
ON CONFLICT (scheme_version, category) DO NOTHING`;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type ScanScheme, type ScanStep } from '../../types';
|
|
2
|
+
/**
|
|
3
|
+
* Reject incoherent scheme config at write time. Throws with the exact
|
|
4
|
+
* problem — a bad scheme silently misparsing every scan is far worse
|
|
5
|
+
* than a loud upsert failure.
|
|
6
|
+
*/
|
|
7
|
+
export declare function assertValidScheme(scheme: Partial<ScanScheme>): void;
|
|
8
|
+
/**
|
|
9
|
+
* Reject incoherent rule steps at write time: a rule that can never
|
|
10
|
+
* execute its verb must fail the upsert, not the factory-floor scan.
|
|
11
|
+
*/
|
|
12
|
+
export declare function assertValidSteps(steps: ScanStep[]): void;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.assertValidScheme = assertValidScheme;
|
|
4
|
+
exports.assertValidSteps = assertValidSteps;
|
|
5
|
+
const types_1 = require("../../types");
|
|
6
|
+
const VALID_VERBS = new Set(Object.values(types_1.SCAN_VERBS));
|
|
7
|
+
/**
|
|
8
|
+
* Reject incoherent scheme config at write time. Throws with the exact
|
|
9
|
+
* problem — a bad scheme silently misparsing every scan is far worse
|
|
10
|
+
* than a loud upsert failure.
|
|
11
|
+
*/
|
|
12
|
+
function assertValidScheme(scheme) {
|
|
13
|
+
if (!Number.isInteger(scheme.version) || scheme.version < 10 || scheme.version > 99) {
|
|
14
|
+
throw new Error('scheme version must be a two-digit integer between 10 and 99');
|
|
15
|
+
}
|
|
16
|
+
if (!scheme.name)
|
|
17
|
+
throw new Error('scheme name is required');
|
|
18
|
+
if (!scheme.target_facet)
|
|
19
|
+
throw new Error('scheme target_facet is required');
|
|
20
|
+
const encoding = scheme.encoding ?? types_1.SCAN_ENCODINGS.FIXED;
|
|
21
|
+
if (encoding === types_1.SCAN_ENCODINGS.FIXED) {
|
|
22
|
+
if (!Number.isInteger(scheme.target_length) || scheme.target_length < 1) {
|
|
23
|
+
throw new Error('fixed encoding requires a positive integer target_length');
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
if (encoding === types_1.SCAN_ENCODINGS.DELIMITED) {
|
|
27
|
+
const delimiter = scheme.delimiter ?? ':';
|
|
28
|
+
if (delimiter.length !== 1) {
|
|
29
|
+
throw new Error('delimited encoding requires a single-character delimiter');
|
|
30
|
+
}
|
|
31
|
+
if (/[0-9]/.test(delimiter)) {
|
|
32
|
+
throw new Error('delimiter must not be a digit');
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Reject incoherent rule steps at write time: a rule that can never
|
|
38
|
+
* execute its verb must fail the upsert, not the factory-floor scan.
|
|
39
|
+
*/
|
|
40
|
+
function assertValidSteps(steps) {
|
|
41
|
+
if (!Array.isArray(steps))
|
|
42
|
+
throw new Error('steps must be an array');
|
|
43
|
+
steps.forEach((step, i) => {
|
|
44
|
+
const at = `step ${i + 1}`;
|
|
45
|
+
if (!step || typeof step !== 'object')
|
|
46
|
+
throw new Error(`${at} must be an object`);
|
|
47
|
+
if (!VALID_VERBS.has(step.verb)) {
|
|
48
|
+
throw new Error(`${at}: unknown verb "${step.verb}"`);
|
|
49
|
+
}
|
|
50
|
+
if (step.confirm && !types_1.SCAN_MUTATING_VERBS.includes(step.verb)) {
|
|
51
|
+
throw new Error(`${at}: confirm applies only to mutating verbs`);
|
|
52
|
+
}
|
|
53
|
+
if (step.confirm && !step.confirm.prompt) {
|
|
54
|
+
throw new Error(`${at}: confirm requires a prompt`);
|
|
55
|
+
}
|
|
56
|
+
if (step.verb === types_1.SCAN_VERBS.ESCALATE && !step.params?.targetRole) {
|
|
57
|
+
throw new Error(`${at}: escalate requires params.targetRole`);
|
|
58
|
+
}
|
|
59
|
+
if (step.verb === types_1.SCAN_VERBS.RESOLVE && !step.params?.resolverPayload) {
|
|
60
|
+
throw new Error(`${at}: resolve requires params.resolverPayload`);
|
|
61
|
+
}
|
|
62
|
+
if (step.query && step.query.roles && !Array.isArray(step.query.roles)) {
|
|
63
|
+
throw new Error(`${at}: query.roles must be an array`);
|
|
64
|
+
}
|
|
65
|
+
// Claim and cancel lock via claim-by-metadata, whose SQL filter is the
|
|
66
|
+
// target facet + roles only — extra facet guards would be silently
|
|
67
|
+
// ignored there, so reject them at write time. (Locate, resolve, and
|
|
68
|
+
// escalate steps carry facet guards inside their own atomic filters.)
|
|
69
|
+
const claimLocked = step.verb === types_1.SCAN_VERBS.CLAIM
|
|
70
|
+
|| step.verb === types_1.SCAN_VERBS.CLAIM_SHOW_DETAIL
|
|
71
|
+
|| step.verb === types_1.SCAN_VERBS.CANCEL
|
|
72
|
+
|| (step.verb === types_1.SCAN_VERBS.ESCALATE && step.params?.closeCurrent === 'cancel');
|
|
73
|
+
if (claimLocked && !step.confirm
|
|
74
|
+
&& step.query?.facets && Object.keys(step.query.facets).length) {
|
|
75
|
+
throw new Error(`${at}: facet guards are not supported on claim-locked steps (${step.verb})`);
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type ScanScheme, type ScanRule, type ScanStep, type ScanRuleFallback } from '../../types';
|
|
2
|
+
export interface ScanSchemeInput {
|
|
3
|
+
version: number;
|
|
4
|
+
name: string;
|
|
5
|
+
description?: string | null;
|
|
6
|
+
target_facet: string;
|
|
7
|
+
encoding?: ScanScheme['encoding'];
|
|
8
|
+
delimiter?: string;
|
|
9
|
+
target_length?: number | null;
|
|
10
|
+
enabled?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface ScanRuleInput {
|
|
13
|
+
scheme_version: number;
|
|
14
|
+
category: string;
|
|
15
|
+
name: string;
|
|
16
|
+
steps: ScanStep[];
|
|
17
|
+
fallback?: ScanRuleFallback;
|
|
18
|
+
enabled?: boolean;
|
|
19
|
+
}
|
|
20
|
+
export declare function upsertScanScheme(input: ScanSchemeInput): Promise<ScanScheme>;
|
|
21
|
+
export declare function deleteScanScheme(version: number): Promise<boolean>;
|
|
22
|
+
export declare function upsertScanRule(input: ScanRuleInput): Promise<ScanRule>;
|
|
23
|
+
export declare function deleteScanRule(schemeVersion: number, category: string): Promise<boolean>;
|
|
24
|
+
/** Insert-if-absent seeding — DB is the source of truth, never overwrite. */
|
|
25
|
+
export declare function seedScanScheme(input: ScanSchemeInput): Promise<boolean>;
|
|
26
|
+
export declare function seedScanRule(input: ScanRuleInput): Promise<boolean>;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.upsertScanScheme = upsertScanScheme;
|
|
4
|
+
exports.deleteScanScheme = deleteScanScheme;
|
|
5
|
+
exports.upsertScanRule = upsertScanRule;
|
|
6
|
+
exports.deleteScanRule = deleteScanRule;
|
|
7
|
+
exports.seedScanScheme = seedScanScheme;
|
|
8
|
+
exports.seedScanRule = seedScanRule;
|
|
9
|
+
const db_1 = require("../../lib/db");
|
|
10
|
+
const types_1 = require("../../types");
|
|
11
|
+
const sql_1 = require("./sql");
|
|
12
|
+
const validate_1 = require("./validate");
|
|
13
|
+
function schemeParams(input) {
|
|
14
|
+
return [
|
|
15
|
+
input.version,
|
|
16
|
+
input.name,
|
|
17
|
+
input.description ?? null,
|
|
18
|
+
input.target_facet,
|
|
19
|
+
input.encoding ?? types_1.SCAN_ENCODINGS.FIXED,
|
|
20
|
+
input.delimiter ?? ':',
|
|
21
|
+
input.target_length ?? null,
|
|
22
|
+
input.enabled ?? true,
|
|
23
|
+
];
|
|
24
|
+
}
|
|
25
|
+
function ruleParams(input) {
|
|
26
|
+
return [
|
|
27
|
+
input.scheme_version,
|
|
28
|
+
input.category,
|
|
29
|
+
input.name,
|
|
30
|
+
JSON.stringify(input.steps),
|
|
31
|
+
JSON.stringify(input.fallback ?? {}),
|
|
32
|
+
input.enabled ?? true,
|
|
33
|
+
];
|
|
34
|
+
}
|
|
35
|
+
async function upsertScanScheme(input) {
|
|
36
|
+
(0, validate_1.assertValidScheme)(input);
|
|
37
|
+
const { rows } = await (0, db_1.getPool)().query(sql_1.UPSERT_SCHEME, schemeParams(input));
|
|
38
|
+
return rows[0];
|
|
39
|
+
}
|
|
40
|
+
async function deleteScanScheme(version) {
|
|
41
|
+
const { rowCount } = await (0, db_1.getPool)().query(sql_1.DELETE_SCHEME, [version]);
|
|
42
|
+
return (rowCount ?? 0) > 0;
|
|
43
|
+
}
|
|
44
|
+
async function upsertScanRule(input) {
|
|
45
|
+
if (!/^[0-9]$/.test(input.category)) {
|
|
46
|
+
throw new Error('category must be a single digit (0-9)');
|
|
47
|
+
}
|
|
48
|
+
if (!input.name)
|
|
49
|
+
throw new Error('rule name is required');
|
|
50
|
+
(0, validate_1.assertValidSteps)(input.steps);
|
|
51
|
+
if (input.steps.length === 0 && !input.fallback?.markdown && !input.fallback?.route) {
|
|
52
|
+
throw new Error('a rule needs at least one step or a fallback');
|
|
53
|
+
}
|
|
54
|
+
const { rows } = await (0, db_1.getPool)().query(sql_1.UPSERT_ACTION, ruleParams(input));
|
|
55
|
+
return rows[0];
|
|
56
|
+
}
|
|
57
|
+
async function deleteScanRule(schemeVersion, category) {
|
|
58
|
+
const { rowCount } = await (0, db_1.getPool)().query(sql_1.DELETE_ACTION, [schemeVersion, category]);
|
|
59
|
+
return (rowCount ?? 0) > 0;
|
|
60
|
+
}
|
|
61
|
+
/** Insert-if-absent seeding — DB is the source of truth, never overwrite. */
|
|
62
|
+
async function seedScanScheme(input) {
|
|
63
|
+
(0, validate_1.assertValidScheme)(input);
|
|
64
|
+
const { rowCount } = await (0, db_1.getPool)().query(sql_1.SEED_SCHEME, schemeParams(input));
|
|
65
|
+
return (rowCount ?? 0) > 0;
|
|
66
|
+
}
|
|
67
|
+
async function seedScanRule(input) {
|
|
68
|
+
(0, validate_1.assertValidSteps)(input.steps);
|
|
69
|
+
const { rowCount } = await (0, db_1.getPool)().query(sql_1.SEED_ACTION, ruleParams(input));
|
|
70
|
+
return (rowCount ?? 0) > 0;
|
|
71
|
+
}
|
|
@@ -23,6 +23,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
23
23
|
__exportStar(require("./derive-field-label"), exports);
|
|
24
24
|
__exportStar(require("./x-lt-bind"), exports);
|
|
25
25
|
__exportStar(require("./x-lt-help"), exports);
|
|
26
|
+
__exportStar(require("./x-lt-transition"), exports);
|
|
26
27
|
__exportStar(require("./x-lt-show-if"), exports);
|
|
27
28
|
__exportStar(require("./field-validator"), exports);
|
|
28
29
|
__exportStar(require("./validate-resolver-payload"), exports);
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* x-lt-transition — post-submit hand-off UX. A form_schema may declare, at its
|
|
3
|
+
* schema root, that submitting one of its escalations should pause on a wait
|
|
4
|
+
* screen instead of returning to the previous page — because a follow-on
|
|
5
|
+
* escalation is about to be born assigned to the submitter (a chained hand-off).
|
|
6
|
+
*
|
|
7
|
+
* x-lt-transition boolean — opt in to the wait screen
|
|
8
|
+
* x-lt-transition-message markdown — shown on the wait screen
|
|
9
|
+
* x-lt-transition-max-wait-seconds number — how long to wait for the
|
|
10
|
+
* follow-on before running the fallback
|
|
11
|
+
* query (clamped to a sane range)
|
|
12
|
+
*
|
|
13
|
+
* These tokens control ONLY the UX. Navigation to the follow-on is driven by the
|
|
14
|
+
* engine's born-assigned `claimed` event (assigned_to + parent_id +
|
|
15
|
+
* assigned_at_creation); the schema carries no navigation target and no metadata
|
|
16
|
+
* is used.
|
|
17
|
+
*/
|
|
18
|
+
export declare const X_LT_TRANSITION = "x-lt-transition";
|
|
19
|
+
export declare const X_LT_TRANSITION_MESSAGE = "x-lt-transition-message";
|
|
20
|
+
export declare const X_LT_TRANSITION_MAX_WAIT_SECONDS = "x-lt-transition-max-wait-seconds";
|
|
21
|
+
export declare const X_LT_TRANSITION_DONE = "x-lt-transition-done";
|
|
22
|
+
export interface TransitionConfig {
|
|
23
|
+
/** Markdown shown on the wait screen. */
|
|
24
|
+
message: string;
|
|
25
|
+
/** Seconds to wait for the follow-on before the fallback query runs. */
|
|
26
|
+
maxWaitSeconds: number;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* The schema's transition config, or null when the schema does not opt in.
|
|
30
|
+
* `x-lt-transition` must be truthy; message and max-wait fall back to defaults.
|
|
31
|
+
*/
|
|
32
|
+
export declare function readTransitionConfig(schema: Record<string, unknown> | null | undefined): TransitionConfig | null;
|
|
33
|
+
/**
|
|
34
|
+
* Where to go when this step ends without a further hand-off — the terminal
|
|
35
|
+
* step of a chain (submitting it), or a transition step whose follow-on never
|
|
36
|
+
* arrives (the wait times out). Independent of `x-lt-transition`, so a terminal
|
|
37
|
+
* form can declare it without opting into the wait screen.
|
|
38
|
+
*
|
|
39
|
+
* The value is an href template using the same `{{domain.path}}` syntax and
|
|
40
|
+
* routing conventions as `x-lt-href` (see LinkWidget): an internal path
|
|
41
|
+
* (`/escalations/available?role=…`) navigates in-app; anything else opens
|
|
42
|
+
* externally. A page reached via a forward transition can't rely on
|
|
43
|
+
* `history.back()`, so this states the destination explicitly. Returns the raw
|
|
44
|
+
* template (interpolate it against the escalation context before navigating),
|
|
45
|
+
* or null when absent.
|
|
46
|
+
*/
|
|
47
|
+
export declare function readTransitionDone(schema: Record<string, unknown> | null | undefined): string | null;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* x-lt-transition — post-submit hand-off UX. A form_schema may declare, at its
|
|
4
|
+
* schema root, that submitting one of its escalations should pause on a wait
|
|
5
|
+
* screen instead of returning to the previous page — because a follow-on
|
|
6
|
+
* escalation is about to be born assigned to the submitter (a chained hand-off).
|
|
7
|
+
*
|
|
8
|
+
* x-lt-transition boolean — opt in to the wait screen
|
|
9
|
+
* x-lt-transition-message markdown — shown on the wait screen
|
|
10
|
+
* x-lt-transition-max-wait-seconds number — how long to wait for the
|
|
11
|
+
* follow-on before running the fallback
|
|
12
|
+
* query (clamped to a sane range)
|
|
13
|
+
*
|
|
14
|
+
* These tokens control ONLY the UX. Navigation to the follow-on is driven by the
|
|
15
|
+
* engine's born-assigned `claimed` event (assigned_to + parent_id +
|
|
16
|
+
* assigned_at_creation); the schema carries no navigation target and no metadata
|
|
17
|
+
* is used.
|
|
18
|
+
*/
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.X_LT_TRANSITION_DONE = exports.X_LT_TRANSITION_MAX_WAIT_SECONDS = exports.X_LT_TRANSITION_MESSAGE = exports.X_LT_TRANSITION = void 0;
|
|
21
|
+
exports.readTransitionConfig = readTransitionConfig;
|
|
22
|
+
exports.readTransitionDone = readTransitionDone;
|
|
23
|
+
exports.X_LT_TRANSITION = 'x-lt-transition';
|
|
24
|
+
exports.X_LT_TRANSITION_MESSAGE = 'x-lt-transition-message';
|
|
25
|
+
exports.X_LT_TRANSITION_MAX_WAIT_SECONDS = 'x-lt-transition-max-wait-seconds';
|
|
26
|
+
exports.X_LT_TRANSITION_DONE = 'x-lt-transition-done';
|
|
27
|
+
const DEFAULT_MESSAGE = 'Submitted. Preparing your next step…';
|
|
28
|
+
const DEFAULT_MAX_WAIT_SECONDS = 30;
|
|
29
|
+
const MIN_MAX_WAIT_SECONDS = 5;
|
|
30
|
+
const MAX_MAX_WAIT_SECONDS = 300;
|
|
31
|
+
function clampWaitSeconds(value) {
|
|
32
|
+
const n = typeof value === 'number' ? value : Number(value);
|
|
33
|
+
if (!Number.isFinite(n) || n <= 0)
|
|
34
|
+
return DEFAULT_MAX_WAIT_SECONDS;
|
|
35
|
+
return Math.min(MAX_MAX_WAIT_SECONDS, Math.max(MIN_MAX_WAIT_SECONDS, Math.round(n)));
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* The schema's transition config, or null when the schema does not opt in.
|
|
39
|
+
* `x-lt-transition` must be truthy; message and max-wait fall back to defaults.
|
|
40
|
+
*/
|
|
41
|
+
function readTransitionConfig(schema) {
|
|
42
|
+
if (!schema || !schema[exports.X_LT_TRANSITION])
|
|
43
|
+
return null;
|
|
44
|
+
const rawMessage = schema[exports.X_LT_TRANSITION_MESSAGE];
|
|
45
|
+
const message = typeof rawMessage === 'string' && rawMessage.trim().length > 0 ? rawMessage : DEFAULT_MESSAGE;
|
|
46
|
+
return { message, maxWaitSeconds: clampWaitSeconds(schema[exports.X_LT_TRANSITION_MAX_WAIT_SECONDS]) };
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Where to go when this step ends without a further hand-off — the terminal
|
|
50
|
+
* step of a chain (submitting it), or a transition step whose follow-on never
|
|
51
|
+
* arrives (the wait times out). Independent of `x-lt-transition`, so a terminal
|
|
52
|
+
* form can declare it without opting into the wait screen.
|
|
53
|
+
*
|
|
54
|
+
* The value is an href template using the same `{{domain.path}}` syntax and
|
|
55
|
+
* routing conventions as `x-lt-href` (see LinkWidget): an internal path
|
|
56
|
+
* (`/escalations/available?role=…`) navigates in-app; anything else opens
|
|
57
|
+
* externally. A page reached via a forward transition can't rely on
|
|
58
|
+
* `history.back()`, so this states the destination explicitly. Returns the raw
|
|
59
|
+
* template (interpolate it against the escalation context before navigating),
|
|
60
|
+
* or null when absent.
|
|
61
|
+
*/
|
|
62
|
+
function readTransitionDone(schema) {
|
|
63
|
+
const raw = schema?.[exports.X_LT_TRANSITION_DONE];
|
|
64
|
+
return typeof raw === 'string' && raw.trim().length > 0 ? raw : null;
|
|
65
|
+
}
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
* topics.ts — routes/topics.ts
|
|
22
22
|
* settings.ts — routes/settings.ts
|
|
23
23
|
* exports.ts — routes/exports.ts
|
|
24
|
+
* scan-codes.ts — routes/scan-codes.ts
|
|
24
25
|
*
|
|
25
26
|
* This server replaces three previously separate servers:
|
|
26
27
|
* - long-tail-db-query (read-only task/escalation/health queries)
|
|
@@ -26,6 +26,7 @@ exports.stopAdminServer = stopAdminServer;
|
|
|
26
26
|
* topics.ts — routes/topics.ts
|
|
27
27
|
* settings.ts — routes/settings.ts
|
|
28
28
|
* exports.ts — routes/exports.ts
|
|
29
|
+
* scan-codes.ts — routes/scan-codes.ts
|
|
29
30
|
*
|
|
30
31
|
* This server replaces three previously separate servers:
|
|
31
32
|
* - long-tail-db-query (read-only task/escalation/health queries)
|
|
@@ -58,7 +59,8 @@ const exports_1 = require("./exports");
|
|
|
58
59
|
const overview_1 = require("./overview");
|
|
59
60
|
const diagnostics_1 = require("./diagnostics");
|
|
60
61
|
const ortho_1 = require("./ortho");
|
|
61
|
-
const
|
|
62
|
+
const scan_codes_1 = require("./scan-codes");
|
|
63
|
+
const TOOL_COUNT = 105;
|
|
62
64
|
let server = null;
|
|
63
65
|
async function createAdminServer(options) {
|
|
64
66
|
if (server && !options?.fresh)
|
|
@@ -88,7 +90,8 @@ async function createAdminServer(options) {
|
|
|
88
90
|
(0, overview_1.registerOverviewTools)(instance); // 1 tool
|
|
89
91
|
(0, diagnostics_1.registerDiagnosticsTools)(instance); // 3 tools
|
|
90
92
|
(0, ortho_1.registerOrthoTools)(instance); // 4 tools
|
|
91
|
-
//
|
|
93
|
+
(0, scan_codes_1.registerScanCodeTools)(instance); // 5 tools (scan schemes + rules + execute)
|
|
94
|
+
// Total: 105
|
|
92
95
|
logger_1.loggerRegistry.info(`[lt-mcp:admin] ${name} ready (${TOOL_COUNT} tools registered)`);
|
|
93
96
|
return instance;
|
|
94
97
|
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scan-code tools — mirrors routes/scan-codes.ts
|
|
3
|
+
*
|
|
4
|
+
* Schemes map a code's leading two digits (10-99) to a target metadata facet
|
|
5
|
+
* and parse shape; rules map a single-digit category (0-9) to ordered
|
|
6
|
+
* condition/action steps over the escalation surface. execute_scan_code runs a raw code as
|
|
7
|
+
* the lt-system principal (see escalations.ts for the principal rationale).
|
|
8
|
+
*/
|
|
9
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
10
|
+
export declare function registerScanCodeTools(server: McpServer): void;
|
|
@@ -0,0 +1,111 @@
|
|
|
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.registerScanCodeTools = registerScanCodeTools;
|
|
37
|
+
const scanCodesApi = __importStar(require("../../../api/scan-codes"));
|
|
38
|
+
const iam_1 = require("../../../services/iam");
|
|
39
|
+
const schemas_1 = require("./schemas");
|
|
40
|
+
let systemPrincipalId = null;
|
|
41
|
+
async function systemAuth() {
|
|
42
|
+
if (!systemPrincipalId)
|
|
43
|
+
systemPrincipalId = await (0, iam_1.ensureSystemBot)();
|
|
44
|
+
return { userId: systemPrincipalId, role: 'superadmin' };
|
|
45
|
+
}
|
|
46
|
+
function asText(payload) {
|
|
47
|
+
return { content: [{ type: 'text', text: JSON.stringify(payload) }] };
|
|
48
|
+
}
|
|
49
|
+
function registerScanCodeTools(server) {
|
|
50
|
+
// mirrors POST /api/scan-codes/execute
|
|
51
|
+
server.registerTool('execute_scan_code', {
|
|
52
|
+
title: 'Execute Scan Code',
|
|
53
|
+
description: 'Execute a raw scan code (version:category:target). Parses against the ' +
|
|
54
|
+
'configured schemes, walks the rule\'s condition/action steps, and returns ' +
|
|
55
|
+
'a structured outcome (executed, confirm_required, matched_list, ' +
|
|
56
|
+
'no_match_fallback, unconfigured, invalid_code, forbidden, conflict).',
|
|
57
|
+
inputSchema: schemas_1.executeScanCodeSchema,
|
|
58
|
+
}, async (args) => {
|
|
59
|
+
const result = await scanCodesApi.executeScanCode({ code: args.code }, await systemAuth());
|
|
60
|
+
return asText(result.data ?? { error: result.error });
|
|
61
|
+
});
|
|
62
|
+
// mirrors GET /api/scan-codes/schemes
|
|
63
|
+
server.registerTool('list_scan_schemes', {
|
|
64
|
+
title: 'List Scan Schemes',
|
|
65
|
+
description: 'List all scan-code schemes (version, name, target facet, encoding).',
|
|
66
|
+
inputSchema: schemas_1.listScanSchemesSchema,
|
|
67
|
+
}, async (_args) => {
|
|
68
|
+
const result = await scanCodesApi.listScanSchemes();
|
|
69
|
+
return asText(result.data ?? { error: result.error });
|
|
70
|
+
});
|
|
71
|
+
// mirrors PUT /api/scan-codes/schemes/:version
|
|
72
|
+
server.registerTool('upsert_scan_scheme', {
|
|
73
|
+
title: 'Upsert Scan Scheme',
|
|
74
|
+
description: 'Create or replace a scan scheme: which metadata facet the scanned target ' +
|
|
75
|
+
'resolves against and how the code string parses (fixed digits or delimited text).',
|
|
76
|
+
inputSchema: schemas_1.upsertScanSchemeSchema,
|
|
77
|
+
}, async (args) => {
|
|
78
|
+
const result = await scanCodesApi.upsertScanScheme(args);
|
|
79
|
+
return asText(result.data ?? { error: result.error });
|
|
80
|
+
});
|
|
81
|
+
// mirrors PUT /api/scan-codes/schemes/:version/actions/:category
|
|
82
|
+
server.registerTool('upsert_scan_rule', {
|
|
83
|
+
title: 'Upsert Scan Rule',
|
|
84
|
+
description: 'Create or replace a scan rule for a scheme category: a friendly name, ' +
|
|
85
|
+
'ordered condition/action steps (first matching query wins its verb), and ' +
|
|
86
|
+
'a fallback screen when nothing matches.',
|
|
87
|
+
inputSchema: schemas_1.upsertScanRuleSchema,
|
|
88
|
+
}, async (args) => {
|
|
89
|
+
const result = await scanCodesApi.upsertScanRule({
|
|
90
|
+
scheme_version: args.scheme_version,
|
|
91
|
+
category: args.category,
|
|
92
|
+
name: args.name,
|
|
93
|
+
steps: args.steps,
|
|
94
|
+
fallback: args.fallback,
|
|
95
|
+
enabled: args.enabled,
|
|
96
|
+
});
|
|
97
|
+
return asText(result.data ?? { error: result.error });
|
|
98
|
+
});
|
|
99
|
+
// mirrors DELETE /api/scan-codes/schemes/:version/actions/:category
|
|
100
|
+
server.registerTool('delete_scan_rule', {
|
|
101
|
+
title: 'Delete Scan Rule',
|
|
102
|
+
description: 'Delete one scan rule (scheme version + two-digit category).',
|
|
103
|
+
inputSchema: schemas_1.deleteScanRuleSchema,
|
|
104
|
+
}, async (args) => {
|
|
105
|
+
const result = await scanCodesApi.deleteScanRule({
|
|
106
|
+
version: args.scheme_version,
|
|
107
|
+
category: args.category,
|
|
108
|
+
});
|
|
109
|
+
return asText(result.data ?? { error: result.error });
|
|
110
|
+
});
|
|
111
|
+
}
|