@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
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ /**
3
+ * The running machine surface, for settings and the machines API. Set by
4
+ * start() when the config declares lines; absent otherwise, so a deployment
5
+ * without machines serves no lines and no Lines view.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.registerMachineSurface = registerMachineSurface;
9
+ exports.getMachineSurface = getMachineSurface;
10
+ let surface = null;
11
+ function registerMachineSurface(next) {
12
+ surface = next;
13
+ }
14
+ function getMachineSurface() {
15
+ return surface;
16
+ }
@@ -40,6 +40,7 @@ const nats_credentials_1 = __importDefault(require("./nats-credentials"));
40
40
  const scan_codes_1 = __importDefault(require("./scan-codes"));
41
41
  const domain_1 = __importDefault(require("./domain"));
42
42
  const announcements_1 = __importDefault(require("./announcements"));
43
+ const machines_1 = __importDefault(require("./machines"));
43
44
  const router = (0, http_1.Router)();
44
45
  // Public routes (no auth required — they handle their own auth)
45
46
  router.use('/auth', auth_2.default);
@@ -80,6 +81,7 @@ router.use('/topics', topics_1.default);
80
81
  router.use('/scan-codes', scan_codes_1.default);
81
82
  router.use('/domain', domain_1.default);
82
83
  router.use('/announcements', announcements_1.default);
84
+ router.use('/machines', machines_1.default);
83
85
  const overview_1 = __importDefault(require("./overview"));
84
86
  router.use('/overview', overview_1.default);
85
87
  const diagnostics_1 = __importDefault(require("./diagnostics"));
@@ -0,0 +1,2 @@
1
+ declare const router: import("express-serve-static-core").Router;
2
+ export default router;
@@ -0,0 +1,220 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const http_1 = require("../lib/http");
37
+ const escalationsApi = __importStar(require("../api/escalations"));
38
+ const auth_1 = require("../modules/auth");
39
+ const machines_1 = require("../modules/machines");
40
+ const commands_1 = require("../services/machines/commands");
41
+ const registry_1 = require("../services/machines/registry");
42
+ const registry_sync_1 = require("../services/machines/registry-sync");
43
+ const line_index_1 = require("../services/machines/line-index");
44
+ const topics_1 = require("../lib/machines/protocol/topics");
45
+ const router = (0, http_1.Router)();
46
+ /**
47
+ * The machine surface for the dashboard's Lines view. Reads and the dry run
48
+ * take the ops tier (superadmin, admin type, or engineer); declaring and
49
+ * retiring a line takes an administrator. A command is a row parked on the
50
+ * machine's role as the caller, so that role's write access decides, exactly
51
+ * as it does for any row created through the API.
52
+ */
53
+ const NO_LINES = 'no machine lines are declared';
54
+ const NOT_LEADING = 'this replica is not leading the line';
55
+ function lineOf(req) {
56
+ const surface = (0, machines_1.getMachineSurface)();
57
+ const siteId = String(req.params.siteId);
58
+ const lineId = String(req.params.lineId);
59
+ const line = surface?.findLine(siteId, lineId);
60
+ return { surface, siteId, lineId, line };
61
+ }
62
+ const SORTS = new Set(['attention', 'site', 'updated']);
63
+ /** The longest search a person types; anything past it is cut, never an error. */
64
+ const QUERY_MAX_CHARS = 200;
65
+ function queryString(v) {
66
+ return typeof v === 'string' && v.trim() ? v.trim().slice(0, QUERY_MAX_CHARS) : undefined;
67
+ }
68
+ /** The line a path names, when both tokens could name a line at all. */
69
+ function pathLine(req) {
70
+ const siteId = req.params.siteId;
71
+ const lineId = req.params.lineId;
72
+ return (0, topics_1.isTopicLevel)(siteId) && (0, topics_1.isTopicLevel)(lineId) ? { siteId, lineId } : null;
73
+ }
74
+ function queryBoolean(v) {
75
+ return v === 'true' ? true : v === 'false' ? false : undefined;
76
+ }
77
+ function queryInt(v) {
78
+ const n = typeof v === 'string' ? Number(v) : NaN;
79
+ return Number.isFinite(n) ? n : undefined;
80
+ }
81
+ router.get('/lines', auth_1.requireRoleManager, async (req, res) => {
82
+ const surface = (0, machines_1.getMachineSurface)();
83
+ if (!surface) {
84
+ res.status(404).json({ error: NO_LINES });
85
+ return;
86
+ }
87
+ const sort = queryString(req.query.sort);
88
+ if (sort && !SORTS.has(sort)) {
89
+ res.status(400).json({ error: `sort must be one of ${[...SORTS].join(', ')}` });
90
+ return;
91
+ }
92
+ const query = {
93
+ q: queryString(req.query.q), site: queryString(req.query.site), attention: queryBoolean(req.query.attention),
94
+ sort: sort, limit: queryInt(req.query.limit), offset: queryInt(req.query.offset),
95
+ };
96
+ const [page, sites] = await Promise.all([(0, registry_1.listLines)(query), (0, registry_1.listSites)()]);
97
+ const body = {
98
+ lines: page.lines.map((record) => (0, line_index_1.toLineIndexRow)(surface, record)),
99
+ total: page.total, sites, limit: page.limit, offset: page.offset,
100
+ };
101
+ res.status(200).json(body);
102
+ });
103
+ router.put('/lines/:siteId/:lineId', auth_1.requireAdmin, async (req, res) => {
104
+ const surface = (0, machines_1.getMachineSurface)();
105
+ if (!surface) {
106
+ res.status(404).json({ error: NO_LINES });
107
+ return;
108
+ }
109
+ const named = pathLine(req);
110
+ if (!named) {
111
+ res.status(400).json({ error: 'siteId and lineId must be topic levels' });
112
+ return;
113
+ }
114
+ const { siteId, lineId } = named;
115
+ const definition = req.body?.definition;
116
+ if (!definition || typeof definition !== 'object' || Array.isArray(definition)) {
117
+ res.status(400).json({ error: 'definition is required' });
118
+ return;
119
+ }
120
+ if (definition.siteId !== siteId || definition.lineId !== lineId) {
121
+ res.status(400).json({ error: `definition must be for ${siteId}/${lineId}` });
122
+ return;
123
+ }
124
+ const version = req.body?.version;
125
+ if (version !== undefined && !(Number.isInteger(version) && version >= 1)) {
126
+ res.status(400).json({ error: 'version must be a whole number of at least 1' });
127
+ return;
128
+ }
129
+ try {
130
+ const record = await (0, registry_sync_1.declareLine)(surface, definition, version);
131
+ const stored = (await (0, registry_1.getLineWithHealth)(siteId, lineId)) ?? { ...record, health: (0, line_index_1.emptyLineHealth)(record.definition.machines.length) };
132
+ res.status(200).json({ line: (0, line_index_1.toLineIndexRow)(surface, stored) });
133
+ }
134
+ catch (err) {
135
+ if (err instanceof registry_1.LineVersionConflict) {
136
+ res.status(409).json({ error: err.message });
137
+ return;
138
+ }
139
+ res.status(400).json({ error: err instanceof Error ? err.message : String(err) });
140
+ }
141
+ });
142
+ router.delete('/lines/:siteId/:lineId', auth_1.requireAdmin, async (req, res) => {
143
+ const surface = (0, machines_1.getMachineSurface)();
144
+ if (!surface) {
145
+ res.status(404).json({ error: NO_LINES });
146
+ return;
147
+ }
148
+ const named = pathLine(req);
149
+ if (!named) {
150
+ res.status(404).json({ error: 'no such line' });
151
+ return;
152
+ }
153
+ const { siteId, lineId } = named;
154
+ const record = await (0, registry_sync_1.retireLine)(surface, siteId, lineId);
155
+ if (!record) {
156
+ res.status(404).json({ error: `no line ${siteId}/${lineId}` });
157
+ return;
158
+ }
159
+ res.status(204).end();
160
+ });
161
+ router.get('/lines/:siteId/:lineId', auth_1.requireRoleManager, (req, res) => {
162
+ const { surface, siteId, lineId, line } = lineOf(req);
163
+ if (!surface || !line) {
164
+ res.status(404).json({ error: surface ? `no line ${siteId}/${lineId}` : NO_LINES });
165
+ return;
166
+ }
167
+ const body = {
168
+ ...(surface.describeLine(siteId, lineId) ?? { siteId, lineId, leading: false }),
169
+ summary: (0, line_index_1.lineSummaryOf)(surface, siteId, lineId, line),
170
+ };
171
+ res.status(200).json(body);
172
+ });
173
+ router.post('/lines/:siteId/:lineId/inspect', auth_1.requireRoleManager, (req, res) => {
174
+ const { surface, siteId, lineId, line } = lineOf(req);
175
+ if (!surface || !line) {
176
+ res.status(404).json({ error: surface ? `no line ${siteId}/${lineId}` : NO_LINES });
177
+ return;
178
+ }
179
+ const topic = req.body?.topic;
180
+ if (typeof topic !== 'string' || !topic) {
181
+ res.status(400).json({ error: 'topic is required' });
182
+ return;
183
+ }
184
+ const result = surface.inspect(siteId, lineId, { topic, payload: (0, line_index_1.wirePayloadOf)(req.body?.payload), retained: req.body?.retained === true });
185
+ if (!result) {
186
+ res.status(409).json({ error: NOT_LEADING });
187
+ return;
188
+ }
189
+ res.status(200).json(result);
190
+ });
191
+ router.post('/lines/:siteId/:lineId/machines/:machineId/commands', async (req, res) => {
192
+ const { surface, siteId, lineId, line } = lineOf(req);
193
+ if (!surface || !line) {
194
+ res.status(404).json({ error: surface ? `no line ${siteId}/${lineId}` : NO_LINES });
195
+ return;
196
+ }
197
+ const machineId = String(req.params.machineId);
198
+ if (!line.machines.some((m) => m.machineId === machineId)) {
199
+ res.status(404).json({ error: `no machine ${machineId} on ${siteId}/${lineId}` });
200
+ return;
201
+ }
202
+ const op = req.body?.op;
203
+ const ops = surface.commandOps(siteId, lineId);
204
+ if (typeof op !== 'string' || !ops.includes(op)) {
205
+ res.status(400).json({ error: `op must be one of ${ops.join(', ')}` });
206
+ return;
207
+ }
208
+ const args = req.body?.args;
209
+ if (args !== undefined && (!args || typeof args !== 'object' || Array.isArray(args))) {
210
+ res.status(400).json({ error: 'args must be an object' });
211
+ return;
212
+ }
213
+ const result = await escalationsApi.createEscalation((0, commands_1.commandRow)((0, commands_1.commandTarget)(line, machineId), op, args ?? {}), req.auth);
214
+ if (result.status !== 201) {
215
+ res.status(result.status).json({ error: result.error });
216
+ return;
217
+ }
218
+ res.status(201).json({ rowId: result.data.id });
219
+ });
220
+ exports.default = router;
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Make the example's first print: a small 3DBenchy (by Creative Tools), sliced
3
+ * for the printer with OrcaSlicer, written to examples/workflows/bambu-printer/files/boat.gcode.3mf.
4
+ * Run it on the host, where OrcaSlicer is installed:
5
+ *
6
+ * npm run bambu:boat
7
+ *
8
+ * 1. Download the model once into files/.
9
+ * 2. Scale it (BAMBU_BOAT_SCALE, 0.5 by default: about ten minutes on a P1S).
10
+ * 3. Slice it with the printer, process and filament presets. Each is an
11
+ * OrcaSlicer system preset name or a path to a preset JSON, which may
12
+ * inherit a system preset by name.
13
+ *
14
+ * Env: BAMBU_BOAT_PRINTER, BAMBU_BOAT_PROCESS, BAMBU_BOAT_FILAMENT, BAMBU_BOAT_SCALE,
15
+ * ORCA_SLICER (the OrcaSlicer executable) and ORCA_PROFILES (its BBL profiles directory).
16
+ */
17
+ export {};
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ /**
3
+ * Make the example's first print: a small 3DBenchy (by Creative Tools), sliced
4
+ * for the printer with OrcaSlicer, written to examples/workflows/bambu-printer/files/boat.gcode.3mf.
5
+ * Run it on the host, where OrcaSlicer is installed:
6
+ *
7
+ * npm run bambu:boat
8
+ *
9
+ * 1. Download the model once into files/.
10
+ * 2. Scale it (BAMBU_BOAT_SCALE, 0.5 by default: about ten minutes on a P1S).
11
+ * 3. Slice it with the printer, process and filament presets. Each is an
12
+ * OrcaSlicer system preset name or a path to a preset JSON, which may
13
+ * inherit a system preset by name.
14
+ *
15
+ * Env: BAMBU_BOAT_PRINTER, BAMBU_BOAT_PROCESS, BAMBU_BOAT_FILAMENT, BAMBU_BOAT_SCALE,
16
+ * ORCA_SLICER (the OrcaSlicer executable) and ORCA_PROFILES (its BBL profiles directory).
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ try {
20
+ require('dotenv/config');
21
+ }
22
+ catch { /* dotenv optional */ }
23
+ const child_process_1 = require("child_process");
24
+ const fs_1 = require("fs");
25
+ const os_1 = require("os");
26
+ const path_1 = require("path");
27
+ const env = process.env;
28
+ const FILES = (0, path_1.resolve)('examples/workflows/bambu-printer/files');
29
+ const MODEL_URL = 'https://raw.githubusercontent.com/CreativeTools/3DBenchy/master/Single-part/3DBenchy.stl';
30
+ const ORCA = env.ORCA_SLICER || '/Applications/OrcaSlicer.app/Contents/MacOS/OrcaSlicer';
31
+ const PROFILES = env.ORCA_PROFILES || '/Applications/OrcaSlicer.app/Contents/Resources/profiles/BBL';
32
+ const PRESET = {
33
+ PRINTER: env.BAMBU_BOAT_PRINTER || 'Bambu Lab P1S 0.4 nozzle',
34
+ PROCESS: env.BAMBU_BOAT_PROCESS || '0.20mm Standard @BBL X1C',
35
+ FILAMENT: env.BAMBU_BOAT_FILAMENT || 'Bambu PLA Basic @BBL X1C',
36
+ };
37
+ const PRESET_DIR = { PRINTER: 'machine', PROCESS: 'process', FILAMENT: 'filament' };
38
+ const STL_HEADER = 84;
39
+ const STL_TRIANGLE = 50;
40
+ const say = (msg) => console.log(`[${new Date().toISOString().slice(11, 19)}] ${msg}`);
41
+ async function fetchModel() {
42
+ const path = (0, path_1.join)(FILES, '3DBenchy.stl');
43
+ if ((0, fs_1.existsSync)(path))
44
+ return path;
45
+ const res = await fetch(MODEL_URL);
46
+ if (!res.ok)
47
+ throw new Error(`GET ${MODEL_URL} -> ${res.status}`);
48
+ (0, fs_1.writeFileSync)(path, Buffer.from(await res.arrayBuffer()));
49
+ return path;
50
+ }
51
+ /** A binary STL with every vertex scaled about the origin; the slicer places it on the bed. */
52
+ function scaleStl(stl, factor) {
53
+ const count = stl.readUInt32LE(STL_HEADER - 4);
54
+ if (stl.length !== STL_HEADER + count * STL_TRIANGLE)
55
+ throw new Error('the model is not a binary STL');
56
+ const out = Buffer.from(stl);
57
+ for (let t = 0; t < count; t++) {
58
+ const at = STL_HEADER + t * STL_TRIANGLE;
59
+ for (let v = 3; v < 12; v++)
60
+ out.writeFloatLE(stl.readFloatLE(at + v * 4) * factor, at + v * 4);
61
+ }
62
+ return out;
63
+ }
64
+ /** The system presets of one kind in ORCA_PROFILES, by name. */
65
+ function systemPresets(kind) {
66
+ const dir = (0, path_1.join)(PROFILES, PRESET_DIR[kind]);
67
+ const byName = new Map();
68
+ for (const file of (0, fs_1.readdirSync)(dir).filter((f) => f.endsWith('.json'))) {
69
+ const preset = JSON.parse((0, fs_1.readFileSync)((0, path_1.join)(dir, file), 'utf8'));
70
+ if (preset.name)
71
+ byName.set(preset.name, preset);
72
+ }
73
+ return byName;
74
+ }
75
+ /**
76
+ * A preset by path or system preset name, with every setting it inherits
77
+ * written out: OrcaSlicer's command line reads only the keys in the file, so
78
+ * an inherited start, layer-change or end G-code would otherwise be lost.
79
+ */
80
+ function fullPreset(kind, value) {
81
+ const system = systemPresets(kind);
82
+ const own = (0, fs_1.existsSync)(value) ? JSON.parse((0, fs_1.readFileSync)(value, 'utf8')) : system.get(value);
83
+ if (!own)
84
+ throw new Error(`no ${kind.toLowerCase()} preset ${value} (a path, or a name in ${PROFILES}/${PRESET_DIR[kind]})`);
85
+ const chain = [own];
86
+ for (let p = own; p.inherits;) {
87
+ p = system.get(p.inherits);
88
+ if (!p)
89
+ throw new Error(`${kind.toLowerCase()} preset ${value} inherits ${chain[chain.length - 1].inherits}, which is not in ${PROFILES}`);
90
+ chain.unshift(p);
91
+ }
92
+ return Object.assign({}, ...chain, { inherits: '' });
93
+ }
94
+ /** Write a full preset for the slicer; a process or filament is marked compatible with the printer, as OrcaSlicer requires. */
95
+ function writePreset(dir, kind, preset, printerName) {
96
+ const path = (0, path_1.join)(dir, `${PRESET_DIR[kind]}.json`);
97
+ const compatibility = kind === 'PRINTER' ? {} : { from: 'User', compatible_printers: [printerName], compatible_printers_condition: '' };
98
+ (0, fs_1.writeFileSync)(path, JSON.stringify({ ...preset, ...compatibility }));
99
+ return path;
100
+ }
101
+ async function main() {
102
+ if (!(0, fs_1.existsSync)(ORCA))
103
+ throw new Error(`OrcaSlicer is not at ${ORCA}; install it or set ORCA_SLICER`);
104
+ (0, fs_1.mkdirSync)(FILES, { recursive: true });
105
+ const work = (0, fs_1.mkdtempSync)((0, path_1.join)((0, os_1.tmpdir)(), 'bambu-boat-'));
106
+ // 1. The model
107
+ const model = await fetchModel();
108
+ // 2. Scaled
109
+ const scale = Number(env.BAMBU_BOAT_SCALE || 0.5);
110
+ if (!(scale > 0))
111
+ throw new Error(`BAMBU_BOAT_SCALE="${env.BAMBU_BOAT_SCALE}" must be a number above 0`);
112
+ const scaled = (0, path_1.join)(work, 'boat.stl');
113
+ (0, fs_1.writeFileSync)(scaled, scaleStl((0, fs_1.readFileSync)(model), scale));
114
+ // 3. Sliced
115
+ const printerPreset = fullPreset('PRINTER', PRESET.PRINTER);
116
+ const printerName = printerPreset.name;
117
+ const printer = writePreset(work, 'PRINTER', printerPreset, printerName);
118
+ const process_ = writePreset(work, 'PROCESS', fullPreset('PROCESS', PRESET.PROCESS), printerName);
119
+ const filament = writePreset(work, 'FILAMENT', fullPreset('FILAMENT', PRESET.FILAMENT), printerName);
120
+ say(`slicing at ${scale}x for ${printerName}`);
121
+ (0, child_process_1.execFileSync)(ORCA, [
122
+ '--load-settings', `${printer};${process_}`, '--load-filaments', filament,
123
+ '--arrange', '1', '--slice', '0', '--outputdir', work, '--export-3mf', 'boat.gcode.3mf', scaled,
124
+ ], { stdio: 'inherit' });
125
+ const target = (0, path_1.join)(FILES, 'boat.gcode.3mf');
126
+ (0, fs_1.renameSync)((0, path_1.join)(work, 'boat.gcode.3mf'), target);
127
+ const gcode = (0, fs_1.readdirSync)(work).find((f) => f.endsWith('.gcode'));
128
+ const time = gcode ? (0, fs_1.readFileSync)((0, path_1.join)(work, gcode), 'utf8').slice(0, 2000).match(/total estimated time: ([^\n]+)/)?.[1] : undefined;
129
+ say(`${target}${time ? ` (about ${time})` : ''}`);
130
+ }
131
+ main().catch((err) => {
132
+ console.error(`failed: ${err.message}`);
133
+ process.exit(1);
134
+ });
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Print one file on a Bambu printer through Long Tail, and follow its rows.
3
+ * Run it where the printer is reachable, e.g. in the Long Tail container:
4
+ *
5
+ * docker compose exec long-tail npm run bambu:print -- [examples/workflows/bambu-printer/files/part.gcode.3mf] [station]
6
+ *
7
+ * Without a file it prints the example's boat, a half-size 3DBenchy for a P1S with a 0.8 nozzle and TPU;
8
+ * `npm run bambu:boat` slices one for another printer or filament.
9
+ *
10
+ * 1. Put the file on the printer (it prints only files on its own storage) and hash it: the unit's artifact.
11
+ * 2. Start the unit route: one print step at the station, then a person unloads.
12
+ * 3. Print the route's rows and their lifecycle items as they change, until the
13
+ * route ends. The unload row is resolved by a person on the dashboard.
14
+ *
15
+ * Env: LT_USERNAME and LT_PASSWORD (a Long Tail login that may invoke the route), BASE_URL
16
+ * (http://localhost:3000), BAMBU_SITE_DIR (deploy/bambu-site), and the printers in .env.
17
+ */
18
+ export {};
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ /**
3
+ * Print one file on a Bambu printer through Long Tail, and follow its rows.
4
+ * Run it where the printer is reachable, e.g. in the Long Tail container:
5
+ *
6
+ * docker compose exec long-tail npm run bambu:print -- [examples/workflows/bambu-printer/files/part.gcode.3mf] [station]
7
+ *
8
+ * Without a file it prints the example's boat, a half-size 3DBenchy for a P1S with a 0.8 nozzle and TPU;
9
+ * `npm run bambu:boat` slices one for another printer or filament.
10
+ *
11
+ * 1. Put the file on the printer (it prints only files on its own storage) and hash it: the unit's artifact.
12
+ * 2. Start the unit route: one print step at the station, then a person unloads.
13
+ * 3. Print the route's rows and their lifecycle items as they change, until the
14
+ * route ends. The unload row is resolved by a person on the dashboard.
15
+ *
16
+ * Env: LT_USERNAME and LT_PASSWORD (a Long Tail login that may invoke the route), BASE_URL
17
+ * (http://localhost:3000), BAMBU_SITE_DIR (deploy/bambu-site), and the printers in .env.
18
+ */
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ try {
21
+ require('dotenv/config');
22
+ }
23
+ catch { /* dotenv optional */ }
24
+ const crypto_1 = require("crypto");
25
+ const fs_1 = require("fs");
26
+ const path_1 = require("path");
27
+ const env_1 = require("../examples/workflows/bambu-printer/env");
28
+ const files_1 = require("../examples/workflows/bambu-printer/files");
29
+ const route_1 = require("../examples/workflows/machine-line/workflows/route");
30
+ const env = process.env;
31
+ const BASE_URL = env.BASE_URL || 'http://localhost:3000';
32
+ const SITE_DIR = env.BAMBU_SITE_DIR || 'deploy/bambu-site';
33
+ const WATCH_MS = 3_000;
34
+ const BOAT = 'examples/workflows/bambu-printer/boat/p1s-0.8-tpu.gcode.3mf';
35
+ const ts = () => new Date().toISOString().slice(11, 19);
36
+ const say = (msg) => console.log(`[${ts()}] ${msg}`);
37
+ const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
38
+ let token = '';
39
+ async function api(method, path, body) {
40
+ const res = await fetch(`${BASE_URL}/api${path}`, {
41
+ method,
42
+ headers: { 'content-type': 'application/json', ...(token ? { authorization: `Bearer ${token}` } : {}) },
43
+ body: body === undefined ? undefined : JSON.stringify(body),
44
+ });
45
+ const data = await res.json().catch(() => ({}));
46
+ if (!res.ok)
47
+ throw new Error(`${method} ${path} -> ${res.status}: ${JSON.stringify(data)}`);
48
+ return data;
49
+ }
50
+ /** The route's rows, and the items each holds, printed as they change; the route's result once it ends. */
51
+ async function follow(orderRef, workflowId) {
52
+ const shown = new Map();
53
+ for (;;) {
54
+ try {
55
+ const result = await look(orderRef, workflowId, shown);
56
+ if (result)
57
+ return result;
58
+ }
59
+ catch (err) {
60
+ // A restart or a database blip is not the route ending: keep following.
61
+ say(`(could not read the route: ${err.message}; trying again)`);
62
+ }
63
+ await sleep(WATCH_MS);
64
+ }
65
+ }
66
+ async function look(orderRef, workflowId, shown) {
67
+ const facets = encodeURIComponent(JSON.stringify({ orderRef }));
68
+ const { escalations } = await api('GET', `/escalations?facets=${facets}&limit=20&sort_by=created_at&order=asc`);
69
+ for (const row of escalations) {
70
+ const { items = [] } = await api('GET', `/escalations/${row.id}/items`);
71
+ const view = `${row.type}/${row.role} ${row.status}${row.assigned_to ? ' claimed' : ''} [${items.map((i) => i.itemKey).join(', ')}]`;
72
+ if (shown.get(row.id) !== view)
73
+ say(`${row.id.slice(0, 8)} ${view}`);
74
+ shown.set(row.id, view);
75
+ }
76
+ const resp = await api('GET', `/workflows/${workflowId}/result`).catch(() => null);
77
+ return resp?.result?.data?.status ? resp.result.data : null;
78
+ }
79
+ async function main() {
80
+ const [file = BOAT, stationArg] = process.argv.slice(2);
81
+ if (!(0, fs_1.existsSync)(file))
82
+ throw new Error(`${file} is missing; usage: npm run bambu:print -- [path/to/part.gcode.3mf] [station]`);
83
+ const line = JSON.parse((0, fs_1.readFileSync)((0, path_1.join)(SITE_DIR, 'line.json'), 'utf8'));
84
+ const station = stationArg || line.machines[0].machineId;
85
+ const printer = (0, env_1.printersFromEnv)().find((p) => p.station === station);
86
+ if (!printer || !line.machines.some((m) => m.machineId === station))
87
+ throw new Error(`${station} is not an enabled printer on the line in ${SITE_DIR}/line.json`);
88
+ // 1. The artifact, on the printer
89
+ const routeKey = `P${Date.now().toString(36)}`;
90
+ const sha256 = (0, crypto_1.createHash)('sha256').update((0, fs_1.readFileSync)(file)).digest('hex');
91
+ say(`copying ${(0, path_1.basename)(file)} to ${station} (a minute or two for a few MB)`);
92
+ const url = await (0, files_1.stageFile)(printer, file, `${routeKey}.gcode.3mf`);
93
+ say(`${url} (sha256 ${sha256.slice(0, 12)}…)`);
94
+ // 2. The route
95
+ const { LT_USERNAME: username, LT_PASSWORD: password } = env;
96
+ if (!username || !password)
97
+ throw new Error('set LT_USERNAME and LT_PASSWORD in .env');
98
+ token = (await api('POST', '/auth/login', { username, password })).token;
99
+ const input = {
100
+ siteId: line.siteId, lineId: line.lineId, routeKey, orderRef: `ORD-${routeKey}`,
101
+ units: [{ unitId: `U-${routeKey}`, carrierId: `PLATE-${routeKey}` }],
102
+ steps: [{ machineId: station, process: env_1.PRINT_PROCESS, recipe: { ...env_1.PRINT_RECIPE } }],
103
+ artifact: { url, sha256 }, exitRole: env_1.BAMBU_ROLES.UNLOAD, handoffTimeout: env.BAMBU_HANDOFF_TIMEOUT || '6h',
104
+ };
105
+ const workflowId = `bambu-${routeKey}`;
106
+ await api('POST', `/workflows/${route_1.UNIT_ROUTE_WORKFLOW}/invoke`, { data: input, metadata: { source: 'bambu-print' }, workflowId });
107
+ say(`started ${workflowId} on ${station}; unload the part on the dashboard (${env_1.BAMBU_ROLES.UNLOAD}) when it finishes`);
108
+ // 3. Follow it
109
+ say(`route ended: ${JSON.stringify(await follow(input.orderRef, workflowId))}`);
110
+ }
111
+ main().catch((err) => {
112
+ console.error(`[${ts()}] failed: ${err.message}`);
113
+ process.exit(1);
114
+ });
@@ -1,11 +1,11 @@
1
1
  /**
2
2
  * Commands as rows. A host asks a machine to start, stop, pause, resume,
3
- * change over or cancel a job by parking a machine-command row on the machine's role, from a
4
- * workflow step or through the API, the same way it asks a person for
3
+ * change over, cancel a job, report a snapshot, or do anything its codec
4
+ * declares (`rowOps`), by parking a machine-command row on the machine's role,
5
+ * from a workflow step or through the API, the same way it asks a person for
5
6
  * anything. The gateway sends the command and resolves the row with the
6
7
  * machine's reply (CommandResolution), so the step reads the outcome as data.
7
8
  */
8
- import type { Op } from '../../lib/machines/protocol';
9
9
  import { type LineDef } from '../../lib/machines/line';
10
10
  import { type CommandFacets } from './contracts';
11
11
  /** Where a command goes: the machine and the role its rows land on. */
@@ -17,10 +17,10 @@ export interface CommandTarget {
17
17
  }
18
18
  export declare function commandTarget(line: LineDef, machineId: string): CommandTarget;
19
19
  /** The row that asks a machine for `op`: pass it to conditional(), or create it through the API. */
20
- export declare function commandRow(target: CommandTarget, op: Op, args?: Record<string, unknown>): {
20
+ export declare function commandRow(target: CommandTarget, op: string, args?: Record<string, unknown>): {
21
21
  role: string;
22
22
  type: "machine-command";
23
- subtype: Op;
23
+ subtype: string;
24
24
  description: string;
25
25
  priority: number;
26
26
  metadata: Record<string, unknown>;
@@ -1,8 +1,9 @@
1
1
  "use strict";
2
2
  /**
3
3
  * Commands as rows. A host asks a machine to start, stop, pause, resume,
4
- * change over or cancel a job by parking a machine-command row on the machine's role, from a
5
- * workflow step or through the API, the same way it asks a person for
4
+ * change over, cancel a job, report a snapshot, or do anything its codec
5
+ * declares (`rowOps`), by parking a machine-command row on the machine's role,
6
+ * from a workflow step or through the API, the same way it asks a person for
6
7
  * anything. The gateway sends the command and resolves the row with the
7
8
  * machine's reply (CommandResolution), so the step reads the outcome as data.
8
9
  */
@@ -29,7 +29,6 @@ export interface MachineLineConfig {
29
29
  mqtt?: MqttEndpoint;
30
30
  replyTimeoutMs: number;
31
31
  dispatchAttempts: number;
32
- handoffTimeout: string;
33
32
  offlineDebounceMs: number;
34
33
  /** A connected machine silent this long gets a quiet row; 0 turns the check off. */
35
34
  quietMs: number;
@@ -37,7 +36,15 @@ export interface MachineLineConfig {
37
36
  dispatchTtlMs: number;
38
37
  /** How long confirmed message ids gather before a receipt goes out. */
39
38
  receiptDelayMs: number;
39
+ /** Note each job's start, progress steps and pauses on the row that holds it (lifecycle.ts). */
40
+ lifecycle: boolean;
41
+ /** With lifecycle notes, progress is noted each time it crosses this many percent; 0 notes none. */
42
+ progressStep: number;
43
+ /** Telemetry messages are published as wire events too; off by default, since they are read live and many. */
44
+ wireTelemetry: boolean;
40
45
  ltBaseUrl: string;
41
46
  }
42
47
  type Env = Record<string, string | undefined>;
48
+ /** The generic line protocol's topic root when MACHINE_TOPIC_ROOT is unset. */
49
+ export declare const DEFAULT_TOPIC_ROOT = "line/v1";
43
50
  export declare function loadMachineLineConfig(env?: Env): MachineLineConfig;