@hotmeshio/long-tail 0.30.4 → 0.31.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/api/escalations/index.d.ts +1 -0
- package/build/api/escalations/index.js +5 -2
- package/build/api/escalations/roster-action.d.ts +11 -0
- package/build/api/escalations/roster-action.js +47 -30
- package/build/api/escalations/roster-scan.d.ts +26 -0
- package/build/api/escalations/roster-scan.js +114 -0
- package/build/api/labels/errors.d.ts +3 -0
- package/build/api/labels/errors.js +15 -0
- package/build/api/labels/index.d.ts +2 -0
- package/build/api/labels/index.js +17 -0
- package/build/api/labels/issue.d.ts +54 -0
- package/build/api/labels/issue.js +144 -0
- package/build/api/labels/templates.d.ts +29 -0
- package/build/api/labels/templates.js +98 -0
- package/build/api/scan-codes/context.d.ts +9 -1
- package/build/api/scan-codes/context.js +16 -1
- package/build/api/scan-codes/execute.js +6 -1
- package/build/api/scan-codes/fill-labels.d.ts +8 -0
- package/build/api/scan-codes/fill-labels.js +23 -2
- package/build/api/scan-codes/hold.js +2 -0
- package/build/api/scan-codes/located.d.ts +10 -0
- package/build/api/scan-codes/located.js +74 -0
- package/build/api/scan-codes/open.d.ts +9 -0
- package/build/api/scan-codes/open.js +99 -0
- package/build/api/scan-codes/present.js +1 -0
- package/build/api/scan-codes/verb-fill.js +1 -1
- package/build/api/users.d.ts +8 -4
- package/build/api/users.js +51 -13
- package/build/index.d.ts +1 -0
- package/build/index.js +4 -2
- package/build/lib/db/schemas/044_label_sheets.sql +65 -0
- package/build/lib/db/schemas/045_label_job_delivery.sql +14 -0
- package/build/lib/labels/transports.d.ts +23 -0
- package/build/lib/labels/transports.js +39 -0
- package/build/modules/auth.d.ts +2 -0
- package/build/modules/auth.js +3 -1
- package/build/modules/capabilities.d.ts +5 -1
- package/build/modules/capabilities.js +38 -8
- package/build/modules/config.d.ts +10 -0
- package/build/modules/config.js +10 -0
- package/build/routes/escalations/resolve.js +18 -0
- package/build/routes/index.js +2 -0
- package/build/routes/labels.d.ts +2 -0
- package/build/routes/labels.js +135 -0
- package/build/routes/users.js +1 -1
- package/build/services/labels/content.d.ts +13 -0
- package/build/services/labels/content.js +81 -0
- package/build/services/labels/errors.d.ts +5 -0
- package/build/services/labels/errors.js +12 -0
- package/build/services/labels/index.d.ts +11 -0
- package/build/services/labels/index.js +52 -0
- package/build/services/labels/issue.d.ts +38 -0
- package/build/services/labels/issue.js +181 -0
- package/build/services/labels/jobs.d.ts +37 -0
- package/build/services/labels/jobs.js +75 -0
- package/build/services/labels/media.d.ts +11 -0
- package/build/services/labels/media.js +44 -0
- package/build/services/labels/reissue.d.ts +13 -0
- package/build/services/labels/reissue.js +65 -0
- package/build/services/labels/render-pdf.d.ts +11 -0
- package/build/services/labels/render-pdf.js +138 -0
- package/build/services/labels/targets.d.ts +18 -0
- package/build/services/labels/targets.js +216 -0
- package/build/services/labels/templates/index.d.ts +3 -0
- package/build/services/labels/templates/index.js +18 -0
- package/build/services/labels/templates/read.d.ts +4 -0
- package/build/services/labels/templates/read.js +36 -0
- package/build/services/labels/templates/sql.d.ts +8 -0
- package/build/services/labels/templates/sql.js +50 -0
- package/build/services/labels/templates/validate.d.ts +19 -0
- package/build/services/labels/templates/validate.js +93 -0
- package/build/services/labels/templates/write.d.ts +16 -0
- package/build/services/labels/templates/write.js +75 -0
- package/build/services/labels/token.d.ts +9 -0
- package/build/services/labels/token.js +28 -0
- package/build/services/labels/verify.d.ts +4 -0
- package/build/services/labels/verify.js +38 -0
- package/build/services/role/index.d.ts +2 -0
- package/build/services/role/index.js +7 -0
- package/build/services/role/scan-done.js +4 -1
- package/build/services/role/sql.d.ts +1 -0
- package/build/services/role/sql.js +3 -1
- package/build/services/role/types.d.ts +2 -0
- package/build/services/scan-code/index.d.ts +1 -1
- package/build/services/scan-code/index.js +2 -1
- package/build/services/scan-code/parse.d.ts +5 -1
- package/build/services/scan-code/parse.js +8 -2
- package/build/services/scan-code/validate-station.d.ts +13 -0
- package/build/services/scan-code/validate-station.js +81 -0
- package/build/services/scan-code/validate-subject.js +33 -6
- package/build/services/scan-code/validate.d.ts +3 -0
- package/build/services/scan-code/validate.js +22 -18
- package/build/services/user/crud.d.ts +13 -1
- package/build/services/user/crud.js +42 -11
- package/build/services/user/index.d.ts +3 -2
- package/build/services/user/index.js +7 -1
- package/build/services/user/redact.d.ts +17 -0
- package/build/services/user/redact.js +32 -0
- package/build/services/user/sql.d.ts +8 -15
- package/build/services/user/sql.js +27 -3
- package/build/services/user/types.d.ts +21 -1
- package/build/shared/labels/compose.d.ts +12 -0
- package/build/shared/labels/compose.js +43 -0
- package/build/shared/labels/index.d.ts +9 -0
- package/build/shared/labels/index.js +54 -0
- package/build/shared/labels/label-content.d.ts +17 -0
- package/build/shared/labels/label-content.js +137 -0
- package/build/shared/labels/layout.d.ts +23 -0
- package/build/shared/labels/layout.js +81 -0
- package/build/shared/labels/media.d.ts +22 -0
- package/build/shared/labels/media.js +116 -0
- package/build/shared/labels/render-svg.d.ts +10 -0
- package/build/shared/labels/render-svg.js +58 -0
- package/build/shared/labels/render-zpl.d.ts +9 -0
- package/build/shared/labels/render-zpl.js +63 -0
- package/build/shared/labels/symbol.d.ts +18 -0
- package/build/shared/labels/symbol.js +74 -0
- package/build/shared/labels/tokens.d.ts +18 -0
- package/build/shared/labels/tokens.js +43 -0
- package/build/shared/labels/types.d.ts +105 -0
- package/build/shared/labels/types.js +11 -0
- package/build/start/adapters.js +16 -0
- package/build/start/workers.js +18 -2
- package/build/system/mcp-servers/admin/index.js +2 -0
- package/build/system/mcp-servers/admin/labels-schemas.d.ts +192 -0
- package/build/system/mcp-servers/admin/labels-schemas.js +46 -0
- package/build/system/mcp-servers/admin/labels.d.ts +9 -0
- package/build/system/mcp-servers/admin/labels.js +101 -0
- package/build/system/mcp-servers/admin/schemas.d.ts +491 -24
- package/build/system/mcp-servers/admin/schemas.js +32 -4
- package/build/system/mcp-servers/admin/users.js +1 -1
- package/build/system/seed/tool-manifests-admin.js +5 -0
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/capability.d.ts +2 -1
- package/build/types/index.d.ts +3 -2
- package/build/types/labels/index.d.ts +4 -0
- package/build/types/labels/index.js +2 -0
- package/build/types/labels/job.d.ts +51 -0
- package/build/types/labels/job.js +2 -0
- package/build/types/labels/source.d.ts +44 -0
- package/build/types/labels/source.js +2 -0
- package/build/types/labels/template.d.ts +46 -0
- package/build/types/labels/template.js +2 -0
- package/build/types/labels/transport.d.ts +24 -0
- package/build/types/labels/transport.js +2 -0
- package/build/types/scan-choice.d.ts +2 -4
- package/build/types/scan-code/constants.d.ts +1 -0
- package/build/types/scan-code/constants.js +1 -0
- package/build/types/scan-code/response.d.ts +22 -4
- package/build/types/scan-code/rule.d.ts +66 -3
- package/build/types/startup.d.ts +37 -0
- package/build/types/user.d.ts +2 -0
- package/dashboard/dist/assets/{AdminDashboard-VQ1fhhJP.js → AdminDashboard-BafKaq50.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-VQ1fhhJP.js.map → AdminDashboard-BafKaq50.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-BOe_W2Ij.js → AgentConfigPage-CFHf31DT.js} +6 -6
- package/dashboard/dist/assets/{AgentConfigPage-BOe_W2Ij.js.map → AgentConfigPage-CFHf31DT.js.map} +1 -1
- package/dashboard/dist/assets/{AgentDetailPage-5ov5D9V2.js → AgentDetailPage-CEvz5rJr.js} +3 -3
- package/dashboard/dist/assets/{AgentDetailPage-5ov5D9V2.js.map → AgentDetailPage-CEvz5rJr.js.map} +1 -1
- package/dashboard/dist/assets/{AgentsPage-DDFMKHhI.js → AgentsPage-DjQaio0O.js} +2 -2
- package/dashboard/dist/assets/{AgentsPage-DDFMKHhI.js.map → AgentsPage-DjQaio0O.js.map} +1 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-UB03VTJx.js +2 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-UB03VTJx.js.map +1 -0
- package/dashboard/dist/assets/{BotPicker-Dqpo36dM.js → BotPicker-C7MNWOF7.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-Dqpo36dM.js.map → BotPicker-C7MNWOF7.js.map} +1 -1
- package/dashboard/dist/assets/BulkAssignModal-h5fX-_cV.js +2 -0
- package/dashboard/dist/assets/{BulkAssignModal-CmLVxkz-.js.map → BulkAssignModal-h5fX-_cV.js.map} +1 -1
- package/dashboard/dist/assets/{CapabilitiesPage-Dfkip6_b.js → CapabilitiesPage-BIzDl-ZT.js} +2 -2
- package/dashboard/dist/assets/{CapabilitiesPage-Dfkip6_b.js.map → CapabilitiesPage-BIzDl-ZT.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-CYNYMYSa.js → CollapsibleSection-B5TivtEg.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-CYNYMYSa.js.map → CollapsibleSection-B5TivtEg.js.map} +1 -1
- package/dashboard/dist/assets/{ConfirmDeleteModal-CpJNP-8w.js → ConfirmDeleteModal-CB4nKePb.js} +2 -2
- package/dashboard/dist/assets/{ConfirmDeleteModal-CpJNP-8w.js.map → ConfirmDeleteModal-CB4nKePb.js.map} +1 -1
- package/dashboard/dist/assets/{ConnectedAppsPage-DXIp2Dpl.js → ConnectedAppsPage-B3S5gVWw.js} +2 -2
- package/dashboard/dist/assets/{ConnectedAppsPage-DXIp2Dpl.js.map → ConnectedAppsPage-B3S5gVWw.js.map} +1 -1
- package/dashboard/dist/assets/{CountdownTimer-CuPY7zkb.js → CountdownTimer-BHVIq3kA.js} +2 -2
- package/dashboard/dist/assets/{CountdownTimer-CuPY7zkb.js.map → CountdownTimer-BHVIq3kA.js.map} +1 -1
- package/dashboard/dist/assets/CredentialConfirmModal-w0AGmCIe.js +2 -0
- package/dashboard/dist/assets/CredentialConfirmModal-w0AGmCIe.js.map +1 -0
- package/dashboard/dist/assets/{CredentialsPage-CtrnkHcj.js → CredentialsPage-BtCGBJrT.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-CtrnkHcj.js.map → CredentialsPage-BtCGBJrT.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-DVjTw5Ri.js → CronLabel-BG1rZK-5.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-DVjTw5Ri.js.map → CronLabel-BG1rZK-5.js.map} +1 -1
- package/dashboard/dist/assets/{DropZone-DefYTYQy.js → DropZone-D8ZVdEb5.js} +2 -2
- package/dashboard/dist/assets/{DropZone-DefYTYQy.js.map → DropZone-D8ZVdEb5.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-gY_mGMTF.js → ElapsedCell-l4m8Yvfv.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-gY_mGMTF.js.map → ElapsedCell-l4m8Yvfv.js.map} +1 -1
- package/dashboard/dist/assets/{EntityTimelinePanel-DJN_ZEQa.js → EntityTimelinePanel-BOHlIaxF.js} +2 -2
- package/dashboard/dist/assets/{EntityTimelinePanel-DJN_ZEQa.js.map → EntityTimelinePanel-BOHlIaxF.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationListSchemaPage-A4KpTdJA.js → EscalationListSchemaPage-BotlwlX3.js} +3 -3
- package/dashboard/dist/assets/{EscalationListSchemaPage-A4KpTdJA.js.map → EscalationListSchemaPage-BotlwlX3.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationSchemaPage-nfCn42hT.js → EscalationSchemaPage-CfZSVOSD.js} +3 -3
- package/dashboard/dist/assets/{EscalationSchemaPage-nfCn42hT.js.map → EscalationSchemaPage-CfZSVOSD.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationTimeline-CLvSr1SD.js → EscalationTimeline-CCKpuRBU.js} +2 -2
- package/dashboard/dist/assets/{EscalationTimeline-CLvSr1SD.js.map → EscalationTimeline-CCKpuRBU.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationTitleSelect-CT7mYHkb.js → EscalationTitleSelect-cpTzPHiW.js} +2 -2
- package/dashboard/dist/assets/{EscalationTitleSelect-CT7mYHkb.js.map → EscalationTitleSelect-cpTzPHiW.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-CKaGRh-E.js → EscalationsOverview-DS-nK0qV.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-CKaGRh-E.js.map → EscalationsOverview-DS-nK0qV.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-2ywJsOLy.js → EventTable-UfebhJf0.js} +2 -2
- package/dashboard/dist/assets/{EventTable-2ywJsOLy.js.map → EventTable-UfebhJf0.js.map} +1 -1
- package/dashboard/dist/assets/{FilterBar-Dy0b7wwf.js → FilterBar-newA5l-X.js} +2 -2
- package/dashboard/dist/assets/{FilterBar-Dy0b7wwf.js.map → FilterBar-newA5l-X.js.map} +1 -1
- package/dashboard/dist/assets/{GraphInvokePage-yOVpraAy.js → GraphInvokePage-6SCDyQcK.js} +2 -2
- package/dashboard/dist/assets/{GraphInvokePage-yOVpraAy.js.map → GraphInvokePage-6SCDyQcK.js.map} +1 -1
- package/dashboard/dist/assets/HomePage-BEc-XdKj.js +2 -0
- package/dashboard/dist/assets/{HomePage-67xXjKjN.js.map → HomePage-BEc-XdKj.js.map} +1 -1
- package/dashboard/dist/assets/LabelJobsPage-BO50zXT5.js +2 -0
- package/dashboard/dist/assets/LabelJobsPage-BO50zXT5.js.map +1 -0
- package/dashboard/dist/assets/{LinePage-CMsYtukW.js → LinePage-NYxJQ-ex.js} +3 -3
- package/dashboard/dist/assets/{LinePage-CMsYtukW.js.map → LinePage-NYxJQ-ex.js.map} +1 -1
- package/dashboard/dist/assets/{LinesPage-pwL46mOS.js → LinesPage-RbWTaQRh.js} +3 -3
- package/dashboard/dist/assets/{LinesPage-pwL46mOS.js.map → LinesPage-RbWTaQRh.js.map} +1 -1
- package/dashboard/dist/assets/{ListToolbar-CJmvGy2B.js → ListToolbar-B-E9-toh.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar-CJmvGy2B.js.map → ListToolbar-B-E9-toh.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-DA9LLvNG.js → McpOverview-Shcf9QhZ.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-DA9LLvNG.js.map → McpOverview-Shcf9QhZ.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-N7qLmfE8.js → McpQueryDetailPage-D8kmjy2v.js} +3 -3
- package/dashboard/dist/assets/{McpQueryDetailPage-N7qLmfE8.js.map → McpQueryDetailPage-D8kmjy2v.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryPage-CpsP3w7x.js → McpQueryPage-ck-o5m8A.js} +2 -2
- package/dashboard/dist/assets/{McpQueryPage-CpsP3w7x.js.map → McpQueryPage-ck-o5m8A.js.map} +1 -1
- package/dashboard/dist/assets/McpRunDetailPage-BJKkM9-3.js +2 -0
- package/dashboard/dist/assets/{McpRunDetailPage-qHRQ1pEY.js.map → McpRunDetailPage-BJKkM9-3.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunsPage-BRDDYpTM.js → McpRunsPage-DqhHfD5G.js} +2 -2
- package/dashboard/dist/assets/{McpRunsPage-BRDDYpTM.js.map → McpRunsPage-DqhHfD5G.js.map} +1 -1
- package/dashboard/dist/assets/{NamespacePill-CeSfHH-j.js → NamespacePill--uIaGtrN.js} +2 -2
- package/dashboard/dist/assets/{NamespacePill-CeSfHH-j.js.map → NamespacePill--uIaGtrN.js.map} +1 -1
- package/dashboard/dist/assets/{OperationsPage-zUaab-CL.js → OperationsPage-D6B9Vv__.js} +3 -3
- package/dashboard/dist/assets/{OperationsPage-zUaab-CL.js.map → OperationsPage-D6B9Vv__.js.map} +1 -1
- package/dashboard/dist/assets/OperatorDashboard-CIH1cxjQ.js +2 -0
- package/dashboard/dist/assets/{OperatorDashboard-el5BquXN.js.map → OperatorDashboard-CIH1cxjQ.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeader-DiGWAQlR.js → PageHeader-DClJ33fV.js} +2 -2
- package/dashboard/dist/assets/{PageHeader-DiGWAQlR.js.map → PageHeader-DClJ33fV.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeaderWithStats-DwnKQ06j.js → PageHeaderWithStats-C-TrbKQL.js} +2 -2
- package/dashboard/dist/assets/{PageHeaderWithStats-DwnKQ06j.js.map → PageHeaderWithStats-C-TrbKQL.js.map} +1 -1
- package/dashboard/dist/assets/PersonaDetailPage-DjvfyIph.js +2 -0
- package/dashboard/dist/assets/{PersonaDetailPage-B_tb8gfl.js.map → PersonaDetailPage-DjvfyIph.js.map} +1 -1
- package/dashboard/dist/assets/{PersonasPage-BPI7mqM8.js → PersonasPage-D7ryA8Vc.js} +2 -2
- package/dashboard/dist/assets/{PersonasPage-BPI7mqM8.js.map → PersonasPage-D7ryA8Vc.js.map} +1 -1
- package/dashboard/dist/assets/{PortalPage-e_rBb1do.js → PortalPage-D3ybr0mo.js} +2 -2
- package/dashboard/dist/assets/{PortalPage-e_rBb1do.js.map → PortalPage-D3ybr0mo.js.map} +1 -1
- package/dashboard/dist/assets/PrintLabelsPanel-D0HF5x8b.js +2 -0
- package/dashboard/dist/assets/PrintLabelsPanel-D0HF5x8b.js.map +1 -0
- package/dashboard/dist/assets/{ProcessDetailPage-D35RX1bB.js → ProcessDetailPage-0xS9EdHe.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-D35RX1bB.js.map → ProcessDetailPage-0xS9EdHe.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-CT81miI5.js → ProcessesListPage-93SMj1Fd.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-CT81miI5.js.map → ProcessesListPage-93SMj1Fd.js.map} +1 -1
- package/dashboard/dist/assets/{ResolverForm-BxJkoKAO.js → ResolverForm-DfogHDzl.js} +5 -5
- package/dashboard/dist/assets/{ResolverForm-BxJkoKAO.js.map → ResolverForm-DfogHDzl.js.map} +1 -1
- package/dashboard/dist/assets/RoleDetailPage-DlUOJWSB.js +8 -0
- package/dashboard/dist/assets/{RoleDetailPage-DtU7vsJm.js.map → RoleDetailPage-DlUOJWSB.js.map} +1 -1
- package/dashboard/dist/assets/{RolePill-D3hkAdKf.js → RolePill-BjD1Qw5y.js} +2 -2
- package/dashboard/dist/assets/{RolePill-D3hkAdKf.js.map → RolePill-BjD1Qw5y.js.map} +1 -1
- package/dashboard/dist/assets/RolesPage-DqhHSvaw.js +2 -0
- package/dashboard/dist/assets/{RolesPage-BE7RWt9q.js.map → RolesPage-DqhHSvaw.js.map} +1 -1
- package/dashboard/dist/assets/{RosterWidget-BJMx0a8Z.js → RosterWidget-BrIq61HR.js} +2 -2
- package/dashboard/dist/assets/RosterWidget-BrIq61HR.js.map +1 -0
- package/dashboard/dist/assets/RunAsSelector-D6zQrCNr.js +2 -0
- package/dashboard/dist/assets/{RunAsSelector-Co6s9bqA.js.map → RunAsSelector-D6zQrCNr.js.map} +1 -1
- package/dashboard/dist/assets/ScanCodesPage-B2S9DR2f.js +2 -0
- package/dashboard/dist/assets/{ScanCodesPage-C2TETaj5.js.map → ScanCodesPage-B2S9DR2f.js.map} +1 -1
- package/dashboard/dist/assets/ScanSchemeDetailPage-gpxKN-pL.js +5 -0
- package/dashboard/dist/assets/ScanSchemeDetailPage-gpxKN-pL.js.map +1 -0
- package/dashboard/dist/assets/ScanStationPage-B-UTgXsG.js +2 -0
- package/dashboard/dist/assets/ScanStationPage-B-UTgXsG.js.map +1 -0
- package/dashboard/dist/assets/{SchemeMatchFields-9H7SmbED.js → SchemeMatchFields-BK24aa7K.js} +2 -2
- package/dashboard/dist/assets/{SchemeMatchFields-9H7SmbED.js.map → SchemeMatchFields-BK24aa7K.js.map} +1 -1
- package/dashboard/dist/assets/{ScopeBadge-DGz79rmG.js → ScopeBadge-ofLQ6HW-.js} +2 -2
- package/dashboard/dist/assets/{ScopeBadge-DGz79rmG.js.map → ScopeBadge-ofLQ6HW-.js.map} +1 -1
- package/dashboard/dist/assets/{StickyPagination-miUdVAKw.js → StickyPagination-CgVv7vc_.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-miUdVAKw.js.map → StickyPagination-CgVv7vc_.js.map} +1 -1
- package/dashboard/dist/assets/{StreamMessageDetail-D5Rk7pn7.js → StreamMessageDetail-B9sxDVw4.js} +2 -2
- package/dashboard/dist/assets/{StreamMessageDetail-D5Rk7pn7.js.map → StreamMessageDetail-B9sxDVw4.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-B1QY1ZzH.js → SwimlaneTimeline-DQc0CYSL.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-B1QY1ZzH.js.map → SwimlaneTimeline-DQc0CYSL.js.map} +1 -1
- package/dashboard/dist/assets/{TagInput-DaIdhv3h.js → TagInput-47qVYzke.js} +2 -2
- package/dashboard/dist/assets/{TagInput-DaIdhv3h.js.map → TagInput-47qVYzke.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-DKUM37o8.js → TaskDetailPage-D6VOsA1f.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-DKUM37o8.js.map → TaskDetailPage-D6VOsA1f.js.map} +1 -1
- package/dashboard/dist/assets/{TaskQueuePill-sUA1nZe-.js → TaskQueuePill-C5KmdXAl.js} +2 -2
- package/dashboard/dist/assets/{TaskQueuePill-sUA1nZe-.js.map → TaskQueuePill-C5KmdXAl.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-CUulwvm-.js → TasksListPage-DG8hvO8G.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-CUulwvm-.js.map → TasksListPage-DG8hvO8G.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-CHTelacB.js → TimeAgo-CL02EhFi.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-CHTelacB.js.map → TimeAgo-CL02EhFi.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-NanLWLKo.js → TimestampCell-BE7oKVJg.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-NanLWLKo.js.map → TimestampCell-BE7oKVJg.js.map} +1 -1
- package/dashboard/dist/assets/{ToolPill-CpBAFdEX.js → ToolPill-Cp9Drk1s.js} +2 -2
- package/dashboard/dist/assets/{ToolPill-CpBAFdEX.js.map → ToolPill-Cp9Drk1s.js.map} +1 -1
- package/dashboard/dist/assets/{ToolTestPanel-CF1CHzgz.js → ToolTestPanel-CRecLh6S.js} +2 -2
- package/dashboard/dist/assets/{ToolTestPanel-CF1CHzgz.js.map → ToolTestPanel-CRecLh6S.js.map} +1 -1
- package/dashboard/dist/assets/{TopicDetailPage-CGO8XV_a.js → TopicDetailPage-QzkinTfN.js} +3 -3
- package/dashboard/dist/assets/{TopicDetailPage-CGO8XV_a.js.map → TopicDetailPage-QzkinTfN.js.map} +1 -1
- package/dashboard/dist/assets/{TopicsPage-Bt8gOKYr.js → TopicsPage-D8dW6J65.js} +2 -2
- package/dashboard/dist/assets/{TopicsPage-Bt8gOKYr.js.map → TopicsPage-D8dW6J65.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-DKXnK7DD.js → UserName-Dw3R_zrl.js} +2 -2
- package/dashboard/dist/assets/{UserName-DKXnK7DD.js.map → UserName-Dw3R_zrl.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowExecutionPage-BTocv8or.js +2 -0
- package/dashboard/dist/assets/{WorkflowExecutionPage-Crf7AIFc.js.map → WorkflowExecutionPage-BTocv8or.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowPill-CKHip3hH.js → WorkflowPill-BiLYq__w.js} +2 -2
- package/dashboard/dist/assets/{WorkflowPill-CKHip3hH.js.map → WorkflowPill-BiLYq__w.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowsDashboard-CIPEt3et.js +2 -0
- package/dashboard/dist/assets/{WorkflowsDashboard--isjt06C.js.map → WorkflowsDashboard-CIPEt3et.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-D7Oqf4-V.js → WorkflowsOverview-Bj4MJIE-.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-D7Oqf4-V.js.map → WorkflowsOverview-Bj4MJIE-.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-B0wxgrGP.js → YamlWorkflowDetailPage-DMEk5k9-.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-B0wxgrGP.js.map → YamlWorkflowDetailPage-DMEk5k9-.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowsPage-BVdLnm6K.js → YamlWorkflowsPage-F2yyyoiB.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowsPage-BVdLnm6K.js.map → YamlWorkflowsPage-F2yyyoiB.js.map} +1 -1
- package/dashboard/dist/assets/{agents-CHjbjHXA.js → agents-mSgxEPpI.js} +2 -2
- package/dashboard/dist/assets/{agents-CHjbjHXA.js.map → agents-mSgxEPpI.js.map} +1 -1
- package/dashboard/dist/assets/{bots-WrUhEPWs.js → bots-p4Hp0CV6.js} +2 -2
- package/dashboard/dist/assets/{bots-WrUhEPWs.js.map → bots-p4Hp0CV6.js.map} +1 -1
- package/dashboard/dist/assets/{capabilities-CunMmkj8.js → capabilities-D_-I_SXR.js} +2 -2
- package/dashboard/dist/assets/{capabilities-CunMmkj8.js.map → capabilities-D_-I_SXR.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-D6IZIZoh.js → controlplane-DjdoQnRU.js} +2 -2
- package/dashboard/dist/assets/{controlplane-D6IZIZoh.js.map → controlplane-DjdoQnRU.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-columns-Bvo6JI4Z.js → escalation-columns-R_IEVQjQ.js} +2 -2
- package/dashboard/dist/assets/{escalation-columns-Bvo6JI4Z.js.map → escalation-columns-R_IEVQjQ.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-items-DFGRwo49.js → escalation-items-BGZlJMpk.js} +2 -2
- package/dashboard/dist/assets/{escalation-items-DFGRwo49.js.map → escalation-items-BGZlJMpk.js.map} +1 -1
- package/dashboard/dist/assets/{index-OuKQ_0eB.js → index-BEMdD58x.js} +2 -2
- package/dashboard/dist/assets/{index-OuKQ_0eB.js.map → index-BEMdD58x.js.map} +1 -1
- package/dashboard/dist/assets/index-BUmz0NMg.css +1 -0
- package/dashboard/dist/assets/{index-C7EIu1mG.js → index-BuCEhhnl.js} +2 -2
- package/dashboard/dist/assets/{index-C7EIu1mG.js.map → index-BuCEhhnl.js.map} +1 -1
- package/dashboard/dist/assets/{index-Bo8QU31k.js → index-BxbQmeqh.js} +2 -2
- package/dashboard/dist/assets/{index-Bo8QU31k.js.map → index-BxbQmeqh.js.map} +1 -1
- package/dashboard/dist/assets/index-C5osluV3.js +2 -0
- package/dashboard/dist/assets/{index-DRK7M1_9.js.map → index-C5osluV3.js.map} +1 -1
- package/dashboard/dist/assets/{index-ygxyAKcc.js → index-C_dAJUzh.js} +27 -27
- package/dashboard/dist/assets/index-C_dAJUzh.js.map +1 -0
- package/dashboard/dist/assets/{index-DRw0FXdX.js → index-D-FYj9jT.js} +2 -2
- package/dashboard/dist/assets/{index-DRw0FXdX.js.map → index-D-FYj9jT.js.map} +1 -1
- package/dashboard/dist/assets/{index-B8qrHwp9.js → index-D6K_IgCz.js} +2 -2
- package/dashboard/dist/assets/{index-B8qrHwp9.js.map → index-D6K_IgCz.js.map} +1 -1
- package/dashboard/dist/assets/index-D7L_VoBD.js +2 -0
- package/dashboard/dist/assets/index-D7L_VoBD.js.map +1 -0
- package/dashboard/dist/assets/{index-BZFSXEkr.js → index-D9RAN9sA.js} +2 -2
- package/dashboard/dist/assets/{index-BZFSXEkr.js.map → index-D9RAN9sA.js.map} +1 -1
- package/dashboard/dist/assets/{index-DCJ483vt.js → index-DUYAGxwc.js} +2 -2
- package/dashboard/dist/assets/{index-DCJ483vt.js.map → index-DUYAGxwc.js.map} +1 -1
- package/dashboard/dist/assets/{index-boT612Jo.js → index-Dk2KKo0z.js} +2 -2
- package/dashboard/dist/assets/{index-boT612Jo.js.map → index-Dk2KKo0z.js.map} +1 -1
- package/dashboard/dist/assets/{index-CpCchhQv.js → index-DlJkZ12b.js} +2 -2
- package/dashboard/dist/assets/{index-CpCchhQv.js.map → index-DlJkZ12b.js.map} +1 -1
- package/dashboard/dist/assets/index-FiNThtNU.js +3 -0
- package/dashboard/dist/assets/index-FiNThtNU.js.map +1 -0
- package/dashboard/dist/assets/{knowledge-BubJBTwg.js → knowledge-DSsPTqkK.js} +2 -2
- package/dashboard/dist/assets/{knowledge-BubJBTwg.js.map → knowledge-DSsPTqkK.js.map} +1 -1
- package/dashboard/dist/assets/{machines-DSm5NFgs.js → machines-DSgGtqqr.js} +2 -2
- package/dashboard/dist/assets/{machines-DSm5NFgs.js.map → machines-DSgGtqqr.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-D6MckqOV.js → mcp-Cg-_uLw8.js} +2 -2
- package/dashboard/dist/assets/{mcp-D6MckqOV.js.map → mcp-Cg-_uLw8.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-VyCdOag6.js → mcp-query-DQombEK_.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-VyCdOag6.js.map → mcp-query-DQombEK_.js.map} +1 -1
- package/dashboard/dist/assets/{personas-CyJc10xe.js → personas-DYrcoVBu.js} +2 -2
- package/dashboard/dist/assets/{personas-CyJc10xe.js.map → personas-DYrcoVBu.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-B2inDtx3.js → pipelines-wdb4xsey.js} +2 -2
- package/dashboard/dist/assets/{pipelines-B2inDtx3.js.map → pipelines-wdb4xsey.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-DOP4d3M6.js → tasks-Bil7gvm9.js} +2 -2
- package/dashboard/dist/assets/{tasks-DOP4d3M6.js.map → tasks-Bil7gvm9.js.map} +1 -1
- package/dashboard/dist/assets/{topics-CNOjSWpX.js → topics-wBqaVhRR.js} +2 -2
- package/dashboard/dist/assets/{topics-CNOjSWpX.js.map → topics-wBqaVhRR.js.map} +1 -1
- package/dashboard/dist/assets/{useDebouncedValue-CgO0TGMd.js → useDebouncedValue-CwrY8TpV.js} +2 -2
- package/dashboard/dist/assets/{useDebouncedValue-CgO0TGMd.js.map → useDebouncedValue-CwrY8TpV.js.map} +1 -1
- package/dashboard/dist/assets/{useNamespace-BWHvUKtK.js → useNamespace-Sod_xApz.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-BWHvUKtK.js.map → useNamespace-Sod_xApz.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-BZQ__ZGD.js → useYamlActivityEvents-CKLInV3C.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-BZQ__ZGD.js.map → useYamlActivityEvents-CKLInV3C.js.map} +1 -1
- package/dashboard/dist/assets/{validate-CAin6WM_.js → validate-CYhW1xMJ.js} +2 -2
- package/dashboard/dist/assets/{validate-CAin6WM_.js.map → validate-CYhW1xMJ.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-en0_uSRD.js → vendor-icons-ed7mYQw4.js} +2 -2
- package/dashboard/dist/assets/{vendor-icons-en0_uSRD.js.map → vendor-icons-ed7mYQw4.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-Dyln3od-.js → yaml-workflows-C20qHo3L.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-Dyln3od-.js.map → yaml-workflows-C20qHo3L.js.map} +1 -1
- package/dashboard/dist/index.html +3 -3
- package/docs/api/http/escalations.md +15 -0
- package/docs/api/http/labels.md +115 -0
- package/docs/api/http/users.md +2 -0
- package/docs/api/mcp/admin.md +76 -1
- package/docs/code-owned-configuration.md +1 -1
- package/docs/dashboard.md +2 -2
- package/docs/hitl/x-lt-roster.md +2 -0
- package/docs/hitl/x-lt-scan.md +12 -0
- package/docs/iam.md +12 -0
- package/docs/label-sheets.md +267 -0
- package/docs/scan-codes.md +93 -9
- package/package.json +4 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-GFn8Sgg1.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-GFn8Sgg1.js.map +0 -1
- package/dashboard/dist/assets/BulkAssignModal-CmLVxkz-.js +0 -2
- package/dashboard/dist/assets/HomePage-67xXjKjN.js +0 -2
- package/dashboard/dist/assets/McpRunDetailPage-qHRQ1pEY.js +0 -2
- package/dashboard/dist/assets/OperatorDashboard-el5BquXN.js +0 -2
- package/dashboard/dist/assets/PersonaDetailPage-B_tb8gfl.js +0 -2
- package/dashboard/dist/assets/RoleDetailPage-DtU7vsJm.js +0 -8
- package/dashboard/dist/assets/RolesPage-BE7RWt9q.js +0 -2
- package/dashboard/dist/assets/RosterWidget-BJMx0a8Z.js.map +0 -1
- package/dashboard/dist/assets/RunAsSelector-Co6s9bqA.js +0 -2
- package/dashboard/dist/assets/ScanCodesPage-C2TETaj5.js +0 -2
- package/dashboard/dist/assets/ScanSchemeDetailPage-C2UgU8l-.js +0 -5
- package/dashboard/dist/assets/ScanSchemeDetailPage-C2UgU8l-.js.map +0 -1
- package/dashboard/dist/assets/ScanStationPage-nWYz-OD3.js +0 -2
- package/dashboard/dist/assets/ScanStationPage-nWYz-OD3.js.map +0 -1
- package/dashboard/dist/assets/WorkflowExecutionPage-Crf7AIFc.js +0 -2
- package/dashboard/dist/assets/WorkflowsDashboard--isjt06C.js +0 -2
- package/dashboard/dist/assets/index-B95LbYhW.js +0 -2
- package/dashboard/dist/assets/index-B95LbYhW.js.map +0 -1
- package/dashboard/dist/assets/index-BmzscsXK.css +0 -1
- package/dashboard/dist/assets/index-DRK7M1_9.js +0 -2
- package/dashboard/dist/assets/index-P-DlgAWj.js +0 -3
- package/dashboard/dist/assets/index-P-DlgAWj.js.map +0 -1
- package/dashboard/dist/assets/index-ygxyAKcc.js.map +0 -1
package/build/index.d.ts
CHANGED
|
@@ -22,6 +22,7 @@ export { InMemoryEventAdapter } from './lib/events/memory';
|
|
|
22
22
|
export { SocketIOEventAdapter, type SocketIOAuthenticator } from './lib/events/socketio';
|
|
23
23
|
export { publishMilestoneEvent, publishTaskEvent, publishEscalationEvent, publishActivityEvent, publishWorkflowEvent, publishAgentEvent, publishKnowledgeEvent } from './lib/events/publish';
|
|
24
24
|
export { messagingRegistry, MemoryMessagingProvider, DELIVERY } from './lib/messaging';
|
|
25
|
+
export { labelTransportRegistry } from './lib/labels/transports';
|
|
25
26
|
export { NatsMessagingProvider } from './lib/messaging/nats/provider';
|
|
26
27
|
export { renderNatsConf, type NatsConfOptions, type EdgeAccount, type NatsUser } from './lib/messaging/nats/render-conf';
|
|
27
28
|
export { jsPermissions } from './lib/messaging/nats/permissions';
|
package/build/index.js
CHANGED
|
@@ -36,8 +36,8 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
36
36
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
37
37
|
};
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.
|
|
40
|
-
exports.LTExpressAdapter = exports.Machines = exports.api = exports.KnowledgeApi = exports.resolveCredential = exports.mimeFromPath = exports.getStorageBackend = exports.listOAuthConnections = exports.getFreshAccessToken = exports.createClient = exports.CallbackEventAdapter = exports.builtinMcpServerFactories = exports.getSystemAgents = exports.getSystemWorkers = exports.registerMcpTool = exports.getToolContext = exports.getActivityIdentity = exports.McpEscalationStrategy = exports.DefaultEscalationStrategy = exports.escalationStrategyRegistry = exports.McpVisionServer = exports.McpTranslationServer = exports.McpServer = exports.McpClient = exports.McpService = exports.BuiltInMcpAdapter = exports.mcpRegistry = exports.defaultMaintenanceConfig = exports.maintenanceRegistry = void 0;
|
|
39
|
+
exports.loggerRegistry = exports.HoneycombTelemetryAdapter = exports.telemetryRegistry = exports.jsPermissions = exports.renderNatsConf = exports.NatsMessagingProvider = exports.labelTransportRegistry = exports.DELIVERY = exports.MemoryMessagingProvider = exports.messagingRegistry = exports.publishKnowledgeEvent = exports.publishAgentEvent = exports.publishWorkflowEvent = exports.publishActivityEvent = exports.publishEscalationEvent = exports.publishTaskEvent = exports.publishMilestoneEvent = exports.SocketIOEventAdapter = exports.InMemoryEventAdapter = exports.NatsEventAdapter = exports.eventRegistry = exports.ltConfig = exports.seedConfigTopics = exports.seedSystemTopics = exports.TopicService = exports.displayGtin = exports.normalizeGtin = exports.isValidGtin = exports.assertValidScanIdentityRule = exports.assertValidScanSteps = exports.assertValidScanScheme = exports.UserService = exports.ConfigService = exports.EscalationService = exports.TaskService = exports.setAuthAdapter = exports.signToken = exports.requireAdmin = exports.requireAuth = exports.createAuthMiddleware = exports.JwtAuthAdapter = exports.conditionalAccumulator = exports.conditionLT = exports.conditional = exports.executeLT = exports.createLTActivityInterceptor = exports.createLTInterceptor = exports.registerLT = exports.midnightTheme = exports.start = void 0;
|
|
40
|
+
exports.LTExpressAdapter = exports.Machines = exports.api = exports.KnowledgeApi = exports.resolveCredential = exports.mimeFromPath = exports.getStorageBackend = exports.listOAuthConnections = exports.getFreshAccessToken = exports.createClient = exports.CallbackEventAdapter = exports.builtinMcpServerFactories = exports.getSystemAgents = exports.getSystemWorkers = exports.registerMcpTool = exports.getToolContext = exports.getActivityIdentity = exports.McpEscalationStrategy = exports.DefaultEscalationStrategy = exports.escalationStrategyRegistry = exports.McpVisionServer = exports.McpTranslationServer = exports.McpServer = exports.McpClient = exports.McpService = exports.BuiltInMcpAdapter = exports.mcpRegistry = exports.defaultMaintenanceConfig = exports.maintenanceRegistry = exports.PinoLoggerAdapter = void 0;
|
|
41
41
|
const config_1 = require("./modules/config");
|
|
42
42
|
const logger_1 = require("./lib/logger");
|
|
43
43
|
const midnight_1 = require("./themes/midnight");
|
|
@@ -105,6 +105,8 @@ var messaging_1 = require("./lib/messaging");
|
|
|
105
105
|
Object.defineProperty(exports, "messagingRegistry", { enumerable: true, get: function () { return messaging_1.messagingRegistry; } });
|
|
106
106
|
Object.defineProperty(exports, "MemoryMessagingProvider", { enumerable: true, get: function () { return messaging_1.MemoryMessagingProvider; } });
|
|
107
107
|
Object.defineProperty(exports, "DELIVERY", { enumerable: true, get: function () { return messaging_1.DELIVERY; } });
|
|
108
|
+
var transports_1 = require("./lib/labels/transports");
|
|
109
|
+
Object.defineProperty(exports, "labelTransportRegistry", { enumerable: true, get: function () { return transports_1.labelTransportRegistry; } });
|
|
108
110
|
var provider_1 = require("./lib/messaging/nats/provider");
|
|
109
111
|
Object.defineProperty(exports, "NatsMessagingProvider", { enumerable: true, get: function () { return provider_1.NatsMessagingProvider; } });
|
|
110
112
|
var render_conf_1 = require("./lib/messaging/nats/render-conf");
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
-- Migration 044: label templates and the label ledger
|
|
2
|
+
--
|
|
3
|
+
-- lt_config_label_templates: what one printed label shows for a scan scheme.
|
|
4
|
+
-- `codes` lists the rules printed on the label, each beside its caption, in
|
|
5
|
+
-- order: [{ category, caption?, tone }]. `text` holds the title and up to two
|
|
6
|
+
-- lines, written in label tokens ({target}, {item.<facet>}, {user.<key>}).
|
|
7
|
+
-- `revision` advances on every change; `source` says who declared it.
|
|
8
|
+
-- Templates on an identity scheme are always sensitive.
|
|
9
|
+
--
|
|
10
|
+
-- lt_label_jobs: one row per credential event or label print, written before
|
|
11
|
+
-- any code leaves the server. It holds who asked, what template (snapshot),
|
|
12
|
+
-- and who or what the labels name. Identity codes are never stored: identity
|
|
13
|
+
-- jobs record subject_user_ids, item jobs record targets. Rows are never
|
|
14
|
+
-- deleted by the platform.
|
|
15
|
+
|
|
16
|
+
CREATE TABLE IF NOT EXISTS lt_config_label_templates (
|
|
17
|
+
name TEXT PRIMARY KEY CHECK (name ~ '^[a-z0-9][a-z0-9-]{0,62}$'),
|
|
18
|
+
scheme_version INT NOT NULL REFERENCES lt_config_scan_schemes(version) ON DELETE CASCADE,
|
|
19
|
+
title TEXT NOT NULL,
|
|
20
|
+
description TEXT,
|
|
21
|
+
codes JSONB NOT NULL,
|
|
22
|
+
text JSONB NOT NULL DEFAULT '{}'::jsonb,
|
|
23
|
+
symbology TEXT NOT NULL DEFAULT 'code128'
|
|
24
|
+
CHECK (symbology IN ('code128', 'qrcode', 'datamatrix')),
|
|
25
|
+
human_readable BOOLEAN NOT NULL DEFAULT true,
|
|
26
|
+
media TEXT,
|
|
27
|
+
sensitive BOOLEAN NOT NULL DEFAULT false,
|
|
28
|
+
enabled BOOLEAN NOT NULL DEFAULT true,
|
|
29
|
+
revision INT NOT NULL DEFAULT 1,
|
|
30
|
+
source TEXT NOT NULL DEFAULT 'api' CHECK (source IN ('code', 'api')),
|
|
31
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
32
|
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
CREATE INDEX IF NOT EXISTS lt_config_label_templates_scheme_idx
|
|
36
|
+
ON lt_config_label_templates (scheme_version);
|
|
37
|
+
|
|
38
|
+
DROP TRIGGER IF EXISTS trg_lt_config_label_templates_updated_at ON lt_config_label_templates;
|
|
39
|
+
CREATE TRIGGER trg_lt_config_label_templates_updated_at
|
|
40
|
+
BEFORE UPDATE ON lt_config_label_templates
|
|
41
|
+
FOR EACH ROW EXECUTE FUNCTION lt_set_updated_at();
|
|
42
|
+
|
|
43
|
+
CREATE TABLE IF NOT EXISTS lt_label_jobs (
|
|
44
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
45
|
+
action TEXT NOT NULL CHECK (action IN ('print', 'reissue', 'bind')),
|
|
46
|
+
requested_by UUID,
|
|
47
|
+
idempotency_key TEXT UNIQUE,
|
|
48
|
+
template_name TEXT,
|
|
49
|
+
template_revision INT,
|
|
50
|
+
template_snapshot JSONB,
|
|
51
|
+
scheme_version INT,
|
|
52
|
+
scheme_kind TEXT,
|
|
53
|
+
sensitive BOOLEAN NOT NULL DEFAULT false,
|
|
54
|
+
source JSONB NOT NULL DEFAULT '{}'::jsonb,
|
|
55
|
+
subject_user_ids UUID[],
|
|
56
|
+
targets TEXT[],
|
|
57
|
+
label_count INT NOT NULL DEFAULT 0,
|
|
58
|
+
media JSONB,
|
|
59
|
+
output TEXT,
|
|
60
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
CREATE INDEX IF NOT EXISTS lt_label_jobs_created_idx ON lt_label_jobs (created_at DESC);
|
|
64
|
+
CREATE INDEX IF NOT EXISTS lt_label_jobs_requester_idx ON lt_label_jobs (requested_by, created_at DESC);
|
|
65
|
+
CREATE INDEX IF NOT EXISTS lt_label_jobs_subjects_idx ON lt_label_jobs USING GIN (subject_user_ids);
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
-- Migration 045: delivery stamps on the label ledger
|
|
2
|
+
--
|
|
3
|
+
-- A job sent through a printer transport is recorded first, then delivered.
|
|
4
|
+
-- delivery_claimed_at is a short lease one process takes before sending, so
|
|
5
|
+
-- a retried request (same idempotency key) re-sends only an undelivered job
|
|
6
|
+
-- whose lease has lapsed: never twice at once, never lost after a crash
|
|
7
|
+
-- between record and send. delivered_at is stamped once the transport
|
|
8
|
+
-- accepts. These two columns are the only ones the platform updates.
|
|
9
|
+
|
|
10
|
+
ALTER TABLE lt_label_jobs
|
|
11
|
+
ADD COLUMN IF NOT EXISTS delivery_claimed_at TIMESTAMPTZ,
|
|
12
|
+
ADD COLUMN IF NOT EXISTS delivered_at TIMESTAMPTZ;
|
|
13
|
+
|
|
14
|
+
CREATE INDEX IF NOT EXISTS lt_label_jobs_template_idx ON lt_label_jobs (template_name, created_at DESC);
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The label transport registry: named routes from issued labels to printers,
|
|
3
|
+
* registered at startup. Sending is a capability, not a side effect, so a
|
|
4
|
+
* name with no transport fails loudly instead of printing nothing.
|
|
5
|
+
*/
|
|
6
|
+
import type { LTLabelTransport } from '../../types/labels';
|
|
7
|
+
export declare const LABEL_TRANSPORT_NOT_CONFIGURED = "No label transport is registered under that name; pass start({ labels: { transports } })";
|
|
8
|
+
declare class LTLabelTransportRegistry {
|
|
9
|
+
private transports;
|
|
10
|
+
/** Register a transport by name; replaces one registered before under the same name. */
|
|
11
|
+
register(name: string, transport: LTLabelTransport): void;
|
|
12
|
+
has(name: string): boolean;
|
|
13
|
+
/** The registered transports, by name, with the formats each accepts. */
|
|
14
|
+
list(): Array<{
|
|
15
|
+
name: string;
|
|
16
|
+
formats: LTLabelTransport['formats'];
|
|
17
|
+
}>;
|
|
18
|
+
get(name: string): LTLabelTransport;
|
|
19
|
+
/** Forget every transport (tests). */
|
|
20
|
+
clear(): void;
|
|
21
|
+
}
|
|
22
|
+
export declare const labelTransportRegistry: LTLabelTransportRegistry;
|
|
23
|
+
export {};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The label transport registry: named routes from issued labels to printers,
|
|
4
|
+
* registered at startup. Sending is a capability, not a side effect, so a
|
|
5
|
+
* name with no transport fails loudly instead of printing nothing.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.labelTransportRegistry = exports.LABEL_TRANSPORT_NOT_CONFIGURED = void 0;
|
|
9
|
+
exports.LABEL_TRANSPORT_NOT_CONFIGURED = 'No label transport is registered under that name; pass start({ labels: { transports } })';
|
|
10
|
+
class LTLabelTransportRegistry {
|
|
11
|
+
constructor() {
|
|
12
|
+
this.transports = new Map();
|
|
13
|
+
}
|
|
14
|
+
/** Register a transport by name; replaces one registered before under the same name. */
|
|
15
|
+
register(name, transport) {
|
|
16
|
+
if (!/^[a-z0-9][a-z0-9-]{0,62}$/.test(name)) {
|
|
17
|
+
throw new Error(`label transport name "${name}" must be lowercase letters, digits and dashes`);
|
|
18
|
+
}
|
|
19
|
+
this.transports.set(name, transport);
|
|
20
|
+
}
|
|
21
|
+
has(name) {
|
|
22
|
+
return this.transports.has(name);
|
|
23
|
+
}
|
|
24
|
+
/** The registered transports, by name, with the formats each accepts. */
|
|
25
|
+
list() {
|
|
26
|
+
return [...this.transports].map(([name, t]) => ({ name, formats: [...t.formats] }));
|
|
27
|
+
}
|
|
28
|
+
get(name) {
|
|
29
|
+
const transport = this.transports.get(name);
|
|
30
|
+
if (!transport)
|
|
31
|
+
throw new Error(`${exports.LABEL_TRANSPORT_NOT_CONFIGURED} (asked for "${name}")`);
|
|
32
|
+
return transport;
|
|
33
|
+
}
|
|
34
|
+
/** Forget every transport (tests). */
|
|
35
|
+
clear() {
|
|
36
|
+
this.transports.clear();
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
exports.labelTransportRegistry = new LTLabelTransportRegistry();
|
package/build/modules/auth.d.ts
CHANGED
|
@@ -57,6 +57,8 @@ export declare const requireAdmin: RequestHandler<import("express-serve-static-c
|
|
|
57
57
|
export declare const requireBuilder: RequestHandler<import("express-serve-static-core").ParamsDictionary, any, any, import("qs").ParsedQs, Record<string, any>>;
|
|
58
58
|
/** Role-management access: admin access or the 'engineer' role. Backend twin of `isBuilder || isOps`. */
|
|
59
59
|
export declare const requireRoleManager: RequestHandler<import("express-serve-static-core").ParamsDictionary, any, any, import("qs").ParsedQs, Record<string, any>>;
|
|
60
|
+
/** Credential access: superadmin or the 'credential-issuer' role. Gates badge printing and reissue. */
|
|
61
|
+
export declare const requireCredentialIssuer: RequestHandler<import("express-serve-static-core").ParamsDictionary, any, any, import("qs").ParsedQs, Record<string, any>>;
|
|
60
62
|
/** Reads of one workflow run (`:workflowId`): builder access, or the person who started it or it runs as. */
|
|
61
63
|
export declare const requireWorkflowReader: RequestHandler;
|
|
62
64
|
/**
|
package/build/modules/auth.js
CHANGED
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.requireWorkflowReader = exports.requireRoleManager = exports.requireBuilder = exports.requireAdmin = exports.requireCredentialAuth = exports.requireAuth = exports.JwtAuthAdapter = void 0;
|
|
6
|
+
exports.requireWorkflowReader = exports.requireCredentialIssuer = exports.requireRoleManager = exports.requireBuilder = exports.requireAdmin = exports.requireCredentialAuth = exports.requireAuth = exports.JwtAuthAdapter = void 0;
|
|
7
7
|
exports.createAuthMiddleware = createAuthMiddleware;
|
|
8
8
|
exports.setAuthAdapter = setAuthAdapter;
|
|
9
9
|
exports.signToken = signToken;
|
|
@@ -201,6 +201,8 @@ exports.requireAdmin = requireCapability(capabilities_1.mayAdminister, 'Forbidde
|
|
|
201
201
|
exports.requireBuilder = requireCapability(capabilities_1.mayBuild, 'Forbidden: builder access required');
|
|
202
202
|
/** Role-management access: admin access or the 'engineer' role. Backend twin of `isBuilder || isOps`. */
|
|
203
203
|
exports.requireRoleManager = requireCapability(capabilities_1.mayManageRoles, 'Forbidden: role-management access required');
|
|
204
|
+
/** Credential access: superadmin or the 'credential-issuer' role. Gates badge printing and reissue. */
|
|
205
|
+
exports.requireCredentialIssuer = requireCapability(capabilities_1.mayIssueCredentials, 'Forbidden: credential-issuer access required');
|
|
204
206
|
/** Reads of one workflow run (`:workflowId`): builder access, or the person who started it or it runs as. */
|
|
205
207
|
const requireWorkflowReader = async (req, res, next) => {
|
|
206
208
|
try {
|
|
@@ -19,10 +19,14 @@ export type GrantDecision = {
|
|
|
19
19
|
allowed: false;
|
|
20
20
|
error: string;
|
|
21
21
|
};
|
|
22
|
+
/** Holders of this role may print and reissue identity credentials (badges). */
|
|
23
|
+
export declare const CREDENTIAL_ISSUER_ROLE = "credential-issuer";
|
|
22
24
|
/** Admin or superadmin claim, or a superadmin in the database. */
|
|
23
25
|
export declare function mayAdminister(principal: CapabilityPrincipal | undefined): Promise<boolean>;
|
|
24
26
|
/** Superadmin (claim or database), or holder of the engineer role. */
|
|
25
27
|
export declare function mayBuild(principal: CapabilityPrincipal | undefined): Promise<boolean>;
|
|
28
|
+
/** Superadmin (claim or database), or holder of the credential-issuer role. Admin type alone never grants it. */
|
|
29
|
+
export declare function mayIssueCredentials(principal: CapabilityPrincipal | undefined): Promise<boolean>;
|
|
26
30
|
/**
|
|
27
31
|
* Builder access, or the person a workflow run was started by or runs as,
|
|
28
32
|
* read from the run's own start envelope.
|
|
@@ -51,7 +55,7 @@ export declare function mayRevokeRole(callerId: string, targetId: string, role:
|
|
|
51
55
|
/**
|
|
52
56
|
* Every capability the principal holds, with the same outcomes as the
|
|
53
57
|
* predicates above. A superadmin claim costs no lookup; anyone else costs
|
|
54
|
-
* at most one superadmin lookup and
|
|
58
|
+
* at most one superadmin lookup and two role lookups.
|
|
55
59
|
*/
|
|
56
60
|
export declare function resolveCapabilities(principal: CapabilityPrincipal | undefined): Promise<CapabilitySet>;
|
|
57
61
|
/**
|
|
@@ -33,8 +33,10 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.CREDENTIAL_ISSUER_ROLE = void 0;
|
|
36
37
|
exports.mayAdminister = mayAdminister;
|
|
37
38
|
exports.mayBuild = mayBuild;
|
|
39
|
+
exports.mayIssueCredentials = mayIssueCredentials;
|
|
38
40
|
exports.mayReadWorkflowRun = mayReadWorkflowRun;
|
|
39
41
|
exports.mayManageRoles = mayManageRoles;
|
|
40
42
|
exports.mayGrantRole = mayGrantRole;
|
|
@@ -47,9 +49,14 @@ const user_1 = require("../services/user");
|
|
|
47
49
|
const export_1 = require("../services/export");
|
|
48
50
|
const uuid_1 = require("../lib/uuid");
|
|
49
51
|
const BUILDER_ROLE = 'engineer';
|
|
50
|
-
|
|
52
|
+
/** Holders of this role may print and reissue identity credentials (badges). */
|
|
53
|
+
exports.CREDENTIAL_ISSUER_ROLE = 'credential-issuer';
|
|
54
|
+
async function holdsRole(userId, role) {
|
|
51
55
|
const { hasRole } = await Promise.resolve().then(() => __importStar(require('../services/user/roles')));
|
|
52
|
-
return hasRole(userId,
|
|
56
|
+
return hasRole(userId, role);
|
|
57
|
+
}
|
|
58
|
+
async function hasBuilderRole(userId) {
|
|
59
|
+
return holdsRole(userId, BUILDER_ROLE);
|
|
53
60
|
}
|
|
54
61
|
/** Admin or superadmin claim, or a superadmin in the database. */
|
|
55
62
|
async function mayAdminister(principal) {
|
|
@@ -69,6 +76,18 @@ async function mayBuild(principal) {
|
|
|
69
76
|
return true;
|
|
70
77
|
return hasBuilderRole(principal.userId);
|
|
71
78
|
}
|
|
79
|
+
/** Superadmin (claim or database), or holder of the credential-issuer role. Admin type alone never grants it. */
|
|
80
|
+
async function mayIssueCredentials(principal) {
|
|
81
|
+
if (!principal?.userId)
|
|
82
|
+
return false;
|
|
83
|
+
if (principal.grantRoles)
|
|
84
|
+
return capabilitiesFromRoles(principal.grantRoles).credentialIssuer;
|
|
85
|
+
if (principal.role === 'superadmin')
|
|
86
|
+
return true;
|
|
87
|
+
if (await (0, user_1.isSuperAdmin)(principal.userId))
|
|
88
|
+
return true;
|
|
89
|
+
return holdsRole(principal.userId, exports.CREDENTIAL_ISSUER_ROLE);
|
|
90
|
+
}
|
|
72
91
|
/**
|
|
73
92
|
* Builder access, or the person a workflow run was started by or runs as,
|
|
74
93
|
* read from the run's own start envelope.
|
|
@@ -148,15 +167,19 @@ function capabilitiesFromRoles(roles) {
|
|
|
148
167
|
const superadmin = roles.some((r) => r.type === 'superadmin');
|
|
149
168
|
const admin = superadmin || roles.some((r) => r.type === 'admin');
|
|
150
169
|
const engineer = roles.some((r) => r.role === BUILDER_ROLE);
|
|
151
|
-
|
|
170
|
+
const issuer = roles.some((r) => r.role === exports.CREDENTIAL_ISSUER_ROLE);
|
|
171
|
+
return {
|
|
172
|
+
caller: true, admin, builder: superadmin || engineer, roleManager: admin || engineer, superadmin,
|
|
173
|
+
credentialIssuer: superadmin || issuer,
|
|
174
|
+
};
|
|
152
175
|
}
|
|
153
176
|
const NO_CAPABILITIES = {
|
|
154
|
-
caller: false, admin: false, builder: false, roleManager: false, superadmin: false,
|
|
177
|
+
caller: false, admin: false, builder: false, roleManager: false, superadmin: false, credentialIssuer: false,
|
|
155
178
|
};
|
|
156
179
|
/**
|
|
157
180
|
* Every capability the principal holds, with the same outcomes as the
|
|
158
181
|
* predicates above. A superadmin claim costs no lookup; anyone else costs
|
|
159
|
-
* at most one superadmin lookup and
|
|
182
|
+
* at most one superadmin lookup and two role lookups.
|
|
160
183
|
*/
|
|
161
184
|
async function resolveCapabilities(principal) {
|
|
162
185
|
if (!principal?.userId)
|
|
@@ -164,11 +187,18 @@ async function resolveCapabilities(principal) {
|
|
|
164
187
|
if (principal.grantRoles)
|
|
165
188
|
return capabilitiesFromRoles(principal.grantRoles);
|
|
166
189
|
if (principal.role === 'superadmin' || (await (0, user_1.isSuperAdmin)(principal.userId))) {
|
|
167
|
-
return { caller: true, admin: true, builder: true, roleManager: true, superadmin: true };
|
|
190
|
+
return { caller: true, admin: true, builder: true, roleManager: true, superadmin: true, credentialIssuer: true };
|
|
168
191
|
}
|
|
169
192
|
const admin = principal.role === 'admin';
|
|
170
|
-
const
|
|
171
|
-
|
|
193
|
+
const { hasRole } = await Promise.resolve().then(() => __importStar(require('../services/user/roles')));
|
|
194
|
+
const [engineer, issuer] = await Promise.all([
|
|
195
|
+
hasRole(principal.userId, BUILDER_ROLE),
|
|
196
|
+
hasRole(principal.userId, exports.CREDENTIAL_ISSUER_ROLE),
|
|
197
|
+
]);
|
|
198
|
+
return {
|
|
199
|
+
caller: true, admin, builder: engineer, roleManager: admin || engineer, superadmin: false,
|
|
200
|
+
credentialIssuer: issuer,
|
|
201
|
+
};
|
|
172
202
|
}
|
|
173
203
|
/**
|
|
174
204
|
* Capability checks for one request. `caller` needs only an authenticated
|
|
@@ -41,5 +41,15 @@ export declare const config: {
|
|
|
41
41
|
LT_ANALYTICS_CACHE_TTL_MS: number;
|
|
42
42
|
LT_ANALYTICS_PAST_CACHE_TTL_MS: number;
|
|
43
43
|
LT_ANALYTICS_CACHE_MAX_ENTRIES: number;
|
|
44
|
+
/** Identity keys (badge tokens) leave user reads and need credentialIssuer to write. `false` keeps the earlier behavior. */
|
|
45
|
+
LT_PROTECT_IDENTITY_KEYS: boolean;
|
|
46
|
+
/** Label sheets: the media a job prints on when neither the job nor the template names one. */
|
|
47
|
+
LT_LABELS_DEFAULT_MEDIA: string;
|
|
48
|
+
/** Most labels one print job may hold. */
|
|
49
|
+
LT_LABELS_MAX_PER_JOB: number;
|
|
50
|
+
/** Most identity credentials (badges) one print job may hold. */
|
|
51
|
+
LT_LABELS_MAX_CREDENTIALS_PER_JOB: number;
|
|
52
|
+
/** How long one process holds a print job's delivery before a retry may send it. */
|
|
53
|
+
LT_LABELS_DELIVERY_LEASE_SECONDS: number;
|
|
44
54
|
};
|
|
45
55
|
export declare const postgres_options: Record<string, unknown>;
|
package/build/modules/config.js
CHANGED
|
@@ -67,6 +67,16 @@ exports.config = {
|
|
|
67
67
|
LT_ANALYTICS_CACHE_TTL_MS: parseInt(process.env.LT_ANALYTICS_CACHE_TTL_MS || '30000', 10),
|
|
68
68
|
LT_ANALYTICS_PAST_CACHE_TTL_MS: parseInt(process.env.LT_ANALYTICS_PAST_CACHE_TTL_MS || '600000', 10),
|
|
69
69
|
LT_ANALYTICS_CACHE_MAX_ENTRIES: parseInt(process.env.LT_ANALYTICS_CACHE_MAX_ENTRIES || '512', 10),
|
|
70
|
+
/** Identity keys (badge tokens) leave user reads and need credentialIssuer to write. `false` keeps the earlier behavior. */
|
|
71
|
+
LT_PROTECT_IDENTITY_KEYS: process.env.LT_PROTECT_IDENTITY_KEYS !== 'false',
|
|
72
|
+
/** Label sheets: the media a job prints on when neither the job nor the template names one. */
|
|
73
|
+
LT_LABELS_DEFAULT_MEDIA: process.env.LT_LABELS_DEFAULT_MEDIA || 'a4-l7160',
|
|
74
|
+
/** Most labels one print job may hold. */
|
|
75
|
+
LT_LABELS_MAX_PER_JOB: positiveInt('LT_LABELS_MAX_PER_JOB', 1000),
|
|
76
|
+
/** Most identity credentials (badges) one print job may hold. */
|
|
77
|
+
LT_LABELS_MAX_CREDENTIALS_PER_JOB: positiveInt('LT_LABELS_MAX_CREDENTIALS_PER_JOB', 200),
|
|
78
|
+
/** How long one process holds a print job's delivery before a retry may send it. */
|
|
79
|
+
LT_LABELS_DELIVERY_LEASE_SECONDS: positiveInt('LT_LABELS_DELIVERY_LEASE_SECONDS', 120),
|
|
70
80
|
};
|
|
71
81
|
exports.postgres_options = {
|
|
72
82
|
host: exports.config.POSTGRES_HOST,
|
|
@@ -171,6 +171,24 @@ function registerResolveRoutes(router) {
|
|
|
171
171
|
}, req.auth);
|
|
172
172
|
res.status(result.status).json(result.data ?? { error: result.error });
|
|
173
173
|
});
|
|
174
|
+
/**
|
|
175
|
+
* POST /api/escalations/:id/roster-scan
|
|
176
|
+
* A scan into a batch roster on this row's form. The field must declare
|
|
177
|
+
* x-lt-scan accepting the code's scheme; the scan fills the first open entry
|
|
178
|
+
* whose key is the code, as the person acting (the badged person when
|
|
179
|
+
* X-LT-Acting-Token rides the request).
|
|
180
|
+
* Body: { field: string, code: string }
|
|
181
|
+
*/
|
|
182
|
+
router.post('/:id/roster-scan', async (req, res) => {
|
|
183
|
+
const token = req.headers[acting_1.ACTING_TOKEN_HEADER];
|
|
184
|
+
const result = await api.runRosterScan({
|
|
185
|
+
id: req.params.id,
|
|
186
|
+
field: req.body?.field,
|
|
187
|
+
code: req.body?.code,
|
|
188
|
+
actingToken: typeof token === 'string' && token ? token : undefined,
|
|
189
|
+
}, req.auth);
|
|
190
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
191
|
+
});
|
|
174
192
|
/**
|
|
175
193
|
* POST /api/escalations/:id/resolve
|
|
176
194
|
* Resolve a pending escalation with a human-provided payload. Routes by
|
package/build/routes/index.js
CHANGED
|
@@ -38,6 +38,7 @@ const capabilities_1 = __importDefault(require("./capabilities"));
|
|
|
38
38
|
const topics_1 = __importDefault(require("./topics"));
|
|
39
39
|
const nats_credentials_1 = __importDefault(require("./nats-credentials"));
|
|
40
40
|
const scan_codes_1 = __importDefault(require("./scan-codes"));
|
|
41
|
+
const labels_1 = __importDefault(require("./labels"));
|
|
41
42
|
const domain_1 = __importDefault(require("./domain"));
|
|
42
43
|
const announcements_1 = __importDefault(require("./announcements"));
|
|
43
44
|
const machines_1 = __importDefault(require("./machines"));
|
|
@@ -79,6 +80,7 @@ router.use('/agents', agents_1.default);
|
|
|
79
80
|
router.use('/capabilities', capabilities_1.default);
|
|
80
81
|
router.use('/topics', topics_1.default);
|
|
81
82
|
router.use('/scan-codes', scan_codes_1.default);
|
|
83
|
+
router.use('/labels', labels_1.default);
|
|
82
84
|
router.use('/domain', domain_1.default);
|
|
83
85
|
router.use('/announcements', announcements_1.default);
|
|
84
86
|
router.use('/machines', machines_1.default);
|
|
@@ -0,0 +1,135 @@
|
|
|
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
|
+
const http_1 = require("../lib/http");
|
|
37
|
+
const api = __importStar(require("../api/labels"));
|
|
38
|
+
const auth_1 = require("../modules/auth");
|
|
39
|
+
const router = (0, http_1.Router)();
|
|
40
|
+
/** An issue result: PDF and ZPL as files, a sheet as JSON. Codes are never cached. */
|
|
41
|
+
function sendIssued(res, result) {
|
|
42
|
+
res.set('Cache-Control', 'no-store');
|
|
43
|
+
if (result.status !== 200) {
|
|
44
|
+
res.status(result.status).json({ error: result.error });
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const { pdf, zpl, ...rest } = result.data;
|
|
48
|
+
res.set('X-LT-Label-Job', rest.job.id);
|
|
49
|
+
if (rest.warnings?.length)
|
|
50
|
+
res.set('X-LT-Label-Warnings', String(rest.warnings.length));
|
|
51
|
+
if (pdf) {
|
|
52
|
+
res.type('application/pdf').set('Content-Disposition', `attachment; filename="labels-${rest.job.id}.pdf"`).send(Buffer.from(pdf));
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (zpl) {
|
|
56
|
+
res.type('application/vnd.zebra-zpl').set('Content-Disposition', `attachment; filename="labels-${rest.job.id}.zpl"`).send(zpl);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
res.json(rest);
|
|
60
|
+
}
|
|
61
|
+
// ── Templates ─────────────────────────────────────────────────────────────
|
|
62
|
+
/** GET /api/labels/templates?scheme=14 */
|
|
63
|
+
router.get('/templates', async (req, res) => {
|
|
64
|
+
const scheme = req.query.scheme ? Number(req.query.scheme) : undefined;
|
|
65
|
+
const result = await api.listLabelTemplates({ scheme });
|
|
66
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
67
|
+
});
|
|
68
|
+
/** GET /api/labels/templates/:name */
|
|
69
|
+
router.get('/templates/:name', async (req, res) => {
|
|
70
|
+
const result = await api.getLabelTemplate({ name: String(req.params.name) });
|
|
71
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
72
|
+
});
|
|
73
|
+
/** PUT /api/labels/templates/:name — body is the template; `expected_revision` guards a concurrent edit. */
|
|
74
|
+
router.put('/templates/:name', auth_1.requireRoleManager, async (req, res) => {
|
|
75
|
+
const result = await api.upsertLabelTemplate({ ...(req.body || {}), name: String(req.params.name) });
|
|
76
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
77
|
+
});
|
|
78
|
+
/** DELETE /api/labels/templates/:name */
|
|
79
|
+
router.delete('/templates/:name', auth_1.requireRoleManager, async (req, res) => {
|
|
80
|
+
const result = await api.deleteLabelTemplate({ name: String(req.params.name) });
|
|
81
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
82
|
+
});
|
|
83
|
+
/** GET /api/labels/media — presets and the default media. */
|
|
84
|
+
router.get('/media', async (_req, res) => {
|
|
85
|
+
const result = await api.listLabelMedia();
|
|
86
|
+
res.status(result.status).json(result.data);
|
|
87
|
+
});
|
|
88
|
+
/** GET /api/labels/transports — registered printer transports. */
|
|
89
|
+
router.get('/transports', async (_req, res) => {
|
|
90
|
+
const result = await api.listLabelTransports();
|
|
91
|
+
res.status(result.status).json(result.data);
|
|
92
|
+
});
|
|
93
|
+
// ── Print ─────────────────────────────────────────────────────────────────
|
|
94
|
+
/** POST /api/labels/preview — { template, source, layout? }. Sensitive templates come back masked. */
|
|
95
|
+
router.post('/preview', async (req, res) => {
|
|
96
|
+
const { template, source, layout } = req.body || {};
|
|
97
|
+
const result = await api.previewLabels({ template, source, layout }, req.auth);
|
|
98
|
+
res.set('Cache-Control', 'no-store');
|
|
99
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
100
|
+
});
|
|
101
|
+
/**
|
|
102
|
+
* POST /api/labels/issue — { template, source, layout?, output, confirm?, idempotencyKey?, destination? }.
|
|
103
|
+
* output: sheet (JSON), pdf, zpl, or transport:<name>.
|
|
104
|
+
*/
|
|
105
|
+
router.post('/issue', async (req, res) => {
|
|
106
|
+
const { template, source, layout, output, confirm, idempotencyKey, destination, only } = req.body || {};
|
|
107
|
+
sendIssued(res, await api.issueLabels({ template, source, layout, output, confirm, idempotencyKey, destination, only }, req.auth));
|
|
108
|
+
});
|
|
109
|
+
/** POST /api/labels/badges/reissue — { userId, template, layout?, output, confirm }. */
|
|
110
|
+
router.post('/badges/reissue', async (req, res) => {
|
|
111
|
+
const { userId, template, layout, output, confirm } = req.body || {};
|
|
112
|
+
sendIssued(res, await api.reissueBadge({ userId, template, layout, output, confirm }, req.auth));
|
|
113
|
+
});
|
|
114
|
+
// ── History ───────────────────────────────────────────────────────────────
|
|
115
|
+
/** GET /api/labels/jobs?template=&subjectUserId=&limit=&offset= */
|
|
116
|
+
router.get('/jobs', async (req, res) => {
|
|
117
|
+
const result = await api.listLabelJobs({
|
|
118
|
+
template: req.query.template,
|
|
119
|
+
subjectUserId: req.query.subjectUserId,
|
|
120
|
+
limit: req.query.limit ? Number(req.query.limit) : undefined,
|
|
121
|
+
offset: req.query.offset ? Number(req.query.offset) : undefined,
|
|
122
|
+
}, req.auth);
|
|
123
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
124
|
+
});
|
|
125
|
+
/** GET /api/labels/jobs/:id */
|
|
126
|
+
router.get('/jobs/:id', async (req, res) => {
|
|
127
|
+
const result = await api.getLabelJob({ id: String(req.params.id) }, req.auth);
|
|
128
|
+
res.status(result.status).json(result.data ?? { error: result.error });
|
|
129
|
+
});
|
|
130
|
+
/** POST /api/labels/jobs/:id/reprint — { indices?, output, layout?, confirm? } */
|
|
131
|
+
router.post('/jobs/:id/reprint', async (req, res) => {
|
|
132
|
+
const { indices, output, layout, confirm } = req.body || {};
|
|
133
|
+
sendIssued(res, await api.reprintLabelJob({ id: String(req.params.id), indices, output, layout, confirm }, req.auth));
|
|
134
|
+
});
|
|
135
|
+
exports.default = router;
|
package/build/routes/users.js
CHANGED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type ScanRule, type ScanScheme } from '../../types';
|
|
2
|
+
import type { LabelContent, LabelWarning } from '../../shared/labels/types';
|
|
3
|
+
import type { LabelTarget, LabelTemplate } from '../../types/labels';
|
|
4
|
+
export interface BuiltContents {
|
|
5
|
+
contents: LabelContent[];
|
|
6
|
+
warnings: LabelWarning[];
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Compose every label. A target the scheme cannot carry (a fixed scheme's
|
|
10
|
+
* target with letters) prints its text without codes and is reported;
|
|
11
|
+
* identity warnings never repeat the target, which is the credential.
|
|
12
|
+
*/
|
|
13
|
+
export declare function buildLabelContents(template: LabelTemplate, scheme: ScanScheme, rules: ScanRule[], targets: LabelTarget[], masked: boolean): BuiltContents;
|