windows-development-sandbox 1.5.0 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (709) hide show
  1. package/README.md +1 -0
  2. package/config.example.json +27 -1
  3. package/dist/app/context.d.ts +8 -0
  4. package/dist/app/context.js +12 -0
  5. package/dist/app/features/defs.d.ts +322 -0
  6. package/dist/app/features/defs.js +28 -0
  7. package/dist/app/features/sandbox/index.d.ts +2 -0
  8. package/dist/app/features/sandbox/index.js +3 -0
  9. package/dist/app/features/sandbox/sandbox.def.d.ts +193 -0
  10. package/dist/app/features/sandbox/sandbox.def.js +245 -0
  11. package/dist/app/features/sandbox/sandbox.run.d.ts +72 -0
  12. package/dist/app/features/sandbox/sandbox.run.js +98 -0
  13. package/dist/app/features/sessions/index.d.ts +2 -0
  14. package/dist/app/features/sessions/index.js +3 -0
  15. package/dist/app/features/sessions/sessions.def.d.ts +141 -0
  16. package/dist/app/features/sessions/sessions.def.js +176 -0
  17. package/dist/app/features/sessions/sessions.run.d.ts +39 -0
  18. package/dist/app/features/sessions/sessions.run.js +58 -0
  19. package/dist/{cli/menu/settings/categories.d.ts → app/features/settings/categories.def.d.ts} +4 -0
  20. package/dist/{cli/menu/settings/categories.js → app/features/settings/categories.def.js} +40 -46
  21. package/dist/app/features/settings/index.d.ts +5 -0
  22. package/dist/app/features/settings/index.js +6 -0
  23. package/dist/{cli/menu/settings/config-file.d.ts → app/features/settings/settings-file.d.ts} +1 -1
  24. package/dist/{cli/menu/settings/config-file.js → app/features/settings/settings-file.js} +1 -1
  25. package/dist/app/features/settings/settings-rows.d.ts +35 -0
  26. package/dist/app/features/settings/settings-rows.js +94 -0
  27. package/dist/app/features/settings/settings.def.d.ts +157 -0
  28. package/dist/app/features/settings/settings.def.js +179 -0
  29. package/dist/app/features/settings/settings.run.d.ts +67 -0
  30. package/dist/app/features/settings/settings.run.js +84 -0
  31. package/dist/app/kernel/define.d.ts +143 -0
  32. package/dist/app/kernel/define.js +42 -0
  33. package/dist/app/kernel/errors.d.ts +34 -0
  34. package/dist/app/kernel/errors.js +45 -0
  35. package/dist/app/kernel/fields.d.ts +70 -0
  36. package/dist/app/kernel/fields.js +243 -0
  37. package/dist/app/kernel/index.d.ts +8 -0
  38. package/dist/app/kernel/index.js +10 -0
  39. package/dist/app/kernel/io.d.ts +193 -0
  40. package/dist/app/kernel/io.js +126 -0
  41. package/dist/app/kernel/rpc.d.ts +156 -0
  42. package/dist/app/kernel/rpc.js +47 -0
  43. package/dist/{cli/menu/settings → app/kernel}/schema-node.d.ts +9 -0
  44. package/dist/{cli/menu/settings → app/kernel}/schema-node.js +26 -0
  45. package/dist/app/kernel/text.d.ts +6 -0
  46. package/dist/app/kernel/text.js +57 -0
  47. package/dist/app/kernel/view.d.ts +146 -0
  48. package/dist/app/kernel/view.js +28 -0
  49. package/dist/app/registry.d.ts +10 -0
  50. package/dist/app/registry.js +50 -0
  51. package/dist/cli/args.d.ts +18 -2
  52. package/dist/cli/args.js +101 -24
  53. package/dist/cli/commands/accounts.js +45 -17
  54. package/dist/cli/commands/context.d.ts +2 -0
  55. package/dist/cli/commands/context.js +9 -2
  56. package/dist/cli/commands/data/clean.js +32 -9
  57. package/dist/cli/commands/engine.d.ts +2 -0
  58. package/dist/cli/commands/engine.js +60 -0
  59. package/dist/cli/commands/index.d.ts +2 -1
  60. package/dist/cli/commands/index.js +2 -1
  61. package/dist/cli/commands/launch/add-root.d.ts +3 -2
  62. package/dist/cli/commands/launch/add-root.js +11 -10
  63. package/dist/cli/commands/launch/launch.js +102 -9
  64. package/dist/cli/commands/launch/prepare.js +6 -4
  65. package/dist/cli/commands/launch/running.js +2 -1
  66. package/dist/cli/commands/launch/summary.d.ts +2 -0
  67. package/dist/cli/commands/maintenance/audit.js +1 -1
  68. package/dist/cli/commands/maintenance/clean.d.ts +1 -1
  69. package/dist/cli/commands/maintenance/clean.js +17 -3
  70. package/dist/cli/commands/maintenance/config-share.d.ts +12 -0
  71. package/dist/cli/commands/maintenance/config-share.js +80 -0
  72. package/dist/cli/commands/maintenance/config.d.ts +1 -1
  73. package/dist/cli/commands/maintenance/config.js +38 -10
  74. package/dist/cli/commands/maintenance/doctor.d.ts +1 -1
  75. package/dist/cli/commands/maintenance/doctor.js +2 -4
  76. package/dist/cli/commands/maintenance/logs.js +14 -0
  77. package/dist/cli/commands/maintenance/migrate.d.ts +2 -1
  78. package/dist/cli/commands/maintenance/migrate.js +19 -4
  79. package/dist/cli/commands/maintenance/sync.js +2 -0
  80. package/dist/cli/commands/maintenance/update.d.ts +2 -0
  81. package/dist/cli/commands/maintenance/update.js +27 -4
  82. package/dist/cli/commands/projects/here.js +12 -7
  83. package/dist/cli/commands/projects/projects.js +26 -17
  84. package/dist/cli/commands/registry.js +10 -7
  85. package/dist/cli/commands/repair/checks/agents.d.ts +2 -0
  86. package/dist/cli/commands/repair/checks/agents.js +70 -0
  87. package/dist/cli/commands/repair/checks/common.d.ts +8 -0
  88. package/dist/cli/commands/repair/checks/common.js +22 -0
  89. package/dist/cli/commands/repair/checks/contained.d.ts +2 -0
  90. package/dist/cli/commands/repair/checks/contained.js +139 -0
  91. package/dist/cli/commands/repair/checks/data.d.ts +2 -0
  92. package/dist/cli/commands/repair/checks/data.js +241 -0
  93. package/dist/cli/commands/repair/checks/hcs.d.ts +7 -0
  94. package/dist/cli/commands/repair/checks/hcs.js +28 -0
  95. package/dist/cli/commands/repair/checks/index.d.ts +2 -0
  96. package/dist/cli/commands/repair/checks/index.js +24 -0
  97. package/dist/cli/commands/repair/checks/install.d.ts +5 -0
  98. package/dist/cli/commands/repair/checks/install.js +318 -0
  99. package/dist/cli/commands/repair/checks/machine.d.ts +2 -0
  100. package/dist/cli/commands/repair/checks/machine.js +232 -0
  101. package/dist/cli/commands/repair/checks/network.d.ts +6 -0
  102. package/dist/cli/commands/repair/checks/network.js +60 -0
  103. package/dist/cli/commands/repair/checks/pc.d.ts +4 -0
  104. package/dist/cli/commands/repair/checks/pc.js +86 -0
  105. package/dist/cli/commands/repair/checks/sandbox.d.ts +2 -0
  106. package/dist/cli/commands/repair/checks/sandbox.js +282 -0
  107. package/dist/cli/commands/repair/checks/settings.d.ts +2 -0
  108. package/dist/cli/commands/repair/checks/settings.js +169 -0
  109. package/dist/cli/commands/repair/checks/vpn.d.ts +2 -0
  110. package/dist/cli/commands/repair/checks/vpn.js +78 -0
  111. package/dist/cli/commands/repair/engine.d.ts +32 -0
  112. package/dist/cli/commands/repair/engine.js +127 -0
  113. package/dist/cli/commands/repair/env.d.ts +7 -0
  114. package/dist/cli/commands/repair/env.js +50 -0
  115. package/dist/cli/commands/repair/index.d.ts +1 -9
  116. package/dist/cli/commands/repair/index.js +2 -54
  117. package/dist/cli/commands/repair/log.d.ts +17 -0
  118. package/dist/cli/commands/repair/log.js +82 -0
  119. package/dist/cli/commands/repair/printer.d.ts +32 -0
  120. package/dist/cli/commands/repair/printer.js +132 -0
  121. package/dist/cli/commands/repair/run.d.ts +33 -0
  122. package/dist/cli/commands/repair/run.js +133 -0
  123. package/dist/cli/commands/repair/types.d.ts +97 -9
  124. package/dist/cli/commands/repair/types.js +11 -7
  125. package/dist/cli/commands/resume.js +2 -2
  126. package/dist/cli/commands/sessions/index.d.ts +0 -4
  127. package/dist/cli/commands/sessions/index.js +3 -7
  128. package/dist/cli/commands/setup/index.d.ts +5 -0
  129. package/dist/cli/commands/setup/index.js +25 -1
  130. package/dist/cli/commands/shared-use.d.ts +5 -2
  131. package/dist/cli/commands/shared-use.js +11 -8
  132. package/dist/cli/commands/storage/contained.d.ts +3 -0
  133. package/dist/cli/commands/storage/contained.js +179 -0
  134. package/dist/cli/commands/storage/index.d.ts +2 -0
  135. package/dist/cli/commands/storage/index.js +2 -0
  136. package/dist/cli/commands/storage/offer.d.ts +3 -0
  137. package/dist/cli/commands/storage/offer.js +91 -0
  138. package/dist/cli/commands/storage/storage.d.ts +8 -0
  139. package/dist/cli/commands/storage/storage.js +179 -0
  140. package/dist/cli/commands/user-config.js +2 -2
  141. package/dist/cli/commands/vpn.d.ts +4 -0
  142. package/dist/cli/commands/vpn.js +91 -0
  143. package/dist/cli/commands/web.d.ts +4 -0
  144. package/dist/cli/commands/web.js +97 -0
  145. package/dist/cli/history.js +1 -1
  146. package/dist/cli/index.js +48 -4
  147. package/dist/cli/manifest.d.ts +339 -97
  148. package/dist/cli/manifest.js +222 -67
  149. package/dist/cli/menu/add-agent.d.ts +47 -0
  150. package/dist/cli/menu/add-agent.js +168 -0
  151. package/dist/cli/menu/apps.d.ts +38 -3
  152. package/dist/cli/menu/apps.js +80 -5
  153. package/dist/cli/menu/command-fields.d.ts +18 -0
  154. package/dist/cli/menu/command-fields.js +61 -0
  155. package/dist/cli/menu/command-form.d.ts +22 -0
  156. package/dist/cli/menu/command-form.js +169 -46
  157. package/dist/cli/menu/data-folder.d.ts +18 -0
  158. package/dist/cli/menu/data-folder.js +99 -0
  159. package/dist/cli/menu/io-menu.d.ts +29 -0
  160. package/dist/cli/menu/io-menu.js +126 -0
  161. package/dist/cli/menu/live.d.ts +27 -0
  162. package/dist/cli/menu/live.js +69 -0
  163. package/dist/cli/menu/memory.d.ts +19 -0
  164. package/dist/cli/menu/memory.js +53 -0
  165. package/dist/cli/menu/menu.d.ts +11 -2
  166. package/dist/cli/menu/menu.js +36 -15
  167. package/dist/cli/menu/pages/accounts-page.js +55 -24
  168. package/dist/cli/menu/pages/agents-page.d.ts +68 -0
  169. package/dist/cli/menu/pages/agents-page.js +345 -0
  170. package/dist/cli/menu/pages/apps-page.d.ts +3 -1
  171. package/dist/cli/menu/pages/apps-page.js +20 -4
  172. package/dist/cli/menu/pages/list-page.d.ts +43 -3
  173. package/dist/cli/menu/pages/list-page.js +146 -12
  174. package/dist/cli/menu/pages/maintenance-page.d.ts +9 -5
  175. package/dist/cli/menu/pages/maintenance-page.js +172 -85
  176. package/dist/cli/menu/pages/sandbox-page.d.ts +7 -6
  177. package/dist/cli/menu/pages/sandbox-page.js +117 -120
  178. package/dist/cli/menu/pages/scopes.d.ts +1 -1
  179. package/dist/cli/menu/pages/sessions-page.d.ts +6 -8
  180. package/dist/cli/menu/pages/sessions-page.js +22 -75
  181. package/dist/cli/menu/pages/settings-page.d.ts +10 -14
  182. package/dist/cli/menu/pages/settings-page.js +95 -102
  183. package/dist/cli/menu/render-view.d.ts +28 -0
  184. package/dist/cli/menu/render-view.js +112 -0
  185. package/dist/cli/menu/settings/ask-path.d.ts +14 -0
  186. package/dist/cli/menu/settings/ask-path.js +14 -0
  187. package/dist/cli/menu/settings/collections/collection-editor.d.ts +8 -2
  188. package/dist/cli/menu/settings/collections/collection-editor.js +12 -8
  189. package/dist/cli/menu/settings/collections/map-editor.js +5 -1
  190. package/dist/cli/menu/settings/collections/object-list-editor.js +2 -2
  191. package/dist/cli/menu/settings/collections/object-map-editor.js +2 -2
  192. package/dist/cli/menu/settings/collections/string-list-editor.d.ts +10 -1
  193. package/dist/cli/menu/settings/collections/string-list-editor.js +23 -0
  194. package/dist/cli/menu/settings/draft.d.ts +1 -1
  195. package/dist/cli/menu/settings/format.d.ts +1 -3
  196. package/dist/cli/menu/settings/format.js +6 -36
  197. package/dist/cli/menu/settings/index.d.ts +1 -3
  198. package/dist/cli/menu/settings/index.js +3 -3
  199. package/dist/cli/menu/settings/object-editor.d.ts +6 -2
  200. package/dist/cli/menu/settings/object-editor.js +15 -4
  201. package/dist/cli/menu/settings/share.d.ts +36 -0
  202. package/dist/cli/menu/settings/share.js +131 -0
  203. package/dist/cli/menu/settings/value-editor.d.ts +10 -1
  204. package/dist/cli/menu/settings/value-editor.js +99 -63
  205. package/dist/cli/menu/several.js +7 -5
  206. package/dist/cli/menu/share-settings.d.ts +21 -0
  207. package/dist/cli/menu/share-settings.js +112 -0
  208. package/dist/cli/menu/shell.d.ts +53 -10
  209. package/dist/cli/menu/shell.js +115 -10
  210. package/dist/cli/menu/views.d.ts +7 -0
  211. package/dist/cli/menu/views.js +11 -0
  212. package/dist/cli/menu/vpn-login.d.ts +16 -0
  213. package/dist/cli/menu/vpn-login.js +74 -0
  214. package/dist/cli/operations/handler.d.ts +6 -0
  215. package/dist/cli/operations/handler.js +61 -0
  216. package/dist/cli/operations/index.d.ts +4 -0
  217. package/dist/cli/operations/index.js +5 -0
  218. package/dist/cli/operations/input.d.ts +6 -0
  219. package/dist/cli/operations/input.js +37 -0
  220. package/dist/cli/operations/io-cli.d.ts +7 -0
  221. package/dist/cli/operations/io-cli.js +62 -0
  222. package/dist/cli/operations/spec.d.ts +18 -0
  223. package/dist/cli/operations/spec.js +108 -0
  224. package/dist/cli/output/colors.d.ts +2 -2
  225. package/dist/cli/output/colors.js +2 -11
  226. package/dist/cli/output/index.d.ts +1 -0
  227. package/dist/cli/output/index.js +1 -0
  228. package/dist/cli/output/print.d.ts +5 -1
  229. package/dist/cli/output/print.js +15 -4
  230. package/dist/cli/output/progress.d.ts +15 -0
  231. package/dist/cli/output/progress.js +44 -0
  232. package/dist/cli/output/render-view.d.ts +4 -0
  233. package/dist/cli/output/render-view.js +63 -0
  234. package/dist/cli/services/accounts-service.d.ts +2 -0
  235. package/dist/cli/services/accounts-service.js +2 -2
  236. package/dist/cli/services/agent-commands-service.d.ts +2 -0
  237. package/dist/cli/services/agent-commands-service.js +11 -2
  238. package/dist/cli/services/health-service.d.ts +0 -6
  239. package/dist/cli/services/health-service.js +5 -42
  240. package/dist/cli/services/index.d.ts +3 -1
  241. package/dist/cli/services/index.js +3 -1
  242. package/dist/cli/services/logs-service.js +4 -3
  243. package/dist/cli/services/migrate-service.js +1 -1
  244. package/dist/cli/services/update-service.d.ts +2 -0
  245. package/dist/cli/services/update-service.js +13 -6
  246. package/dist/cli/services/vpn-service.d.ts +28 -0
  247. package/dist/cli/services/vpn-service.js +46 -0
  248. package/dist/cli/services/web-service.d.ts +22 -0
  249. package/dist/cli/services/web-service.js +111 -0
  250. package/dist/cli/tui/app.d.ts +12 -4
  251. package/dist/cli/tui/app.js +38 -9
  252. package/dist/cli/tui/dialogs/path-listing.d.ts +43 -0
  253. package/dist/cli/tui/dialogs/path-listing.js +127 -0
  254. package/dist/cli/tui/dialogs/path-picker.d.ts +67 -0
  255. package/dist/cli/tui/dialogs/path-picker.js +423 -0
  256. package/dist/cli/tui/dialogs/text-screen.d.ts +6 -0
  257. package/dist/cli/tui/dialogs/text-screen.js +10 -3
  258. package/dist/cli/tui/frame.d.ts +7 -10
  259. package/dist/cli/tui/frame.js +19 -10
  260. package/dist/cli/tui/index.d.ts +4 -3
  261. package/dist/cli/tui/index.js +2 -1
  262. package/dist/cli/tui/list/list-screen.d.ts +28 -2
  263. package/dist/cli/tui/list/list-screen.js +130 -66
  264. package/dist/cli/tui/list/list-types.d.ts +10 -4
  265. package/dist/cli/tui/nav.d.ts +29 -0
  266. package/dist/cli/tui/nav.js +67 -0
  267. package/dist/cli/tui/terminal.d.ts +7 -0
  268. package/dist/cli/tui/terminal.js +30 -10
  269. package/dist/cli/validate.d.ts +1 -1
  270. package/dist/cli/validate.js +3 -3
  271. package/dist/cli/version.d.ts +2 -0
  272. package/dist/cli/version.js +11 -0
  273. package/dist/core/config/defaults.js +13 -1
  274. package/dist/core/config/loader.js +12 -2
  275. package/dist/core/local-config/overrides.js +1 -0
  276. package/dist/core/prompt.d.ts +19 -0
  277. package/dist/core/prompt.js +43 -3
  278. package/dist/core/schema/common.d.ts +6 -0
  279. package/dist/core/schema/common.js +8 -0
  280. package/dist/core/schema/config.d.ts +36 -0
  281. package/dist/core/schema/config.js +26 -2
  282. package/dist/core/schema/harness.d.ts +2 -0
  283. package/dist/core/schema/harness.js +13 -2
  284. package/dist/core/schema/index.d.ts +3 -1
  285. package/dist/core/schema/index.js +3 -1
  286. package/dist/core/schema/profile.d.ts +1 -0
  287. package/dist/core/schema/profile.js +3 -0
  288. package/dist/core/schema/redact.d.ts +13 -0
  289. package/dist/core/schema/redact.js +75 -0
  290. package/dist/core/schema/sandbox.d.ts +6 -0
  291. package/dist/core/schema/sandbox.js +21 -3
  292. package/dist/core/schema/vpn.d.ts +18 -0
  293. package/dist/core/schema/vpn.js +22 -0
  294. package/dist/core/schema/web.d.ts +6 -0
  295. package/dist/core/schema/web.js +14 -0
  296. package/dist/core/types.d.ts +44 -0
  297. package/dist/core/util/fs.d.ts +2 -0
  298. package/dist/core/util/fs.js +9 -0
  299. package/dist/core/util/index.d.ts +1 -1
  300. package/dist/core/util/index.js +1 -1
  301. package/dist/guest/agents/agent-files.d.ts +54 -0
  302. package/dist/guest/agents/agent-files.js +67 -0
  303. package/dist/guest/agents/agent-installer.js +2 -9
  304. package/dist/guest/agents/local-state.d.ts +14 -0
  305. package/dist/guest/agents/local-state.js +218 -0
  306. package/dist/guest/agents/sbx-agent.d.ts +2 -0
  307. package/dist/guest/agents/sbx-agent.js +35 -0
  308. package/dist/guest/boot/boot.d.ts +4 -0
  309. package/dist/guest/boot/boot.js +51 -11
  310. package/dist/guest/daemon/daemon.js +8 -1
  311. package/dist/guest/daemon/exec.js +2 -1
  312. package/dist/guest/daemon/idle-shutdown.js +2 -0
  313. package/dist/guest/daemon/sessions.d.ts +5 -0
  314. package/dist/guest/daemon/sessions.js +20 -3
  315. package/dist/guest/entries/agent.d.ts +1 -0
  316. package/dist/guest/entries/agent.js +10 -0
  317. package/dist/guest/entries/daemon.js +5 -0
  318. package/dist/guest/governor/decide.d.ts +61 -0
  319. package/dist/guest/governor/decide.js +182 -0
  320. package/dist/guest/governor/governor.d.ts +42 -0
  321. package/dist/guest/governor/governor.js +214 -0
  322. package/dist/guest/governor/index.d.ts +2 -0
  323. package/dist/guest/governor/index.js +2 -0
  324. package/dist/guest/runtime/csc.d.ts +2 -0
  325. package/dist/guest/runtime/csc.js +2 -0
  326. package/dist/guest/runtime/secrets.d.ts +12 -0
  327. package/dist/guest/runtime/secrets.js +63 -0
  328. package/dist/guest/sessions/viewer.js +3 -1
  329. package/dist/guest/setup/claude-profile.d.ts +2 -1
  330. package/dist/guest/setup/claude-profile.js +12 -1
  331. package/dist/guest/setup/environment.d.ts +6 -0
  332. package/dist/guest/setup/environment.js +56 -6
  333. package/dist/guest/setup/path-plan.d.ts +32 -0
  334. package/dist/guest/setup/path-plan.js +67 -0
  335. package/dist/guest/setup/shell-path.d.ts +1 -0
  336. package/dist/guest/setup/shell-path.js +22 -0
  337. package/dist/guest/toolchains/languages/python.js +1 -1
  338. package/dist/guest/toolchains/native/rust-extras.js +4 -2
  339. package/dist/guest/toolchains/runtimes.js +2 -2
  340. package/dist/guest/vpn/index.d.ts +1 -0
  341. package/dist/guest/vpn/index.js +1 -0
  342. package/dist/guest/vpn/openvpn.d.ts +9 -0
  343. package/dist/guest/vpn/openvpn.js +47 -0
  344. package/dist/guest/vpn/tunnel.d.ts +17 -0
  345. package/dist/guest/vpn/tunnel.js +78 -0
  346. package/dist/guest/vpn/vpn.d.ts +6 -0
  347. package/dist/guest/vpn/vpn.js +174 -0
  348. package/dist/guest/vpn/wireguard.d.ts +32 -0
  349. package/dist/guest/vpn/wireguard.js +132 -0
  350. package/dist/host/agent-commands/commands.d.ts +4 -0
  351. package/dist/host/agent-commands/commands.js +31 -7
  352. package/dist/host/audit/log.d.ts +1 -1
  353. package/dist/host/channel/attach.d.ts +6 -2
  354. package/dist/host/channel/attach.js +6 -3
  355. package/dist/host/channel/channel.d.ts +9 -0
  356. package/dist/host/channel/channel.js +30 -2
  357. package/dist/host/engines/engine.d.ts +12 -0
  358. package/dist/host/engines/engine.js +1 -0
  359. package/dist/host/engines/hcs/check.d.ts +25 -0
  360. package/dist/host/engines/hcs/check.js +95 -0
  361. package/dist/host/engines/hcs/documents.d.ts +44 -0
  362. package/dist/host/engines/hcs/documents.js +155 -0
  363. package/dist/host/engines/hcs/engine.d.ts +39 -0
  364. package/dist/host/engines/hcs/engine.js +171 -0
  365. package/dist/host/engines/hcs/helper.d.ts +43 -0
  366. package/dist/host/engines/hcs/helper.js +173 -0
  367. package/dist/host/engines/hcs/images.d.ts +37 -0
  368. package/dist/host/engines/hcs/images.js +152 -0
  369. package/dist/host/engines/index.d.ts +7 -0
  370. package/dist/host/engines/index.js +5 -0
  371. package/dist/host/engines/registry.d.ts +16 -0
  372. package/dist/host/engines/registry.js +30 -0
  373. package/dist/host/engines/types.d.ts +58 -0
  374. package/dist/host/engines/types.js +1 -0
  375. package/dist/host/engines/windows-sandbox/engine.d.ts +16 -0
  376. package/dist/host/engines/windows-sandbox/engine.js +63 -0
  377. package/dist/host/engines/windows-sandbox/wsb-text.d.ts +2 -0
  378. package/dist/host/engines/windows-sandbox/wsb-text.js +29 -0
  379. package/dist/host/health/acl-read.d.ts +17 -0
  380. package/dist/host/health/acl-read.js +45 -0
  381. package/dist/host/health/config-backup.d.ts +11 -0
  382. package/dist/host/health/config-backup.js +73 -0
  383. package/dist/host/health/index.d.ts +6 -0
  384. package/dist/host/health/index.js +7 -0
  385. package/dist/host/health/install-state.d.ts +33 -0
  386. package/dist/host/health/install-state.js +110 -0
  387. package/dist/host/health/path-copies.d.ts +32 -0
  388. package/dist/host/health/path-copies.js +82 -0
  389. package/dist/host/health/stale.d.ts +45 -0
  390. package/dist/host/health/stale.js +120 -0
  391. package/dist/host/health/system.d.ts +37 -0
  392. package/dist/host/health/system.js +87 -0
  393. package/dist/host/install/copies.d.ts +13 -0
  394. package/dist/host/install/copies.js +63 -0
  395. package/dist/host/install/index.d.ts +1 -0
  396. package/dist/host/install/index.js +1 -0
  397. package/dist/host/launch/generate.d.ts +5 -1
  398. package/dist/host/launch/generate.js +73 -7
  399. package/dist/host/launch/index.d.ts +3 -1
  400. package/dist/host/launch/index.js +3 -1
  401. package/dist/host/launch/launch-plan.d.ts +13 -0
  402. package/dist/host/launch/launch-plan.js +26 -0
  403. package/dist/host/launch/mappings.js +2 -1
  404. package/dist/host/launch/risk-notes.d.ts +10 -0
  405. package/dist/host/launch/risk-notes.js +18 -0
  406. package/dist/host/launch/session-file.d.ts +2 -0
  407. package/dist/host/launch/session-file.js +11 -2
  408. package/dist/host/launch/stage.js +1 -1
  409. package/dist/host/launch/wsb-file.d.ts +28 -4
  410. package/dist/host/launch/wsb-file.js +61 -42
  411. package/dist/host/life/crash-report.d.ts +27 -1
  412. package/dist/host/life/crash-report.js +173 -7
  413. package/dist/host/life/host-memory.d.ts +40 -0
  414. package/dist/host/life/host-memory.js +137 -0
  415. package/dist/host/life/index.d.ts +2 -0
  416. package/dist/host/life/index.js +2 -0
  417. package/dist/host/life/stop-events.d.ts +2 -0
  418. package/dist/host/life/stop-events.js +20 -3
  419. package/dist/host/life/stop-warning.js +1 -1
  420. package/dist/host/life/watchdog.d.ts +54 -0
  421. package/dist/host/life/watchdog.js +108 -0
  422. package/dist/host/migrate/backup.js +3 -0
  423. package/dist/host/migrate/migrations/config-file.d.ts +2 -0
  424. package/dist/host/migrate/migrations/config-file.js +7 -0
  425. package/dist/host/migrate/migrations/follow-machine-storage.js +9 -1
  426. package/dist/host/migrate/migrations/pin-storage-root.d.ts +4 -0
  427. package/dist/host/migrate/migrations/pin-storage-root.js +46 -0
  428. package/dist/host/migrate/migrations/unpin-config-defaults.js +4 -1
  429. package/dist/host/migrate/registry.js +2 -1
  430. package/dist/host/native.d.ts +3 -2
  431. package/dist/host/native.js +22 -3
  432. package/dist/host/profile/accounts.d.ts +25 -1
  433. package/dist/host/profile/accounts.js +96 -13
  434. package/dist/host/profile/agent-accounts.d.ts +5 -1
  435. package/dist/host/profile/agent-accounts.js +35 -5
  436. package/dist/host/profile/claude-login.js +3 -2
  437. package/dist/host/profile/index.d.ts +2 -1
  438. package/dist/host/profile/index.js +1 -0
  439. package/dist/host/profile/plugin-share.d.ts +26 -0
  440. package/dist/host/profile/plugin-share.js +146 -0
  441. package/dist/host/projects/join.d.ts +7 -1
  442. package/dist/host/projects/join.js +21 -4
  443. package/dist/host/projects/registry.d.ts +16 -10
  444. package/dist/host/projects/registry.js +74 -6
  445. package/dist/host/sandbox/contained-deps.d.ts +2 -0
  446. package/dist/host/sandbox/contained-deps.js +17 -0
  447. package/dist/host/sandbox/index.d.ts +2 -0
  448. package/dist/host/sandbox/index.js +2 -0
  449. package/dist/host/sandbox/platform.d.ts +4 -0
  450. package/dist/host/sandbox/platform.js +23 -4
  451. package/dist/host/sandbox/tasklist.d.ts +13 -0
  452. package/dist/host/sandbox/tasklist.js +47 -0
  453. package/dist/host/secrets/index.d.ts +2 -0
  454. package/dist/host/secrets/index.js +2 -0
  455. package/dist/host/secrets/launch-secrets.d.ts +17 -0
  456. package/dist/host/secrets/launch-secrets.js +94 -0
  457. package/dist/host/secrets/secret-store.d.ts +25 -0
  458. package/dist/host/secrets/secret-store.js +89 -0
  459. package/dist/host/sharing/acl.d.ts +16 -2
  460. package/dist/host/sharing/acl.js +35 -10
  461. package/dist/host/sharing/current.js +8 -3
  462. package/dist/host/sharing/doctor.d.ts +2 -0
  463. package/dist/host/sharing/doctor.js +44 -0
  464. package/dist/host/sharing/group-access.d.ts +6 -0
  465. package/dist/host/sharing/group-access.js +24 -0
  466. package/dist/host/sharing/index.d.ts +2 -1
  467. package/dist/host/sharing/index.js +2 -1
  468. package/dist/host/sharing/lifecycle.d.ts +8 -2
  469. package/dist/host/sharing/lifecycle.js +16 -7
  470. package/dist/host/storage/cleanup.d.ts +2 -0
  471. package/dist/host/storage/cleanup.js +2 -1
  472. package/dist/host/storage/contained/check.d.ts +9 -0
  473. package/dist/host/storage/contained/check.js +37 -0
  474. package/dist/host/storage/contained/contained-storage.d.ts +66 -0
  475. package/dist/host/storage/contained/contained-storage.js +168 -0
  476. package/dist/host/storage/contained/disk-port.d.ts +43 -0
  477. package/dist/host/storage/contained/disk-port.js +122 -0
  478. package/dist/host/storage/contained/index.d.ts +9 -0
  479. package/dist/host/storage/contained/index.js +8 -0
  480. package/dist/host/storage/contained/layout.d.ts +28 -0
  481. package/dist/host/storage/contained/layout.js +45 -0
  482. package/dist/host/storage/contained/resolve.d.ts +4 -0
  483. package/dist/host/storage/contained/resolve.js +30 -0
  484. package/dist/host/storage/contained/setting.d.ts +1 -0
  485. package/dist/host/storage/contained/setting.js +5 -0
  486. package/dist/host/storage/contained/state.d.ts +89 -0
  487. package/dist/host/storage/contained/state.js +166 -0
  488. package/dist/host/storage/contained/transfer.d.ts +24 -0
  489. package/dist/host/storage/contained/transfer.js +121 -0
  490. package/dist/host/storage/history.d.ts +21 -0
  491. package/dist/host/storage/history.js +49 -0
  492. package/dist/host/storage/index.d.ts +6 -0
  493. package/dist/host/storage/index.js +6 -0
  494. package/dist/host/storage/move.d.ts +95 -0
  495. package/dist/host/storage/move.js +384 -0
  496. package/dist/host/storage/offer.d.ts +11 -0
  497. package/dist/host/storage/offer.js +36 -0
  498. package/dist/host/storage/providers/contained.d.ts +15 -0
  499. package/dist/host/storage/providers/contained.js +39 -0
  500. package/dist/host/storage/providers/folder.d.ts +12 -0
  501. package/dist/host/storage/providers/folder.js +20 -0
  502. package/dist/host/storage/providers/index.d.ts +4 -0
  503. package/dist/host/storage/providers/index.js +3 -0
  504. package/dist/host/storage/providers/registry.d.ts +9 -0
  505. package/dist/host/storage/providers/registry.js +14 -0
  506. package/dist/host/storage/providers/types.d.ts +33 -0
  507. package/dist/host/storage/providers/types.js +1 -0
  508. package/dist/host/storage/root.d.ts +18 -0
  509. package/dist/host/storage/root.js +77 -0
  510. package/dist/host/tools/conpty.js +3 -2
  511. package/dist/host/tools/windows-terminal.d.ts +2 -0
  512. package/dist/host/tools/windows-terminal.js +31 -12
  513. package/dist/host/update/index.d.ts +1 -1
  514. package/dist/host/update/index.js +1 -1
  515. package/dist/host/update/notice.d.ts +2 -0
  516. package/dist/host/update/notice.js +13 -1
  517. package/dist/host/update/update-state.d.ts +6 -0
  518. package/dist/host/update/update-state.js +2 -0
  519. package/dist/host/update/updater.d.ts +19 -0
  520. package/dist/host/update/updater.js +88 -12
  521. package/dist/host/vpn/index.d.ts +4 -0
  522. package/dist/host/vpn/index.js +4 -0
  523. package/dist/host/vpn/login.d.ts +24 -0
  524. package/dist/host/vpn/login.js +79 -0
  525. package/dist/host/vpn/nordvpn.d.ts +21 -0
  526. package/dist/host/vpn/nordvpn.js +77 -0
  527. package/dist/host/vpn/prepare.d.ts +19 -0
  528. package/dist/host/vpn/prepare.js +138 -0
  529. package/dist/host/vpn/status.d.ts +12 -0
  530. package/dist/host/vpn/status.js +53 -0
  531. package/dist/host/web/auth.d.ts +38 -0
  532. package/dist/host/web/auth.js +96 -0
  533. package/dist/host/web/backend.d.ts +14 -0
  534. package/dist/host/web/backend.js +1 -0
  535. package/dist/host/web/bridge.d.ts +27 -0
  536. package/dist/host/web/bridge.js +144 -0
  537. package/dist/host/web/browser.d.ts +3 -0
  538. package/dist/host/web/browser.js +23 -0
  539. package/dist/host/web/control.d.ts +17 -0
  540. package/dist/host/web/control.js +67 -0
  541. package/dist/host/web/index.d.ts +10 -0
  542. package/dist/host/web/index.js +9 -0
  543. package/dist/host/web/rpc.d.ts +24 -0
  544. package/dist/host/web/rpc.js +149 -0
  545. package/dist/host/web/runner.d.ts +16 -0
  546. package/dist/host/web/runner.js +44 -0
  547. package/dist/host/web/server.d.ts +47 -0
  548. package/dist/host/web/server.js +238 -0
  549. package/dist/host/web/state.d.ts +20 -0
  550. package/dist/host/web/state.js +41 -0
  551. package/dist/host/web/static-files.d.ts +13 -0
  552. package/dist/host/web/static-files.js +57 -0
  553. package/dist/runtime/agent.js +27675 -0
  554. package/dist/runtime/daemon.js +1950 -1122
  555. package/dist/runtime/db.js +302 -111
  556. package/dist/runtime/main.js +1560 -275
  557. package/dist/runtime/netproxy.js +168 -8
  558. package/dist/runtime/view.js +186 -13
  559. package/dist/selftest/accounts.test.js +40 -0
  560. package/dist/selftest/agent-paths.test.d.ts +2 -0
  561. package/dist/selftest/agent-paths.test.js +125 -0
  562. package/dist/selftest/app.test.d.ts +2 -0
  563. package/dist/selftest/app.test.js +324 -0
  564. package/dist/selftest/channel.test.js +18 -0
  565. package/dist/selftest/cli.test.js +35 -4
  566. package/dist/selftest/config.test.js +59 -0
  567. package/dist/selftest/contained.test.d.ts +2 -0
  568. package/dist/selftest/contained.test.js +544 -0
  569. package/dist/selftest/credentials.test.d.ts +2 -0
  570. package/dist/selftest/credentials.test.js +198 -0
  571. package/dist/selftest/engine.test.d.ts +2 -0
  572. package/dist/selftest/engine.test.js +127 -0
  573. package/dist/selftest/generate.test.js +1 -1
  574. package/dist/selftest/hcs.test.d.ts +2 -0
  575. package/dist/selftest/hcs.test.js +482 -0
  576. package/dist/selftest/health.test.d.ts +2 -0
  577. package/dist/selftest/health.test.js +470 -0
  578. package/dist/selftest/heavy-load.test.d.ts +2 -0
  579. package/dist/selftest/heavy-load.test.js +329 -0
  580. package/dist/selftest/host-sim.test.js +2 -0
  581. package/dist/selftest/index.js +31 -0
  582. package/dist/selftest/layout.test.js +14 -0
  583. package/dist/selftest/menu-perf.test.d.ts +2 -0
  584. package/dist/selftest/menu-perf.test.js +248 -0
  585. package/dist/selftest/menu-screens.d.ts +7 -0
  586. package/dist/selftest/menu-screens.js +68 -17
  587. package/dist/selftest/menu.test.js +603 -22
  588. package/dist/selftest/migrate.test.js +1 -1
  589. package/dist/selftest/personalization.test.js +3 -1
  590. package/dist/selftest/projects.test.js +39 -1
  591. package/dist/selftest/shared-use.test.js +64 -2
  592. package/dist/selftest/sharing.test.js +50 -1
  593. package/dist/selftest/storage.test.d.ts +2 -0
  594. package/dist/selftest/storage.test.js +363 -0
  595. package/dist/selftest/support/engine-cases.d.ts +8 -0
  596. package/dist/selftest/support/engine-cases.js +65 -0
  597. package/dist/selftest/support/engine-golden.d.ts +3 -0
  598. package/dist/selftest/support/engine-golden.js +66 -0
  599. package/dist/selftest/support/fixtures.d.ts +20 -0
  600. package/dist/selftest/support/hcs-probes.d.ts +17 -0
  601. package/dist/selftest/support/hcs-probes.js +41 -0
  602. package/dist/selftest/support/releases.js +1 -1
  603. package/dist/selftest/toolchains.test.js +21 -0
  604. package/dist/selftest/update-service.test.js +87 -3
  605. package/dist/selftest/vpn.test.d.ts +2 -0
  606. package/dist/selftest/vpn.test.js +412 -0
  607. package/dist/selftest/web.test.d.ts +2 -0
  608. package/dist/selftest/web.test.js +402 -0
  609. package/dist/shared/apps/catalogue.js +31 -0
  610. package/dist/shared/channel/index.d.ts +1 -0
  611. package/dist/shared/channel/index.js +1 -0
  612. package/dist/shared/channel/run-dir.d.ts +9 -1
  613. package/dist/shared/channel/run-dir.js +18 -1
  614. package/dist/shared/channel/schema.d.ts +53 -0
  615. package/dist/shared/channel/schema.js +38 -0
  616. package/dist/shared/channel/secrets.d.ts +29 -0
  617. package/dist/shared/channel/secrets.js +50 -0
  618. package/dist/shared/memory/index.d.ts +1 -0
  619. package/dist/shared/memory/index.js +1 -0
  620. package/dist/shared/memory/policy.d.ts +33 -0
  621. package/dist/shared/memory/policy.js +55 -0
  622. package/dist/shared/pty/output-filter.d.ts +14 -1
  623. package/dist/shared/pty/output-filter.js +22 -4
  624. package/dist/shared/pty/terminal.d.ts +4 -1
  625. package/dist/shared/pty/terminal.js +4 -2
  626. package/dist/shared/system.d.ts +1 -0
  627. package/dist/shared/system.js +1 -0
  628. package/dist/shared/vpn/download.d.ts +29 -0
  629. package/dist/shared/vpn/download.js +30 -0
  630. package/dist/shared/vpn/kill-switch.d.ts +18 -0
  631. package/dist/shared/vpn/kill-switch.js +81 -0
  632. package/dist/shared/vpn/ovpn.d.ts +23 -0
  633. package/dist/shared/vpn/ovpn.js +244 -0
  634. package/dist/shared/vpn/wireguard.d.ts +51 -0
  635. package/dist/shared/vpn/wireguard.js +227 -0
  636. package/dist/shared/web/index.d.ts +1 -0
  637. package/dist/shared/web/index.js +1 -0
  638. package/dist/shared/web/protocol.d.ts +61 -0
  639. package/dist/shared/web/protocol.js +35 -0
  640. package/dist/sync/sync-cycle.js +9 -5
  641. package/dist/sync/sync-state.d.ts +1 -0
  642. package/dist/sync/sync-state.js +1 -0
  643. package/dist/sync/watcher.d.ts +13 -0
  644. package/dist/sync/watcher.js +102 -3
  645. package/dist/web/index.html +14 -0
  646. package/dist/web/main-NRRS5O6Z.js +157 -0
  647. package/dist/web/main-T5DMCHYV.css +1 -0
  648. package/native/csharp/FolderSecurity.cs +29 -0
  649. package/native/csharp/HcsHost/AssemblyInfo.cs +14 -0
  650. package/native/csharp/HcsHost/Guard.cs +100 -0
  651. package/native/csharp/HcsHost/Hcs.cs +256 -0
  652. package/native/csharp/HcsHost/Json.cs +78 -0
  653. package/native/csharp/HcsHost/Program.cs +185 -0
  654. package/native/csharp/HcsHost/VirtualDisk.cs +95 -0
  655. package/native/csharp/HostTools/AssemblyInfo.cs +14 -0
  656. package/native/csharp/HostTools/MemoryStatus.cs +107 -0
  657. package/native/csharp/HostTools/Program.cs +58 -17
  658. package/native/scripts/check-contained.ps1 +28 -0
  659. package/native/scripts/contained-common.ps1 +241 -0
  660. package/native/scripts/dismount-contained.ps1 +66 -0
  661. package/native/scripts/memory-status.ps1 +34 -0
  662. package/native/scripts/mount-contained.ps1 +139 -0
  663. package/native/scripts/protect-data.ps1 +29 -0
  664. package/native/scripts/read-folder-sddl.ps1 +10 -0
  665. package/native/scripts/run-elevated.ps1 +17 -4
  666. package/native/scripts/set-folder-access.ps1 +49 -7
  667. package/native/scripts/stop-events.ps1 +23 -8
  668. package/node_modules/ws/LICENSE +20 -0
  669. package/node_modules/ws/README.md +548 -0
  670. package/node_modules/ws/browser.js +8 -0
  671. package/node_modules/ws/index.js +22 -0
  672. package/node_modules/ws/lib/buffer-util.js +131 -0
  673. package/node_modules/ws/lib/constants.js +19 -0
  674. package/node_modules/ws/lib/event-target.js +292 -0
  675. package/node_modules/ws/lib/extension.js +203 -0
  676. package/node_modules/ws/lib/limiter.js +55 -0
  677. package/node_modules/ws/lib/permessage-deflate.js +530 -0
  678. package/node_modules/ws/lib/receiver.js +743 -0
  679. package/node_modules/ws/lib/sender.js +607 -0
  680. package/node_modules/ws/lib/stream.js +161 -0
  681. package/node_modules/ws/lib/subprotocol.js +62 -0
  682. package/node_modules/ws/lib/validation.js +152 -0
  683. package/node_modules/ws/lib/websocket-server.js +562 -0
  684. package/node_modules/ws/lib/websocket.js +1421 -0
  685. package/node_modules/ws/package.json +74 -0
  686. package/node_modules/ws/wrapper.mjs +21 -0
  687. package/package.json +22 -5
  688. package/sandbox/csharp/EnvBroadcast.cs +33 -0
  689. package/sandbox/csharp/MemGov.cs +398 -0
  690. package/sandbox/csharp/PathSync.cs +90 -0
  691. package/sandbox/csharp/PtyHost.cs +111 -5
  692. package/sandbox/scripts/install-shell-path.ps1 +73 -0
  693. package/sandbox/scripts/set-machine-environment.ps1 +37 -4
  694. package/schemas/config.schema.json +136 -7
  695. package/schemas/sandbox-config.schema.json +17 -4
  696. package/dist/cli/commands/repair/checks.d.ts +0 -2
  697. package/dist/cli/commands/repair/checks.js +0 -246
  698. package/dist/cli/commands/sessions/control.d.ts +0 -4
  699. package/dist/cli/commands/sessions/control.js +0 -66
  700. package/dist/cli/commands/sessions/list.d.ts +0 -2
  701. package/dist/cli/commands/sessions/list.js +0 -45
  702. package/dist/cli/commands/sessions/status.d.ts +0 -2
  703. package/dist/cli/commands/sessions/status.js +0 -93
  704. package/dist/cli/commands/sessions/window.d.ts +0 -3
  705. package/dist/cli/commands/sessions/window.js +0 -18
  706. package/dist/cli/menu/pages/start-page.d.ts +0 -43
  707. package/dist/cli/menu/pages/start-page.js +0 -192
  708. package/dist/cli/tui/tab-bar.d.ts +0 -9
  709. package/dist/cli/tui/tab-bar.js +0 -33
