@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
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
import { type LineCodec, type MachineIdent } from '../../../lib/machines/protocol';
|
|
10
10
|
import type { MachineBus } from '../../../lib/machines/transport';
|
|
11
11
|
import { type GatewayLog } from './log';
|
|
12
|
+
import type { WireRecorder } from './wire';
|
|
12
13
|
/** Most message ids one receipt carries. */
|
|
13
14
|
export declare const MAX_RECEIPT_IDS = 100;
|
|
14
15
|
export interface ReceiptDeps {
|
|
@@ -17,6 +18,8 @@ export interface ReceiptDeps {
|
|
|
17
18
|
/** How long ids gather before a receipt goes out. */
|
|
18
19
|
delayMs: number;
|
|
19
20
|
log: GatewayLog;
|
|
21
|
+
/** Records each receipt the gateway sends, for the line's wire view. */
|
|
22
|
+
wire?: Pick<WireRecorder, 'receipt'>;
|
|
20
23
|
}
|
|
21
24
|
export declare class ReceiptBatcher {
|
|
22
25
|
private readonly d;
|
|
@@ -58,8 +58,10 @@ class ReceiptBatcher {
|
|
|
58
58
|
this.sending.add(work);
|
|
59
59
|
}
|
|
60
60
|
async publish(ident, ids) {
|
|
61
|
-
for (const wire of this.d.codec.receipt(ident, ids))
|
|
61
|
+
for (const wire of this.d.codec.receipt(ident, ids)) {
|
|
62
62
|
await this.d.bus.publish(wire.topic, wire.payload);
|
|
63
|
+
this.d.wire?.receipt(ident, ids, wire);
|
|
64
|
+
}
|
|
63
65
|
}
|
|
64
66
|
}
|
|
65
67
|
exports.ReceiptBatcher = ReceiptBatcher;
|
|
@@ -31,3 +31,5 @@ export declare function alarmsClearedMeanwhile(state: GatewayState, active: Set<
|
|
|
31
31
|
* arrivals it holds.
|
|
32
32
|
*/
|
|
33
33
|
export declare function arrivalsOnRows(state: GatewayState, lt: LineEscalations, dispatchTtlMs: number): Promise<Action[]>;
|
|
34
|
+
/** With lifecycle notes on, the items each handoff out of a machine already holds, so a restart notes nothing twice. */
|
|
35
|
+
export declare function notesOnRows(state: GatewayState, lt: LineEscalations): Promise<void>;
|
|
@@ -10,6 +10,7 @@ exports.restoreLineRows = restoreLineRows;
|
|
|
10
10
|
exports.restoreAddresses = restoreAddresses;
|
|
11
11
|
exports.alarmsClearedMeanwhile = alarmsClearedMeanwhile;
|
|
12
12
|
exports.arrivalsOnRows = arrivalsOnRows;
|
|
13
|
+
exports.notesOnRows = notesOnRows;
|
|
13
14
|
const contracts_1 = require("../contracts");
|
|
14
15
|
const line_1 = require("../../../lib/machines/line");
|
|
15
16
|
const jobs_1 = require("./jobs");
|
|
@@ -21,8 +22,8 @@ async function restoreLineRows(state, lt, line) {
|
|
|
21
22
|
const [alarms, offline, quiet, registrations] = await Promise.all([contracts_1.ROW_TYPE.ALARM, contracts_1.ROW_TYPE.MACHINE_OFFLINE, contracts_1.ROW_TYPE.MACHINE_QUIET, contracts_1.ROW_TYPE.MACHINE_REGISTRATION]
|
|
22
23
|
.map(async (type) => (await lt.listOpen({ type, role })).filter(mine)));
|
|
23
24
|
for (const row of alarms) {
|
|
24
|
-
const { machineId, alarmId, raisedAt } = row.metadata;
|
|
25
|
-
state.alarms.set(state.alarmKey(machineId, alarmId), { machineId, alarmId, raisedAt, rowId: row.id, open: true });
|
|
25
|
+
const { machineId, alarmId, raisedAt, level } = row.metadata;
|
|
26
|
+
state.alarms.set(state.alarmKey(machineId, alarmId), { machineId, alarmId, raisedAt, level, rowId: row.id, open: true });
|
|
26
27
|
}
|
|
27
28
|
for (const row of offline) {
|
|
28
29
|
const link = state.link(row.metadata.machineId);
|
|
@@ -32,7 +33,7 @@ async function restoreLineRows(state, lt, line) {
|
|
|
32
33
|
for (const row of quiet)
|
|
33
34
|
state.link(row.metadata.machineId).quietRowId = row.id;
|
|
34
35
|
for (const row of registrations)
|
|
35
|
-
state.raiseClaim(row.metadata.address, row.metadata.machineId);
|
|
36
|
+
state.raiseClaim(row.metadata.address, row.metadata.machineId, row.id);
|
|
36
37
|
return { alarms: alarms.length, offline: offline.length, quiet: quiet.length, registrations: registrations.length };
|
|
37
38
|
}
|
|
38
39
|
/** The addresses the line learned before, for the stations that still learn theirs. */
|
|
@@ -65,6 +66,7 @@ async function arrivalsOnRows(state, lt, dispatchTtlMs) {
|
|
|
65
66
|
if (!to || (row.dispatch !== state_1.DISPATCH_STATE.ARRIVING && row.dispatch !== state_1.DISPATCH_STATE.ACCEPTED))
|
|
66
67
|
continue;
|
|
67
68
|
const items = await lt.items(row.id);
|
|
69
|
+
row.noted = items.map((i) => i.itemKey);
|
|
68
70
|
const units = row.units.map((u) => u.unitId);
|
|
69
71
|
const { arrived, missing } = (0, contracts_1.handoffProgress)(units, items);
|
|
70
72
|
for (const job of (0, jobs_1.dispatchJobs)(row.jobId, row.units, state.unitsPerDispatch)) {
|
|
@@ -80,7 +82,18 @@ async function arrivalsOnRows(state, lt, dispatchTtlMs) {
|
|
|
80
82
|
}
|
|
81
83
|
const byUnit = new Map(items.filter((i) => (0, contracts_1.arrivedUnit)(i.itemKey)).map((i) => [i.payload.unitId, i.payload]));
|
|
82
84
|
row.arrivals = Object.fromEntries(units.map((u) => [u, byUnit.get(u)?.arrival ?? { unitId: u, carrierId: byUnit.get(u)?.carrierId ?? null }]));
|
|
85
|
+
for (const arrival of byUnit.values())
|
|
86
|
+
row.dueAt = (0, pacing_1.latestArrival)(row.dueAt, arrival.at);
|
|
83
87
|
actions.push((0, pacing_1.dispatchAction)(row, to, dispatchTtlMs));
|
|
84
88
|
}
|
|
85
89
|
return actions;
|
|
86
90
|
}
|
|
91
|
+
/** With lifecycle notes on, the items each handoff out of a machine already holds, so a restart notes nothing twice. */
|
|
92
|
+
async function notesOnRows(state, lt) {
|
|
93
|
+
if (!state.lifecycle)
|
|
94
|
+
return;
|
|
95
|
+
for (const row of state.open()) {
|
|
96
|
+
if (row.fromMachine && !row.noted)
|
|
97
|
+
row.noted = (await lt.items(row.id)).map((i) => i.itemKey);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
@@ -106,7 +106,7 @@ function planRegistrationRow(state, line, event) {
|
|
|
106
106
|
if (typeof md.machineId !== 'string' || typeof md.address !== 'string')
|
|
107
107
|
return [];
|
|
108
108
|
if (event.verb === 'created') {
|
|
109
|
-
state.raiseClaim(md.address, md.machineId);
|
|
109
|
+
state.raiseClaim(md.address, md.machineId, event.escalationId);
|
|
110
110
|
return [];
|
|
111
111
|
}
|
|
112
112
|
state.settleClaim(md.address, md.machineId);
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Command replies by cmdId, and machine snapshots by machine. A wait registers
|
|
3
3
|
* before the command is published and resolves with the reply, or null at the
|
|
4
|
-
* deadline.
|
|
4
|
+
* deadline. Several waits on one key are all settled by the next answer, so
|
|
5
|
+
* two dispatches asking one machine what it holds share its next snapshot.
|
|
5
6
|
*/
|
|
6
7
|
export interface CommandReply {
|
|
7
8
|
cmdId: string;
|
|
8
9
|
status: string;
|
|
9
10
|
reason: string;
|
|
11
|
+
/** The machine's structured code for the outcome, when its reply carried one. */
|
|
12
|
+
code?: string;
|
|
10
13
|
}
|
|
11
14
|
/** The jobs a machine reports holding, queued or in work. */
|
|
12
15
|
export type HeldJobs = Set<string>;
|
|
@@ -16,9 +19,9 @@ export declare class ReplyWaiter {
|
|
|
16
19
|
wait(cmdId: string, timeoutMs: number): Promise<CommandReply | null>;
|
|
17
20
|
/** True when a waiter took the reply. */
|
|
18
21
|
settle(reply: CommandReply): boolean;
|
|
19
|
-
/** The next snapshot from `machineId`, or null at the deadline. */
|
|
22
|
+
/** The next snapshot from `machineId`, or null at the deadline; every wait in flight for the machine gets it. */
|
|
20
23
|
waitSnapshot(machineId: string, timeoutMs: number): Promise<HeldJobs | null>;
|
|
21
|
-
/** Answer
|
|
24
|
+
/** Answer the status queries in flight; null when there is nothing to wait for. */
|
|
22
25
|
settleSnapshot(machineId: string, jobs: HeldJobs | null): void;
|
|
23
26
|
cancelAll(): void;
|
|
24
27
|
}
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Command replies by cmdId, and machine snapshots by machine. A wait registers
|
|
4
4
|
* before the command is published and resolves with the reply, or null at the
|
|
5
|
-
* deadline.
|
|
5
|
+
* deadline. Several waits on one key are all settled by the next answer, so
|
|
6
|
+
* two dispatches asking one machine what it holds share its next snapshot.
|
|
6
7
|
*/
|
|
7
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
9
|
exports.ReplyWaiter = void 0;
|
|
@@ -11,31 +12,51 @@ class Waits {
|
|
|
11
12
|
this.waiting = new Map();
|
|
12
13
|
}
|
|
13
14
|
wait(key, timeoutMs) {
|
|
14
|
-
this.waiting.get(key)?.resolve(null);
|
|
15
15
|
return new Promise((resolve) => {
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
16
|
+
const waiter = {
|
|
17
|
+
resolve,
|
|
18
|
+
timer: setTimeout(() => {
|
|
19
|
+
this.drop(key, waiter);
|
|
20
|
+
resolve(null);
|
|
21
|
+
}, timeoutMs),
|
|
22
|
+
};
|
|
23
|
+
let waiters = this.waiting.get(key);
|
|
24
|
+
if (!waiters) {
|
|
25
|
+
waiters = new Set();
|
|
26
|
+
this.waiting.set(key, waiters);
|
|
27
|
+
}
|
|
28
|
+
waiters.add(waiter);
|
|
21
29
|
});
|
|
22
30
|
}
|
|
31
|
+
/** True when at least one waiter took the value. */
|
|
23
32
|
settle(key, value) {
|
|
24
|
-
const
|
|
25
|
-
if (!
|
|
33
|
+
const waiters = this.waiting.get(key);
|
|
34
|
+
if (!waiters)
|
|
26
35
|
return false;
|
|
27
|
-
clearTimeout(w.timer);
|
|
28
36
|
this.waiting.delete(key);
|
|
29
|
-
w
|
|
37
|
+
for (const w of waiters) {
|
|
38
|
+
clearTimeout(w.timer);
|
|
39
|
+
w.resolve(value);
|
|
40
|
+
}
|
|
30
41
|
return true;
|
|
31
42
|
}
|
|
32
43
|
cancelAll() {
|
|
33
|
-
for (const
|
|
34
|
-
|
|
35
|
-
|
|
44
|
+
for (const waiters of this.waiting.values()) {
|
|
45
|
+
for (const w of waiters) {
|
|
46
|
+
clearTimeout(w.timer);
|
|
47
|
+
w.resolve(null);
|
|
48
|
+
}
|
|
36
49
|
}
|
|
37
50
|
this.waiting.clear();
|
|
38
51
|
}
|
|
52
|
+
drop(key, waiter) {
|
|
53
|
+
const waiters = this.waiting.get(key);
|
|
54
|
+
if (!waiters)
|
|
55
|
+
return;
|
|
56
|
+
waiters.delete(waiter);
|
|
57
|
+
if (!waiters.size)
|
|
58
|
+
this.waiting.delete(key);
|
|
59
|
+
}
|
|
39
60
|
}
|
|
40
61
|
class ReplyWaiter {
|
|
41
62
|
constructor() {
|
|
@@ -49,11 +70,11 @@ class ReplyWaiter {
|
|
|
49
70
|
settle(reply) {
|
|
50
71
|
return this.replies.settle(reply.cmdId, reply);
|
|
51
72
|
}
|
|
52
|
-
/** The next snapshot from `machineId`, or null at the deadline. */
|
|
73
|
+
/** The next snapshot from `machineId`, or null at the deadline; every wait in flight for the machine gets it. */
|
|
53
74
|
waitSnapshot(machineId, timeoutMs) {
|
|
54
75
|
return this.snapshots.wait(machineId, timeoutMs);
|
|
55
76
|
}
|
|
56
|
-
/** Answer
|
|
77
|
+
/** Answer the status queries in flight; null when there is nothing to wait for. */
|
|
57
78
|
settleSnapshot(machineId, jobs) {
|
|
58
79
|
this.snapshots.settle(machineId, jobs);
|
|
59
80
|
}
|
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
* machine's link: presence, last message, software and boot id.
|
|
6
6
|
*/
|
|
7
7
|
import type { HandoffFacets, TraceEntry } from '../contracts';
|
|
8
|
+
import type { LineDef } from '../../../lib/machines/line';
|
|
9
|
+
import type { ContestedClaimView, LineView } from '../../../types/machines-view';
|
|
8
10
|
/**
|
|
9
11
|
* WAITING: the machine has no room yet (pacing.ts); the row waits in its role queue.
|
|
10
12
|
* ARRIVING: the job goes out once its units arrive at the receiver (codec `dispatchOn: arrival`).
|
|
@@ -33,15 +35,26 @@ export interface HandoffRow extends HandoffFacets {
|
|
|
33
35
|
trace?: TraceEntry[];
|
|
34
36
|
/** Each unit's arrival event, as its receiver reported it (dispatch on arrival). */
|
|
35
37
|
arrivals?: Record<string, Record<string, any>>;
|
|
38
|
+
/** Lifecycle item keys already on the row (lifecycle.ts). */
|
|
39
|
+
noted?: string[];
|
|
40
|
+
/** Parked with a limit on its items, which lifecycle notes must never use up. */
|
|
41
|
+
capped?: boolean;
|
|
42
|
+
/** When the row was created (epoch ms). */
|
|
43
|
+
createdAt?: number;
|
|
44
|
+
/** When its last unit arrived (epoch ms, dispatch on arrival); its dispatch windows count from here, else from createdAt. */
|
|
45
|
+
dueAt?: number;
|
|
36
46
|
}
|
|
37
47
|
export interface AlarmTrack {
|
|
38
48
|
machineId: string;
|
|
39
49
|
alarmId: string;
|
|
40
50
|
/** When the machine raised it; a reused alarm id with a new time is a new alarm. */
|
|
41
51
|
raisedAt?: string;
|
|
52
|
+
level?: string;
|
|
42
53
|
rowId?: string;
|
|
43
54
|
/** Created and not yet resolved by anyone. */
|
|
44
55
|
open: boolean;
|
|
56
|
+
/** Rows the alarm paused, noted again when it clears. */
|
|
57
|
+
noted?: string[];
|
|
45
58
|
}
|
|
46
59
|
export interface LinkTrack {
|
|
47
60
|
online: boolean;
|
|
@@ -52,12 +65,35 @@ export interface LinkTrack {
|
|
|
52
65
|
watching?: boolean;
|
|
53
66
|
software?: string;
|
|
54
67
|
bootId?: string;
|
|
68
|
+
/** The machine's connection, when its presence names one; a new one while online is a reconnect to resync. */
|
|
69
|
+
sessionId?: string;
|
|
70
|
+
/** Why the machine went offline, when its presence said. */
|
|
71
|
+
reason?: string;
|
|
72
|
+
/** The jobs its last snapshot listed, as the codec reported them. */
|
|
73
|
+
jobs?: unknown[];
|
|
74
|
+
}
|
|
75
|
+
/** One unit a machine holds: the job it arrived under. */
|
|
76
|
+
export interface HeldUnit {
|
|
77
|
+
unitId: string;
|
|
78
|
+
jobId: string;
|
|
55
79
|
}
|
|
56
80
|
export declare class GatewayState {
|
|
57
81
|
/** Units one dispatch may carry, from the codec; null when any number may. */
|
|
58
82
|
unitsPerDispatch: number | null;
|
|
59
83
|
/** Jobs go to a receiver once its units arrive there, from the codec. */
|
|
60
84
|
dispatchOnArrival: boolean;
|
|
85
|
+
/** Commands of the machines' own that a machine-command row may ask for, from the codec. */
|
|
86
|
+
rowOps: readonly string[];
|
|
87
|
+
/** Note each job's start, progress steps and pauses on the row that holds it (lifecycle.ts). */
|
|
88
|
+
lifecycle: boolean;
|
|
89
|
+
/** Active alarms are retained on the broker; otherwise snapshots list them (codec.ts retainedAlarms). */
|
|
90
|
+
retainedAlarms: boolean;
|
|
91
|
+
/** Reading the broker's retained messages on taking the line; a snapshot read back may be older than its alarms. */
|
|
92
|
+
readingRetained: boolean;
|
|
93
|
+
/** When this gateway took the line (epoch ms); a command for an older row may have been sent by an earlier one. */
|
|
94
|
+
takenAt: number;
|
|
95
|
+
/** With lifecycle notes, progress is noted each time it crosses this many percent; 0 notes none. */
|
|
96
|
+
progressStep: number;
|
|
61
97
|
/** While reconciling, new handoffs wait so pacing sees the whole line before anything is sent. */
|
|
62
98
|
holdDispatch: boolean;
|
|
63
99
|
/** Units at each machine that arrived and have not left: machine → unit → job. */
|
|
@@ -67,6 +103,7 @@ export declare class GatewayState {
|
|
|
67
103
|
readonly alarms: Map<string, AlarmTrack>;
|
|
68
104
|
/** Finished records that came before their row: machine/unit → job body. */
|
|
69
105
|
private earlyFinishes;
|
|
106
|
+
/** Open machine-command rows → the machine each commands. */
|
|
70
107
|
private openCommands;
|
|
71
108
|
/** Accepted dispatch command ids → their row, so a later failure finds the row. */
|
|
72
109
|
private dispatches;
|
|
@@ -77,7 +114,7 @@ export declare class GatewayState {
|
|
|
77
114
|
/** Learned addresses, both ways: station → address and address → station. */
|
|
78
115
|
private addressOfStation;
|
|
79
116
|
private stationOfAddress;
|
|
80
|
-
/** Contested claims already raised as registration rows, `${address}>${station}
|
|
117
|
+
/** Contested claims already raised as registration rows, `${address}>${station}` → the row. */
|
|
81
118
|
private claims;
|
|
82
119
|
/** Contested claims heard from the machines themselves, `${address}>${station}`. */
|
|
83
120
|
private heard;
|
|
@@ -96,23 +133,28 @@ export declare class GatewayState {
|
|
|
96
133
|
/** The job a unit arrived under at `machineId`, while it is still there. */
|
|
97
134
|
heldJob(machineId: string, unitId: string): string | undefined;
|
|
98
135
|
heldAt(machineId: string): string[];
|
|
136
|
+
heldUnitsAt(machineId: string): HeldUnit[];
|
|
99
137
|
/** Keep only units whose job the machine still lists (its snapshot). */
|
|
100
138
|
keepHeld(machineId: string, jobIds: Set<string>): void;
|
|
101
139
|
/** Keep a sender's finished record until its row is known, so an arrival cannot close the row without it. */
|
|
102
140
|
rememberFinish(machineId: string, unitId: string, body: Record<string, any>): void;
|
|
103
141
|
takeFinish(machineId: string, unitId: string): Record<string, any> | undefined;
|
|
104
142
|
rememberDispatch(cmdId: string, rowId: string): void;
|
|
105
|
-
/** The
|
|
143
|
+
/** The row a dispatch command belongs to, open or recently closed. */
|
|
106
144
|
rowForDispatch(cmdId: string): HandoffRow | undefined;
|
|
107
145
|
/** Track a machine-command row; false when it is already tracked or has ended. */
|
|
108
|
-
trackCommand(id: string): boolean;
|
|
146
|
+
trackCommand(id: string, machineId?: string): boolean;
|
|
147
|
+
/** Open machine-command rows for one machine. */
|
|
148
|
+
openCommandsFor(machineId: string): number;
|
|
109
149
|
endCommand(id: string): void;
|
|
110
150
|
/** Bind a station to an address, replacing whatever either was bound to before. */
|
|
111
151
|
bindAddress(machineId: string, address: string): void;
|
|
112
152
|
learnedAddress(machineId: string): string | undefined;
|
|
113
153
|
stationAt(address: string): string | undefined;
|
|
114
154
|
claimRaised(address: string, machineId: string): boolean;
|
|
115
|
-
raiseClaim(address: string, machineId: string): void;
|
|
155
|
+
raiseClaim(address: string, machineId: string, rowId?: string): void;
|
|
156
|
+
/** The contested claims waiting for a person, with the rows that ask. */
|
|
157
|
+
contested(): ContestedClaimView[];
|
|
116
158
|
settleClaim(address: string, machineId: string): void;
|
|
117
159
|
hearClaim(address: string, machineId: string): void;
|
|
118
160
|
claimHeard(address: string, machineId: string): boolean;
|
|
@@ -122,4 +164,8 @@ export declare class GatewayState {
|
|
|
122
164
|
raiseViolation(key: string): void;
|
|
123
165
|
link(machineId: string, now?: number): LinkTrack;
|
|
124
166
|
alarmKey(machineId: string, alarmId: string): string;
|
|
167
|
+
/** The line as this gateway sees it (project.ts). */
|
|
168
|
+
project(line: LineDef): LineView;
|
|
169
|
+
/** A copy a dry run may change without touching the line. */
|
|
170
|
+
clone(): GatewayState;
|
|
125
171
|
}
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
9
|
exports.GatewayState = exports.ROW_END = exports.DISPATCH_STATE = void 0;
|
|
10
|
+
const project_1 = require("./project");
|
|
10
11
|
const trace_1 = require("./trace");
|
|
11
12
|
/**
|
|
12
13
|
* WAITING: the machine has no room yet (pacing.ts); the row waits in its role queue.
|
|
@@ -16,6 +17,10 @@ exports.DISPATCH_STATE = {
|
|
|
16
17
|
NONE: 'none', WAITING: 'waiting', ARRIVING: 'arriving', PENDING: 'pending', ACCEPTED: 'accepted', REFUSED: 'refused',
|
|
17
18
|
};
|
|
18
19
|
exports.ROW_END = { RESOLVED: 'resolved', CANCELLED: 'cancelled', EXPIRED: 'expired' };
|
|
20
|
+
function copyInto(from, into, clone = (v) => v) {
|
|
21
|
+
for (const [k, v] of from)
|
|
22
|
+
into.set(k, clone(v));
|
|
23
|
+
}
|
|
19
24
|
const CLOSED_LIMIT = 2_000;
|
|
20
25
|
class GatewayState {
|
|
21
26
|
constructor() {
|
|
@@ -23,6 +28,18 @@ class GatewayState {
|
|
|
23
28
|
this.unitsPerDispatch = null;
|
|
24
29
|
/** Jobs go to a receiver once its units arrive there, from the codec. */
|
|
25
30
|
this.dispatchOnArrival = false;
|
|
31
|
+
/** Commands of the machines' own that a machine-command row may ask for, from the codec. */
|
|
32
|
+
this.rowOps = [];
|
|
33
|
+
/** Note each job's start, progress steps and pauses on the row that holds it (lifecycle.ts). */
|
|
34
|
+
this.lifecycle = false;
|
|
35
|
+
/** Active alarms are retained on the broker; otherwise snapshots list them (codec.ts retainedAlarms). */
|
|
36
|
+
this.retainedAlarms = false;
|
|
37
|
+
/** Reading the broker's retained messages on taking the line; a snapshot read back may be older than its alarms. */
|
|
38
|
+
this.readingRetained = false;
|
|
39
|
+
/** When this gateway took the line (epoch ms); a command for an older row may have been sent by an earlier one. */
|
|
40
|
+
this.takenAt = 0;
|
|
41
|
+
/** With lifecycle notes, progress is noted each time it crosses this many percent; 0 notes none. */
|
|
42
|
+
this.progressStep = 25;
|
|
26
43
|
/** While reconciling, new handoffs wait so pacing sees the whole line before anything is sent. */
|
|
27
44
|
this.holdDispatch = false;
|
|
28
45
|
/** Units at each machine that arrived and have not left: machine → unit → job. */
|
|
@@ -32,7 +49,8 @@ class GatewayState {
|
|
|
32
49
|
this.alarms = new Map();
|
|
33
50
|
/** Finished records that came before their row: machine/unit → job body. */
|
|
34
51
|
this.earlyFinishes = new Map();
|
|
35
|
-
|
|
52
|
+
/** Open machine-command rows → the machine each commands. */
|
|
53
|
+
this.openCommands = new Map();
|
|
36
54
|
/** Accepted dispatch command ids → their row, so a later failure finds the row. */
|
|
37
55
|
this.dispatches = new Map();
|
|
38
56
|
this.endedCommands = new Set();
|
|
@@ -42,8 +60,8 @@ class GatewayState {
|
|
|
42
60
|
/** Learned addresses, both ways: station → address and address → station. */
|
|
43
61
|
this.addressOfStation = new Map();
|
|
44
62
|
this.stationOfAddress = new Map();
|
|
45
|
-
/** Contested claims already raised as registration rows, `${address}>${station}
|
|
46
|
-
this.claims = new
|
|
63
|
+
/** Contested claims already raised as registration rows, `${address}>${station}` → the row. */
|
|
64
|
+
this.claims = new Map();
|
|
47
65
|
/** Contested claims heard from the machines themselves, `${address}>${station}`. */
|
|
48
66
|
this.heard = new Set();
|
|
49
67
|
/** Addresses heard that claim no station, logged once each. */
|
|
@@ -55,7 +73,10 @@ class GatewayState {
|
|
|
55
73
|
const existing = this.openRows.get(row.id);
|
|
56
74
|
// An event may carry metadata older than what the gateway already wrote: keep both traces.
|
|
57
75
|
this.openRows.set(row.id, existing
|
|
58
|
-
? {
|
|
76
|
+
? {
|
|
77
|
+
...row, dispatch: existing.dispatch, trace: (0, trace_1.mergeTrace)(row.trace, existing.trace), arrivals: existing.arrivals,
|
|
78
|
+
dueAt: existing.dueAt, noted: existing.noted ?? row.noted,
|
|
79
|
+
}
|
|
59
80
|
: row);
|
|
60
81
|
}
|
|
61
82
|
get(id) {
|
|
@@ -103,6 +124,9 @@ class GatewayState {
|
|
|
103
124
|
heldAt(machineId) {
|
|
104
125
|
return [...(this.held.get(machineId)?.values() ?? [])];
|
|
105
126
|
}
|
|
127
|
+
heldUnitsAt(machineId) {
|
|
128
|
+
return [...(this.held.get(machineId)?.entries() ?? [])].map(([unitId, jobId]) => ({ unitId, jobId }));
|
|
129
|
+
}
|
|
106
130
|
/** Keep only units whose job the machine still lists (its snapshot). */
|
|
107
131
|
keepHeld(machineId, jobIds) {
|
|
108
132
|
const units = this.held.get(machineId);
|
|
@@ -135,18 +159,22 @@ class GatewayState {
|
|
|
135
159
|
this.dispatches.delete(oldest);
|
|
136
160
|
}
|
|
137
161
|
}
|
|
138
|
-
/** The
|
|
162
|
+
/** The row a dispatch command belongs to, open or recently closed. */
|
|
139
163
|
rowForDispatch(cmdId) {
|
|
140
164
|
const rowId = this.dispatches.get(cmdId);
|
|
141
|
-
return rowId ? this.openRows.get(rowId) : undefined;
|
|
165
|
+
return rowId ? this.openRows.get(rowId) ?? this.closedRows.get(rowId) : undefined;
|
|
142
166
|
}
|
|
143
167
|
/** Track a machine-command row; false when it is already tracked or has ended. */
|
|
144
|
-
trackCommand(id) {
|
|
168
|
+
trackCommand(id, machineId = '') {
|
|
145
169
|
if (this.openCommands.has(id) || this.endedCommands.has(id))
|
|
146
170
|
return false;
|
|
147
|
-
this.openCommands.
|
|
171
|
+
this.openCommands.set(id, machineId);
|
|
148
172
|
return true;
|
|
149
173
|
}
|
|
174
|
+
/** Open machine-command rows for one machine. */
|
|
175
|
+
openCommandsFor(machineId) {
|
|
176
|
+
return [...this.openCommands.values()].filter((m) => m === machineId).length;
|
|
177
|
+
}
|
|
150
178
|
endCommand(id) {
|
|
151
179
|
this.openCommands.delete(id);
|
|
152
180
|
this.endedCommands.add(id);
|
|
@@ -176,8 +204,15 @@ class GatewayState {
|
|
|
176
204
|
claimRaised(address, machineId) {
|
|
177
205
|
return this.claims.has(`${address}>${machineId}`);
|
|
178
206
|
}
|
|
179
|
-
raiseClaim(address, machineId) {
|
|
180
|
-
this.claims.
|
|
207
|
+
raiseClaim(address, machineId, rowId) {
|
|
208
|
+
this.claims.set(`${address}>${machineId}`, rowId ?? this.claims.get(`${address}>${machineId}`) ?? null);
|
|
209
|
+
}
|
|
210
|
+
/** The contested claims waiting for a person, with the rows that ask. */
|
|
211
|
+
contested() {
|
|
212
|
+
return [...this.claims.entries()].map(([key, rowId]) => {
|
|
213
|
+
const [address, station] = key.split('>');
|
|
214
|
+
return { address, station, rowId: rowId ?? '' };
|
|
215
|
+
});
|
|
181
216
|
}
|
|
182
217
|
settleClaim(address, machineId) {
|
|
183
218
|
this.claims.delete(`${address}>${machineId}`);
|
|
@@ -221,6 +256,38 @@ class GatewayState {
|
|
|
221
256
|
alarmKey(machineId, alarmId) {
|
|
222
257
|
return `${machineId}/${alarmId}`;
|
|
223
258
|
}
|
|
259
|
+
/** The line as this gateway sees it (project.ts). */
|
|
260
|
+
project(line) {
|
|
261
|
+
return (0, project_1.projectLine)(this, line);
|
|
262
|
+
}
|
|
263
|
+
/** A copy a dry run may change without touching the line. */
|
|
264
|
+
clone() {
|
|
265
|
+
const copy = new GatewayState();
|
|
266
|
+
Object.assign(copy, {
|
|
267
|
+
unitsPerDispatch: this.unitsPerDispatch, dispatchOnArrival: this.dispatchOnArrival, rowOps: this.rowOps, lifecycle: this.lifecycle,
|
|
268
|
+
retainedAlarms: this.retainedAlarms, readingRetained: this.readingRetained, takenAt: this.takenAt, progressStep: this.progressStep, holdDispatch: this.holdDispatch,
|
|
269
|
+
});
|
|
270
|
+
copyInto(this.held, copy.held, (units) => new Map(units));
|
|
271
|
+
copyInto(this.openRows, copy.openRows, (row) => ({ ...row, units: [...row.units], ...(row.noted ? { noted: [...row.noted] } : {}) }));
|
|
272
|
+
copyInto(this.closedRows, copy.closedRows, (row) => ({ ...row }));
|
|
273
|
+
copyInto(this.alarms, copy.alarms, (track) => ({ ...track, ...(track.noted ? { noted: [...track.noted] } : {}) }));
|
|
274
|
+
copyInto(this.earlyFinishes, copy.earlyFinishes);
|
|
275
|
+
copyInto(this.openCommands, copy.openCommands);
|
|
276
|
+
copyInto(this.dispatches, copy.dispatches);
|
|
277
|
+
copyInto(this.links, copy.links, (link) => ({ ...link }));
|
|
278
|
+
copyInto(this.addressOfStation, copy.addressOfStation);
|
|
279
|
+
copyInto(this.stationOfAddress, copy.stationOfAddress);
|
|
280
|
+
copyInto(this.claims, copy.claims);
|
|
281
|
+
for (const id of this.endedCommands)
|
|
282
|
+
copy.endedCommands.add(id);
|
|
283
|
+
for (const key of this.violations)
|
|
284
|
+
copy.violations.add(key);
|
|
285
|
+
for (const key of this.heard)
|
|
286
|
+
copy.heard.add(key);
|
|
287
|
+
for (const key of this.strangers)
|
|
288
|
+
copy.strangers.add(key);
|
|
289
|
+
return copy;
|
|
290
|
+
}
|
|
224
291
|
}
|
|
225
292
|
exports.GatewayState = GatewayState;
|
|
226
293
|
function carries(row, unitId) {
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The wire record. Every message a gateway reads, and every command,
|
|
3
|
+
* snapshot request and receipt it sends, becomes one WireEvent for the
|
|
4
|
+
* line's view: what was on the wire, how the codec read it, and what the
|
|
5
|
+
* gateway did about it. Telemetry is left out unless the line asks for it.
|
|
6
|
+
*/
|
|
7
|
+
import { type Inspection, type MachineCommand, type MachineIdent, type WireMessage } from '../../../lib/machines/protocol';
|
|
8
|
+
import { type InboundMessage } from '../../../lib/machines/transport';
|
|
9
|
+
import type { WireAction, WireEvent } from '../../../types/machines-view';
|
|
10
|
+
import type { Action } from './actions';
|
|
11
|
+
import type { Applied } from './admission';
|
|
12
|
+
export type WireSink = (event: WireEvent) => void;
|
|
13
|
+
export declare const WIRE_EVENT_TYPE = "machine.wire";
|
|
14
|
+
export declare const WIRE_DIRECTION: {
|
|
15
|
+
readonly IN: "in";
|
|
16
|
+
readonly OUT: "out";
|
|
17
|
+
};
|
|
18
|
+
export interface WireOptions {
|
|
19
|
+
/** Publish telemetry messages too. */
|
|
20
|
+
telemetry?: boolean;
|
|
21
|
+
}
|
|
22
|
+
interface WireLine {
|
|
23
|
+
siteId: string;
|
|
24
|
+
lineId: string;
|
|
25
|
+
}
|
|
26
|
+
/** The sender a message was read as, when it differs from the topic's. */
|
|
27
|
+
export interface WireSender {
|
|
28
|
+
machineId: string | null;
|
|
29
|
+
address: string | null;
|
|
30
|
+
}
|
|
31
|
+
export declare class WireRecorder {
|
|
32
|
+
private readonly line;
|
|
33
|
+
private readonly sink;
|
|
34
|
+
private readonly opts;
|
|
35
|
+
constructor(line: WireLine, sink: WireSink, opts?: WireOptions);
|
|
36
|
+
/** A decoded inbound message and what the gateway did with it. */
|
|
37
|
+
inbound(msg: InboundMessage, seen: Inspection, applied: Applied, deliveries: number, sender?: WireSender): void;
|
|
38
|
+
/** A message the codec could not read, or one that is not a machine's. */
|
|
39
|
+
unreadable(msg: InboundMessage, detail: string, verb?: WireAction['verb']): void;
|
|
40
|
+
/** A command the gateway sent, as the codec put it on the wire. */
|
|
41
|
+
command(ident: MachineIdent, command: MachineCommand, wire: WireMessage): void;
|
|
42
|
+
/** A receipt confirming the messages the gateway is done with. */
|
|
43
|
+
receipt(ident: MachineIdent, ids: string[], wire: WireMessage): void;
|
|
44
|
+
private outbound;
|
|
45
|
+
}
|
|
46
|
+
/** The event name within the kind: job event, alarm action, command op, reply status. */
|
|
47
|
+
export declare function eventOf(seen: Inspection): string | null;
|
|
48
|
+
/** One line from the kind, the event and the ids the body names. */
|
|
49
|
+
export declare function summarize(seen: Inspection): string;
|
|
50
|
+
/** The record of an inbound message before the gateway's actions are known. */
|
|
51
|
+
export declare function describeInbound(line: WireLine, msg: InboundMessage, seen: Inspection, sender?: WireSender): Omit<WireEvent, 'actions'>;
|
|
52
|
+
/** What handling a message came to, as actions; a message with none is acknowledged, or waits for its row. */
|
|
53
|
+
export declare function appliedActions(applied: Applied, deliveries: number, maxDeliveries?: number): WireAction[];
|
|
54
|
+
/** A message no row has claimed after this many deliveries is not racing its row. */
|
|
55
|
+
export declare const MAX_DELIVERIES = 30;
|
|
56
|
+
/** A planner action as the wire would record it, before it runs; a dry run shows these. */
|
|
57
|
+
export declare function plannedAction(a: Action): WireAction;
|
|
58
|
+
export {};
|