@songsid/agend 2.3.4-beta.7 → 2.3.5-alpha.3

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 (457) 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/auth-api.d.ts +21 -0
  8. package/dist/auth-api.js +89 -2
  9. package/dist/auth-api.js.map +1 -1
  10. package/dist/authority/web-authority.d.ts +12 -2
  11. package/dist/authority/web-authority.js +25 -4
  12. package/dist/authority/web-authority.js.map +1 -1
  13. package/dist/backend/claude-code.d.ts +15 -12
  14. package/dist/backend/claude-code.js +152 -133
  15. package/dist/backend/claude-code.js.map +1 -1
  16. package/dist/backend/codex-package.d.ts +5 -2
  17. package/dist/backend/codex-package.js +1 -5
  18. package/dist/backend/codex-package.js.map +1 -1
  19. package/dist/backend/codex.d.ts +136 -113
  20. package/dist/backend/codex.js +1281 -1219
  21. package/dist/backend/codex.js.map +1 -1
  22. package/dist/backend/grok-model-cache.d.ts +7 -0
  23. package/dist/backend/grok-model-cache.js +65 -0
  24. package/dist/backend/grok-model-cache.js.map +1 -0
  25. package/dist/backend/grok.d.ts +2 -0
  26. package/dist/backend/grok.js +22 -0
  27. package/dist/backend/grok.js.map +1 -1
  28. package/dist/backend/native-pane.d.ts +9 -0
  29. package/dist/backend/native-pane.js +59 -0
  30. package/dist/backend/native-pane.js.map +1 -0
  31. package/dist/backend/types.d.ts +7 -0
  32. package/dist/backend/types.js.map +1 -1
  33. package/dist/channel/ipc-bridge.d.ts +2 -0
  34. package/dist/channel/mcp-tools.js +1 -1
  35. package/dist/channel/mcp-tools.js.map +1 -1
  36. package/dist/cli.js +3 -0
  37. package/dist/cli.js.map +1 -1
  38. package/dist/config-validator.js +71 -1
  39. package/dist/config-validator.js.map +1 -1
  40. package/dist/config.js +16 -0
  41. package/dist/config.js.map +1 -1
  42. package/dist/daemon.d.ts +67 -5
  43. package/dist/daemon.js +823 -266
  44. package/dist/daemon.js.map +1 -1
  45. package/dist/delivery-consumed-watch.d.ts +15 -3
  46. package/dist/delivery-consumed-watch.js +23 -1
  47. package/dist/delivery-consumed-watch.js.map +1 -1
  48. package/dist/delivery-outbox.d.ts +5 -0
  49. package/dist/delivery-outbox.js +32 -4
  50. package/dist/delivery-outbox.js.map +1 -1
  51. package/dist/delivery-reconciliation.d.ts +2 -35
  52. package/dist/delivery-reconciliation.js +2 -156
  53. package/dist/delivery-reconciliation.js.map +1 -1
  54. package/dist/fleet-context.d.ts +2 -2
  55. package/dist/fleet-level-config.d.ts +1 -1
  56. package/dist/fleet-level-config.js +2 -0
  57. package/dist/fleet-level-config.js.map +1 -1
  58. package/dist/fleet-manager.d.ts +238 -3
  59. package/dist/fleet-manager.js +1826 -104
  60. package/dist/fleet-manager.js.map +1 -1
  61. package/dist/fleet-windows-runtime.d.ts +92 -0
  62. package/dist/fleet-windows-runtime.js +380 -0
  63. package/dist/fleet-windows-runtime.js.map +1 -0
  64. package/dist/general-binding.d.ts +85 -0
  65. package/dist/general-binding.js +298 -0
  66. package/dist/general-binding.js.map +1 -0
  67. package/dist/general-host-owner.d.ts +8 -0
  68. package/dist/general-host-owner.js +26 -0
  69. package/dist/general-host-owner.js.map +1 -0
  70. package/dist/general-instance.d.ts +7 -0
  71. package/dist/general-instance.js +20 -3
  72. package/dist/general-instance.js.map +1 -1
  73. package/dist/general-role.d.ts +5 -0
  74. package/dist/general-role.js +26 -0
  75. package/dist/general-role.js.map +1 -0
  76. package/dist/instance-config-impact.js +4 -0
  77. package/dist/instance-config-impact.js.map +1 -1
  78. package/dist/instance-lifecycle.d.ts +21 -3
  79. package/dist/instance-lifecycle.js +378 -162
  80. package/dist/instance-lifecycle.js.map +1 -1
  81. package/dist/instructions.d.ts +2 -0
  82. package/dist/instructions.js +6 -0
  83. package/dist/instructions.js.map +1 -1
  84. package/dist/local-pane-endpoint.d.ts +46 -0
  85. package/dist/local-pane-endpoint.js +189 -0
  86. package/dist/local-pane-endpoint.js.map +1 -0
  87. package/dist/local-pane-launcher.d.ts +2 -0
  88. package/dist/local-pane-launcher.js +38 -0
  89. package/dist/local-pane-launcher.js.map +1 -0
  90. package/dist/local-pane-stage.ps1 +101 -0
  91. package/dist/locale.js +85 -0
  92. package/dist/locale.js.map +1 -1
  93. package/dist/model-catalog-defaults.d.ts +14 -0
  94. package/dist/model-catalog-defaults.js +20 -0
  95. package/dist/model-catalog-defaults.js.map +1 -0
  96. package/dist/native-agent-admission.d.ts +7 -0
  97. package/dist/native-agent-admission.js +26 -0
  98. package/dist/native-agent-admission.js.map +1 -0
  99. package/dist/native-daemon-client.d.ts +13 -0
  100. package/dist/native-daemon-client.js +28 -0
  101. package/dist/native-daemon-client.js.map +1 -0
  102. package/dist/native-instance-api.d.ts +14 -0
  103. package/dist/native-instance-api.js +205 -0
  104. package/dist/native-instance-api.js.map +1 -0
  105. package/dist/native-instance-input.d.ts +84 -0
  106. package/dist/native-instance-input.js +54 -0
  107. package/dist/native-instance-input.js.map +1 -0
  108. package/dist/native-instance-registry.d.ts +32 -0
  109. package/dist/native-instance-registry.js +105 -0
  110. package/dist/native-instance-registry.js.map +1 -0
  111. package/dist/native-mcp.d.ts +40 -0
  112. package/dist/native-mcp.js +278 -0
  113. package/dist/native-mcp.js.map +1 -0
  114. package/dist/native-model-catalog.d.ts +5 -0
  115. package/dist/native-model-catalog.js +76 -0
  116. package/dist/native-model-catalog.js.map +1 -0
  117. package/dist/native-pane-crash-budget.d.ts +20 -0
  118. package/dist/native-pane-crash-budget.js +60 -0
  119. package/dist/native-pane-crash-budget.js.map +1 -0
  120. package/dist/native-pane-create.d.ts +26 -0
  121. package/dist/native-pane-create.js +53 -0
  122. package/dist/native-pane-create.js.map +1 -0
  123. package/dist/native-pane-lifecycle.d.ts +65 -0
  124. package/dist/native-pane-lifecycle.js +230 -0
  125. package/dist/native-pane-lifecycle.js.map +1 -0
  126. package/dist/native-pane-manager.d.ts +59 -0
  127. package/dist/native-pane-manager.js +584 -0
  128. package/dist/native-pane-manager.js.map +1 -0
  129. package/dist/native-pane-output-log.d.ts +15 -0
  130. package/dist/native-pane-output-log.js +108 -0
  131. package/dist/native-pane-output-log.js.map +1 -0
  132. package/dist/native-pane-reconciliation.d.ts +4 -0
  133. package/dist/native-pane-reconciliation.js +40 -0
  134. package/dist/native-pane-reconciliation.js.map +1 -0
  135. package/dist/native-pane-recovery.d.ts +12 -0
  136. package/dist/native-pane-recovery.js +10 -0
  137. package/dist/native-pane-recovery.js.map +1 -0
  138. package/dist/native-pane-tools.d.ts +2 -0
  139. package/dist/native-pane-tools.js +14 -0
  140. package/dist/native-pane-tools.js.map +1 -0
  141. package/dist/needs-you-hub.d.ts +2 -0
  142. package/dist/needs-you-hub.js +2 -1
  143. package/dist/needs-you-hub.js.map +1 -1
  144. package/dist/needs-you.d.ts +19 -1
  145. package/dist/needs-you.js +12 -2
  146. package/dist/needs-you.js.map +1 -1
  147. package/dist/outbound-handlers.d.ts +16 -2
  148. package/dist/outbound-handlers.js +67 -3
  149. package/dist/outbound-handlers.js.map +1 -1
  150. package/dist/outbound-schemas.d.ts +38 -0
  151. package/dist/outbound-schemas.js +12 -0
  152. package/dist/outbound-schemas.js.map +1 -1
  153. package/dist/pane-port.d.ts +118 -0
  154. package/dist/pane-port.js +2 -0
  155. package/dist/pane-port.js.map +1 -0
  156. package/dist/public-web-gateway.js +9 -0
  157. package/dist/public-web-gateway.js.map +1 -1
  158. package/dist/public-web-link.d.ts +5 -0
  159. package/dist/public-web-link.js +4 -0
  160. package/dist/public-web-link.js.map +1 -1
  161. package/dist/quickstart-api.js +9 -5
  162. package/dist/quickstart-api.js.map +1 -1
  163. package/dist/quickstart.d.ts +1 -0
  164. package/dist/quickstart.js +4 -1
  165. package/dist/quickstart.js.map +1 -1
  166. package/dist/runtime-api.d.ts +8 -0
  167. package/dist/runtime-api.js +96 -0
  168. package/dist/runtime-api.js.map +1 -0
  169. package/dist/runtime-assets/@xterm/addon-serialize/LICENSE +21 -0
  170. package/dist/runtime-assets/@xterm/addon-serialize/lib/addon-serialize.js +2 -0
  171. package/dist/runtime-assets/@xterm/addon-serialize/lib/addon-serialize.mjs +19 -0
  172. package/dist/runtime-assets/@xterm/addon-serialize/package.json +29 -0
  173. package/dist/runtime-assets/@xterm/headless/LICENSE +21 -0
  174. package/dist/runtime-assets/@xterm/headless/lib-headless/xterm-headless.js +2 -0
  175. package/dist/runtime-assets/@xterm/headless/lib-headless/xterm-headless.mjs +46 -0
  176. package/dist/runtime-assets/@xterm/headless/package.json +29 -0
  177. package/dist/runtime-assets/node-pty/CONPTY-LICENSE +21 -0
  178. package/dist/runtime-assets/node-pty/CONPTY-NOTICE.md +503 -0
  179. package/dist/runtime-assets/node-pty/LICENSE +69 -0
  180. package/dist/runtime-assets/node-pty/lib/conpty_console_list_agent.js +16 -0
  181. package/dist/runtime-assets/node-pty/lib/eventEmitter2.js +47 -0
  182. package/dist/runtime-assets/node-pty/lib/index.js +52 -0
  183. package/dist/runtime-assets/node-pty/lib/interfaces.js +7 -0
  184. package/dist/runtime-assets/node-pty/lib/shared/conout.js +11 -0
  185. package/dist/runtime-assets/node-pty/lib/terminal.js +190 -0
  186. package/dist/runtime-assets/node-pty/lib/types.js +7 -0
  187. package/dist/runtime-assets/node-pty/lib/unixTerminal.js +346 -0
  188. package/dist/runtime-assets/node-pty/lib/utils.js +39 -0
  189. package/dist/runtime-assets/node-pty/lib/windowsConoutConnection.js +125 -0
  190. package/dist/runtime-assets/node-pty/lib/windowsPtyAgent.js +320 -0
  191. package/dist/runtime-assets/node-pty/lib/windowsTerminal.js +199 -0
  192. package/dist/runtime-assets/node-pty/lib/worker/conoutSocketWorker.js +22 -0
  193. package/dist/runtime-assets/node-pty/package.json +64 -0
  194. package/dist/runtime-assets/node-pty/prebuilds/win32-arm64/conpty/OpenConsole.exe +0 -0
  195. package/dist/runtime-assets/node-pty/prebuilds/win32-arm64/conpty/conpty.dll +0 -0
  196. package/dist/runtime-assets/node-pty/prebuilds/win32-arm64/conpty.node +0 -0
  197. package/dist/runtime-assets/node-pty/prebuilds/win32-arm64/conpty_console_list.node +0 -0
  198. package/dist/runtime-assets/node-pty/prebuilds/win32-x64/conpty/OpenConsole.exe +0 -0
  199. package/dist/runtime-assets/node-pty/prebuilds/win32-x64/conpty/conpty.dll +0 -0
  200. package/dist/runtime-assets/node-pty/prebuilds/win32-x64/conpty.node +0 -0
  201. package/dist/runtime-assets/node-pty/prebuilds/win32-x64/conpty_console_list.node +0 -0
  202. package/dist/runtime-bundle.d.ts +17 -0
  203. package/dist/runtime-bundle.js +150 -0
  204. package/dist/runtime-bundle.js.map +1 -0
  205. package/dist/runtime-cli.d.ts +2 -0
  206. package/dist/runtime-cli.js +117 -0
  207. package/dist/runtime-cli.js.map +1 -0
  208. package/dist/runtime-client-store.d.ts +49 -0
  209. package/dist/runtime-client-store.js +292 -0
  210. package/dist/runtime-client-store.js.map +1 -0
  211. package/dist/runtime-client.d.ts +100 -0
  212. package/dist/runtime-client.js +700 -0
  213. package/dist/runtime-client.js.map +1 -0
  214. package/dist/runtime-coordinator.d.ts +82 -0
  215. package/dist/runtime-coordinator.js +864 -0
  216. package/dist/runtime-coordinator.js.map +1 -0
  217. package/dist/runtime-general-protocol.d.ts +22 -0
  218. package/dist/runtime-general-protocol.js +57 -0
  219. package/dist/runtime-general-protocol.js.map +1 -0
  220. package/dist/runtime-general-workspace.d.ts +17 -0
  221. package/dist/runtime-general-workspace.js +213 -0
  222. package/dist/runtime-general-workspace.js.map +1 -0
  223. package/dist/runtime-pane-assets.d.ts +17 -0
  224. package/dist/runtime-pane-assets.js +23 -0
  225. package/dist/runtime-pane-assets.js.map +1 -0
  226. package/dist/runtime-pane-boot.d.ts +2 -0
  227. package/dist/runtime-pane-boot.js +24 -0
  228. package/dist/runtime-pane-boot.js.map +1 -0
  229. package/dist/runtime-pane-codex-index.d.ts +1 -0
  230. package/dist/runtime-pane-codex-index.js +47 -0
  231. package/dist/runtime-pane-codex-index.js.map +1 -0
  232. package/dist/runtime-pane-config.d.ts +16 -0
  233. package/dist/runtime-pane-config.js +54 -0
  234. package/dist/runtime-pane-config.js.map +1 -0
  235. package/dist/runtime-pane-host.d.ts +44 -0
  236. package/dist/runtime-pane-host.js +424 -0
  237. package/dist/runtime-pane-host.js.map +1 -0
  238. package/dist/runtime-pane-job-owner.d.ts +1 -0
  239. package/dist/runtime-pane-job-owner.js +29 -0
  240. package/dist/runtime-pane-job-owner.js.map +1 -0
  241. package/dist/runtime-pane-job.ps1 +116 -0
  242. package/dist/runtime-pane-link.d.ts +40 -0
  243. package/dist/runtime-pane-link.js +246 -0
  244. package/dist/runtime-pane-link.js.map +1 -0
  245. package/dist/runtime-pane-mcp-protocol.d.ts +32 -0
  246. package/dist/runtime-pane-mcp-protocol.js +39 -0
  247. package/dist/runtime-pane-mcp-protocol.js.map +1 -0
  248. package/dist/runtime-pane-mcp-relay.d.ts +17 -0
  249. package/dist/runtime-pane-mcp-relay.js +70 -0
  250. package/dist/runtime-pane-mcp-relay.js.map +1 -0
  251. package/dist/runtime-pane-mcp.d.ts +51 -0
  252. package/dist/runtime-pane-mcp.js +150 -0
  253. package/dist/runtime-pane-mcp.js.map +1 -0
  254. package/dist/runtime-pane-native.d.ts +45 -0
  255. package/dist/runtime-pane-native.js +65 -0
  256. package/dist/runtime-pane-native.js.map +1 -0
  257. package/dist/runtime-pane-output.d.ts +19 -0
  258. package/dist/runtime-pane-output.js +53 -0
  259. package/dist/runtime-pane-output.js.map +1 -0
  260. package/dist/runtime-pane-port.d.ts +139 -0
  261. package/dist/runtime-pane-port.js +558 -0
  262. package/dist/runtime-pane-port.js.map +1 -0
  263. package/dist/runtime-pane-private.d.ts +14 -0
  264. package/dist/runtime-pane-private.js +51 -0
  265. package/dist/runtime-pane-private.js.map +1 -0
  266. package/dist/runtime-pane-private.ps1 +14 -0
  267. package/dist/runtime-pane-process.d.ts +4 -0
  268. package/dist/runtime-pane-process.js +108 -0
  269. package/dist/runtime-pane-process.js.map +1 -0
  270. package/dist/runtime-pane-protocol.d.ts +172 -0
  271. package/dist/runtime-pane-protocol.js +195 -0
  272. package/dist/runtime-pane-protocol.js.map +1 -0
  273. package/dist/runtime-pane-screen.d.ts +19 -0
  274. package/dist/runtime-pane-screen.js +76 -0
  275. package/dist/runtime-pane-screen.js.map +1 -0
  276. package/dist/runtime-pane-service.d.ts +11 -0
  277. package/dist/runtime-pane-service.js +221 -0
  278. package/dist/runtime-pane-service.js.map +1 -0
  279. package/dist/runtime-pane-stdio-protocol.d.ts +54 -0
  280. package/dist/runtime-pane-stdio-protocol.js +94 -0
  281. package/dist/runtime-pane-stdio-protocol.js.map +1 -0
  282. package/dist/runtime-pane-stdio.d.ts +3 -0
  283. package/dist/runtime-pane-stdio.js +123 -0
  284. package/dist/runtime-pane-stdio.js.map +1 -0
  285. package/dist/runtime-pane-store.d.ts +33 -0
  286. package/dist/runtime-pane-store.js +164 -0
  287. package/dist/runtime-pane-store.js.map +1 -0
  288. package/dist/runtime-pane-transcript-protocol.d.ts +43 -0
  289. package/dist/runtime-pane-transcript-protocol.js +58 -0
  290. package/dist/runtime-pane-transcript-protocol.js.map +1 -0
  291. package/dist/runtime-pane-transcript.d.ts +45 -0
  292. package/dist/runtime-pane-transcript.js +605 -0
  293. package/dist/runtime-pane-transcript.js.map +1 -0
  294. package/dist/runtime-pane-worker.d.ts +1 -0
  295. package/dist/runtime-pane-worker.js +154 -0
  296. package/dist/runtime-pane-worker.js.map +1 -0
  297. package/dist/runtime-protocol.d.ts +149 -0
  298. package/dist/runtime-protocol.js +19 -0
  299. package/dist/runtime-protocol.js.map +1 -0
  300. package/dist/runtime-switches.d.ts +79 -0
  301. package/dist/runtime-switches.js +90 -0
  302. package/dist/runtime-switches.js.map +1 -0
  303. package/dist/runtime-transcript-delta-reader.d.ts +23 -0
  304. package/dist/runtime-transcript-delta-reader.js +74 -0
  305. package/dist/runtime-transcript-delta-reader.js.map +1 -0
  306. package/dist/runtime-transcript-source.d.ts +36 -0
  307. package/dist/runtime-transcript-source.js +189 -0
  308. package/dist/runtime-transcript-source.js.map +1 -0
  309. package/dist/runtime-windows-bridge.d.ts +41 -0
  310. package/dist/runtime-windows-bridge.js +157 -0
  311. package/dist/runtime-windows-bridge.js.map +1 -0
  312. package/dist/settings-api.d.ts +5 -0
  313. package/dist/settings-api.js +95 -1
  314. package/dist/settings-api.js.map +1 -1
  315. package/dist/settings-baseline.d.ts +1 -0
  316. package/dist/settings-baseline.js +1 -1
  317. package/dist/settings-baseline.js.map +1 -1
  318. package/dist/settings-change.js +28 -0
  319. package/dist/settings-change.js.map +1 -1
  320. package/dist/settings-confirmation.d.ts +16 -1
  321. package/dist/settings-confirmation.js +47 -9
  322. package/dist/settings-confirmation.js.map +1 -1
  323. package/dist/settings-effect.d.ts +4 -0
  324. package/dist/settings-effect.js +58 -1
  325. package/dist/settings-effect.js.map +1 -1
  326. package/dist/settings-http-confirmation.d.ts +1 -0
  327. package/dist/settings-http-confirmation.js +15 -2
  328. package/dist/settings-http-confirmation.js.map +1 -1
  329. package/dist/settings-request-capability.d.ts +2 -0
  330. package/dist/settings-request-capability.js +4 -0
  331. package/dist/settings-request-capability.js.map +1 -1
  332. package/dist/settings-route-lifetime.d.ts +14 -0
  333. package/dist/settings-route-lifetime.js +48 -0
  334. package/dist/settings-route-lifetime.js.map +1 -0
  335. package/dist/settings-transaction.d.ts +4 -0
  336. package/dist/settings-transaction.js +9 -0
  337. package/dist/settings-transaction.js.map +1 -1
  338. package/dist/setup-form.js +6 -3
  339. package/dist/setup-form.js.map +1 -1
  340. package/dist/setup-i18n.js +3 -0
  341. package/dist/setup-i18n.js.map +1 -1
  342. package/dist/tmux-control.d.ts +2 -1
  343. package/dist/tmux-control.js.map +1 -1
  344. package/dist/tmux-manager.d.ts +2 -1
  345. package/dist/tmux-manager.js.map +1 -1
  346. package/dist/tmux-pane-host.d.ts +26 -0
  347. package/dist/tmux-pane-host.js +25 -0
  348. package/dist/tmux-pane-host.js.map +1 -0
  349. package/dist/tool-permissions.js +2 -1
  350. package/dist/tool-permissions.js.map +1 -1
  351. package/dist/topic-commands.js +3 -0
  352. package/dist/topic-commands.js.map +1 -1
  353. package/dist/transcript-delta-reader.d.ts +1 -1
  354. package/dist/transcript-delta-reader.js +1 -1
  355. package/dist/transcript-delta-reader.js.map +1 -1
  356. package/dist/transcript-monitor.d.ts +3 -0
  357. package/dist/transcript-monitor.js +22 -46
  358. package/dist/transcript-monitor.js.map +1 -1
  359. package/dist/transcript-needles.d.ts +35 -0
  360. package/dist/transcript-needles.js +158 -0
  361. package/dist/transcript-needles.js.map +1 -0
  362. package/dist/transcript-records.d.ts +21 -0
  363. package/dist/transcript-records.js +140 -0
  364. package/dist/transcript-records.js.map +1 -0
  365. package/dist/transcript-sources.d.ts +5 -0
  366. package/dist/transcript-sources.js +8 -79
  367. package/dist/transcript-sources.js.map +1 -1
  368. package/dist/types.d.ts +23 -0
  369. package/dist/ui/agent-proposals.js +90 -0
  370. package/dist/ui/agent-runtime.js +106 -0
  371. package/dist/ui/chat-store.js +13 -2
  372. package/dist/ui/chat-strings.js +48 -0
  373. package/dist/ui/cli-picker.js +42 -0
  374. package/dist/ui/general-location.js +71 -0
  375. package/dist/ui/native-instance-settings.js +47 -0
  376. package/dist/ui/native-pane-recovery.js +45 -0
  377. package/dist/ui/panel-chat.js +63 -32
  378. package/dist/ui/panel-details.js +2 -1
  379. package/dist/ui/panel-fleet.js +99 -18
  380. package/dist/ui/panel-needs.js +154 -3
  381. package/dist/ui/panel-runtimes.js +231 -0
  382. package/dist/ui/panel-settings.js +19 -9
  383. package/dist/ui/panel-windows-agent.js +86 -0
  384. package/dist/ui/panel-windows-cli.js +143 -0
  385. package/dist/ui/provider-marks.js +83 -0
  386. package/dist/ui/runtime-catalog.js +55 -0
  387. package/dist/ui/settings-catalog.js +37 -10
  388. package/dist/ui/settings-confirm.js +3 -1
  389. package/dist/ui/settings-dialogs.js +22 -7
  390. package/dist/ui/settings-model.js +2 -1
  391. package/dist/ui/settings-outside.js +176 -0
  392. package/dist/ui/settings-registry.js +6 -0
  393. package/dist/ui/settings-strings.js +16 -0
  394. package/dist/ui/shared/app-i18n.js +2 -2
  395. package/dist/ui/shared/app-route.js +6 -2
  396. package/dist/ui/shared/app-shell.js +3 -2
  397. package/dist/ui/shared/app-store.js +1 -0
  398. package/dist/ui/shared/app-stream.js +3 -1
  399. package/dist/ui/shared/app.css +301 -0
  400. package/dist/ui/shared/app.js +4 -0
  401. package/dist/ui/shared/header-tools.js +6 -4
  402. package/dist/ui/shared/instance-nav.js +33 -7
  403. package/dist/ui/shared/instance-switch.js +4 -3
  404. package/dist/ui/shared/qrcode.module.js +2237 -0
  405. package/dist/ui/shared/signin.js +39 -5
  406. package/dist/ui/shared/ui-menu.js +28 -8
  407. package/dist/ui/shared/vendor/qrcode-generator.LICENSE +27 -0
  408. package/dist/ui/shared/vendor/vendor.json +19 -2
  409. package/dist/ui/shared/view-strings.js +8 -0
  410. package/dist/ui/windows-agents-nav.js +2 -0
  411. package/dist/ui/windows-cli-catalog.js +79 -0
  412. package/dist/web-api.d.ts +37 -0
  413. package/dist/web-api.js +248 -6
  414. package/dist/web-api.js.map +1 -1
  415. package/dist/web-chat-history.d.ts +19 -2
  416. package/dist/web-chat-history.js +72 -3
  417. package/dist/web-chat-history.js.map +1 -1
  418. package/dist/web-only-fleet.d.ts +20 -0
  419. package/dist/web-only-fleet.js +21 -0
  420. package/dist/web-only-fleet.js.map +1 -1
  421. package/dist/web-remote-access.d.ts +152 -0
  422. package/dist/web-remote-access.js +368 -0
  423. package/dist/web-remote-access.js.map +1 -0
  424. package/dist/web-session.d.ts +7 -0
  425. package/dist/web-session.js +2 -0
  426. package/dist/web-session.js.map +1 -1
  427. package/dist/web-shell-routes.d.ts +4 -1
  428. package/dist/web-shell-routes.js +7 -2
  429. package/dist/web-shell-routes.js.map +1 -1
  430. package/dist/windows-agents.d.ts +124 -0
  431. package/dist/windows-agents.js +487 -0
  432. package/dist/windows-agents.js.map +1 -0
  433. package/dist/windows-cli-api.d.ts +23 -0
  434. package/dist/windows-cli-api.js +158 -0
  435. package/dist/windows-cli-api.js.map +1 -0
  436. package/dist/windows-cli-providers.d.ts +115 -0
  437. package/dist/windows-cli-providers.js +429 -0
  438. package/dist/windows-cli-providers.js.map +1 -0
  439. package/dist/windows-cli-worker.d.ts +58 -0
  440. package/dist/windows-cli-worker.js +479 -0
  441. package/dist/windows-cli-worker.js.map +1 -0
  442. package/dist/windows-cli.d.ts +115 -0
  443. package/dist/windows-cli.js +402 -0
  444. package/dist/windows-cli.js.map +1 -0
  445. package/dist/windows-native-mcp.d.ts +19 -0
  446. package/dist/windows-native-mcp.js +143 -0
  447. package/dist/windows-native-mcp.js.map +1 -0
  448. package/dist/windows-pane-mcp.d.ts +26 -0
  449. package/dist/windows-pane-mcp.js +187 -0
  450. package/dist/windows-pane-mcp.js.map +1 -0
  451. package/package.json +9 -3
  452. package/templates/runtime-assets/conpty-LICENSE +21 -0
  453. package/templates/runtime-assets/conpty-NOTICE.md +503 -0
  454. package/templates/runtime-assets/local-pane-stage.ps1 +101 -0
  455. package/templates/runtime-assets/runtime-pane-job.ps1 +116 -0
  456. package/templates/runtime-assets/runtime-pane-private.ps1 +14 -0
  457. package/templates/runtime-assets/xterm-LICENSE +21 -0