@@ -0,0 +1,69 @@
1
+ // What the menu shows about the running sandbox (the status line), kept fresh in the background. Drawing and keys only
2
+ // read the last copy: the process list is fetched without blocking (every few seconds, and after an action), and the
3
+ // screen is told when what it shows has changed. While it runs, the host's own "is the sandbox running?" questions are
4
+ // answered from the same copy, so no page waits for a child process.
5
+ import { sandboxStatus } from '../../app/features/sandbox/index.js';
6
+ import { readTasklistAsync, useTasklistCache } from '../../host/sandbox/index.js';
7
+ /** The same rule as the web's live status: the sandbox status query's interval. */
8
+ const DEFAULT_INTERVAL_MS = sandboxStatus.live?.everyMs ?? 2500;
9
+ export class LiveStatus {
10
+ o;
11
+ tasklist;
12
+ text = '';
13
+ timer;
14
+ pending;
15
+ running = false;
16
+ constructor(o) {
17
+ this.o = o;
18
+ }
19
+ /** The status line as of the last refresh. */
20
+ line() {
21
+ return this.text;
22
+ }
23
+ /** Reads the process list now and derives the line (one fetch at a time; a caller during one waits for it). */
24
+ refresh() {
25
+ this.pending ??= (async () => {
26
+ try {
27
+ const list = await (this.o.fetch ?? readTasklistAsync)();
28
+ // Stopped meanwhile: a command may be running, and nothing here may touch the host's facts any more.
29
+ if (!this.running)
30
+ return;
31
+ this.tasklist = list;
32
+ this.derive();
33
+ }
34
+ catch {
35
+ // The line keeps what it showed; the next refresh tries again.
36
+ }
37
+ finally {
38
+ this.pending = undefined;
39
+ }
40
+ })();
41
+ return this.pending;
42
+ }
43
+ derive() {
44
+ const next = this.o.derive();
45
+ if (next === this.text)
46
+ return;
47
+ this.text = next;
48
+ if (this.running)
49
+ this.o.onChange();
50
+ }
51
+ /** Starts keeping the line fresh and answers the host's process questions from it (until stop). */
52
+ async start() {
53
+ if (this.running)
54
+ return;
55
+ this.running = true;
56
+ useTasklistCache(() => this.tasklist);
57
+ this.timer = setInterval(() => void this.refresh(), this.o.intervalMs ?? DEFAULT_INTERVAL_MS);
58
+ this.timer.unref();
59
+ await this.refresh();
60
+ }
61
+ /** Stops; the host's questions run their own programs again (a command that runs after the menu needs the truth). */
62
+ stop() {
63
+ this.running = false;
64
+ clearInterval(this.timer);
65
+ this.timer = undefined;
66
+ useTasklistCache(null);
67
+ this.tasklist = undefined;
68
+ }
69
+ }
@@ -0,0 +1,19 @@
1
+ import { z } from 'zod';
2
+ import type { MenuView } from './shell.js';
3
+ declare const MenuStateSchema: z.ZodObject<{
4
+ section: z.ZodString;
5
+ screens: z.ZodRecord<z.ZodString, z.ZodObject<{
6
+ category: z.ZodOptional<z.ZodString>;
7
+ search: z.ZodOptional<z.ZodString>;
8
+ }, z.core.$strict>>;
9
+ }, z.core.$strict>;
10
+ type MenuState = z.output<typeof MenuStateSchema>;
11
+ /** The view as it is stored: the section by name, so a menu with other sections still finds its way. */
12
+ export declare function viewToState(view: MenuView, labels: readonly string[]): MenuState;
13
+ /** A stored state as a view; a section that no longer exists falls back to the first. */
14
+ export declare function stateToView(state: MenuState, labels: readonly string[]): MenuView;
15
+ /** The view the last run left (undefined when there is none or the file is not valid). */
16
+ export declare function readMenuView(labels: readonly string[], dir?: string): MenuView | undefined;
17
+ /** Remembers the view for the next run. Never fails the menu. */
18
+ export declare function saveMenuView(view: MenuView, labels: readonly string[], dir?: string): void;
19
+ export {};
@@ -0,0 +1,53 @@
1
+ // Where the menu was left, kept in ~/.agent-sandbox/menu-state.json: the open section and, for each section, its
2
+ // category and search. A convenience only: a missing, invalid or unwritable file means the menu opens on Agents.
3
+ import path from 'node:path';
4
+ import { z } from 'zod';
5
+ import { userDir } from '../../core/config/index.js';
6
+ import { JsonFile } from '../../shared/io/index.js';
7
+ const ScreenSchema = z.strictObject({
8
+ category: z.string().max(100).optional(),
9
+ search: z.string().max(200).optional(),
10
+ });
11
+ const MenuStateSchema = z.strictObject({
12
+ section: z.string().max(40),
13
+ screens: z.record(z.string().max(40), ScreenSchema),
14
+ });
15
+ function stateFile(dir) {
16
+ return new JsonFile(MenuStateSchema, path.join(dir, 'menu-state.json'));
17
+ }
18
+ /** The view as it is stored: the section by name, so a menu with other sections still finds its way. */
19
+ export function viewToState(view, labels) {
20
+ const screens = {};
21
+ for (const [label, screen] of Object.entries(view.screens))
22
+ if (labels.includes(label) && (screen.category || screen.search))
23
+ screens[label] = screen;
24
+ return { section: labels[view.section] ?? labels[0] ?? '', screens };
25
+ }
26
+ /** A stored state as a view; a section that no longer exists falls back to the first. */
27
+ export function stateToView(state, labels) {
28
+ const section = labels.indexOf(state.section);
29
+ return {
30
+ section: section < 0 ? 0 : section,
31
+ screens: Object.fromEntries(Object.entries(state.screens).filter(([label]) => labels.includes(label))),
32
+ };
33
+ }
34
+ /** The view the last run left (undefined when there is none or the file is not valid). */
35
+ export function readMenuView(labels, dir = userDir()) {
36
+ try {
37
+ const state = stateFile(dir).read();
38
+ return state ? stateToView(state, labels) : undefined;
39
+ }
40
+ catch {
41
+ // The state is a convenience: an unreadable file counts as none.
42
+ return undefined;
43
+ }
44
+ }
45
+ /** Remembers the view for the next run. Never fails the menu. */
46
+ export function saveMenuView(view, labels, dir = userDir()) {
47
+ try {
48
+ stateFile(dir).write(viewToState(view, labels));
49
+ }
50
+ catch {
51
+ // Not remembering is fine.
52
+ }
53
+ }
@@ -1,11 +1,20 @@
1
1
  import type { Context } from '../commands/context.js';
