@hotmeshio/long-tail 0.27.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.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/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 +4 -1
- package/build/lib/machines/line.js +18 -1
- package/build/lib/machines/protocol/codec.d.ts +8 -0
- package/build/lib/machines/protocol/codec.js +9 -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 +2 -2
- 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 +9 -2
- package/build/lib/machines/site/site-conf.js +27 -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 +1 -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 +2 -0
- package/build/lib/machines/transport/stream-bus.js +5 -1
- 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/services/machines/commands.d.ts +5 -5
- package/build/services/machines/commands.js +3 -2
- package/build/services/machines/config.d.ts +2 -1
- package/build/services/machines/config.js +1 -1
- package/build/services/machines/contracts.d.ts +10 -0
- package/build/services/machines/gateway/actions.d.ts +1 -0
- 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 +3 -0
- package/build/services/machines/gateway/dispatcher.js +12 -4
- package/build/services/machines/gateway/executor.d.ts +11 -2
- package/build/services/machines/gateway/executor.js +68 -29
- package/build/services/machines/gateway/gateway.d.ts +16 -1
- package/build/services/machines/gateway/gateway.js +55 -23
- 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 +8 -0
- package/build/services/machines/gateway/log.js +18 -0
- package/build/services/machines/gateway/pacing.js +1 -0
- package/build/services/machines/gateway/plan-escalation.js +8 -3
- package/build/services/machines/gateway/plan-machine.js +16 -6
- 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 +6 -3
- package/build/services/machines/gateway/reply-waiter.js +37 -16
- package/build/services/machines/gateway/state.d.ts +29 -3
- package/build/services/machines/gateway/state.js +61 -7
- 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/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 +10 -1
- package/build/services/machines/surface.d.ts +45 -5
- package/build/services/machines/surface.js +95 -15
- 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/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 +1 -0
- package/build/types/machines-view.d.ts +159 -0
- package/build/types/machines-view.js +7 -0
- package/build/types/machines.d.ts +4 -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 +1 -0
- package/docs/events.md +34 -1
- package/docs/machines.md +93 -16
- 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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* The site's NATS server, rendered from
|
|
3
|
+
* The site's NATS server, rendered from its lines. It runs JetStream and an
|
|
4
4
|
* MQTT listener that only the machine broker's bridge logs in to (by client
|
|
5
5
|
* certificate; the CN is its user, and it may publish only under the line's
|
|
6
6
|
* topics). The gateway logs in by password and may only keep and read the
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.bridgeId = bridgeId;
|
|
13
13
|
exports.gatewayPublish = gatewayPublish;
|
|
14
|
+
exports.linesOf = linesOf;
|
|
14
15
|
exports.renderSiteConf = renderSiteConf;
|
|
15
16
|
const line_1 = require("../line");
|
|
16
17
|
const protocol_1 = require("../protocol");
|
|
@@ -25,18 +26,36 @@ function bridgeId(line) {
|
|
|
25
26
|
function gatewayPublish(line) {
|
|
26
27
|
return (0, permissions_1.jsPermissions)({ streams: Object.values(streams_1.LINE_STREAM), durable: `${(0, line_1.controllerId)(line)}-events` }).publish;
|
|
27
28
|
}
|
|
28
|
-
function
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
function linesOf(lines) {
|
|
30
|
+
return Array.isArray(lines) ? lines : [lines];
|
|
31
|
+
}
|
|
32
|
+
/** The server's name: the line for one line, the site when every line shares it, `site` otherwise. */
|
|
33
|
+
function serverName(lines) {
|
|
34
|
+
if (lines.length === 1)
|
|
35
|
+
return `${lines[0].siteId}-${lines[0].lineId}`;
|
|
36
|
+
const sites = new Set(lines.map((l) => l.siteId));
|
|
37
|
+
return sites.size === 1 ? lines[0].siteId : 'site';
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* The site NATS for one line or several: one bridge user per line, one
|
|
41
|
+
* gateway user allowed every line's streams and subjects.
|
|
42
|
+
*/
|
|
43
|
+
function renderSiteConf(lines, opts) {
|
|
44
|
+
const list = linesOf(lines);
|
|
45
|
+
if (!list.length)
|
|
46
|
+
throw new Error('renderSiteConf needs at least one line');
|
|
47
|
+
const baseOf = (line) => (0, protocol_1.toSubject)(`${opts.root}/${line.siteId}/${line.lineId}`);
|
|
48
|
+
const bridge = list.map((line) => [
|
|
31
49
|
` { user: ${q(`CN=${bridgeId(line)}`)}, allowed_connection_types: ["MQTT"],`,
|
|
32
|
-
` permissions: { publish: [${q(`${
|
|
33
|
-
].join('\n');
|
|
50
|
+
` permissions: { publish: [${q(`${baseOf(line)}.>`)}], subscribe: { deny: [">"] } } }`,
|
|
51
|
+
].join('\n')).join('\n');
|
|
52
|
+
const publish = [...new Set(list.flatMap((line) => gatewayPublish(line)))];
|
|
34
53
|
const gateway = [
|
|
35
54
|
` { user: ${q(opts.gatewayUser)}, password: ${q(opts.gatewayPassword)}, allowed_connection_types: ["STANDARD"],`,
|
|
36
|
-
` permissions: { publish: ${q(
|
|
55
|
+
` permissions: { publish: ${q(publish)}, subscribe: ${q(['_INBOX.>', ...list.map((line) => `${baseOf(line)}.>`)])} } }`,
|
|
37
56
|
].join('\n');
|
|
38
57
|
return `# Rendered from the line definition by site/setup.ts. Do not edit by hand.
|
|
39
|
-
server_name: ${q(
|
|
58
|
+
server_name: ${q(serverName(list))}
|
|
40
59
|
port: 4222
|
|
41
60
|
http: 8222
|
|
42
61
|
jetstream { store_dir: ${q(opts.storeDir)} }
|
|
@@ -14,5 +14,6 @@ export declare class CallbackEscalationFeed implements EscalationFeed {
|
|
|
14
14
|
constructor(adapter: CallbackEventAdapter, nakDelayMs?: number);
|
|
15
15
|
connect(): Promise<void>;
|
|
16
16
|
consume(handler: (event: EscalationEvent) => Promise<MachineDisposition>): Promise<void>;
|
|
17
|
+
unsubscribe(): Promise<void>;
|
|
17
18
|
close(): Promise<void>;
|
|
18
19
|
}
|
|
@@ -23,9 +23,12 @@ class CallbackEscalationFeed {
|
|
|
23
23
|
void this.redelivery.deliver(() => handler(event));
|
|
24
24
|
});
|
|
25
25
|
}
|
|
26
|
-
async
|
|
26
|
+
async unsubscribe() {
|
|
27
27
|
this.off?.();
|
|
28
28
|
await this.redelivery.stop();
|
|
29
29
|
}
|
|
30
|
+
async close() {
|
|
31
|
+
await this.unsubscribe();
|
|
32
|
+
}
|
|
30
33
|
}
|
|
31
34
|
exports.CallbackEscalationFeed = CallbackEscalationFeed;
|
|
@@ -26,6 +26,7 @@ export declare class MemoryMachineBus implements MachineBus {
|
|
|
26
26
|
retain?: boolean;
|
|
27
27
|
}): Promise<void>;
|
|
28
28
|
retained(filter: string): Promise<InboundMessage[]>;
|
|
29
|
+
unsubscribe(): Promise<void>;
|
|
29
30
|
close(): Promise<void>;
|
|
30
31
|
}
|
|
31
32
|
export declare class MemoryEscalationFeed implements EscalationFeed {
|
|
@@ -36,5 +37,6 @@ export declare class MemoryEscalationFeed implements EscalationFeed {
|
|
|
36
37
|
emit(body: Record<string, any>): void;
|
|
37
38
|
connect(): Promise<void>;
|
|
38
39
|
consume(handler: (event: EscalationEvent) => Promise<Disposition>): Promise<void>;
|
|
40
|
+
unsubscribe(): Promise<void>;
|
|
39
41
|
close(): Promise<void>;
|
|
40
42
|
}
|
|
@@ -50,6 +50,9 @@ class MemoryMachineBus {
|
|
|
50
50
|
async retained(filter) {
|
|
51
51
|
return this.broker.retained(filter);
|
|
52
52
|
}
|
|
53
|
+
async unsubscribe() {
|
|
54
|
+
this.broker.detach(this.durableName);
|
|
55
|
+
}
|
|
53
56
|
async close() {
|
|
54
57
|
this.broker.detach(this.durableName);
|
|
55
58
|
}
|
|
@@ -72,6 +75,9 @@ class MemoryEscalationFeed {
|
|
|
72
75
|
return event ? handler(event) : delivery_1.DISPOSITION.TERM;
|
|
73
76
|
});
|
|
74
77
|
}
|
|
78
|
+
async unsubscribe() {
|
|
79
|
+
this.broker.detach(this.durableName);
|
|
80
|
+
}
|
|
75
81
|
async close() {
|
|
76
82
|
this.broker.detach(this.durableName);
|
|
77
83
|
}
|
|
@@ -19,6 +19,8 @@ export declare class MqttMachineBus implements MachineBus {
|
|
|
19
19
|
retain?: boolean;
|
|
20
20
|
}): Promise<void>;
|
|
21
21
|
retained(filter: string): Promise<InboundMessage[]>;
|
|
22
|
+
/** Stops delivery in this process; the persistent session keeps its subscription, so messages queue for the next gateway. */
|
|
23
|
+
unsubscribe(): Promise<void>;
|
|
22
24
|
close(): Promise<void>;
|
|
23
25
|
private connected;
|
|
24
26
|
}
|
|
@@ -30,6 +30,10 @@ class MqttMachineBus {
|
|
|
30
30
|
retained(filter) {
|
|
31
31
|
return this.connected().retained(filter);
|
|
32
32
|
}
|
|
33
|
+
/** Stops delivery in this process; the persistent session keeps its subscription, so messages queue for the next gateway. */
|
|
34
|
+
async unsubscribe() {
|
|
35
|
+
await this.redelivery.stop();
|
|
36
|
+
}
|
|
33
37
|
async close() {
|
|
34
38
|
await this.redelivery.stop();
|
|
35
39
|
await this.session?.close(true);
|
|
@@ -13,5 +13,6 @@ export declare class PubSubEscalationFeed implements EscalationFeed {
|
|
|
13
13
|
constructor(pubsub: LTPubSub, nakDelayMs?: number);
|
|
14
14
|
connect(): Promise<void>;
|
|
15
15
|
consume(handler: (event: EscalationEvent) => Promise<Disposition>): Promise<void>;
|
|
16
|
+
unsubscribe(): Promise<void>;
|
|
16
17
|
close(): Promise<void>;
|
|
17
18
|
}
|
|
@@ -31,9 +31,12 @@ class PubSubEscalationFeed {
|
|
|
31
31
|
void this.redelivery.deliver(() => handler(event));
|
|
32
32
|
});
|
|
33
33
|
}
|
|
34
|
-
async
|
|
34
|
+
async unsubscribe() {
|
|
35
35
|
await this.sub?.close();
|
|
36
36
|
await this.redelivery.stop();
|
|
37
37
|
}
|
|
38
|
+
async close() {
|
|
39
|
+
await this.unsubscribe();
|
|
40
|
+
}
|
|
38
41
|
}
|
|
39
42
|
exports.PubSubEscalationFeed = PubSubEscalationFeed;
|
|
@@ -35,6 +35,8 @@ export declare class StreamMachineBus implements MachineBus {
|
|
|
35
35
|
retain?: boolean;
|
|
36
36
|
}): Promise<void>;
|
|
37
37
|
retained(filter: string): Promise<InboundMessage[]>;
|
|
38
|
+
/** Stops the consumer and the live subscriptions; the MQTT session stays open for commands and receipts. */
|
|
39
|
+
unsubscribe(): Promise<void>;
|
|
38
40
|
close(): Promise<void>;
|
|
39
41
|
private mqtt;
|
|
40
42
|
}
|
|
@@ -42,10 +42,14 @@ class StreamMachineBus {
|
|
|
42
42
|
retained(filter) {
|
|
43
43
|
return this.mqtt().retained(filter);
|
|
44
44
|
}
|
|
45
|
-
|
|
45
|
+
/** Stops the consumer and the live subscriptions; the MQTT session stays open for commands and receipts. */
|
|
46
|
+
async unsubscribe() {
|
|
46
47
|
for (const sub of this.subs.splice(0))
|
|
47
48
|
await sub.close();
|
|
48
49
|
await this.queue.drained();
|
|
50
|
+
}
|
|
51
|
+
async close() {
|
|
52
|
+
await this.unsubscribe();
|
|
49
53
|
await this.session?.close(true);
|
|
50
54
|
}
|
|
51
55
|
mqtt() {
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The running machine surface, for settings and the machines API. Set by
|
|
3
|
+
* start() when the config declares lines; absent otherwise, so a deployment
|
|
4
|
+
* without machines serves no lines and no Lines view.
|
|
5
|
+
*/
|
|
6
|
+
import type { LineSurface } from '../services/machines/surface';
|
|
7
|
+
export declare function registerMachineSurface(next: LineSurface | null): void;
|
|
8
|
+
export declare function getMachineSurface(): LineSurface | null;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The running machine surface, for settings and the machines API. Set by
|
|
4
|
+
* start() when the config declares lines; absent otherwise, so a deployment
|
|
5
|
+
* without machines serves no lines and no Lines view.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.registerMachineSurface = registerMachineSurface;
|
|
9
|
+
exports.getMachineSurface = getMachineSurface;
|
|
10
|
+
let surface = null;
|
|
11
|
+
function registerMachineSurface(next) {
|
|
12
|
+
surface = next;
|
|
13
|
+
}
|
|
14
|
+
function getMachineSurface() {
|
|
15
|
+
return surface;
|
|
16
|
+
}
|
package/build/routes/index.js
CHANGED
|
@@ -40,6 +40,7 @@ const nats_credentials_1 = __importDefault(require("./nats-credentials"));
|
|
|
40
40
|
const scan_codes_1 = __importDefault(require("./scan-codes"));
|
|
41
41
|
const domain_1 = __importDefault(require("./domain"));
|
|
42
42
|
const announcements_1 = __importDefault(require("./announcements"));
|
|
43
|
+
const machines_1 = __importDefault(require("./machines"));
|
|
43
44
|
const router = (0, http_1.Router)();
|
|
44
45
|
// Public routes (no auth required — they handle their own auth)
|
|
45
46
|
router.use('/auth', auth_2.default);
|
|
@@ -80,6 +81,7 @@ router.use('/topics', topics_1.default);
|
|
|
80
81
|
router.use('/scan-codes', scan_codes_1.default);
|
|
81
82
|
router.use('/domain', domain_1.default);
|
|
82
83
|
router.use('/announcements', announcements_1.default);
|
|
84
|
+
router.use('/machines', machines_1.default);
|
|
83
85
|
const overview_1 = __importDefault(require("./overview"));
|
|
84
86
|
router.use('/overview', overview_1.default);
|
|
85
87
|
const diagnostics_1 = __importDefault(require("./diagnostics"));
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const http_1 = require("../lib/http");
|
|
37
|
+
const escalationsApi = __importStar(require("../api/escalations"));
|
|
38
|
+
const auth_1 = require("../modules/auth");
|
|
39
|
+
const machines_1 = require("../modules/machines");
|
|
40
|
+
const commands_1 = require("../services/machines/commands");
|
|
41
|
+
const registry_1 = require("../services/machines/registry");
|
|
42
|
+
const registry_sync_1 = require("../services/machines/registry-sync");
|
|
43
|
+
const line_index_1 = require("../services/machines/line-index");
|
|
44
|
+
const topics_1 = require("../lib/machines/protocol/topics");
|
|
45
|
+
const router = (0, http_1.Router)();
|
|
46
|
+
/**
|
|
47
|
+
* The machine surface for the dashboard's Lines view. Reads and the dry run
|
|
48
|
+
* take the ops tier (superadmin, admin type, or engineer); declaring and
|
|
49
|
+
* retiring a line takes an administrator. A command is a row parked on the
|
|
50
|
+
* machine's role as the caller, so that role's write access decides, exactly
|
|
51
|
+
* as it does for any row created through the API.
|
|
52
|
+
*/
|
|
53
|
+
const NO_LINES = 'no machine lines are declared';
|
|
54
|
+
const NOT_LEADING = 'this replica is not leading the line';
|
|
55
|
+
function lineOf(req) {
|
|
56
|
+
const surface = (0, machines_1.getMachineSurface)();
|
|
57
|
+
const siteId = String(req.params.siteId);
|
|
58
|
+
const lineId = String(req.params.lineId);
|
|
59
|
+
const line = surface?.findLine(siteId, lineId);
|
|
60
|
+
return { surface, siteId, lineId, line };
|
|
61
|
+
}
|
|
62
|
+
const SORTS = new Set(['attention', 'site', 'updated']);
|
|
63
|
+
/** The longest search a person types; anything past it is cut, never an error. */
|
|
64
|
+
const QUERY_MAX_CHARS = 200;
|
|
65
|
+
function queryString(v) {
|
|
66
|
+
return typeof v === 'string' && v.trim() ? v.trim().slice(0, QUERY_MAX_CHARS) : undefined;
|
|
67
|
+
}
|
|
68
|
+
/** The line a path names, when both tokens could name a line at all. */
|
|
69
|
+
function pathLine(req) {
|
|
70
|
+
const siteId = req.params.siteId;
|
|
71
|
+
const lineId = req.params.lineId;
|
|
72
|
+
return (0, topics_1.isTopicLevel)(siteId) && (0, topics_1.isTopicLevel)(lineId) ? { siteId, lineId } : null;
|
|
73
|
+
}
|
|
74
|
+
function queryBoolean(v) {
|
|
75
|
+
return v === 'true' ? true : v === 'false' ? false : undefined;
|
|
76
|
+
}
|
|
77
|
+
function queryInt(v) {
|
|
78
|
+
const n = typeof v === 'string' ? Number(v) : NaN;
|
|
79
|
+
return Number.isFinite(n) ? n : undefined;
|
|
80
|
+
}
|
|
81
|
+
router.get('/lines', auth_1.requireRoleManager, async (req, res) => {
|
|
82
|
+
const surface = (0, machines_1.getMachineSurface)();
|
|
83
|
+
if (!surface) {
|
|
84
|
+
res.status(404).json({ error: NO_LINES });
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const sort = queryString(req.query.sort);
|
|
88
|
+
if (sort && !SORTS.has(sort)) {
|
|
89
|
+
res.status(400).json({ error: `sort must be one of ${[...SORTS].join(', ')}` });
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const query = {
|
|
93
|
+
q: queryString(req.query.q), site: queryString(req.query.site), attention: queryBoolean(req.query.attention),
|
|
94
|
+
sort: sort, limit: queryInt(req.query.limit), offset: queryInt(req.query.offset),
|
|
95
|
+
};
|
|
96
|
+
const [page, sites] = await Promise.all([(0, registry_1.listLines)(query), (0, registry_1.listSites)()]);
|
|
97
|
+
const body = {
|
|
98
|
+
lines: page.lines.map((record) => (0, line_index_1.toLineIndexRow)(surface, record)),
|
|
99
|
+
total: page.total, sites, limit: page.limit, offset: page.offset,
|
|
100
|
+
};
|
|
101
|
+
res.status(200).json(body);
|
|
102
|
+
});
|
|
103
|
+
router.put('/lines/:siteId/:lineId', auth_1.requireAdmin, async (req, res) => {
|
|
104
|
+
const surface = (0, machines_1.getMachineSurface)();
|
|
105
|
+
if (!surface) {
|
|
106
|
+
res.status(404).json({ error: NO_LINES });
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
const named = pathLine(req);
|
|
110
|
+
if (!named) {
|
|
111
|
+
res.status(400).json({ error: 'siteId and lineId must be topic levels' });
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
const { siteId, lineId } = named;
|
|
115
|
+
const definition = req.body?.definition;
|
|
116
|
+
if (!definition || typeof definition !== 'object' || Array.isArray(definition)) {
|
|
117
|
+
res.status(400).json({ error: 'definition is required' });
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
if (definition.siteId !== siteId || definition.lineId !== lineId) {
|
|
121
|
+
res.status(400).json({ error: `definition must be for ${siteId}/${lineId}` });
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
const version = req.body?.version;
|
|
125
|
+
if (version !== undefined && !(Number.isInteger(version) && version >= 1)) {
|
|
126
|
+
res.status(400).json({ error: 'version must be a whole number of at least 1' });
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
try {
|
|
130
|
+
const record = await (0, registry_sync_1.declareLine)(surface, definition, version);
|
|
131
|
+
const stored = (await (0, registry_1.getLineWithHealth)(siteId, lineId)) ?? { ...record, health: (0, line_index_1.emptyLineHealth)(record.definition.machines.length) };
|
|
132
|
+
res.status(200).json({ line: (0, line_index_1.toLineIndexRow)(surface, stored) });
|
|
133
|
+
}
|
|
134
|
+
catch (err) {
|
|
135
|
+
if (err instanceof registry_1.LineVersionConflict) {
|
|
136
|
+
res.status(409).json({ error: err.message });
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
res.status(400).json({ error: err instanceof Error ? err.message : String(err) });
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
router.delete('/lines/:siteId/:lineId', auth_1.requireAdmin, async (req, res) => {
|
|
143
|
+
const surface = (0, machines_1.getMachineSurface)();
|
|
144
|
+
if (!surface) {
|
|
145
|
+
res.status(404).json({ error: NO_LINES });
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
const named = pathLine(req);
|
|
149
|
+
if (!named) {
|
|
150
|
+
res.status(404).json({ error: 'no such line' });
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
const { siteId, lineId } = named;
|
|
154
|
+
const record = await (0, registry_sync_1.retireLine)(surface, siteId, lineId);
|
|
155
|
+
if (!record) {
|
|
156
|
+
res.status(404).json({ error: `no line ${siteId}/${lineId}` });
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
res.status(204).end();
|
|
160
|
+
});
|
|
161
|
+
router.get('/lines/:siteId/:lineId', auth_1.requireRoleManager, (req, res) => {
|
|
162
|
+
const { surface, siteId, lineId, line } = lineOf(req);
|
|
163
|
+
if (!surface || !line) {
|
|
164
|
+
res.status(404).json({ error: surface ? `no line ${siteId}/${lineId}` : NO_LINES });
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
const body = {
|
|
168
|
+
...(surface.describeLine(siteId, lineId) ?? { siteId, lineId, leading: false }),
|
|
169
|
+
summary: (0, line_index_1.lineSummaryOf)(surface, siteId, lineId, line),
|
|
170
|
+
};
|
|
171
|
+
res.status(200).json(body);
|
|
172
|
+
});
|
|
173
|
+
router.post('/lines/:siteId/:lineId/inspect', auth_1.requireRoleManager, (req, res) => {
|
|
174
|
+
const { surface, siteId, lineId, line } = lineOf(req);
|
|
175
|
+
if (!surface || !line) {
|
|
176
|
+
res.status(404).json({ error: surface ? `no line ${siteId}/${lineId}` : NO_LINES });
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
const topic = req.body?.topic;
|
|
180
|
+
if (typeof topic !== 'string' || !topic) {
|
|
181
|
+
res.status(400).json({ error: 'topic is required' });
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
const result = surface.inspect(siteId, lineId, { topic, payload: (0, line_index_1.wirePayloadOf)(req.body?.payload), retained: req.body?.retained === true });
|
|
185
|
+
if (!result) {
|
|
186
|
+
res.status(409).json({ error: NOT_LEADING });
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
res.status(200).json(result);
|
|
190
|
+
});
|
|
191
|
+
router.post('/lines/:siteId/:lineId/machines/:machineId/commands', async (req, res) => {
|
|
192
|
+
const { surface, siteId, lineId, line } = lineOf(req);
|
|
193
|
+
if (!surface || !line) {
|
|
194
|
+
res.status(404).json({ error: surface ? `no line ${siteId}/${lineId}` : NO_LINES });
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
const machineId = String(req.params.machineId);
|
|
198
|
+
if (!line.machines.some((m) => m.machineId === machineId)) {
|
|
199
|
+
res.status(404).json({ error: `no machine ${machineId} on ${siteId}/${lineId}` });
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
const op = req.body?.op;
|
|
203
|
+
const ops = surface.commandOps(siteId, lineId);
|
|
204
|
+
if (typeof op !== 'string' || !ops.includes(op)) {
|
|
205
|
+
res.status(400).json({ error: `op must be one of ${ops.join(', ')}` });
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
const args = req.body?.args;
|
|
209
|
+
if (args !== undefined && (!args || typeof args !== 'object' || Array.isArray(args))) {
|
|
210
|
+
res.status(400).json({ error: 'args must be an object' });
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
const result = await escalationsApi.createEscalation((0, commands_1.commandRow)((0, commands_1.commandTarget)(line, machineId), op, args ?? {}), req.auth);
|
|
214
|
+
if (result.status !== 201) {
|
|
215
|
+
res.status(result.status).json({ error: result.error });
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
res.status(201).json({ rowId: result.data.id });
|
|
219
|
+
});
|
|
220
|
+
exports.default = router;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Commands as rows. A host asks a machine to start, stop, pause, resume,
|
|
3
|
-
* change over
|
|
4
|
-
*
|
|
3
|
+
* change over, cancel a job, report a snapshot, or do anything its codec
|
|
4
|
+
* declares (`rowOps`), by parking a machine-command row on the machine's role,
|
|
5
|
+
* from a workflow step or through the API, the same way it asks a person for
|
|
5
6
|
* anything. The gateway sends the command and resolves the row with the
|
|
6
7
|
* machine's reply (CommandResolution), so the step reads the outcome as data.
|
|
7
8
|
*/
|
|
8
|
-
import type { Op } from '../../lib/machines/protocol';
|
|
9
9
|
import { type LineDef } from '../../lib/machines/line';
|
|
10
10
|
import { type CommandFacets } from './contracts';
|
|
11
11
|
/** Where a command goes: the machine and the role its rows land on. */
|
|
@@ -17,10 +17,10 @@ export interface CommandTarget {
|
|
|
17
17
|
}
|
|
18
18
|
export declare function commandTarget(line: LineDef, machineId: string): CommandTarget;
|
|
19
19
|
/** The row that asks a machine for `op`: pass it to conditional(), or create it through the API. */
|
|
20
|
-
export declare function commandRow(target: CommandTarget, op:
|
|
20
|
+
export declare function commandRow(target: CommandTarget, op: string, args?: Record<string, unknown>): {
|
|
21
21
|
role: string;
|
|
22
22
|
type: "machine-command";
|
|
23
|
-
subtype:
|
|
23
|
+
subtype: string;
|
|
24
24
|
description: string;
|
|
25
25
|
priority: number;
|
|
26
26
|
metadata: Record<string, unknown>;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
3
|
* Commands as rows. A host asks a machine to start, stop, pause, resume,
|
|
4
|
-
* change over
|
|
5
|
-
*
|
|
4
|
+
* change over, cancel a job, report a snapshot, or do anything its codec
|
|
5
|
+
* declares (`rowOps`), by parking a machine-command row on the machine's role,
|
|
6
|
+
* from a workflow step or through the API, the same way it asks a person for
|
|
6
7
|
* anything. The gateway sends the command and resolves the row with the
|
|
7
8
|
* machine's reply (CommandResolution), so the step reads the outcome as data.
|
|
8
9
|
*/
|
|
@@ -29,7 +29,6 @@ export interface MachineLineConfig {
|
|
|
29
29
|
mqtt?: MqttEndpoint;
|
|
30
30
|
replyTimeoutMs: number;
|
|
31
31
|
dispatchAttempts: number;
|
|
32
|
-
handoffTimeout: string;
|
|
33
32
|
offlineDebounceMs: number;
|
|
34
33
|
/** A connected machine silent this long gets a quiet row; 0 turns the check off. */
|
|
35
34
|
quietMs: number;
|
|
@@ -41,6 +40,8 @@ export interface MachineLineConfig {
|
|
|
41
40
|
lifecycle: boolean;
|
|
42
41
|
/** With lifecycle notes, progress is noted each time it crosses this many percent; 0 notes none. */
|
|
43
42
|
progressStep: number;
|
|
43
|
+
/** Telemetry messages are published as wire events too; off by default, since they are read live and many. */
|
|
44
|
+
wireTelemetry: boolean;
|
|
44
45
|
ltBaseUrl: string;
|
|
45
46
|
}
|
|
46
47
|
type Env = Record<string, string | undefined>;
|
|
@@ -68,13 +68,13 @@ function loadMachineLineConfig(env = process.env) {
|
|
|
68
68
|
lineConfigPath: env.MACHINE_LINE_CONFIG || undefined,
|
|
69
69
|
replyTimeoutMs: int(env, 'MACHINE_REPLY_TIMEOUT_MS', protocol_1.REPLY_DEADLINE_MS),
|
|
70
70
|
dispatchAttempts: Math.max(1, int(env, 'MACHINE_DISPATCH_ATTEMPTS', 3)),
|
|
71
|
-
handoffTimeout: env.MACHINE_HANDOFF_TIMEOUT ?? '10m',
|
|
72
71
|
offlineDebounceMs: int(env, 'MACHINE_OFFLINE_DEBOUNCE_MS', 15_000),
|
|
73
72
|
quietMs: int(env, 'MACHINE_QUIET_MS', 90_000),
|
|
74
73
|
dispatchTtlMs: int(env, 'MACHINE_DISPATCH_TTL_MS', 600_000),
|
|
75
74
|
receiptDelayMs: int(env, 'MACHINE_RECEIPT_DELAY_MS', 250),
|
|
76
75
|
lifecycle: oneOf('MACHINE_LIFECYCLE', env.MACHINE_LIFECYCLE || SWITCH.OFF, Object.values(SWITCH)) === SWITCH.ON,
|
|
77
76
|
progressStep: percentStep(env, 'MACHINE_PROGRESS_STEP', 25),
|
|
77
|
+
wireTelemetry: oneOf('MACHINE_WIRE_TELEMETRY', env.MACHINE_WIRE_TELEMETRY || SWITCH.OFF, Object.values(SWITCH)) === SWITCH.ON,
|
|
78
78
|
ltBaseUrl: env.LT_BASE_URL ?? 'http://localhost:3000',
|
|
79
79
|
};
|
|
80
80
|
if (transport === exports.MACHINE_TRANSPORT.NATS) {
|
|
@@ -43,6 +43,8 @@ export interface HandoffUnit {
|
|
|
43
43
|
artifacts?: ArtifactRef[];
|
|
44
44
|
/** Parameters for this unit alone, sent to the machine as given. */
|
|
45
45
|
parameters?: Record<string, unknown>;
|
|
46
|
+
/** The host's references for this unit, by name; sent to the machine as given and searchable on the row. */
|
|
47
|
+
refs?: Record<string, string>;
|
|
46
48
|
}
|
|
47
49
|
/** Metadata on a handoff row. Everything a dispatch needs rides here. */
|
|
48
50
|
export interface HandoffFacets {
|
|
@@ -66,6 +68,8 @@ export interface HandoffFacets {
|
|
|
66
68
|
attempt: number;
|
|
67
69
|
/** Parameters for the job, sent to the machine as given; what they mean is between the host and its codec. */
|
|
68
70
|
parameters?: Record<string, unknown>;
|
|
71
|
+
/** The host's references for the job, by name (an order, a batch, a ticket); sent to the machine as given and searchable on the row. */
|
|
72
|
+
refs?: Record<string, string>;
|
|
69
73
|
}
|
|
70
74
|
/**
|
|
71
75
|
* Items a handoff row accumulates, one per unit: the sender's finished-job
|
|
@@ -151,8 +155,12 @@ export interface HandoffResolution {
|
|
|
151
155
|
/** The machine that reported the error, when it is not the one resolving. */
|
|
152
156
|
reportedBy?: string;
|
|
153
157
|
errorCode?: HandoffErrorCode;
|
|
158
|
+
/** On `sender-rejected`, how the sender finished the unit: reject, hold, scrap or rework. */
|
|
159
|
+
result?: string;
|
|
154
160
|
reason?: string | null;
|
|
155
161
|
detail?: string;
|
|
162
|
+
/** The machine's structured code for a refusal or failure, when its reply carried one. */
|
|
163
|
+
code?: string;
|
|
156
164
|
}
|
|
157
165
|
/** Decisions on line-operator rows: failed handoffs, alarms, dark machines, contested registrations. */
|
|
158
166
|
export declare const DECISION: {
|
|
@@ -202,6 +210,8 @@ export interface CommandResolution {
|
|
|
202
210
|
op: string;
|
|
203
211
|
status: CommandStatus;
|
|
204
212
|
reason?: string;
|
|
213
|
+
/** The machine's structured code for the outcome, when its reply carried one. */
|
|
214
|
+
code?: string;
|
|
205
215
|
}
|
|
206
216
|
/** A row's dispatch command in its validity round; a later round is a new command (gateway/pacing.ts dispatchWindow). */
|
|
207
217
|
export declare const dispatchCommandId: (escalationId: string, round?: number) => string;
|