@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
|
@@ -1,67 +1,50 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* The gateway on
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* session at QoS 1: a NATS publish reaches MQTT subscribers at QoS 0 and
|
|
7
|
-
* would not wait for a machine that is away.
|
|
3
|
+
* The gateway on a NATS server of the site's own (MACHINE_SITE_NATS_*): the
|
|
4
|
+
* stream bus on a NATS messaging provider this bus connects and closes itself.
|
|
5
|
+
* With Long Tail's messaging configured, the stream bus runs on that instead.
|
|
8
6
|
*/
|
|
9
7
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
8
|
exports.NatsMachineBus = void 0;
|
|
11
|
-
const
|
|
12
|
-
const
|
|
13
|
-
const mqtt_session_1 = require("./mqtt-session");
|
|
14
|
-
const nats_durable_1 = require("./nats-durable");
|
|
15
|
-
const serial_1 = require("./serial");
|
|
16
|
-
const streams_1 = require("./streams");
|
|
9
|
+
const provider_1 = require("../../messaging/nats/provider");
|
|
10
|
+
const stream_bus_1 = require("./stream-bus");
|
|
17
11
|
class NatsMachineBus {
|
|
18
12
|
constructor(opts) {
|
|
19
13
|
this.opts = opts;
|
|
20
|
-
this.
|
|
21
|
-
this.queue = new serial_1.SerialQueue();
|
|
14
|
+
this.provider = new provider_1.NatsMessagingProvider({ url: opts.natsUrl, user: opts.user, password: opts.password, name: opts.controllerId });
|
|
22
15
|
}
|
|
23
16
|
get durableName() {
|
|
24
17
|
return `${this.opts.controllerId}-events`;
|
|
25
18
|
}
|
|
26
19
|
async connect() {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
this.
|
|
20
|
+
await this.provider.connect();
|
|
21
|
+
const streams = this.provider.streams;
|
|
22
|
+
if (!streams)
|
|
23
|
+
throw new Error(`the site NATS at ${this.opts.natsUrl} has no JetStream for the gateway`);
|
|
24
|
+
const { natsUrl: _url, user: _user, password: _password, ...rest } = this.opts;
|
|
25
|
+
this.bus = new stream_bus_1.StreamMachineBus({ ...rest, streams, pubsub: this.provider.pubsub });
|
|
26
|
+
await this.bus.connect();
|
|
33
27
|
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
const { codec, siteId, lineId, nakDelayMs = 1_000 } = this.opts;
|
|
37
|
-
this.messages = await (0, nats_durable_1.readDurable)(nc.jetstream(), streams_1.LINE_STREAM.EVENTS, this.durableName, this.queue, (m) => handler({ topic: (0, protocol_1.toTopic)(m.subject), payload: (0, nats_durable_1.payloadOf)(m), deliveries: m.info.deliveryCount }), nakDelayMs);
|
|
38
|
-
this.telemetry = (0, streams_1.telemetrySubjects)(codec, siteId, lineId).map((subject) => nc.subscribe(subject, {
|
|
39
|
-
callback: (_err, m) => void this.queue.run(() => handler({ topic: (0, protocol_1.toTopic)(m.subject), payload: (0, nats_durable_1.payloadOf)(m), deliveries: 1 })),
|
|
40
|
-
}));
|
|
28
|
+
consume(handler) {
|
|
29
|
+
return this.stream().consume(handler);
|
|
41
30
|
}
|
|
42
|
-
|
|
43
|
-
|
|
31
|
+
publish(topic, payload, opts) {
|
|
32
|
+
return this.stream().publish(topic, payload, opts);
|
|
44
33
|
}
|
|
45
34
|
retained(filter) {
|
|
46
|
-
return this.
|
|
35
|
+
return this.stream().retained(filter);
|
|
47
36
|
}
|
|
48
|
-
async
|
|
49
|
-
|
|
50
|
-
sub.unsubscribe();
|
|
51
|
-
await this.messages?.close();
|
|
52
|
-
await this.queue.drained();
|
|
53
|
-
await this.session?.close(true);
|
|
54
|
-
await this.nc?.drain();
|
|
37
|
+
async unsubscribe() {
|
|
38
|
+
await this.bus?.unsubscribe();
|
|
55
39
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
return this.nc;
|
|
40
|
+
async close() {
|
|
41
|
+
await this.bus?.close();
|
|
42
|
+
await this.provider.disconnect();
|
|
60
43
|
}
|
|
61
|
-
|
|
62
|
-
if (!this.
|
|
44
|
+
stream() {
|
|
45
|
+
if (!this.bus)
|
|
63
46
|
throw new Error('NATS bus used before connect()');
|
|
64
|
-
return this.
|
|
47
|
+
return this.bus;
|
|
65
48
|
}
|
|
66
49
|
}
|
|
67
50
|
exports.NatsMachineBus = NatsMachineBus;
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
9
|
exports.CoreEscalationFeed = exports.LT_ESCALATION_SUBJECTS = void 0;
|
|
10
10
|
const nats_1 = require("nats");
|
|
11
|
-
const
|
|
11
|
+
const streams_1 = require("../../messaging/nats/streams");
|
|
12
12
|
const serial_1 = require("./serial");
|
|
13
13
|
const delivery_1 = require("./delivery");
|
|
14
14
|
/** Long Tail publishes every LTEvent as `lt.events.<type>`. */
|
|
@@ -34,15 +34,18 @@ class CoreEscalationFeed {
|
|
|
34
34
|
throw new Error('escalation feed used before connect()');
|
|
35
35
|
this.sub = this.nc.subscribe(exports.LT_ESCALATION_SUBJECTS, {
|
|
36
36
|
callback: (_err, m) => {
|
|
37
|
-
const event = decode((0,
|
|
37
|
+
const event = decode((0, streams_1.payloadOf)(m));
|
|
38
38
|
if (event)
|
|
39
39
|
void this.redelivery.deliver(() => handler(event));
|
|
40
40
|
},
|
|
41
41
|
});
|
|
42
42
|
}
|
|
43
|
-
async
|
|
43
|
+
async unsubscribe() {
|
|
44
44
|
this.sub?.unsubscribe();
|
|
45
45
|
await this.redelivery.stop();
|
|
46
|
+
}
|
|
47
|
+
async close() {
|
|
48
|
+
await this.unsubscribe();
|
|
46
49
|
await this.nc?.drain();
|
|
47
50
|
}
|
|
48
51
|
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Long Tail's escalation events for a gateway running outside Long Tail, over
|
|
3
|
+
* Long Tail's messaging pub/sub. Nothing is replayed; a not-yet-actionable
|
|
4
|
+
* event is retried in this process, and the gateway reconciles open rows when
|
|
5
|
+
* it starts leading a line.
|
|
6
|
+
*/
|
|
7
|
+
import type { LTPubSub } from '../../../types/messaging';
|
|
8
|
+
import { type Disposition, type EscalationEvent, type EscalationFeed } from './delivery';
|
|
9
|
+
export declare class PubSubEscalationFeed implements EscalationFeed {
|
|
10
|
+
private readonly pubsub;
|
|
11
|
+
private sub?;
|
|
12
|
+
private readonly redelivery;
|
|
13
|
+
constructor(pubsub: LTPubSub, nakDelayMs?: number);
|
|
14
|
+
connect(): Promise<void>;
|
|
15
|
+
consume(handler: (event: EscalationEvent) => Promise<Disposition>): Promise<void>;
|
|
16
|
+
unsubscribe(): Promise<void>;
|
|
17
|
+
close(): Promise<void>;
|
|
18
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Long Tail's escalation events for a gateway running outside Long Tail, over
|
|
4
|
+
* Long Tail's messaging pub/sub. Nothing is replayed; a not-yet-actionable
|
|
5
|
+
* event is retried in this process, and the gateway reconciles open rows when
|
|
6
|
+
* it starts leading a line.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.PubSubEscalationFeed = void 0;
|
|
10
|
+
const constants_1 = require("../../messaging/constants");
|
|
11
|
+
const serial_1 = require("./serial");
|
|
12
|
+
const delivery_1 = require("./delivery");
|
|
13
|
+
class PubSubEscalationFeed {
|
|
14
|
+
constructor(pubsub, nakDelayMs = 1_000) {
|
|
15
|
+
this.pubsub = pubsub;
|
|
16
|
+
this.redelivery = new serial_1.LocalRedelivery(new serial_1.SerialQueue(), nakDelayMs);
|
|
17
|
+
}
|
|
18
|
+
async connect() {
|
|
19
|
+
// The shared connection belongs to Long Tail's messaging registry.
|
|
20
|
+
}
|
|
21
|
+
async consume(handler) {
|
|
22
|
+
this.sub = this.pubsub.subscribe(constants_1.LT_SUBJECTS.ESCALATIONS, (m) => {
|
|
23
|
+
let event = null;
|
|
24
|
+
try {
|
|
25
|
+
event = (0, delivery_1.toEscalationEvent)(JSON.parse(m.payload));
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
event = null;
|
|
29
|
+
}
|
|
30
|
+
if (event)
|
|
31
|
+
void this.redelivery.deliver(() => handler(event));
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
async unsubscribe() {
|
|
35
|
+
await this.sub?.close();
|
|
36
|
+
await this.redelivery.stop();
|
|
37
|
+
}
|
|
38
|
+
async close() {
|
|
39
|
+
await this.unsubscribe();
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
exports.PubSubEscalationFeed = PubSubEscalationFeed;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The gateway on Long Tail's messaging capability. Machine events come from the
|
|
3
|
+
* line's durable consumer on LINE_EVENTS (replayed after a restart); telemetry
|
|
4
|
+
* is read live, since it only proves a machine is alive. Commands leave through
|
|
5
|
+
* an MQTT session at QoS 1 on the site broker, which queues them for a machine
|
|
6
|
+
* that is away; retained machine state is read there too.
|
|
7
|
+
*/
|
|
8
|
+
import type { LTPubSub, LTStreams } from '../../../types/messaging';
|
|
9
|
+
import type { MqttEndpoint } from '../../../services/machines/config';
|
|
10
|
+
import { type StreamCodec } from './streams';
|
|
11
|
+
import type { Disposition, InboundMessage, MachineBus } from './delivery';
|
|
12
|
+
export interface StreamBusOptions {
|
|
13
|
+
streams: LTStreams;
|
|
14
|
+
pubsub: LTPubSub;
|
|
15
|
+
mqtt: MqttEndpoint;
|
|
16
|
+
/** The gateway's broker identity; also its MQTT client id and the root of its consumer's name. */
|
|
17
|
+
controllerId: string;
|
|
18
|
+
siteId: string;
|
|
19
|
+
lineId: string;
|
|
20
|
+
/** The codec's topics: which subjects are durable events and which are live telemetry. */
|
|
21
|
+
codec: StreamCodec;
|
|
22
|
+
nakDelayMs?: number;
|
|
23
|
+
}
|
|
24
|
+
export declare class StreamMachineBus implements MachineBus {
|
|
25
|
+
private readonly opts;
|
|
26
|
+
private session?;
|
|
27
|
+
private subs;
|
|
28
|
+
/** Events and telemetry reach the gateway one at a time, in arrival order. */
|
|
29
|
+
private readonly queue;
|
|
30
|
+
constructor(opts: StreamBusOptions);
|
|
31
|
+
get durableName(): string;
|
|
32
|
+
connect(): Promise<void>;
|
|
33
|
+
consume(handler: (msg: InboundMessage) => Promise<Disposition>): Promise<void>;
|
|
34
|
+
publish(topic: string, payload: string, opts?: {
|
|
35
|
+
retain?: boolean;
|
|
36
|
+
}): Promise<void>;
|
|
37
|
+
retained(filter: string): Promise<InboundMessage[]>;
|
|
38
|
+
/** Stops the consumer and the live subscriptions; the MQTT session stays open for commands and receipts. */
|
|
39
|
+
unsubscribe(): Promise<void>;
|
|
40
|
+
close(): Promise<void>;
|
|
41
|
+
private mqtt;
|
|
42
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The gateway on Long Tail's messaging capability. Machine events come from the
|
|
4
|
+
* line's durable consumer on LINE_EVENTS (replayed after a restart); telemetry
|
|
5
|
+
* is read live, since it only proves a machine is alive. Commands leave through
|
|
6
|
+
* an MQTT session at QoS 1 on the site broker, which queues them for a machine
|
|
7
|
+
* that is away; retained machine state is read there too.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.StreamMachineBus = void 0;
|
|
11
|
+
const protocol_1 = require("../protocol");
|
|
12
|
+
const mqtt_session_1 = require("./mqtt-session");
|
|
13
|
+
const serial_1 = require("./serial");
|
|
14
|
+
const streams_1 = require("./streams");
|
|
15
|
+
class StreamMachineBus {
|
|
16
|
+
constructor(opts) {
|
|
17
|
+
this.opts = opts;
|
|
18
|
+
this.subs = [];
|
|
19
|
+
/** Events and telemetry reach the gateway one at a time, in arrival order. */
|
|
20
|
+
this.queue = new serial_1.SerialQueue();
|
|
21
|
+
}
|
|
22
|
+
get durableName() {
|
|
23
|
+
return `${this.opts.controllerId}-events`;
|
|
24
|
+
}
|
|
25
|
+
async connect() {
|
|
26
|
+
const { streams, codec, siteId, lineId, controllerId } = this.opts;
|
|
27
|
+
for (const spec of (0, streams_1.lineStreamSpecs)(codec))
|
|
28
|
+
await streams.ensureStream(spec);
|
|
29
|
+
await streams.ensureConsumer(streams_1.LINE_STREAM.EVENTS, (0, streams_1.lineEventConsumerSpec)(codec, siteId, lineId, this.durableName));
|
|
30
|
+
this.session = await mqtt_session_1.MqttSession.open(this.opts.mqtt, controllerId);
|
|
31
|
+
}
|
|
32
|
+
async consume(handler) {
|
|
33
|
+
const { streams, pubsub, codec, siteId, lineId, nakDelayMs = 1_000 } = this.opts;
|
|
34
|
+
this.subs.push(await streams.consume(streams_1.LINE_STREAM.EVENTS, this.durableName, (m) => this.queue.run(() => handler({ topic: (0, protocol_1.toTopic)(m.subject), payload: m.payload, deliveries: m.deliveries })), { nakDelayMs }));
|
|
35
|
+
for (const subject of (0, streams_1.telemetrySubjects)(codec, siteId, lineId)) {
|
|
36
|
+
this.subs.push(pubsub.subscribe(subject, (m) => void this.queue.run(() => handler({ topic: (0, protocol_1.toTopic)(m.subject), payload: m.payload, deliveries: 1 }))));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
async publish(topic, payload, opts = {}) {
|
|
40
|
+
await this.mqtt().publish(topic, payload, 1, opts.retain ?? false);
|
|
41
|
+
}
|
|
42
|
+
retained(filter) {
|
|
43
|
+
return this.mqtt().retained(filter);
|
|
44
|
+
}
|
|
45
|
+
/** Stops the consumer and the live subscriptions; the MQTT session stays open for commands and receipts. */
|
|
46
|
+
async unsubscribe() {
|
|
47
|
+
for (const sub of this.subs.splice(0))
|
|
48
|
+
await sub.close();
|
|
49
|
+
await this.queue.drained();
|
|
50
|
+
}
|
|
51
|
+
async close() {
|
|
52
|
+
await this.unsubscribe();
|
|
53
|
+
await this.session?.close(true);
|
|
54
|
+
}
|
|
55
|
+
mqtt() {
|
|
56
|
+
if (!this.session)
|
|
57
|
+
throw new Error('stream bus used before connect()');
|
|
58
|
+
return this.session;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
exports.StreamMachineBus = StreamMachineBus;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The
|
|
3
|
-
*
|
|
4
|
-
* a restart or a link outage replays instead of losing.
|
|
2
|
+
* The line's durable log, as specs for the messaging capability. Machine
|
|
3
|
+
* events and telemetry each land in a stream; the gateway reads events through
|
|
4
|
+
* a durable consumer, so a restart or a link outage replays instead of losing.
|
|
5
5
|
*/
|
|
6
|
-
import
|
|
6
|
+
import type { ConsumerSpec, StreamSpec } from '../../../types/messaging';
|
|
7
7
|
import { type LineCodec } from '../protocol/codec';
|
|
8
8
|
export declare const LINE_STREAM: {
|
|
9
9
|
readonly EVENTS: "LINE_EVENTS";
|
|
@@ -11,18 +11,14 @@ export declare const LINE_STREAM: {
|
|
|
11
11
|
};
|
|
12
12
|
/** What the streams need from a codec: its root, channels and topic layout. */
|
|
13
13
|
export type StreamCodec = Pick<LineCodec, 'root' | 'channels' | 'topicFor'>;
|
|
14
|
-
/** An MQTT filter as a
|
|
14
|
+
/** An MQTT filter as a subject: levels become tokens, `+` becomes `*`, `#` becomes `>`. */
|
|
15
15
|
export declare function filterToSubject(filter: string): string;
|
|
16
|
-
/** The
|
|
17
|
-
export declare function
|
|
16
|
+
/** The line streams, for every line under the codec's root; a root alone means the generic layout. */
|
|
17
|
+
export declare function lineStreamSpecs(codec: StreamCodec | string): StreamSpec[];
|
|
18
18
|
/** The telemetry subjects for one line, read live rather than replayed. */
|
|
19
19
|
export declare function telemetrySubjects(codec: StreamCodec | string, siteId: string, lineId: string): string[];
|
|
20
20
|
/**
|
|
21
|
-
*
|
|
22
|
-
* are reconciled at boot); after that its position survives restarts.
|
|
21
|
+
* One line's event consumer. It starts at new messages the first time (open
|
|
22
|
+
* rows are reconciled at boot); after that its position survives restarts.
|
|
23
23
|
*/
|
|
24
|
-
export declare function
|
|
25
|
-
export declare function lineEventConsumer(codec: StreamCodec | string, siteId: string, lineId: string, name: string): Partial<ConsumerConfig>;
|
|
26
|
-
/** Create or update each stream, then the consumer. Safe on every boot. */
|
|
27
|
-
export declare function ensureStreams(jsm: JetStreamManager, streams: Partial<StreamConfig>[]): Promise<void>;
|
|
28
|
-
export declare function ensureConsumer(jsm: JetStreamManager, stream: string, config: Partial<ConsumerConfig>): Promise<void>;
|
|
24
|
+
export declare function lineEventConsumerSpec(codec: StreamCodec | string, siteId: string, lineId: string, name: string): ConsumerSpec;
|
|
@@ -1,19 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* The
|
|
4
|
-
*
|
|
5
|
-
* a restart or a link outage replays instead of losing.
|
|
3
|
+
* The line's durable log, as specs for the messaging capability. Machine
|
|
4
|
+
* events and telemetry each land in a stream; the gateway reads events through
|
|
5
|
+
* a durable consumer, so a restart or a link outage replays instead of losing.
|
|
6
6
|
*/
|
|
7
7
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
8
|
exports.LINE_STREAM = void 0;
|
|
9
9
|
exports.filterToSubject = filterToSubject;
|
|
10
|
-
exports.
|
|
10
|
+
exports.lineStreamSpecs = lineStreamSpecs;
|
|
11
11
|
exports.telemetrySubjects = telemetrySubjects;
|
|
12
|
-
exports.
|
|
13
|
-
exports.lineEventConsumer = lineEventConsumer;
|
|
14
|
-
exports.ensureStreams = ensureStreams;
|
|
15
|
-
exports.ensureConsumer = ensureConsumer;
|
|
16
|
-
const nats_1 = require("nats");
|
|
12
|
+
exports.lineEventConsumerSpec = lineEventConsumerSpec;
|
|
17
13
|
const codec_1 = require("../protocol/codec");
|
|
18
14
|
exports.LINE_STREAM = {
|
|
19
15
|
EVENTS: 'LINE_EVENTS',
|
|
@@ -22,71 +18,32 @@ exports.LINE_STREAM = {
|
|
|
22
18
|
const DAY_MS = 86_400_000;
|
|
23
19
|
const ACK_WAIT_MS = 30_000;
|
|
24
20
|
const GENERIC = (root) => ({ root, channels: codec_1.GENERIC_CHANNELS });
|
|
25
|
-
|
|
21
|
+
const codecOf = (codec) => (typeof codec === 'string' ? GENERIC(codec) : codec);
|
|
22
|
+
/** An MQTT filter as a subject: levels become tokens, `+` becomes `*`, `#` becomes `>`. */
|
|
26
23
|
function filterToSubject(filter) {
|
|
27
24
|
return filter.split('/').map((level) => (level === '+' ? '*' : level === '#' ? '>' : level)).join('.');
|
|
28
25
|
}
|
|
29
26
|
function subjectsFor(codec, channels, siteId, lineId) {
|
|
30
27
|
return channels.map((c) => filterToSubject((0, codec_1.topicOf)(codec, { siteId, lineId }, c)));
|
|
31
28
|
}
|
|
32
|
-
/** The
|
|
33
|
-
function
|
|
34
|
-
const c =
|
|
29
|
+
/** The line streams, for every line under the codec's root; a root alone means the generic layout. */
|
|
30
|
+
function lineStreamSpecs(codec) {
|
|
31
|
+
const c = codecOf(codec);
|
|
35
32
|
return [
|
|
36
|
-
{ name: exports.LINE_STREAM.EVENTS, subjects: subjectsFor(c, c.channels.events),
|
|
37
|
-
{ name: exports.LINE_STREAM.TELEMETRY, subjects: subjectsFor(c, c.channels.telemetry),
|
|
33
|
+
{ name: exports.LINE_STREAM.EVENTS, subjects: subjectsFor(c, c.channels.events), maxAgeMs: 30 * DAY_MS },
|
|
34
|
+
{ name: exports.LINE_STREAM.TELEMETRY, subjects: subjectsFor(c, c.channels.telemetry), maxAgeMs: 3 * DAY_MS },
|
|
38
35
|
];
|
|
39
36
|
}
|
|
40
37
|
/** The telemetry subjects for one line, read live rather than replayed. */
|
|
41
38
|
function telemetrySubjects(codec, siteId, lineId) {
|
|
42
|
-
const c =
|
|
39
|
+
const c = codecOf(codec);
|
|
43
40
|
return subjectsFor(c, c.channels.telemetry, siteId, lineId);
|
|
44
41
|
}
|
|
45
42
|
/**
|
|
46
|
-
*
|
|
47
|
-
* are reconciled at boot); after that its position survives restarts.
|
|
43
|
+
* One line's event consumer. It starts at new messages the first time (open
|
|
44
|
+
* rows are reconciled at boot); after that its position survives restarts.
|
|
48
45
|
*/
|
|
49
|
-
function
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
ack_policy: nats_1.AckPolicy.Explicit,
|
|
53
|
-
deliver_policy: nats_1.DeliverPolicy.New,
|
|
54
|
-
ack_wait: (0, nats_1.nanos)(ACK_WAIT_MS),
|
|
55
|
-
filter_subjects: filterSubjects,
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
function lineEventConsumer(codec, siteId, lineId, name) {
|
|
59
|
-
const c = typeof codec === 'string' ? GENERIC(codec) : codec;
|
|
60
|
-
return durableConsumer(name, subjectsFor(c, c.channels.events, siteId, lineId));
|
|
61
|
-
}
|
|
62
|
-
/** Create or update each stream, then the consumer. Safe on every boot. */
|
|
63
|
-
async function ensureStreams(jsm, streams) {
|
|
64
|
-
for (const config of streams) {
|
|
65
|
-
try {
|
|
66
|
-
await jsm.streams.info(config.name);
|
|
67
|
-
await jsm.streams.update(config.name, config);
|
|
68
|
-
}
|
|
69
|
-
catch (err) {
|
|
70
|
-
if (!/stream not found/i.test(err?.message ?? ''))
|
|
71
|
-
throw err;
|
|
72
|
-
await jsm.streams.add(config);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
async function ensureConsumer(jsm, stream, config) {
|
|
77
|
-
let existing;
|
|
78
|
-
try {
|
|
79
|
-
existing = await jsm.consumers.info(stream, config.durable_name);
|
|
80
|
-
}
|
|
81
|
-
catch (err) {
|
|
82
|
-
if (!/consumer not found/i.test(err?.message ?? ''))
|
|
83
|
-
throw err;
|
|
84
|
-
await jsm.consumers.add(stream, config);
|
|
85
|
-
return;
|
|
86
|
-
}
|
|
87
|
-
// The consumer keeps its position; only its subjects follow the codec's channels.
|
|
88
|
-
const want = [...(config.filter_subjects ?? [])].sort();
|
|
89
|
-
const have = [...(existing.config.filter_subjects ?? [])].sort();
|
|
90
|
-
if (want.join('|') !== have.join('|'))
|
|
91
|
-
await jsm.consumers.update(stream, config.durable_name, { filter_subjects: config.filter_subjects });
|
|
46
|
+
function lineEventConsumerSpec(codec, siteId, lineId, name) {
|
|
47
|
+
const c = codecOf(codec);
|
|
48
|
+
return { name, filterSubjects: subjectsFor(c, c.channels.events, siteId, lineId), ackWaitMs: ACK_WAIT_MS, startAt: 'new' };
|
|
92
49
|
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which messaging provider a deployment runs, from start() or the environment.
|
|
3
|
+
* Precedence: an explicit provider, then `messaging.nats` or `messaging.memory`,
|
|
4
|
+
* then LT_MESSAGING with LT_NATS_*, then `events.nats` (the same NATS, configured
|
|
5
|
+
* as events always have been). With none, Long Tail runs without messaging.
|
|
6
|
+
*/
|
|
7
|
+
import type { LTMessagingProvider } from '../../types/messaging';
|
|
8
|
+
import type { LTStartConfig } from '../../types/startup';
|
|
9
|
+
export declare const MESSAGING_KIND: {
|
|
10
|
+
readonly NATS: "nats";
|
|
11
|
+
readonly MEMORY: "memory";
|
|
12
|
+
};
|
|
13
|
+
/** What browsers need to reach the provider's events: a public WebSocket URL, a proxy target, a credential. */
|
|
14
|
+
export interface MessagingWs {
|
|
15
|
+
url?: string;
|
|
16
|
+
proxy?: string;
|
|
17
|
+
token?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface ResolvedMessaging {
|
|
20
|
+
provider: LTMessagingProvider | null;
|
|
21
|
+
ws: MessagingWs;
|
|
22
|
+
}
|
|
23
|
+
type Env = Record<string, string | undefined>;
|
|
24
|
+
export declare function resolveMessaging(start: Pick<LTStartConfig, 'messaging' | 'events'>, env?: Env): ResolvedMessaging;
|
|
25
|
+
export {};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Which messaging provider a deployment runs, from start() or the environment.
|
|
4
|
+
* Precedence: an explicit provider, then `messaging.nats` or `messaging.memory`,
|
|
5
|
+
* then LT_MESSAGING with LT_NATS_*, then `events.nats` (the same NATS, configured
|
|
6
|
+
* as events always have been). With none, Long Tail runs without messaging.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.MESSAGING_KIND = void 0;
|
|
10
|
+
exports.resolveMessaging = resolveMessaging;
|
|
11
|
+
const config_1 = require("../../modules/config");
|
|
12
|
+
const memory_1 = require("./memory");
|
|
13
|
+
const provider_1 = require("./nats/provider");
|
|
14
|
+
exports.MESSAGING_KIND = { NATS: 'nats', MEMORY: 'memory' };
|
|
15
|
+
const NONE = { provider: null, ws: {} };
|
|
16
|
+
function fromEnv(env) {
|
|
17
|
+
const kind = env.LT_MESSAGING;
|
|
18
|
+
if (!kind)
|
|
19
|
+
return null;
|
|
20
|
+
if (kind === exports.MESSAGING_KIND.MEMORY)
|
|
21
|
+
return { provider: new memory_1.MemoryMessagingProvider(), ws: {} };
|
|
22
|
+
if (kind !== exports.MESSAGING_KIND.NATS)
|
|
23
|
+
throw new Error(`LT_MESSAGING="${kind}" is not one of ${Object.values(exports.MESSAGING_KIND).join(', ')}`);
|
|
24
|
+
const url = env.LT_NATS_URL;
|
|
25
|
+
if (!url)
|
|
26
|
+
throw new Error('LT_MESSAGING=nats needs LT_NATS_URL');
|
|
27
|
+
const token = env.LT_NATS_TOKEN || undefined;
|
|
28
|
+
return {
|
|
29
|
+
provider: new provider_1.NatsMessagingProvider({ url, token, user: env.LT_NATS_USER || undefined, password: env.LT_NATS_PASSWORD || undefined, name: 'long-tail' }),
|
|
30
|
+
ws: { url: env.LT_NATS_WS_URL || undefined, proxy: env.LT_NATS_WS_PROXY || undefined, token },
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function resolveMessaging(start, env = process.env) {
|
|
34
|
+
const m = start.messaging;
|
|
35
|
+
if (m?.provider)
|
|
36
|
+
return { provider: m.provider, ws: m.nats?.ws ?? {} };
|
|
37
|
+
if (m?.nats) {
|
|
38
|
+
const { ws, ...nats } = m.nats;
|
|
39
|
+
return { provider: new provider_1.NatsMessagingProvider({ name: 'long-tail', ...nats }), ws: { ...ws, token: ws?.token ?? nats.token } };
|
|
40
|
+
}
|
|
41
|
+
if (m?.memory)
|
|
42
|
+
return { provider: new memory_1.MemoryMessagingProvider(), ws: {} };
|
|
43
|
+
const configured = fromEnv(env);
|
|
44
|
+
if (configured)
|
|
45
|
+
return configured;
|
|
46
|
+
const legacy = start.events?.nats;
|
|
47
|
+
if (legacy) {
|
|
48
|
+
const token = legacy.token || config_1.config.NATS_TOKEN || undefined;
|
|
49
|
+
return {
|
|
50
|
+
provider: new provider_1.NatsMessagingProvider({ url: legacy.url || config_1.config.NATS_URL, token, name: 'long-tail' }),
|
|
51
|
+
ws: { url: legacy.wsUrl || config_1.config.NATS_WS_URL || undefined, proxy: legacy.wsProxy, token },
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
return NONE;
|
|
55
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** Deliveries, log events and subjects for the messaging capability. */
|
|
2
|
+
/** What a consumer does with a stream message. */
|
|
3
|
+
export declare const DELIVERY: {
|
|
4
|
+
/** Handled; do not deliver again. */
|
|
5
|
+
readonly ACK: "ack";
|
|
6
|
+
/** Not yet actionable; deliver again after a delay. */
|
|
7
|
+
readonly NAK: "nak";
|
|
8
|
+
/** Never actionable; drop it. */
|
|
9
|
+
readonly TERM: "term";
|
|
10
|
+
};
|
|
11
|
+
/** Where a new consumer starts: only messages appended after it, or the whole retained history. */
|
|
12
|
+
export declare const START_AT: {
|
|
13
|
+
readonly NEW: "new";
|
|
14
|
+
readonly ALL: "all";
|
|
15
|
+
};
|
|
16
|
+
export declare const MESSAGING_LOG: {
|
|
17
|
+
readonly CONNECTED: "messaging.provider.connected";
|
|
18
|
+
readonly DISCONNECTED: "messaging.provider.disconnected";
|
|
19
|
+
readonly CONNECT_FAILED: "messaging.provider.connect_failed";
|
|
20
|
+
readonly STREAMS_UNAVAILABLE: "messaging.provider.streams_unavailable";
|
|
21
|
+
};
|
|
22
|
+
/** Subjects Long Tail itself publishes under. */
|
|
23
|
+
export declare const LT_SUBJECTS: {
|
|
24
|
+
readonly EVENTS: "lt.events";
|
|
25
|
+
readonly ESCALATIONS: "lt.events.system.escalation.>";
|
|
26
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/** Deliveries, log events and subjects for the messaging capability. */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.LT_SUBJECTS = exports.MESSAGING_LOG = exports.START_AT = exports.DELIVERY = void 0;
|
|
5
|
+
/** What a consumer does with a stream message. */
|
|
6
|
+
exports.DELIVERY = {
|
|
7
|
+
/** Handled; do not deliver again. */
|
|
8
|
+
ACK: 'ack',
|
|
9
|
+
/** Not yet actionable; deliver again after a delay. */
|
|
10
|
+
NAK: 'nak',
|
|
11
|
+
/** Never actionable; drop it. */
|
|
12
|
+
TERM: 'term',
|
|
13
|
+
};
|
|
14
|
+
/** Where a new consumer starts: only messages appended after it, or the whole retained history. */
|
|
15
|
+
exports.START_AT = { NEW: 'new', ALL: 'all' };
|
|
16
|
+
exports.MESSAGING_LOG = {
|
|
17
|
+
CONNECTED: 'messaging.provider.connected',
|
|
18
|
+
DISCONNECTED: 'messaging.provider.disconnected',
|
|
19
|
+
CONNECT_FAILED: 'messaging.provider.connect_failed',
|
|
20
|
+
STREAMS_UNAVAILABLE: 'messaging.provider.streams_unavailable',
|
|
21
|
+
};
|
|
22
|
+
/** Subjects Long Tail itself publishes under. */
|
|
23
|
+
exports.LT_SUBJECTS = {
|
|
24
|
+
EVENTS: 'lt.events',
|
|
25
|
+
ESCALATIONS: 'lt.events.system.escalation.>',
|
|
26
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The messaging registry: one provider, registered at startup and shared by
|
|
3
|
+
* every part of Long Tail that needs pub/sub or durable streams (events, the
|
|
4
|
+
* machine surface). Asking for messaging that is not configured fails loudly,
|
|
5
|
+
* because a caller that gets nothing back would believe it was handled.
|
|
6
|
+
*/
|
|
7
|
+
import type { LTMessagingProvider, LTPubSub, LTStreams } from '../../types/messaging';
|
|
8
|
+
declare class LTMessagingRegistry {
|
|
9
|
+
private current;
|
|
10
|
+
/** Register the provider; replaces any registered before. Call before connect(). */
|
|
11
|
+
register(provider: LTMessagingProvider): void;
|
|
12
|
+
get hasProvider(): boolean;
|
|
13
|
+
get provider(): LTMessagingProvider;
|
|
14
|
+
get pubsub(): LTPubSub;
|
|
15
|
+
get streams(): LTStreams;
|
|
16
|
+
connect(): Promise<void>;
|
|
17
|
+
disconnect(): Promise<void>;
|
|
18
|
+
/** Forget the provider (tests). */
|
|
19
|
+
clear(): void;
|
|
20
|
+
}
|
|
21
|
+
export declare const messagingRegistry: LTMessagingRegistry;
|
|
22
|
+
export { MemoryMessagingProvider } from './memory';
|
|
23
|
+
export { subjectMatches, isSubject } from './subjects';
|
|
24
|
+
export { DELIVERY, START_AT, MESSAGING_LOG, LT_SUBJECTS } from './constants';
|