2
+ import { Terminal } from '../tui/index.js';
3
+ /** What a test may replace: the terminal, the process list fetch and how often it is fetched. */
4
+ export interface MenuOptions {
5
+ readonly terminal?: Terminal;
6
+ readonly fetchTasklist?: () => Promise<string>;
7
+ readonly refreshMs?: number;
8
+ }
2
9
  export declare class Menu {
3
10
  private readonly ctx;
4
11
  private readonly runArgv;
5
12
  private readonly app;
6
- constructor(ctx: Context, runArgv: (argv: string[]) => Promise<number>);
13
+ private readonly live;
14
+ constructor(ctx: Context, runArgv: (argv: string[]) => Promise<number>, options?: MenuOptions);
15
+ /** The status line from the facts now: only ever called by the background refresh, never by a draw or a key. */
7
16
  private status;
8
- /** The tabs, in order. */
17
+ /** The sections, in order. */
9
18
  private shell;
10
19
  /** Runs the menu until you leave it, or until a command that takes over the terminal (attach) has run. */
11
20
  start(): Promise<number>;
@@ -1,6 +1,6 @@
1
- // The interactive menu (`sandbox` with no arguments): a full-screen app with seven tabs (Start, Sessions, Sandbox,
2
- // Apps, Settings, Accounts, Maintenance). The tabs are real screens fed by the services; only what needs the terminal
3
- // (attach, a start, a log) leaves the menu for a moment, one keypress from its screen.
1
+ // The interactive menu (`sandbox` with no arguments): a full-screen app with seven sections down the left (Agents,
2
+ // Sessions, Sandbox, Apps, Settings, Accounts, Maintenance). The sections are real screens fed by the services; only
3
+ // what needs the terminal (attach, a start, a log) leaves the menu for a moment, one keypress from its screen.
4
4
  import fs from 'node:fs';
5
5
  import path from 'node:path';
6
6
  import { loadConfig } from '../../core/config/index.js';
@@ -11,25 +11,38 @@ import { lookAtSandbox } from '../commands/shared-use.js';
11
11
  import { commandLine } from '../history.js';
12
12
  import { commandSpec } from '../manifest.js';
13
13
  import { AgentCommandsService, LogsService } from '../services/index.js';
14
- import { App, ExitRequested, Frame, Text, Theme } from '../tui/index.js';
14
+ import { App, ExitRequested, Frame, Terminal, Text, Theme } from '../tui/index.js';
15
15
  import { AccountsPage } from './pages/accounts-page.js';
16
+ import { AgentsPage } from './pages/agents-page.js';
16
17
  import { AppsPage } from './pages/apps-page.js';
17
18
  import { MaintenancePage } from './pages/maintenance-page.js';
18
19
  import { SandboxPage } from './pages/sandbox-page.js';
19
20
  import { SessionsPage } from './pages/sessions-page.js';
20
21
  import { SettingsPage } from './pages/settings-page.js';
21
- import { StartPage } from './pages/start-page.js';
22
- import { ConfigFile } from './settings/config-file.js';
22
+ import { ConfigFile } from '../../app/features/settings/index.js';
23
23
  import { Draft } from './settings/draft.js';
24
- import { Shell } from './shell.js';
24
+ import { LiveStatus } from './live.js';
25
+ import { readMenuView, saveMenuView } from './memory.js';
26
+ import { SECTION_LABELS, Shell } from './shell.js';
27
+ /** Where the menu was last left: it opens there again (also in a later run, from menu-state.json). */
28
+ let lastView;
25
29
  export class Menu {
26
30
  ctx;
27
31
  runArgv;
28
- app = new App();
29
- constructor(ctx, runArgv) {
32
+ app;
33
+ live;
34
+ constructor(ctx, runArgv, options = {}) {
30
35
  this.ctx = ctx;
31
36
  this.runArgv = runArgv;
32
- this.app.status = () => this.status();
37
+ this.app = new App(options.terminal ?? new Terminal());
38
+ this.live = new LiveStatus({
39
+ fetch: options.fetchTasklist,
40
+ derive: () => this.status(),
41
+ onChange: () => this.app.requestRedraw(),
42
+ intervalMs: options.refreshMs,
43
+ });
44
+ this.app.status = () => this.live.line();
45
+ this.app.afterAction = () => this.live.refresh();
33
46
  try {
34
47
  Frame.version =
35
48
  JSON.parse(fs.readFileSync(path.join(ctx.packageRoot, 'package.json'), 'utf8'))
@@ -39,6 +52,7 @@ export class Menu {
39
52
  /* no version shown */
40
53
  }
41
54
  }
55
+ /** The status line from the facts now: only ever called by the background refresh, never by a draw or a key. */
42
56
  status() {
43
57
  const folder = Theme.muted(Text.middle(process.cwd(), 70));
44
58
  if (!isSandboxRunning())
@@ -55,7 +69,7 @@ export class Menu {
55
69
  ' ' +
56
70
  folder);
57
71
  }
58
- /** The tabs, in order. */
72
+ /** The sections, in order. */
59
73
  shell() {
60
74
  const files = {
61
75
  user: ConfigFile.user(this.ctx.loaded.configPath),
@@ -64,28 +78,33 @@ export class Menu {
64
78
  const draft = new Draft();
65
79
  const { app, ctx } = this;
66
80
  return new Shell(app, [
67
- new StartPage(app, ctx),
81
+ new AgentsPage(app, ctx, files.user, draft),
68
82
  new SessionsPage(app, ctx),
69
83
  new SandboxPage(app, ctx),
70
84
  new AppsPage(app, files, draft, ctx.dataPath),
71
- new SettingsPage(app, files, draft),
85
+ new SettingsPage(app, files, draft, ctx),
72
86
  new AccountsPage(app, ctx),
73
87
  new MaintenancePage(app, ctx),
74
88
  ], draft, (saved) => this.applyAgentCommands(saved));
75
89
  }
76
90
  /** Runs the menu until you leave it, or until a command that takes over the terminal (attach) has run. */
77
91
  async start() {
78
- if (!process.stdin.isTTY) {
92
+ if (!this.app.terminal.interactive) {
79
93
  console.log('The menu needs an interactive terminal. Run sandbox --help for the commands.');
80
94
  return 1;
81
95
  }
82
96
  try {
83
97
  const shell = this.shell();
84
- await shell.openTab(0);
98
+ await this.live.start();
99
+ await shell.restore(lastView ?? readMenuView(SECTION_LABELS) ?? { section: 0, screens: {} });
85
100
  for (;;) {
86
101
  const exit = await this.app.show(shell);
102
+ lastView = shell.view();
103
+ saveMenuView(lastView, SECTION_LABELS);
87
104
  if (exit.kind === 'quit')
88
105
  return 0;
106
+ // A command (or a log) runs on its own facts, not on the menu's copy.
107
+ this.live.stop();
89
108
  if (exit.kind === 'view')
90
109
  await this.view(exit.file);
91
110
  else {
@@ -93,6 +112,7 @@ export class Menu {
93
112
  if (code !== undefined)
94
113
  return code;
95
114
  }
115
+ await this.live.start();
96
116
  await shell.reload();
97
117
  }
98
118
  }
@@ -103,6 +123,7 @@ export class Menu {
103
123
  throw e;
104
124
  }
105
125
  finally {
126
+ this.live.stop();
106
127
  this.app.close();
107
128
  }
108
129
  }
@@ -1,10 +1,14 @@
1
- // Tab 6: saved logins for every agent. Agents on the left (each with its logins), actions on the right: save the
1
+ // Section 6: saved logins for every agent. Agents on the left (each with its logins), actions on the right: save the
2
2
  // sandbox's login or this PC's, use one, make one the default, rename, remove.
3
3
  import { errMsg, safeText } from '../../../core/util/index.js';
4
4
  import { AccountsService } from '../../services/index.js';
5
5
  import { Theme } from '../../tui/index.js';
6
6
  import { ListPage } from './list-page.js';
7
7
  const NAME = /^[A-Za-z0-9_-]{1,40}$/;
8
+ const SAVE_SANDBOX = '@save-sandbox';
9
+ const SAVE_PC = '@save-pc';
10
+ /** A saved login (not a "save a login" row or a note). */
11
+ const isLogin = (id) => !id.startsWith('@') && !id.startsWith('info:');
8
12
  /** The list for the accounts tab. Pure. */
9
13
  export function accountsOptions(m) {
10
14
  return {
@@ -19,6 +23,26 @@ export function accountsOptions(m) {
19
23
  })),
20
24
  items: m.agents.flatMap((a) => {
21
25
  const rows = m.rows[a.name] ?? [];
26
+ const save = [
27
+ {
28
+ value: SAVE_SANDBOX,
29
+ label: "+ Save the sandbox's login…",
30
+ category: a.name,
31
+ section: 'Save a login',
32
+ description: 'Saves the ' + a.name + ' login you signed in with inside the sandbox, under a name you choose.',
33
+ },
34
+ ...(a.canSavePc
35
+ ? [
36
+ {
37
+ value: SAVE_PC,
38
+ label: "+ Save this PC's login…",
39
+ category: a.name,
40
+ section: 'Save a login',
41
+ description: 'Saves the ' + a.name + ' login of this PC, under a name you choose.',
42
+ },
43
+ ]
44
+ : []),
45
+ ];
22
46
  if (!a.kept)
23
47
  return [
24
48
  {
@@ -28,25 +52,28 @@ export function accountsOptions(m) {
28
52
  description: 'Sign in again in each new sandbox, or use an API key in the agent’s environment.',
29
53
  },
30
54
  ];
31
- return rows.map((r) => ({
32
- value: a.name + ':' + r.name,
33
- label: r.name,
34
- category: a.name,
35
- hint: (r.isActive ? Theme.ok('in the sandbox') : '') +
36
- (r.isActive && r.isDefault ? Theme.muted(' · ') : '') +
37
- (r.isDefault ? Theme.accent('default') : ''),
38
- description: 'Enter makes the sandbox use this login.',
39
- details: [
40
- Theme.muted('Agent ') + a.name,
41
- Theme.muted('Email ') + safeText(r.email ?? '-'),
42
- Theme.muted('Saved ') + r.savedAt.slice(0, 16).replace('T', ' '),
43
- ],
44
- }));
55
+ return [
56
+ ...save,
57
+ ...rows.map((r) => ({
58
+ value: a.name + ':' + r.name,
59
+ label: r.name,
60
+ category: a.name,
61
+ section: 'Saved logins',
62
+ hint: (r.isActive ? Theme.ok('in the sandbox') : '') +
63
+ (r.isActive && r.isDefault ? Theme.muted(' · ') : '') +
64
+ (r.isDefault ? Theme.accent('default') : ''),
65
+ description: 'Enter makes the sandbox use this login.',
66
+ details: [
67
+ Theme.muted('Agent ') + a.name,
68
+ Theme.muted('Email ') + safeText(r.email ?? '-'),
69
+ Theme.muted('Saved ') + r.savedAt.slice(0, 16).replace('T', ' '),
70
+ ],
71
+ })),
72
+ ];
45
73
  }),
46
- empty: "No saved logins. Sign in inside the sandbox, then press s to save that login (p saves this PC's).",
74
+ empty: 'No agents.',
47
75
  actions: accountActions(m.agents),
48
- enterLabel: 'use',
49
- escapeLabel: 'quit',
76
+ enterLabel: (_category, id) => (id === SAVE_SANDBOX || id === SAVE_PC ? 'save' : id && isLogin(id) ? 'use' : ''),
50
77
  };
51
78
  }
52
79
  function accountActions(agents) {
@@ -55,11 +82,11 @@ function accountActions(agents) {
55
82
  if (!agent?.kept)
56
83
  return [];
57
84
  return [
58
- { key: 's', label: 'save sandbox', importance: 1 },
59
- ...(agent.canSavePc ? [{ key: 'p', label: 'save PC', importance: 1 }] : []),
60
- { key: 'd', label: 'default', importance: 1 },
61
- { key: 'r', label: 'rename', importance: 2 },
62
- { key: 'x', label: 'remove', importance: 1 },
85
+ { key: 's', label: 'save sandbox login', importance: 3 },
86
+ ...(agent.canSavePc ? [{ key: 'p', label: 'save PC login', importance: 3 }] : []),
87
+ { key: 'd', label: 'make default', importance: 1, applies: isLogin },
88
+ { key: 'r', label: 'rename', importance: 2, applies: isLogin },
89
+ { key: 'x', label: 'remove', importance: 1, applies: isLogin },
63
90
  ];
64
91
  };
65
92
  }
@@ -94,7 +121,7 @@ export class AccountsPage extends ListPage {
94
121
  }
95
122
  static nameOf(value) {
96
123
  const i = value?.indexOf(':') ?? -1;
97
- return value && i >= 0 && !value.startsWith('info:') ? value.slice(i + 1) : undefined;
124
+ return value && i >= 0 && isLogin(value) ? value.slice(i + 1) : undefined;
98
125
  }
99
126
  async act(result) {
100
127
  const agent = this.agentNow();
@@ -102,6 +129,8 @@ export class AccountsPage extends ListPage {
102
129
  try {
103
130
  if (result.kind === 'action' && (result.key === 's' || result.key === 'p'))
104
131
  return await this.save(agent, result.key === 'p');
132
+ if (result.kind === 'pick' && (result.value === SAVE_SANDBOX || result.value === SAVE_PC))
133
+ return await this.save(agent, result.value === SAVE_PC);
105
134
  if (result.kind === 'pick' && name)
106
135
  return await this.use(agent, name);
107
136
  if (result.kind === 'action' && name) {
@@ -154,6 +183,8 @@ export class AccountsPage extends ListPage {
154
183
  async use(agent, name) {
155
184
  const account = this.service.activate(name, agent);
156
185
  let note = Theme.ok(Theme.glyph.ok + ' The sandbox now uses "' + account.name + '" for ' + agent + '.');
186
+ if (account.note)
187
+ note += ' ' + safeText(account.note);
157
188
  if (this.service.hasRunningSessions(agent) &&
158
189
  (await this.app.ask('Restart the running ' + agent + ' sessions?', ['They restart and continue their conversation where the agent can, now under the new login.'], 'Restart')))
159
190
  note += ' ' + safeText(await this.service.restart(agent));
@@ -0,0 +1,68 @@
1
+ import type { Context } from '../../commands/context.js';
2
+ import { type App, type Category, type ListAction, type ListOptions, type ListResult } from '../../tui/index.js';
3
+ import type { ConfigFile } from '../../../app/features/settings/index.js';
4
+ import type { Draft } from '../settings/draft.js';
5
+ import { ListPage, type Outcome } from './list-page.js';
6
+ export type WindowChoice = 'config' | 'hide' | 'show';
7
+ export interface AgentsModel {
8
+ readonly folder: string;
9
+ readonly defaultAgent: string;
10
+ readonly agents: readonly {
11
+ readonly name: string;
12
+ readonly ready: boolean;
13
+ }[];
14
+ readonly last: string[] | undefined;
15
+ readonly attach: boolean;
16
+ readonly window: WindowChoice;
17
+ /** Agents that can be run on this PC without the sandbox (see hostAgentsToShow). */
18
+ readonly hostAgents: readonly string[];
19
+ /** The agents you added yourself: only these can be removed (the built-in ones stay). */
20
+ readonly removable?: readonly string[];
21
+ }
22
+ /** The agents of `harnesses` that are not built in. Pure. */
23
+ export declare function addedAgents(names: readonly string[]): string[];
24
+ /** The keys of the Start category: make an agent the default, remove one you added. Pure. */
25
+ export declare function agentActions(m: Pick<AgentsModel, 'defaultAgent' | 'removable'>): ListAction<string>[];
26
+ /**
27
+ * The "not sandboxed" entries: only while agent commands are on (typing the agent then starts the sandbox, so a way to
28
+ * run the real one is needed), one per agent found installed on this PC.
29
+ */
30
+ export declare function hostAgentsToShow(enabled: boolean, found: readonly {
31
+ harness: string;
32
+ }[]): string[];
33
+ /** The command line a start stands for. Pure. */
34
+ export declare function startArgv(m: AgentsModel, agent: string, cwd: string): string[];
35
+ /** The categories of the agents section; "On this PC" only when there is something in it. Pure. */
36
+ export declare function agentCategories(m: Pick<AgentsModel, 'folder' | 'hostAgents'>): Category[];
37
+ /** The list for the agents section. Pure. */
38
+ export declare function agentsOptions(m: AgentsModel, cwd?: string): ListOptions<string>;
39
+ export declare class AgentsPage extends ListPage<string> {
40
+ private readonly ctx;
41
+ /** Your own config file and its unsaved changes: where "Add an agent" writes to. */
42
+ private readonly file;
43
+ private readonly draft;
44
+ readonly label = "Agents";
45
+ private attach;
46
+ private window;
47
+ private folder;
48
+ private model;
49
+ /** What load() looked up (programs on PATH, the history file): not asked again for every list that is built. */
50
+ private facts;
51
+ constructor(app: App, ctx: Context,
52
+ /** Your own config file and its unsaved changes: where "Add an agent" writes to. */
53
+ file: ConfigFile, draft: Draft);
54
+ /** Every agent: the configured ones, and any added in Settings that is not saved yet. */
55
+ private harnesses;
56
+ /** Is this agent already in the sandbox's persistent storage (so starting it needs no install)? */
57
+ private installed;
58
+ private current;
59
+ /** The cursor starts on the default agent. */
60
+ protected initialFocus(): string;
61
+ protected load(): Promise<void>;
62
+ protected options(): ListOptions<string>;
63
+ protected act(result: ListResult<string>): Promise<Outcome<string>>;
64
+ /** Make default (d) and Remove (x) on the highlighted agent. */
65
+ private action;
66
+ /** "Add an agent…": the new agent shows in the list, with the cursor on it. */
67
+ private add;
68
+ }