@hotmeshio/long-tail 0.26.0 → 0.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (392) hide show
  1. package/README.md +9 -2
  2. package/build/api/settings.d.ts +4 -1
  3. package/build/api/settings.js +7 -1
  4. package/build/index.d.ts +4 -0
  5. package/build/index.js +35 -8
  6. package/build/lib/db/config-lock.d.ts +10 -0
  7. package/build/lib/db/config-lock.js +28 -0
  8. package/build/lib/db/schemas/041_machine_lines.sql +26 -0
  9. package/build/lib/events/browser-view.js +8 -2
  10. package/build/lib/events/nats.d.ts +11 -0
  11. package/build/lib/events/nats.js +33 -2
  12. package/build/lib/events/publish.d.ts +33 -0
  13. package/build/lib/events/publish.js +52 -1
  14. package/build/lib/machines/index.d.ts +1 -0
  15. package/build/lib/machines/index.js +1 -0
  16. package/build/lib/machines/line.d.ts +4 -1
  17. package/build/lib/machines/line.js +18 -1
  18. package/build/lib/machines/protocol/codec.d.ts +24 -0
  19. package/build/lib/machines/protocol/codec.js +10 -0
  20. package/build/lib/machines/protocol/constants.d.ts +1 -1
  21. package/build/lib/machines/protocol/constants.js +1 -1
  22. package/build/lib/machines/protocol/contract.js +12 -3
  23. package/build/lib/machines/site/edge-account.d.ts +11 -0
  24. package/build/lib/machines/site/edge-account.js +24 -0
  25. package/build/lib/machines/site/mosquitto-conf.d.ts +5 -4
  26. package/build/lib/machines/site/mosquitto-conf.js +31 -16
  27. package/build/lib/machines/site/site-conf.d.ts +16 -6
  28. package/build/lib/machines/site/site-conf.js +39 -13
  29. package/build/lib/machines/transport/callback-feed.d.ts +1 -0
  30. package/build/lib/machines/transport/callback-feed.js +4 -1
  31. package/build/lib/machines/transport/delivery.d.ts +3 -4
  32. package/build/lib/machines/transport/delivery.js +3 -8
  33. package/build/lib/machines/transport/index.d.ts +2 -0
  34. package/build/lib/machines/transport/index.js +2 -0
  35. package/build/lib/machines/transport/memory.d.ts +2 -0
  36. package/build/lib/machines/transport/memory.js +6 -0
  37. package/build/lib/machines/transport/mqtt-bus.d.ts +2 -0
  38. package/build/lib/machines/transport/mqtt-bus.js +4 -0
  39. package/build/lib/machines/transport/nats-bus.d.ts +8 -13
  40. package/build/lib/machines/transport/nats-bus.js +26 -43
  41. package/build/lib/machines/transport/nats-feed.d.ts +1 -0
  42. package/build/lib/machines/transport/nats-feed.js +6 -3
  43. package/build/lib/machines/transport/pubsub-feed.d.ts +18 -0
  44. package/build/lib/machines/transport/pubsub-feed.js +42 -0
  45. package/build/lib/machines/transport/stream-bus.d.ts +42 -0
  46. package/build/lib/machines/transport/stream-bus.js +61 -0
  47. package/build/lib/machines/transport/streams.d.ts +10 -14
  48. package/build/lib/machines/transport/streams.js +18 -61
  49. package/build/lib/messaging/config.d.ts +25 -0
  50. package/build/lib/messaging/config.js +55 -0
  51. package/build/lib/messaging/constants.d.ts +26 -0
  52. package/build/lib/messaging/constants.js +26 -0
  53. package/build/lib/messaging/index.d.ts +24 -0
  54. package/build/lib/messaging/index.js +65 -0
  55. package/build/lib/messaging/memory.d.ts +16 -0
  56. package/build/lib/messaging/memory.js +147 -0
  57. package/build/lib/messaging/nats/permissions.d.ts +13 -0
  58. package/build/lib/messaging/nats/permissions.js +22 -0
  59. package/build/lib/messaging/nats/provider.d.ts +30 -0
  60. package/build/lib/messaging/nats/provider.js +77 -0
  61. package/build/lib/messaging/nats/render-conf.d.ts +68 -0
  62. package/build/lib/messaging/nats/render-conf.js +58 -0
  63. package/build/lib/messaging/nats/streams.d.ts +26 -0
  64. package/build/lib/messaging/nats/streams.js +97 -0
  65. package/build/lib/messaging/subjects.d.ts +8 -0
  66. package/build/lib/messaging/subjects.js +25 -0
  67. package/build/modules/machines.d.ts +8 -0
  68. package/build/modules/machines.js +16 -0
  69. package/build/routes/index.js +2 -0
  70. package/build/routes/machines.d.ts +2 -0
  71. package/build/routes/machines.js +220 -0
  72. package/build/scripts/bambu-boat.d.ts +17 -0
  73. package/build/scripts/bambu-boat.js +134 -0
  74. package/build/scripts/bambu-print.d.ts +18 -0
  75. package/build/scripts/bambu-print.js +114 -0
  76. package/build/services/machines/commands.d.ts +5 -5
  77. package/build/services/machines/commands.js +3 -2
  78. package/build/services/machines/config.d.ts +8 -1
  79. package/build/services/machines/config.js +17 -7
  80. package/build/services/machines/contracts.d.ts +29 -2
  81. package/build/services/machines/contracts.js +12 -3
  82. package/build/services/machines/gateway/actions.d.ts +2 -1
  83. package/build/services/machines/gateway/admission.d.ts +15 -3
  84. package/build/services/machines/gateway/admission.js +29 -14
  85. package/build/services/machines/gateway/dispatcher.d.ts +19 -3
  86. package/build/services/machines/gateway/dispatcher.js +61 -13
  87. package/build/services/machines/gateway/executor.d.ts +18 -4
  88. package/build/services/machines/gateway/executor.js +99 -34
  89. package/build/services/machines/gateway/gateway.d.ts +22 -1
  90. package/build/services/machines/gateway/gateway.js +83 -28
  91. package/build/services/machines/gateway/index.d.ts +3 -0
  92. package/build/services/machines/gateway/index.js +3 -0
  93. package/build/services/machines/gateway/inspect.d.ts +17 -0
  94. package/build/services/machines/gateway/inspect.js +68 -0
  95. package/build/services/machines/gateway/lifecycle.d.ts +21 -0
  96. package/build/services/machines/gateway/lifecycle.js +89 -0
  97. package/build/services/machines/gateway/log.d.ts +8 -0
  98. package/build/services/machines/gateway/log.js +18 -0
  99. package/build/services/machines/gateway/pacing.d.ts +14 -0
  100. package/build/services/machines/gateway/pacing.js +27 -2
  101. package/build/services/machines/gateway/plan-escalation.js +21 -7
  102. package/build/services/machines/gateway/plan-machine.d.ts +5 -4
  103. package/build/services/machines/gateway/plan-machine.js +70 -19
  104. package/build/services/machines/gateway/project.d.ts +9 -0
  105. package/build/services/machines/gateway/project.js +55 -0
  106. package/build/services/machines/gateway/receipts.d.ts +3 -0
  107. package/build/services/machines/gateway/receipts.js +3 -1
  108. package/build/services/machines/gateway/reconcile.d.ts +2 -0
  109. package/build/services/machines/gateway/reconcile.js +16 -3
  110. package/build/services/machines/gateway/registration.js +1 -1
  111. package/build/services/machines/gateway/reply-waiter.d.ts +6 -3
  112. package/build/services/machines/gateway/reply-waiter.js +37 -16
  113. package/build/services/machines/gateway/state.d.ts +50 -4
  114. package/build/services/machines/gateway/state.js +77 -10
  115. package/build/services/machines/gateway/wire.d.ts +58 -0
  116. package/build/services/machines/gateway/wire.js +171 -0
  117. package/build/services/machines/index.d.ts +3 -0
  118. package/build/services/machines/index.js +2 -0
  119. package/build/services/machines/leadership.d.ts +17 -4
  120. package/build/services/machines/leadership.js +43 -18
  121. package/build/services/machines/line-index.d.ts +16 -0
  122. package/build/services/machines/line-index.js +39 -0
  123. package/build/services/machines/registry-sql.d.ts +31 -0
  124. package/build/services/machines/registry-sql.js +110 -0
  125. package/build/services/machines/registry-sync.d.ts +31 -0
  126. package/build/services/machines/registry-sync.js +81 -0
  127. package/build/services/machines/registry.d.ts +77 -0
  128. package/build/services/machines/registry.js +158 -0
  129. package/build/services/machines/rows.js +26 -2
  130. package/build/services/machines/select.d.ts +9 -2
  131. package/build/services/machines/select.js +20 -7
  132. package/build/services/machines/surface.d.ts +45 -5
  133. package/build/services/machines/surface.js +102 -16
  134. package/build/services/machines/testing/fake-long-tail.d.ts +1 -0
  135. package/build/services/machines/testing/fake-long-tail.js +6 -3
  136. package/build/start/adapters.js +11 -2
  137. package/build/start/apply-report.d.ts +1 -1
  138. package/build/start/apply-report.js +3 -25
  139. package/build/start/index.js +23 -5
  140. package/build/system/index.js +13 -0
  141. package/build/system/mcp-servers/admin/schemas.d.ts +22 -22
  142. package/build/system/mcp-servers/human-queue-schemas.d.ts +7 -7
  143. package/build/system/mcp-servers/machines-schemas.d.ts +35 -0
  144. package/build/system/mcp-servers/machines-schemas.js +35 -0
  145. package/build/system/mcp-servers/machines.d.ts +20 -0
  146. package/build/system/mcp-servers/machines.js +154 -0
  147. package/build/system/seed/tool-manifests-machines.d.ts +2 -0
  148. package/build/system/seed/tool-manifests-machines.js +88 -0
  149. package/build/tsconfig.tsbuildinfo +1 -1
  150. package/build/types/events.d.ts +6 -1
  151. package/build/types/index.d.ts +2 -0
  152. package/build/types/machines-view.d.ts +159 -0
  153. package/build/types/machines-view.js +7 -0
  154. package/build/types/machines.d.ts +6 -1
  155. package/build/types/messaging.d.ts +72 -0
  156. package/build/types/messaging.js +11 -0
  157. package/build/types/startup.d.ts +26 -1
  158. package/dashboard/dist/assets/{AdminDashboard-DlItqxFS.js → AdminDashboard-Bm7VG65H.js} +2 -2
  159. package/dashboard/dist/assets/{AdminDashboard-DlItqxFS.js.map → AdminDashboard-Bm7VG65H.js.map} +1 -1
  160. package/dashboard/dist/assets/{AgentConfigPage-BUmT4a7n.js → AgentConfigPage-aJF7Sdbc.js} +6 -6
  161. package/dashboard/dist/assets/{AgentConfigPage-BUmT4a7n.js.map → AgentConfigPage-aJF7Sdbc.js.map} +1 -1
  162. package/dashboard/dist/assets/{AgentDetailPage-Cww8rlBi.js → AgentDetailPage-GwwghhxT.js} +3 -3
  163. package/dashboard/dist/assets/{AgentDetailPage-Cww8rlBi.js.map → AgentDetailPage-GwwghhxT.js.map} +1 -1
  164. package/dashboard/dist/assets/AgentsPage-DVvCzZyg.js +2 -0
  165. package/dashboard/dist/assets/{AgentsPage-C9UuUKhr.js.map → AgentsPage-DVvCzZyg.js.map} +1 -1
  166. package/dashboard/dist/assets/AvailableEscalationsPage-Cxmcji_K.js +2 -0
  167. package/dashboard/dist/assets/{AvailableEscalationsPage-DrvfXz70.js.map → AvailableEscalationsPage-Cxmcji_K.js.map} +1 -1
  168. package/dashboard/dist/assets/{BotPicker-CDq9XRMp.js → BotPicker-CofRxk4L.js} +2 -2
  169. package/dashboard/dist/assets/{BotPicker-CDq9XRMp.js.map → BotPicker-CofRxk4L.js.map} +1 -1
  170. package/dashboard/dist/assets/{BulkAssignModal-jsvqtrEA.js → BulkAssignModal-BARWuz4L.js} +2 -2
  171. package/dashboard/dist/assets/{BulkAssignModal-jsvqtrEA.js.map → BulkAssignModal-BARWuz4L.js.map} +1 -1
  172. package/dashboard/dist/assets/{CapabilitiesPage-CSCrI6B1.js → CapabilitiesPage-BJAWVNEx.js} +2 -2
  173. package/dashboard/dist/assets/{CapabilitiesPage-CSCrI6B1.js.map → CapabilitiesPage-BJAWVNEx.js.map} +1 -1
  174. package/dashboard/dist/assets/{CollapsibleSection-uD9mn-CQ.js → CollapsibleSection-CtgoaG75.js} +2 -2
  175. package/dashboard/dist/assets/{CollapsibleSection-uD9mn-CQ.js.map → CollapsibleSection-CtgoaG75.js.map} +1 -1
  176. package/dashboard/dist/assets/{ConfirmDeleteModal-BRmx2hA4.js → ConfirmDeleteModal-BYXXBWs6.js} +2 -2
  177. package/dashboard/dist/assets/{ConfirmDeleteModal-BRmx2hA4.js.map → ConfirmDeleteModal-BYXXBWs6.js.map} +1 -1
  178. package/dashboard/dist/assets/{ConnectedAppsPage-DlMzE5a-.js → ConnectedAppsPage-D0JkzWa7.js} +2 -2
  179. package/dashboard/dist/assets/{ConnectedAppsPage-DlMzE5a-.js.map → ConnectedAppsPage-D0JkzWa7.js.map} +1 -1
  180. package/dashboard/dist/assets/{CountdownTimer-sRuM4eM5.js → CountdownTimer-BcFxdZYN.js} +2 -2
  181. package/dashboard/dist/assets/{CountdownTimer-sRuM4eM5.js.map → CountdownTimer-BcFxdZYN.js.map} +1 -1
  182. package/dashboard/dist/assets/{CredentialsPage-bLYydwqa.js → CredentialsPage-DPSY20rV.js} +2 -2
  183. package/dashboard/dist/assets/{CredentialsPage-bLYydwqa.js.map → CredentialsPage-DPSY20rV.js.map} +1 -1
  184. package/dashboard/dist/assets/{CronLabel-D_ATDL2N.js → CronLabel-Dg_Oew_Y.js} +2 -2
  185. package/dashboard/dist/assets/{CronLabel-D_ATDL2N.js.map → CronLabel-Dg_Oew_Y.js.map} +1 -1
  186. package/dashboard/dist/assets/{DropZone-u1JGfR9G.js → DropZone-Cl_Flb16.js} +2 -2
  187. package/dashboard/dist/assets/{DropZone-u1JGfR9G.js.map → DropZone-Cl_Flb16.js.map} +1 -1
  188. package/dashboard/dist/assets/{ElapsedCell-groSMfqB.js → ElapsedCell-Dm3G5fK2.js} +2 -2
  189. package/dashboard/dist/assets/{ElapsedCell-groSMfqB.js.map → ElapsedCell-Dm3G5fK2.js.map} +1 -1
  190. package/dashboard/dist/assets/{EntityTimelinePanel-D-F3_A9m.js → EntityTimelinePanel-CrEEP04e.js} +2 -2
  191. package/dashboard/dist/assets/{EntityTimelinePanel-D-F3_A9m.js.map → EntityTimelinePanel-CrEEP04e.js.map} +1 -1
  192. package/dashboard/dist/assets/{EscalationListSchemaPage-Bad6Jrmr.js → EscalationListSchemaPage-wOInXcjs.js} +3 -3
  193. package/dashboard/dist/assets/{EscalationListSchemaPage-Bad6Jrmr.js.map → EscalationListSchemaPage-wOInXcjs.js.map} +1 -1
  194. package/dashboard/dist/assets/{EscalationSchemaPage-BKi_npI9.js → EscalationSchemaPage-CrIj_g9d.js} +3 -3
  195. package/dashboard/dist/assets/{EscalationSchemaPage-BKi_npI9.js.map → EscalationSchemaPage-CrIj_g9d.js.map} +1 -1
  196. package/dashboard/dist/assets/{EscalationTimeline-DQUUm3b1.js → EscalationTimeline-CeAsl5IT.js} +2 -2
  197. package/dashboard/dist/assets/{EscalationTimeline-DQUUm3b1.js.map → EscalationTimeline-CeAsl5IT.js.map} +1 -1
  198. package/dashboard/dist/assets/{EscalationTitleSelect-3mhXh77a.js → EscalationTitleSelect-D8qpCYiy.js} +2 -2
  199. package/dashboard/dist/assets/{EscalationTitleSelect-3mhXh77a.js.map → EscalationTitleSelect-D8qpCYiy.js.map} +1 -1
  200. package/dashboard/dist/assets/{EscalationsOverview-Qaov-uML.js → EscalationsOverview-CvaqVPsr.js} +2 -2
  201. package/dashboard/dist/assets/{EscalationsOverview-Qaov-uML.js.map → EscalationsOverview-CvaqVPsr.js.map} +1 -1
  202. package/dashboard/dist/assets/{EventTable-V4RF_n58.js → EventTable-Be0JuEl6.js} +2 -2
  203. package/dashboard/dist/assets/{EventTable-V4RF_n58.js.map → EventTable-Be0JuEl6.js.map} +1 -1
  204. package/dashboard/dist/assets/FilterBar-BVyAjIgv.js +2 -0
  205. package/dashboard/dist/assets/FilterBar-BVyAjIgv.js.map +1 -0
  206. package/dashboard/dist/assets/{GraphInvokePage-Djslhf96.js → GraphInvokePage-D_QigJeD.js} +2 -2
  207. package/dashboard/dist/assets/{GraphInvokePage-Djslhf96.js.map → GraphInvokePage-D_QigJeD.js.map} +1 -1
  208. package/dashboard/dist/assets/{HomePage-EjcNxlKx.js → HomePage-C1haeuNy.js} +2 -2
  209. package/dashboard/dist/assets/{HomePage-EjcNxlKx.js.map → HomePage-C1haeuNy.js.map} +1 -1
  210. package/dashboard/dist/assets/LinePage-CWD5pv1g.js +5 -0
  211. package/dashboard/dist/assets/LinePage-CWD5pv1g.js.map +1 -0
  212. package/dashboard/dist/assets/LinesPage-NqChsKcO.js +3 -0
  213. package/dashboard/dist/assets/LinesPage-NqChsKcO.js.map +1 -0
  214. package/dashboard/dist/assets/{ListToolbar-RrEAePOX.js → ListToolbar-BZCNrTh6.js} +2 -2
  215. package/dashboard/dist/assets/{ListToolbar-RrEAePOX.js.map → ListToolbar-BZCNrTh6.js.map} +1 -1
  216. package/dashboard/dist/assets/{McpOverview-8gqiL3Vj.js → McpOverview-yJTYnh1z.js} +2 -2
  217. package/dashboard/dist/assets/{McpOverview-8gqiL3Vj.js.map → McpOverview-yJTYnh1z.js.map} +1 -1
  218. package/dashboard/dist/assets/{McpQueryDetailPage-COyn6Ak5.js → McpQueryDetailPage-ChuLpJ4u.js} +3 -3
  219. package/dashboard/dist/assets/{McpQueryDetailPage-COyn6Ak5.js.map → McpQueryDetailPage-ChuLpJ4u.js.map} +1 -1
  220. package/dashboard/dist/assets/{McpQueryPage-Dj6Qj72w.js → McpQueryPage-9S-v9soF.js} +2 -2
  221. package/dashboard/dist/assets/{McpQueryPage-Dj6Qj72w.js.map → McpQueryPage-9S-v9soF.js.map} +1 -1
  222. package/dashboard/dist/assets/McpRunDetailPage-BhrcfxD5.js +2 -0
  223. package/dashboard/dist/assets/{McpRunDetailPage-80fQn9iX.js.map → McpRunDetailPage-BhrcfxD5.js.map} +1 -1
  224. package/dashboard/dist/assets/{McpRunsPage-DaSsI-EM.js → McpRunsPage-C5_i8_Zx.js} +2 -2
  225. package/dashboard/dist/assets/{McpRunsPage-DaSsI-EM.js.map → McpRunsPage-C5_i8_Zx.js.map} +1 -1
  226. package/dashboard/dist/assets/{NamespacePill-C5epAgq6.js → NamespacePill-OTZD2hzt.js} +2 -2
  227. package/dashboard/dist/assets/{NamespacePill-C5epAgq6.js.map → NamespacePill-OTZD2hzt.js.map} +1 -1
  228. package/dashboard/dist/assets/{OperationsPage-BSu1o2gB.js → OperationsPage-C03CeU5P.js} +2 -2
  229. package/dashboard/dist/assets/{OperationsPage-BSu1o2gB.js.map → OperationsPage-C03CeU5P.js.map} +1 -1
  230. package/dashboard/dist/assets/{OperatorDashboard-HFI4WGIV.js → OperatorDashboard-BzC134Jt.js} +2 -2
  231. package/dashboard/dist/assets/{OperatorDashboard-HFI4WGIV.js.map → OperatorDashboard-BzC134Jt.js.map} +1 -1
  232. package/dashboard/dist/assets/{PageHeader-BSWIspNB.js → PageHeader-Hx8APPwE.js} +2 -2
  233. package/dashboard/dist/assets/{PageHeader-BSWIspNB.js.map → PageHeader-Hx8APPwE.js.map} +1 -1
  234. package/dashboard/dist/assets/{PageHeaderWithStats-DDjopQ-k.js → PageHeaderWithStats-BEQYYBJv.js} +2 -2
  235. package/dashboard/dist/assets/{PageHeaderWithStats-DDjopQ-k.js.map → PageHeaderWithStats-BEQYYBJv.js.map} +1 -1
  236. package/dashboard/dist/assets/{PersonaDetailPage-D0qlBuGi.js → PersonaDetailPage-D0mY9L6j.js} +2 -2
  237. package/dashboard/dist/assets/{PersonaDetailPage-D0qlBuGi.js.map → PersonaDetailPage-D0mY9L6j.js.map} +1 -1
  238. package/dashboard/dist/assets/{PersonasPage-BJClu-5H.js → PersonasPage-FFlm5Eug.js} +2 -2
  239. package/dashboard/dist/assets/{PersonasPage-BJClu-5H.js.map → PersonasPage-FFlm5Eug.js.map} +1 -1
  240. package/dashboard/dist/assets/{PortalPage-CucNZn_w.js → PortalPage-Cpc25uO-.js} +2 -2
  241. package/dashboard/dist/assets/{PortalPage-CucNZn_w.js.map → PortalPage-Cpc25uO-.js.map} +1 -1
  242. package/dashboard/dist/assets/{ProcessDetailPage-B9wMw0RV.js → ProcessDetailPage-Di2J7KwY.js} +2 -2
  243. package/dashboard/dist/assets/{ProcessDetailPage-B9wMw0RV.js.map → ProcessDetailPage-Di2J7KwY.js.map} +1 -1
  244. package/dashboard/dist/assets/{ProcessesListPage-B6k4RpmR.js → ProcessesListPage-BEXwU3Z0.js} +2 -2
  245. package/dashboard/dist/assets/{ProcessesListPage-B6k4RpmR.js.map → ProcessesListPage-BEXwU3Z0.js.map} +1 -1
  246. package/dashboard/dist/assets/{ResolverForm-ZVufJ4G-.js → ResolverForm-2ks-3jXC.js} +6 -6
  247. package/dashboard/dist/assets/{ResolverForm-ZVufJ4G-.js.map → ResolverForm-2ks-3jXC.js.map} +1 -1
  248. package/dashboard/dist/assets/{RoleDetailPage-CTbq0mz4.js → RoleDetailPage-DqoOk0xc.js} +3 -3
  249. package/dashboard/dist/assets/{RoleDetailPage-CTbq0mz4.js.map → RoleDetailPage-DqoOk0xc.js.map} +1 -1
  250. package/dashboard/dist/assets/{RolePill-CoETDpjF.js → RolePill-R5_ctGFy.js} +2 -2
  251. package/dashboard/dist/assets/{RolePill-CoETDpjF.js.map → RolePill-R5_ctGFy.js.map} +1 -1
  252. package/dashboard/dist/assets/{RolesPage-DBKxeam4.js → RolesPage-CPmo8Srr.js} +2 -2
  253. package/dashboard/dist/assets/{RolesPage-DBKxeam4.js.map → RolesPage-CPmo8Srr.js.map} +1 -1
  254. package/dashboard/dist/assets/{RosterWidget-BkLAwEYB.js → RosterWidget-D2yovCKw.js} +2 -2
  255. package/dashboard/dist/assets/{RosterWidget-BkLAwEYB.js.map → RosterWidget-D2yovCKw.js.map} +1 -1
  256. package/dashboard/dist/assets/{RunAsSelector-D2DC4iDf.js → RunAsSelector-CMv96On6.js} +2 -2
  257. package/dashboard/dist/assets/{RunAsSelector-D2DC4iDf.js.map → RunAsSelector-CMv96On6.js.map} +1 -1
  258. package/dashboard/dist/assets/{ScanCodesPage-BlKleaT0.js → ScanCodesPage-CA6cTT-M.js} +2 -2
  259. package/dashboard/dist/assets/{ScanCodesPage-BlKleaT0.js.map → ScanCodesPage-CA6cTT-M.js.map} +1 -1
  260. package/dashboard/dist/assets/{ScanSchemeDetailPage-CTW6gofi.js → ScanSchemeDetailPage-DnctN5-H.js} +2 -2
  261. package/dashboard/dist/assets/{ScanSchemeDetailPage-CTW6gofi.js.map → ScanSchemeDetailPage-DnctN5-H.js.map} +1 -1
  262. package/dashboard/dist/assets/{ScanStationPage-DPRjSPyT.js → ScanStationPage-Bk8RwkKL.js} +2 -2
  263. package/dashboard/dist/assets/{ScanStationPage-DPRjSPyT.js.map → ScanStationPage-Bk8RwkKL.js.map} +1 -1
  264. package/dashboard/dist/assets/{ScopeBadge-CGsTtqFr.js → ScopeBadge-BXZ084nD.js} +2 -2
  265. package/dashboard/dist/assets/{ScopeBadge-CGsTtqFr.js.map → ScopeBadge-BXZ084nD.js.map} +1 -1
  266. package/dashboard/dist/assets/{StickyPagination-CkmX3-Gu.js → StickyPagination-B0FSuUgs.js} +2 -2
  267. package/dashboard/dist/assets/{StickyPagination-CkmX3-Gu.js.map → StickyPagination-B0FSuUgs.js.map} +1 -1
  268. package/dashboard/dist/assets/{StreamMessageDetail-Xm_n510s.js → StreamMessageDetail-BwZEvMpP.js} +2 -2
  269. package/dashboard/dist/assets/{StreamMessageDetail-Xm_n510s.js.map → StreamMessageDetail-BwZEvMpP.js.map} +1 -1
  270. package/dashboard/dist/assets/{SwimlaneTimeline-De48aJan.js → SwimlaneTimeline-BDVQEaMw.js} +2 -2
  271. package/dashboard/dist/assets/{SwimlaneTimeline-De48aJan.js.map → SwimlaneTimeline-BDVQEaMw.js.map} +1 -1
  272. package/dashboard/dist/assets/{TagInput-S7UuVT_M.js → TagInput-DjPUDp2M.js} +2 -2
  273. package/dashboard/dist/assets/{TagInput-S7UuVT_M.js.map → TagInput-DjPUDp2M.js.map} +1 -1
  274. package/dashboard/dist/assets/{TaskDetailPage-HycMx3O9.js → TaskDetailPage-BOlv3iGB.js} +2 -2
  275. package/dashboard/dist/assets/{TaskDetailPage-HycMx3O9.js.map → TaskDetailPage-BOlv3iGB.js.map} +1 -1
  276. package/dashboard/dist/assets/{TaskQueuePill-BlHNpYiZ.js → TaskQueuePill-D-4Ynf3K.js} +2 -2
  277. package/dashboard/dist/assets/{TaskQueuePill-BlHNpYiZ.js.map → TaskQueuePill-D-4Ynf3K.js.map} +1 -1
  278. package/dashboard/dist/assets/{TasksListPage-OIcFFp1C.js → TasksListPage-e2teY0bD.js} +2 -2
  279. package/dashboard/dist/assets/{TasksListPage-OIcFFp1C.js.map → TasksListPage-e2teY0bD.js.map} +1 -1
  280. package/dashboard/dist/assets/{TimeAgo-OTC_55oZ.js → TimeAgo-Cvkpf_b3.js} +2 -2
  281. package/dashboard/dist/assets/{TimeAgo-OTC_55oZ.js.map → TimeAgo-Cvkpf_b3.js.map} +1 -1
  282. package/dashboard/dist/assets/{TimestampCell-CAwIj_AI.js → TimestampCell-B3btAV0N.js} +2 -2
  283. package/dashboard/dist/assets/{TimestampCell-CAwIj_AI.js.map → TimestampCell-B3btAV0N.js.map} +1 -1
  284. package/dashboard/dist/assets/{ToolPill-D40uLM_v.js → ToolPill-GsKQ80CO.js} +2 -2
  285. package/dashboard/dist/assets/{ToolPill-D40uLM_v.js.map → ToolPill-GsKQ80CO.js.map} +1 -1
  286. package/dashboard/dist/assets/{ToolTestPanel-8Vf6pfw4.js → ToolTestPanel-B03nebR7.js} +2 -2
  287. package/dashboard/dist/assets/{ToolTestPanel-8Vf6pfw4.js.map → ToolTestPanel-B03nebR7.js.map} +1 -1
  288. package/dashboard/dist/assets/{TopicDetailPage-iZW8rK9L.js → TopicDetailPage-DBRWne3O.js} +3 -3
  289. package/dashboard/dist/assets/{TopicDetailPage-iZW8rK9L.js.map → TopicDetailPage-DBRWne3O.js.map} +1 -1
  290. package/dashboard/dist/assets/{TopicsPage-CqiEcj-W.js → TopicsPage-CVe2M9HD.js} +2 -2
  291. package/dashboard/dist/assets/{TopicsPage-CqiEcj-W.js.map → TopicsPage-CVe2M9HD.js.map} +1 -1
  292. package/dashboard/dist/assets/{UserName-DQFjuoib.js → UserName-B_q_qp6V.js} +2 -2
  293. package/dashboard/dist/assets/{UserName-DQFjuoib.js.map → UserName-B_q_qp6V.js.map} +1 -1
  294. package/dashboard/dist/assets/WorkflowExecutionPage-Bh_dr9tM.js +2 -0
  295. package/dashboard/dist/assets/{WorkflowExecutionPage-Di08wCbs.js.map → WorkflowExecutionPage-Bh_dr9tM.js.map} +1 -1
  296. package/dashboard/dist/assets/{WorkflowPill-DJLcK_CM.js → WorkflowPill-D7244fKp.js} +2 -2
  297. package/dashboard/dist/assets/{WorkflowPill-DJLcK_CM.js.map → WorkflowPill-D7244fKp.js.map} +1 -1
  298. package/dashboard/dist/assets/{WorkflowsDashboard-Bb8HlrTJ.js → WorkflowsDashboard-DA6Mj7qH.js} +2 -2
  299. package/dashboard/dist/assets/{WorkflowsDashboard-Bb8HlrTJ.js.map → WorkflowsDashboard-DA6Mj7qH.js.map} +1 -1
  300. package/dashboard/dist/assets/{WorkflowsOverview-Dta1kurk.js → WorkflowsOverview-B1kBLj-a.js} +2 -2
  301. package/dashboard/dist/assets/{WorkflowsOverview-Dta1kurk.js.map → WorkflowsOverview-B1kBLj-a.js.map} +1 -1
  302. package/dashboard/dist/assets/{YamlWorkflowDetailPage-CfAajg68.js → YamlWorkflowDetailPage-6GJM8QIX.js} +8 -8
  303. package/dashboard/dist/assets/{YamlWorkflowDetailPage-CfAajg68.js.map → YamlWorkflowDetailPage-6GJM8QIX.js.map} +1 -1
  304. package/dashboard/dist/assets/{YamlWorkflowsPage-CQFUzT4t.js → YamlWorkflowsPage-Bu811C7f.js} +2 -2
  305. package/dashboard/dist/assets/{YamlWorkflowsPage-CQFUzT4t.js.map → YamlWorkflowsPage-Bu811C7f.js.map} +1 -1
  306. package/dashboard/dist/assets/{agents-PuftRTB2.js → agents-MPk_GnYz.js} +2 -2
  307. package/dashboard/dist/assets/{agents-PuftRTB2.js.map → agents-MPk_GnYz.js.map} +1 -1
  308. package/dashboard/dist/assets/{bots-BmEiPAWY.js → bots-2RihE2Tc.js} +2 -2
  309. package/dashboard/dist/assets/{bots-BmEiPAWY.js.map → bots-2RihE2Tc.js.map} +1 -1
  310. package/dashboard/dist/assets/{capabilities-CRii4Soa.js → capabilities-CC4iwJ1P.js} +2 -2
  311. package/dashboard/dist/assets/{capabilities-CRii4Soa.js.map → capabilities-CC4iwJ1P.js.map} +1 -1
  312. package/dashboard/dist/assets/{controlplane-DO_czaYo.js → controlplane-Bmkic8BH.js} +2 -2
  313. package/dashboard/dist/assets/{controlplane-DO_czaYo.js.map → controlplane-Bmkic8BH.js.map} +1 -1
  314. package/dashboard/dist/assets/{escalation-columns-CzCquCPh.js → escalation-columns-B0lhUUrQ.js} +2 -2
  315. package/dashboard/dist/assets/{escalation-columns-CzCquCPh.js.map → escalation-columns-B0lhUUrQ.js.map} +1 -1
  316. package/dashboard/dist/assets/{escalation-items-Cy0ZgJqV.js → escalation-items-7WFpPo46.js} +2 -2
  317. package/dashboard/dist/assets/{escalation-items-Cy0ZgJqV.js.map → escalation-items-7WFpPo46.js.map} +1 -1
  318. package/dashboard/dist/assets/index-B9uv-euR.css +1 -0
  319. package/dashboard/dist/assets/{index-DhSCCpqM.js → index-B_XV1rwu.js} +2 -2
  320. package/dashboard/dist/assets/{index-DhSCCpqM.js.map → index-B_XV1rwu.js.map} +1 -1
  321. package/dashboard/dist/assets/{index-Cx8xb-oU.js → index-C2CLfGwL.js} +2 -2
  322. package/dashboard/dist/assets/{index-Cx8xb-oU.js.map → index-C2CLfGwL.js.map} +1 -1
  323. package/dashboard/dist/assets/{index-Cga5IW3D.js → index-C3AeFihz.js} +2 -2
  324. package/dashboard/dist/assets/{index-Cga5IW3D.js.map → index-C3AeFihz.js.map} +1 -1
  325. package/dashboard/dist/assets/{index-DiaRlFYI.js → index-CBri8fYM.js} +2 -2
  326. package/dashboard/dist/assets/{index-DiaRlFYI.js.map → index-CBri8fYM.js.map} +1 -1
  327. package/dashboard/dist/assets/{index-CL_1VpGb.js → index-CRWsB7ZC.js} +2 -2
  328. package/dashboard/dist/assets/{index-CL_1VpGb.js.map → index-CRWsB7ZC.js.map} +1 -1
  329. package/dashboard/dist/assets/{index-XntldBd0.js → index-CTOv3G7a.js} +2 -2
  330. package/dashboard/dist/assets/{index-XntldBd0.js.map → index-CTOv3G7a.js.map} +1 -1
  331. package/dashboard/dist/assets/{index-CfP2nKRc.js → index-CcArGkzI.js} +3 -3
  332. package/dashboard/dist/assets/{index-CfP2nKRc.js.map → index-CcArGkzI.js.map} +1 -1
  333. package/dashboard/dist/assets/{index-Dz6R8-Dw.js → index-CkMHS-hG.js} +25 -25
  334. package/dashboard/dist/assets/index-CkMHS-hG.js.map +1 -0
  335. package/dashboard/dist/assets/index-CmsmwCyv.js +2 -0
  336. package/dashboard/dist/assets/{index-4YaDUcKd.js.map → index-CmsmwCyv.js.map} +1 -1
  337. package/dashboard/dist/assets/{index-2SM2_onB.js → index-CvJsvqIc.js} +2 -2
  338. package/dashboard/dist/assets/{index-2SM2_onB.js.map → index-CvJsvqIc.js.map} +1 -1
  339. package/dashboard/dist/assets/{index-Rwqrflm-.js → index-D-ilRyfy.js} +2 -2
  340. package/dashboard/dist/assets/{index-Rwqrflm-.js.map → index-D-ilRyfy.js.map} +1 -1
  341. package/dashboard/dist/assets/{index-CZ7A3AcD.js → index-DSUtfDXx.js} +2 -2
  342. package/dashboard/dist/assets/{index-CZ7A3AcD.js.map → index-DSUtfDXx.js.map} +1 -1
  343. package/dashboard/dist/assets/{index-jL2K6us4.js → index-Da6ycKyf.js} +2 -2
  344. package/dashboard/dist/assets/{index-jL2K6us4.js.map → index-Da6ycKyf.js.map} +1 -1
  345. package/dashboard/dist/assets/{knowledge-CeUqGPuo.js → knowledge-Bpbg20DC.js} +2 -2
  346. package/dashboard/dist/assets/{knowledge-CeUqGPuo.js.map → knowledge-Bpbg20DC.js.map} +1 -1
  347. package/dashboard/dist/assets/machines-BqOZZU-3.js +2 -0
  348. package/dashboard/dist/assets/machines-BqOZZU-3.js.map +1 -0
  349. package/dashboard/dist/assets/{mcp-Cx96NTeD.js → mcp-CmcUXYce.js} +2 -2
  350. package/dashboard/dist/assets/{mcp-Cx96NTeD.js.map → mcp-CmcUXYce.js.map} +1 -1
  351. package/dashboard/dist/assets/{mcp-query-XAzWl0gm.js → mcp-query-C8buQxN9.js} +2 -2
  352. package/dashboard/dist/assets/{mcp-query-XAzWl0gm.js.map → mcp-query-C8buQxN9.js.map} +1 -1
  353. package/dashboard/dist/assets/{personas--4kjwyOw.js → personas-C2n5oDmY.js} +2 -2
  354. package/dashboard/dist/assets/{personas--4kjwyOw.js.map → personas-C2n5oDmY.js.map} +1 -1
  355. package/dashboard/dist/assets/{pipelines-PgkwvG7f.js → pipelines-RKpSkFz7.js} +2 -2
  356. package/dashboard/dist/assets/{pipelines-PgkwvG7f.js.map → pipelines-RKpSkFz7.js.map} +1 -1
  357. package/dashboard/dist/assets/{tasks-CcYxdBa3.js → tasks-Dab4hExW.js} +2 -2
  358. package/dashboard/dist/assets/{tasks-CcYxdBa3.js.map → tasks-Dab4hExW.js.map} +1 -1
  359. package/dashboard/dist/assets/{topics-_lik7cNY.js → topics-FTMNP7r3.js} +2 -2
  360. package/dashboard/dist/assets/{topics-_lik7cNY.js.map → topics-FTMNP7r3.js.map} +1 -1
  361. package/dashboard/dist/assets/{useDebouncedValue-Bm_AoxVx.js → useDebouncedValue-B_1u1YIk.js} +2 -2
  362. package/dashboard/dist/assets/{useDebouncedValue-Bm_AoxVx.js.map → useDebouncedValue-B_1u1YIk.js.map} +1 -1
  363. package/dashboard/dist/assets/{useNamespace-DgXXKdx5.js → useNamespace-HUeAI7Qb.js} +2 -2
  364. package/dashboard/dist/assets/{useNamespace-DgXXKdx5.js.map → useNamespace-HUeAI7Qb.js.map} +1 -1
  365. package/dashboard/dist/assets/{useYamlActivityEvents-Dj2qtGSd.js → useYamlActivityEvents-Cax54qHH.js} +2 -2
  366. package/dashboard/dist/assets/{useYamlActivityEvents-Dj2qtGSd.js.map → useYamlActivityEvents-Cax54qHH.js.map} +1 -1
  367. package/dashboard/dist/assets/{validate-FlXCBBT6.js → validate-DxOaV7QS.js} +2 -2
  368. package/dashboard/dist/assets/{validate-FlXCBBT6.js.map → validate-DxOaV7QS.js.map} +1 -1
  369. package/dashboard/dist/assets/{vendor-icons-DUYcKTjP.js → vendor-icons-fxBvvHBi.js} +187 -182
  370. package/dashboard/dist/assets/vendor-icons-fxBvvHBi.js.map +1 -0
  371. package/dashboard/dist/assets/{yaml-workflows-B0_JxRYQ.js → yaml-workflows-BgY1XHJx.js} +2 -2
  372. package/dashboard/dist/assets/{yaml-workflows-B0_JxRYQ.js.map → yaml-workflows-BgY1XHJx.js.map} +1 -1
  373. package/dashboard/dist/index.html +3 -3
  374. package/docs/architecture.md +1 -0
  375. package/docs/code-owned-configuration.md +6 -0
  376. package/docs/dashboard.md +1 -0
  377. package/docs/events.md +83 -4
  378. package/docs/machines.md +129 -23
  379. package/docs/mcp.md +19 -0
  380. package/package.json +3 -1
  381. package/build/lib/machines/transport/nats-durable.d.ts +0 -11
  382. package/build/lib/machines/transport/nats-durable.js +0 -28
  383. package/dashboard/dist/assets/AgentsPage-C9UuUKhr.js +0 -2
  384. package/dashboard/dist/assets/AvailableEscalationsPage-DrvfXz70.js +0 -2
  385. package/dashboard/dist/assets/FilterBar-BygWrnB1.js +0 -2
  386. package/dashboard/dist/assets/FilterBar-BygWrnB1.js.map +0 -1
  387. package/dashboard/dist/assets/McpRunDetailPage-80fQn9iX.js +0 -2
  388. package/dashboard/dist/assets/WorkflowExecutionPage-Di08wCbs.js +0 -2
  389. package/dashboard/dist/assets/index-4YaDUcKd.js +0 -2
  390. package/dashboard/dist/assets/index-CnU7Jjz3.css +0 -1
  391. package/dashboard/dist/assets/index-Dz6R8-Dw.js.map +0 -1
  392. package/dashboard/dist/assets/vendor-icons-DUYcKTjP.js.map +0 -1
