@hotmeshio/long-tail 0.26.0 → 0.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -2
- package/build/api/settings.d.ts +4 -1
- package/build/api/settings.js +7 -1
- package/build/index.d.ts +4 -0
- package/build/index.js +35 -8
- package/build/lib/db/config-lock.d.ts +10 -0
- package/build/lib/db/config-lock.js +28 -0
- package/build/lib/db/schemas/041_machine_lines.sql +26 -0
- package/build/lib/events/browser-view.js +8 -2
- package/build/lib/events/nats.d.ts +11 -0
- package/build/lib/events/nats.js +33 -2
- package/build/lib/events/publish.d.ts +33 -0
- package/build/lib/events/publish.js +52 -1
- package/build/lib/machines/index.d.ts +1 -0
- package/build/lib/machines/index.js +1 -0
- package/build/lib/machines/line.d.ts +4 -1
- package/build/lib/machines/line.js +18 -1
- package/build/lib/machines/protocol/codec.d.ts +24 -0
- package/build/lib/machines/protocol/codec.js +10 -0
- package/build/lib/machines/protocol/constants.d.ts +1 -1
- package/build/lib/machines/protocol/constants.js +1 -1
- package/build/lib/machines/protocol/contract.js +12 -3
- package/build/lib/machines/site/edge-account.d.ts +11 -0
- package/build/lib/machines/site/edge-account.js +24 -0
- package/build/lib/machines/site/mosquitto-conf.d.ts +5 -4
- package/build/lib/machines/site/mosquitto-conf.js +31 -16
- package/build/lib/machines/site/site-conf.d.ts +16 -6
- package/build/lib/machines/site/site-conf.js +39 -13
- package/build/lib/machines/transport/callback-feed.d.ts +1 -0
- package/build/lib/machines/transport/callback-feed.js +4 -1
- package/build/lib/machines/transport/delivery.d.ts +3 -4
- package/build/lib/machines/transport/delivery.js +3 -8
- package/build/lib/machines/transport/index.d.ts +2 -0
- package/build/lib/machines/transport/index.js +2 -0
- package/build/lib/machines/transport/memory.d.ts +2 -0
- package/build/lib/machines/transport/memory.js +6 -0
- package/build/lib/machines/transport/mqtt-bus.d.ts +2 -0
- package/build/lib/machines/transport/mqtt-bus.js +4 -0
- package/build/lib/machines/transport/nats-bus.d.ts +8 -13
- package/build/lib/machines/transport/nats-bus.js +26 -43
- package/build/lib/machines/transport/nats-feed.d.ts +1 -0
- package/build/lib/machines/transport/nats-feed.js +6 -3
- package/build/lib/machines/transport/pubsub-feed.d.ts +18 -0
- package/build/lib/machines/transport/pubsub-feed.js +42 -0
- package/build/lib/machines/transport/stream-bus.d.ts +42 -0
- package/build/lib/machines/transport/stream-bus.js +61 -0
- package/build/lib/machines/transport/streams.d.ts +10 -14
- package/build/lib/machines/transport/streams.js +18 -61
- package/build/lib/messaging/config.d.ts +25 -0
- package/build/lib/messaging/config.js +55 -0
- package/build/lib/messaging/constants.d.ts +26 -0
- package/build/lib/messaging/constants.js +26 -0
- package/build/lib/messaging/index.d.ts +24 -0
- package/build/lib/messaging/index.js +65 -0
- package/build/lib/messaging/memory.d.ts +16 -0
- package/build/lib/messaging/memory.js +147 -0
- package/build/lib/messaging/nats/permissions.d.ts +13 -0
- package/build/lib/messaging/nats/permissions.js +22 -0
- package/build/lib/messaging/nats/provider.d.ts +30 -0
- package/build/lib/messaging/nats/provider.js +77 -0
- package/build/lib/messaging/nats/render-conf.d.ts +68 -0
- package/build/lib/messaging/nats/render-conf.js +58 -0
- package/build/lib/messaging/nats/streams.d.ts +26 -0
- package/build/lib/messaging/nats/streams.js +97 -0
- package/build/lib/messaging/subjects.d.ts +8 -0
- package/build/lib/messaging/subjects.js +25 -0
- package/build/modules/machines.d.ts +8 -0
- package/build/modules/machines.js +16 -0
- package/build/routes/index.js +2 -0
- package/build/routes/machines.d.ts +2 -0
- package/build/routes/machines.js +220 -0
- package/build/scripts/bambu-boat.d.ts +17 -0
- package/build/scripts/bambu-boat.js +134 -0
- package/build/scripts/bambu-print.d.ts +18 -0
- package/build/scripts/bambu-print.js +114 -0
- package/build/services/machines/commands.d.ts +5 -5
- package/build/services/machines/commands.js +3 -2
- package/build/services/machines/config.d.ts +8 -1
- package/build/services/machines/config.js +17 -7
- package/build/services/machines/contracts.d.ts +29 -2
- package/build/services/machines/contracts.js +12 -3
- package/build/services/machines/gateway/actions.d.ts +2 -1
- package/build/services/machines/gateway/admission.d.ts +15 -3
- package/build/services/machines/gateway/admission.js +29 -14
- package/build/services/machines/gateway/dispatcher.d.ts +19 -3
- package/build/services/machines/gateway/dispatcher.js +61 -13
- package/build/services/machines/gateway/executor.d.ts +18 -4
- package/build/services/machines/gateway/executor.js +99 -34
- package/build/services/machines/gateway/gateway.d.ts +22 -1
- package/build/services/machines/gateway/gateway.js +83 -28
- package/build/services/machines/gateway/index.d.ts +3 -0
- package/build/services/machines/gateway/index.js +3 -0
- package/build/services/machines/gateway/inspect.d.ts +17 -0
- package/build/services/machines/gateway/inspect.js +68 -0
- package/build/services/machines/gateway/lifecycle.d.ts +21 -0
- package/build/services/machines/gateway/lifecycle.js +89 -0
- package/build/services/machines/gateway/log.d.ts +8 -0
- package/build/services/machines/gateway/log.js +18 -0
- package/build/services/machines/gateway/pacing.d.ts +14 -0
- package/build/services/machines/gateway/pacing.js +27 -2
- package/build/services/machines/gateway/plan-escalation.js +21 -7
- package/build/services/machines/gateway/plan-machine.d.ts +5 -4
- package/build/services/machines/gateway/plan-machine.js +70 -19
- package/build/services/machines/gateway/project.d.ts +9 -0
- package/build/services/machines/gateway/project.js +55 -0
- package/build/services/machines/gateway/receipts.d.ts +3 -0
- package/build/services/machines/gateway/receipts.js +3 -1
- package/build/services/machines/gateway/reconcile.d.ts +2 -0
- package/build/services/machines/gateway/reconcile.js +16 -3
- package/build/services/machines/gateway/registration.js +1 -1
- package/build/services/machines/gateway/reply-waiter.d.ts +6 -3
- package/build/services/machines/gateway/reply-waiter.js +37 -16
- package/build/services/machines/gateway/state.d.ts +50 -4
- package/build/services/machines/gateway/state.js +77 -10
- package/build/services/machines/gateway/wire.d.ts +58 -0
- package/build/services/machines/gateway/wire.js +171 -0
- package/build/services/machines/index.d.ts +3 -0
- package/build/services/machines/index.js +2 -0
- package/build/services/machines/leadership.d.ts +17 -4
- package/build/services/machines/leadership.js +43 -18
- package/build/services/machines/line-index.d.ts +16 -0
- package/build/services/machines/line-index.js +39 -0
- package/build/services/machines/registry-sql.d.ts +31 -0
- package/build/services/machines/registry-sql.js +110 -0
- package/build/services/machines/registry-sync.d.ts +31 -0
- package/build/services/machines/registry-sync.js +81 -0
- package/build/services/machines/registry.d.ts +77 -0
- package/build/services/machines/registry.js +158 -0
- package/build/services/machines/rows.js +26 -2
- package/build/services/machines/select.d.ts +9 -2
- package/build/services/machines/select.js +20 -7
- package/build/services/machines/surface.d.ts +45 -5
- package/build/services/machines/surface.js +102 -16
- package/build/services/machines/testing/fake-long-tail.d.ts +1 -0
- package/build/services/machines/testing/fake-long-tail.js +6 -3
- package/build/start/adapters.js +11 -2
- package/build/start/apply-report.d.ts +1 -1
- package/build/start/apply-report.js +3 -25
- package/build/start/index.js +23 -5
- package/build/system/index.js +13 -0
- package/build/system/mcp-servers/admin/schemas.d.ts +22 -22
- package/build/system/mcp-servers/human-queue-schemas.d.ts +7 -7
- package/build/system/mcp-servers/machines-schemas.d.ts +35 -0
- package/build/system/mcp-servers/machines-schemas.js +35 -0
- package/build/system/mcp-servers/machines.d.ts +20 -0
- package/build/system/mcp-servers/machines.js +154 -0
- package/build/system/seed/tool-manifests-machines.d.ts +2 -0
- package/build/system/seed/tool-manifests-machines.js +88 -0
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/events.d.ts +6 -1
- package/build/types/index.d.ts +2 -0
- package/build/types/machines-view.d.ts +159 -0
- package/build/types/machines-view.js +7 -0
- package/build/types/machines.d.ts +6 -1
- package/build/types/messaging.d.ts +72 -0
- package/build/types/messaging.js +11 -0
- package/build/types/startup.d.ts +26 -1
- package/dashboard/dist/assets/{AdminDashboard-DlItqxFS.js → AdminDashboard-Bm7VG65H.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-DlItqxFS.js.map → AdminDashboard-Bm7VG65H.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-BUmT4a7n.js → AgentConfigPage-aJF7Sdbc.js} +6 -6
- package/dashboard/dist/assets/{AgentConfigPage-BUmT4a7n.js.map → AgentConfigPage-aJF7Sdbc.js.map} +1 -1
- package/dashboard/dist/assets/{AgentDetailPage-Cww8rlBi.js → AgentDetailPage-GwwghhxT.js} +3 -3
- package/dashboard/dist/assets/{AgentDetailPage-Cww8rlBi.js.map → AgentDetailPage-GwwghhxT.js.map} +1 -1
- package/dashboard/dist/assets/AgentsPage-DVvCzZyg.js +2 -0
- package/dashboard/dist/assets/{AgentsPage-C9UuUKhr.js.map → AgentsPage-DVvCzZyg.js.map} +1 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-Cxmcji_K.js +2 -0
- package/dashboard/dist/assets/{AvailableEscalationsPage-DrvfXz70.js.map → AvailableEscalationsPage-Cxmcji_K.js.map} +1 -1
- package/dashboard/dist/assets/{BotPicker-CDq9XRMp.js → BotPicker-CofRxk4L.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-CDq9XRMp.js.map → BotPicker-CofRxk4L.js.map} +1 -1
- package/dashboard/dist/assets/{BulkAssignModal-jsvqtrEA.js → BulkAssignModal-BARWuz4L.js} +2 -2
- package/dashboard/dist/assets/{BulkAssignModal-jsvqtrEA.js.map → BulkAssignModal-BARWuz4L.js.map} +1 -1
- package/dashboard/dist/assets/{CapabilitiesPage-CSCrI6B1.js → CapabilitiesPage-BJAWVNEx.js} +2 -2
- package/dashboard/dist/assets/{CapabilitiesPage-CSCrI6B1.js.map → CapabilitiesPage-BJAWVNEx.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-uD9mn-CQ.js → CollapsibleSection-CtgoaG75.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-uD9mn-CQ.js.map → CollapsibleSection-CtgoaG75.js.map} +1 -1
- package/dashboard/dist/assets/{ConfirmDeleteModal-BRmx2hA4.js → ConfirmDeleteModal-BYXXBWs6.js} +2 -2
- package/dashboard/dist/assets/{ConfirmDeleteModal-BRmx2hA4.js.map → ConfirmDeleteModal-BYXXBWs6.js.map} +1 -1
- package/dashboard/dist/assets/{ConnectedAppsPage-DlMzE5a-.js → ConnectedAppsPage-D0JkzWa7.js} +2 -2
- package/dashboard/dist/assets/{ConnectedAppsPage-DlMzE5a-.js.map → ConnectedAppsPage-D0JkzWa7.js.map} +1 -1
- package/dashboard/dist/assets/{CountdownTimer-sRuM4eM5.js → CountdownTimer-BcFxdZYN.js} +2 -2
- package/dashboard/dist/assets/{CountdownTimer-sRuM4eM5.js.map → CountdownTimer-BcFxdZYN.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-bLYydwqa.js → CredentialsPage-DPSY20rV.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-bLYydwqa.js.map → CredentialsPage-DPSY20rV.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-D_ATDL2N.js → CronLabel-Dg_Oew_Y.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-D_ATDL2N.js.map → CronLabel-Dg_Oew_Y.js.map} +1 -1
- package/dashboard/dist/assets/{DropZone-u1JGfR9G.js → DropZone-Cl_Flb16.js} +2 -2
- package/dashboard/dist/assets/{DropZone-u1JGfR9G.js.map → DropZone-Cl_Flb16.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-groSMfqB.js → ElapsedCell-Dm3G5fK2.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-groSMfqB.js.map → ElapsedCell-Dm3G5fK2.js.map} +1 -1
- package/dashboard/dist/assets/{EntityTimelinePanel-D-F3_A9m.js → EntityTimelinePanel-CrEEP04e.js} +2 -2
- package/dashboard/dist/assets/{EntityTimelinePanel-D-F3_A9m.js.map → EntityTimelinePanel-CrEEP04e.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationListSchemaPage-Bad6Jrmr.js → EscalationListSchemaPage-wOInXcjs.js} +3 -3
- package/dashboard/dist/assets/{EscalationListSchemaPage-Bad6Jrmr.js.map → EscalationListSchemaPage-wOInXcjs.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationSchemaPage-BKi_npI9.js → EscalationSchemaPage-CrIj_g9d.js} +3 -3
- package/dashboard/dist/assets/{EscalationSchemaPage-BKi_npI9.js.map → EscalationSchemaPage-CrIj_g9d.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationTimeline-DQUUm3b1.js → EscalationTimeline-CeAsl5IT.js} +2 -2
- package/dashboard/dist/assets/{EscalationTimeline-DQUUm3b1.js.map → EscalationTimeline-CeAsl5IT.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationTitleSelect-3mhXh77a.js → EscalationTitleSelect-D8qpCYiy.js} +2 -2
- package/dashboard/dist/assets/{EscalationTitleSelect-3mhXh77a.js.map → EscalationTitleSelect-D8qpCYiy.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-Qaov-uML.js → EscalationsOverview-CvaqVPsr.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-Qaov-uML.js.map → EscalationsOverview-CvaqVPsr.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-V4RF_n58.js → EventTable-Be0JuEl6.js} +2 -2
- package/dashboard/dist/assets/{EventTable-V4RF_n58.js.map → EventTable-Be0JuEl6.js.map} +1 -1
- package/dashboard/dist/assets/FilterBar-BVyAjIgv.js +2 -0
- package/dashboard/dist/assets/FilterBar-BVyAjIgv.js.map +1 -0
- package/dashboard/dist/assets/{GraphInvokePage-Djslhf96.js → GraphInvokePage-D_QigJeD.js} +2 -2
- package/dashboard/dist/assets/{GraphInvokePage-Djslhf96.js.map → GraphInvokePage-D_QigJeD.js.map} +1 -1
- package/dashboard/dist/assets/{HomePage-EjcNxlKx.js → HomePage-C1haeuNy.js} +2 -2
- package/dashboard/dist/assets/{HomePage-EjcNxlKx.js.map → HomePage-C1haeuNy.js.map} +1 -1
- package/dashboard/dist/assets/LinePage-CWD5pv1g.js +5 -0
- package/dashboard/dist/assets/LinePage-CWD5pv1g.js.map +1 -0
- package/dashboard/dist/assets/LinesPage-NqChsKcO.js +3 -0
- package/dashboard/dist/assets/LinesPage-NqChsKcO.js.map +1 -0
- package/dashboard/dist/assets/{ListToolbar-RrEAePOX.js → ListToolbar-BZCNrTh6.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar-RrEAePOX.js.map → ListToolbar-BZCNrTh6.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-8gqiL3Vj.js → McpOverview-yJTYnh1z.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-8gqiL3Vj.js.map → McpOverview-yJTYnh1z.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-COyn6Ak5.js → McpQueryDetailPage-ChuLpJ4u.js} +3 -3
- package/dashboard/dist/assets/{McpQueryDetailPage-COyn6Ak5.js.map → McpQueryDetailPage-ChuLpJ4u.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryPage-Dj6Qj72w.js → McpQueryPage-9S-v9soF.js} +2 -2
- package/dashboard/dist/assets/{McpQueryPage-Dj6Qj72w.js.map → McpQueryPage-9S-v9soF.js.map} +1 -1
- package/dashboard/dist/assets/McpRunDetailPage-BhrcfxD5.js +2 -0
- package/dashboard/dist/assets/{McpRunDetailPage-80fQn9iX.js.map → McpRunDetailPage-BhrcfxD5.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunsPage-DaSsI-EM.js → McpRunsPage-C5_i8_Zx.js} +2 -2
- package/dashboard/dist/assets/{McpRunsPage-DaSsI-EM.js.map → McpRunsPage-C5_i8_Zx.js.map} +1 -1
- package/dashboard/dist/assets/{NamespacePill-C5epAgq6.js → NamespacePill-OTZD2hzt.js} +2 -2
- package/dashboard/dist/assets/{NamespacePill-C5epAgq6.js.map → NamespacePill-OTZD2hzt.js.map} +1 -1
- package/dashboard/dist/assets/{OperationsPage-BSu1o2gB.js → OperationsPage-C03CeU5P.js} +2 -2
- package/dashboard/dist/assets/{OperationsPage-BSu1o2gB.js.map → OperationsPage-C03CeU5P.js.map} +1 -1
- package/dashboard/dist/assets/{OperatorDashboard-HFI4WGIV.js → OperatorDashboard-BzC134Jt.js} +2 -2
- package/dashboard/dist/assets/{OperatorDashboard-HFI4WGIV.js.map → OperatorDashboard-BzC134Jt.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeader-BSWIspNB.js → PageHeader-Hx8APPwE.js} +2 -2
- package/dashboard/dist/assets/{PageHeader-BSWIspNB.js.map → PageHeader-Hx8APPwE.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeaderWithStats-DDjopQ-k.js → PageHeaderWithStats-BEQYYBJv.js} +2 -2
- package/dashboard/dist/assets/{PageHeaderWithStats-DDjopQ-k.js.map → PageHeaderWithStats-BEQYYBJv.js.map} +1 -1
- package/dashboard/dist/assets/{PersonaDetailPage-D0qlBuGi.js → PersonaDetailPage-D0mY9L6j.js} +2 -2
- package/dashboard/dist/assets/{PersonaDetailPage-D0qlBuGi.js.map → PersonaDetailPage-D0mY9L6j.js.map} +1 -1
- package/dashboard/dist/assets/{PersonasPage-BJClu-5H.js → PersonasPage-FFlm5Eug.js} +2 -2
- package/dashboard/dist/assets/{PersonasPage-BJClu-5H.js.map → PersonasPage-FFlm5Eug.js.map} +1 -1
- package/dashboard/dist/assets/{PortalPage-CucNZn_w.js → PortalPage-Cpc25uO-.js} +2 -2
- package/dashboard/dist/assets/{PortalPage-CucNZn_w.js.map → PortalPage-Cpc25uO-.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-B9wMw0RV.js → ProcessDetailPage-Di2J7KwY.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-B9wMw0RV.js.map → ProcessDetailPage-Di2J7KwY.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-B6k4RpmR.js → ProcessesListPage-BEXwU3Z0.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-B6k4RpmR.js.map → ProcessesListPage-BEXwU3Z0.js.map} +1 -1
- package/dashboard/dist/assets/{ResolverForm-ZVufJ4G-.js → ResolverForm-2ks-3jXC.js} +6 -6
- package/dashboard/dist/assets/{ResolverForm-ZVufJ4G-.js.map → ResolverForm-2ks-3jXC.js.map} +1 -1
- package/dashboard/dist/assets/{RoleDetailPage-CTbq0mz4.js → RoleDetailPage-DqoOk0xc.js} +3 -3
- package/dashboard/dist/assets/{RoleDetailPage-CTbq0mz4.js.map → RoleDetailPage-DqoOk0xc.js.map} +1 -1
- package/dashboard/dist/assets/{RolePill-CoETDpjF.js → RolePill-R5_ctGFy.js} +2 -2
- package/dashboard/dist/assets/{RolePill-CoETDpjF.js.map → RolePill-R5_ctGFy.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-DBKxeam4.js → RolesPage-CPmo8Srr.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-DBKxeam4.js.map → RolesPage-CPmo8Srr.js.map} +1 -1
- package/dashboard/dist/assets/{RosterWidget-BkLAwEYB.js → RosterWidget-D2yovCKw.js} +2 -2
- package/dashboard/dist/assets/{RosterWidget-BkLAwEYB.js.map → RosterWidget-D2yovCKw.js.map} +1 -1
- package/dashboard/dist/assets/{RunAsSelector-D2DC4iDf.js → RunAsSelector-CMv96On6.js} +2 -2
- package/dashboard/dist/assets/{RunAsSelector-D2DC4iDf.js.map → RunAsSelector-CMv96On6.js.map} +1 -1
- package/dashboard/dist/assets/{ScanCodesPage-BlKleaT0.js → ScanCodesPage-CA6cTT-M.js} +2 -2
- package/dashboard/dist/assets/{ScanCodesPage-BlKleaT0.js.map → ScanCodesPage-CA6cTT-M.js.map} +1 -1
- package/dashboard/dist/assets/{ScanSchemeDetailPage-CTW6gofi.js → ScanSchemeDetailPage-DnctN5-H.js} +2 -2
- package/dashboard/dist/assets/{ScanSchemeDetailPage-CTW6gofi.js.map → ScanSchemeDetailPage-DnctN5-H.js.map} +1 -1
- package/dashboard/dist/assets/{ScanStationPage-DPRjSPyT.js → ScanStationPage-Bk8RwkKL.js} +2 -2
- package/dashboard/dist/assets/{ScanStationPage-DPRjSPyT.js.map → ScanStationPage-Bk8RwkKL.js.map} +1 -1
- package/dashboard/dist/assets/{ScopeBadge-CGsTtqFr.js → ScopeBadge-BXZ084nD.js} +2 -2
- package/dashboard/dist/assets/{ScopeBadge-CGsTtqFr.js.map → ScopeBadge-BXZ084nD.js.map} +1 -1
- package/dashboard/dist/assets/{StickyPagination-CkmX3-Gu.js → StickyPagination-B0FSuUgs.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-CkmX3-Gu.js.map → StickyPagination-B0FSuUgs.js.map} +1 -1
- package/dashboard/dist/assets/{StreamMessageDetail-Xm_n510s.js → StreamMessageDetail-BwZEvMpP.js} +2 -2
- package/dashboard/dist/assets/{StreamMessageDetail-Xm_n510s.js.map → StreamMessageDetail-BwZEvMpP.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-De48aJan.js → SwimlaneTimeline-BDVQEaMw.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-De48aJan.js.map → SwimlaneTimeline-BDVQEaMw.js.map} +1 -1
- package/dashboard/dist/assets/{TagInput-S7UuVT_M.js → TagInput-DjPUDp2M.js} +2 -2
- package/dashboard/dist/assets/{TagInput-S7UuVT_M.js.map → TagInput-DjPUDp2M.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-HycMx3O9.js → TaskDetailPage-BOlv3iGB.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-HycMx3O9.js.map → TaskDetailPage-BOlv3iGB.js.map} +1 -1
- package/dashboard/dist/assets/{TaskQueuePill-BlHNpYiZ.js → TaskQueuePill-D-4Ynf3K.js} +2 -2
- package/dashboard/dist/assets/{TaskQueuePill-BlHNpYiZ.js.map → TaskQueuePill-D-4Ynf3K.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-OIcFFp1C.js → TasksListPage-e2teY0bD.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-OIcFFp1C.js.map → TasksListPage-e2teY0bD.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-OTC_55oZ.js → TimeAgo-Cvkpf_b3.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-OTC_55oZ.js.map → TimeAgo-Cvkpf_b3.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-CAwIj_AI.js → TimestampCell-B3btAV0N.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-CAwIj_AI.js.map → TimestampCell-B3btAV0N.js.map} +1 -1
- package/dashboard/dist/assets/{ToolPill-D40uLM_v.js → ToolPill-GsKQ80CO.js} +2 -2
- package/dashboard/dist/assets/{ToolPill-D40uLM_v.js.map → ToolPill-GsKQ80CO.js.map} +1 -1
- package/dashboard/dist/assets/{ToolTestPanel-8Vf6pfw4.js → ToolTestPanel-B03nebR7.js} +2 -2
- package/dashboard/dist/assets/{ToolTestPanel-8Vf6pfw4.js.map → ToolTestPanel-B03nebR7.js.map} +1 -1
- package/dashboard/dist/assets/{TopicDetailPage-iZW8rK9L.js → TopicDetailPage-DBRWne3O.js} +3 -3
- package/dashboard/dist/assets/{TopicDetailPage-iZW8rK9L.js.map → TopicDetailPage-DBRWne3O.js.map} +1 -1
- package/dashboard/dist/assets/{TopicsPage-CqiEcj-W.js → TopicsPage-CVe2M9HD.js} +2 -2
- package/dashboard/dist/assets/{TopicsPage-CqiEcj-W.js.map → TopicsPage-CVe2M9HD.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-DQFjuoib.js → UserName-B_q_qp6V.js} +2 -2
- package/dashboard/dist/assets/{UserName-DQFjuoib.js.map → UserName-B_q_qp6V.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowExecutionPage-Bh_dr9tM.js +2 -0
- package/dashboard/dist/assets/{WorkflowExecutionPage-Di08wCbs.js.map → WorkflowExecutionPage-Bh_dr9tM.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowPill-DJLcK_CM.js → WorkflowPill-D7244fKp.js} +2 -2
- package/dashboard/dist/assets/{WorkflowPill-DJLcK_CM.js.map → WorkflowPill-D7244fKp.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsDashboard-Bb8HlrTJ.js → WorkflowsDashboard-DA6Mj7qH.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsDashboard-Bb8HlrTJ.js.map → WorkflowsDashboard-DA6Mj7qH.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-Dta1kurk.js → WorkflowsOverview-B1kBLj-a.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-Dta1kurk.js.map → WorkflowsOverview-B1kBLj-a.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-CfAajg68.js → YamlWorkflowDetailPage-6GJM8QIX.js} +8 -8
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-CfAajg68.js.map → YamlWorkflowDetailPage-6GJM8QIX.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowsPage-CQFUzT4t.js → YamlWorkflowsPage-Bu811C7f.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowsPage-CQFUzT4t.js.map → YamlWorkflowsPage-Bu811C7f.js.map} +1 -1
- package/dashboard/dist/assets/{agents-PuftRTB2.js → agents-MPk_GnYz.js} +2 -2
- package/dashboard/dist/assets/{agents-PuftRTB2.js.map → agents-MPk_GnYz.js.map} +1 -1
- package/dashboard/dist/assets/{bots-BmEiPAWY.js → bots-2RihE2Tc.js} +2 -2
- package/dashboard/dist/assets/{bots-BmEiPAWY.js.map → bots-2RihE2Tc.js.map} +1 -1
- package/dashboard/dist/assets/{capabilities-CRii4Soa.js → capabilities-CC4iwJ1P.js} +2 -2
- package/dashboard/dist/assets/{capabilities-CRii4Soa.js.map → capabilities-CC4iwJ1P.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-DO_czaYo.js → controlplane-Bmkic8BH.js} +2 -2
- package/dashboard/dist/assets/{controlplane-DO_czaYo.js.map → controlplane-Bmkic8BH.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-columns-CzCquCPh.js → escalation-columns-B0lhUUrQ.js} +2 -2
- package/dashboard/dist/assets/{escalation-columns-CzCquCPh.js.map → escalation-columns-B0lhUUrQ.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-items-Cy0ZgJqV.js → escalation-items-7WFpPo46.js} +2 -2
- package/dashboard/dist/assets/{escalation-items-Cy0ZgJqV.js.map → escalation-items-7WFpPo46.js.map} +1 -1
- package/dashboard/dist/assets/index-B9uv-euR.css +1 -0
- package/dashboard/dist/assets/{index-DhSCCpqM.js → index-B_XV1rwu.js} +2 -2
- package/dashboard/dist/assets/{index-DhSCCpqM.js.map → index-B_XV1rwu.js.map} +1 -1
- package/dashboard/dist/assets/{index-Cx8xb-oU.js → index-C2CLfGwL.js} +2 -2
- package/dashboard/dist/assets/{index-Cx8xb-oU.js.map → index-C2CLfGwL.js.map} +1 -1
- package/dashboard/dist/assets/{index-Cga5IW3D.js → index-C3AeFihz.js} +2 -2
- package/dashboard/dist/assets/{index-Cga5IW3D.js.map → index-C3AeFihz.js.map} +1 -1
- package/dashboard/dist/assets/{index-DiaRlFYI.js → index-CBri8fYM.js} +2 -2
- package/dashboard/dist/assets/{index-DiaRlFYI.js.map → index-CBri8fYM.js.map} +1 -1
- package/dashboard/dist/assets/{index-CL_1VpGb.js → index-CRWsB7ZC.js} +2 -2
- package/dashboard/dist/assets/{index-CL_1VpGb.js.map → index-CRWsB7ZC.js.map} +1 -1
- package/dashboard/dist/assets/{index-XntldBd0.js → index-CTOv3G7a.js} +2 -2
- package/dashboard/dist/assets/{index-XntldBd0.js.map → index-CTOv3G7a.js.map} +1 -1
- package/dashboard/dist/assets/{index-CfP2nKRc.js → index-CcArGkzI.js} +3 -3
- package/dashboard/dist/assets/{index-CfP2nKRc.js.map → index-CcArGkzI.js.map} +1 -1
- package/dashboard/dist/assets/{index-Dz6R8-Dw.js → index-CkMHS-hG.js} +25 -25
- package/dashboard/dist/assets/index-CkMHS-hG.js.map +1 -0
- package/dashboard/dist/assets/index-CmsmwCyv.js +2 -0
- package/dashboard/dist/assets/{index-4YaDUcKd.js.map → index-CmsmwCyv.js.map} +1 -1
- package/dashboard/dist/assets/{index-2SM2_onB.js → index-CvJsvqIc.js} +2 -2
- package/dashboard/dist/assets/{index-2SM2_onB.js.map → index-CvJsvqIc.js.map} +1 -1
- package/dashboard/dist/assets/{index-Rwqrflm-.js → index-D-ilRyfy.js} +2 -2
- package/dashboard/dist/assets/{index-Rwqrflm-.js.map → index-D-ilRyfy.js.map} +1 -1
- package/dashboard/dist/assets/{index-CZ7A3AcD.js → index-DSUtfDXx.js} +2 -2
- package/dashboard/dist/assets/{index-CZ7A3AcD.js.map → index-DSUtfDXx.js.map} +1 -1
- package/dashboard/dist/assets/{index-jL2K6us4.js → index-Da6ycKyf.js} +2 -2
- package/dashboard/dist/assets/{index-jL2K6us4.js.map → index-Da6ycKyf.js.map} +1 -1
- package/dashboard/dist/assets/{knowledge-CeUqGPuo.js → knowledge-Bpbg20DC.js} +2 -2
- package/dashboard/dist/assets/{knowledge-CeUqGPuo.js.map → knowledge-Bpbg20DC.js.map} +1 -1
- package/dashboard/dist/assets/machines-BqOZZU-3.js +2 -0
- package/dashboard/dist/assets/machines-BqOZZU-3.js.map +1 -0
- package/dashboard/dist/assets/{mcp-Cx96NTeD.js → mcp-CmcUXYce.js} +2 -2
- package/dashboard/dist/assets/{mcp-Cx96NTeD.js.map → mcp-CmcUXYce.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-XAzWl0gm.js → mcp-query-C8buQxN9.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-XAzWl0gm.js.map → mcp-query-C8buQxN9.js.map} +1 -1
- package/dashboard/dist/assets/{personas--4kjwyOw.js → personas-C2n5oDmY.js} +2 -2
- package/dashboard/dist/assets/{personas--4kjwyOw.js.map → personas-C2n5oDmY.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-PgkwvG7f.js → pipelines-RKpSkFz7.js} +2 -2
- package/dashboard/dist/assets/{pipelines-PgkwvG7f.js.map → pipelines-RKpSkFz7.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-CcYxdBa3.js → tasks-Dab4hExW.js} +2 -2
- package/dashboard/dist/assets/{tasks-CcYxdBa3.js.map → tasks-Dab4hExW.js.map} +1 -1
- package/dashboard/dist/assets/{topics-_lik7cNY.js → topics-FTMNP7r3.js} +2 -2
- package/dashboard/dist/assets/{topics-_lik7cNY.js.map → topics-FTMNP7r3.js.map} +1 -1
- package/dashboard/dist/assets/{useDebouncedValue-Bm_AoxVx.js → useDebouncedValue-B_1u1YIk.js} +2 -2
- package/dashboard/dist/assets/{useDebouncedValue-Bm_AoxVx.js.map → useDebouncedValue-B_1u1YIk.js.map} +1 -1
- package/dashboard/dist/assets/{useNamespace-DgXXKdx5.js → useNamespace-HUeAI7Qb.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-DgXXKdx5.js.map → useNamespace-HUeAI7Qb.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-Dj2qtGSd.js → useYamlActivityEvents-Cax54qHH.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-Dj2qtGSd.js.map → useYamlActivityEvents-Cax54qHH.js.map} +1 -1
- package/dashboard/dist/assets/{validate-FlXCBBT6.js → validate-DxOaV7QS.js} +2 -2
- package/dashboard/dist/assets/{validate-FlXCBBT6.js.map → validate-DxOaV7QS.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-DUYcKTjP.js → vendor-icons-fxBvvHBi.js} +187 -182
- package/dashboard/dist/assets/vendor-icons-fxBvvHBi.js.map +1 -0
- package/dashboard/dist/assets/{yaml-workflows-B0_JxRYQ.js → yaml-workflows-BgY1XHJx.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-B0_JxRYQ.js.map → yaml-workflows-BgY1XHJx.js.map} +1 -1
- package/dashboard/dist/index.html +3 -3
- package/docs/architecture.md +1 -0
- package/docs/code-owned-configuration.md +6 -0
- package/docs/dashboard.md +1 -0
- package/docs/events.md +83 -4
- package/docs/machines.md +129 -23
- package/docs/mcp.md +19 -0
- package/package.json +3 -1
- package/build/lib/machines/transport/nats-durable.d.ts +0 -11
- package/build/lib/machines/transport/nats-durable.js +0 -28
- package/dashboard/dist/assets/AgentsPage-C9UuUKhr.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-DrvfXz70.js +0 -2
- package/dashboard/dist/assets/FilterBar-BygWrnB1.js +0 -2
- package/dashboard/dist/assets/FilterBar-BygWrnB1.js.map +0 -1
- package/dashboard/dist/assets/McpRunDetailPage-80fQn9iX.js +0 -2
- package/dashboard/dist/assets/WorkflowExecutionPage-Di08wCbs.js +0 -2
- package/dashboard/dist/assets/index-4YaDUcKd.js +0 -2
- package/dashboard/dist/assets/index-CnU7Jjz3.css +0 -1
- package/dashboard/dist/assets/index-Dz6R8-Dw.js.map +0 -1
- package/dashboard/dist/assets/vendor-icons-DUYcKTjP.js.map +0 -1
|
@@ -8,12 +8,21 @@
|
|
|
8
8
|
*/
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
10
|
exports.GENERIC_CHANNELS = exports.RECEIPT_FROM = exports.DISPATCH_ON = void 0;
|
|
11
|
+
exports.declaredRowOps = declaredRowOps;
|
|
11
12
|
exports.topicOf = topicOf;
|
|
12
13
|
exports.genericCodec = genericCodec;
|
|
13
14
|
const constants_1 = require("./constants");
|
|
14
15
|
const contract_1 = require("./contract");
|
|
15
16
|
const envelope_1 = require("./envelope");
|
|
16
17
|
const topics_1 = require("./topics");
|
|
18
|
+
/** The codec's own row ops, each a non-empty string; anything else is a misconfigured codec and throws. */
|
|
19
|
+
function declaredRowOps(codec) {
|
|
20
|
+
const ops = codec.rowOps ?? [];
|
|
21
|
+
if (!Array.isArray(ops) || ops.some((op) => typeof op !== 'string' || !op)) {
|
|
22
|
+
throw new Error('codec.rowOps must be a list of non-empty strings');
|
|
23
|
+
}
|
|
24
|
+
return ops;
|
|
25
|
+
}
|
|
17
26
|
exports.DISPATCH_ON = { CREATED: 'created', ARRIVAL: 'arrival' };
|
|
18
27
|
/** Which job event counts as the receiver's receipt. */
|
|
19
28
|
exports.RECEIPT_FROM = { ARRIVED: 'arrived', BOUND: 'bound', STARTED: 'started' };
|
|
@@ -66,6 +75,7 @@ function genericCodec(opts) {
|
|
|
66
75
|
channels: exports.GENERIC_CHANNELS,
|
|
67
76
|
unitsPerDispatch: opts.unitsPerDispatch ?? null,
|
|
68
77
|
dispatchOn: opts.dispatchOn ?? exports.DISPATCH_ON.CREATED,
|
|
78
|
+
retainedAlarms: true,
|
|
69
79
|
decode(topic, payload, retained) {
|
|
70
80
|
const seen = atMachine((0, contract_1.inspectMessage)(opts.root, topic, payload, retained), ids);
|
|
71
81
|
if (!seen.parsed)
|
|
@@ -93,7 +93,7 @@ export declare const OP: {
|
|
|
93
93
|
readonly CANCEL: "cancel";
|
|
94
94
|
/** Take work: begin or continue the queue. */
|
|
95
95
|
readonly START: "start";
|
|
96
|
-
/** Finish the current unit, then take no more; the queue is kept. */
|
|
96
|
+
/** Finish the current unit, then take no more; the queue is kept. With `args.jobId`, stop that job at a safe point and hold its units. */
|
|
97
97
|
readonly STOP: "stop";
|
|
98
98
|
/** Halt at the next safe point, holding the current unit; nothing new starts. */
|
|
99
99
|
readonly PAUSE: "pause";
|
|
@@ -77,7 +77,7 @@ exports.OP = {
|
|
|
77
77
|
CANCEL: 'cancel',
|
|
78
78
|
/** Take work: begin or continue the queue. */
|
|
79
79
|
START: 'start',
|
|
80
|
-
/** Finish the current unit, then take no more; the queue is kept. */
|
|
80
|
+
/** Finish the current unit, then take no more; the queue is kept. With `args.jobId`, stop that job at a safe point and hold its units. */
|
|
81
81
|
STOP: 'stop',
|
|
82
82
|
/** Halt at the next safe point, holding the current unit; nothing new starts. */
|
|
83
83
|
PAUSE: 'pause',
|
|
@@ -35,7 +35,7 @@ const ENVELOPE = shape({
|
|
|
35
35
|
});
|
|
36
36
|
const RECIPE = { anyOf: [shape({ id: STR, version: STR }), { type: 'null' }] };
|
|
37
37
|
const BODY = {
|
|
38
|
-
[topics_1.MESSAGE_KIND.PRESENCE]: shape({ online: BOOL, software: STR }, ['software']),
|
|
38
|
+
[topics_1.MESSAGE_KIND.PRESENCE]: shape({ online: BOOL, software: STR, sessionId: STR, reason: STR }, ['software', 'sessionId', 'reason']),
|
|
39
39
|
[topics_1.MESSAGE_KIND.SNAPSHOT]: shape({
|
|
40
40
|
bootId: STR, software: STR, mode: oneOf(constants_1.MODE), enabled: BOOL, recipe: RECIPE,
|
|
41
41
|
jobs: { type: 'array', items: shape({ jobId: STR, units: { type: 'array', items: STR }, status: STR }) },
|
|
@@ -51,7 +51,8 @@ const BODY = {
|
|
|
51
51
|
},
|
|
52
52
|
materials: { type: 'array', items: shape({ material: STR, lot: STR }) },
|
|
53
53
|
startedAt: TS, endedAt: TS, durationMs: INT0, failure: oneOf(constants_1.TRANSFER_FAILURE),
|
|
54
|
-
|
|
54
|
+
percent: { type: 'number', minimum: 0, maximum: 100 }, remainingSec: INT0, stage: STR, detail: { type: 'object' },
|
|
55
|
+
}, ['jobId', 'unitId', 'peer', 'result', 'reason', 'measurements', 'materials', 'startedAt', 'endedAt', 'durationMs', 'failure', 'percent', 'remainingSec', 'stage', 'detail']),
|
|
55
56
|
[topics_1.MESSAGE_KIND.ALARM]: shape({
|
|
56
57
|
alarmId: STR, code: STR, level: oneOf(constants_1.LEVEL), text: STR, active: BOOL,
|
|
57
58
|
raisedAt: TS, clearedAt: TS_N, clearedBy: STR_N, ackedBy: STR_N, ackedAt: TS_N,
|
|
@@ -59,7 +60,7 @@ const BODY = {
|
|
|
59
60
|
}),
|
|
60
61
|
[topics_1.MESSAGE_KIND.TELEMETRY]: shape({ readings: { type: 'object', additionalProperties: NUM } }),
|
|
61
62
|
[topics_1.MESSAGE_KIND.CMD]: shape({ cmdId: STR, op: oneOf(constants_1.OP), args: { type: 'object' } }),
|
|
62
|
-
[topics_1.MESSAGE_KIND.REPLY]: shape({ cmdId: STR, status: oneOf(constants_1.REPLY_STATUS), reason: STR }),
|
|
63
|
+
[topics_1.MESSAGE_KIND.REPLY]: shape({ cmdId: STR, status: oneOf(constants_1.REPLY_STATUS), reason: STR, code: STR }, ['code']),
|
|
63
64
|
[topics_1.MESSAGE_KIND.REPORT]: { type: 'object' },
|
|
64
65
|
};
|
|
65
66
|
const ajv = new ajv_1.default({ allErrors: true, strict: false });
|
|
@@ -92,6 +93,8 @@ function inspectMessage(root, topic, raw, retained) {
|
|
|
92
93
|
violations.push(...crossFieldRules(parsed, body, retained));
|
|
93
94
|
return { parsed, body, violations };
|
|
94
95
|
}
|
|
96
|
+
/** Job events a receiver may report naming only the carrier it scanned. */
|
|
97
|
+
const CARRIER_EVENTS = [constants_1.JOB_EVENT.ARRIVED, constants_1.JOB_EVENT.TRANSFER_FAILED];
|
|
95
98
|
function crossFieldRules(parsed, env, retained) {
|
|
96
99
|
const out = [];
|
|
97
100
|
const b = env.body ?? {};
|
|
@@ -102,6 +105,12 @@ function crossFieldRules(parsed, env, retained) {
|
|
|
102
105
|
if (kind === topics_1.MESSAGE_KIND.ALARM && b.alarmId !== key)
|
|
103
106
|
out.push('alarmId disagrees with the topic');
|
|
104
107
|
if (kind === topics_1.MESSAGE_KIND.JOB) {
|
|
108
|
+
// A scan at a receiver may read only the carrier; every other job event names its unit and job.
|
|
109
|
+
const byCarrier = CARRIER_EVENTS.includes(b.event) && typeof b.carrierId === 'string';
|
|
110
|
+
if (b.unitId === undefined && !byCarrier)
|
|
111
|
+
out.push(`${b.event} without a unitId`);
|
|
112
|
+
if (b.jobId === undefined && !byCarrier)
|
|
113
|
+
out.push(`${b.event} without a jobId`);
|
|
105
114
|
if (b.event === constants_1.JOB_EVENT.FINISHED) {
|
|
106
115
|
for (const field of ['result', 'measurements', 'materials', 'startedAt', 'endedAt']) {
|
|
107
116
|
if (!(field in b))
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A line's edge account on Long Tail's NATS: the machine broker's bridge logs
|
|
3
|
+
* in by client certificate (the CN is its user), over MQTT only, and may
|
|
4
|
+
* publish under the line's topics and subscribe to nothing. Long Tail imports
|
|
5
|
+
* exactly those subjects.
|
|
6
|
+
*/
|
|
7
|
+
import type { EdgeAccount } from '../../messaging/nats/render-conf';
|
|
8
|
+
import type { LineDef } from '../line';
|
|
9
|
+
/** An account name for a line: letters, digits, `-` and `_`. */
|
|
10
|
+
export declare function edgeAccountName(line: LineDef): string;
|
|
11
|
+
export declare function edgeAccountFor(line: LineDef, root: string, bridgeUser?: string): EdgeAccount;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* A line's edge account on Long Tail's NATS: the machine broker's bridge logs
|
|
4
|
+
* in by client certificate (the CN is its user), over MQTT only, and may
|
|
5
|
+
* publish under the line's topics and subscribe to nothing. Long Tail imports
|
|
6
|
+
* exactly those subjects.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.edgeAccountName = edgeAccountName;
|
|
10
|
+
exports.edgeAccountFor = edgeAccountFor;
|
|
11
|
+
const protocol_1 = require("../protocol");
|
|
12
|
+
const site_conf_1 = require("./site-conf");
|
|
13
|
+
/** An account name for a line: letters, digits, `-` and `_`. */
|
|
14
|
+
function edgeAccountName(line) {
|
|
15
|
+
return `EDGE_${line.siteId}_${line.lineId}`.replace(/[^A-Za-z0-9_-]/g, '_');
|
|
16
|
+
}
|
|
17
|
+
function edgeAccountFor(line, root, bridgeUser = `CN=${(0, site_conf_1.bridgeId)(line)}`) {
|
|
18
|
+
const subjects = `${(0, protocol_1.toSubject)(`${root}/${line.siteId}/${line.lineId}`)}.>`;
|
|
19
|
+
return {
|
|
20
|
+
name: edgeAccountName(line),
|
|
21
|
+
subjects,
|
|
22
|
+
users: [{ user: bridgeUser, allowed_connection_types: ['MQTT'], permissions: { publish: [subjects], subscribe: { deny: ['>'] } } }],
|
|
23
|
+
};
|
|
24
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The machine broker (Mosquitto), rendered from
|
|
2
|
+
* The machine broker (Mosquitto), rendered from its lines. Machines speak
|
|
3
3
|
* MQTT 5 to it over TLS, each with its own client certificate (the CN is
|
|
4
4
|
* its username). The ACL lets a machine publish only its own channels and
|
|
5
5
|
* read only its own commands, and lets the line controller command every
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* NATS, where JetStream keeps them.
|
|
8
8
|
*/
|
|
9
9
|
import { type LineCodec } from '../protocol/codec';
|
|
10
|
-
import { type
|
|
10
|
+
import { type Lines } from './site-conf';
|
|
11
11
|
export interface MosquittoConfOptions {
|
|
12
12
|
root: string;
|
|
13
13
|
/** Certificate directory as the broker sees it. */
|
|
@@ -17,11 +17,12 @@ export interface MosquittoConfOptions {
|
|
|
17
17
|
aclFile: string;
|
|
18
18
|
maxPacketBytes?: number;
|
|
19
19
|
}
|
|
20
|
-
|
|
20
|
+
/** The broker for one line or several: one listener, one bridge per line. */
|
|
21
|
+
export declare function renderMosquittoConf(lines: Lines, opts: MosquittoConfOptions): string;
|
|
21
22
|
/**
|
|
22
23
|
* The codec's channels decide the topics: a machine writes its events and telemetry and reads its commands.
|
|
23
24
|
* A station whose address the line learns has no user of its own: `pattern` rules give every certificate
|
|
24
25
|
* the channels under its own name (%u), so its certificate's common name must be its address. On a line
|
|
25
26
|
* that also declares addresses, a certificate named for a declared address is denied that station's channels.
|
|
26
27
|
*/
|
|
27
|
-
export declare function renderMosquittoAcl(
|
|
28
|
+
export declare function renderMosquittoAcl(lines: Lines, codec: Pick<LineCodec, 'root' | 'channels' | 'topicFor'>): string;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* The machine broker (Mosquitto), rendered from
|
|
3
|
+
* The machine broker (Mosquitto), rendered from its lines. Machines speak
|
|
4
4
|
* MQTT 5 to it over TLS, each with its own client certificate (the CN is
|
|
5
5
|
* its username). The ACL lets a machine publish only its own channels and
|
|
6
6
|
* read only its own commands, and lets the line controller command every
|
|
@@ -14,7 +14,26 @@ const envelope_1 = require("../protocol/envelope");
|
|
|
14
14
|
const codec_1 = require("../protocol/codec");
|
|
15
15
|
const line_1 = require("../line");
|
|
16
16
|
const site_conf_1 = require("./site-conf");
|
|
17
|
-
|
|
17
|
+
/** One bridge connection per line, carrying the line's topics out to the site NATS. */
|
|
18
|
+
function bridgeBlock(line, opts) {
|
|
19
|
+
return `connection ${line.siteId}-${line.lineId}-site-nats
|
|
20
|
+
address ${opts.siteNats}
|
|
21
|
+
bridge_protocol_version mqttv311
|
|
22
|
+
bridge_cafile ${opts.certDir}/ca.pem
|
|
23
|
+
bridge_certfile ${opts.certDir}/${(0, site_conf_1.bridgeId)(line)}.pem
|
|
24
|
+
bridge_keyfile ${opts.certDir}/${(0, site_conf_1.bridgeId)(line)}.key
|
|
25
|
+
remote_clientid ${(0, site_conf_1.bridgeId)(line)}
|
|
26
|
+
cleansession false
|
|
27
|
+
try_private false
|
|
28
|
+
notifications false
|
|
29
|
+
topic ${opts.root}/${line.siteId}/${line.lineId}/# out 1
|
|
30
|
+
`;
|
|
31
|
+
}
|
|
32
|
+
/** The broker for one line or several: one listener, one bridge per line. */
|
|
33
|
+
function renderMosquittoConf(lines, opts) {
|
|
34
|
+
const list = (0, site_conf_1.linesOf)(lines);
|
|
35
|
+
if (!list.length)
|
|
36
|
+
throw new Error('renderMosquittoConf needs at least one line');
|
|
18
37
|
return `# Rendered from the line definition by site/setup.ts. Do not edit by hand.
|
|
19
38
|
persistence true
|
|
20
39
|
persistence_location /mosquitto/data/
|
|
@@ -32,18 +51,7 @@ use_identity_as_username true
|
|
|
32
51
|
acl_file ${opts.aclFile}
|
|
33
52
|
max_packet_size ${opts.maxPacketBytes ?? 262_144}
|
|
34
53
|
|
|
35
|
-
|
|
36
|
-
address ${opts.siteNats}
|
|
37
|
-
bridge_protocol_version mqttv311
|
|
38
|
-
bridge_cafile ${opts.certDir}/ca.pem
|
|
39
|
-
bridge_certfile ${opts.certDir}/${(0, site_conf_1.bridgeId)(line)}.pem
|
|
40
|
-
bridge_keyfile ${opts.certDir}/${(0, site_conf_1.bridgeId)(line)}.key
|
|
41
|
-
remote_clientid ${(0, site_conf_1.bridgeId)(line)}
|
|
42
|
-
cleansession false
|
|
43
|
-
try_private false
|
|
44
|
-
notifications false
|
|
45
|
-
topic ${opts.root}/${line.siteId}/${line.lineId}/# out 1
|
|
46
|
-
`;
|
|
54
|
+
${list.map((line) => bridgeBlock(line, opts)).join('\n')}`;
|
|
47
55
|
}
|
|
48
56
|
/**
|
|
49
57
|
* The codec's channels decide the topics: a machine writes its events and telemetry and reads its commands.
|
|
@@ -51,7 +59,14 @@ topic ${opts.root}/${line.siteId}/${line.lineId}/# out 1
|
|
|
51
59
|
* the channels under its own name (%u), so its certificate's common name must be its address. On a line
|
|
52
60
|
* that also declares addresses, a certificate named for a declared address is denied that station's channels.
|
|
53
61
|
*/
|
|
54
|
-
function renderMosquittoAcl(
|
|
62
|
+
function renderMosquittoAcl(lines, codec) {
|
|
63
|
+
const list = (0, site_conf_1.linesOf)(lines);
|
|
64
|
+
if (!list.length)
|
|
65
|
+
throw new Error('renderMosquittoAcl needs at least one line');
|
|
66
|
+
return `# Rendered from the line definition by site/setup.ts. Do not edit by hand.\n\n${list.map((line) => aclRules(line, codec)).join('\n\n')}\n`;
|
|
67
|
+
}
|
|
68
|
+
/** One line's rules: its stations, its controller, and the shadows a learning line needs. */
|
|
69
|
+
function aclRules(line, codec) {
|
|
55
70
|
const { siteId, lineId } = line;
|
|
56
71
|
const { events, telemetry, commands } = codec.channels;
|
|
57
72
|
const own = (address, channels) => channels.map((c) => (0, codec_1.topicOf)(codec, { siteId, lineId, address }, c));
|
|
@@ -70,7 +85,7 @@ function renderMosquittoAcl(line, codec) {
|
|
|
70
85
|
...commands.map((c) => `topic write ${(0, codec_1.topicOf)(codec, { siteId, lineId }, c)}`),
|
|
71
86
|
`topic read ${codec.root}/${siteId}/${lineId}/#`,
|
|
72
87
|
].join('\n');
|
|
73
|
-
return
|
|
88
|
+
return [...learned, ...shadows, ...machines, controller].join('\n\n');
|
|
74
89
|
}
|
|
75
90
|
/** Deny a declared station's channels to a certificate named for its address, which the patterns would grant. */
|
|
76
91
|
function shadowRules(line, address, topics) {
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The site's NATS server, rendered from
|
|
2
|
+
* The site's NATS server, rendered from its lines. It runs JetStream and an
|
|
3
3
|
* MQTT listener that only the machine broker's bridge logs in to (by client
|
|
4
4
|
* certificate; the CN is its user, and it may publish only under the line's
|
|
5
|
-
* topics). The gateway logs in by password and may only read
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* topics). The gateway logs in by password and may only keep and read the
|
|
6
|
+
* line's streams through its own consumer (it can neither publish a machine
|
|
7
|
+
* subject nor delete a stream), and subscribe to its inbox and the line. The
|
|
8
|
+
* site NATS stands alone; Long Tail's escalation events stay inside Long Tail.
|
|
8
9
|
*/
|
|
9
|
-
import type
|
|
10
|
+
import { type LineDef } from '../line';
|
|
10
11
|
export interface SiteConfOptions {
|
|
11
12
|
root: string;
|
|
12
13
|
gatewayUser: string;
|
|
@@ -17,4 +18,13 @@ export interface SiteConfOptions {
|
|
|
17
18
|
}
|
|
18
19
|
/** The machine broker's bridge identity for a line. */
|
|
19
20
|
export declare function bridgeId(line: LineDef): string;
|
|
20
|
-
|
|
21
|
+
/** What the gateway may publish: its streams' and its consumer's JetStream requests and acks, never a machine subject. */
|
|
22
|
+
export declare function gatewayPublish(line: LineDef): string[];
|
|
23
|
+
/** One line, or every line the site runs. */
|
|
24
|
+
export type Lines = LineDef | LineDef[];
|
|
25
|
+
export declare function linesOf(lines: Lines): LineDef[];
|
|
26
|
+
/**
|
|
27
|
+
* The site NATS for one line or several: one bridge user per line, one
|
|
28
|
+
* gateway user allowed every line's streams and subjects.
|
|
29
|
+
*/
|
|
30
|
+
export declare function renderSiteConf(lines: Lines, opts: SiteConfOptions): string;
|
|
@@ -1,35 +1,61 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* The site's NATS server, rendered from
|
|
3
|
+
* The site's NATS server, rendered from its lines. It runs JetStream and an
|
|
4
4
|
* MQTT listener that only the machine broker's bridge logs in to (by client
|
|
5
5
|
* certificate; the CN is its user, and it may publish only under the line's
|
|
6
|
-
* topics). The gateway logs in by password and may only read
|
|
7
|
-
*
|
|
8
|
-
*
|
|
6
|
+
* topics). The gateway logs in by password and may only keep and read the
|
|
7
|
+
* line's streams through its own consumer (it can neither publish a machine
|
|
8
|
+
* subject nor delete a stream), and subscribe to its inbox and the line. The
|
|
9
|
+
* site NATS stands alone; Long Tail's escalation events stay inside Long Tail.
|
|
9
10
|
*/
|
|
10
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
12
|
exports.bridgeId = bridgeId;
|
|
13
|
+
exports.gatewayPublish = gatewayPublish;
|
|
14
|
+
exports.linesOf = linesOf;
|
|
12
15
|
exports.renderSiteConf = renderSiteConf;
|
|
16
|
+
const line_1 = require("../line");
|
|
13
17
|
const protocol_1 = require("../protocol");
|
|
18
|
+
const permissions_1 = require("../../messaging/nats/permissions");
|
|
19
|
+
const streams_1 = require("../transport/streams");
|
|
14
20
|
const q = JSON.stringify;
|
|
15
21
|
/** The machine broker's bridge identity for a line. */
|
|
16
22
|
function bridgeId(line) {
|
|
17
23
|
return `${line.siteId}-${line.lineId}-bridge`;
|
|
18
24
|
}
|
|
19
|
-
/** What the gateway may publish: JetStream requests
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
25
|
+
/** What the gateway may publish: its streams' and its consumer's JetStream requests and acks, never a machine subject. */
|
|
26
|
+
function gatewayPublish(line) {
|
|
27
|
+
return (0, permissions_1.jsPermissions)({ streams: Object.values(streams_1.LINE_STREAM), durable: `${(0, line_1.controllerId)(line)}-events` }).publish;
|
|
28
|
+
}
|
|
29
|
+
function linesOf(lines) {
|
|
30
|
+
return Array.isArray(lines) ? lines : [lines];
|
|
31
|
+
}
|
|
32
|
+
/** The server's name: the line for one line, the site when every line shares it, `site` otherwise. */
|
|
33
|
+
function serverName(lines) {
|
|
34
|
+
if (lines.length === 1)
|
|
35
|
+
return `${lines[0].siteId}-${lines[0].lineId}`;
|
|
36
|
+
const sites = new Set(lines.map((l) => l.siteId));
|
|
37
|
+
return sites.size === 1 ? lines[0].siteId : 'site';
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* The site NATS for one line or several: one bridge user per line, one
|
|
41
|
+
* gateway user allowed every line's streams and subjects.
|
|
42
|
+
*/
|
|
43
|
+
function renderSiteConf(lines, opts) {
|
|
44
|
+
const list = linesOf(lines);
|
|
45
|
+
if (!list.length)
|
|
46
|
+
throw new Error('renderSiteConf needs at least one line');
|
|
47
|
+
const baseOf = (line) => (0, protocol_1.toSubject)(`${opts.root}/${line.siteId}/${line.lineId}`);
|
|
48
|
+
const bridge = list.map((line) => [
|
|
24
49
|
` { user: ${q(`CN=${bridgeId(line)}`)}, allowed_connection_types: ["MQTT"],`,
|
|
25
|
-
` permissions: { publish: [${q(`${
|
|
26
|
-
].join('\n');
|
|
50
|
+
` permissions: { publish: [${q(`${baseOf(line)}.>`)}], subscribe: { deny: [">"] } } }`,
|
|
51
|
+
].join('\n')).join('\n');
|
|
52
|
+
const publish = [...new Set(list.flatMap((line) => gatewayPublish(line)))];
|
|
27
53
|
const gateway = [
|
|
28
54
|
` { user: ${q(opts.gatewayUser)}, password: ${q(opts.gatewayPassword)}, allowed_connection_types: ["STANDARD"],`,
|
|
29
|
-
` permissions: { publish: ${q(
|
|
55
|
+
` permissions: { publish: ${q(publish)}, subscribe: ${q(['_INBOX.>', ...list.map((line) => `${baseOf(line)}.>`)])} } }`,
|
|
30
56
|
].join('\n');
|
|
31
57
|
return `# Rendered from the line definition by site/setup.ts. Do not edit by hand.
|
|
32
|
-
server_name: ${q(
|
|
58
|
+
server_name: ${q(serverName(list))}
|
|
33
59
|
port: 4222
|
|
34
60
|
http: 8222
|
|
35
61
|
jetstream { store_dir: ${q(opts.storeDir)} }
|
|
@@ -14,5 +14,6 @@ export declare class CallbackEscalationFeed implements EscalationFeed {
|
|
|
14
14
|
constructor(adapter: CallbackEventAdapter, nakDelayMs?: number);
|
|
15
15
|
connect(): Promise<void>;
|
|
16
16
|
consume(handler: (event: EscalationEvent) => Promise<MachineDisposition>): Promise<void>;
|
|
17
|
+
unsubscribe(): Promise<void>;
|
|
17
18
|
close(): Promise<void>;
|
|
18
19
|
}
|
|
@@ -23,9 +23,12 @@ class CallbackEscalationFeed {
|
|
|
23
23
|
void this.redelivery.deliver(() => handler(event));
|
|
24
24
|
});
|
|
25
25
|
}
|
|
26
|
-
async
|
|
26
|
+
async unsubscribe() {
|
|
27
27
|
this.off?.();
|
|
28
28
|
await this.redelivery.stop();
|
|
29
29
|
}
|
|
30
|
+
async close() {
|
|
31
|
+
await this.unsubscribe();
|
|
32
|
+
}
|
|
30
33
|
}
|
|
31
34
|
exports.CallbackEscalationFeed = CallbackEscalationFeed;
|
|
@@ -4,17 +4,16 @@
|
|
|
4
4
|
* own commands. The gateway holds a MachineBus: durable, ordered delivery of
|
|
5
5
|
* every machine message on the line, QoS 1 command egress, and retained reads.
|
|
6
6
|
*/
|
|
7
|
+
import type { Delivery } from '../../../types/messaging';
|
|
7
8
|
import type { EscalationEvent, EscalationFeed, InboundMessage, LinkConnectOptions, LinkWill, MachineBus, MachineLink, PublishOptions } from '../../../types/machines';
|
|
8
9
|
export type { EscalationEvent, EscalationFeed, InboundMessage, LinkConnectOptions, LinkWill, MachineBus, MachineLink, PublishOptions };
|
|
10
|
+
/** What the gateway does with a machine message: the messaging capability's deliveries (nak: its row does not exist yet). */
|
|
9
11
|
export declare const DISPOSITION: {
|
|
10
|
-
/** Handled; do not deliver again. */
|
|
11
12
|
readonly ACK: "ack";
|
|
12
|
-
/** Not yet actionable (its row does not exist yet); deliver again later. */
|
|
13
13
|
readonly NAK: "nak";
|
|
14
|
-
/** Never actionable; drop it. */
|
|
15
14
|
readonly TERM: "term";
|
|
16
15
|
};
|
|
17
|
-
export type Disposition =
|
|
16
|
+
export type Disposition = Delivery;
|
|
18
17
|
/** MQTT filter match with `+` (one level) and `#` (the rest). */
|
|
19
18
|
export declare function topicMatches(filter: string, topic: string): boolean;
|
|
20
19
|
/** Read an LTEvent body into an EscalationEvent; null for other families. */
|
|
@@ -9,14 +9,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
9
9
|
exports.DISPOSITION = void 0;
|
|
10
10
|
exports.topicMatches = topicMatches;
|
|
11
11
|
exports.toEscalationEvent = toEscalationEvent;
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
/** Not yet actionable (its row does not exist yet); deliver again later. */
|
|
16
|
-
NAK: 'nak',
|
|
17
|
-
/** Never actionable; drop it. */
|
|
18
|
-
TERM: 'term',
|
|
19
|
-
};
|
|
12
|
+
const constants_1 = require("../../messaging/constants");
|
|
13
|
+
/** What the gateway does with a machine message: the messaging capability's deliveries (nak: its row does not exist yet). */
|
|
14
|
+
exports.DISPOSITION = constants_1.DELIVERY;
|
|
20
15
|
/** MQTT filter match with `+` (one level) and `#` (the rest). */
|
|
21
16
|
function topicMatches(filter, topic) {
|
|
22
17
|
const f = filter.split('/');
|
|
@@ -6,6 +6,8 @@ export * from './streams';
|
|
|
6
6
|
export * from './mqtt-session';
|
|
7
7
|
export * from './mqtt-link';
|
|
8
8
|
export * from './mqtt-bus';
|
|
9
|
+
export * from './stream-bus';
|
|
9
10
|
export * from './nats-bus';
|
|
10
11
|
export * from './nats-feed';
|
|
12
|
+
export * from './pubsub-feed';
|
|
11
13
|
export * from './callback-feed';
|
|
@@ -22,6 +22,8 @@ __exportStar(require("./streams"), exports);
|
|
|
22
22
|
__exportStar(require("./mqtt-session"), exports);
|
|
23
23
|
__exportStar(require("./mqtt-link"), exports);
|
|
24
24
|
__exportStar(require("./mqtt-bus"), exports);
|
|
25
|
+
__exportStar(require("./stream-bus"), exports);
|
|
25
26
|
__exportStar(require("./nats-bus"), exports);
|
|
26
27
|
__exportStar(require("./nats-feed"), exports);
|
|
28
|
+
__exportStar(require("./pubsub-feed"), exports);
|
|
27
29
|
__exportStar(require("./callback-feed"), exports);
|
|
@@ -26,6 +26,7 @@ export declare class MemoryMachineBus implements MachineBus {
|
|
|
26
26
|
retain?: boolean;
|
|
27
27
|
}): Promise<void>;
|
|
28
28
|
retained(filter: string): Promise<InboundMessage[]>;
|
|
29
|
+
unsubscribe(): Promise<void>;
|
|
29
30
|
close(): Promise<void>;
|
|
30
31
|
}
|
|
31
32
|
export declare class MemoryEscalationFeed implements EscalationFeed {
|
|
@@ -36,5 +37,6 @@ export declare class MemoryEscalationFeed implements EscalationFeed {
|
|
|
36
37
|
emit(body: Record<string, any>): void;
|
|
37
38
|
connect(): Promise<void>;
|
|
38
39
|
consume(handler: (event: EscalationEvent) => Promise<Disposition>): Promise<void>;
|
|
40
|
+
unsubscribe(): Promise<void>;
|
|
39
41
|
close(): Promise<void>;
|
|
40
42
|
}
|
|
@@ -50,6 +50,9 @@ class MemoryMachineBus {
|
|
|
50
50
|
async retained(filter) {
|
|
51
51
|
return this.broker.retained(filter);
|
|
52
52
|
}
|
|
53
|
+
async unsubscribe() {
|
|
54
|
+
this.broker.detach(this.durableName);
|
|
55
|
+
}
|
|
53
56
|
async close() {
|
|
54
57
|
this.broker.detach(this.durableName);
|
|
55
58
|
}
|
|
@@ -72,6 +75,9 @@ class MemoryEscalationFeed {
|
|
|
72
75
|
return event ? handler(event) : delivery_1.DISPOSITION.TERM;
|
|
73
76
|
});
|
|
74
77
|
}
|
|
78
|
+
async unsubscribe() {
|
|
79
|
+
this.broker.detach(this.durableName);
|
|
80
|
+
}
|
|
75
81
|
async close() {
|
|
76
82
|
this.broker.detach(this.durableName);
|
|
77
83
|
}
|
|
@@ -19,6 +19,8 @@ export declare class MqttMachineBus implements MachineBus {
|
|
|
19
19
|
retain?: boolean;
|
|
20
20
|
}): Promise<void>;
|
|
21
21
|
retained(filter: string): Promise<InboundMessage[]>;
|
|
22
|
+
/** Stops delivery in this process; the persistent session keeps its subscription, so messages queue for the next gateway. */
|
|
23
|
+
unsubscribe(): Promise<void>;
|
|
22
24
|
close(): Promise<void>;
|
|
23
25
|
private connected;
|
|
24
26
|
}
|
|
@@ -30,6 +30,10 @@ class MqttMachineBus {
|
|
|
30
30
|
retained(filter) {
|
|
31
31
|
return this.connected().retained(filter);
|
|
32
32
|
}
|
|
33
|
+
/** Stops delivery in this process; the persistent session keeps its subscription, so messages queue for the next gateway. */
|
|
34
|
+
async unsubscribe() {
|
|
35
|
+
await this.redelivery.stop();
|
|
36
|
+
}
|
|
33
37
|
async close() {
|
|
34
38
|
await this.redelivery.stop();
|
|
35
39
|
await this.session?.close(true);
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The gateway on
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* session at QoS 1: a NATS publish reaches MQTT subscribers at QoS 0 and
|
|
6
|
-
* would not wait for a machine that is away.
|
|
2
|
+
* The gateway on a NATS server of the site's own (MACHINE_SITE_NATS_*): the
|
|
3
|
+
* stream bus on a NATS messaging provider this bus connects and closes itself.
|
|
4
|
+
* With Long Tail's messaging configured, the stream bus runs on that instead.
|
|
7
5
|
*/
|
|
8
6
|
import type { MqttEndpoint } from '../../../services/machines/config';
|
|
9
|
-
import {
|
|
7
|
+
import type { StreamCodec } from './streams';
|
|
10
8
|
import type { Disposition, InboundMessage, MachineBus } from './delivery';
|
|
11
9
|
export interface NatsBusOptions {
|
|
12
10
|
natsUrl: string;
|
|
@@ -23,11 +21,8 @@ export interface NatsBusOptions {
|
|
|
23
21
|
}
|
|
24
22
|
export declare class NatsMachineBus implements MachineBus {
|
|
25
23
|
private readonly opts;
|
|
26
|
-
private
|
|
27
|
-
private
|
|
28
|
-
private messages?;
|
|
29
|
-
private telemetry;
|
|
30
|
-
private readonly queue;
|
|
24
|
+
private readonly provider;
|
|
25
|
+
private bus?;
|
|
31
26
|
constructor(opts: NatsBusOptions);
|
|
32
27
|
get durableName(): string;
|
|
33
28
|
connect(): Promise<void>;
|
|
@@ -36,7 +31,7 @@ export declare class NatsMachineBus implements MachineBus {
|
|
|
36
31
|
retain?: boolean;
|
|
37
32
|
}): Promise<void>;
|
|
38
33
|
retained(filter: string): Promise<InboundMessage[]>;
|
|
34
|
+
unsubscribe(): Promise<void>;
|
|
39
35
|
close(): Promise<void>;
|
|
40
|
-
private
|
|
41
|
-
private mqtt;
|
|
36
|
+
private stream;
|
|
42
37
|
}
|