@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.
Files changed (386) hide show
  1. package/README.md +9 -2
  2. package/build/api/files.d.ts +5 -0
  3. package/build/api/files.js +19 -2
  4. package/build/api/knowledge.d.ts +3 -1
  5. package/build/api/settings.d.ts +4 -1
  6. package/build/api/settings.js +7 -1
  7. package/build/index.js +9 -4
  8. package/build/lib/db/config-lock.d.ts +10 -0
  9. package/build/lib/db/config-lock.js +28 -0
  10. package/build/lib/db/schemas/041_machine_lines.sql +26 -0
  11. package/build/lib/db/schemas/042_knowledge_edition_labels.sql +9 -0
  12. package/build/lib/events/browser-view.js +8 -2
  13. package/build/lib/events/publish.d.ts +33 -0
  14. package/build/lib/events/publish.js +52 -1
  15. package/build/lib/machines/line.d.ts +7 -1
  16. package/build/lib/machines/line.js +25 -2
  17. package/build/lib/machines/protocol/codec.d.ts +14 -0
  18. package/build/lib/machines/protocol/codec.js +10 -1
  19. package/build/lib/machines/protocol/constants.d.ts +1 -1
  20. package/build/lib/machines/protocol/constants.js +1 -1
  21. package/build/lib/machines/protocol/contract.d.ts +2 -0
  22. package/build/lib/machines/protocol/contract.js +13 -8
  23. package/build/lib/machines/site/mosquitto-conf.d.ts +9 -4
  24. package/build/lib/machines/site/mosquitto-conf.js +32 -22
  25. package/build/lib/machines/site/site-conf.d.ts +13 -3
  26. package/build/lib/machines/site/site-conf.js +31 -8
  27. package/build/lib/machines/transport/callback-feed.d.ts +1 -0
  28. package/build/lib/machines/transport/callback-feed.js +4 -1
  29. package/build/lib/machines/transport/memory.d.ts +2 -0
  30. package/build/lib/machines/transport/memory.js +6 -0
  31. package/build/lib/machines/transport/mqtt-bus.d.ts +2 -0
  32. package/build/lib/machines/transport/mqtt-bus.js +4 -0
  33. package/build/lib/machines/transport/nats-bus.d.ts +3 -0
  34. package/build/lib/machines/transport/nats-bus.js +3 -0
  35. package/build/lib/machines/transport/nats-feed.d.ts +1 -0
  36. package/build/lib/machines/transport/nats-feed.js +4 -1
  37. package/build/lib/machines/transport/pubsub-feed.d.ts +1 -0
  38. package/build/lib/machines/transport/pubsub-feed.js +4 -1
  39. package/build/lib/machines/transport/stream-bus.d.ts +7 -1
  40. package/build/lib/machines/transport/stream-bus.js +17 -5
  41. package/build/lib/machines/transport/streams.d.ts +10 -2
  42. package/build/lib/machines/transport/streams.js +32 -5
  43. package/build/lib/messaging/memory.js +3 -0
  44. package/build/lib/messaging/nats/streams.d.ts +3 -0
  45. package/build/lib/messaging/nats/streams.js +16 -0
  46. package/build/lib/storage/local.d.ts +2 -0
  47. package/build/lib/storage/local.js +3 -0
  48. package/build/lib/storage/s3.d.ts +3 -2
  49. package/build/lib/storage/s3.js +6 -1
  50. package/build/lib/storage/types.d.ts +7 -1
  51. package/build/modules/machines.d.ts +8 -0
  52. package/build/modules/machines.js +16 -0
  53. package/build/routes/file-browser.js +3 -1
  54. package/build/routes/index.js +2 -0
  55. package/build/routes/knowledge.js +6 -5
  56. package/build/routes/machines.d.ts +2 -0
  57. package/build/routes/machines.js +253 -0
  58. package/build/services/knowledge/index.d.ts +4 -2
  59. package/build/services/knowledge/index.js +8 -2
  60. package/build/services/knowledge/lookup-cache.d.ts +8 -0
  61. package/build/services/knowledge/lookup-cache.js +30 -3
  62. package/build/services/knowledge/lookup-refs.js +1 -1
  63. package/build/services/knowledge/sql.d.ts +4 -2
  64. package/build/services/knowledge/sql.js +8 -3
  65. package/build/services/machines/commands.d.ts +5 -5
  66. package/build/services/machines/commands.js +3 -2
  67. package/build/services/machines/config.d.ts +4 -1
  68. package/build/services/machines/config.js +2 -1
  69. package/build/services/machines/contracts.d.ts +28 -0
  70. package/build/services/machines/contracts.js +15 -1
  71. package/build/services/machines/forms.d.ts +26 -1
  72. package/build/services/machines/forms.js +17 -1
  73. package/build/services/machines/gateway/actions.d.ts +14 -1
  74. package/build/services/machines/gateway/admission.d.ts +30 -4
  75. package/build/services/machines/gateway/admission.js +76 -14
  76. package/build/services/machines/gateway/api-escalations.js +4 -0
  77. package/build/services/machines/gateway/dispatcher.d.ts +12 -4
  78. package/build/services/machines/gateway/dispatcher.js +53 -17
  79. package/build/services/machines/gateway/executor.d.ts +13 -2
  80. package/build/services/machines/gateway/executor.js +84 -29
  81. package/build/services/machines/gateway/gateway.d.ts +21 -1
  82. package/build/services/machines/gateway/gateway.js +65 -25
  83. package/build/services/machines/gateway/index.d.ts +3 -0
  84. package/build/services/machines/gateway/index.js +3 -0
  85. package/build/services/machines/gateway/inspect.d.ts +17 -0
  86. package/build/services/machines/gateway/inspect.js +68 -0
  87. package/build/services/machines/gateway/log.d.ts +10 -0
  88. package/build/services/machines/gateway/log.js +20 -0
  89. package/build/services/machines/gateway/lt-http.js +11 -2
  90. package/build/services/machines/gateway/pacing.js +2 -1
  91. package/build/services/machines/gateway/plan-escalation.js +8 -3
  92. package/build/services/machines/gateway/plan-machine.js +41 -16
  93. package/build/services/machines/gateway/plan-shared.d.ts +5 -3
  94. package/build/services/machines/gateway/plan-shared.js +6 -4
  95. package/build/services/machines/gateway/project.d.ts +9 -0
  96. package/build/services/machines/gateway/project.js +55 -0
  97. package/build/services/machines/gateway/receipts.d.ts +3 -0
  98. package/build/services/machines/gateway/receipts.js +3 -1
  99. package/build/services/machines/gateway/reconcile.js +3 -3
  100. package/build/services/machines/gateway/registration.js +1 -1
  101. package/build/services/machines/gateway/reply-waiter.d.ts +8 -3
  102. package/build/services/machines/gateway/reply-waiter.js +37 -16
  103. package/build/services/machines/gateway/state.d.ts +53 -4
  104. package/build/services/machines/gateway/state.js +128 -13
  105. package/build/services/machines/gateway/wire-window.d.ts +21 -0
  106. package/build/services/machines/gateway/wire-window.js +61 -0
  107. package/build/services/machines/gateway/wire.d.ts +58 -0
  108. package/build/services/machines/gateway/wire.js +172 -0
  109. package/build/services/machines/index.d.ts +3 -0
  110. package/build/services/machines/index.js +2 -0
  111. package/build/services/machines/line-index.d.ts +16 -0
  112. package/build/services/machines/line-index.js +39 -0
  113. package/build/services/machines/registry-sql.d.ts +31 -0
  114. package/build/services/machines/registry-sql.js +110 -0
  115. package/build/services/machines/registry-sync.d.ts +31 -0
  116. package/build/services/machines/registry-sync.js +81 -0
  117. package/build/services/machines/registry.d.ts +77 -0
  118. package/build/services/machines/registry.js +158 -0
  119. package/build/services/machines/roles.d.ts +5 -4
  120. package/build/services/machines/roles.js +13 -4
  121. package/build/services/machines/rows.js +10 -1
  122. package/build/services/machines/select.d.ts +3 -2
  123. package/build/services/machines/select.js +4 -3
  124. package/build/services/machines/surface.d.ts +54 -5
  125. package/build/services/machines/surface.js +113 -17
  126. package/build/start/apply-report.d.ts +1 -1
  127. package/build/start/apply-report.js +3 -25
  128. package/build/start/index.js +16 -4
  129. package/build/system/activities/knowledge.d.ts +4 -0
  130. package/build/system/activities/knowledge.js +15 -0
  131. package/build/system/activities/sql.d.ts +2 -0
  132. package/build/system/activities/sql.js +6 -1
  133. package/build/system/index.js +13 -0
  134. package/build/system/mcp-servers/admin/schemas.d.ts +22 -22
  135. package/build/system/mcp-servers/human-queue-schemas.d.ts +7 -7
  136. package/build/system/mcp-servers/knowledge.js +4 -2
  137. package/build/system/mcp-servers/machines-schemas.d.ts +35 -0
  138. package/build/system/mcp-servers/machines-schemas.js +35 -0
  139. package/build/system/mcp-servers/machines.d.ts +20 -0
  140. package/build/system/mcp-servers/machines.js +154 -0
  141. package/build/system/seed/tool-manifests-machines.d.ts +2 -0
  142. package/build/system/seed/tool-manifests-machines.js +88 -0
  143. package/build/tsconfig.tsbuildinfo +1 -1
  144. package/build/types/escalation.d.ts +9 -6
  145. package/build/types/escalation.js +8 -2
  146. package/build/types/events.d.ts +6 -1
  147. package/build/types/index.d.ts +1 -0
  148. package/build/types/machines-view.d.ts +175 -0
  149. package/build/types/machines-view.js +7 -0
  150. package/build/types/machines.d.ts +5 -0
  151. package/build/types/messaging.d.ts +2 -0
  152. package/build/types/startup.d.ts +2 -0
  153. package/dashboard/dist/assets/{AdminDashboard-DlItqxFS.js → AdminDashboard-Bm7VG65H.js} +2 -2
  154. package/dashboard/dist/assets/{AdminDashboard-DlItqxFS.js.map → AdminDashboard-Bm7VG65H.js.map} +1 -1
  155. package/dashboard/dist/assets/{AgentConfigPage-BUmT4a7n.js → AgentConfigPage-aJF7Sdbc.js} +6 -6
  156. package/dashboard/dist/assets/{AgentConfigPage-BUmT4a7n.js.map → AgentConfigPage-aJF7Sdbc.js.map} +1 -1
  157. package/dashboard/dist/assets/{AgentDetailPage-Cww8rlBi.js → AgentDetailPage-GwwghhxT.js} +3 -3
  158. package/dashboard/dist/assets/{AgentDetailPage-Cww8rlBi.js.map → AgentDetailPage-GwwghhxT.js.map} +1 -1
  159. package/dashboard/dist/assets/AgentsPage-DVvCzZyg.js +2 -0
  160. package/dashboard/dist/assets/{AgentsPage-C9UuUKhr.js.map → AgentsPage-DVvCzZyg.js.map} +1 -1
  161. package/dashboard/dist/assets/AvailableEscalationsPage-Cxmcji_K.js +2 -0
  162. package/dashboard/dist/assets/{AvailableEscalationsPage-DrvfXz70.js.map → AvailableEscalationsPage-Cxmcji_K.js.map} +1 -1
  163. package/dashboard/dist/assets/{BotPicker-CDq9XRMp.js → BotPicker-CofRxk4L.js} +2 -2
  164. package/dashboard/dist/assets/{BotPicker-CDq9XRMp.js.map → BotPicker-CofRxk4L.js.map} +1 -1
  165. package/dashboard/dist/assets/{BulkAssignModal-jsvqtrEA.js → BulkAssignModal-BARWuz4L.js} +2 -2
  166. package/dashboard/dist/assets/{BulkAssignModal-jsvqtrEA.js.map → BulkAssignModal-BARWuz4L.js.map} +1 -1
  167. package/dashboard/dist/assets/{CapabilitiesPage-CSCrI6B1.js → CapabilitiesPage-BJAWVNEx.js} +2 -2
  168. package/dashboard/dist/assets/{CapabilitiesPage-CSCrI6B1.js.map → CapabilitiesPage-BJAWVNEx.js.map} +1 -1
  169. package/dashboard/dist/assets/{CollapsibleSection-uD9mn-CQ.js → CollapsibleSection-CtgoaG75.js} +2 -2
  170. package/dashboard/dist/assets/{CollapsibleSection-uD9mn-CQ.js.map → CollapsibleSection-CtgoaG75.js.map} +1 -1
  171. package/dashboard/dist/assets/{ConfirmDeleteModal-BRmx2hA4.js → ConfirmDeleteModal-BYXXBWs6.js} +2 -2
  172. package/dashboard/dist/assets/{ConfirmDeleteModal-BRmx2hA4.js.map → ConfirmDeleteModal-BYXXBWs6.js.map} +1 -1
  173. package/dashboard/dist/assets/{ConnectedAppsPage-DlMzE5a-.js → ConnectedAppsPage-D0JkzWa7.js} +2 -2
  174. package/dashboard/dist/assets/{ConnectedAppsPage-DlMzE5a-.js.map → ConnectedAppsPage-D0JkzWa7.js.map} +1 -1
  175. package/dashboard/dist/assets/{CountdownTimer-sRuM4eM5.js → CountdownTimer-BcFxdZYN.js} +2 -2
  176. package/dashboard/dist/assets/{CountdownTimer-sRuM4eM5.js.map → CountdownTimer-BcFxdZYN.js.map} +1 -1
  177. package/dashboard/dist/assets/{CredentialsPage-bLYydwqa.js → CredentialsPage-DPSY20rV.js} +2 -2
  178. package/dashboard/dist/assets/{CredentialsPage-bLYydwqa.js.map → CredentialsPage-DPSY20rV.js.map} +1 -1
  179. package/dashboard/dist/assets/{CronLabel-D_ATDL2N.js → CronLabel-Dg_Oew_Y.js} +2 -2
  180. package/dashboard/dist/assets/{CronLabel-D_ATDL2N.js.map → CronLabel-Dg_Oew_Y.js.map} +1 -1
  181. package/dashboard/dist/assets/{DropZone-u1JGfR9G.js → DropZone-Cl_Flb16.js} +2 -2
  182. package/dashboard/dist/assets/{DropZone-u1JGfR9G.js.map → DropZone-Cl_Flb16.js.map} +1 -1
  183. package/dashboard/dist/assets/{ElapsedCell-groSMfqB.js → ElapsedCell-Dm3G5fK2.js} +2 -2
  184. package/dashboard/dist/assets/{ElapsedCell-groSMfqB.js.map → ElapsedCell-Dm3G5fK2.js.map} +1 -1
  185. package/dashboard/dist/assets/{EntityTimelinePanel-D-F3_A9m.js → EntityTimelinePanel-CrEEP04e.js} +2 -2
  186. package/dashboard/dist/assets/{EntityTimelinePanel-D-F3_A9m.js.map → EntityTimelinePanel-CrEEP04e.js.map} +1 -1
  187. package/dashboard/dist/assets/{EscalationListSchemaPage-Bad6Jrmr.js → EscalationListSchemaPage-wOInXcjs.js} +3 -3
  188. package/dashboard/dist/assets/{EscalationListSchemaPage-Bad6Jrmr.js.map → EscalationListSchemaPage-wOInXcjs.js.map} +1 -1
  189. package/dashboard/dist/assets/{EscalationSchemaPage-BKi_npI9.js → EscalationSchemaPage-CrIj_g9d.js} +3 -3
  190. package/dashboard/dist/assets/{EscalationSchemaPage-BKi_npI9.js.map → EscalationSchemaPage-CrIj_g9d.js.map} +1 -1
  191. package/dashboard/dist/assets/{EscalationTimeline-DQUUm3b1.js → EscalationTimeline-CeAsl5IT.js} +2 -2
  192. package/dashboard/dist/assets/{EscalationTimeline-DQUUm3b1.js.map → EscalationTimeline-CeAsl5IT.js.map} +1 -1
  193. package/dashboard/dist/assets/{EscalationTitleSelect-3mhXh77a.js → EscalationTitleSelect-D8qpCYiy.js} +2 -2
  194. package/dashboard/dist/assets/{EscalationTitleSelect-3mhXh77a.js.map → EscalationTitleSelect-D8qpCYiy.js.map} +1 -1
  195. package/dashboard/dist/assets/{EscalationsOverview-Qaov-uML.js → EscalationsOverview-CvaqVPsr.js} +2 -2
  196. package/dashboard/dist/assets/{EscalationsOverview-Qaov-uML.js.map → EscalationsOverview-CvaqVPsr.js.map} +1 -1
  197. package/dashboard/dist/assets/{EventTable-V4RF_n58.js → EventTable-Be0JuEl6.js} +2 -2
  198. package/dashboard/dist/assets/{EventTable-V4RF_n58.js.map → EventTable-Be0JuEl6.js.map} +1 -1
  199. package/dashboard/dist/assets/FilterBar-BVyAjIgv.js +2 -0
  200. package/dashboard/dist/assets/FilterBar-BVyAjIgv.js.map +1 -0
  201. package/dashboard/dist/assets/{GraphInvokePage-Djslhf96.js → GraphInvokePage-D_QigJeD.js} +2 -2
  202. package/dashboard/dist/assets/{GraphInvokePage-Djslhf96.js.map → GraphInvokePage-D_QigJeD.js.map} +1 -1
  203. package/dashboard/dist/assets/{HomePage-EjcNxlKx.js → HomePage-C1haeuNy.js} +2 -2
  204. package/dashboard/dist/assets/{HomePage-EjcNxlKx.js.map → HomePage-C1haeuNy.js.map} +1 -1
  205. package/dashboard/dist/assets/LinePage-CWD5pv1g.js +5 -0
  206. package/dashboard/dist/assets/LinePage-CWD5pv1g.js.map +1 -0
  207. package/dashboard/dist/assets/LinesPage-NqChsKcO.js +3 -0
  208. package/dashboard/dist/assets/LinesPage-NqChsKcO.js.map +1 -0
  209. package/dashboard/dist/assets/{ListToolbar-RrEAePOX.js → ListToolbar-BZCNrTh6.js} +2 -2
  210. package/dashboard/dist/assets/{ListToolbar-RrEAePOX.js.map → ListToolbar-BZCNrTh6.js.map} +1 -1
  211. package/dashboard/dist/assets/{McpOverview-8gqiL3Vj.js → McpOverview-yJTYnh1z.js} +2 -2
  212. package/dashboard/dist/assets/{McpOverview-8gqiL3Vj.js.map → McpOverview-yJTYnh1z.js.map} +1 -1
  213. package/dashboard/dist/assets/{McpQueryDetailPage-COyn6Ak5.js → McpQueryDetailPage-ChuLpJ4u.js} +3 -3
  214. package/dashboard/dist/assets/{McpQueryDetailPage-COyn6Ak5.js.map → McpQueryDetailPage-ChuLpJ4u.js.map} +1 -1
  215. package/dashboard/dist/assets/{McpQueryPage-Dj6Qj72w.js → McpQueryPage-9S-v9soF.js} +2 -2
  216. package/dashboard/dist/assets/{McpQueryPage-Dj6Qj72w.js.map → McpQueryPage-9S-v9soF.js.map} +1 -1
  217. package/dashboard/dist/assets/McpRunDetailPage-BhrcfxD5.js +2 -0
  218. package/dashboard/dist/assets/{McpRunDetailPage-80fQn9iX.js.map → McpRunDetailPage-BhrcfxD5.js.map} +1 -1
  219. package/dashboard/dist/assets/{McpRunsPage-DaSsI-EM.js → McpRunsPage-C5_i8_Zx.js} +2 -2
  220. package/dashboard/dist/assets/{McpRunsPage-DaSsI-EM.js.map → McpRunsPage-C5_i8_Zx.js.map} +1 -1
  221. package/dashboard/dist/assets/{NamespacePill-C5epAgq6.js → NamespacePill-OTZD2hzt.js} +2 -2
  222. package/dashboard/dist/assets/{NamespacePill-C5epAgq6.js.map → NamespacePill-OTZD2hzt.js.map} +1 -1
  223. package/dashboard/dist/assets/{OperationsPage-BSu1o2gB.js → OperationsPage-C03CeU5P.js} +2 -2
  224. package/dashboard/dist/assets/{OperationsPage-BSu1o2gB.js.map → OperationsPage-C03CeU5P.js.map} +1 -1
  225. package/dashboard/dist/assets/{OperatorDashboard-HFI4WGIV.js → OperatorDashboard-BzC134Jt.js} +2 -2
  226. package/dashboard/dist/assets/{OperatorDashboard-HFI4WGIV.js.map → OperatorDashboard-BzC134Jt.js.map} +1 -1
  227. package/dashboard/dist/assets/{PageHeader-BSWIspNB.js → PageHeader-Hx8APPwE.js} +2 -2
  228. package/dashboard/dist/assets/{PageHeader-BSWIspNB.js.map → PageHeader-Hx8APPwE.js.map} +1 -1
  229. package/dashboard/dist/assets/{PageHeaderWithStats-DDjopQ-k.js → PageHeaderWithStats-BEQYYBJv.js} +2 -2
  230. package/dashboard/dist/assets/{PageHeaderWithStats-DDjopQ-k.js.map → PageHeaderWithStats-BEQYYBJv.js.map} +1 -1
  231. package/dashboard/dist/assets/{PersonaDetailPage-D0qlBuGi.js → PersonaDetailPage-D0mY9L6j.js} +2 -2
  232. package/dashboard/dist/assets/{PersonaDetailPage-D0qlBuGi.js.map → PersonaDetailPage-D0mY9L6j.js.map} +1 -1
  233. package/dashboard/dist/assets/{PersonasPage-BJClu-5H.js → PersonasPage-FFlm5Eug.js} +2 -2
  234. package/dashboard/dist/assets/{PersonasPage-BJClu-5H.js.map → PersonasPage-FFlm5Eug.js.map} +1 -1
  235. package/dashboard/dist/assets/{PortalPage-CucNZn_w.js → PortalPage-Cpc25uO-.js} +2 -2
  236. package/dashboard/dist/assets/{PortalPage-CucNZn_w.js.map → PortalPage-Cpc25uO-.js.map} +1 -1
  237. package/dashboard/dist/assets/{ProcessDetailPage-B9wMw0RV.js → ProcessDetailPage-Di2J7KwY.js} +2 -2
  238. package/dashboard/dist/assets/{ProcessDetailPage-B9wMw0RV.js.map → ProcessDetailPage-Di2J7KwY.js.map} +1 -1
  239. package/dashboard/dist/assets/{ProcessesListPage-B6k4RpmR.js → ProcessesListPage-BEXwU3Z0.js} +2 -2
  240. package/dashboard/dist/assets/{ProcessesListPage-B6k4RpmR.js.map → ProcessesListPage-BEXwU3Z0.js.map} +1 -1
  241. package/dashboard/dist/assets/{ResolverForm-ZVufJ4G-.js → ResolverForm-2ks-3jXC.js} +6 -6
  242. package/dashboard/dist/assets/{ResolverForm-ZVufJ4G-.js.map → ResolverForm-2ks-3jXC.js.map} +1 -1
  243. package/dashboard/dist/assets/{RoleDetailPage-CTbq0mz4.js → RoleDetailPage-DqoOk0xc.js} +3 -3
  244. package/dashboard/dist/assets/{RoleDetailPage-CTbq0mz4.js.map → RoleDetailPage-DqoOk0xc.js.map} +1 -1
  245. package/dashboard/dist/assets/{RolePill-CoETDpjF.js → RolePill-R5_ctGFy.js} +2 -2
  246. package/dashboard/dist/assets/{RolePill-CoETDpjF.js.map → RolePill-R5_ctGFy.js.map} +1 -1
  247. package/dashboard/dist/assets/{RolesPage-DBKxeam4.js → RolesPage-CPmo8Srr.js} +2 -2
  248. package/dashboard/dist/assets/{RolesPage-DBKxeam4.js.map → RolesPage-CPmo8Srr.js.map} +1 -1
  249. package/dashboard/dist/assets/{RosterWidget-BkLAwEYB.js → RosterWidget-D2yovCKw.js} +2 -2
  250. package/dashboard/dist/assets/{RosterWidget-BkLAwEYB.js.map → RosterWidget-D2yovCKw.js.map} +1 -1
  251. package/dashboard/dist/assets/{RunAsSelector-D2DC4iDf.js → RunAsSelector-CMv96On6.js} +2 -2
  252. package/dashboard/dist/assets/{RunAsSelector-D2DC4iDf.js.map → RunAsSelector-CMv96On6.js.map} +1 -1
  253. package/dashboard/dist/assets/{ScanCodesPage-BlKleaT0.js → ScanCodesPage-CA6cTT-M.js} +2 -2
  254. package/dashboard/dist/assets/{ScanCodesPage-BlKleaT0.js.map → ScanCodesPage-CA6cTT-M.js.map} +1 -1
  255. package/dashboard/dist/assets/{ScanSchemeDetailPage-CTW6gofi.js → ScanSchemeDetailPage-DnctN5-H.js} +2 -2
  256. package/dashboard/dist/assets/{ScanSchemeDetailPage-CTW6gofi.js.map → ScanSchemeDetailPage-DnctN5-H.js.map} +1 -1
  257. package/dashboard/dist/assets/{ScanStationPage-DPRjSPyT.js → ScanStationPage-Bk8RwkKL.js} +2 -2
  258. package/dashboard/dist/assets/{ScanStationPage-DPRjSPyT.js.map → ScanStationPage-Bk8RwkKL.js.map} +1 -1
  259. package/dashboard/dist/assets/{ScopeBadge-CGsTtqFr.js → ScopeBadge-BXZ084nD.js} +2 -2
  260. package/dashboard/dist/assets/{ScopeBadge-CGsTtqFr.js.map → ScopeBadge-BXZ084nD.js.map} +1 -1
  261. package/dashboard/dist/assets/{StickyPagination-CkmX3-Gu.js → StickyPagination-B0FSuUgs.js} +2 -2
  262. package/dashboard/dist/assets/{StickyPagination-CkmX3-Gu.js.map → StickyPagination-B0FSuUgs.js.map} +1 -1
  263. package/dashboard/dist/assets/{StreamMessageDetail-Xm_n510s.js → StreamMessageDetail-BwZEvMpP.js} +2 -2
  264. package/dashboard/dist/assets/{StreamMessageDetail-Xm_n510s.js.map → StreamMessageDetail-BwZEvMpP.js.map} +1 -1
  265. package/dashboard/dist/assets/{SwimlaneTimeline-De48aJan.js → SwimlaneTimeline-BDVQEaMw.js} +2 -2
  266. package/dashboard/dist/assets/{SwimlaneTimeline-De48aJan.js.map → SwimlaneTimeline-BDVQEaMw.js.map} +1 -1
  267. package/dashboard/dist/assets/{TagInput-S7UuVT_M.js → TagInput-DjPUDp2M.js} +2 -2
  268. package/dashboard/dist/assets/{TagInput-S7UuVT_M.js.map → TagInput-DjPUDp2M.js.map} +1 -1
  269. package/dashboard/dist/assets/{TaskDetailPage-HycMx3O9.js → TaskDetailPage-BOlv3iGB.js} +2 -2
  270. package/dashboard/dist/assets/{TaskDetailPage-HycMx3O9.js.map → TaskDetailPage-BOlv3iGB.js.map} +1 -1
  271. package/dashboard/dist/assets/{TaskQueuePill-BlHNpYiZ.js → TaskQueuePill-D-4Ynf3K.js} +2 -2
  272. package/dashboard/dist/assets/{TaskQueuePill-BlHNpYiZ.js.map → TaskQueuePill-D-4Ynf3K.js.map} +1 -1
  273. package/dashboard/dist/assets/{TasksListPage-OIcFFp1C.js → TasksListPage-e2teY0bD.js} +2 -2
  274. package/dashboard/dist/assets/{TasksListPage-OIcFFp1C.js.map → TasksListPage-e2teY0bD.js.map} +1 -1
  275. package/dashboard/dist/assets/{TimeAgo-OTC_55oZ.js → TimeAgo-Cvkpf_b3.js} +2 -2
  276. package/dashboard/dist/assets/{TimeAgo-OTC_55oZ.js.map → TimeAgo-Cvkpf_b3.js.map} +1 -1
  277. package/dashboard/dist/assets/{TimestampCell-CAwIj_AI.js → TimestampCell-B3btAV0N.js} +2 -2
  278. package/dashboard/dist/assets/{TimestampCell-CAwIj_AI.js.map → TimestampCell-B3btAV0N.js.map} +1 -1
  279. package/dashboard/dist/assets/{ToolPill-D40uLM_v.js → ToolPill-GsKQ80CO.js} +2 -2
  280. package/dashboard/dist/assets/{ToolPill-D40uLM_v.js.map → ToolPill-GsKQ80CO.js.map} +1 -1
  281. package/dashboard/dist/assets/{ToolTestPanel-8Vf6pfw4.js → ToolTestPanel-B03nebR7.js} +2 -2
  282. package/dashboard/dist/assets/{ToolTestPanel-8Vf6pfw4.js.map → ToolTestPanel-B03nebR7.js.map} +1 -1
  283. package/dashboard/dist/assets/{TopicDetailPage-iZW8rK9L.js → TopicDetailPage-DBRWne3O.js} +3 -3
  284. package/dashboard/dist/assets/{TopicDetailPage-iZW8rK9L.js.map → TopicDetailPage-DBRWne3O.js.map} +1 -1
  285. package/dashboard/dist/assets/{TopicsPage-CqiEcj-W.js → TopicsPage-CVe2M9HD.js} +2 -2
  286. package/dashboard/dist/assets/{TopicsPage-CqiEcj-W.js.map → TopicsPage-CVe2M9HD.js.map} +1 -1
  287. package/dashboard/dist/assets/{UserName-DQFjuoib.js → UserName-B_q_qp6V.js} +2 -2
  288. package/dashboard/dist/assets/{UserName-DQFjuoib.js.map → UserName-B_q_qp6V.js.map} +1 -1
  289. package/dashboard/dist/assets/WorkflowExecutionPage-Bh_dr9tM.js +2 -0
  290. package/dashboard/dist/assets/{WorkflowExecutionPage-Di08wCbs.js.map → WorkflowExecutionPage-Bh_dr9tM.js.map} +1 -1
  291. package/dashboard/dist/assets/{WorkflowPill-DJLcK_CM.js → WorkflowPill-D7244fKp.js} +2 -2
  292. package/dashboard/dist/assets/{WorkflowPill-DJLcK_CM.js.map → WorkflowPill-D7244fKp.js.map} +1 -1
  293. package/dashboard/dist/assets/{WorkflowsDashboard-Bb8HlrTJ.js → WorkflowsDashboard-DA6Mj7qH.js} +2 -2
  294. package/dashboard/dist/assets/{WorkflowsDashboard-Bb8HlrTJ.js.map → WorkflowsDashboard-DA6Mj7qH.js.map} +1 -1
  295. package/dashboard/dist/assets/{WorkflowsOverview-Dta1kurk.js → WorkflowsOverview-B1kBLj-a.js} +2 -2
  296. package/dashboard/dist/assets/{WorkflowsOverview-Dta1kurk.js.map → WorkflowsOverview-B1kBLj-a.js.map} +1 -1
  297. package/dashboard/dist/assets/{YamlWorkflowDetailPage-CfAajg68.js → YamlWorkflowDetailPage-6GJM8QIX.js} +8 -8
  298. package/dashboard/dist/assets/{YamlWorkflowDetailPage-CfAajg68.js.map → YamlWorkflowDetailPage-6GJM8QIX.js.map} +1 -1
  299. package/dashboard/dist/assets/{YamlWorkflowsPage-CQFUzT4t.js → YamlWorkflowsPage-Bu811C7f.js} +2 -2
  300. package/dashboard/dist/assets/{YamlWorkflowsPage-CQFUzT4t.js.map → YamlWorkflowsPage-Bu811C7f.js.map} +1 -1
  301. package/dashboard/dist/assets/{agents-PuftRTB2.js → agents-MPk_GnYz.js} +2 -2
  302. package/dashboard/dist/assets/{agents-PuftRTB2.js.map → agents-MPk_GnYz.js.map} +1 -1
  303. package/dashboard/dist/assets/{bots-BmEiPAWY.js → bots-2RihE2Tc.js} +2 -2
  304. package/dashboard/dist/assets/{bots-BmEiPAWY.js.map → bots-2RihE2Tc.js.map} +1 -1
  305. package/dashboard/dist/assets/{capabilities-CRii4Soa.js → capabilities-CC4iwJ1P.js} +2 -2
  306. package/dashboard/dist/assets/{capabilities-CRii4Soa.js.map → capabilities-CC4iwJ1P.js.map} +1 -1
  307. package/dashboard/dist/assets/{controlplane-DO_czaYo.js → controlplane-Bmkic8BH.js} +2 -2
  308. package/dashboard/dist/assets/{controlplane-DO_czaYo.js.map → controlplane-Bmkic8BH.js.map} +1 -1
  309. package/dashboard/dist/assets/{escalation-columns-CzCquCPh.js → escalation-columns-B0lhUUrQ.js} +2 -2
  310. package/dashboard/dist/assets/{escalation-columns-CzCquCPh.js.map → escalation-columns-B0lhUUrQ.js.map} +1 -1
  311. package/dashboard/dist/assets/{escalation-items-Cy0ZgJqV.js → escalation-items-7WFpPo46.js} +2 -2
  312. package/dashboard/dist/assets/{escalation-items-Cy0ZgJqV.js.map → escalation-items-7WFpPo46.js.map} +1 -1
  313. package/dashboard/dist/assets/index-B9uv-euR.css +1 -0
  314. package/dashboard/dist/assets/{index-DhSCCpqM.js → index-B_XV1rwu.js} +2 -2
  315. package/dashboard/dist/assets/{index-DhSCCpqM.js.map → index-B_XV1rwu.js.map} +1 -1
  316. package/dashboard/dist/assets/{index-Cx8xb-oU.js → index-C2CLfGwL.js} +2 -2
  317. package/dashboard/dist/assets/{index-Cx8xb-oU.js.map → index-C2CLfGwL.js.map} +1 -1
  318. package/dashboard/dist/assets/{index-Cga5IW3D.js → index-C3AeFihz.js} +2 -2
  319. package/dashboard/dist/assets/{index-Cga5IW3D.js.map → index-C3AeFihz.js.map} +1 -1
  320. package/dashboard/dist/assets/{index-DiaRlFYI.js → index-CBri8fYM.js} +2 -2
  321. package/dashboard/dist/assets/{index-DiaRlFYI.js.map → index-CBri8fYM.js.map} +1 -1
  322. package/dashboard/dist/assets/{index-CL_1VpGb.js → index-CRWsB7ZC.js} +2 -2
  323. package/dashboard/dist/assets/{index-CL_1VpGb.js.map → index-CRWsB7ZC.js.map} +1 -1
  324. package/dashboard/dist/assets/{index-XntldBd0.js → index-CTOv3G7a.js} +2 -2
  325. package/dashboard/dist/assets/{index-XntldBd0.js.map → index-CTOv3G7a.js.map} +1 -1
  326. package/dashboard/dist/assets/{index-CfP2nKRc.js → index-CcArGkzI.js} +3 -3
  327. package/dashboard/dist/assets/{index-CfP2nKRc.js.map → index-CcArGkzI.js.map} +1 -1
  328. package/dashboard/dist/assets/{index-Dz6R8-Dw.js → index-CkMHS-hG.js} +25 -25
  329. package/dashboard/dist/assets/index-CkMHS-hG.js.map +1 -0
  330. package/dashboard/dist/assets/index-CmsmwCyv.js +2 -0
  331. package/dashboard/dist/assets/{index-4YaDUcKd.js.map → index-CmsmwCyv.js.map} +1 -1
  332. package/dashboard/dist/assets/{index-2SM2_onB.js → index-CvJsvqIc.js} +2 -2
  333. package/dashboard/dist/assets/{index-2SM2_onB.js.map → index-CvJsvqIc.js.map} +1 -1
  334. package/dashboard/dist/assets/{index-Rwqrflm-.js → index-D-ilRyfy.js} +2 -2
  335. package/dashboard/dist/assets/{index-Rwqrflm-.js.map → index-D-ilRyfy.js.map} +1 -1
  336. package/dashboard/dist/assets/{index-CZ7A3AcD.js → index-DSUtfDXx.js} +2 -2
  337. package/dashboard/dist/assets/{index-CZ7A3AcD.js.map → index-DSUtfDXx.js.map} +1 -1
  338. package/dashboard/dist/assets/{index-jL2K6us4.js → index-Da6ycKyf.js} +2 -2
  339. package/dashboard/dist/assets/{index-jL2K6us4.js.map → index-Da6ycKyf.js.map} +1 -1
  340. package/dashboard/dist/assets/{knowledge-CeUqGPuo.js → knowledge-Bpbg20DC.js} +2 -2
  341. package/dashboard/dist/assets/{knowledge-CeUqGPuo.js.map → knowledge-Bpbg20DC.js.map} +1 -1
  342. package/dashboard/dist/assets/machines-BqOZZU-3.js +2 -0
  343. package/dashboard/dist/assets/machines-BqOZZU-3.js.map +1 -0
  344. package/dashboard/dist/assets/{mcp-Cx96NTeD.js → mcp-CmcUXYce.js} +2 -2
  345. package/dashboard/dist/assets/{mcp-Cx96NTeD.js.map → mcp-CmcUXYce.js.map} +1 -1
  346. package/dashboard/dist/assets/{mcp-query-XAzWl0gm.js → mcp-query-C8buQxN9.js} +2 -2
  347. package/dashboard/dist/assets/{mcp-query-XAzWl0gm.js.map → mcp-query-C8buQxN9.js.map} +1 -1
  348. package/dashboard/dist/assets/{personas--4kjwyOw.js → personas-C2n5oDmY.js} +2 -2
  349. package/dashboard/dist/assets/{personas--4kjwyOw.js.map → personas-C2n5oDmY.js.map} +1 -1
  350. package/dashboard/dist/assets/{pipelines-PgkwvG7f.js → pipelines-RKpSkFz7.js} +2 -2
  351. package/dashboard/dist/assets/{pipelines-PgkwvG7f.js.map → pipelines-RKpSkFz7.js.map} +1 -1
  352. package/dashboard/dist/assets/{tasks-CcYxdBa3.js → tasks-Dab4hExW.js} +2 -2
  353. package/dashboard/dist/assets/{tasks-CcYxdBa3.js.map → tasks-Dab4hExW.js.map} +1 -1
  354. package/dashboard/dist/assets/{topics-_lik7cNY.js → topics-FTMNP7r3.js} +2 -2
  355. package/dashboard/dist/assets/{topics-_lik7cNY.js.map → topics-FTMNP7r3.js.map} +1 -1
  356. package/dashboard/dist/assets/{useDebouncedValue-Bm_AoxVx.js → useDebouncedValue-B_1u1YIk.js} +2 -2
  357. package/dashboard/dist/assets/{useDebouncedValue-Bm_AoxVx.js.map → useDebouncedValue-B_1u1YIk.js.map} +1 -1
  358. package/dashboard/dist/assets/{useNamespace-DgXXKdx5.js → useNamespace-HUeAI7Qb.js} +2 -2
  359. package/dashboard/dist/assets/{useNamespace-DgXXKdx5.js.map → useNamespace-HUeAI7Qb.js.map} +1 -1
  360. package/dashboard/dist/assets/{useYamlActivityEvents-Dj2qtGSd.js → useYamlActivityEvents-Cax54qHH.js} +2 -2
  361. package/dashboard/dist/assets/{useYamlActivityEvents-Dj2qtGSd.js.map → useYamlActivityEvents-Cax54qHH.js.map} +1 -1
  362. package/dashboard/dist/assets/{validate-FlXCBBT6.js → validate-DxOaV7QS.js} +2 -2
  363. package/dashboard/dist/assets/{validate-FlXCBBT6.js.map → validate-DxOaV7QS.js.map} +1 -1
  364. package/dashboard/dist/assets/{vendor-icons-DUYcKTjP.js → vendor-icons-fxBvvHBi.js} +187 -182
  365. package/dashboard/dist/assets/vendor-icons-fxBvvHBi.js.map +1 -0
  366. package/dashboard/dist/assets/{yaml-workflows-B0_JxRYQ.js → yaml-workflows-BgY1XHJx.js} +2 -2
  367. package/dashboard/dist/assets/{yaml-workflows-B0_JxRYQ.js.map → yaml-workflows-BgY1XHJx.js.map} +1 -1
  368. package/dashboard/dist/index.html +3 -3
  369. package/docs/architecture.md +1 -0
  370. package/docs/code-owned-configuration.md +6 -0
  371. package/docs/dashboard.md +2 -1
  372. package/docs/events.md +34 -1
  373. package/docs/hitl/lookups.md +6 -4
  374. package/docs/machines.md +114 -28
  375. package/docs/mcp.md +19 -0
  376. package/package.json +1 -1
  377. package/dashboard/dist/assets/AgentsPage-C9UuUKhr.js +0 -2
  378. package/dashboard/dist/assets/AvailableEscalationsPage-DrvfXz70.js +0 -2
  379. package/dashboard/dist/assets/FilterBar-BygWrnB1.js +0 -2
  380. package/dashboard/dist/assets/FilterBar-BygWrnB1.js.map +0 -1
  381. package/dashboard/dist/assets/McpRunDetailPage-80fQn9iX.js +0 -2
  382. package/dashboard/dist/assets/WorkflowExecutionPage-Di08wCbs.js +0 -2
  383. package/dashboard/dist/assets/index-4YaDUcKd.js +0 -2
  384. package/dashboard/dist/assets/index-CnU7Jjz3.css +0 -1
  385. package/dashboard/dist/assets/index-Dz6R8-Dw.js.map +0 -1
  386. 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 a status query in flight; null when there is nothing to wait for. */
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 timer = setTimeout(() => {
17
- this.waiting.delete(key);
18
- resolve(null);
19
- }, timeoutMs);
20
- this.waiting.set(key, { resolve, timer });
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 w = this.waiting.get(key);
25
- if (!w)
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.resolve(value);
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 [, w] of this.waiting) {
34
- clearTimeout(w.timer);
35
- w.resolve(null);
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 a status query in flight; null when there is nothing to wait for. */
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
- /** Keep only units whose job the machine still lists (its snapshot). */
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
- this.openCommands = new Set();
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 Set();
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)?.delete(unitId);
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
- /** Keep only units whose job the machine still lists (its snapshot). */
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 (!jobIds.has(jobId))
126
- units.delete(unitId);
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.add(id);
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.add(`${address}>${machineId}`);
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;