@@ -0,0 +1,46 @@
1
+ import type { ChildProcess } from "node:child_process";
2
+ import type { NativeMachineEndpoint } from "./native-pane-manager.js";
3
+ import type { RuntimeCoordinatorEvent } from "./runtime-coordinator.js";
4
+ import { type RuntimePaneRequest } from "./runtime-pane-protocol.js";
5
+ import type { PaneMcpBody } from "./runtime-pane-mcp-protocol.js";
6
+ export interface LocalPaneOptions {
7
+ scope: string;
8
+ admit(): void;
9
+ maxAgents(): number;
10
+ version(provider: string): string | null;
11
+ launch(): Promise<ChildProcess>;
12
+ mcp(body: PaneMcpBody, current: () => boolean): Promise<unknown>;
13
+ /** S-35: the relay's own stderr (bounded) — it was discarded, so a relay that exited at once left no trace. */
14
+ diagnostic?(text: string): void;
15
+ }
16
+ export declare class LocalPaneEndpoint implements NativeMachineEndpoint {
17
+ private options;
18
+ readonly machineId = "local";
19
+ private readonly attachment;
20
+ private child;
21
+ private connected;
22
+ private stopped;
23
+ private mcpPending;
24
+ private cleanupOnly;
25
+ private lastLease;
26
+ private pending;
27
+ private listeners;
28
+ private interval;
29
+ private hostBootId;
30
+ private constructor();
31
+ static open(options: LocalPaneOptions): Promise<LocalPaneEndpoint>;
32
+ online(): boolean;
33
+ /** Irreversible transport drain: only exact snapshot/close RPC remains; no new helper work or input. */
34
+ beginCleanup(): void;
35
+ epoch(): string | null;
36
+ version(provider: string): string | null;
37
+ subscribe(listener: (event: RuntimeCoordinatorEvent) => void): () => void;
38
+ private send;
39
+ private attach;
40
+ private lease;
41
+ call(request: RuntimePaneRequest): Promise<unknown>;
42
+ /** Explicit switch-off only. The host independently refuses while any launch or outcome remains unconfirmed. */
43
+ shutdownHost(): Promise<void>;
44
+ /** Only close stdio; never signal a Windows process or close a terminal here. */
45
+ stop(): void;
46
+ }
@@ -0,0 +1,189 @@
1
+ /** Main-loop-owned local Windows relay. Process death detaches; terminal ownership is never inferred from a PID. */
2
+ import { randomUUID } from "node:crypto";
3
+ import { PaneStdioFramer, paneStdioInput, paneStdioOutput, PANE_STDIO_LIMIT } from "./runtime-pane-stdio-protocol.js";
4
+ import { validateRuntimePaneShutdown } from "./runtime-pane-protocol.js";
5
+ export class LocalPaneEndpoint {
6
+ options;
7
+ machineId = "local";
8
+ attachment = randomUUID();
9
+ child;
10
+ connected = false;
11
+ stopped = false;
12
+ mcpPending = 0;
13
+ cleanupOnly = false;
14
+ lastLease = 0;
15
+ pending = new Map();
16
+ listeners = new Set();
17
+ interval;
18
+ hostBootId;
19
+ constructor(options) {
20
+ this.options = options;
21
+ }
22
+ static async open(options) {
23
+ const endpoint = new LocalPaneEndpoint(options);
24
+ options.admit();
25
+ const child = await options.launch();
26
+ endpoint.child = child;
27
+ try {
28
+ options.admit();
29
+ await endpoint.attach(child);
30
+ options.admit();
31
+ return endpoint;
32
+ }
33
+ catch (error) {
34
+ endpoint.stop();
35
+ throw error;
36
+ }
37
+ }
38
+ online() { if (this.stopped || !this.connected || performance.now() - this.lastLease >= 15_000)
39
+ return false; if (this.cleanupOnly)
40
+ return true; try {
41
+ this.options.admit();
42
+ return true;
43
+ }
44
+ catch {
45
+ return false;
46
+ } }
47
+ /** Irreversible transport drain: only exact snapshot/close RPC remains; no new helper work or input. */
48
+ beginCleanup() { this.cleanupOnly = true; }
49
+ epoch() { return this.online() ? this.attachment : null; }
50
+ version(provider) { return this.options.version(provider); }
51
+ subscribe(listener) { this.listeners.add(listener); return () => this.listeners.delete(listener); }
52
+ send(value) {
53
+ if (this.stopped || !this.child?.stdin?.writable)
54
+ throw Error("Local pane relay is disconnected");
55
+ const frame = JSON.stringify(paneStdioInput(value)) + "\n";
56
+ if (Buffer.byteLength(frame) > PANE_STDIO_LIMIT + 1 || this.child.stdin.writableLength + Buffer.byteLength(frame) > PANE_STDIO_LIMIT * 2)
57
+ throw Error("Local pane relay backpressure");
58
+ this.child.stdin.write(frame);
59
+ }
60
+ attach(child) {
61
+ return new Promise((resolve, reject) => {
62
+ if (!child.stdin || !child.stdout) {
63
+ reject(Error("Local pane relay streams are unavailable"));
64
+ return;
65
+ }
66
+ const framer = new PaneStdioFramer();
67
+ let ready = false;
68
+ const timer = setTimeout(() => { reject(Error("Local pane relay startup unconfirmed")); this.stop(); }, 125_000);
69
+ timer.unref();
70
+ const lost = () => { clearTimeout(timer); if (!ready)
71
+ reject(Error("Local pane relay startup unconfirmed")); this.stop(); };
72
+ child.once("error", lost);
73
+ child.once("exit", lost);
74
+ child.stdout?.once("end", lost);
75
+ child.stdout?.once("close", lost);
76
+ child.stdin?.on("error", lost);
77
+ let told = 0;
78
+ child.stderr?.setEncoding?.("utf8");
79
+ child.stderr?.on("data", (part) => { if (told >= 8_192 || !this.options.diagnostic)
80
+ return; const text = String(part).replace(/[\p{Cc}\p{Cf}]+/gu, " ").trim().slice(0, 8_192 - told); told += text.length; if (text)
81
+ try {
82
+ this.options.diagnostic(text);
83
+ }
84
+ catch { /* a diagnostic never affects the relay */ } });
85
+ child.stdout?.on("data", (bytes) => {
86
+ try {
87
+ framer.feed(bytes, raw => {
88
+ const value = paneStdioOutput(raw);
89
+ if (value.epoch !== this.attachment)
90
+ throw Error("Local pane relay epoch differs");
91
+ if (!ready) {
92
+ if (value.type !== "hello")
93
+ throw Error("Local pane relay not ready");
94
+ this.hostBootId = value.hostBootId;
95
+ ready = true;
96
+ clearTimeout(timer);
97
+ this.connected = true;
98
+ this.lastLease = performance.now();
99
+ this.lease();
100
+ this.interval = setInterval(() => this.lease(), 5000);
101
+ this.interval.unref();
102
+ resolve();
103
+ return;
104
+ }
105
+ if (value.type === "hello")
106
+ throw Error("Duplicate local pane hello");
107
+ if (value.type === "output") {
108
+ for (const listener of this.listeners)
109
+ listener({ type: "pane", machineId: "local", pane: value.snapshot });
110
+ return;
111
+ }
112
+ if (value.type === "response") {
113
+ const row = this.pending.get(value.id);
114
+ if (!row)
115
+ return;
116
+ this.pending.delete(value.id);
117
+ clearTimeout(row.timer);
118
+ if (value.ok)
119
+ row.resolve(value.result);
120
+ else
121
+ row.reject(Error("Local pane operation unconfirmed; inspect its owned receipt"));
122
+ return;
123
+ }
124
+ if (this.cleanupOnly) {
125
+ this.send({ type: "mcp.result", epoch: this.attachment, id: value.id, ok: false });
126
+ return;
127
+ }
128
+ if (this.mcpPending >= 32)
129
+ throw Error("Local pane MCP backlog");
130
+ this.mcpPending++;
131
+ const current = () => !this.cleanupOnly && this.online();
132
+ void this.options.mcp(value.body, current).then(result => { if (current())
133
+ this.send({ type: "mcp.result", epoch: this.attachment, id: value.id, ok: true, result }); }, () => { if (current())
134
+ this.send({ type: "mcp.result", epoch: this.attachment, id: value.id, ok: false }); }).catch(() => this.stop()).finally(() => { this.mcpPending--; });
135
+ });
136
+ }
137
+ catch {
138
+ lost();
139
+ }
140
+ });
141
+ try {
142
+ this.send({ type: "init", scope: this.options.scope, epoch: this.attachment, maxAgents: this.options.maxAgents() });
143
+ }
144
+ catch (error) {
145
+ clearTimeout(timer);
146
+ reject(error);
147
+ this.stop();
148
+ }
149
+ });
150
+ }
151
+ lease() { if (this.stopped)
152
+ return; if (!this.online()) {
153
+ this.stop();
154
+ return;
155
+ } this.lastLease = performance.now(); try {
156
+ this.send({ type: "lease", epoch: this.attachment, online: this.online(), maxAgents: this.options.maxAgents() });
157
+ }
158
+ catch {
159
+ this.stop();
160
+ } }
161
+ call(request) {
162
+ if (this.cleanupOnly && !["snapshot", "close", "list", "shutdown"].includes(request.action))
163
+ return Promise.reject(Error("Local pane relay only permits owned cleanup"));
164
+ if (!this.online() || this.pending.size >= 64)
165
+ return Promise.reject(Error("Local pane relay unavailable or busy"));
166
+ return new Promise((resolve, reject) => { const id = randomUUID(), timer = setTimeout(() => { this.pending.delete(id); reject(Error("Local pane result unconfirmed; input was not replayed")); }, 125_000); timer.unref(); this.pending.set(id, { resolve, reject, timer }); try {
167
+ this.send({ type: "request", epoch: this.attachment, id, request });
168
+ }
169
+ catch (error) {
170
+ clearTimeout(timer);
171
+ this.pending.delete(id);
172
+ reject(error);
173
+ } });
174
+ }
175
+ /** Explicit switch-off only. The host independently refuses while any launch or outcome remains unconfirmed. */
176
+ async shutdownHost() {
177
+ if (!this.cleanupOnly || !this.hostBootId)
178
+ throw Error("Local pane host shutdown lacks a cleanup owner");
179
+ validateRuntimePaneShutdown(await this.call({ action: "shutdown", hostBootId: this.hostBootId }), this.hostBootId);
180
+ }
181
+ /** Only close stdio; never signal a Windows process or close a terminal here. */
182
+ stop() { if (this.stopped)
183
+ return; this.stopped = true; this.connected = false; clearInterval(this.interval); this.child?.stdin?.end(); this.child?.stdout?.destroy(); this.child?.stderr?.destroy(); for (const row of this.pending.values()) {
184
+ clearTimeout(row.timer);
185
+ row.reject(Error("Local pane relay detached; process state is retained"));
186
+ } this.pending.clear(); for (const listener of this.listeners)
187
+ listener({ type: "machine", machineId: "local" }); this.listeners.clear(); }
188
+ }
189
+ //# sourceMappingURL=local-pane-endpoint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-pane-endpoint.js","sourceRoot":"","sources":["../src/local-pane-endpoint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const localPaneScope: (home: string) => string;
2
+ export declare function launchLocalPaneRelay(home: string, admit?: () => void): Promise<import("node:child_process").ChildProcessWithoutNullStreams>;
@@ -0,0 +1,38 @@
1
+ /** Stage only the verified shipped code bundle. Never enumerate a provider home or copy login material. */
2
+ import { createHash } from "node:crypto";
3
+ import { mkdir, mkdtemp, writeFile, rm } from "node:fs/promises";
4
+ import { dirname, join, win32 } from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+ import { promisify } from "node:util";
7
+ import { execFile, spawn } from "./child-process.js";
8
+ import { createRuntimeBundle } from "./runtime-bundle.js";
9
+ import { admitLocalWindowsCli } from "./windows-cli.js";
10
+ import { nativeCliEnvironment, validWindowsDirectory } from "./windows-cli-worker.js";
11
+ const exec = promisify(execFile);
12
+ export const localPaneScope = (home) => createHash("sha256").update(home).digest("hex");
13
+ export async function launchLocalPaneRelay(home, admit = admitLocalWindowsCli) {
14
+ admit();
15
+ if (process.platform !== "linux" && process.platform !== "win32")
16
+ throw Error("Local Windows panes require Windows or WSL");
17
+ const code = dirname(fileURLToPath(import.meta.url)), powershell = process.platform === "win32" ? join(process.env.SystemRoot || "C:\\Windows", "System32", "WindowsPowerShell", "v1.0", "powershell.exe") : "/mnt/c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe";
18
+ const convert = async (path, direction) => process.platform === "win32" ? path : String((await exec("wslpath", [direction, path], { timeout: 5000, maxBuffer: 8192, encoding: "utf8" })).stdout).trim();
19
+ await mkdir(home, { recursive: true, mode: 0o700 });
20
+ const temporary = await mkdtemp(join(home, "pane-code-"));
21
+ try {
22
+ const bundle = createRuntimeBundle(), archive = join(temporary, "runtime.zip");
23
+ await writeFile(archive, bundle.bytes, { mode: 0o600 });
24
+ const [script, zip] = await Promise.all([convert(join(code, "local-pane-stage.ps1"), "-w"), convert(archive, "-w")]);
25
+ admit();
26
+ const staged = await exec(powershell, ["-NoProfile", "-NonInteractive", "-ExecutionPolicy", "Bypass", "-File", script, "-Archive", zip, "-Sha256", bundle.sha256, "-Scope", localPaneScope(home)], { env: nativeCliEnvironment(), timeout: 120_000, maxBuffer: 8192, encoding: "utf8", windowsHide: true });
27
+ const value = JSON.parse(String(staged.stdout).trim());
28
+ if (!value || Object.keys(value).sort().join(",") !== "node,relay" || !validWindowsDirectory(value.node) || !validWindowsDirectory(value.relay) || win32.basename(value.node).toLowerCase() !== "node.exe" || win32.basename(value.relay) !== "runtime-pane-stdio.js")
29
+ throw Error("Staged Windows pane code could not be verified");
30
+ const node = await convert(value.node, "-u");
31
+ admit();
32
+ return spawn(node, [value.relay], { env: nativeCliEnvironment(), shell: false, windowsHide: true, stdio: ["pipe", "pipe", "pipe"] });
33
+ }
34
+ finally {
35
+ await rm(temporary, { recursive: true, force: true });
36
+ }
37
+ }
38
+ //# sourceMappingURL=local-pane-launcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-pane-launcher.js","sourceRoot":"","sources":["../src/local-pane-launcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,101 @@
1
+ param(
2
+ [Parameter(Mandatory=$true)][string]$Archive,
3
+ [Parameter(Mandatory=$true)][ValidatePattern('^[a-f0-9]{64}$')][string]$Sha256,
4
+ [Parameter(Mandatory=$true)][ValidatePattern('^[a-f0-9]{64}$')][string]$Scope
5
+ )
6
+ $ErrorActionPreference = 'Stop'
7
+ [Console]::OutputEncoding = [Text.UTF8Encoding]::new($false)
8
+ function Real-Directory([string]$Path) {
9
+ $entry = Get-Item -LiteralPath $Path -Force
10
+ if (-not $entry.PSIsContainer -or ($entry.Attributes -band [IO.FileAttributes]::ReparsePoint)) { throw 'Unsafe pane code directory' }
11
+ }
12
+ function Private-Directory([string]$Path) {
13
+ [IO.Directory]::CreateDirectory($Path) | Out-Null
14
+ Real-Directory $Path
15
+ $user = [Security.Principal.WindowsIdentity]::GetCurrent().User
16
+ $acl = [Security.AccessControl.DirectorySecurity]::new()
17
+ $directory = [IO.DirectoryInfo]::new($Path)
18
+ if ($directory.GetAccessControl([Security.AccessControl.AccessControlSections]::Owner).GetOwner([Security.Principal.SecurityIdentifier]).Value -ne $user.Value) { throw 'Pane code directory has a different owner' }
19
+ $acl.SetAccessRuleProtection($true,$false)
20
+ foreach ($sid in @($user,[Security.Principal.SecurityIdentifier]::new('S-1-5-18'))) {
21
+ $acl.AddAccessRule([Security.AccessControl.FileSystemAccessRule]::new($sid,'FullControl','ContainerInherit,ObjectInherit','None','Allow'))
22
+ }
23
+ $directory.SetAccessControl($acl)
24
+ }
25
+ if (-not $env:LOCALAPPDATA -or -not [IO.Path]::IsPathRooted($env:LOCALAPPDATA)) { throw 'Windows local application-data directory is unavailable' }
26
+ $parent = [IO.Path]::GetFullPath($env:LOCALAPPDATA)
27
+ for ($walk = Get-Item -LiteralPath $parent -Force; $walk; $walk = $walk.Parent) { Real-Directory $walk.FullName }
28
+ foreach ($leaf in @('AgEnD','p',$Scope.Substring(0,16),'b')) { $parent = Join-Path $parent $leaf; Private-Directory $parent }
29
+ $destination = Join-Path $parent $Sha256.Substring(0,16)
30
+ $temporary = Join-Path $parent ([Guid]::NewGuid().ToString('N'))
31
+ $archiveEntry = Get-Item -LiteralPath $Archive -Force
32
+ if ($archiveEntry.PSIsContainer -or ($archiveEntry.Attributes -band [IO.FileAttributes]::ReparsePoint) -or $archiveEntry.Length -gt 8388608) { throw 'Unsafe pane code archive' }
33
+ $bytes = [IO.File]::ReadAllBytes($Archive)
34
+ $hash = [Security.Cryptography.SHA256]::Create()
35
+ function Digest([byte[]]$Value) { return [BitConverter]::ToString($hash.ComputeHash($Value)).Replace('-','').ToLowerInvariant() }
36
+ if ((Digest $bytes) -cne $Sha256) { throw 'Pane code archive checksum differs' }
37
+ Add-Type -AssemblyName System.IO.Compression
38
+ $memory = [IO.MemoryStream]::new($bytes,$false)
39
+ $zip = [IO.Compression.ZipArchive]::new($memory,[IO.Compression.ZipArchiveMode]::Read)
40
+ $exists = Test-Path -LiteralPath $destination
41
+ if ($exists) {
42
+ Real-Directory $destination
43
+ $marker = Get-Item -LiteralPath (Join-Path $destination 'bundle.sha256') -Force
44
+ if ($marker.PSIsContainer -or ($marker.Attributes -band [IO.FileAttributes]::ReparsePoint) -or $marker.Length -ne 64 -or [IO.File]::ReadAllText($marker.FullName) -cne $Sha256) { throw 'Staged pane bundle identity differs' }
45
+ } else { Private-Directory $temporary }
46
+ try {
47
+ $seen = [Collections.Generic.HashSet[string]]::new([StringComparer]::OrdinalIgnoreCase)
48
+ $total = 0
49
+ if ($zip.Entries.Count -gt 512) { throw 'Pane code archive has too many entries' }
50
+ foreach ($entry in $zip.Entries) {
51
+ if ($entry.FullName -notmatch '^agend-runtime/[A-Za-z0-9_@./-]+$' -or $entry.FullName.Contains('..') -or $entry.FullName.EndsWith('/') -or -not $seen.Add($entry.FullName) -or $entry.Length -gt 2097152) { throw 'Unsafe pane code archive entry' }
52
+ $total += $entry.Length
53
+ if ($total -gt 8388608) { throw 'Pane code archive is too large' }
54
+ $stream = $entry.Open(); $content = [IO.MemoryStream]::new()
55
+ try { $buffer = [byte[]]::new(65536); while (($count = $stream.Read($buffer,0,$buffer.Length)) -gt 0) { if ($content.Length + $count -gt 2097152) { throw 'Pane code entry exceeded its limit' }; $content.Write($buffer,0,$count) }; $data = $content.ToArray() } finally { $stream.Dispose(); $content.Dispose() }
56
+ $base = if ($exists) { $destination } else { $temporary }
57
+ $file = Join-Path $base $entry.FullName.Replace('/','\')
58
+ if ($exists) {
59
+ for ($walk = Get-Item -LiteralPath ([IO.Path]::GetDirectoryName($file)) -Force; $walk.FullName -ne $base; $walk = $walk.Parent) { Real-Directory $walk.FullName }
60
+ $onDisk = Get-Item -LiteralPath $file -Force
61
+ if ($onDisk.PSIsContainer -or ($onDisk.Attributes -band [IO.FileAttributes]::ReparsePoint) -or $onDisk.Length -ne $data.Length -or (Digest ([IO.File]::ReadAllBytes($file))) -cne (Digest $data)) { throw 'Staged pane code changed; no files were overwritten' }
62
+ } else {
63
+ [IO.Directory]::CreateDirectory([IO.Path]::GetDirectoryName($file)) | Out-Null
64
+ [IO.File]::WriteAllBytes($file,$data)
65
+ }
66
+ }
67
+ if (-not $seen.Contains('agend-runtime/dist/runtime-pane-stdio.js')) { throw 'Pane relay module is missing' }
68
+ # Verify the complete tree before executing it: unlisted package.json or JS can change Node resolution.
69
+ $base = if ($exists) { $destination } else { $temporary }
70
+ $allowedDirectories = [Collections.Generic.HashSet[string]]::new([StringComparer]::OrdinalIgnoreCase)
71
+ foreach ($name in $seen) {
72
+ for ($relative = [IO.Path]::GetDirectoryName($name.Replace('/','\')); $relative; $relative = [IO.Path]::GetDirectoryName($relative)) { [void]$allowedDirectories.Add($relative) }
73
+ }
74
+ $pending = [Collections.Generic.Stack[string]]::new(); $pending.Push($base)
75
+ while ($pending.Count -gt 0) {
76
+ $directory = $pending.Pop()
77
+ foreach ($item in Get-ChildItem -LiteralPath $directory -Force) {
78
+ $relative = $item.FullName.Substring($base.Length + 1)
79
+ if ($item.Attributes -band [IO.FileAttributes]::ReparsePoint) { throw 'Staged pane code contains an unexpected link' }
80
+ if ($item.PSIsContainer) {
81
+ if (-not $allowedDirectories.Contains($relative)) { throw 'Staged pane code contains an unexpected directory' }
82
+ $pending.Push($item.FullName)
83
+ } elseif (-not $seen.Contains($relative.Replace('\','/')) -and -not ($exists -and $relative -ceq 'bundle.sha256')) { throw 'Staged pane code contains an unexpected file' }
84
+ }
85
+ }
86
+ if (-not $exists) {
87
+ [IO.File]::WriteAllText((Join-Path $temporary 'bundle.sha256'),$Sha256,[Text.Encoding]::ASCII)
88
+ # Antivirus may briefly retain handles to freshly written native prebuilds. Never overwrite a live stage.
89
+ $deadline = [DateTime]::UtcNow.AddSeconds(15)
90
+ for (;;) {
91
+ try { [IO.Directory]::Move($temporary,$destination); break }
92
+ catch { if ((Test-Path -LiteralPath $destination) -or [DateTime]::UtcNow -ge $deadline) { throw 'Pane code staging could not be committed; retry after the pending file operation finishes' }; Start-Sleep -Milliseconds 200 }
93
+ }
94
+ }
95
+ $relay = Join-Path $destination 'agend-runtime\dist\runtime-pane-stdio.js'
96
+ $node = (Get-Command node.exe -CommandType Application -ErrorAction Stop | Select-Object -First 1).Source
97
+ [Console]::Write((@{relay=$relay;node=$node} | ConvertTo-Json -Compress))
98
+ } finally {
99
+ $zip.Dispose(); $memory.Dispose(); $hash.Dispose()
100
+ if (Test-Path -LiteralPath $temporary) { Remove-Item -LiteralPath $temporary -Recurse -Force }
101
+ }
package/dist/locale.js CHANGED
@@ -13,6 +13,33 @@ export function detectLocale(fleetConfig) {
13
13
  return detectTimezone() === 8 ? "zh-TW" : "en";
14
14
  }
15
15
  const enMessages = {
16
+ "general_location.offline": "General’s Windows PC is offline. AgEnD is still running here. Reconnect that PC, or switch General back to this host in Settings. Pending or uncertain requests will not be sent again automatically.",
17
+ "general_location.offline_short": "General’s Windows PC is offline. AgEnD is still running here. Reconnect that PC, or switch General back to this host in Settings.",
18
+ "general_location.offline_title": "General’s Windows PC is offline",
19
+ "general_location.label": "Run General on",
20
+ "general_location.host": "This AgEnD host",
21
+ "general_location.windows": "Paired Windows PC",
22
+ "general_location.confirm_windows": "Run General on {0}? Its current process must stop first. The chat stays here. The host conversation is kept; Windows uses its own conversation. Pending or uncertain input will not be sent to the other conversation.",
23
+ "general_location.confirm_host": "Run General on this host again? The Windows process must stop first. Its conversation is kept. General resumes this host’s saved conversation, or starts one if this host has none.",
24
+ "general_location.exit_unconfirmed": "General was not switched: the previous process has not been confirmed stopped. Reconnect its PC or use the existing stopped-process recovery, then try again. No replacement was started.",
25
+ "general_location.complete": "General now runs on {0}. Its previous conversation is kept.",
26
+ "general_location.start_failed": "General’s location was saved, but it could not start. Check Needs you and choose Start or switch back. Its previous conversation is kept; no input was replayed.",
27
+ "general_location.history": "Host and Windows conversations stay separate. Switching does not copy or merge their history.",
28
+ "general_location.input_not_replayed": "Pending or uncertain input will not be sent to the other conversation.",
29
+ "native_pane.session_unconfirmed": "Windows Claude's saved conversation could not be checked. This agent is stopped; an administrator can start a new conversation.",
30
+ "native_pane.refresh_for_session": "This agent needs a new-conversation decision. Refresh this page to choose Start a new conversation.",
31
+ "native_pane.saved_available": "The saved conversation is available again. Choose Start to resume it.",
32
+ "native_pane.codex_session_unconfirmed": "Windows Codex's saved conversation could not be checked. This agent is stopped; an administrator can start a new conversation.",
33
+ "native_pane.codex_fresh_started": "Windows Codex had no saved conversation for this agent (its first turn never finished), so a new conversation was started.",
34
+ "native_pane.fresh_started": "Windows Claude had no saved conversation for this agent (its first turn never finished), so a new conversation was started.",
35
+ "native_pane.host_upgrade": "The Windows pane host uses an older adapter. Stop its Windows agents, restart Windows, then choose Start. Saved conversations are kept.",
36
+ "native_pane.exit_unconfirmed": "The previous Windows pane exit is unconfirmed. Stop its Windows processes, then use the administrator recovery action. The saved conversation is kept; no input was replayed.",
37
+ "native_pane.no_pin": "The original conversation is not proven; recovery cannot start a fresh conversation.",
38
+ "native_pane.changed": "The held native launch changed; refresh before recovery.",
39
+ "native_pane.authority_expired": "Native recovery authority expired.",
40
+ "native_pane.still_running": "This Windows pane is still running; stop it before recovery.",
41
+ "native_pane.scope": "Native recovery lacks an exact retained host receipt.",
42
+ "native_pane.unavailable": "Persistent pane recovery is unavailable.",
16
43
  "setup.admin.cancelled": "Setup cancelled; no admin selected.",
17
44
  "setup.discord_admin.connecting": "Connecting to Discord to detect your account…",
18
45
  "setup.discord_admin.wait": "Send a message in server {0}, or DM @{1}. Waiting up to 30 seconds…",
@@ -126,6 +153,17 @@ const enMessages = {
126
153
  "web_auth.refusal_not_admin_session": "it is not an admin's session.",
127
154
  "web_auth.refusal_no_account": "it was not signed in as an account.",
128
155
  "web_auth.refusal_host_sign_in": "it holds no authority of this computer's admin now (sign in again on this computer with agend web --code).",
156
+ "web_auth.refusal_outside_sign_in": "it signed in from outside, and connections from outside are off now or its authorization has ended (sign in again with a new code).",
157
+ // #3008: connections from outside (a web-only fleet's Notices; the leader's approved wording, cid-alpha3-design).
158
+ "outside.notice_signed_in": "Signed in from outside: {0}.",
159
+ "outside.notice_paused": "Sign-in from outside is paused for {0} after {1} wrong codes.",
160
+ "outside.notice_ended": "The outside link has ended ({0}). Turn it on again on the AgEnD computer, in Settings → Access & security.",
161
+ "outside.reason_expired": "its time ran out",
162
+ "outside.reason_failed": "it could not be reopened",
163
+ "outside.duration_minutes": "{0} minutes",
164
+ "outside.duration_minute": "1 minute",
165
+ "outside.duration_hours": "{0} hours",
166
+ "outside.duration_hour": "1 hour",
129
167
  "web_auth.refusal_not_session": "it is not a signed-in browser.",
130
168
  "web_auth.refusal_other_namespace": "it belongs to another connection.",
131
169
  "web_auth.refusal_not_authorized": "it is not authorized.",
@@ -273,6 +311,9 @@ const enMessages = {
273
311
  "config_history.history_checksum": "stored checksum mismatch",
274
312
  "config_history.history_invalid": "stored copy no longer valid",
275
313
  "login.browser_cleanup_failed": "Sign-in cleanup could not be confirmed. Close the AgEnD-owned login process and restart AgEnD before retrying.",
314
+ "needs.reason.general_windows_offline": "General’s Windows PC is offline",
315
+ "needs.reason.general_location_hold": "Run General on",
316
+ "needs.reason.native_pane_hold": "Windows agent needs attention",
276
317
  "needs.reason.crashed": "Crashed",
277
318
  "needs.reason.delivery_uncertain": "Could not confirm delivery",
278
319
  "needs.reason.delivery_failed": "Delivery failed",
@@ -1374,6 +1415,7 @@ const enMessages = {
1374
1415
  "settings_confirm.source.web_session": "web dashboard",
1375
1416
  "settings_confirm.source.public_link": "public link",
1376
1417
  "settings_confirm.source.setup_session": "setup",
1418
+ "settings_confirm.source.agent_request": "an agent's request",
1377
1419
  "settings_confirm.confirm_button": "Confirm",
1378
1420
  "settings_confirm.reject_button": "Reject",
1379
1421
  "settings_confirm.no_longer_pending": "Settings confirmation is no longer pending.",
@@ -1487,9 +1529,37 @@ const enMessages = {
1487
1529
  "settings_confirm.cli_interactive": "Interactive confirmation required; --yes explicitly confirms the printed diff.",
1488
1530
  "settings_confirm.web_verified_label": "{0} (web-verified)",
1489
1531
  "settings_confirm.host_operator_label": "This computer's admin",
1532
+ "settings_confirm.web_owner_required": "Only this fleet's owner, signed in on the AgEnD computer itself, can decide an agent's request here.",
1490
1533
  "settings_confirm.host_operator": "host operator",
1491
1534
  };
1492
1535
  const zhTWMessages = {
1536
+ "general_location.offline": "General 所在的 Windows 電腦已離線。AgEnD 仍在這台主機運作。請重新連線那台電腦,或到設定把 General 切回這台主機。待處理或結果不明的請求不會自動重送。",
1537
+ "general_location.offline_short": "General 所在的 Windows 電腦已離線。AgEnD 仍在這台主機運作。請重新連線那台電腦,或到設定把 General 切回這台主機。",
1538
+ "general_location.offline_title": "General 所在的 Windows 電腦已離線",
1539
+ "general_location.label": "General 執行位置",
1540
+ "general_location.host": "這台 AgEnD 主機",
1541
+ "general_location.windows": "已配對的 Windows 電腦",
1542
+ "general_location.confirm_windows": "要讓 General 在 {0} 執行嗎?必須先停止目前的程序。聊天位置不變。主機上的對話會保留,Windows 使用自己的對話。待處理或結果不明的輸入不會送到另一段對話。",
1543
+ "general_location.confirm_host": "要讓 General 回到這台主機執行嗎?必須先停止 Windows 程序,其對話會保留。General 會繼續這台主機儲存的對話;若主機沒有既有對話,才開啟新對話。",
1544
+ "general_location.exit_unconfirmed": "General 尚未切換:還無法確認前一個程序已停止。請重新連線那台電腦,或完成現有的程序停止復原,再重試。沒有啟動替代程序。",
1545
+ "general_location.complete": "General 現在於 {0} 執行。先前的對話已保留。",
1546
+ "general_location.start_failed": "General 的執行位置已儲存,但未能啟動。請查看「等你處理」,選擇啟動或切回原位置。先前的對話已保留,沒有重送輸入。",
1547
+ "general_location.history": "主機與 Windows 各自保留對話,切換時不會複製或合併對話紀錄。",
1548
+ "general_location.input_not_replayed": "待處理或結果不明的輸入不會送到另一段對話。",
1549
+ "native_pane.session_unconfirmed": "無法確認 Windows Claude 已儲存的對話。這個代理已停止,管理員可以開始新對話。",
1550
+ "native_pane.refresh_for_session": "這個代理需要由你決定是否開始新對話。請重新整理頁面,再按「開始新對話」。",
1551
+ "native_pane.saved_available": "已儲存的對話現在可以使用了。請選擇「啟動」繼續原對話。",
1552
+ "native_pane.codex_session_unconfirmed": "無法確認 Windows Codex 已儲存的對話。這個代理已停止,管理員可以開始新對話。",
1553
+ "native_pane.codex_fresh_started": "Windows Codex 沒有這個代理已儲存的對話(第一輪還沒完成就中斷),所以開了新對話。",
1554
+ "native_pane.fresh_started": "Windows Claude 沒有這個代理已儲存的對話(第一輪還沒完成就中斷),所以開了新對話。",
1555
+ "native_pane.host_upgrade": "Windows 終端主機仍使用舊版轉接器。請先停止這台電腦的 Windows 代理,重新啟動 Windows,再按「啟動」。已儲存的對話會保留。",
1556
+ "native_pane.exit_unconfirmed": "無法確認上一個 Windows 終端是否已結束。請先停止這個代理的 Windows 程序,再由管理員復原。已儲存的對話會保留,也不會重送舊輸入。",
1557
+ "native_pane.no_pin": "尚無法確認原本的對話;復原不會另開新對話。",
1558
+ "native_pane.changed": "保留的 Windows 終端已變更,請重新整理後再復原。",
1559
+ "native_pane.authority_expired": "Windows 終端復原的授權已失效。",
1560
+ "native_pane.still_running": "這個 Windows 終端仍在執行,請先停止再復原。",
1561
+ "native_pane.scope": "Windows 終端復原缺少身分相符的保留收據。",
1562
+ "native_pane.unavailable": "目前無法復原持續執行的 Windows 終端。",
1493
1563
  "setup.admin.cancelled": "設定已取消,未選取管理員。",
1494
1564
  "setup.discord_admin.connecting": "正在連線到 Discord,以偵測你的帳號…",
1495
1565
  "setup.discord_admin.wait": "請在伺服器 {0} 發一則訊息,或私訊 @{1}。最多等待 30 秒…",
@@ -1602,6 +1672,16 @@ const zhTWMessages = {
1602
1672
  "web_auth.refusal_not_admin_session": "它不是管理者的 session。",
1603
1673
  "web_auth.refusal_no_account": "它不是用帳號登入的。",
1604
1674
  "web_auth.refusal_host_sign_in": "它目前沒有這台電腦管理者的授權(請在這台電腦上執行 agend web --code 重新登入)。",
1675
+ "web_auth.refusal_outside_sign_in": "它是從外面登入的,而從外面連線現在已關閉或授權已結束(請用新的代碼重新登入)。",
1676
+ "outside.notice_signed_in": "有人從外面登入:{0}。",
1677
+ "outside.notice_paused": "從外面登入連錯 {1} 次,已暫停 {0}。",
1678
+ "outside.notice_ended": "從外面連線的連結已結束({0})。請在 AgEnD 電腦上,到「設定 → 存取與安全」重新開啟。",
1679
+ "outside.reason_expired": "時間已到",
1680
+ "outside.reason_failed": "無法重新開啟",
1681
+ "outside.duration_minutes": "{0} 分鐘",
1682
+ "outside.duration_minute": "1 分鐘",
1683
+ "outside.duration_hours": "{0} 小時",
1684
+ "outside.duration_hour": "1 小時",
1605
1685
  "web_auth.refusal_not_session": "它不是已登入的瀏覽器。",
1606
1686
  "web_auth.refusal_other_namespace": "它屬於另一個連線。",
1607
1687
  "web_auth.refusal_not_authorized": "它尚未授權。",
@@ -1749,6 +1829,9 @@ const zhTWMessages = {
1749
1829
  "config_history.history_checksum": "儲存副本的校驗碼不符",
1750
1830
  "config_history.history_invalid": "儲存的副本已不再有效",
1751
1831
  "login.browser_cleanup_failed": "無法確認登入程序已關閉。請先關閉 AgEnD 的登入程序,重新啟動 AgEnD 後再試。",
1832
+ "needs.reason.general_windows_offline": "General 所在的 Windows 電腦已離線",
1833
+ "needs.reason.general_location_hold": "General 執行位置",
1834
+ "needs.reason.native_pane_hold": "Windows 代理需要處理",
1752
1835
  "needs.reason.crashed": "已崩潰",
1753
1836
  "needs.reason.delivery_uncertain": "無法確認是否送達",
1754
1837
  "needs.reason.delivery_failed": "傳送失敗",
@@ -2848,6 +2931,7 @@ const zhTWMessages = {
2848
2931
  "settings_confirm.source.web_session": "網頁儀表板",
2849
2932
  "settings_confirm.source.public_link": "公開連結",
2850
2933
  "settings_confirm.source.setup_session": "設定精靈",
2934
+ "settings_confirm.source.agent_request": "代理人的請求",
2851
2935
  "settings_confirm.confirm_button": "確認",
2852
2936
  "settings_confirm.reject_button": "拒絕",
2853
2937
  "settings_confirm.no_longer_pending": "這個設定確認已不在等待中。",
@@ -2961,6 +3045,7 @@ const zhTWMessages = {
2961
3045
  "settings_confirm.cli_interactive": "需要互動確認;--yes 表示明確確認上面列出的差異。",
2962
3046
  "settings_confirm.web_verified_label": "{0}(網頁驗證)",
2963
3047
  "settings_confirm.host_operator_label": "這台電腦的管理者",
3048
+ "settings_confirm.web_owner_required": "只有在 AgEnD 這台電腦上登入的 fleet 擁有者,才能在這裡決定 agent 的請求。",
2964
3049
  "settings_confirm.host_operator": "主機操作者",
2965
3050
  };
2966
3051
  const messages = {