@@ -9,6 +9,7 @@
9
9
  import { type LineCodec, type MachineIdent } from '../../../lib/machines/protocol';
10
10
  import type { MachineBus } from '../../../lib/machines/transport';
11
11
  import { type GatewayLog } from './log';
12
+ import type { WireRecorder } from './wire';
12
13
  /** Most message ids one receipt carries. */
13
14
  export declare const MAX_RECEIPT_IDS = 100;
14
15
  export interface ReceiptDeps {
@@ -17,6 +18,8 @@ export interface ReceiptDeps {
17
18
  /** How long ids gather before a receipt goes out. */
18
19
  delayMs: number;
19
20
  log: GatewayLog;
21
+ /** Records each receipt the gateway sends, for the line's wire view. */
22
+ wire?: Pick<WireRecorder, 'receipt'>;
20
23
  }
21
24
  export declare class ReceiptBatcher {
22
25
  private readonly d;
@@ -58,8 +58,10 @@ class ReceiptBatcher {
58
58
  this.sending.add(work);
59
59
  }
60
60
  async publish(ident, ids) {
61
- for (const wire of this.d.codec.receipt(ident, ids))
61
+ for (const wire of this.d.codec.receipt(ident, ids)) {
62
62
  await this.d.bus.publish(wire.topic, wire.payload);
63
+ this.d.wire?.receipt(ident, ids, wire);
64
+ }
63
65
  }
64
66
  }
65
67
  exports.ReceiptBatcher = ReceiptBatcher;
@@ -31,3 +31,5 @@ export declare function alarmsClearedMeanwhile(state: GatewayState, active: Set<
31
31
  * arrivals it holds.
32
32
  */
33
33
  export declare function arrivalsOnRows(state: GatewayState, lt: LineEscalations, dispatchTtlMs: number): Promise<Action[]>;
34
+ /** With lifecycle notes on, the items each handoff out of a machine already holds, so a restart notes nothing twice. */
35
+ export declare function notesOnRows(state: GatewayState, lt: LineEscalations): Promise<void>;
@@ -10,6 +10,7 @@ exports.restoreLineRows = restoreLineRows;
10
10
  exports.restoreAddresses = restoreAddresses;
11
11
  exports.alarmsClearedMeanwhile = alarmsClearedMeanwhile;
12
12
  exports.arrivalsOnRows = arrivalsOnRows;
13
+ exports.notesOnRows = notesOnRows;
13
14
  const contracts_1 = require("../contracts");
14
15
  const line_1 = require("../../../lib/machines/line");
15
16
  const jobs_1 = require("./jobs");
@@ -21,8 +22,8 @@ async function restoreLineRows(state, lt, line) {
21
22
  const [alarms, offline, quiet, registrations] = await Promise.all([contracts_1.ROW_TYPE.ALARM, contracts_1.ROW_TYPE.MACHINE_OFFLINE, contracts_1.ROW_TYPE.MACHINE_QUIET, contracts_1.ROW_TYPE.MACHINE_REGISTRATION]
22
23
  .map(async (type) => (await lt.listOpen({ type, role })).filter(mine)));
23
24
  for (const row of alarms) {
24
- const { machineId, alarmId, raisedAt } = row.metadata;
25
- state.alarms.set(state.alarmKey(machineId, alarmId), { machineId, alarmId, raisedAt, rowId: row.id, open: true });
25
+ const { machineId, alarmId, raisedAt, level } = row.metadata;
26
+ state.alarms.set(state.alarmKey(machineId, alarmId), { machineId, alarmId, raisedAt, level, rowId: row.id, open: true });
26
27
  }
27
28
  for (const row of offline) {
28
29
  const link = state.link(row.metadata.machineId);
@@ -32,7 +33,7 @@ async function restoreLineRows(state, lt, line) {
32
33
  for (const row of quiet)
33
34
  state.link(row.metadata.machineId).quietRowId = row.id;
34
35
  for (const row of registrations)
35
- state.raiseClaim(row.metadata.address, row.metadata.machineId);
36
+ state.raiseClaim(row.metadata.address, row.metadata.machineId, row.id);
36
37
  return { alarms: alarms.length, offline: offline.length, quiet: quiet.length, registrations: registrations.length };
37
38
  }
38
39
  /** The addresses the line learned before, for the stations that still learn theirs. */
@@ -65,6 +66,7 @@ async function arrivalsOnRows(state, lt, dispatchTtlMs) {
65
66
  if (!to || (row.dispatch !== state_1.DISPATCH_STATE.ARRIVING && row.dispatch !== state_1.DISPATCH_STATE.ACCEPTED))
66
67
  continue;
67
68
  const items = await lt.items(row.id);
69
+ row.noted = items.map((i) => i.itemKey);
68
70
  const units = row.units.map((u) => u.unitId);
69
71
  const { arrived, missing } = (0, contracts_1.handoffProgress)(units, items);
70
72
  for (const job of (0, jobs_1.dispatchJobs)(row.jobId, row.units, state.unitsPerDispatch)) {
@@ -80,7 +82,18 @@ async function arrivalsOnRows(state, lt, dispatchTtlMs) {
80
82
  }
81
83
  const byUnit = new Map(items.filter((i) => (0, contracts_1.arrivedUnit)(i.itemKey)).map((i) => [i.payload.unitId, i.payload]));
82
84
  row.arrivals = Object.fromEntries(units.map((u) => [u, byUnit.get(u)?.arrival ?? { unitId: u, carrierId: byUnit.get(u)?.carrierId ?? null }]));
85
+ for (const arrival of byUnit.values())
86
+ row.dueAt = (0, pacing_1.latestArrival)(row.dueAt, arrival.at);
83
87
  actions.push((0, pacing_1.dispatchAction)(row, to, dispatchTtlMs));
84
88
  }
85
89
  return actions;
86
90
  }
91
+ /** With lifecycle notes on, the items each handoff out of a machine already holds, so a restart notes nothing twice. */
92
+ async function notesOnRows(state, lt) {
93
+ if (!state.lifecycle)
94
+ return;
95
+ for (const row of state.open()) {
96
+ if (row.fromMachine && !row.noted)
97
+ row.noted = (await lt.items(row.id)).map((i) => i.itemKey);
98
+ }
99
+ }
@@ -106,7 +106,7 @@ function planRegistrationRow(state, line, event) {
106
106
  if (typeof md.machineId !== 'string' || typeof md.address !== 'string')
107
107
  return [];
108
108
  if (event.verb === 'created') {
109
- state.raiseClaim(md.address, md.machineId);
109
+ state.raiseClaim(md.address, md.machineId, event.escalationId);
110
110
  return [];
111
111
  }
112
112
  state.settleClaim(md.address, md.machineId);
@@ -1,12 +1,15 @@
1
1
  /**
2
2
  * Command replies by cmdId, and machine snapshots by machine. A wait registers
3
3
  * before the command is published and resolves with the reply, or null at the
4
- * deadline.
4
+ * deadline. Several waits on one key are all settled by the next answer, so
5
+ * two dispatches asking one machine what it holds share its next snapshot.
5
6
  */
6
7
  export interface CommandReply {
7
8
  cmdId: string;
8
9
  status: string;
9
10
  reason: string;
11
+ /** The machine's structured code for the outcome, when its reply carried one. */
12
+ code?: string;
10
13
  }
11
14
  /** The jobs a machine reports holding, queued or in work. */
12
15
  export type HeldJobs = Set<string>;
@@ -16,9 +19,9 @@ export declare class ReplyWaiter {
16
19
  wait(cmdId: string, timeoutMs: number): Promise<CommandReply | null>;
17
20
  /** True when a waiter took the reply. */
18
21
  settle(reply: CommandReply): boolean;
19
- /** The next snapshot from `machineId`, or null at the deadline. */
22
+ /** The next snapshot from `machineId`, or null at the deadline; every wait in flight for the machine gets it. */
20
23
  waitSnapshot(machineId: string, timeoutMs: number): Promise<HeldJobs | null>;
21
- /** Answer a status query in flight; null when there is nothing to wait for. */
24
+ /** Answer the status queries in flight; null when there is nothing to wait for. */
22
25
  settleSnapshot(machineId: string, jobs: HeldJobs | null): void;
23
26
  cancelAll(): void;
24
27
  }
@@ -2,7 +2,8 @@
2
2
  /**
3
3
  * Command replies by cmdId, and machine snapshots by machine. A wait registers
4
4
  * before the command is published and resolves with the reply, or null at the
5
- * deadline.
5
+ * deadline. Several waits on one key are all settled by the next answer, so
6
+ * two dispatches asking one machine what it holds share its next snapshot.
6
7
  */
7
8
  Object.defineProperty(exports, "__esModule", { value: true });
8
9
  exports.ReplyWaiter = void 0;
@@ -11,31 +12,51 @@ class Waits {
11
12
  this.waiting = new Map();
12
13
  }
13
14
  wait(key, timeoutMs) {
14
- this.waiting.get(key)?.resolve(null);
15
15
  return new Promise((resolve) => {
16
- const 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,15 +35,26 @@ export interface HandoffRow extends HandoffFacets {
33
35
  trace?: TraceEntry[];
34
36
  /** Each unit's arrival event, as its receiver reported it (dispatch on arrival). */
35
37
  arrivals?: Record<string, Record<string, any>>;
38
+ /** Lifecycle item keys already on the row (lifecycle.ts). */
39
+ noted?: string[];
40
+ /** Parked with a limit on its items, which lifecycle notes must never use up. */
41
+ capped?: boolean;
42
+ /** When the row was created (epoch ms). */
43
+ createdAt?: number;
44
+ /** When its last unit arrived (epoch ms, dispatch on arrival); its dispatch windows count from here, else from createdAt. */
45
+ dueAt?: number;
36
46
  }
37
47
  export interface AlarmTrack {
38
48
  machineId: string;
39
49
  alarmId: string;
40
50
  /** When the machine raised it; a reused alarm id with a new time is a new alarm. */
41
51
  raisedAt?: string;
52
+ level?: string;
42
53
  rowId?: string;
43
54
  /** Created and not yet resolved by anyone. */
44
55
  open: boolean;
56
+ /** Rows the alarm paused, noted again when it clears. */
57
+ noted?: string[];
45
58
  }
46
59
  export interface LinkTrack {
47
60
  online: boolean;
@@ -52,12 +65,35 @@ export interface LinkTrack {
52
65
  watching?: boolean;
53
66
  software?: string;
54
67
  bootId?: string;
68
+ /** The machine's connection, when its presence names one; a new one while online is a reconnect to resync. */
69
+ sessionId?: string;
70
+ /** Why the machine went offline, when its presence said. */
71
+ reason?: string;
72
+ /** The jobs its last snapshot listed, as the codec reported them. */
73
+ jobs?: unknown[];
74
+ }
75
+ /** One unit a machine holds: the job it arrived under. */
76
+ export interface HeldUnit {
77
+ unitId: string;
78
+ jobId: string;
55
79
  }
56
80
  export declare class GatewayState {
57
81
  /** Units one dispatch may carry, from the codec; null when any number may. */
58
82
  unitsPerDispatch: number | null;
59
83
  /** Jobs go to a receiver once its units arrive there, from the codec. */
60
84
  dispatchOnArrival: boolean;
85
+ /** Commands of the machines' own that a machine-command row may ask for, from the codec. */
86
+ rowOps: readonly string[];
87
+ /** Note each job's start, progress steps and pauses on the row that holds it (lifecycle.ts). */
88
+ lifecycle: boolean;
89
+ /** Active alarms are retained on the broker; otherwise snapshots list them (codec.ts retainedAlarms). */
90
+ retainedAlarms: boolean;
91
+ /** Reading the broker's retained messages on taking the line; a snapshot read back may be older than its alarms. */
92
+ readingRetained: boolean;
93
+ /** When this gateway took the line (epoch ms); a command for an older row may have been sent by an earlier one. */
94
+ takenAt: number;
95
+ /** With lifecycle notes, progress is noted each time it crosses this many percent; 0 notes none. */
96
+ progressStep: number;
61
97
  /** While reconciling, new handoffs wait so pacing sees the whole line before anything is sent. */
62
98
  holdDispatch: boolean;
63
99
  /** Units at each machine that arrived and have not left: machine → unit → job. */
@@ -67,6 +103,7 @@ export declare class GatewayState {
67
103
  readonly alarms: Map<string, AlarmTrack>;
68
104
  /** Finished records that came before their row: machine/unit → job body. */
69
105
  private earlyFinishes;
106
+ /** Open machine-command rows → the machine each commands. */
70
107
  private openCommands;
71
108
  /** Accepted dispatch command ids → their row, so a later failure finds the row. */
72
109
  private dispatches;
@@ -77,7 +114,7 @@ export declare class GatewayState {
77
114
  /** Learned addresses, both ways: station → address and address → station. */
78
115
  private addressOfStation;
79
116
  private stationOfAddress;
80
- /** Contested claims already raised as registration rows, `${address}>${station}`. */
117
+ /** Contested claims already raised as registration rows, `${address}>${station}` → the row. */
81
118
  private claims;
82
119
  /** Contested claims heard from the machines themselves, `${address}>${station}`. */
83
120
  private heard;
@@ -96,23 +133,28 @@ export declare class GatewayState {
96
133
  /** The job a unit arrived under at `machineId`, while it is still there. */
97
134
  heldJob(machineId: string, unitId: string): string | undefined;
98
135
  heldAt(machineId: string): string[];
136
+ heldUnitsAt(machineId: string): HeldUnit[];
99
137
  /** Keep only units whose job the machine still lists (its snapshot). */
100
138
  keepHeld(machineId: string, jobIds: Set<string>): void;
101
139
  /** Keep a sender's finished record until its row is known, so an arrival cannot close the row without it. */
102
140
  rememberFinish(machineId: string, unitId: string, body: Record<string, any>): void;
103
141
  takeFinish(machineId: string, unitId: string): Record<string, any> | undefined;
104
142
  rememberDispatch(cmdId: string, rowId: string): void;
105
- /** The open row an accepted dispatch command belongs to. */
143
+ /** The row a dispatch command belongs to, open or recently closed. */
106
144
  rowForDispatch(cmdId: string): HandoffRow | undefined;
107
145
  /** Track a machine-command row; false when it is already tracked or has ended. */
108
- trackCommand(id: string): boolean;
146
+ trackCommand(id: string, machineId?: string): boolean;
147
+ /** Open machine-command rows for one machine. */
148
+ openCommandsFor(machineId: string): number;
109
149
  endCommand(id: string): void;
110
150
  /** Bind a station to an address, replacing whatever either was bound to before. */
111
151
  bindAddress(machineId: string, address: string): void;
112
152
  learnedAddress(machineId: string): string | undefined;
113
153
  stationAt(address: string): string | undefined;
114
154
  claimRaised(address: string, machineId: string): boolean;
115
- raiseClaim(address: string, machineId: string): void;
155
+ raiseClaim(address: string, machineId: string, rowId?: string): void;
156
+ /** The contested claims waiting for a person, with the rows that ask. */
157
+ contested(): ContestedClaimView[];
116
158
  settleClaim(address: string, machineId: string): void;
117
159
  hearClaim(address: string, machineId: string): void;
118
160
  claimHeard(address: string, machineId: string): boolean;
@@ -122,4 +164,8 @@ export declare class GatewayState {
122
164
  raiseViolation(key: string): void;
123
165
  link(machineId: string, now?: number): LinkTrack;
124
166
  alarmKey(machineId: string, alarmId: string): string;
167
+ /** The line as this gateway sees it (project.ts). */
168
+ project(line: LineDef): LineView;
169
+ /** A copy a dry run may change without touching the line. */
170
+ clone(): GatewayState;
125
171
  }
@@ -7,6 +7,7 @@
7
7
  */
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.GatewayState = exports.ROW_END = exports.DISPATCH_STATE = void 0;
10
+ const project_1 = require("./project");
10
11
  const trace_1 = require("./trace");
11
12
  /**
12
13
  * WAITING: the machine has no room yet (pacing.ts); the row waits in its role queue.
@@ -16,6 +17,10 @@ exports.DISPATCH_STATE = {
16
17
  NONE: 'none', WAITING: 'waiting', ARRIVING: 'arriving', PENDING: 'pending', ACCEPTED: 'accepted', REFUSED: 'refused',
17
18
  };
18
19
  exports.ROW_END = { RESOLVED: 'resolved', CANCELLED: 'cancelled', EXPIRED: 'expired' };
20
+ function copyInto(from, into, clone = (v) => v) {
21
+ for (const [k, v] of from)
22
+ into.set(k, clone(v));
23
+ }
19
24
  const CLOSED_LIMIT = 2_000;
20
25
  class GatewayState {
21
26
  constructor() {
@@ -23,6 +28,18 @@ class GatewayState {
23
28
  this.unitsPerDispatch = null;
24
29
  /** Jobs go to a receiver once its units arrive there, from the codec. */
25
30
  this.dispatchOnArrival = false;
31
+ /** Commands of the machines' own that a machine-command row may ask for, from the codec. */
32
+ this.rowOps = [];
33
+ /** Note each job's start, progress steps and pauses on the row that holds it (lifecycle.ts). */
34
+ this.lifecycle = false;
35
+ /** Active alarms are retained on the broker; otherwise snapshots list them (codec.ts retainedAlarms). */
36
+ this.retainedAlarms = false;
37
+ /** Reading the broker's retained messages on taking the line; a snapshot read back may be older than its alarms. */
38
+ this.readingRetained = false;
39
+ /** When this gateway took the line (epoch ms); a command for an older row may have been sent by an earlier one. */
40
+ this.takenAt = 0;
41
+ /** With lifecycle notes, progress is noted each time it crosses this many percent; 0 notes none. */
42
+ this.progressStep = 25;
26
43
  /** While reconciling, new handoffs wait so pacing sees the whole line before anything is sent. */
27
44
  this.holdDispatch = false;
28
45
  /** Units at each machine that arrived and have not left: machine → unit → job. */
@@ -32,7 +49,8 @@ class GatewayState {
32
49
  this.alarms = new Map();
33
50
  /** Finished records that came before their row: machine/unit → job body. */
34
51
  this.earlyFinishes = new Map();
35
- this.openCommands = new Set();
52
+ /** Open machine-command rows → the machine each commands. */
53
+ this.openCommands = new Map();
36
54
  /** Accepted dispatch command ids → their row, so a later failure finds the row. */
37
55
  this.dispatches = new Map();
38
56
  this.endedCommands = new Set();
@@ -42,8 +60,8 @@ class GatewayState {
42
60
  /** Learned addresses, both ways: station → address and address → station. */
43
61
  this.addressOfStation = new Map();
44
62
  this.stationOfAddress = new Map();
45
- /** Contested claims already raised as registration rows, `${address}>${station}`. */
46
- this.claims = new Set();
63
+ /** Contested claims already raised as registration rows, `${address}>${station}` → the row. */
64
+ this.claims = new Map();
47
65
  /** Contested claims heard from the machines themselves, `${address}>${station}`. */
48
66
  this.heard = new Set();
49
67
  /** Addresses heard that claim no station, logged once each. */
@@ -55,7 +73,10 @@ class GatewayState {
55
73
  const existing = this.openRows.get(row.id);
56
74
  // An event may carry metadata older than what the gateway already wrote: keep both traces.
57
75
  this.openRows.set(row.id, existing
58
- ? { ...row, dispatch: existing.dispatch, trace: (0, trace_1.mergeTrace)(row.trace, existing.trace), arrivals: existing.arrivals }
76
+ ? {
77
+ ...row, dispatch: existing.dispatch, trace: (0, trace_1.mergeTrace)(row.trace, existing.trace), arrivals: existing.arrivals,
78
+ dueAt: existing.dueAt, noted: existing.noted ?? row.noted,
79
+ }
59
80
  : row);
60
81
  }
61
82
  get(id) {
@@ -103,6 +124,9 @@ class GatewayState {
103
124
  heldAt(machineId) {
104
125
  return [...(this.held.get(machineId)?.values() ?? [])];
105
126
  }
127
+ heldUnitsAt(machineId) {
128
+ return [...(this.held.get(machineId)?.entries() ?? [])].map(([unitId, jobId]) => ({ unitId, jobId }));
129
+ }
106
130
  /** Keep only units whose job the machine still lists (its snapshot). */
107
131
  keepHeld(machineId, jobIds) {
108
132
  const units = this.held.get(machineId);
@@ -135,18 +159,22 @@ class GatewayState {
135
159
  this.dispatches.delete(oldest);
136
160
  }
137
161
  }
138
- /** The open row an accepted dispatch command belongs to. */
162
+ /** The row a dispatch command belongs to, open or recently closed. */
139
163
  rowForDispatch(cmdId) {
140
164
  const rowId = this.dispatches.get(cmdId);
141
- return rowId ? this.openRows.get(rowId) : undefined;
165
+ return rowId ? this.openRows.get(rowId) ?? this.closedRows.get(rowId) : undefined;
142
166
  }
143
167
  /** Track a machine-command row; false when it is already tracked or has ended. */
144
- trackCommand(id) {
168
+ trackCommand(id, machineId = '') {
145
169
  if (this.openCommands.has(id) || this.endedCommands.has(id))
146
170
  return false;
147
- this.openCommands.add(id);
171
+ this.openCommands.set(id, machineId);
148
172
  return true;
149
173
  }
174
+ /** Open machine-command rows for one machine. */
175
+ openCommandsFor(machineId) {
176
+ return [...this.openCommands.values()].filter((m) => m === machineId).length;
177
+ }
150
178
  endCommand(id) {
151
179
  this.openCommands.delete(id);
152
180
  this.endedCommands.add(id);
@@ -176,8 +204,15 @@ class GatewayState {
176
204
  claimRaised(address, machineId) {
177
205
  return this.claims.has(`${address}>${machineId}`);
178
206
  }
179
- raiseClaim(address, machineId) {
180
- this.claims.add(`${address}>${machineId}`);
207
+ raiseClaim(address, machineId, rowId) {
208
+ this.claims.set(`${address}>${machineId}`, rowId ?? this.claims.get(`${address}>${machineId}`) ?? null);
209
+ }
210
+ /** The contested claims waiting for a person, with the rows that ask. */
211
+ contested() {
212
+ return [...this.claims.entries()].map(([key, rowId]) => {
213
+ const [address, station] = key.split('>');
214
+ return { address, station, rowId: rowId ?? '' };
215
+ });
181
216
  }
182
217
  settleClaim(address, machineId) {
183
218
  this.claims.delete(`${address}>${machineId}`);
@@ -221,6 +256,38 @@ class GatewayState {
221
256
  alarmKey(machineId, alarmId) {
222
257
  return `${machineId}/${alarmId}`;
223
258
  }
259
+ /** The line as this gateway sees it (project.ts). */
260
+ project(line) {
261
+ return (0, project_1.projectLine)(this, line);
262
+ }
263
+ /** A copy a dry run may change without touching the line. */
264
+ clone() {
265
+ const copy = new GatewayState();
266
+ Object.assign(copy, {
267
+ unitsPerDispatch: this.unitsPerDispatch, dispatchOnArrival: this.dispatchOnArrival, rowOps: this.rowOps, lifecycle: this.lifecycle,
268
+ retainedAlarms: this.retainedAlarms, readingRetained: this.readingRetained, takenAt: this.takenAt, progressStep: this.progressStep, holdDispatch: this.holdDispatch,
269
+ });
270
+ copyInto(this.held, copy.held, (units) => new Map(units));
271
+ copyInto(this.openRows, copy.openRows, (row) => ({ ...row, units: [...row.units], ...(row.noted ? { noted: [...row.noted] } : {}) }));
272
+ copyInto(this.closedRows, copy.closedRows, (row) => ({ ...row }));
273
+ copyInto(this.alarms, copy.alarms, (track) => ({ ...track, ...(track.noted ? { noted: [...track.noted] } : {}) }));
274
+ copyInto(this.earlyFinishes, copy.earlyFinishes);
275
+ copyInto(this.openCommands, copy.openCommands);
276
+ copyInto(this.dispatches, copy.dispatches);
277
+ copyInto(this.links, copy.links, (link) => ({ ...link }));
278
+ copyInto(this.addressOfStation, copy.addressOfStation);
279
+ copyInto(this.stationOfAddress, copy.stationOfAddress);
280
+ copyInto(this.claims, copy.claims);
281
+ for (const id of this.endedCommands)
282
+ copy.endedCommands.add(id);
283
+ for (const key of this.violations)
284
+ copy.violations.add(key);
285
+ for (const key of this.heard)
286
+ copy.heard.add(key);
287
+ for (const key of this.strangers)
288
+ copy.strangers.add(key);
289
+ return copy;
290
+ }
224
291
  }
225
292
  exports.GatewayState = GatewayState;
226
293
  function carries(row, unitId) {
@@ -0,0 +1,58 @@
1
+ /**
2
+ * The wire record. Every message a gateway reads, and every command,
3
+ * snapshot request and receipt it sends, becomes one WireEvent for the
4
+ * line's view: what was on the wire, how the codec read it, and what the
5
+ * gateway did about it. Telemetry is left out unless the line asks for it.
6
+ */
7
+ import { type Inspection, type MachineCommand, type MachineIdent, type WireMessage } from '../../../lib/machines/protocol';
8
+ import { type InboundMessage } from '../../../lib/machines/transport';
9
+ import type { WireAction, WireEvent } from '../../../types/machines-view';
10
+ import type { Action } from './actions';
11
+ import type { Applied } from './admission';
12
+ export type WireSink = (event: WireEvent) => void;
13
+ export declare const WIRE_EVENT_TYPE = "machine.wire";
14
+ export declare const WIRE_DIRECTION: {
15
+ readonly IN: "in";
16
+ readonly OUT: "out";
17
+ };
18
+ export interface WireOptions {
19
+ /** Publish telemetry messages too. */
20
+ telemetry?: boolean;
21
+ }
22
+ interface WireLine {
23
+ siteId: string;
24
+ lineId: string;
25
+ }
26
+ /** The sender a message was read as, when it differs from the topic's. */
27
+ export interface WireSender {
28
+ machineId: string | null;
29
+ address: string | null;
30
+ }
31
+ export declare class WireRecorder {
32
+ private readonly line;
33
+ private readonly sink;
34
+ private readonly opts;
35
+ constructor(line: WireLine, sink: WireSink, opts?: WireOptions);
36
+ /** A decoded inbound message and what the gateway did with it. */
37
+ inbound(msg: InboundMessage, seen: Inspection, applied: Applied, deliveries: number, sender?: WireSender): void;
38
+ /** A message the codec could not read, or one that is not a machine's. */
39
+ unreadable(msg: InboundMessage, detail: string, verb?: WireAction['verb']): void;
40
+ /** A command the gateway sent, as the codec put it on the wire. */
41
+ command(ident: MachineIdent, command: MachineCommand, wire: WireMessage): void;
42
+ /** A receipt confirming the messages the gateway is done with. */
43
+ receipt(ident: MachineIdent, ids: string[], wire: WireMessage): void;
44
+ private outbound;
45
+ }
46
+ /** The event name within the kind: job event, alarm action, command op, reply status. */
47
+ export declare function eventOf(seen: Inspection): string | null;
48
+ /** One line from the kind, the event and the ids the body names. */
49
+ export declare function summarize(seen: Inspection): string;
50
+ /** The record of an inbound message before the gateway's actions are known. */
51
+ export declare function describeInbound(line: WireLine, msg: InboundMessage, seen: Inspection, sender?: WireSender): Omit<WireEvent, 'actions'>;
52
+ /** What handling a message came to, as actions; a message with none is acknowledged, or waits for its row. */
53
+ export declare function appliedActions(applied: Applied, deliveries: number, maxDeliveries?: number): WireAction[];
54
+ /** A message no row has claimed after this many deliveries is not racing its row. */
55
+ export declare const MAX_DELIVERIES = 30;
56
+ /** A planner action as the wire would record it, before it runs; a dry run shows these. */
57
+ export declare function plannedAction(a: Action): WireAction;
58
+ export {};