sensorium-mcp 3.1.0-refactor.9 → 3.1.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 (175) hide show
  1. package/dist/config/agent-settings.d.ts +6 -0
  2. package/dist/config/agent-settings.d.ts.map +1 -1
  3. package/dist/config/agent-settings.js +22 -0
  4. package/dist/config/agent-settings.js.map +1 -1
  5. package/dist/config/detail-grant.d.ts +39 -0
  6. package/dist/config/detail-grant.d.ts.map +1 -0
  7. package/dist/config/detail-grant.js +61 -0
  8. package/dist/config/detail-grant.js.map +1 -0
  9. package/dist/config/index.d.ts +2 -0
  10. package/dist/config/index.d.ts.map +1 -1
  11. package/dist/config/index.js +5 -3
  12. package/dist/config/index.js.map +1 -1
  13. package/dist/config/misc-settings.d.ts +2 -0
  14. package/dist/config/misc-settings.d.ts.map +1 -1
  15. package/dist/config/misc-settings.js +22 -0
  16. package/dist/config/misc-settings.js.map +1 -1
  17. package/dist/config/settings-store.d.ts +41 -2
  18. package/dist/config/settings-store.d.ts.map +1 -1
  19. package/dist/config/settings-store.js +151 -14
  20. package/dist/config/settings-store.js.map +1 -1
  21. package/dist/dashboard/routes/copilot.d.ts.map +1 -1
  22. package/dist/dashboard/routes/copilot.js +17 -1
  23. package/dist/dashboard/routes/copilot.js.map +1 -1
  24. package/dist/dashboard/routes/settings.d.ts +2 -0
  25. package/dist/dashboard/routes/settings.d.ts.map +1 -1
  26. package/dist/dashboard/routes/settings.js +25 -1
  27. package/dist/dashboard/routes/settings.js.map +1 -1
  28. package/dist/dashboard/routes/threads-read.d.ts.map +1 -1
  29. package/dist/dashboard/routes/threads-read.js +15 -3
  30. package/dist/dashboard/routes/threads-read.js.map +1 -1
  31. package/dist/dashboard/routes/threads.d.ts.map +1 -1
  32. package/dist/dashboard/routes/threads.js +13 -4
  33. package/dist/dashboard/routes/threads.js.map +1 -1
  34. package/dist/dashboard/routes.d.ts.map +1 -1
  35. package/dist/dashboard/routes.js +14 -5
  36. package/dist/dashboard/routes.js.map +1 -1
  37. package/dist/dashboard/spa.html +11 -11
  38. package/dist/data/daily-marker.js +3 -3
  39. package/dist/data/daily-marker.js.map +1 -1
  40. package/dist/data/file-storage.d.ts.map +1 -1
  41. package/dist/data/file-storage.js +3 -3
  42. package/dist/data/file-storage.js.map +1 -1
  43. package/dist/data/memory/bootstrap.d.ts.map +1 -1
  44. package/dist/data/memory/bootstrap.js +2 -3
  45. package/dist/data/memory/bootstrap.js.map +1 -1
  46. package/dist/data/memory/migration-runner.d.ts.map +1 -1
  47. package/dist/data/memory/migration-runner.js +4 -7
  48. package/dist/data/memory/migration-runner.js.map +1 -1
  49. package/dist/data/memory/schema.js +2 -2
  50. package/dist/data/memory/schema.js.map +1 -1
  51. package/dist/index.js +67 -21
  52. package/dist/index.js.map +1 -1
  53. package/dist/lib/logger.d.ts.map +1 -1
  54. package/dist/lib/logger.js +21 -2
  55. package/dist/lib/logger.js.map +1 -1
  56. package/dist/lib/paths.d.ts +29 -0
  57. package/dist/lib/paths.d.ts.map +1 -0
  58. package/dist/lib/paths.js +36 -0
  59. package/dist/lib/paths.js.map +1 -0
  60. package/dist/lib/types.d.ts +1 -0
  61. package/dist/lib/types.d.ts.map +1 -1
  62. package/dist/server/factory.js +16 -6
  63. package/dist/server/factory.js.map +1 -1
  64. package/dist/server/http-server.d.ts.map +1 -1
  65. package/dist/server/http-server.js +52 -20
  66. package/dist/server/http-server.js.map +1 -1
  67. package/dist/services/agent-spawn.service.d.ts +3 -3
  68. package/dist/services/agent-spawn.service.d.ts.map +1 -1
  69. package/dist/services/agent-spawn.service.js +30 -9
  70. package/dist/services/agent-spawn.service.js.map +1 -1
  71. package/dist/services/background-runner.d.ts.map +1 -1
  72. package/dist/services/background-runner.js +22 -12
  73. package/dist/services/background-runner.js.map +1 -1
  74. package/dist/services/broker-client.d.ts +209 -0
  75. package/dist/services/broker-client.d.ts.map +1 -0
  76. package/dist/services/broker-client.js +359 -0
  77. package/dist/services/broker-client.js.map +1 -0
  78. package/dist/services/claude-spawn.service.d.ts +1 -1
  79. package/dist/services/claude-spawn.service.d.ts.map +1 -1
  80. package/dist/services/claude-spawn.service.js +25 -25
  81. package/dist/services/claude-spawn.service.js.map +1 -1
  82. package/dist/services/codex-spawn.service.d.ts +1 -1
  83. package/dist/services/codex-spawn.service.d.ts.map +1 -1
  84. package/dist/services/codex-spawn.service.js +19 -24
  85. package/dist/services/codex-spawn.service.js.map +1 -1
  86. package/dist/services/copilot-spawn.service.d.ts +1 -1
  87. package/dist/services/copilot-spawn.service.d.ts.map +1 -1
  88. package/dist/services/copilot-spawn.service.js +86 -37
  89. package/dist/services/copilot-spawn.service.js.map +1 -1
  90. package/dist/services/dispatcher/broker.d.ts +4 -3
  91. package/dist/services/dispatcher/broker.d.ts.map +1 -1
  92. package/dist/services/dispatcher/broker.js +23 -11
  93. package/dist/services/dispatcher/broker.js.map +1 -1
  94. package/dist/services/dispatcher/lock.js +2 -2
  95. package/dist/services/dispatcher/lock.js.map +1 -1
  96. package/dist/services/dispatcher/poller.d.ts.map +1 -1
  97. package/dist/services/dispatcher/poller.js +24 -5
  98. package/dist/services/dispatcher/poller.js.map +1 -1
  99. package/dist/services/flight-recorder.service.d.ts +37 -0
  100. package/dist/services/flight-recorder.service.d.ts.map +1 -0
  101. package/dist/services/flight-recorder.service.js +210 -0
  102. package/dist/services/flight-recorder.service.js.map +1 -0
  103. package/dist/services/keeper.service.d.ts +9 -0
  104. package/dist/services/keeper.service.d.ts.map +1 -1
  105. package/dist/services/keeper.service.js +198 -39
  106. package/dist/services/keeper.service.js.map +1 -1
  107. package/dist/services/maintenance-signal.d.ts.map +1 -1
  108. package/dist/services/maintenance-signal.js +2 -3
  109. package/dist/services/maintenance-signal.js.map +1 -1
  110. package/dist/services/process.service.d.ts +76 -61
  111. package/dist/services/process.service.d.ts.map +1 -1
  112. package/dist/services/process.service.js +224 -608
  113. package/dist/services/process.service.js.map +1 -1
  114. package/dist/services/reconnect-snapshot.service.js +2 -2
  115. package/dist/services/reconnect-snapshot.service.js.map +1 -1
  116. package/dist/services/scheduler.d.ts +1 -0
  117. package/dist/services/scheduler.d.ts.map +1 -1
  118. package/dist/services/scheduler.js +69 -14
  119. package/dist/services/scheduler.js.map +1 -1
  120. package/dist/services/self-update.service.d.ts +113 -15
  121. package/dist/services/self-update.service.d.ts.map +1 -1
  122. package/dist/services/self-update.service.js +382 -109
  123. package/dist/services/self-update.service.js.map +1 -1
  124. package/dist/services/spawn-common.d.ts +49 -23
  125. package/dist/services/spawn-common.d.ts.map +1 -1
  126. package/dist/services/spawn-common.js +262 -47
  127. package/dist/services/spawn-common.js.map +1 -1
  128. package/dist/services/spawn-exit-watcher.d.ts +43 -0
  129. package/dist/services/spawn-exit-watcher.d.ts.map +1 -0
  130. package/dist/services/spawn-exit-watcher.js +127 -0
  131. package/dist/services/spawn-exit-watcher.js.map +1 -0
  132. package/dist/services/telegram.d.ts +3 -2
  133. package/dist/services/telegram.d.ts.map +1 -1
  134. package/dist/services/telegram.js +8 -5
  135. package/dist/services/telegram.js.map +1 -1
  136. package/dist/services/thread-health.service.d.ts +1 -1
  137. package/dist/services/thread-health.service.d.ts.map +1 -1
  138. package/dist/services/thread-health.service.js +11 -7
  139. package/dist/services/thread-health.service.js.map +1 -1
  140. package/dist/services/thread-lifecycle.service.js +2 -2
  141. package/dist/services/thread-lifecycle.service.js.map +1 -1
  142. package/dist/services/topic.service.d.ts +1 -1
  143. package/dist/services/topic.service.d.ts.map +1 -1
  144. package/dist/services/topic.service.js +3 -2
  145. package/dist/services/topic.service.js.map +1 -1
  146. package/dist/services/worker-cleanup.service.d.ts.map +1 -1
  147. package/dist/services/worker-cleanup.service.js +25 -99
  148. package/dist/services/worker-cleanup.service.js.map +1 -1
  149. package/dist/test-bootstrap.d.ts +39 -0
  150. package/dist/test-bootstrap.d.ts.map +1 -0
  151. package/dist/test-bootstrap.js +78 -0
  152. package/dist/test-bootstrap.js.map +1 -0
  153. package/dist/tools/defs/session-defs.js +1 -1
  154. package/dist/tools/defs/session-defs.js.map +1 -1
  155. package/dist/tools/defs/utility-defs.d.ts.map +1 -1
  156. package/dist/tools/defs/utility-defs.js +4 -3
  157. package/dist/tools/defs/utility-defs.js.map +1 -1
  158. package/dist/tools/delegate-tool.d.ts +1 -1
  159. package/dist/tools/delegate-tool.d.ts.map +1 -1
  160. package/dist/tools/delegate-tool.js +37 -6
  161. package/dist/tools/delegate-tool.js.map +1 -1
  162. package/dist/tools/session-tools.d.ts.map +1 -1
  163. package/dist/tools/session-tools.js +34 -20
  164. package/dist/tools/session-tools.js.map +1 -1
  165. package/dist/tools/utility-tools.js +1 -1
  166. package/dist/tools/utility-tools.js.map +1 -1
  167. package/dist/tools/wait/context.d.ts +13 -0
  168. package/dist/tools/wait/context.d.ts.map +1 -1
  169. package/dist/tools/wait/message-delivery.d.ts.map +1 -1
  170. package/dist/tools/wait/message-delivery.js +2 -3
  171. package/dist/tools/wait/message-delivery.js.map +1 -1
  172. package/dist/tools/wait/poll-loop.d.ts.map +1 -1
  173. package/dist/tools/wait/poll-loop.js +8 -1
  174. package/dist/tools/wait/poll-loop.js.map +1 -1
  175. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"self-update.service.js","sourceRoot":"","sources":["../../src/services/self-update.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACpF,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACxF,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAE5E,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,qBAAqB,CAAC,CAAC;AACxD,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;AAErD;wEACwE;AACxE,MAAM,KAAK,GAAG;IACZ,gBAAgB,EAAE,KAAK;IACvB,cAAc,EAAE,EAAE;IAClB,QAAQ,EAAE,CAAC;IACX,eAAe,EAAE,IAA2C;CAC7D,CAAC;AAEF,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,8EAA8E;AAC9E,gFAAgF;AAChF,6BAA6B;AAC7B,MAAM,cAAc,GAAG,OAAO,CAAC;AAC/B,MAAM,eAAe,GAAG,KAAK,CAAC;AAE9B;;;;;;;;;;;;;;GAcG;AACH,KAAK,UAAU,aAAa;IAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,CAAC;IAC7C,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,uBAAuB,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC,CAAC;QACtF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,GAAG,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAC;YACnF,OAAO;QACT,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,oCAAoC,OAAO,CAAC,MAAM,cAAc,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/F,MAAM,KAAK,CAAC,eAAe,CAAC,CAAC;IAC/B,CAAC;IACD,GAAG,CAAC,IAAI,CACN,8BAA8B,cAAc,8CAA8C,CAC3F,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,cAAc,CAAC,IAAY;IACxC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IACzC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IAC5C,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM;QAAE,OAAO;IAE9B,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,+BAA+B,KAAK,cAAc,EAAE;YAC9D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;YAC/C,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;SACpC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CAAC,qDAAqD,GAAG,EAAE,CAAC,CAAC;IACvE,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,cAAc,CAC3B,IAAY,EACZ,aAAqB,EACrB,SAAS,GAAG,OAAO;IAEnB,MAAM,GAAG,GAAG,oBAAoB,IAAI,SAAS,CAAC;IAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IAExC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACtE,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;gBACZ,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAuC,CAAC;gBACvE,IAAI,IAAI,CAAC,OAAO,KAAK,aAAa;oBAAE,OAAO,IAAI,CAAC;gBAChD,yDAAyD;YAC3D,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,+BAA+B;QACjC,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;;;;;;8CAO8C;AAC9C,SAAS,gBAAgB;IACvB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC;IAChD,MAAM,CAAC,GAAG,4CAA4C,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjE,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACnB,IAAI,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACnC,yEAAyE;QACzE,0EAA0E;QAC1E,GAAG,CAAC,IAAI,CACN,8DAA8D,GAAG,wBAAwB,CAC1F,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,4CAA4C,kBAAkB,CAAC,OAAO,CAAC,EAAE,EACzE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CACxC,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,GAAG,CAAC,IAAI,CACN,oCAAoC,QAAQ,CAAC,MAAM,iBAAiB,OAAO,cAAc,CAC1F,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAyB,CAAC;QAC7D,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACrC,GAAG,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;YACxE,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CAAC,wCAAwC,GAAG,EAAE,CAAC,CAAC;QACxD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,KAAK,UAAU,aAAa,CAAC,aAAqB;IAChD,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAC9B,IAAI,CAAC;QACH,GAAG,CAAC,IAAI,CAAC,2BAA2B,KAAK,CAAC,cAAc,QAAQ,aAAa,EAAE,CAAC,CAAC;QAEjF,mDAAmD;QACnD,KAAK,cAAc,CAAC,4BAA4B,KAAK,CAAC,cAAc,QAAQ,aAAa,KAAK,CAAC,CAAC;QAEhG,yBAAyB;QACzB,IAAI,CAAC;YACH,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACzC,aAAa,CACX,SAAS,EACT,IAAI,CAAC,SAAS,CAAC;gBACb,OAAO,EAAE,aAAa;gBACtB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC,CACH,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,KAAK,CAAC,mDAAmD,GAAG,EAAE,CAAC,CAAC;YACpE,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,mEAAmE;QACnE,qBAAqB,EAAE,CAAC;QAExB,mEAAmE;QACnE,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACtE,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;QAC9E,GAAG,CAAC,IAAI,CAAC,+BAA+B,OAAO,IAAI,CAAC,CAAC;QACrD,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;QAErB,4EAA4E;QAC5E,qEAAqE;QACrE,oDAAoD;QACpD,MAAM,aAAa,EAAE,CAAC;QAEtB,4EAA4E;QAC5E,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,kBAAkB,EAAE,CAAC;YACvC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,sBAAsB,CAAC,SAAS,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,IAAI,CAAC,wDAAwD,GAAG,EAAE,CAAC,CAAC;QAC1E,CAAC;QAED,0EAA0E;QAC1E,MAAM,WAAW,GAAG,KAAK,CAAC,eAAe,CAAC;QAC1C,IAAI,WAAW,EAAE,CAAC;YAChB,GAAG,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;YAC9D,MAAM,WAAW,EAAE,CAAC;QACtB,CAAC;QAED,mEAAmE;QACnE,sFAAsF;QACtF,MAAM,UAAU,GAAG,wBAAwB,aAAa,kBAAkB,CAAC;QAC3E,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,UAAU,CAAC;QACxD,GAAG,CAAC,IAAI,CAAC,uCAAuC,GAAG,EAAE,CAAC,CAAC;QAEvD,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;QACxD,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;QAE1C,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE;YAC3B,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,IAAI;YACX,KAAK,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC;YAC/B,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE;SACxB,CAAC,CAAC;QACH,SAAS,CAAC,KAAK,CAAC,CAAC;QACjB,KAAK,CAAC,KAAK,EAAE,CAAC;QAEd,IAAI,KAAK,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACvE,CAAC;QAED,GAAG,CAAC,IAAI,CACN,iCAAiC,KAAK,CAAC,GAAG,4BAA4B,KAAK,CAAC,QAAQ,GAAG,CACxF,CAAC;QAEF,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QAEpE,IAAI,OAAO,EAAE,CAAC;YACZ,0EAA0E;YAC1E,0EAA0E;YAC1E,wEAAwE;YAExE,8EAA8E;YAC9E,IAAI,CAAC;gBACH,UAAU,CAAC,SAAS,CAAC,CAAC;YACxB,CAAC;YAAC,MAAM,CAAC;gBACP,iBAAiB;YACnB,CAAC;YAED,GAAG,CAAC,IAAI,CAAC,4BAA4B,aAAa,qBAAqB,CAAC,CAAC;YACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,KAAK,CAAC,sEAAsE,CAAC,CAAC;YAClF,uFAAuF;YACvF,qEAAqE;YACrE,IAAI,CAAC;gBACH,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,CAAC;YAAC,MAAM,CAAC;gBACP,yBAAyB;YAC3B,CAAC;YACD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;gBACjC,IAAI,CAAC;oBACH,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;oBACxD,mDAAmD;oBACnD,QAAQ,CACN,sDAAsD,KAAK,CAAC,QAAQ,gDAAgD,EACpH,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,CACvD,CAAC;oBACF,GAAG,CAAC,IAAI,CAAC,+CAA+C,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAC5E,CAAC;gBAAC,MAAM,CAAC;oBACP,GAAG,CAAC,IAAI,CACN,+CAA+C,KAAK,CAAC,QAAQ,iCAAiC,CAC/F,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,uEAAuE;YACvE,6DAA6D;YAC7D,GAAG,CAAC,KAAK,CACP,sFAAsF,CACvF,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,KAAK,CAAC,yCAAyC,GAAG,EAAE,CAAC,CAAC;QAC1D,IAAI,CAAC;YACH,UAAU,CAAC,SAAS,CAAC,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACP,iBAAiB;QACnB,CAAC;IACH,CAAC;YAAS,CAAC;QACT,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC;IACjC,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,IAAI,KAAK,CAAC,gBAAgB;QAAE,OAAO;IACnC,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAE9B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACzE,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;QAE7E,IAAI,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,GAAG,WAAW,EAAE,CAAC;YAC1C,GAAG,CAAC,KAAK,CACP,oCAAoC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,WAAW,WAAW,GAAG,IAAI,GAAG,CACjG,CAAC;YACF,OAAO;QACT,CAAC;QAED,MAAM,aAAa,GAAG,MAAM,gBAAgB,EAAE,CAAC;QAC/C,IAAI,aAAa,KAAK,IAAI;YAAE,OAAO;QAEnC,IAAI,aAAa,KAAK,KAAK,CAAC,cAAc,EAAE,CAAC;YAC3C,0EAA0E;YAC1E,2EAA2E;YAC3E,4CAA4C;YAC5C,OAAO;QACT,CAAC;QAED,GAAG,CAAC,IAAI,CACN,2CAA2C,aAAa,eAAe,KAAK,CAAC,cAAc,cAAc,CAC1G,CAAC;QACF,MAAM,aAAa,CAAC,aAAa,CAAC,CAAC;IACrC,CAAC;YAAS,CAAC;QACT,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC;IACjC,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAIrC;IACC,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,OAAO,EAAE,CAAC;QAChD,GAAG,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;QAC7E,OAAO;IACT,CAAC;IAED,KAAK,CAAC,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC;IACzC,KAAK,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IACjC,IAAI,MAAM,CAAC,aAAa;QAAE,KAAK,CAAC,eAAe,GAAG,MAAM,CAAC,aAAa,CAAC;IAEvE,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACjF,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC;IAExF,GAAG,CAAC,IAAI,CACN,2CAA2C,KAAK,CAAC,cAAc,eAAe,QAAQ,KAAK,CAC5F,CAAC;IAEF,WAAW,CAAC,GAAG,EAAE;QACf,KAAK,cAAc,EAAE,CAAC;IACxB,CAAC,EAAE,QAAQ,CAAC,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"self-update.service.js","sourceRoot":"","sources":["../../src/services/self-update.service.ts"],"names":[],"mappings":"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"}
@@ -8,7 +8,6 @@
8
8
  * agent module stay focused on its own CLI invocation without duplicating the
9
9
  * lifecycle plumbing.
10
10
  */
11
- import { type ChildProcess, type SpawnOptions } from "node:child_process";
12
11
  import { type ThreadLifecycleService } from "./thread-lifecycle.service.js";
13
12
  import type { SensoriumTransport } from "./mcp-config.service.js";
14
13
  /** Result shape shared by every spawn function. */
@@ -28,6 +27,8 @@ export declare const sanitizeSpawnEnv: (extra?: Record<string, string | undefine
28
27
  * separately and are unaffected.
29
28
  */
30
29
  export declare const stripDenylistedEnvVars: (vars: Record<string, string>) => Record<string, string>;
30
+ /** Test hook: clear the CLI resolution cache. */
31
+ export declare function resetCliPathCacheForTest(): void;
31
32
  export declare const resolveCliPath: (name: string, prefer?: RegExp) => string | null;
32
33
  /** On Windows: prefer .exe, fall back to .cmd, refuse extensionless shims (e.g. Volta). */
33
34
  export declare function resolveWindowsCliPath(name: string): string | null;
@@ -51,14 +52,12 @@ export declare function buildThreadLogPath(name: string, threadId: number, ext:
51
52
  * delivers its own autonomous-loop prompt over stdin instead). */
52
53
  export declare const buildSessionPrompt: (name: string, threadId: number) => string;
53
54
  /**
54
- * Spawn options shared by every agent child: detached from this (ephemeral)
55
- * server process, stdout/stderr on the child-owned log fd, and .cmd/.bat
56
- * launched through a shell on Windows. `stdin` defaults to "ignore"; Codex
57
- * passes "pipe" because it delivers its prompt over stdin.
55
+ * Everything needed to start an agent process, agent-specific policy already
56
+ * applied (env assembly, CLI args, prompt delivery). The SAME plan drives both
57
+ * spawn mechanics: POST /proc/spawn on the supervisor broker (the process
58
+ * owner target state, plan §4.1) and the legacy local `spawn()` fallback.
58
59
  */
59
- export declare function detachedChildOptions(cliPath: string, outFd: number, env: NodeJS.ProcessEnv, cwd: string | undefined, stdin?: "ignore" | "pipe"): SpawnOptions;
60
- interface RegisterSpawnOpts {
61
- child: ChildProcess;
60
+ export interface AgentLaunchPlan {
62
61
  threadId: number;
63
62
  name: string;
64
63
  logFilePath: string;
@@ -66,23 +65,50 @@ interface RegisterSpawnOpts {
66
65
  agentLabel: string;
67
66
  memorySourceThreadId?: number;
68
67
  threadType?: "worker" | "branch";
68
+ exe: string;
69
+ args: string[];
70
+ env: NodeJS.ProcessEnv;
71
+ cwd?: string;
72
+ /** Prompt-sized payload written to the child's stdin then EOF'd (Codex);
73
+ * undefined → stdin ignored/NUL. */
74
+ stdinData?: string;
69
75
  }
76
+ export type BrokerSpawnMode = "required" | "auto" | "off";
70
77
  /**
71
- * Shared tail of every agent spawn: open the log fd, run the agent-specific
72
- * spawn callback, register the child for lifecycle bookkeeping, and translate
73
- * any exception into an error result.
78
+ * Staged cutover switch (plan hard criterion 7 — zero-disruption migration):
79
+ * SENSORIUM_BROKER_SPAWN=1 broker REQUIRED — a broker failure fails the
80
+ * spawn loudly, never a silent local fallback;
81
+ * SENSORIUM_BROKER_SPAWN=0 legacy local spawning only;
82
+ * unset auto — broker first, and if it is unreachable or
83
+ * predates /proc/spawn, WARN and spawn locally so
84
+ * an MCP update cannot strand agents behind an
85
+ * old supervisor binary. Locally-spawned processes
86
+ * are adopted into jobs+registry by the
87
+ * supervisor's boot reconciliation / /proc/adopt.
88
+ * Job objects are Windows-only, so non-Windows resolves to "off" unless forced.
89
+ */
90
+ export declare function brokerSpawnMode(): BrokerSpawnMode;
91
+ export declare function spawnReconcileDelayForTest(ms: number | null): void;
92
+ /**
93
+ * Launch an agent process for a thread. Broker path first (the supervisor owns
94
+ * spawn/observe/kill; children land in the thread's job object so the whole
95
+ * tree stays killable), legacy local path per the cutover flag above.
96
+ *
97
+ * Duplicate-agent guarantee: the legacy local fallback runs ONLY on definitive
98
+ * evidence that the broker created nothing — a spawn error answer, an absent
99
+ * endpoint (404/401), or a connection that was never established. An uncertain
100
+ * outcome (timeout, dropped connection) goes through reconcileUncertainSpawn
101
+ * instead, so no timeout value can ever yield two agents for one thread.
74
102
  *
75
- * stdout/stderr go to a file descriptor the CHILD owns, not a pipe drained by
76
- * this (ephemeral) server process. A pipe's only reader is this node process;
77
- * when it dies on a self-update/restart the orphaned, detached child keeps
78
- * writing, the ~64KB OS pipe buffer fills, and the next write() blocks the
79
- * child's event loop forever — killing MCP polling, the API stream and any
80
- * reconnect (the exact zombie we saw on thread 20869). A file fd is duplicated
81
- * into the child at spawn and drained by the OS, so it survives our restarts.
82
- * (64KB blocking is a PIPE phenomenon, not a file.)
103
+ * In the local path stdout/stderr go to a file descriptor the CHILD owns, not
104
+ * a pipe drained by this (ephemeral) server process. A pipe's only reader is
105
+ * this node process; when it dies on a self-update/restart the orphaned,
106
+ * detached child keeps writing, the ~64KB OS pipe buffer fills, and the next
107
+ * write() blocks the child's event loop forever — killing MCP polling, the API
108
+ * stream and any reconnect (the exact zombie we saw on thread 20869). A file
109
+ * fd is duplicated into the child at spawn and drained by the OS, so it
110
+ * survives our restarts. The broker path keeps the identical design with the
111
+ * supervisor opening the file handle (spawn-to-file-fd, plan §6 "keep").
83
112
  */
84
- export declare function launchAgentChild(opts: Omit<RegisterSpawnOpts, "child"> & {
85
- spawnChild: (outFd: number) => ChildProcess;
86
- }, threadLifecycle: ThreadLifecycleService): SpawnResult;
87
- export {};
113
+ export declare function launchAgent(plan: AgentLaunchPlan, threadLifecycle: ThreadLifecycleService): Promise<SpawnResult>;
88
114
  //# sourceMappingURL=spawn-common.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"spawn-common.d.ts","sourceRoot":"","sources":["../../src/services/spawn-common.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAa,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AA8BrF,OAAO,EAAe,KAAK,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACzF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AA6BlE,mDAAmD;AACnD,MAAM,MAAM,WAAW,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAwB/E,eAAO,MAAM,gBAAgB,GAAI,QAAQ,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,KAAG,MAAM,CAAC,UAKpF,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,sBAAsB,GAAI,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAI1F,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,MAAM,MAAM,EAAE,SAAS,MAAM,KAAG,MAAM,GAAG,IAsBvE,CAAC;AAEF,2FAA2F;AAC3F,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAwBjE;AASD,eAAO,MAAM,yBAAyB,GAAI,mBAAmB,MAAM,KAAG,MAAM,GAAG,SAK9E,CAAC;AAOF,eAAO,MAAM,0BAA0B,QAAO,OAAmC,CAAC;AAClF,eAAO,MAAM,2BAA2B,GAAI,GAAG,OAAO,KAAG,IAExD,CAAC;AAQF;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,MAAM,GACjB;IAAE,SAAS,EAAE,kBAAkB,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAYvD;AAED,mFAAmF;AACnF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAMhG;AAED;kEACkE;AAClE,eAAO,MAAM,kBAAkB,GAAI,MAAM,MAAM,EAAE,UAAU,MAAM,KAAG,MACkD,CAAC;AAEvH;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,KAAK,GAAE,QAAQ,GAAG,MAAiB,GAClC,YAAY,CASd;AAID,UAAU,iBAAiB;IACzB,KAAK,EAAE,YAAY,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,UAAU,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;CAClC;AAoOD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,IAAI,CAAC,iBAAiB,EAAE,OAAO,CAAC,GAAG;IAAE,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,YAAY,CAAA;CAAE,EACxF,eAAe,EAAE,sBAAsB,GACtC,WAAW,CAmBb"}
1
+ {"version":3,"file":"spawn-common.d.ts","sourceRoot":"","sources":["../../src/services/spawn-common.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAgCH,OAAO,EAAe,KAAK,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACzF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AA+BlE,mDAAmD;AACnD,MAAM,MAAM,WAAW,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAwB/E,eAAO,MAAM,gBAAgB,GAAI,QAAQ,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,KAAG,MAAM,CAAC,UAKpF,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,sBAAsB,GAAI,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAI1F,CAAC;AAWF,iDAAiD;AACjD,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C;AAED,eAAO,MAAM,cAAc,GAAI,MAAM,MAAM,EAAE,SAAS,MAAM,KAAG,MAAM,GAAG,IA2BvE,CAAC;AAEF,2FAA2F;AAC3F,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA8BjE;AASD,eAAO,MAAM,yBAAyB,GAAI,mBAAmB,MAAM,KAAG,MAAM,GAAG,SAK9E,CAAC;AAOF,eAAO,MAAM,0BAA0B,QAAO,OAAmC,CAAC;AAClF,eAAO,MAAM,2BAA2B,GAAI,GAAG,OAAO,KAAG,IAExD,CAAC;AASF;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,MAAM,GACjB;IAAE,SAAS,EAAE,kBAAkB,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAYvD;AAED,mFAAmF;AACnF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAMhG;AAED;kEACkE;AAClE,eAAO,MAAM,kBAAkB,GAAI,MAAM,MAAM,EAAE,UAAU,MAAM,KAAG,MACkD,CAAC;AAuRvH;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,UAAU,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;yCACqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,MAAM,GAAG,KAAK,CAAC;AAE1D;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,IAAI,eAAe,CAKjD;AAiDD,wBAAgB,0BAA0B,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAElE;AA4ED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,eAAe,EACrB,eAAe,EAAE,sBAAsB,GACtC,OAAO,CAAC,WAAW,CAAC,CAyCtB"}
@@ -8,7 +8,7 @@
8
8
  * agent module stay focused on its own CLI invocation without duplicating the
9
9
  * lifecycle plumbing.
10
10
  */
11
- import { spawnSync } from "node:child_process";
11
+ import { spawn, spawnSync } from "node:child_process";
12
12
  import { closeSync, existsSync, fstatSync, openSync, readSync, unlinkSync, writeFileSync, readFileSync, } from "node:fs";
13
13
  import { tmpdir } from "node:os";
14
14
  import { join } from "node:path";
@@ -21,6 +21,8 @@ import { errorMessage } from "../lib/utils.js";
21
21
  import { deleteTelegramTopicByBotApi } from "./topic.service.js";
22
22
  import { PROCESS_PIDS_DIR, PENDING_TASKS_DIR, THREAD_LOGS_DIR, spawnedThreads, wasTaskConsumed, clearTaskConsumed, } from "./process.service.js";
23
23
  import { ThreadState } from "./thread-lifecycle.service.js";
24
+ import { brokerSpawn, brokerListThread } from "./broker-client.js";
25
+ import { watchBrokerSpawnExit } from "./spawn-exit-watcher.js";
24
26
  import { decommissionWorker, clearWorkerGrace } from "./worker-cleanup.service.js";
25
27
  import { writeThreadHeartbeatSync, clearThreadHeartbeat } from "../data/file-storage.js";
26
28
  // ── Worker respawn (failed MCP-handshake recovery) ──────────────────────────
@@ -92,54 +94,79 @@ export const stripDenylistedEnvVars = (vars) => {
92
94
  out[k] = v;
93
95
  return out;
94
96
  };
97
+ // CLI paths are resolved through a synchronous `where`/`which` child — the one
98
+ // remaining shell-out on the spawn path, and a sync child can block the event
99
+ // loop for its full 5s timeout under AV/EDR pressure. Installed CLI locations
100
+ // do not move during a server's lifetime, so resolve each name ONCE and serve
101
+ // every later spawn from this cache (null results are cached too: a missing CLI
102
+ // stays missing until a restart, and hammering `where` for it each spawn is the
103
+ // exact stall this avoids). The env override is read fresh on every call.
104
+ const cliPathCache = new Map();
105
+ /** Test hook: clear the CLI resolution cache. */
106
+ export function resetCliPathCacheForTest() {
107
+ cliPathCache.clear();
108
+ }
95
109
  export const resolveCliPath = (name, prefer) => {
96
110
  const envCmd = process.env[`${name.toUpperCase()}_CLI_CMD`];
97
111
  if (envCmd)
98
112
  return envCmd;
113
+ const cacheKey = `posix:${name}:${prefer?.source ?? ""}`;
114
+ if (cliPathCache.has(cacheKey))
115
+ return cliPathCache.get(cacheKey);
116
+ let resolved = null;
99
117
  try {
100
118
  const result = spawnSync(process.platform === "win32" ? "where" : "which", [name], {
101
119
  timeout: 5000,
102
120
  encoding: "utf-8",
103
121
  windowsHide: true,
104
122
  });
105
- if (result.status !== 0 || !result.stdout)
106
- return null;
107
- const candidates = result.stdout
108
- .trim()
109
- .split(/\r?\n/)
110
- .map((s) => s.trim())
111
- .filter(Boolean);
112
- return prefer ? (candidates.find((p) => prefer.test(p)) ?? candidates[0]) : candidates[0];
123
+ if (result.status === 0 && result.stdout) {
124
+ const candidates = result.stdout
125
+ .trim()
126
+ .split(/\r?\n/)
127
+ .map((s) => s.trim())
128
+ .filter(Boolean);
129
+ resolved = prefer ? (candidates.find((p) => prefer.test(p)) ?? candidates[0]) : candidates[0];
130
+ }
113
131
  }
114
132
  catch (err) {
115
133
  log.debug(`[spawn] CLI resolution for ${name} failed: ${err instanceof Error ? err.message : err}`);
116
- return null;
117
134
  }
135
+ cliPathCache.set(cacheKey, resolved ?? null);
136
+ return resolved ?? null;
118
137
  };
119
138
  /** On Windows: prefer .exe, fall back to .cmd, refuse extensionless shims (e.g. Volta). */
120
139
  export function resolveWindowsCliPath(name) {
121
140
  const envCmd = process.env[`${name.toUpperCase()}_CLI_CMD`];
122
141
  if (envCmd)
123
142
  return envCmd;
143
+ const cacheKey = `win:${name}`;
144
+ if (cliPathCache.has(cacheKey))
145
+ return cliPathCache.get(cacheKey);
146
+ let resolved = null;
124
147
  try {
125
148
  const result = spawnSync("where", [name], {
126
149
  timeout: 5000,
127
150
  encoding: "utf-8",
128
151
  windowsHide: true,
129
152
  });
130
- if (result.status !== 0 || !result.stdout)
131
- return null;
132
- const candidates = result.stdout
133
- .trim()
134
- .split(/\r?\n/)
135
- .map((s) => s.trim())
136
- .filter(Boolean);
137
- return (candidates.find((p) => /\.exe$/i.test(p)) ?? candidates.find((p) => /\.cmd$/i.test(p)) ?? null);
153
+ if (result.status === 0 && result.stdout) {
154
+ const candidates = result.stdout
155
+ .trim()
156
+ .split(/\r?\n/)
157
+ .map((s) => s.trim())
158
+ .filter(Boolean);
159
+ resolved =
160
+ candidates.find((p) => /\.exe$/i.test(p)) ??
161
+ candidates.find((p) => /\.cmd$/i.test(p)) ??
162
+ null;
163
+ }
138
164
  }
139
165
  catch (err) {
140
166
  log.debug(`[spawn] Windows CLI resolution for ${name} failed: ${err instanceof Error ? err.message : err}`);
141
- return null;
142
167
  }
168
+ cliPathCache.set(cacheKey, resolved);
169
+ return resolved;
143
170
  }
144
171
  /** Parse MCP transport from env. Returns null if port is not set or invalid. */
145
172
  function parseSensoriumTransport() {
@@ -164,9 +191,10 @@ export const setStartupCleanupInProgress = (v) => {
164
191
  };
165
192
  // ── Shared spawn choreography ───────────────────────────────────────────────
166
193
  // The pieces every agent spawn goes through in the same order: preflight
167
- // checks, log-path construction, common spawn options, and the fd/register
168
- // tail (launchAgentChild below). Agent modules keep only their own CLI
169
- // quirks: env building, argument lists and prompt delivery.
194
+ // checks, log-path construction, common spawn options, and the launch/register
195
+ // tail (launchAgent below — broker spawn with a flagged local fallback). Agent
196
+ // modules keep only their own CLI quirks: env building, argument lists and
197
+ // prompt delivery.
170
198
  /**
171
199
  * Shared spawn preflight: refuse when the dashboard's max-concurrent-threads
172
200
  * limit is already reached, then require the MCP HTTP transport. Kept here so
@@ -200,7 +228,7 @@ export const buildSessionPrompt = (name, threadId) => `Start remote session with
200
228
  * launched through a shell on Windows. `stdin` defaults to "ignore"; Codex
201
229
  * passes "pipe" because it delivers its prompt over stdin.
202
230
  */
203
- export function detachedChildOptions(cliPath, outFd, env, cwd, stdin = "ignore") {
231
+ function detachedChildOptions(cliPath, outFd, env, cwd, stdin = "ignore") {
204
232
  return {
205
233
  stdio: [stdin, outFd, outFd],
206
234
  shell: process.platform === "win32" && /\.(cmd|bat)$/i.test(cliPath),
@@ -267,7 +295,7 @@ async function handleProcessExit(code, threadId, pid, pidFilePath, entry, proces
267
295
  const reg = getThread(db, threadId);
268
296
  const agentType = (reg?.client ?? getAgentType());
269
297
  const { dispatchSpawn } = await import("./agent-spawn.service.js");
270
- const res = dispatchSpawn(agentType, entry.name, threadId, threadLifecycle, reg?.workingDirectory ?? undefined, entry.memorySourceThreadId ?? reg?.rootThreadId ?? undefined, "worker", db);
298
+ const res = await dispatchSpawn(agentType, entry.name, threadId, threadLifecycle, reg?.workingDirectory ?? undefined, entry.memorySourceThreadId ?? reg?.rootThreadId ?? undefined, "worker", db);
271
299
  if ("pid" in res) {
272
300
  log.info(`[respawn] worker thread ${threadId} relaunched as PID=${res.pid}`);
273
301
  return; // task file preserved for the new process — skip decommission
@@ -348,7 +376,7 @@ async function handleProcessExit(code, threadId, pid, pidFilePath, entry, proces
348
376
  }
349
377
  }
350
378
  function registerSpawnedProcess(opts, threadLifecycle) {
351
- const pid = opts.child.pid;
379
+ const pid = opts.pid;
352
380
  if (pid === undefined)
353
381
  return {
354
382
  error: `${opts.agentLabel} process spawned but PID is undefined - spawn may have failed.`,
@@ -359,7 +387,8 @@ function registerSpawnedProcess(opts, threadLifecycle) {
359
387
  pid,
360
388
  name: opts.name,
361
389
  configPath: opts.configPath,
362
- startedAt: Date.now(),
390
+ startedAt: opts.startedAt,
391
+ ...(opts.startTimeTicks ? { startTimeTicks: opts.startTimeTicks } : {}),
363
392
  ...(opts.threadType ? { threadType: opts.threadType } : {}),
364
393
  }), "utf-8");
365
394
  }
@@ -372,7 +401,7 @@ function registerSpawnedProcess(opts, threadLifecycle) {
372
401
  pid,
373
402
  threadId: opts.threadId,
374
403
  name: opts.name,
375
- startedAt: Date.now(),
404
+ startedAt: opts.startedAt,
376
405
  createdAt: Date.now(),
377
406
  logFile: opts.logFilePath,
378
407
  ...(opts.memorySourceThreadId !== undefined
@@ -381,33 +410,205 @@ function registerSpawnedProcess(opts, threadLifecycle) {
381
410
  ...(opts.threadType ? { threadType: opts.threadType } : {}),
382
411
  };
383
412
  spawnedThreads.push(entry);
384
- opts.child.on("exit", (code) => {
413
+ opts.attachExit((code) => {
385
414
  handleProcessExit(code, opts.threadId, pid, pidFilePath, entry, opts.agentLabel, threadLifecycle).catch((err) => log.warn(`[exit] cleanup failed: ${err}`));
386
415
  });
387
- opts.child.unref();
388
- log.info(`[start_thread] Spawned ${opts.agentLabel} process PID=${pid} for thread ${opts.threadId} ("${opts.name}")`);
416
+ opts.unref?.();
417
+ log.info(`[start_thread] Spawned ${opts.agentLabel} process PID=${pid} for thread ${opts.threadId} ("${opts.name}") via ${opts.spawnedVia}`);
389
418
  return { pid, logFile: opts.logFilePath };
390
419
  }
391
420
  /**
392
- * Shared tail of every agent spawn: open the log fd, run the agent-specific
393
- * spawn callback, register the child for lifecycle bookkeeping, and translate
394
- * any exception into an error result.
421
+ * Staged cutover switch (plan hard criterion 7 — zero-disruption migration):
422
+ * SENSORIUM_BROKER_SPAWN=1 broker REQUIRED — a broker failure fails the
423
+ * spawn loudly, never a silent local fallback;
424
+ * SENSORIUM_BROKER_SPAWN=0 legacy local spawning only;
425
+ * unset auto — broker first, and if it is unreachable or
426
+ * predates /proc/spawn, WARN and spawn locally so
427
+ * an MCP update cannot strand agents behind an
428
+ * old supervisor binary. Locally-spawned processes
429
+ * are adopted into jobs+registry by the
430
+ * supervisor's boot reconciliation / /proc/adopt.
431
+ * Job objects are Windows-only, so non-Windows resolves to "off" unless forced.
432
+ */
433
+ export function brokerSpawnMode() {
434
+ const raw = (process.env.SENSORIUM_BROKER_SPAWN ?? "").trim().toLowerCase();
435
+ if (["1", "true", "on", "required"].includes(raw))
436
+ return "required";
437
+ if (["0", "false", "off"].includes(raw))
438
+ return "off";
439
+ return process.platform === "win32" ? "auto" : "off";
440
+ }
441
+ const envToStringRecord = (env) => {
442
+ const out = {};
443
+ for (const [k, v] of Object.entries(env))
444
+ if (v !== undefined)
445
+ out[k] = v;
446
+ return out;
447
+ };
448
+ /** Register a broker-owned process (fresh spawn, idempotent hit, or a reconcile
449
+ * adoption): PID file, spawnedThreads[], and the polling exit watcher. */
450
+ function registerBrokerOwnedProcess(plan, proc, threadLifecycle) {
451
+ return registerSpawnedProcess({
452
+ pid: proc.pid,
453
+ startedAt: proc.startTimeMs,
454
+ startTimeTicks: proc.startTimeTicks || undefined,
455
+ spawnedVia: "broker",
456
+ attachExit: (onExit) => watchBrokerSpawnExit({
457
+ pid: proc.pid,
458
+ threadId: plan.threadId,
459
+ onExit,
460
+ }),
461
+ threadId: plan.threadId,
462
+ name: plan.name,
463
+ logFilePath: plan.logFilePath,
464
+ configPath: plan.configPath,
465
+ agentLabel: plan.agentLabel,
466
+ memorySourceThreadId: plan.memorySourceThreadId,
467
+ threadType: plan.threadType,
468
+ }, threadLifecycle);
469
+ }
470
+ // Reconcile pacing after an UNCERTAIN spawn outcome. The delay matches the
471
+ // broker client's unreachable cooldown so each attempt gets a fresh probe
472
+ // rather than a cached failure. Three rounds bound the worst case (wedged-but-
473
+ // accepting supervisor) to ~2 min; a still-unverifiable spawn then fails LOUDLY
474
+ // and the keeper retries later — safely, because spawn is idempotent.
475
+ const SPAWN_RECONCILE_ATTEMPTS = 3;
476
+ const SPAWN_RECONCILE_DELAY_MS = 5000;
477
+ /** Test hook: shrink the reconcile pacing. Null restores the default. */
478
+ let reconcileDelayOverride = null;
479
+ export function spawnReconcileDelayForTest(ms) {
480
+ reconcileDelayOverride = ms;
481
+ }
482
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
483
+ /**
484
+ * The reconcile contract for an uncertain broker spawn (timeout / connection
485
+ * lost mid-flight): the request MAY have created a process, so a blind local
486
+ * spawn is forbidden — no timeout value may ever produce two agents for one
487
+ * thread. Instead:
488
+ * 1. Ask the broker registry (/proc/list) — a live process there IS the
489
+ * thread's agent: adopt it.
490
+ * 2. Otherwise retry the spawn — idempotent by threadId server-side, so the
491
+ * retry either creates the one process or returns the one that exists.
492
+ * 3. Still unverifiable after the attempts → fail loudly. NEVER local-spawn:
493
+ * the keeper's next cycle retries against the same idempotent contract.
494
+ */
495
+ async function reconcileUncertainSpawn(plan, spec, threadLifecycle, firstDetail) {
496
+ log.warn(`[spawn] broker spawn outcome UNCERTAIN for ${plan.agentLabel} thread ${plan.threadId} (${firstDetail}) — reconciling against the broker registry; a blind local spawn is forbidden here`);
497
+ for (let attempt = 1; attempt <= SPAWN_RECONCILE_ATTEMPTS; attempt++) {
498
+ const list = await brokerListThread(plan.threadId);
499
+ if (list && list.processes.length > 0) {
500
+ const root = list.processes[0];
501
+ if (root.startTimeTicks || root.startTimeMs) {
502
+ log.warn(`[spawn] reconcile attempt ${attempt}: broker has live pid ${root.pid} for thread ${plan.threadId} — adopting it as the agent (the uncertain spawn DID land)`);
503
+ return registerBrokerOwnedProcess(plan, { pid: root.pid, startTimeTicks: root.startTimeTicks, startTimeMs: root.startTimeMs }, threadLifecycle);
504
+ }
505
+ // Entry without identity: the pid vanished between the broker's job read
506
+ // and its snapshot — likely mid-death. Let the next attempt see clearly.
507
+ }
508
+ else {
509
+ // Broker unreachable OR answered "no live process". Either way the spawn
510
+ // retry is safe: idempotent server-side, it can never create a second
511
+ // process — and if the first request is still in flight it serializes on
512
+ // the broker's per-thread lock and returns that process.
513
+ const retry = await brokerSpawn(spec);
514
+ if ("pid" in retry) {
515
+ if (retry.existing)
516
+ log.warn(`[spawn] reconcile attempt ${attempt}: idempotent spawn returned the EXISTING live pid ${retry.pid} for thread ${plan.threadId} — adopted, no duplicate created`);
517
+ return registerBrokerOwnedProcess(plan, retry, threadLifecycle);
518
+ }
519
+ if ("error" in retry) {
520
+ // Definitive: the broker checked (no live process) and CreateProcess
521
+ // failed. Nothing is running for this thread.
522
+ return {
523
+ error: `Broker spawn failed for ${plan.agentLabel} thread ${plan.threadId}: ${retry.error}`,
524
+ };
525
+ }
526
+ // unavailable/uncertain → the broker may have died AFTER creating the
527
+ // process (it survives — the job handle is pinned into the child). Keep
528
+ // reconciling; never blind-spawn.
529
+ }
530
+ if (attempt < SPAWN_RECONCILE_ATTEMPTS)
531
+ await sleep(reconcileDelayOverride ?? SPAWN_RECONCILE_DELAY_MS);
532
+ }
533
+ return {
534
+ error: `Broker spawn for ${plan.agentLabel} thread ${plan.threadId} remained unverifiable after ` +
535
+ `${SPAWN_RECONCILE_ATTEMPTS} reconcile attempts — refusing a blind local spawn (a broker-side ` +
536
+ `process may exist). The next spawn attempt reconciles again safely.`,
537
+ };
538
+ }
539
+ /**
540
+ * Launch an agent process for a thread. Broker path first (the supervisor owns
541
+ * spawn/observe/kill; children land in the thread's job object so the whole
542
+ * tree stays killable), legacy local path per the cutover flag above.
543
+ *
544
+ * Duplicate-agent guarantee: the legacy local fallback runs ONLY on definitive
545
+ * evidence that the broker created nothing — a spawn error answer, an absent
546
+ * endpoint (404/401), or a connection that was never established. An uncertain
547
+ * outcome (timeout, dropped connection) goes through reconcileUncertainSpawn
548
+ * instead, so no timeout value can ever yield two agents for one thread.
395
549
  *
396
- * stdout/stderr go to a file descriptor the CHILD owns, not a pipe drained by
397
- * this (ephemeral) server process. A pipe's only reader is this node process;
398
- * when it dies on a self-update/restart the orphaned, detached child keeps
399
- * writing, the ~64KB OS pipe buffer fills, and the next write() blocks the
400
- * child's event loop forever — killing MCP polling, the API stream and any
401
- * reconnect (the exact zombie we saw on thread 20869). A file fd is duplicated
402
- * into the child at spawn and drained by the OS, so it survives our restarts.
403
- * (64KB blocking is a PIPE phenomenon, not a file.)
550
+ * In the local path stdout/stderr go to a file descriptor the CHILD owns, not
551
+ * a pipe drained by this (ephemeral) server process. A pipe's only reader is
552
+ * this node process; when it dies on a self-update/restart the orphaned,
553
+ * detached child keeps writing, the ~64KB OS pipe buffer fills, and the next
554
+ * write() blocks the child's event loop forever — killing MCP polling, the API
555
+ * stream and any reconnect (the exact zombie we saw on thread 20869). A file
556
+ * fd is duplicated into the child at spawn and drained by the OS, so it
557
+ * survives our restarts. The broker path keeps the identical design with the
558
+ * supervisor opening the file handle (spawn-to-file-fd, plan §6 "keep").
404
559
  */
405
- export function launchAgentChild(opts, threadLifecycle) {
560
+ export async function launchAgent(plan, threadLifecycle) {
561
+ const mode = brokerSpawnMode();
562
+ if (mode !== "off") {
563
+ const role = plan.threadType ?? "agent";
564
+ const spec = {
565
+ threadId: plan.threadId,
566
+ role,
567
+ exe: plan.exe,
568
+ args: plan.args,
569
+ env: envToStringRecord(plan.env),
570
+ cwd: plan.cwd,
571
+ logFilePath: plan.logFilePath,
572
+ stdinData: plan.stdinData,
573
+ };
574
+ const spawned = await brokerSpawn(spec);
575
+ if ("pid" in spawned) {
576
+ if (spawned.existing)
577
+ log.warn(`[spawn] broker returned the EXISTING live pid ${spawned.pid} for thread ${plan.threadId} (idempotent hit) — adopting it instead of double-spawning`);
578
+ return registerBrokerOwnedProcess(plan, spawned, threadLifecycle);
579
+ }
580
+ if ("uncertain" in spawned)
581
+ return reconcileUncertainSpawn(plan, spec, threadLifecycle, spawned.uncertain);
582
+ // A failed spawn must NEVER look like success (hard criterion 5): both
583
+ // remaining outcomes are loud and DEFINITIVE (no process was created);
584
+ // they differ only in whether a legacy local spawn is allowed to take over.
585
+ const detail = "error" in spawned ? spawned.error : spawned.unavailable;
586
+ if (mode === "required") {
587
+ log.error(`[spawn] BROKER spawn FAILED for ${plan.agentLabel} thread ${plan.threadId}: ${detail} — SENSORIUM_BROKER_SPAWN=1 forbids the local fallback; spawn failed`);
588
+ return {
589
+ error: `Broker spawn failed for ${plan.agentLabel} thread ${plan.threadId}: ${detail}`,
590
+ };
591
+ }
592
+ log.warn(`[spawn] broker spawn unavailable for ${plan.agentLabel} thread ${plan.threadId} (${detail}) — falling back to LOCAL spawn; the process runs outside job containment until the supervisor's boot reconciliation adopts it`);
593
+ }
594
+ return launchLocalChild(plan, threadLifecycle);
595
+ }
596
+ /** Legacy local spawn — the pre-Phase-3 mechanics, kept verbatim behind the flag. */
597
+ function launchLocalChild(plan, threadLifecycle) {
406
598
  try {
407
- const outFd = openSync(opts.logFilePath, "a");
599
+ const outFd = openSync(plan.logFilePath, "a");
600
+ let child;
408
601
  try {
409
- const { spawnChild, ...reg } = opts;
410
- return registerSpawnedProcess({ ...reg, child: spawnChild(outFd) }, threadLifecycle);
602
+ child = spawn(plan.exe, plan.args, detachedChildOptions(plan.exe, outFd, plan.env, plan.cwd, plan.stdinData !== undefined ? "pipe" : "ignore"));
603
+ if (plan.stdinData !== undefined) {
604
+ try {
605
+ child.stdin?.write(plan.stdinData);
606
+ child.stdin?.end();
607
+ }
608
+ catch {
609
+ /* child died at spawn — the exit handler reports it */
610
+ }
611
+ }
411
612
  }
412
613
  finally {
413
614
  // Parent no longer needs the fd — the child holds its own duplicated handle.
@@ -415,12 +616,26 @@ export function launchAgentChild(opts, threadLifecycle) {
415
616
  closeSync(outFd);
416
617
  }
417
618
  catch (err) {
418
- log.debug(`[spawn] closeSync log fd failed for thread ${opts.threadId}: ${errorMessage(err)}`);
619
+ log.debug(`[spawn] closeSync log fd failed for thread ${plan.threadId}: ${errorMessage(err)}`);
419
620
  }
420
621
  }
622
+ return registerSpawnedProcess({
623
+ pid: child.pid,
624
+ startedAt: Date.now(),
625
+ spawnedVia: "local",
626
+ attachExit: (onExit) => child.on("exit", (code) => onExit(code)),
627
+ unref: () => child.unref(),
628
+ threadId: plan.threadId,
629
+ name: plan.name,
630
+ logFilePath: plan.logFilePath,
631
+ configPath: plan.configPath,
632
+ agentLabel: plan.agentLabel,
633
+ memorySourceThreadId: plan.memorySourceThreadId,
634
+ threadType: plan.threadType,
635
+ }, threadLifecycle);
421
636
  }
422
637
  catch (err) {
423
- return { error: `Failed to spawn ${opts.agentLabel} process: ${errorMessage(err)}` };
638
+ return { error: `Failed to spawn ${plan.agentLabel} process: ${errorMessage(err)}` };
424
639
  }
425
640
  }
426
641
  //# sourceMappingURL=spawn-common.js.map