@hotmeshio/long-tail 0.27.0 → 0.28.1
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/files.d.ts +5 -0
- package/build/api/files.js +19 -2
- package/build/api/knowledge.d.ts +3 -1
- package/build/api/settings.d.ts +4 -1
- package/build/api/settings.js +7 -1
- package/build/index.js +9 -4
- 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/db/schemas/042_knowledge_edition_labels.sql +9 -0
- package/build/lib/events/browser-view.js +8 -2
- package/build/lib/events/publish.d.ts +33 -0
- package/build/lib/events/publish.js +52 -1
- package/build/lib/machines/line.d.ts +7 -1
- package/build/lib/machines/line.js +25 -2
- package/build/lib/machines/protocol/codec.d.ts +14 -0
- package/build/lib/machines/protocol/codec.js +10 -1
- 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.d.ts +2 -0
- package/build/lib/machines/protocol/contract.js +13 -8
- package/build/lib/machines/site/mosquitto-conf.d.ts +9 -4
- package/build/lib/machines/site/mosquitto-conf.js +32 -22
- package/build/lib/machines/site/site-conf.d.ts +13 -3
- package/build/lib/machines/site/site-conf.js +31 -8
- 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/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 +3 -0
- package/build/lib/machines/transport/nats-bus.js +3 -0
- package/build/lib/machines/transport/nats-feed.d.ts +1 -0
- package/build/lib/machines/transport/nats-feed.js +4 -1
- package/build/lib/machines/transport/pubsub-feed.d.ts +1 -0
- package/build/lib/machines/transport/pubsub-feed.js +4 -1
- package/build/lib/machines/transport/stream-bus.d.ts +7 -1
- package/build/lib/machines/transport/stream-bus.js +17 -5
- package/build/lib/machines/transport/streams.d.ts +10 -2
- package/build/lib/machines/transport/streams.js +32 -5
- package/build/lib/messaging/memory.js +3 -0
- package/build/lib/messaging/nats/streams.d.ts +3 -0
- package/build/lib/messaging/nats/streams.js +16 -0
- package/build/lib/storage/local.d.ts +2 -0
- package/build/lib/storage/local.js +3 -0
- package/build/lib/storage/s3.d.ts +3 -2
- package/build/lib/storage/s3.js +6 -1
- package/build/lib/storage/types.d.ts +7 -1
- package/build/modules/machines.d.ts +8 -0
- package/build/modules/machines.js +16 -0
- package/build/routes/file-browser.js +3 -1
- package/build/routes/index.js +2 -0
- package/build/routes/knowledge.js +6 -5
- package/build/routes/machines.d.ts +2 -0
- package/build/routes/machines.js +253 -0
- package/build/services/knowledge/index.d.ts +4 -2
- package/build/services/knowledge/index.js +8 -2
- package/build/services/knowledge/lookup-cache.d.ts +8 -0
- package/build/services/knowledge/lookup-cache.js +30 -3
- package/build/services/knowledge/lookup-refs.js +1 -1
- package/build/services/knowledge/sql.d.ts +4 -2
- package/build/services/knowledge/sql.js +8 -3
- package/build/services/machines/commands.d.ts +5 -5
- package/build/services/machines/commands.js +3 -2
- package/build/services/machines/config.d.ts +4 -1
- package/build/services/machines/config.js +2 -1
- package/build/services/machines/contracts.d.ts +28 -0
- package/build/services/machines/contracts.js +15 -1
- package/build/services/machines/forms.d.ts +26 -1
- package/build/services/machines/forms.js +17 -1
- package/build/services/machines/gateway/actions.d.ts +14 -1
- package/build/services/machines/gateway/admission.d.ts +30 -4
- package/build/services/machines/gateway/admission.js +76 -14
- package/build/services/machines/gateway/api-escalations.js +4 -0
- package/build/services/machines/gateway/dispatcher.d.ts +12 -4
- package/build/services/machines/gateway/dispatcher.js +53 -17
- package/build/services/machines/gateway/executor.d.ts +13 -2
- package/build/services/machines/gateway/executor.js +84 -29
- package/build/services/machines/gateway/gateway.d.ts +21 -1
- package/build/services/machines/gateway/gateway.js +65 -25
- 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/log.d.ts +10 -0
- package/build/services/machines/gateway/log.js +20 -0
- package/build/services/machines/gateway/lt-http.js +11 -2
- package/build/services/machines/gateway/pacing.js +2 -1
- package/build/services/machines/gateway/plan-escalation.js +8 -3
- package/build/services/machines/gateway/plan-machine.js +41 -16
- package/build/services/machines/gateway/plan-shared.d.ts +5 -3
- package/build/services/machines/gateway/plan-shared.js +6 -4
- 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.js +3 -3
- package/build/services/machines/gateway/registration.js +1 -1
- package/build/services/machines/gateway/reply-waiter.d.ts +8 -3
- package/build/services/machines/gateway/reply-waiter.js +37 -16
- package/build/services/machines/gateway/state.d.ts +53 -4
- package/build/services/machines/gateway/state.js +128 -13
- package/build/services/machines/gateway/wire-window.d.ts +21 -0
- package/build/services/machines/gateway/wire-window.js +61 -0
- package/build/services/machines/gateway/wire.d.ts +58 -0
- package/build/services/machines/gateway/wire.js +172 -0
- package/build/services/machines/index.d.ts +3 -0
- package/build/services/machines/index.js +2 -0
- 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/roles.d.ts +5 -4
- package/build/services/machines/roles.js +13 -4
- package/build/services/machines/rows.js +10 -1
- package/build/services/machines/select.d.ts +3 -2
- package/build/services/machines/select.js +4 -3
- package/build/services/machines/surface.d.ts +54 -5
- package/build/services/machines/surface.js +113 -17
- package/build/start/apply-report.d.ts +1 -1
- package/build/start/apply-report.js +3 -25
- package/build/start/index.js +16 -4
- package/build/system/activities/knowledge.d.ts +4 -0
- package/build/system/activities/knowledge.js +15 -0
- package/build/system/activities/sql.d.ts +2 -0
- package/build/system/activities/sql.js +6 -1
- 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/knowledge.js +4 -2
- 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/escalation.d.ts +9 -6
- package/build/types/escalation.js +8 -2
- package/build/types/events.d.ts +6 -1
- package/build/types/index.d.ts +1 -0
- package/build/types/machines-view.d.ts +175 -0
- package/build/types/machines-view.js +7 -0
- package/build/types/machines.d.ts +5 -0
- package/build/types/messaging.d.ts +2 -0
- package/build/types/startup.d.ts +2 -0
- 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 +2 -1
- package/docs/events.md +34 -1
- package/docs/hitl/lookups.md +6 -4
- package/docs/machines.md +114 -28
- package/docs/mcp.md +19 -0
- package/package.json +1 -1
- 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
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The line as its leader sees it, for the dashboard: each machine's link,
|
|
4
|
+
* held units, open rows and alarms from the gateway state, and the claims
|
|
5
|
+
* waiting for a person. Pure: reads the state and the line, changes nothing.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.projectLine = projectLine;
|
|
9
|
+
const line_1 = require("../../../lib/machines/line");
|
|
10
|
+
const protocol_1 = require("../../../lib/machines/protocol");
|
|
11
|
+
const at = (ms) => (ms ? (0, protocol_1.isoTs)(ms) : null);
|
|
12
|
+
function addressOf(state, line, def) {
|
|
13
|
+
if ((0, line_1.learnsAddress)(line, def.machineId))
|
|
14
|
+
return state.learnedAddress(def.machineId) ?? null;
|
|
15
|
+
return def.address ?? def.machineId;
|
|
16
|
+
}
|
|
17
|
+
function alarmsOf(state, machineId) {
|
|
18
|
+
return [...state.alarms.values()]
|
|
19
|
+
.filter((track) => track.machineId === machineId)
|
|
20
|
+
.map((track) => ({ alarmId: track.alarmId, level: track.level ?? '', raisedAt: track.raisedAt ?? '', rowId: track.rowId ?? null }));
|
|
21
|
+
}
|
|
22
|
+
/** The handoff that brought a unit into a machine: open first, then the recently closed one. */
|
|
23
|
+
function rowCarrying(state, machineId, unitId) {
|
|
24
|
+
const into = (r) => r.toMachine === machineId;
|
|
25
|
+
return state.openFor(unitId, into) ?? state.closedFor(unitId, into);
|
|
26
|
+
}
|
|
27
|
+
function machineView(state, line, def) {
|
|
28
|
+
const m = def.machineId;
|
|
29
|
+
const link = state.links.get(m);
|
|
30
|
+
const open = state.open();
|
|
31
|
+
return {
|
|
32
|
+
machineId: m, process: def.process, role: (0, line_1.machineRole)(def), address: addressOf(state, line, def),
|
|
33
|
+
online: link ? link.online : null, since: at(link?.since), lastSeen: at(link?.lastSeen),
|
|
34
|
+
software: link?.software ?? null, bootId: link?.bootId ?? null, sessionId: link?.sessionId ?? null,
|
|
35
|
+
heldUnits: state.heldUnitsAt(m).map(({ unitId }) => {
|
|
36
|
+
const row = rowCarrying(state, m, unitId);
|
|
37
|
+
return { unitId, carrierId: row?.units.find((u) => u.unitId === unitId)?.carrierId ?? null, rowId: row?.id ?? '' };
|
|
38
|
+
}),
|
|
39
|
+
rows: {
|
|
40
|
+
handoff: open.filter((r) => r.toMachine === m).length,
|
|
41
|
+
command: state.openCommandsFor(m),
|
|
42
|
+
alarm: [...state.alarms.values()].filter((t) => t.machineId === m && t.open && !!t.rowId).length,
|
|
43
|
+
offlineRowId: link?.rowId ?? null, quietRowId: link?.quietRowId ?? null,
|
|
44
|
+
},
|
|
45
|
+
alarms: alarmsOf(state, m),
|
|
46
|
+
jobs: link?.jobs ?? [],
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function projectLine(state, line) {
|
|
50
|
+
return {
|
|
51
|
+
siteId: line.siteId, lineId: line.lineId, leading: true, takenAt: at(state.takenAt),
|
|
52
|
+
machines: line.machines.map((def) => machineView(state, line, def)),
|
|
53
|
+
contested: state.contested(),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
@@ -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;
|
|
@@ -22,8 +22,8 @@ async function restoreLineRows(state, lt, line) {
|
|
|
22
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]
|
|
23
23
|
.map(async (type) => (await lt.listOpen({ type, role })).filter(mine)));
|
|
24
24
|
for (const row of alarms) {
|
|
25
|
-
const { machineId, alarmId, raisedAt } = row.metadata;
|
|
26
|
-
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 });
|
|
27
27
|
}
|
|
28
28
|
for (const row of offline) {
|
|
29
29
|
const link = state.link(row.metadata.machineId);
|
|
@@ -33,7 +33,7 @@ async function restoreLineRows(state, lt, line) {
|
|
|
33
33
|
for (const row of quiet)
|
|
34
34
|
state.link(row.metadata.machineId).quietRowId = row.id;
|
|
35
35
|
for (const row of registrations)
|
|
36
|
-
state.raiseClaim(row.metadata.address, row.metadata.machineId);
|
|
36
|
+
state.raiseClaim(row.metadata.address, row.metadata.machineId, row.id);
|
|
37
37
|
return { alarms: alarms.length, offline: offline.length, quiet: quiet.length, registrations: registrations.length };
|
|
38
38
|
}
|
|
39
39
|
/** The addresses the line learned before, for the stations that still learn theirs. */
|
|
@@ -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,17 @@
|
|
|
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;
|
|
13
|
+
/** An acceptance the machine will follow with `completed` or `failed` once the job is prepared. */
|
|
14
|
+
preparing?: boolean;
|
|
10
15
|
}
|
|
11
16
|
/** The jobs a machine reports holding, queued or in work. */
|
|
12
17
|
export type HeldJobs = Set<string>;
|
|
@@ -16,9 +21,9 @@ export declare class ReplyWaiter {
|
|
|
16
21
|
wait(cmdId: string, timeoutMs: number): Promise<CommandReply | null>;
|
|
17
22
|
/** True when a waiter took the reply. */
|
|
18
23
|
settle(reply: CommandReply): boolean;
|
|
19
|
-
/** The next snapshot from `machineId`, or null at the deadline. */
|
|
24
|
+
/** The next snapshot from `machineId`, or null at the deadline; every wait in flight for the machine gets it. */
|
|
20
25
|
waitSnapshot(machineId: string, timeoutMs: number): Promise<HeldJobs | null>;
|
|
21
|
-
/** Answer
|
|
26
|
+
/** Answer the status queries in flight; null when there is nothing to wait for. */
|
|
22
27
|
settleSnapshot(machineId: string, jobs: HeldJobs | null): void;
|
|
23
28
|
cancelAll(): void;
|
|
24
29
|
}
|
|
@@ -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,6 +35,8 @@ 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
|
+
/** Dispatch commands accepted as preparing; on arrival dispatch the row is received once each is ready. */
|
|
39
|
+
awaitingReady?: Set<string>;
|
|
36
40
|
/** Lifecycle item keys already on the row (lifecycle.ts). */
|
|
37
41
|
noted?: string[];
|
|
38
42
|
/** Parked with a limit on its items, which lifecycle notes must never use up. */
|
|
@@ -47,6 +51,7 @@ export interface AlarmTrack {
|
|
|
47
51
|
alarmId: string;
|
|
48
52
|
/** When the machine raised it; a reused alarm id with a new time is a new alarm. */
|
|
49
53
|
raisedAt?: string;
|
|
54
|
+
level?: string;
|
|
50
55
|
rowId?: string;
|
|
51
56
|
/** Created and not yet resolved by anyone. */
|
|
52
57
|
open: boolean;
|
|
@@ -62,12 +67,25 @@ export interface LinkTrack {
|
|
|
62
67
|
watching?: boolean;
|
|
63
68
|
software?: string;
|
|
64
69
|
bootId?: string;
|
|
70
|
+
/** The machine's connection, when its presence names one; a new one while online is a reconnect to resync. */
|
|
71
|
+
sessionId?: string;
|
|
72
|
+
/** Why the machine went offline, when its presence said. */
|
|
73
|
+
reason?: string;
|
|
74
|
+
/** The jobs its last snapshot listed, as the codec reported them. */
|
|
75
|
+
jobs?: unknown[];
|
|
76
|
+
}
|
|
77
|
+
/** One unit a machine holds: the job it arrived under. */
|
|
78
|
+
export interface HeldUnit {
|
|
79
|
+
unitId: string;
|
|
80
|
+
jobId: string;
|
|
65
81
|
}
|
|
66
82
|
export declare class GatewayState {
|
|
67
83
|
/** Units one dispatch may carry, from the codec; null when any number may. */
|
|
68
84
|
unitsPerDispatch: number | null;
|
|
69
85
|
/** Jobs go to a receiver once its units arrive there, from the codec. */
|
|
70
86
|
dispatchOnArrival: boolean;
|
|
87
|
+
/** Commands of the machines' own that a machine-command row may ask for, from the codec. */
|
|
88
|
+
rowOps: readonly string[];
|
|
71
89
|
/** Note each job's start, progress steps and pauses on the row that holds it (lifecycle.ts). */
|
|
72
90
|
lifecycle: boolean;
|
|
73
91
|
/** Active alarms are retained on the broker; otherwise snapshots list them (codec.ts retainedAlarms). */
|
|
@@ -82,11 +100,16 @@ export declare class GatewayState {
|
|
|
82
100
|
holdDispatch: boolean;
|
|
83
101
|
/** Units at each machine that arrived and have not left: machine → unit → job. */
|
|
84
102
|
private held;
|
|
103
|
+
/** Jobs sent and taken, by machine: job → the row that sent it, kept while the machine holds the job's units. */
|
|
104
|
+
private sentJobs;
|
|
105
|
+
/** Jobs whose units left each machine since its last snapshot: they ended, a snapshot without them lost nothing. */
|
|
106
|
+
private endedJobs;
|
|
85
107
|
private openRows;
|
|
86
108
|
private closedRows;
|
|
87
109
|
readonly alarms: Map<string, AlarmTrack>;
|
|
88
110
|
/** Finished records that came before their row: machine/unit → job body. */
|
|
89
111
|
private earlyFinishes;
|
|
112
|
+
/** Open machine-command rows → the machine each commands. */
|
|
90
113
|
private openCommands;
|
|
91
114
|
/** Accepted dispatch command ids → their row, so a later failure finds the row. */
|
|
92
115
|
private dispatches;
|
|
@@ -97,7 +120,7 @@ export declare class GatewayState {
|
|
|
97
120
|
/** Learned addresses, both ways: station → address and address → station. */
|
|
98
121
|
private addressOfStation;
|
|
99
122
|
private stationOfAddress;
|
|
100
|
-
/** Contested claims already raised as registration rows, `${address}>${station}
|
|
123
|
+
/** Contested claims already raised as registration rows, `${address}>${station}` → the row. */
|
|
101
124
|
private claims;
|
|
102
125
|
/** Contested claims heard from the machines themselves, `${address}>${station}`. */
|
|
103
126
|
private heard;
|
|
@@ -105,6 +128,8 @@ export declare class GatewayState {
|
|
|
105
128
|
private strangers;
|
|
106
129
|
index(row: HandoffRow): void;
|
|
107
130
|
get(id: string): HandoffRow | undefined;
|
|
131
|
+
/** A row that ended, while the gateway still remembers it. */
|
|
132
|
+
closedRow(id: string): HandoffRow | undefined;
|
|
108
133
|
close(id: string, ended?: RowEnd): HandoffRow | undefined;
|
|
109
134
|
isClosed(id: string): boolean;
|
|
110
135
|
open(): HandoffRow[];
|
|
@@ -113,10 +138,26 @@ export declare class GatewayState {
|
|
|
113
138
|
closedFor(unitId: string, pred: (r: HandoffRow) => boolean): HandoffRow | undefined;
|
|
114
139
|
hold(machineId: string, unitId: string, jobId: string): void;
|
|
115
140
|
letGo(machineId: string, unitId: string): void;
|
|
141
|
+
/** A job the machine took, remembered by its row while the machine holds the job's units. */
|
|
142
|
+
rememberSent(machineId: string, jobId: string, rowId: string): void;
|
|
143
|
+
/**
|
|
144
|
+
* After a restart, the jobs the machine lost: those its units are held under
|
|
145
|
+
* or its last snapshot listed, that the new snapshot lacks and no open row
|
|
146
|
+
* will send again. `resend` names the rows remembered for them; `unknown`
|
|
147
|
+
* the jobs nothing is remembered for.
|
|
148
|
+
*/
|
|
149
|
+
lostAfterReboot(machineId: string, listed: Set<string>): {
|
|
150
|
+
resend: {
|
|
151
|
+
jobId: string;
|
|
152
|
+
row: HandoffRow;
|
|
153
|
+
}[];
|
|
154
|
+
unknown: string[];
|
|
155
|
+
};
|
|
116
156
|
/** The job a unit arrived under at `machineId`, while it is still there. */
|
|
117
157
|
heldJob(machineId: string, unitId: string): string | undefined;
|
|
118
158
|
heldAt(machineId: string): string[];
|
|
119
|
-
|
|
159
|
+
heldUnitsAt(machineId: string): HeldUnit[];
|
|
160
|
+
/** Keep only units whose job the machine still lists (its snapshot); a job it no longer lists is over. */
|
|
120
161
|
keepHeld(machineId: string, jobIds: Set<string>): void;
|
|
121
162
|
/** Keep a sender's finished record until its row is known, so an arrival cannot close the row without it. */
|
|
122
163
|
rememberFinish(machineId: string, unitId: string, body: Record<string, any>): void;
|
|
@@ -125,14 +166,18 @@ export declare class GatewayState {
|
|
|
125
166
|
/** The row a dispatch command belongs to, open or recently closed. */
|
|
126
167
|
rowForDispatch(cmdId: string): HandoffRow | undefined;
|
|
127
168
|
/** Track a machine-command row; false when it is already tracked or has ended. */
|
|
128
|
-
trackCommand(id: string): boolean;
|
|
169
|
+
trackCommand(id: string, machineId?: string): boolean;
|
|
170
|
+
/** Open machine-command rows for one machine. */
|
|
171
|
+
openCommandsFor(machineId: string): number;
|
|
129
172
|
endCommand(id: string): void;
|
|
130
173
|
/** Bind a station to an address, replacing whatever either was bound to before. */
|
|
131
174
|
bindAddress(machineId: string, address: string): void;
|
|
132
175
|
learnedAddress(machineId: string): string | undefined;
|
|
133
176
|
stationAt(address: string): string | undefined;
|
|
134
177
|
claimRaised(address: string, machineId: string): boolean;
|
|
135
|
-
raiseClaim(address: string, machineId: string): void;
|
|
178
|
+
raiseClaim(address: string, machineId: string, rowId?: string): void;
|
|
179
|
+
/** The contested claims waiting for a person, with the rows that ask. */
|
|
180
|
+
contested(): ContestedClaimView[];
|
|
136
181
|
settleClaim(address: string, machineId: string): void;
|
|
137
182
|
hearClaim(address: string, machineId: string): void;
|
|
138
183
|
claimHeard(address: string, machineId: string): boolean;
|
|
@@ -142,4 +187,8 @@ export declare class GatewayState {
|
|
|
142
187
|
raiseViolation(key: string): void;
|
|
143
188
|
link(machineId: string, now?: number): LinkTrack;
|
|
144
189
|
alarmKey(machineId: string, alarmId: string): string;
|
|
190
|
+
/** The line as this gateway sees it (project.ts). */
|
|
191
|
+
project(line: LineDef): LineView;
|
|
192
|
+
/** A copy a dry run may change without touching the line. */
|
|
193
|
+
clone(): GatewayState;
|
|
145
194
|
}
|
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
*/
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
9
|
exports.GatewayState = exports.ROW_END = exports.DISPATCH_STATE = void 0;
|
|
10
|
+
const jobs_1 = require("./jobs");
|
|
11
|
+
const project_1 = require("./project");
|
|
10
12
|
const trace_1 = require("./trace");
|
|
11
13
|
/**
|
|
12
14
|
* WAITING: the machine has no room yet (pacing.ts); the row waits in its role queue.
|
|
@@ -16,6 +18,10 @@ exports.DISPATCH_STATE = {
|
|
|
16
18
|
NONE: 'none', WAITING: 'waiting', ARRIVING: 'arriving', PENDING: 'pending', ACCEPTED: 'accepted', REFUSED: 'refused',
|
|
17
19
|
};
|
|
18
20
|
exports.ROW_END = { RESOLVED: 'resolved', CANCELLED: 'cancelled', EXPIRED: 'expired' };
|
|
21
|
+
function copyInto(from, into, clone = (v) => v) {
|
|
22
|
+
for (const [k, v] of from)
|
|
23
|
+
into.set(k, clone(v));
|
|
24
|
+
}
|
|
19
25
|
const CLOSED_LIMIT = 2_000;
|
|
20
26
|
class GatewayState {
|
|
21
27
|
constructor() {
|
|
@@ -23,6 +29,8 @@ class GatewayState {
|
|
|
23
29
|
this.unitsPerDispatch = null;
|
|
24
30
|
/** Jobs go to a receiver once its units arrive there, from the codec. */
|
|
25
31
|
this.dispatchOnArrival = false;
|
|
32
|
+
/** Commands of the machines' own that a machine-command row may ask for, from the codec. */
|
|
33
|
+
this.rowOps = [];
|
|
26
34
|
/** Note each job's start, progress steps and pauses on the row that holds it (lifecycle.ts). */
|
|
27
35
|
this.lifecycle = false;
|
|
28
36
|
/** Active alarms are retained on the broker; otherwise snapshots list them (codec.ts retainedAlarms). */
|
|
@@ -37,12 +45,17 @@ class GatewayState {
|
|
|
37
45
|
this.holdDispatch = false;
|
|
38
46
|
/** Units at each machine that arrived and have not left: machine → unit → job. */
|
|
39
47
|
this.held = new Map();
|
|
48
|
+
/** Jobs sent and taken, by machine: job → the row that sent it, kept while the machine holds the job's units. */
|
|
49
|
+
this.sentJobs = new Map();
|
|
50
|
+
/** Jobs whose units left each machine since its last snapshot: they ended, a snapshot without them lost nothing. */
|
|
51
|
+
this.endedJobs = new Map();
|
|
40
52
|
this.openRows = new Map();
|
|
41
53
|
this.closedRows = new Map();
|
|
42
54
|
this.alarms = new Map();
|
|
43
55
|
/** Finished records that came before their row: machine/unit → job body. */
|
|
44
56
|
this.earlyFinishes = new Map();
|
|
45
|
-
|
|
57
|
+
/** Open machine-command rows → the machine each commands. */
|
|
58
|
+
this.openCommands = new Map();
|
|
46
59
|
/** Accepted dispatch command ids → their row, so a later failure finds the row. */
|
|
47
60
|
this.dispatches = new Map();
|
|
48
61
|
this.endedCommands = new Set();
|
|
@@ -52,8 +65,8 @@ class GatewayState {
|
|
|
52
65
|
/** Learned addresses, both ways: station → address and address → station. */
|
|
53
66
|
this.addressOfStation = new Map();
|
|
54
67
|
this.stationOfAddress = new Map();
|
|
55
|
-
/** Contested claims already raised as registration rows, `${address}>${station}
|
|
56
|
-
this.claims = new
|
|
68
|
+
/** Contested claims already raised as registration rows, `${address}>${station}` → the row. */
|
|
69
|
+
this.claims = new Map();
|
|
57
70
|
/** Contested claims heard from the machines themselves, `${address}>${station}`. */
|
|
58
71
|
this.heard = new Set();
|
|
59
72
|
/** Addresses heard that claim no station, logged once each. */
|
|
@@ -67,13 +80,17 @@ class GatewayState {
|
|
|
67
80
|
this.openRows.set(row.id, existing
|
|
68
81
|
? {
|
|
69
82
|
...row, dispatch: existing.dispatch, trace: (0, trace_1.mergeTrace)(row.trace, existing.trace), arrivals: existing.arrivals,
|
|
70
|
-
dueAt: existing.dueAt, noted: existing.noted ?? row.noted,
|
|
83
|
+
dueAt: existing.dueAt, noted: existing.noted ?? row.noted, awaitingReady: existing.awaitingReady,
|
|
71
84
|
}
|
|
72
85
|
: row);
|
|
73
86
|
}
|
|
74
87
|
get(id) {
|
|
75
88
|
return this.openRows.get(id);
|
|
76
89
|
}
|
|
90
|
+
/** A row that ended, while the gateway still remembers it. */
|
|
91
|
+
closedRow(id) {
|
|
92
|
+
return this.closedRows.get(id);
|
|
93
|
+
}
|
|
77
94
|
close(id, ended = exports.ROW_END.RESOLVED) {
|
|
78
95
|
const row = this.openRows.get(id);
|
|
79
96
|
if (!row)
|
|
@@ -107,7 +124,53 @@ class GatewayState {
|
|
|
107
124
|
this.held.get(machineId).set(unitId, jobId);
|
|
108
125
|
}
|
|
109
126
|
letGo(machineId, unitId) {
|
|
110
|
-
this.held.get(machineId)
|
|
127
|
+
const units = this.held.get(machineId);
|
|
128
|
+
const jobId = units?.get(unitId);
|
|
129
|
+
units?.delete(unitId);
|
|
130
|
+
if (jobId === undefined || [...units.values()].includes(jobId))
|
|
131
|
+
return;
|
|
132
|
+
this.sentJobs.get(machineId)?.delete(jobId);
|
|
133
|
+
if (!this.endedJobs.has(machineId))
|
|
134
|
+
this.endedJobs.set(machineId, new Set());
|
|
135
|
+
this.endedJobs.get(machineId).add(jobId);
|
|
136
|
+
}
|
|
137
|
+
/** A job the machine took, remembered by its row while the machine holds the job's units. */
|
|
138
|
+
rememberSent(machineId, jobId, rowId) {
|
|
139
|
+
if (!this.sentJobs.has(machineId))
|
|
140
|
+
this.sentJobs.set(machineId, new Map());
|
|
141
|
+
this.sentJobs.get(machineId).set(jobId, rowId);
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* After a restart, the jobs the machine lost: those its units are held under
|
|
145
|
+
* or its last snapshot listed, that the new snapshot lacks and no open row
|
|
146
|
+
* will send again. `resend` names the rows remembered for them; `unknown`
|
|
147
|
+
* the jobs nothing is remembered for.
|
|
148
|
+
*/
|
|
149
|
+
lostAfterReboot(machineId, listed) {
|
|
150
|
+
const link = this.links.get(machineId);
|
|
151
|
+
const before = new Set(this.heldAt(machineId));
|
|
152
|
+
for (const job of link?.jobs ?? [])
|
|
153
|
+
if (typeof job?.jobId === 'string')
|
|
154
|
+
before.add(job.jobId);
|
|
155
|
+
const ended = this.endedJobs.get(machineId) ?? new Set();
|
|
156
|
+
const sendsAgain = new Set();
|
|
157
|
+
for (const row of this.openRows.values()) {
|
|
158
|
+
if (row.toMachine === machineId)
|
|
159
|
+
for (const job of (0, jobs_1.dispatchJobs)(row.jobId, row.units, this.unitsPerDispatch))
|
|
160
|
+
sendsAgain.add(job.jobId);
|
|
161
|
+
}
|
|
162
|
+
const resend = [];
|
|
163
|
+
const unknown = [];
|
|
164
|
+
for (const jobId of before) {
|
|
165
|
+
if (listed.has(jobId) || ended.has(jobId) || sendsAgain.has(jobId))
|
|
166
|
+
continue;
|
|
167
|
+
const row = this.closedRows.get(this.sentJobs.get(machineId)?.get(jobId) ?? '');
|
|
168
|
+
if (row)
|
|
169
|
+
resend.push({ jobId, row });
|
|
170
|
+
else
|
|
171
|
+
unknown.push(jobId);
|
|
172
|
+
}
|
|
173
|
+
return { resend, unknown };
|
|
111
174
|
}
|
|
112
175
|
/** The job a unit arrived under at `machineId`, while it is still there. */
|
|
113
176
|
heldJob(machineId, unitId) {
|
|
@@ -116,14 +179,21 @@ class GatewayState {
|
|
|
116
179
|
heldAt(machineId) {
|
|
117
180
|
return [...(this.held.get(machineId)?.values() ?? [])];
|
|
118
181
|
}
|
|
119
|
-
|
|
182
|
+
heldUnitsAt(machineId) {
|
|
183
|
+
return [...(this.held.get(machineId)?.entries() ?? [])].map(([unitId, jobId]) => ({ unitId, jobId }));
|
|
184
|
+
}
|
|
185
|
+
/** Keep only units whose job the machine still lists (its snapshot); a job it no longer lists is over. */
|
|
120
186
|
keepHeld(machineId, jobIds) {
|
|
187
|
+
this.endedJobs.delete(machineId);
|
|
121
188
|
const units = this.held.get(machineId);
|
|
122
189
|
if (!units)
|
|
123
190
|
return;
|
|
124
|
-
for (const [unitId, jobId] of units)
|
|
125
|
-
if (
|
|
126
|
-
|
|
191
|
+
for (const [unitId, jobId] of units) {
|
|
192
|
+
if (jobIds.has(jobId))
|
|
193
|
+
continue;
|
|
194
|
+
units.delete(unitId);
|
|
195
|
+
this.sentJobs.get(machineId)?.delete(jobId);
|
|
196
|
+
}
|
|
127
197
|
}
|
|
128
198
|
/** Keep a sender's finished record until its row is known, so an arrival cannot close the row without it. */
|
|
129
199
|
rememberFinish(machineId, unitId, body) {
|
|
@@ -154,12 +224,16 @@ class GatewayState {
|
|
|
154
224
|
return rowId ? this.openRows.get(rowId) ?? this.closedRows.get(rowId) : undefined;
|
|
155
225
|
}
|
|
156
226
|
/** Track a machine-command row; false when it is already tracked or has ended. */
|
|
157
|
-
trackCommand(id) {
|
|
227
|
+
trackCommand(id, machineId = '') {
|
|
158
228
|
if (this.openCommands.has(id) || this.endedCommands.has(id))
|
|
159
229
|
return false;
|
|
160
|
-
this.openCommands.
|
|
230
|
+
this.openCommands.set(id, machineId);
|
|
161
231
|
return true;
|
|
162
232
|
}
|
|
233
|
+
/** Open machine-command rows for one machine. */
|
|
234
|
+
openCommandsFor(machineId) {
|
|
235
|
+
return [...this.openCommands.values()].filter((m) => m === machineId).length;
|
|
236
|
+
}
|
|
163
237
|
endCommand(id) {
|
|
164
238
|
this.openCommands.delete(id);
|
|
165
239
|
this.endedCommands.add(id);
|
|
@@ -189,8 +263,15 @@ class GatewayState {
|
|
|
189
263
|
claimRaised(address, machineId) {
|
|
190
264
|
return this.claims.has(`${address}>${machineId}`);
|
|
191
265
|
}
|
|
192
|
-
raiseClaim(address, machineId) {
|
|
193
|
-
this.claims.
|
|
266
|
+
raiseClaim(address, machineId, rowId) {
|
|
267
|
+
this.claims.set(`${address}>${machineId}`, rowId ?? this.claims.get(`${address}>${machineId}`) ?? null);
|
|
268
|
+
}
|
|
269
|
+
/** The contested claims waiting for a person, with the rows that ask. */
|
|
270
|
+
contested() {
|
|
271
|
+
return [...this.claims.entries()].map(([key, rowId]) => {
|
|
272
|
+
const [address, station] = key.split('>');
|
|
273
|
+
return { address, station, rowId: rowId ?? '' };
|
|
274
|
+
});
|
|
194
275
|
}
|
|
195
276
|
settleClaim(address, machineId) {
|
|
196
277
|
this.claims.delete(`${address}>${machineId}`);
|
|
@@ -234,6 +315,40 @@ class GatewayState {
|
|
|
234
315
|
alarmKey(machineId, alarmId) {
|
|
235
316
|
return `${machineId}/${alarmId}`;
|
|
236
317
|
}
|
|
318
|
+
/** The line as this gateway sees it (project.ts). */
|
|
319
|
+
project(line) {
|
|
320
|
+
return (0, project_1.projectLine)(this, line);
|
|
321
|
+
}
|
|
322
|
+
/** A copy a dry run may change without touching the line. */
|
|
323
|
+
clone() {
|
|
324
|
+
const copy = new GatewayState();
|
|
325
|
+
Object.assign(copy, {
|
|
326
|
+
unitsPerDispatch: this.unitsPerDispatch, dispatchOnArrival: this.dispatchOnArrival, rowOps: this.rowOps, lifecycle: this.lifecycle,
|
|
327
|
+
retainedAlarms: this.retainedAlarms, readingRetained: this.readingRetained, takenAt: this.takenAt, progressStep: this.progressStep, holdDispatch: this.holdDispatch,
|
|
328
|
+
});
|
|
329
|
+
copyInto(this.held, copy.held, (units) => new Map(units));
|
|
330
|
+
copyInto(this.sentJobs, copy.sentJobs, (jobs) => new Map(jobs));
|
|
331
|
+
copyInto(this.endedJobs, copy.endedJobs, (jobs) => new Set(jobs));
|
|
332
|
+
copyInto(this.openRows, copy.openRows, (row) => ({ ...row, units: [...row.units], ...(row.noted ? { noted: [...row.noted] } : {}) }));
|
|
333
|
+
copyInto(this.closedRows, copy.closedRows, (row) => ({ ...row }));
|
|
334
|
+
copyInto(this.alarms, copy.alarms, (track) => ({ ...track, ...(track.noted ? { noted: [...track.noted] } : {}) }));
|
|
335
|
+
copyInto(this.earlyFinishes, copy.earlyFinishes);
|
|
336
|
+
copyInto(this.openCommands, copy.openCommands);
|
|
337
|
+
copyInto(this.dispatches, copy.dispatches);
|
|
338
|
+
copyInto(this.links, copy.links, (link) => ({ ...link }));
|
|
339
|
+
copyInto(this.addressOfStation, copy.addressOfStation);
|
|
340
|
+
copyInto(this.stationOfAddress, copy.stationOfAddress);
|
|
341
|
+
copyInto(this.claims, copy.claims);
|
|
342
|
+
for (const id of this.endedCommands)
|
|
343
|
+
copy.endedCommands.add(id);
|
|
344
|
+
for (const key of this.violations)
|
|
345
|
+
copy.violations.add(key);
|
|
346
|
+
for (const key of this.heard)
|
|
347
|
+
copy.heard.add(key);
|
|
348
|
+
for (const key of this.strangers)
|
|
349
|
+
copy.strangers.add(key);
|
|
350
|
+
return copy;
|
|
351
|
+
}
|
|
237
352
|
}
|
|
238
353
|
exports.GatewayState = GatewayState;
|
|
239
354
|
function carries(row, unitId) {
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The last wire events of a line, kept by its leader so a client reads the
|
|
3
|
+
* tape over HTTP instead of the event stream. A ring of a fixed size; reads
|
|
4
|
+
* are newest first and may narrow by machine, direction, kind and time.
|
|
5
|
+
*/
|
|
6
|
+
import type { WireDirection, WireEvent, WireKind, WireWindowQuery } from '../../../types/machines-view';
|
|
7
|
+
export declare const DEFAULT_WIRE_WINDOW = 500;
|
|
8
|
+
export declare const MAX_WIRE_PAGE = 500;
|
|
9
|
+
export declare class WireWindow {
|
|
10
|
+
readonly size: number;
|
|
11
|
+
private readonly events;
|
|
12
|
+
private head;
|
|
13
|
+
private count;
|
|
14
|
+
constructor(size?: number);
|
|
15
|
+
push(event: WireEvent): void;
|
|
16
|
+
/** Newest first, narrowed by the query, at most `limit` (the window's size when absent). */
|
|
17
|
+
read(query?: WireWindowQuery): WireEvent[];
|
|
18
|
+
get length(): number;
|
|
19
|
+
}
|
|
20
|
+
export declare function isWireDirection(v: unknown): v is WireDirection;
|
|
21
|
+
export declare function isWireKind(v: unknown): v is WireKind;
|