@songsid/agend 2.3.4-beta.5 → 2.3.5-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (386) hide show
  1. package/README.md +2 -0
  2. package/README.zh-TW.md +2 -0
  3. package/THIRD_PARTY_NOTICES.md +53 -0
  4. package/dist/agent-endpoint.d.ts +5 -1
  5. package/dist/agent-endpoint.js +12 -2
  6. package/dist/agent-endpoint.js.map +1 -1
  7. package/dist/backend/claude-code.d.ts +18 -12
  8. package/dist/backend/claude-code.js +225 -136
  9. package/dist/backend/claude-code.js.map +1 -1
  10. package/dist/backend/codex-package.d.ts +5 -2
  11. package/dist/backend/codex-package.js +1 -5
  12. package/dist/backend/codex-package.js.map +1 -1
  13. package/dist/backend/codex.d.ts +136 -113
  14. package/dist/backend/codex.js +1271 -1219
  15. package/dist/backend/codex.js.map +1 -1
  16. package/dist/backend/grok-model-cache.d.ts +7 -0
  17. package/dist/backend/grok-model-cache.js +65 -0
  18. package/dist/backend/grok-model-cache.js.map +1 -0
  19. package/dist/backend/grok.d.ts +2 -0
  20. package/dist/backend/grok.js +22 -0
  21. package/dist/backend/grok.js.map +1 -1
  22. package/dist/backend/native-pane.d.ts +9 -0
  23. package/dist/backend/native-pane.js +59 -0
  24. package/dist/backend/native-pane.js.map +1 -0
  25. package/dist/backend/types.d.ts +7 -0
  26. package/dist/backend/types.js.map +1 -1
  27. package/dist/channel/ipc-bridge.d.ts +2 -0
  28. package/dist/channel/mcp-tools.js +1 -1
  29. package/dist/channel/mcp-tools.js.map +1 -1
  30. package/dist/cli.js +6 -2
  31. package/dist/cli.js.map +1 -1
  32. package/dist/config-validator.js +59 -0
  33. package/dist/config-validator.js.map +1 -1
  34. package/dist/config.js +16 -0
  35. package/dist/config.js.map +1 -1
  36. package/dist/daemon.d.ts +62 -5
  37. package/dist/daemon.js +760 -240
  38. package/dist/daemon.js.map +1 -1
  39. package/dist/delivery-consumed-watch.d.ts +15 -3
  40. package/dist/delivery-consumed-watch.js +23 -1
  41. package/dist/delivery-consumed-watch.js.map +1 -1
  42. package/dist/delivery-outbox.d.ts +5 -0
  43. package/dist/delivery-outbox.js +32 -4
  44. package/dist/delivery-outbox.js.map +1 -1
  45. package/dist/delivery-reconciliation.d.ts +2 -35
  46. package/dist/delivery-reconciliation.js +2 -156
  47. package/dist/delivery-reconciliation.js.map +1 -1
  48. package/dist/fleet-context.d.ts +2 -2
  49. package/dist/fleet-level-config.d.ts +1 -1
  50. package/dist/fleet-level-config.js +2 -0
  51. package/dist/fleet-level-config.js.map +1 -1
  52. package/dist/fleet-manager.d.ts +125 -2
  53. package/dist/fleet-manager.js +1157 -27
  54. package/dist/fleet-manager.js.map +1 -1
  55. package/dist/fleet-windows-runtime.d.ts +92 -0
  56. package/dist/fleet-windows-runtime.js +373 -0
  57. package/dist/fleet-windows-runtime.js.map +1 -0
  58. package/dist/instance-config-impact.js +4 -0
  59. package/dist/instance-config-impact.js.map +1 -1
  60. package/dist/instance-lifecycle.d.ts +20 -3
  61. package/dist/instance-lifecycle.js +358 -156
  62. package/dist/instance-lifecycle.js.map +1 -1
  63. package/dist/local-pane-endpoint.d.ts +46 -0
  64. package/dist/local-pane-endpoint.js +189 -0
  65. package/dist/local-pane-endpoint.js.map +1 -0
  66. package/dist/local-pane-launcher.d.ts +2 -0
  67. package/dist/local-pane-launcher.js +38 -0
  68. package/dist/local-pane-launcher.js.map +1 -0
  69. package/dist/local-pane-stage.ps1 +101 -0
  70. package/dist/locale.js +34 -0
  71. package/dist/locale.js.map +1 -1
  72. package/dist/model-catalog-defaults.d.ts +14 -0
  73. package/dist/model-catalog-defaults.js +20 -0
  74. package/dist/model-catalog-defaults.js.map +1 -0
  75. package/dist/native-agent-admission.d.ts +7 -0
  76. package/dist/native-agent-admission.js +26 -0
  77. package/dist/native-agent-admission.js.map +1 -0
  78. package/dist/native-daemon-client.d.ts +13 -0
  79. package/dist/native-daemon-client.js +28 -0
  80. package/dist/native-daemon-client.js.map +1 -0
  81. package/dist/native-instance-api.d.ts +14 -0
  82. package/dist/native-instance-api.js +205 -0
  83. package/dist/native-instance-api.js.map +1 -0
  84. package/dist/native-instance-input.d.ts +84 -0
  85. package/dist/native-instance-input.js +54 -0
  86. package/dist/native-instance-input.js.map +1 -0
  87. package/dist/native-instance-registry.d.ts +32 -0
  88. package/dist/native-instance-registry.js +105 -0
  89. package/dist/native-instance-registry.js.map +1 -0
  90. package/dist/native-mcp.d.ts +40 -0
  91. package/dist/native-mcp.js +278 -0
  92. package/dist/native-mcp.js.map +1 -0
  93. package/dist/native-model-catalog.d.ts +5 -0
  94. package/dist/native-model-catalog.js +76 -0
  95. package/dist/native-model-catalog.js.map +1 -0
  96. package/dist/native-pane-crash-budget.d.ts +20 -0
  97. package/dist/native-pane-crash-budget.js +60 -0
  98. package/dist/native-pane-crash-budget.js.map +1 -0
  99. package/dist/native-pane-create.d.ts +26 -0
  100. package/dist/native-pane-create.js +53 -0
  101. package/dist/native-pane-create.js.map +1 -0
  102. package/dist/native-pane-lifecycle.d.ts +65 -0
  103. package/dist/native-pane-lifecycle.js +227 -0
  104. package/dist/native-pane-lifecycle.js.map +1 -0
  105. package/dist/native-pane-manager.d.ts +58 -0
  106. package/dist/native-pane-manager.js +563 -0
  107. package/dist/native-pane-manager.js.map +1 -0
  108. package/dist/native-pane-output-log.d.ts +15 -0
  109. package/dist/native-pane-output-log.js +108 -0
  110. package/dist/native-pane-output-log.js.map +1 -0
  111. package/dist/native-pane-reconciliation.d.ts +4 -0
  112. package/dist/native-pane-reconciliation.js +40 -0
  113. package/dist/native-pane-reconciliation.js.map +1 -0
  114. package/dist/native-pane-recovery.d.ts +12 -0
  115. package/dist/native-pane-recovery.js +10 -0
  116. package/dist/native-pane-recovery.js.map +1 -0
  117. package/dist/native-pane-tools.d.ts +2 -0
  118. package/dist/native-pane-tools.js +14 -0
  119. package/dist/native-pane-tools.js.map +1 -0
  120. package/dist/needs-you-hub.d.ts +2 -0
  121. package/dist/needs-you-hub.js +1 -0
  122. package/dist/needs-you-hub.js.map +1 -1
  123. package/dist/needs-you.d.ts +12 -1
  124. package/dist/needs-you.js +8 -1
  125. package/dist/needs-you.js.map +1 -1
  126. package/dist/outbound-handlers.d.ts +16 -2
  127. package/dist/outbound-handlers.js +67 -3
  128. package/dist/outbound-handlers.js.map +1 -1
  129. package/dist/outbound-schemas.d.ts +38 -0
  130. package/dist/outbound-schemas.js +12 -0
  131. package/dist/outbound-schemas.js.map +1 -1
  132. package/dist/pane-port.d.ts +107 -0
  133. package/dist/pane-port.js +2 -0
  134. package/dist/pane-port.js.map +1 -0
  135. package/dist/runtime-api.d.ts +8 -0
  136. package/dist/runtime-api.js +96 -0
  137. package/dist/runtime-api.js.map +1 -0
  138. package/dist/runtime-assets/@xterm/addon-serialize/LICENSE +21 -0
  139. package/dist/runtime-assets/@xterm/addon-serialize/lib/addon-serialize.js +2 -0
  140. package/dist/runtime-assets/@xterm/addon-serialize/lib/addon-serialize.mjs +19 -0
  141. package/dist/runtime-assets/@xterm/addon-serialize/package.json +29 -0
  142. package/dist/runtime-assets/@xterm/headless/LICENSE +21 -0
  143. package/dist/runtime-assets/@xterm/headless/lib-headless/xterm-headless.js +2 -0
  144. package/dist/runtime-assets/@xterm/headless/lib-headless/xterm-headless.mjs +46 -0
  145. package/dist/runtime-assets/@xterm/headless/package.json +29 -0
  146. package/dist/runtime-assets/node-pty/CONPTY-LICENSE +21 -0
  147. package/dist/runtime-assets/node-pty/CONPTY-NOTICE.md +503 -0
  148. package/dist/runtime-assets/node-pty/LICENSE +69 -0
  149. package/dist/runtime-assets/node-pty/lib/conpty_console_list_agent.js +16 -0
  150. package/dist/runtime-assets/node-pty/lib/eventEmitter2.js +47 -0
  151. package/dist/runtime-assets/node-pty/lib/index.js +52 -0
  152. package/dist/runtime-assets/node-pty/lib/interfaces.js +7 -0
  153. package/dist/runtime-assets/node-pty/lib/shared/conout.js +11 -0
  154. package/dist/runtime-assets/node-pty/lib/terminal.js +190 -0
  155. package/dist/runtime-assets/node-pty/lib/types.js +7 -0
  156. package/dist/runtime-assets/node-pty/lib/unixTerminal.js +346 -0
  157. package/dist/runtime-assets/node-pty/lib/utils.js +39 -0
  158. package/dist/runtime-assets/node-pty/lib/windowsConoutConnection.js +125 -0
  159. package/dist/runtime-assets/node-pty/lib/windowsPtyAgent.js +320 -0
  160. package/dist/runtime-assets/node-pty/lib/windowsTerminal.js +199 -0
  161. package/dist/runtime-assets/node-pty/lib/worker/conoutSocketWorker.js +22 -0
  162. package/dist/runtime-assets/node-pty/package.json +64 -0
  163. package/dist/runtime-assets/node-pty/prebuilds/win32-arm64/conpty/OpenConsole.exe +0 -0
  164. package/dist/runtime-assets/node-pty/prebuilds/win32-arm64/conpty/conpty.dll +0 -0
  165. package/dist/runtime-assets/node-pty/prebuilds/win32-arm64/conpty.node +0 -0
  166. package/dist/runtime-assets/node-pty/prebuilds/win32-arm64/conpty_console_list.node +0 -0
  167. package/dist/runtime-assets/node-pty/prebuilds/win32-x64/conpty/OpenConsole.exe +0 -0
  168. package/dist/runtime-assets/node-pty/prebuilds/win32-x64/conpty/conpty.dll +0 -0
  169. package/dist/runtime-assets/node-pty/prebuilds/win32-x64/conpty.node +0 -0
  170. package/dist/runtime-assets/node-pty/prebuilds/win32-x64/conpty_console_list.node +0 -0
  171. package/dist/runtime-bundle.d.ts +17 -0
  172. package/dist/runtime-bundle.js +147 -0
  173. package/dist/runtime-bundle.js.map +1 -0
  174. package/dist/runtime-cli.d.ts +2 -0
  175. package/dist/runtime-cli.js +117 -0
  176. package/dist/runtime-cli.js.map +1 -0
  177. package/dist/runtime-client-store.d.ts +49 -0
  178. package/dist/runtime-client-store.js +292 -0
  179. package/dist/runtime-client-store.js.map +1 -0
  180. package/dist/runtime-client.d.ts +100 -0
  181. package/dist/runtime-client.js +700 -0
  182. package/dist/runtime-client.js.map +1 -0
  183. package/dist/runtime-coordinator.d.ts +82 -0
  184. package/dist/runtime-coordinator.js +864 -0
  185. package/dist/runtime-coordinator.js.map +1 -0
  186. package/dist/runtime-pane-assets.d.ts +17 -0
  187. package/dist/runtime-pane-assets.js +23 -0
  188. package/dist/runtime-pane-assets.js.map +1 -0
  189. package/dist/runtime-pane-boot.d.ts +2 -0
  190. package/dist/runtime-pane-boot.js +24 -0
  191. package/dist/runtime-pane-boot.js.map +1 -0
  192. package/dist/runtime-pane-codex-index.d.ts +1 -0
  193. package/dist/runtime-pane-codex-index.js +47 -0
  194. package/dist/runtime-pane-codex-index.js.map +1 -0
  195. package/dist/runtime-pane-config.d.ts +16 -0
  196. package/dist/runtime-pane-config.js +54 -0
  197. package/dist/runtime-pane-config.js.map +1 -0
  198. package/dist/runtime-pane-host.d.ts +43 -0
  199. package/dist/runtime-pane-host.js +403 -0
  200. package/dist/runtime-pane-host.js.map +1 -0
  201. package/dist/runtime-pane-job-owner.d.ts +1 -0
  202. package/dist/runtime-pane-job-owner.js +29 -0
  203. package/dist/runtime-pane-job-owner.js.map +1 -0
  204. package/dist/runtime-pane-job.ps1 +116 -0
  205. package/dist/runtime-pane-link.d.ts +40 -0
  206. package/dist/runtime-pane-link.js +246 -0
  207. package/dist/runtime-pane-link.js.map +1 -0
  208. package/dist/runtime-pane-mcp-protocol.d.ts +32 -0
  209. package/dist/runtime-pane-mcp-protocol.js +39 -0
  210. package/dist/runtime-pane-mcp-protocol.js.map +1 -0
  211. package/dist/runtime-pane-mcp-relay.d.ts +17 -0
  212. package/dist/runtime-pane-mcp-relay.js +70 -0
  213. package/dist/runtime-pane-mcp-relay.js.map +1 -0
  214. package/dist/runtime-pane-mcp.d.ts +43 -0
  215. package/dist/runtime-pane-mcp.js +137 -0
  216. package/dist/runtime-pane-mcp.js.map +1 -0
  217. package/dist/runtime-pane-native.d.ts +45 -0
  218. package/dist/runtime-pane-native.js +65 -0
  219. package/dist/runtime-pane-native.js.map +1 -0
  220. package/dist/runtime-pane-output.d.ts +19 -0
  221. package/dist/runtime-pane-output.js +53 -0
  222. package/dist/runtime-pane-output.js.map +1 -0
  223. package/dist/runtime-pane-port.d.ts +134 -0
  224. package/dist/runtime-pane-port.js +537 -0
  225. package/dist/runtime-pane-port.js.map +1 -0
  226. package/dist/runtime-pane-private.d.ts +14 -0
  227. package/dist/runtime-pane-private.js +51 -0
  228. package/dist/runtime-pane-private.js.map +1 -0
  229. package/dist/runtime-pane-private.ps1 +14 -0
  230. package/dist/runtime-pane-process.d.ts +4 -0
  231. package/dist/runtime-pane-process.js +108 -0
  232. package/dist/runtime-pane-process.js.map +1 -0
  233. package/dist/runtime-pane-protocol.d.ts +169 -0
  234. package/dist/runtime-pane-protocol.js +189 -0
  235. package/dist/runtime-pane-protocol.js.map +1 -0
  236. package/dist/runtime-pane-screen.d.ts +19 -0
  237. package/dist/runtime-pane-screen.js +76 -0
  238. package/dist/runtime-pane-screen.js.map +1 -0
  239. package/dist/runtime-pane-service.d.ts +11 -0
  240. package/dist/runtime-pane-service.js +221 -0
  241. package/dist/runtime-pane-service.js.map +1 -0
  242. package/dist/runtime-pane-stdio-protocol.d.ts +54 -0
  243. package/dist/runtime-pane-stdio-protocol.js +94 -0
  244. package/dist/runtime-pane-stdio-protocol.js.map +1 -0
  245. package/dist/runtime-pane-stdio.d.ts +3 -0
  246. package/dist/runtime-pane-stdio.js +123 -0
  247. package/dist/runtime-pane-stdio.js.map +1 -0
  248. package/dist/runtime-pane-store.d.ts +33 -0
  249. package/dist/runtime-pane-store.js +164 -0
  250. package/dist/runtime-pane-store.js.map +1 -0
  251. package/dist/runtime-pane-transcript-protocol.d.ts +43 -0
  252. package/dist/runtime-pane-transcript-protocol.js +58 -0
  253. package/dist/runtime-pane-transcript-protocol.js.map +1 -0
  254. package/dist/runtime-pane-transcript.d.ts +45 -0
  255. package/dist/runtime-pane-transcript.js +605 -0
  256. package/dist/runtime-pane-transcript.js.map +1 -0
  257. package/dist/runtime-pane-worker.d.ts +1 -0
  258. package/dist/runtime-pane-worker.js +154 -0
  259. package/dist/runtime-pane-worker.js.map +1 -0
  260. package/dist/runtime-protocol.d.ts +149 -0
  261. package/dist/runtime-protocol.js +19 -0
  262. package/dist/runtime-protocol.js.map +1 -0
  263. package/dist/runtime-switches.d.ts +79 -0
  264. package/dist/runtime-switches.js +90 -0
  265. package/dist/runtime-switches.js.map +1 -0
  266. package/dist/runtime-transcript-delta-reader.d.ts +23 -0
  267. package/dist/runtime-transcript-delta-reader.js +74 -0
  268. package/dist/runtime-transcript-delta-reader.js.map +1 -0
  269. package/dist/runtime-transcript-source.d.ts +36 -0
  270. package/dist/runtime-transcript-source.js +189 -0
  271. package/dist/runtime-transcript-source.js.map +1 -0
  272. package/dist/runtime-windows-bridge.d.ts +41 -0
  273. package/dist/runtime-windows-bridge.js +157 -0
  274. package/dist/runtime-windows-bridge.js.map +1 -0
  275. package/dist/settings-api.js +58 -0
  276. package/dist/settings-api.js.map +1 -1
  277. package/dist/settings-change.js +28 -0
  278. package/dist/settings-change.js.map +1 -1
  279. package/dist/settings-confirmation.d.ts +15 -1
  280. package/dist/settings-confirmation.js +46 -9
  281. package/dist/settings-confirmation.js.map +1 -1
  282. package/dist/settings-effect.js +23 -1
  283. package/dist/settings-effect.js.map +1 -1
  284. package/dist/settings-http-confirmation.js +11 -2
  285. package/dist/settings-http-confirmation.js.map +1 -1
  286. package/dist/tmux-control.d.ts +2 -1
  287. package/dist/tmux-control.js.map +1 -1
  288. package/dist/tmux-manager.d.ts +2 -1
  289. package/dist/tmux-manager.js.map +1 -1
  290. package/dist/tmux-pane-host.d.ts +26 -0
  291. package/dist/tmux-pane-host.js +25 -0
  292. package/dist/tmux-pane-host.js.map +1 -0
  293. package/dist/topic-commands.js +3 -0
  294. package/dist/topic-commands.js.map +1 -1
  295. package/dist/transcript-delta-reader.d.ts +1 -1
  296. package/dist/transcript-delta-reader.js +1 -1
  297. package/dist/transcript-delta-reader.js.map +1 -1
  298. package/dist/transcript-monitor.d.ts +3 -0
  299. package/dist/transcript-monitor.js +22 -46
  300. package/dist/transcript-monitor.js.map +1 -1
  301. package/dist/transcript-needles.d.ts +35 -0
  302. package/dist/transcript-needles.js +158 -0
  303. package/dist/transcript-needles.js.map +1 -0
  304. package/dist/transcript-records.d.ts +21 -0
  305. package/dist/transcript-records.js +140 -0
  306. package/dist/transcript-records.js.map +1 -0
  307. package/dist/transcript-sources.d.ts +5 -0
  308. package/dist/transcript-sources.js +8 -79
  309. package/dist/transcript-sources.js.map +1 -1
  310. package/dist/types.d.ts +21 -0
  311. package/dist/ui/agent-proposals.js +90 -0
  312. package/dist/ui/agent-runtime.js +106 -0
  313. package/dist/ui/chat-store.js +13 -2
  314. package/dist/ui/chat-strings.js +48 -0
  315. package/dist/ui/cli-picker.js +42 -0
  316. package/dist/ui/native-instance-settings.js +47 -0
  317. package/dist/ui/native-pane-recovery.js +45 -0
  318. package/dist/ui/panel-chat.js +61 -32
  319. package/dist/ui/panel-details.js +2 -1
  320. package/dist/ui/panel-fleet.js +99 -18
  321. package/dist/ui/panel-needs.js +152 -3
  322. package/dist/ui/panel-runtimes.js +231 -0
  323. package/dist/ui/panel-settings.js +14 -8
  324. package/dist/ui/panel-windows-agent.js +86 -0
  325. package/dist/ui/panel-windows-cli.js +143 -0
  326. package/dist/ui/provider-marks.js +83 -0
  327. package/dist/ui/runtime-catalog.js +55 -0
  328. package/dist/ui/settings-catalog.js +37 -10
  329. package/dist/ui/settings-confirm.js +3 -1
  330. package/dist/ui/settings-dialogs.js +14 -5
  331. package/dist/ui/settings-registry.js +5 -0
  332. package/dist/ui/settings-strings.js +14 -0
  333. package/dist/ui/shared/app-i18n.js +2 -2
  334. package/dist/ui/shared/app-route.js +6 -2
  335. package/dist/ui/shared/app-shell.js +3 -2
  336. package/dist/ui/shared/app-store.js +1 -0
  337. package/dist/ui/shared/app-stream.js +3 -1
  338. package/dist/ui/shared/app.css +301 -0
  339. package/dist/ui/shared/app.js +4 -0
  340. package/dist/ui/shared/header-tools.js +6 -4
  341. package/dist/ui/shared/instance-nav.js +20 -4
  342. package/dist/ui/shared/instance-switch.js +4 -3
  343. package/dist/ui/shared/ui-menu.js +28 -8
  344. package/dist/ui/shared/view-strings.js +6 -0
  345. package/dist/ui/windows-agents-nav.js +2 -0
  346. package/dist/ui/windows-cli-catalog.js +79 -0
  347. package/dist/update-check.d.ts +8 -2
  348. package/dist/update-check.js +5 -2
  349. package/dist/update-check.js.map +1 -1
  350. package/dist/web-api.d.ts +25 -0
  351. package/dist/web-api.js +171 -6
  352. package/dist/web-api.js.map +1 -1
  353. package/dist/web-chat-history.d.ts +19 -2
  354. package/dist/web-chat-history.js +72 -3
  355. package/dist/web-chat-history.js.map +1 -1
  356. package/dist/web-shell-routes.d.ts +4 -1
  357. package/dist/web-shell-routes.js +7 -2
  358. package/dist/web-shell-routes.js.map +1 -1
  359. package/dist/windows-agents.d.ts +112 -0
  360. package/dist/windows-agents.js +463 -0
  361. package/dist/windows-agents.js.map +1 -0
  362. package/dist/windows-cli-api.d.ts +23 -0
  363. package/dist/windows-cli-api.js +158 -0
  364. package/dist/windows-cli-api.js.map +1 -0
  365. package/dist/windows-cli-providers.d.ts +115 -0
  366. package/dist/windows-cli-providers.js +429 -0
  367. package/dist/windows-cli-providers.js.map +1 -0
  368. package/dist/windows-cli-worker.d.ts +58 -0
  369. package/dist/windows-cli-worker.js +479 -0
  370. package/dist/windows-cli-worker.js.map +1 -0
  371. package/dist/windows-cli.d.ts +115 -0
  372. package/dist/windows-cli.js +402 -0
  373. package/dist/windows-cli.js.map +1 -0
  374. package/dist/windows-native-mcp.d.ts +19 -0
  375. package/dist/windows-native-mcp.js +143 -0
  376. package/dist/windows-native-mcp.js.map +1 -0
  377. package/dist/windows-pane-mcp.d.ts +26 -0
  378. package/dist/windows-pane-mcp.js +187 -0
  379. package/dist/windows-pane-mcp.js.map +1 -0
  380. package/package.json +9 -3
  381. package/templates/runtime-assets/conpty-LICENSE +21 -0
  382. package/templates/runtime-assets/conpty-NOTICE.md +503 -0
  383. package/templates/runtime-assets/local-pane-stage.ps1 +101 -0
  384. package/templates/runtime-assets/runtime-pane-job.ps1 +116 -0
  385. package/templates/runtime-assets/runtime-pane-private.ps1 +14 -0
  386. package/templates/runtime-assets/xterm-LICENSE +21 -0
@@ -0,0 +1,403 @@
1
+ import { RuntimePaneOutputBuffer } from "./runtime-pane-output.js";
2
+ /** Runner-owned, persistent CLI panes. A coordinator reconnect neither launches nor replays anything. */
3
+ import { randomUUID } from "node:crypto";
4
+ import { RuntimePaneStore } from "./runtime-pane-store.js";
5
+ import { RuntimePaneScreen } from "./runtime-pane-screen.js";
6
+ import { PANE_EDIT_KEYS, validateRuntimePaneRequest } from "./runtime-pane-protocol.js";
7
+ import { spawnNativePane } from "./runtime-pane-process.js";
8
+ import { NativePaneTranscriptReader, nativeClaudeSessionState, nativeCodexSessionState } from "./runtime-pane-transcript.js";
9
+ import { validatePaneTranscriptBaseline, validatePaneTranscriptWireBatch } from "./runtime-pane-transcript-protocol.js";
10
+ export { persistentNativeArguments } from "./runtime-pane-native.js";
11
+ const KEYS = { Enter: "\r", Escape: "\x1b", Up: "\x1b[A", Down: "\x1b[B", Right: "\x1b[C", Left: "\x1b[D", "C-c": "\x03", "C-q": "\x11" };
12
+ export class RuntimePaneHost {
13
+ options;
14
+ live = new Map();
15
+ queues = new Map();
16
+ closing = false;
17
+ constructor(options) {
18
+ this.options = options;
19
+ }
20
+ list() {
21
+ for (const row of this.options.store.list())
22
+ if (!this.live.has(row.launch.paneId))
23
+ this.options.store.reconcileExit(row.launch.paneId);
24
+ return this.options.store.list().map(row => structuredClone(this.live.get(row.launch.paneId)?.record.snapshot ?? row.snapshot));
25
+ }
26
+ /** Exact live reservation; no PID adoption or scans of other panes. */
27
+ owns(owner) {
28
+ if (this.closing || owner.hostBootId !== this.options.bootId)
29
+ return false;
30
+ try {
31
+ const pane = this.live.get(owner.paneId)?.record.snapshot ?? this.options.store.get(owner.paneId)?.snapshot;
32
+ return !!pane && pane.hostBootId === owner.hostBootId && pane.launchId === owner.launchId && pane.agentId === owner.agentId
33
+ && pane.instance === owner.instance && (pane.state === "starting" || pane.state === "running");
34
+ }
35
+ catch {
36
+ return false;
37
+ }
38
+ }
39
+ async request(raw, current = () => true) {
40
+ const request = validateRuntimePaneRequest(raw);
41
+ if (request.action === "list")
42
+ return { hostBootId: this.options.bootId, capabilities: { openDisposition: true, recovery: true, claudeSessionProof: true, codexSessionProof: true }, panes: this.list() };
43
+ if (this.closing || !this.options.online() || !current())
44
+ throw Error("Pane runtime is disconnected");
45
+ if (request.action === "shutdown") {
46
+ // No await between the inventory, admission fence and reply. An accepted/queued launch or an unknown
47
+ // reservation prevents shutdown; disconnect/lease loss alone never tears down a persistent host.
48
+ if (request.hostBootId !== this.options.bootId || this.queues.size || this.list().some(pane => pane.state !== "exited"))
49
+ throw Error("Pane host still has live or unconfirmed work");
50
+ this.closing = true;
51
+ return { hostBootId: this.options.bootId, shutdown: true };
52
+ }
53
+ const id = request.action === "open" ? request.launch.paneId : request.paneId;
54
+ const queue = this.queues.get(id) ?? { tail: Promise.resolve(), count: 0 };
55
+ if (queue.count >= 16)
56
+ throw Error("Pane operation queue is full");
57
+ queue.count++;
58
+ this.queues.set(id, queue);
59
+ const operation = queue.tail.catch(() => { }).then(async () => {
60
+ if (this.closing || !this.options.online() || !current())
61
+ throw Error("Pane runtime is disconnected");
62
+ return request.action === "open" ? this.open(request) : request.action === "recover" ? this.recover(request) : this.operate(request, current);
63
+ });
64
+ queue.tail = operation;
65
+ try {
66
+ return await operation;
67
+ }
68
+ finally {
69
+ if (--queue.count === 0 && this.queues.get(id) === queue)
70
+ this.queues.delete(id);
71
+ }
72
+ }
73
+ async open(request) {
74
+ const { launch, operationId } = request;
75
+ const digest = RuntimePaneStore.digest(launch);
76
+ const existing = this.options.store.get(launch.paneId);
77
+ if (existing) {
78
+ if (existing.openOperationId !== operationId || existing.openDigest !== digest)
79
+ throw Error("Pane id already belongs to another launch");
80
+ const live = this.live.get(launch.paneId);
81
+ if (!live && existing.snapshot.state !== "exited")
82
+ throw Error("Pane launch outcome is unknown; no replacement was started");
83
+ return { ...structuredClone(live?.record.snapshot ?? existing.snapshot), reattached: true };
84
+ }
85
+ this.list();
86
+ const rows = this.options.store.list();
87
+ const limit = this.options.maxAgents();
88
+ if (!Number.isInteger(limit) || limit < 1 || limit > 16)
89
+ throw Error("Invalid machine pane limit");
90
+ if (launch.launchId && rows.some(row => row.snapshot.launchId === launch.launchId))
91
+ throw Error("Pane launch identity already belongs to another pane");
92
+ const record = {
93
+ ...(this.options.systemBootId ? { systemBootId: this.options.systemBootId } : {}),
94
+ launch, openDigest: digest, openOperationId: operationId, bootId: this.options.bootId,
95
+ snapshot: { hostBootId: this.options.bootId, paneId: launch.paneId, agentId: launch.agentId, instance: launch.instance, launchId: launch.launchId ?? randomUUID(), columns: launch.columns, rows: launch.rows,
96
+ state: "starting", seq: 0, outputAt: 0, commandSequence: 0 },
97
+ };
98
+ const sessionId = launch.sessionId ?? (launch.cli === "claude-code" ? record.snapshot.launchId : undefined);
99
+ if (sessionId)
100
+ record.snapshot.sessionId = sessionId;
101
+ if (rows.some(row => row.launch.agentId === launch.agentId && row.snapshot.state !== "exited")
102
+ || rows.filter(row => row.snapshot.state !== "exited").length >= limit) {
103
+ // A durable tombstone consumes this open identity. Even a lost refusal ACK cannot turn its retry into a launch.
104
+ // Never issue this proof for a spawn exception: the factory may have created a child before throwing.
105
+ record.snapshot.state = "exited";
106
+ record.snapshot.noLaunch = true;
107
+ this.options.store.put(record);
108
+ return { ...structuredClone(record.snapshot), reattached: false };
109
+ }
110
+ // Synchronous reservation before the first await: parallel opens cannot oversubscribe the machine.
111
+ this.options.store.put(record);
112
+ let process;
113
+ try {
114
+ const owner = { directory: this.options.store.directory, launchId: record.snapshot.launchId };
115
+ if (launch.mcpTools) {
116
+ if (!this.options.mcpConnection)
117
+ throw Error("Persistent pane MCP authority is unavailable");
118
+ owner.mcp = this.options.mcpConnection({ hostBootId: this.options.bootId, paneId: launch.paneId, launchId: record.snapshot.launchId, agentId: launch.agentId, instance: launch.instance }, launch.mcpTools);
119
+ }
120
+ process = await (this.options.spawn ? this.options.spawn(launch, owner) : spawnNativePane(launch, owner));
121
+ let finish;
122
+ const exited = new Promise(resolve => { finish = resolve; });
123
+ const screen = new RuntimePaneScreen(launch.columns, launch.rows, data => {
124
+ if (this.live.get(launch.paneId)?.record === record && record.snapshot.state === "running")
125
+ process.write(data);
126
+ });
127
+ const live = { record, process, screen, parsed: Promise.resolve(), output: new RuntimePaneOutputBuffer(), exited, finish };
128
+ this.live.set(launch.paneId, live);
129
+ record.pid = process.pid;
130
+ record.snapshot.state = "running";
131
+ process.onFailure?.(() => {
132
+ if (record.snapshot.state === "exited")
133
+ return;
134
+ record.snapshot.state = "unknown";
135
+ try {
136
+ this.options.store.put(record);
137
+ }
138
+ catch { /* retained on disk as unfinished */ }
139
+ });
140
+ process.onData(data => {
141
+ if (this.live.get(launch.paneId) !== live)
142
+ return;
143
+ live.output.append(data);
144
+ // Invalidate observations when bytes arrive, not later when the VT parser finishes. A queued repaint
145
+ // already makes an old composer proof unsafe, even while capture or parser completion is awaiting.
146
+ record.snapshot.seq++;
147
+ record.snapshot.outputAt = Date.now();
148
+ live.parsed = screen.write(data).then(() => {
149
+ try {
150
+ this.options.output?.(structuredClone(record.snapshot));
151
+ }
152
+ catch { /* observer backpressure cannot change process ownership */ }
153
+ }).catch(() => {
154
+ record.snapshot.state = "unknown";
155
+ try {
156
+ process.pause();
157
+ this.options.store.put(record);
158
+ }
159
+ catch { /* reserved until exit is proven */ }
160
+ });
161
+ });
162
+ process.onExit(({ exitCode }) => {
163
+ record.snapshot.state = "exited";
164
+ record.snapshot.exitCode = exitCode;
165
+ try {
166
+ this.options.store.put(record);
167
+ }
168
+ catch { /* an old live record stays reserved on restart */ }
169
+ finish();
170
+ try {
171
+ this.options.output?.(structuredClone(record.snapshot));
172
+ }
173
+ catch { /* process exit is independent of its observer */ }
174
+ const retired = [...this.live.values()].filter(row => row.record.snapshot.state === "exited");
175
+ for (const old of retired.slice(0, Math.max(0, retired.length - 16))) {
176
+ void old.transcript?.close().catch(() => { });
177
+ old.screen.dispose();
178
+ this.live.delete(old.record.launch.paneId);
179
+ }
180
+ });
181
+ this.options.store.put(record);
182
+ if (this.closing) {
183
+ process.kill();
184
+ throw Error("Pane host stopped during launch");
185
+ }
186
+ return { ...structuredClone(record.snapshot), reattached: false };
187
+ }
188
+ catch (error) {
189
+ if (process) {
190
+ try {
191
+ process.kill();
192
+ }
193
+ catch { /* retain uncertain reservation */ }
194
+ }
195
+ // A launch factory may fail after creating a native child. Only onExit proves there is no process.
196
+ if (record.snapshot.state !== "exited")
197
+ record.snapshot.state = "unknown";
198
+ this.options.store.put(record);
199
+ throw error;
200
+ }
201
+ }
202
+ recover(request) {
203
+ const record = this.options.store.get(request.paneId);
204
+ if (!record || record.snapshot.launchId !== request.launchId || record.snapshot.hostBootId !== request.hostBootId)
205
+ throw Error("Recovery needs the exact retained pane with no live host owner");
206
+ if (record.snapshot.state === "exited")
207
+ return structuredClone(record.snapshot);
208
+ if (this.live.has(request.paneId) || record.snapshot.state !== "unknown" || record.bootId === this.options.bootId || request.confirmedStopped !== true)
209
+ throw Error("The retained pane is not eligible for stopped-process recovery");
210
+ record.snapshot.state = "exited";
211
+ record.snapshot.exitProof = "admin-confirmed";
212
+ delete record.snapshot.exitCode;
213
+ this.options.store.put(record);
214
+ return structuredClone(record.snapshot);
215
+ }
216
+ async operate(request, current) {
217
+ const live = this.live.get(request.paneId);
218
+ const stored = this.options.store.get(request.paneId);
219
+ if (!stored || stored.snapshot.launchId !== request.launchId)
220
+ throw Error("Pane launch identity is stale");
221
+ if (request.action === "snapshot")
222
+ return structuredClone(live?.record.snapshot ?? stored.snapshot);
223
+ if (request.action === "session-proof") {
224
+ const { launch, snapshot } = live?.record ?? stored;
225
+ if (!["claude-code", "codex"].includes(launch.cli) || snapshot.state !== "exited" || snapshot.noLaunch || !snapshot.sessionId)
226
+ throw Error("Session proof requires an exited supported pane");
227
+ let settled = false, timer;
228
+ const lease = () => !settled && !this.closing && this.options.online() && current();
229
+ const read = this.options.sessionProof
230
+ ? this.options.sessionProof(launch, snapshot.sessionId, lease)
231
+ : (launch.cli === "codex" ? nativeCodexSessionState : nativeClaudeSessionState)(launch.cwd, snapshot.sessionId, lease);
232
+ try {
233
+ const state = await Promise.race([read, new Promise(done => { timer = setTimeout(() => done("unknown"), 1500); })]);
234
+ return { snapshot: structuredClone(snapshot), state: lease() && ["absent", "saved", "unknown"].includes(state) ? state : "unknown" };
235
+ }
236
+ catch {
237
+ return { snapshot: structuredClone(snapshot), state: "unknown" };
238
+ }
239
+ finally {
240
+ settled = true;
241
+ clearTimeout(timer);
242
+ void read.catch(() => { });
243
+ }
244
+ }
245
+ if (!live && request.action === "capture" && stored.snapshot.state === "exited")
246
+ return { snapshot: structuredClone(stored.snapshot), text: "" };
247
+ if (!live)
248
+ throw Error("Pane process is not owned by this runner; its reservation is retained");
249
+ const record = live.record;
250
+ if (request.action === "output")
251
+ return live.output.read(request.offset, record.snapshot.state === "exited");
252
+ await live.parsed;
253
+ if (request.action === "capture") {
254
+ const seq = record.snapshot.seq, text = await live.screen.capture(request);
255
+ if (seq !== record.snapshot.seq)
256
+ throw Error("Pane changed during capture; observe it again");
257
+ return { snapshot: structuredClone(record.snapshot), text };
258
+ }
259
+ if (request.action === "bind-session") {
260
+ const expected = record.snapshot.sessionId ?? record.launch.sessionId ?? (record.launch.cli === "claude-code" ? record.snapshot.launchId : undefined);
261
+ if (expected && expected !== request.sessionId)
262
+ throw Error("Pane conversation identity is already pinned elsewhere");
263
+ if (!expected) {
264
+ if (record.snapshot.state !== "running")
265
+ throw Error("An unowned pane cannot establish a conversation identity");
266
+ const text = await live.screen.capture({ history: 200, joined: true });
267
+ const ids = [...text.matchAll(/\bSession:\s*([a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})\b/gi)].map(match => match[1]);
268
+ if (ids.length !== 1 || ids[0] !== request.sessionId)
269
+ throw Error("The owned pane has no unique matching status identity");
270
+ }
271
+ if (!current() || !this.options.online() || this.closing)
272
+ throw Error("Pane session binding lease expired");
273
+ if (record.snapshot.sessionId !== request.sessionId) {
274
+ record.snapshot.sessionId = request.sessionId;
275
+ try {
276
+ this.options.store.put(record);
277
+ }
278
+ catch (error) {
279
+ delete record.snapshot.sessionId;
280
+ throw error;
281
+ }
282
+ }
283
+ return structuredClone(record.snapshot);
284
+ }
285
+ if (request.action === "transcript" || request.action === "transcript-baseline")
286
+ return this.readTranscript(live, request.cursor, current, request.action === "transcript-baseline");
287
+ if (request.action === "reconcile") {
288
+ if (record.snapshot.commandSequence !== request.sequence || record.lastCommand?.id !== request.operationId
289
+ || record.lastCommand.digest !== request.digest || record.lastCommand.state !== "applied")
290
+ throw Error("Pane command outcome is unconfirmed");
291
+ return structuredClone(record.snapshot);
292
+ }
293
+ if (!current() || !this.options.online())
294
+ throw Error("Pane input lease expired");
295
+ const digest = RuntimePaneStore.digest(request);
296
+ if (request.sequence === record.snapshot.commandSequence) {
297
+ if (record.lastCommand?.id !== request.operationId || record.lastCommand.digest !== digest)
298
+ throw Error("Pane input sequence belongs to another command");
299
+ if (record.lastCommand.state !== "applied")
300
+ throw Error("Pane input outcome is unknown; it will not be replayed");
301
+ return structuredClone(record.snapshot);
302
+ }
303
+ if (request.sequence !== record.snapshot.commandSequence + 1)
304
+ throw Error("Pane input sequence is stale or has a gap");
305
+ if (record.lastCommand?.state === "prepared" && request.action !== "close")
306
+ throw Error("Previous pane input outcome is unknown");
307
+ if (record.snapshot.state !== "running" && request.action !== "close")
308
+ throw Error("Pane process is not confirmed running");
309
+ record.snapshot.commandSequence = request.sequence;
310
+ record.lastCommand = { id: request.operationId, digest, state: "prepared" };
311
+ delete record.snapshot.inputRefused;
312
+ if ((request.action === "input" || request.action === "key" || request.action === "edit") && request.expectedSeq !== record.snapshot.seq) {
313
+ // Positively no input. Consume this command identity: a lost refusal ACK must never become a later key.
314
+ record.snapshot.inputRefused = true;
315
+ record.lastCommand.state = "applied";
316
+ this.options.store.put(record);
317
+ return structuredClone(record.snapshot);
318
+ }
319
+ // Durable before input: a crash after this write must hold, never duplicate Enter.
320
+ this.options.store.put(record);
321
+ if (request.action === "input")
322
+ live.process.write(request.kind === "paste" ? live.screen.bracketedPaste(request.text) : request.text);
323
+ else if (request.action === "edit")
324
+ live.process.write(request.keys.map(key => PANE_EDIT_KEYS[key]).join("").repeat(request.repeat ?? 1));
325
+ else if (request.action === "key")
326
+ live.process.write(KEYS[request.key]);
327
+ else if (request.action === "resize") {
328
+ live.process.resize(request.columns, request.rows);
329
+ await live.screen.resize(request.columns, request.rows);
330
+ record.snapshot.columns = request.columns;
331
+ record.snapshot.rows = request.rows;
332
+ }
333
+ else {
334
+ live.process.kill();
335
+ let timer;
336
+ const stopped = await Promise.race([live.exited.then(() => true), new Promise(resolve => { timer = setTimeout(() => resolve(false), 10_000); })]);
337
+ clearTimeout(timer);
338
+ if (!stopped)
339
+ record.snapshot.state = "unknown";
340
+ }
341
+ record.lastCommand.state = "applied";
342
+ this.options.store.put(record);
343
+ return structuredClone(record.snapshot);
344
+ }
345
+ async readTranscript(live, cursor, current, baseline = false) {
346
+ const { launch, snapshot } = live.record;
347
+ if (!snapshot.sessionId || cursor.sessionId !== snapshot.sessionId)
348
+ throw Error("Transcript identity differs from its owned pane");
349
+ if (snapshot.state !== "running" && snapshot.state !== "exited")
350
+ throw Error("Transcript pane ownership is unconfirmed");
351
+ live.transcript ??= this.options.transcript?.(launch, snapshot.sessionId) ?? new NativePaneTranscriptReader(launch.cli, launch.cwd, snapshot.sessionId);
352
+ let settled = false, timer;
353
+ const lease = () => !settled && !this.closing && current() && this.options.online();
354
+ const read = baseline ? live.transcript.baseline?.(cursor, lease) ?? Promise.resolve({ state: "pending", cursor, complete: false, turnKnown: false, openTurn: null }) : live.transcript.read(cursor, lease);
355
+ try {
356
+ const batch = await Promise.race([read, new Promise((_resolve, reject) => { timer = setTimeout(() => reject(Error("Pane transcript read deadline exceeded")), 1000); })]);
357
+ if (!lease())
358
+ throw Error("Pane transcript read lease expired");
359
+ if (baseline)
360
+ return validatePaneTranscriptBaseline(batch, snapshot.sessionId);
361
+ if (!("data" in batch))
362
+ throw Error("Pane transcript response has no records");
363
+ return validatePaneTranscriptWireBatch({ state: batch.state, cursor: batch.cursor, data: batch.data, complete: batch.complete, gap: batch.gap }, snapshot.sessionId);
364
+ }
365
+ finally {
366
+ settled = true;
367
+ clearTimeout(timer);
368
+ void read.catch(() => { });
369
+ }
370
+ }
371
+ async stop() {
372
+ this.closing = true;
373
+ for (const live of this.live.values())
374
+ if (live.record.snapshot.state !== "exited") {
375
+ try {
376
+ live.process.kill();
377
+ }
378
+ catch {
379
+ live.record.snapshot.state = "unknown";
380
+ }
381
+ }
382
+ // Pending opens recheck admission and retire their own process; no new request can enter.
383
+ await Promise.allSettled([...this.queues.values()].map(queue => queue.tail));
384
+ // A request to close is not exit evidence. Keep native helpers alive until their job receipt or the bounded hold.
385
+ const remaining = [...this.live.values()].filter(live => live.record.snapshot.state !== "exited");
386
+ let timer;
387
+ if (remaining.length)
388
+ await Promise.race([Promise.all(remaining.map(live => live.exited)), new Promise(done => { timer = setTimeout(done, 10_000); })]);
389
+ clearTimeout(timer);
390
+ for (const live of this.live.values()) {
391
+ if (live.record.snapshot.state !== "exited")
392
+ live.record.snapshot.state = "unknown";
393
+ try {
394
+ this.options.store.put(live.record);
395
+ }
396
+ finally {
397
+ live.screen.dispose();
398
+ void live.transcript?.close().catch(() => { });
399
+ }
400
+ }
401
+ }
402
+ }
403
+ //# sourceMappingURL=runtime-pane-host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-pane-host.js","sourceRoot":"","sources":["../src/runtime-pane-host.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function runPaneJobOwner(args: string[]): void;
@@ -0,0 +1,29 @@
1
+ /** Detached native Node owner: Windows PowerShell needs an attached launch, even with redirected pipes. */
2
+ import { spawn } from "./child-process.js";
3
+ import { join, resolve } from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { validWindowsAgentId, validWindowsDirectory, nativeCliEnvironment } from "./windows-cli-worker.js";
6
+ export function runPaneJobOwner(args) {
7
+ const [directory, launch, pane, agent, owner] = args;
8
+ if (process.platform !== "win32" || args.length !== 5 || !validWindowsDirectory(directory)
9
+ || ![launch, pane, agent].every(validWindowsAgentId) || !/^[1-9]\d{0,9}$/.test(owner))
10
+ throw Error("Invalid local pane owner");
11
+ // Only fixed program paths. The private first stdin frame still controls the validated configured CLI.
12
+ const child = spawn(join(process.env.SystemRoot || "C:\\Windows", "System32", "WindowsPowerShell", "v1.0", "powershell.exe"), [
13
+ "-NoProfile", "-NonInteractive", "-ExecutionPolicy", "Bypass", "-File", fileURLToPath(new URL("./runtime-pane-job.ps1", import.meta.url)),
14
+ "-NodePath", process.execPath, "-WorkerPath", fileURLToPath(new URL("./runtime-pane-worker.js", import.meta.url)),
15
+ "-StateDirectory", directory, "-LaunchId", launch, "-PaneId", pane, "-AgentId", agent,
16
+ "-OwnerPid", owner, "-ReceiptPid", String(process.pid),
17
+ ], { windowsHide: true, shell: false, env: nativeCliEnvironment(), stdio: "inherit" });
18
+ child.on("error", () => { process.exitCode = 1; });
19
+ child.on("close", code => { process.exitCode = code ?? 1; });
20
+ }
21
+ if (process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {
22
+ try {
23
+ runPaneJobOwner(process.argv.slice(2));
24
+ }
25
+ catch {
26
+ process.exitCode = 1;
27
+ }
28
+ }
29
+ //# sourceMappingURL=runtime-pane-job-owner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-pane-job-owner.js","sourceRoot":"","sources":["../src/runtime-pane-job-owner.ts"],"names":[],"mappings":"AAAA,2GAA2G;AAC3G,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAE3G,MAAM,UAAU,eAAe,CAAC,IAAc;IAC5C,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC;IACrD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC;WACrF,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,MAAM,KAAK,CAAC,0BAA0B,CAAC,CAAC;IACjI,uGAAuG;IACvG,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,aAAa,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE;QAC5H,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,CAAC,IAAI,GAAG,CAAC,wBAAwB,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;QACzI,WAAW,EAAE,OAAO,CAAC,QAAQ,EAAE,aAAa,EAAE,aAAa,CAAC,IAAI,GAAG,CAAC,0BAA0B,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;QACjH,iBAAiB,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK;QACrF,WAAW,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;KACvD,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,oBAAoB,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IACvF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/D,CAAC;AACD,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IACnF,IAAI,CAAC;QAAC,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IAAC,CAAC;AACjF,CAAC"}
@@ -0,0 +1,116 @@
1
+ param(
2
+ [Parameter(Mandatory=$true)][string]$NodePath,
3
+ [Parameter(Mandatory=$true)][string]$WorkerPath,
4
+ [Parameter(Mandatory=$true)][string]$StateDirectory,
5
+ [Parameter(Mandatory=$true)][string]$LaunchId,
6
+ [Parameter(Mandatory=$true)][string]$PaneId,
7
+ [Parameter(Mandatory=$true)][string]$AgentId,
8
+ [Parameter(Mandatory=$true)][int]$OwnerPid,
9
+ [Parameter(Mandatory=$true)][int]$ReceiptPid
10
+ )
11
+ $ErrorActionPreference = 'Stop'
12
+ # Built-in Windows APIs only. The helper receives no stdin until its process HANDLE is assigned to the job.
13
+ # https://learn.microsoft.com/windows/win32/procthread/job-objects
14
+ Add-Type -ReferencedAssemblies System.Web.Extensions -TypeDefinition @'
15
+ using System;
16
+ using System.IO;
17
+ using System.Text;
18
+ using System.Diagnostics;
19
+ using System.Threading;
20
+ using System.Threading.Tasks;
21
+ using System.Collections.Generic;
22
+ using System.Runtime.InteropServices;
23
+ using System.Web.Script.Serialization;
24
+ public static class AgendPaneJob {
25
+ [StructLayout(LayoutKind.Sequential)] struct Limits {
26
+ public long ProcessTime,JobTime; public uint Flags; public UIntPtr MinWorking,MaxWorking;
27
+ public uint ProcessLimit; public UIntPtr Affinity; public uint Priority,Scheduling;
28
+ }
29
+ [StructLayout(LayoutKind.Sequential)] struct Io { public ulong A,B,C,D,E,F; }
30
+ [StructLayout(LayoutKind.Sequential)] struct Extended { public Limits Basic; public Io Io; public UIntPtr ProcessMemory,JobMemory,PeakProcess,PeakJob; }
31
+ [StructLayout(LayoutKind.Sequential)] struct Accounting { public long A,B,C,D; public uint Faults,Total,Active,Terminated; }
32
+ [DllImport("kernel32.dll",CharSet=CharSet.Unicode,SetLastError=true)] static extern IntPtr CreateJobObject(IntPtr security,string name);
33
+ [DllImport("kernel32.dll",SetLastError=true)] static extern bool SetInformationJobObject(IntPtr job,int kind,ref Extended value,uint size);
34
+ [DllImport("kernel32.dll",SetLastError=true)] static extern bool QueryInformationJobObject(IntPtr job,int kind,ref Accounting value,uint size,IntPtr length);
35
+ [DllImport("kernel32.dll",SetLastError=true)] static extern bool AssignProcessToJobObject(IntPtr job,IntPtr process);
36
+ [DllImport("kernel32.dll",SetLastError=true)] static extern bool TerminateJobObject(IntPtr job,uint code);
37
+ [DllImport("kernel32.dll")] static extern bool CloseHandle(IntPtr handle);
38
+ static string Quote(string value) {
39
+ var result=new StringBuilder("\"");int slashes=0;
40
+ foreach(char c in value) { if(c=='\\'){slashes++;continue;} if(c=='\"')result.Append('\\',slashes*2+1);else result.Append('\\',slashes);result.Append(c);slashes=0; }
41
+ result.Append('\\',slashes*2);return result.Append('"').ToString();
42
+ }
43
+ static void Check(bool ok) { if(!ok)throw new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error()); }
44
+ static uint Active(IntPtr job) { var value=new Accounting();Check(QueryInformationJobObject(job,1,ref value,(uint)Marshal.SizeOf(value),IntPtr.Zero));return value.Active; }
45
+ static void Receipt(string directory,string launch,string pane,string agent,int receiptPid,long code) {
46
+ Guid parsed; if(!Guid.TryParse(launch,out parsed)||!Guid.TryParse(pane,out parsed)||!Guid.TryParse(agent,out parsed))throw new InvalidOperationException();
47
+ var json=new JavaScriptSerializer().Serialize(new {version=1,launchId=launch,paneId=pane,agentId=agent,pid=receiptPid,code=code});
48
+ string exits=Path.Combine(directory,"exits");Directory.CreateDirectory(exits);
49
+ string file=Path.Combine(exits,launch+".json"),temp=file+"."+Guid.NewGuid().ToString("N")+".tmp";
50
+ byte[] bytes=new UTF8Encoding(false).GetBytes(json);
51
+ using(var stream=new FileStream(temp,FileMode.CreateNew,FileAccess.Write,FileShare.None)){stream.Write(bytes,0,bytes.Length);stream.Flush(true);}
52
+ for(int attempt=0;;attempt++){
53
+ try{File.Move(temp,file);break;}
54
+ catch(IOException){if(attempt>=4)throw;Thread.Sleep(10*(attempt+1));}
55
+ catch(UnauthorizedAccessException){if(attempt>=4)throw;Thread.Sleep(10*(attempt+1));}
56
+ }
57
+ }
58
+ public static int Run(string node,string worker,string directory,string launch,string pane,string agent,int ownerPid,int receiptPid) {
59
+ IntPtr job=IntPtr.Zero;Process child=null,owner=null;bool assigned=false;string phase="create";
60
+ var clock=Stopwatch.StartNew();long closeAt=-1,cliCode=1;
61
+ var output=new StreamWriter(Console.OpenStandardOutput(),new UTF8Encoding(false)){AutoFlush=true};
62
+ var outputLock=new object();bool outputOpen=true;
63
+ Action<string> write=line=>{lock(outputLock){if(!outputOpen)return;try{output.WriteLine(line);}catch(IOException){outputOpen=false;}catch(ObjectDisposedException){outputOpen=false;}}};
64
+ try {
65
+ owner=Process.GetProcessById(ownerPid);var ownerHandle=owner.Handle;
66
+ if(owner.HasExited)throw new InvalidOperationException();
67
+ job=CreateJobObject(IntPtr.Zero,null);Check(job!=IntPtr.Zero);
68
+ var limits=new Extended();limits.Basic.Flags=0x2000; // KILL_ON_JOB_CLOSE; breakaway is deliberately not enabled.
69
+ Check(SetInformationJobObject(job,9,ref limits,(uint)Marshal.SizeOf(limits)));
70
+ phase="start-helper";
71
+ var start=new ProcessStartInfo(node,Quote(worker)){UseShellExecute=false,CreateNoWindow=true,RedirectStandardInput=true,RedirectStandardOutput=true,RedirectStandardError=true,
72
+ StandardOutputEncoding=new UTF8Encoding(false),StandardErrorEncoding=new UTF8Encoding(false)};
73
+ child=Process.Start(start);
74
+ phase="assign";Check(AssignProcessToJobObject(job,child.Handle));assigned=true;
75
+ // No provider can launch before this assignment: runtime-pane-worker waits for its first stdin command.
76
+ var inputWriter=new StreamWriter(child.StandardInput.BaseStream,new UTF8Encoding(false)){AutoFlush=true};
77
+ var input=Task.Factory.StartNew(()=>{
78
+ try { using(var reader=new StreamReader(Console.OpenStandardInput(),new UTF8Encoding(false))){string line;
79
+ while((line=reader.ReadLine())!=null){
80
+ if(line.Length>256*1024)break;
81
+ try {var value=new JavaScriptSerializer().Deserialize<Dictionary<string,object>>(line);if(value.ContainsKey("type")&&(string)value["type"]=="close")Interlocked.CompareExchange(ref closeAt,clock.ElapsedMilliseconds,-1);}catch{}
82
+ inputWriter.WriteLine(line);
83
+ }
84
+ }}catch{}finally{Interlocked.CompareExchange(ref closeAt,clock.ElapsedMilliseconds,-1);try{inputWriter.Close();}catch{}}
85
+ },TaskCreationOptions.LongRunning);
86
+ var stdout=Task.Factory.StartNew(()=>{string line;while((line=child.StandardOutput.ReadLine())!=null){
87
+ try {var value=new JavaScriptSerializer().Deserialize<Dictionary<string,object>>(line);
88
+ string type=value.ContainsKey("type")?value["type"] as string:null;
89
+ if(type=="tree.exit")continue; // Only this job owner can attest whole-tree exit.
90
+ if(type=="exit"&&value.ContainsKey("code"))cliCode=Convert.ToInt64(value["code"]);
91
+ }catch{}write(line);
92
+ }},TaskCreationOptions.LongRunning);
93
+ var stderr=Task.Factory.StartNew(()=>{child.StandardError.ReadToEnd();},TaskCreationOptions.LongRunning);
94
+ phase="running";
95
+ while(!child.WaitForExit(50)){long requested=Interlocked.Read(ref closeAt);if(owner.HasExited||(requested>=0&&clock.ElapsedMilliseconds-requested>=5000)){Check(TerminateJobObject(job,1));break;}}
96
+ phase="helper-exit";if(!child.WaitForExit(10000))throw new TimeoutException();
97
+ if(!stdout.Wait(10000))throw new TimeoutException();stderr.Wait(1000);
98
+ child.Dispose();child=null;
99
+ // A CLI may have left a background descendant. Retire only members of this exact owned job.
100
+ phase="tree-exit";if(Active(job)>0)Check(TerminateJobObject(job,1));
101
+ long deadline=clock.ElapsedMilliseconds+10000;while(Active(job)!=0){if(clock.ElapsedMilliseconds>deadline)throw new TimeoutException();Thread.Sleep(20);}
102
+ phase="receipt";Receipt(directory,launch,pane,agent,receiptPid,cliCode);
103
+ write(new JavaScriptSerializer().Serialize(new {type="tree.exit",code=cliCode}));
104
+ return 0;
105
+ } catch(Exception error) {
106
+ int code=error is System.ComponentModel.Win32Exception?((System.ComponentModel.Win32Exception)error).NativeErrorCode:0;
107
+ try{string exits=Path.Combine(directory,"exits");Directory.CreateDirectory(exits);File.WriteAllText(Path.Combine(exits,launch+".error.json"),new JavaScriptSerializer().Serialize(new {launchId=launch,paneId=pane,agentId=agent,stage=phase,code=code}),new UTF8Encoding(false));}catch{}
108
+ Console.Error.WriteLine("Windows pane ownership helper failed at "+phase+" (win32 "+code+"); process outcome is unconfirmed.");
109
+ // A direct child handle is safe even if job assignment failed. No discovered PID is ever signalled.
110
+ if(child!=null&&!assigned){try{child.Kill();child.WaitForExit(10000);}catch{}}
111
+ return 1;
112
+ } finally { if(job!=IntPtr.Zero)CloseHandle(job);if(child!=null)child.Dispose();if(owner!=null)owner.Dispose(); }
113
+ }
114
+ }
115
+ '@
116
+ exit [AgendPaneJob]::Run($NodePath,$WorkerPath,$StateDirectory,$LaunchId,$PaneId,$AgentId,$OwnerPid,$ReceiptPid)