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
@@ -1,11 +1,15 @@
1
- // Tab 3: the sandbox as a whole. Status (a card, the window, stopping it), Projects (roots and known projects) and
2
- // Databases (start and stop), each a category on the left.
1
+ // Section 3: the sandbox as a whole. Status (the sandbox view: its facts, the window, stopping it), Projects (roots and
2
+ // known projects) and Databases (start and stop), each a category on the left.
3
+ import fs from 'node:fs';
3
4
  import path from 'node:path';
5
+ import { sandboxPage, sandboxStatus } from '../../../app/features/sandbox/index.js';
6
+ import { readQuery } from '../../../app/registry.js';
4
7
  import { errMsg, safeText } from '../../../core/util/index.js';
5
8
  import { RunDir } from '../../../shared/channel/index.js';
6
- import { ago } from '../../output/index.js';
7
- import { DatabasesService, ProjectsService, SandboxService, } from '../../services/index.js';
9
+ import { DatabasesService, ProjectsService } from '../../services/index.js';
8
10
  import { Text, Theme, } from '../../tui/index.js';
11
+ import { MenuOperations } from '../io-menu.js';
12
+ import { menuView } from '../render-view.js';
9
13
  import { ListPage } from './list-page.js';
10
14
  const CATEGORIES = [
11
15
  { id: 'status', label: 'Status', description: 'What the sandbox is doing, its window, and stopping it.' },
@@ -16,57 +20,29 @@ const CATEGORIES = [
16
20
  },
17
21
  { id: 'databases', label: 'Databases', description: 'Databases the sandbox can run: start and stop them.' },
18
22
  ];
19
- const yesNo = (v) => (v === undefined ? '-' : v ? 'yes' : 'no');
23
+ /** The status category: the sandbox view's rows (prefixed, so they never clash with the projects' rows). */
24
+ function statusView(m) {
25
+ return menuView(sandboxPage(m.report), { category: 'status', prefix: 'status:', refresh: false });
26
+ }
20
27
  /** The list for the sandbox tab. Pure. */
21
28
  export function sandboxOptions(m) {
22
- const { sandbox, repoGuard } = m.report;
23
- const running = sandbox.running;
24
- const row = (id, label, hint, extra = {}) => ({
25
- value: id,
26
- label,
27
- hint,
28
- category: 'status',
29
- section: 'Sandbox',
30
- ...extra,
31
- });
32
- const off = running ? {} : { disabled: 'No sandbox is running.' };
33
- const sessions = m.report.projects.reduce((n, p) => n + p.sessions.length, 0) + m.report.otherSessions.length;
34
- const status = [
35
- row('info:state', 'State', running ? Theme.ok(Theme.glyph.on + ' ' + sandbox.phase) : Theme.muted(Theme.glyph.off + ' stopped'), { description: sandbox.message ? safeText(sandbox.message) : undefined }),
36
- row('info:uptime', 'Up for', sandbox.startedAt && running ? ago(sandbox.startedAt).replace(' ago', '') : '-'),
37
- row('info:daemon', 'Sandbox agent', running ? safeText(sandbox.daemon) : '-'),
38
- row('info:window', 'Window', running ? (sandbox.headless ? 'hidden' : 'shown') : '-'),
39
- row('info:sessions', 'Sessions', running ? String(sessions) : '-'),
40
- row('info:account', 'Claude account', sandbox.account ?? '-'),
41
- row('info:sync', 'History sync running', yesNo(sandbox.syncWatcher)),
42
- row('info:guard', 'Repo guard', repoGuard.guarded +
43
- ' folder(s) guarded' +
44
- (repoGuard.findings.length ? ', ' + repoGuard.findings.length + ' change(s) neutralised' : ''), {
45
- details: repoGuard.findings.slice(-8).map((f) => Theme.warn(safeText(f))),
46
- }),
47
- row('act:show', 'Show the window', '', {
48
- section: 'Actions',
49
- description: 'Brings the sandbox window to the front.',
50
- ...off,
51
- }),
52
- row('act:hide', 'Hide the window', '', {
53
- section: 'Actions',
54
- description: 'Hides the window; sbx-show inside the sandbox (or Show the window here) brings it back.',
55
- ...off,
56
- }),
57
- row('act:stop', 'Stop the sandbox…', '', {
58
- section: 'Actions',
59
- description: 'Shuts the sandbox down; history and claude-mem sync back when it closes.',
60
- ...off,
61
- }),
62
- ];
29
+ const running = m.report.sandbox.running;
30
+ const status = statusView(m);
31
+ const statusItems = [...(running ? [] : startRows(m.defaultAgent, 'status')), ...status.items];
32
+ const addRoot = {
33
+ value: ADD_ROOT,
34
+ label: '+ Add a project root…',
35
+ category: 'projects',
36
+ section: 'Project roots',
37
+ description: 'Pick a folder that holds your projects: every project in it (also new ones) opens without a restart.',
38
+ };
63
39
  const roots = m.projects.roots.map((r) => ({
64
40
  value: 'root:' + r,
65
41
  label: Text.middle(r, 60),
66
42
  hint: Theme.muted('root'),
67
43
  category: 'projects',
68
44
  section: 'Project roots',
69
- description: 'Every project in this folder (also new ones) opens without a restart.',
45
+ description: 'Every project in this folder (also new ones) opens without a restart. f removes the root.',
70
46
  }));
71
47
  const projects = m.projects.projects.map((p) => ({
72
48
  value: 'project:' + p.folder,
@@ -80,6 +56,20 @@ export function sandboxOptions(m) {
80
56
  Theme.muted('In sandbox ') + (p.running ?? '-'),
81
57
  ],
82
58
  }));
59
+ const noDatabases = m.databases
60
+ ? []
61
+ : running
62
+ ? [
63
+ {
64
+ value: 'info:db',
65
+ label: 'The sandbox is not ready yet',
66
+ category: 'databases',
67
+ section: 'Databases',
68
+ description: 'Its databases are listed once it is ready. l looks again.',
69
+ disabled: 'Not ready yet: l looks again.',
70
+ },
71
+ ]
72
+ : startRows(m.defaultAgent, 'databases');
83
73
  const databases = (m.databases ?? []).map((d) => ({
84
74
  value: 'db:' + d.name,
85
75
  label: d.name,
@@ -90,42 +80,69 @@ export function sandboxOptions(m) {
90
80
  }));
91
81
  return {
92
82
  path: [],
93
- items: [...status, ...roots, ...projects, ...databases],
83
+ items: [...statusItems, addRoot, ...roots, ...projects, ...databases, ...noDatabases],
94
84
  categories: CATEGORIES,
95
- empty: running ? 'Nothing here yet.' : 'No sandbox is running.',
96
- actions: sandboxActions,
97
- enterLabel: 'run',
98
- escapeLabel: 'quit',
85
+ empty: 'Nothing here yet.',
86
+ actions: (category) => category === 'projects' || category === 'databases' ? sandboxActions(category) : [...status.actions, REFRESH],
87
+ enterLabel: (category, id) => status.enterLabel(category, id) || enterLabel(id ?? '', m),
99
88
  };
100
89
  }
90
+ const ADD_ROOT = '@add-root';
91
+ const REFRESH = { key: 'l', label: 'refresh', importance: 3 };
92
+ /** The rows that start a sandbox, shown where the sandbox has to run for anything to be there. */
93
+ function startRows(agent, category) {
94
+ return [
95
+ {
96
+ value: 'act:start',
97
+ label: 'Start the sandbox with ' + agent,
98
+ hint: Theme.muted('default agent'),
99
+ category,
100
+ section: 'No sandbox is running',
101
+ description: 'Starts the sandbox and ' + agent + ' in this folder.',
102
+ },
103
+ {
104
+ value: 'act:start-bare',
105
+ label: 'Start the sandbox without an agent',
106
+ category,
107
+ section: 'No sandbox is running',
108
+ description: 'Tools and databases only.',
109
+ },
110
+ ];
111
+ }
112
+ /** What Enter does on a row of Projects and Databases ("" = the row only shows information). */
113
+ function enterLabel(id, m) {
114
+ if (id.startsWith('act:start'))
115
+ return 'start';
116
+ if (id === ADD_ROOT)
117
+ return 'choose folder';
118
+ if (id.startsWith('db:'))
119
+ return m.databases?.find((d) => 'db:' + d.name === id)?.running ? 'stop' : 'start';
120
+ return '';
121
+ }
101
122
  function sandboxActions(category) {
102
123
  if (category === 'projects')
103
124
  return [
104
- { key: 'a', label: 'add root' },
105
- { key: 'f', label: 'forget / remove' },
106
- ];
107
- return category === 'databases'
108
- ? []
109
- : [
110
- { key: 'w', label: 'show window' },
111
- { key: 'h', label: 'hide window' },
112
- { key: 'x', label: 'stop' },
125
+ { key: 'a', label: 'add root', importance: 1 },
126
+ { key: 'f', label: 'remove root', importance: 1, applies: (id) => id.startsWith('root:') },
127
+ { key: 'f', label: 'forget project', importance: 1, applies: (id) => id.startsWith('project:') },
128
+ REFRESH,
113
129
  ];
130
+ return [REFRESH];
114
131
  }
115
132
  export class SandboxPage extends ListPage {
116
133
  ctx;
117
134
  label = 'Sandbox';
118
135
  model;
119
- sandbox;
120
136
  projects;
137
+ operations;
121
138
  constructor(app, ctx) {
122
139
  super(app);
123
140
  this.ctx = ctx;
124
- this.sandbox = new SandboxService(ctx);
125
141
  this.projects = new ProjectsService(ctx);
142
+ this.operations = new MenuOperations(app, ctx);
126
143
  }
127
144
  async load() {
128
- const report = await this.sandbox.status();
145
+ const report = await readQuery(sandboxStatus, this.ctx);
129
146
  const guest = report.sandbox.running && report.sandbox.phase === 'ready' ? this.guestWorkspace() : null;
130
147
  let databases = null;
131
148
  if (guest) {
@@ -136,7 +153,7 @@ export class SandboxPage extends ListPage {
136
153
  /* the sandbox did not answer: the list stays empty */
137
154
  }
138
155
  }
139
- this.model = { report, projects: this.projects.list(), databases };
156
+ this.model = { report, projects: this.projects.list(), databases, defaultAgent: this.defaultAgent() };
140
157
  }
141
158
  /** The folder `sbx-db` runs in: the sandbox's own workspace. */
142
159
  guestWorkspace() {
@@ -151,16 +168,21 @@ export class SandboxPage extends ListPage {
151
168
  const id = result.kind === 'pick' || result.kind === 'action' ? result.value : undefined;
152
169
  const key = result.kind === 'action' ? result.key : undefined;
153
170
  try {
154
- if (id === 'act:show' || key === 'w')
155
- return this.show();
156
- if (id === 'act:hide' || key === 'h')
157
- return await this.hide();
158
- if (id === 'act:stop' || key === 'x')
159
- return await this.stop();
171
+ if (key === 'l')
172
+ return { reload: true };
173
+ const chosen = this.model ? statusView(this.model).resolve(result) : undefined;
174
+ if (chosen?.kind === 'action')
175
+ return await this.operations.perform(chosen.action, [this.label], (text) => this.busy(text, id));
176
+ if (id === 'act:start' && !key)
177
+ return { exit: { kind: 'run', argv: ['launch', '--harness', this.defaultAgent()] } };
178
+ if (id === 'act:start-bare' && !key)
179
+ return { exit: { kind: 'run', argv: ['start'] } };
180
+ if (id === ADD_ROOT && !key)
181
+ return await this.addRoot();
160
182
  if (key === 'a')
161
183
  return await this.addRoot();
162
184
  if (key === 'f')
163
- return this.forget(id);
185
+ return await this.forget(id);
164
186
  if (id?.startsWith('db:') && result.kind === 'pick')
165
187
  return await this.toggleDatabase(id.slice(3));
166
188
  }
@@ -169,62 +191,25 @@ export class SandboxPage extends ListPage {
169
191
  }
170
192
  return {};
171
193
  }
194
+ defaultAgent() {
195
+ return this.ctx.loaded.config.defaultHarness;
196
+ }
172
197
  noSandbox() {
173
198
  return this.model?.report.sandbox.running ? null : { notice: Theme.warn('No sandbox is running.') };
174
199
  }
175
- show() {
176
- const none = this.noSandbox();
177
- if (none)
178
- return none;
179
- this.sandbox.showWindow();
180
- return { notice: Theme.ok(Theme.glyph.ok + ' Window shown.') };
181
- }
182
- async hide() {
183
- const none = this.noSandbox();
184
- if (none)
185
- return none;
186
- await this.sandbox.hideWindow();
187
- return {
188
- reload: true,
189
- notice: Theme.ok(Theme.glyph.ok + ' Window hidden.') + Theme.muted(' sbx-show brings it back.'),
190
- };
191
- }
192
- async stop() {
193
- const none = this.noSandbox();
194
- if (none)
195
- return none;
196
- const plan = this.sandbox.stopPlan();
197
- const named = plan.running.map((s) => safeText(s.harness) + ' in ' + safeText(s.project ?? path.win32.basename(s.cwd)));
198
- const lines = [
199
- plan.running.length
200
- ? 'Stopping ends ' +
201
- plan.running.length +
202
- ' session' +
203
- (plan.running.length === 1 ? '' : 's') +
204
- ': ' +
205
- named.join(', ') +
206
- '.'
207
- : 'No session is running.',
208
- ...(plan.others.length ? [plan.others.length + ' of them belong to other projects.'] : []),
209
- 'History and claude-mem sync back when it closes.',
210
- ];
211
- if (!(await this.app.ask('Stop the sandbox?', lines, 'Stop', true)))
212
- return {};
213
- await this.sandbox.shutdown(plan.sandbox);
214
- return { reload: true, notice: Theme.ok(Theme.glyph.ok + ' The sandbox is shutting down.') };
215
- }
216
200
  async addRoot() {
217
- const typed = await this.app.text({
201
+ const picked = await this.app.pickPath({
218
202
  path: ['Sandbox', 'Add a project root'],
219
- label: 'Folder that holds your projects',
203
+ title: 'Choose the folder that holds your projects',
220
204
  about: [
221
205
  'Every project inside it (also new ones) opens without a restart. Every agent in the sandbox can see them.',
222
206
  ],
223
- validate: (v) => (v.trim() ? true : 'Type a folder.'),
207
+ use: 'add this root',
208
+ validate: (v) => (fs.existsSync(v) ? true : 'That folder does not exist.'),
224
209
  });
225
- if (!typed)
210
+ if (!picked)
226
211
  return {};
227
- const { dir, added } = this.projects.addRoot(typed.trim());
212
+ const { dir, added } = this.projects.addRoot(picked);
228
213
  return {
229
214
  reload: true,
230
215
  notice: added
@@ -232,8 +217,20 @@ export class SandboxPage extends ListPage {
232
217
  : Theme.muted(dir + ' is a root already.'),
233
218
  };
234
219
  }
235
- forget(id) {
236
- if (id?.startsWith('root:')) {
220
+ async forget(id) {
221
+ const root = id?.startsWith('root:');
222
+ if (!id || (!root && !id.startsWith('project:')))
223
+ return {};
224
+ const folder = id.slice(root ? 5 : 8);
225
+ const ok = await this.app.ask((root ? 'Remove the root ' : 'Forget ') + path.basename(folder) + '?', [
226
+ root
227
+ ? 'Its projects are no longer opened without a restart.'
228
+ : 'The project is dropped from your list of projects.',
229
+ 'Nothing in ' + folder + ' is touched.',
230
+ ], root ? 'Remove' : 'Forget', true);
231
+ if (!ok)
232
+ return {};
233
+ if (id.startsWith('root:')) {
237
234
  const { dir, removed } = this.projects.removeRoot(id.slice(5));
238
235
  return {
239
236
  reload: true,
@@ -1,5 +1,5 @@
1
1
  import { type Tab } from '../../tui/index.js';
2
- import type { ConfigFile } from '../settings/config-file.js';
2
+ import type { ConfigFile } from '../../../app/features/settings/index.js';
3
3
  export type Scope = 'user' | 'project';
4
4
  export declare const SCOPES: {
5
5
  scope: Scope;
@@ -1,18 +1,16 @@
1
+ import { type SessionsList } from '../../../app/features/sessions/index.js';
1
2
  import type { Context } from '../../commands/context.js';
2
- import { type ListedSession } from '../../services/index.js';
3
- import { type App, type ListOptions, type ListResult } from '../../tui/index.js';
3
+ import type { App, ListOptions, ListResult } from '../../tui/index.js';
4
4
  import { ListPage, type Outcome } from './list-page.js';
5
- export interface SessionsModel {
6
- readonly sandboxRunning: boolean;
7
- /** Newest first, this folder's project first. */
8
- readonly sessions: readonly ListedSession[];
9
- }
5
+ /** What the page shows: the sessions query's result (the folder column is never shown here). */
6
+ export type SessionsModel = Omit<SessionsList, 'wide'>;
10
7
  /** The list for the sessions tab. Pure. */
11
8
  export declare function sessionsOptions(m: SessionsModel): ListOptions<string>;
12
9
  export declare class SessionsPage extends ListPage<string> {
10
+ private readonly ctx;
13
11
  readonly label = "Sessions";
14
12
  private model;
15
- private readonly service;
13
+ private readonly operations;
16
14
  constructor(app: App, ctx: Context);
17
15
  protected load(): Promise<void>;
18
16
  protected options(): ListOptions<string>;
@@ -1,94 +1,41 @@
1
- // Tab 2: the agent sessions of the running sandbox. Enter shows one in this terminal (the one thing that leaves the
2
- // menu), r restarts the agents.
3
- import { errMsg, safeText } from '../../../core/util/index.js';
4
- import { isSandboxRunning } from '../../../host/sandbox/index.js';
5
- import { ago } from '../../output/index.js';
6
- import { SessionsService, viewerText } from '../../services/index.js';
7
- import { Theme } from '../../tui/index.js';
1
+ // Section 2: the agent sessions of the running sandbox, as the sessions view shows them (src/app/features/sessions).
2
+ // Enter shows one in this terminal (the one thing that leaves the menu), r restarts the agents.
3
+ import { listSessions, sessionsPage } from '../../../app/features/sessions/index.js';
4
+ import { readQuery } from '../../../app/registry.js';
5
+ import { MenuOperations } from '../io-menu.js';
6
+ import { menuView } from '../render-view.js';
8
7
  import { ListPage } from './list-page.js';
8
+ function view(m) {
9
+ return menuView(sessionsPage({ ...m, wide: false }));
10
+ }
9
11
  /** The list for the sessions tab. Pure. */
10
12
  export function sessionsOptions(m) {
11
- return {
12
- path: [],
13
- intro: m.sandboxRunning
14
- ? undefined
15
- : 'No sandbox is running. Start one on the Start tab (1); its sessions are listed here.',
16
- items: m.sessions.map((s) => ({
17
- value: s.id,
18
- label: safeText(s.harness) + ' ' + safeText(s.projectName ?? '-'),
19
- hint: s.phase + (s.exitCode !== undefined ? ' (' + s.exitCode + ')' : '') + ' ' + ago(s.startedAt),
20
- section: s.here ? "This folder's project" : 'Other sessions',
21
- description: s.phase === 'running'
22
- ? 'Enter shows this session in this terminal (Ctrl+] detaches; the session keeps running).'
23
- : undefined,
24
- details: [
25
- Theme.muted('Session ') + s.id,
26
- Theme.muted('Folder ') + safeText(s.cwd),
27
- Theme.muted('Attached ') + viewerText(s.viewers),
28
- ],
29
- ...(s.phase === 'running' ? {} : { disabled: 'This session has ended.' }),
30
- })),
31
- empty: 'No sessions yet.',
32
- actions: [
33
- { key: 'r', label: 'restart agents', importance: 1 },
34
- { key: 'o', label: 'reopen last sessions', importance: 2 },
35
- { key: 'l', label: 'refresh', importance: 3 },
36
- ],
37
- enterLabel: 'attach',
38
- escapeLabel: 'quit',
39
- };
13
+ const v = view(m);
14
+ return { path: [], items: v.items, actions: v.actions, enterLabel: v.enterLabel };
40
15
  }
41
16
  export class SessionsPage extends ListPage {
17
+ ctx;
42
18
  label = 'Sessions';
43
- model = { sandboxRunning: false, sessions: [] };
44
- service;
19
+ model;
20
+ operations;
45
21
  constructor(app, ctx) {
46
22
  super(app);
47
- this.service = new SessionsService(ctx);
23
+ this.ctx = ctx;
24
+ this.operations = new MenuOperations(app, ctx);
25
+ this.model = { sandboxRunning: false, sessions: [], defaultAgent: ctx.loaded.config.defaultHarness };
48
26
  }
49
27
  async load() {
50
- const sandboxRunning = isSandboxRunning();
51
- try {
52
- const list = sandboxRunning ? await this.service.list() : [];
53
- this.model = { sandboxRunning, sessions: this.service.ordered(list) };
54
- }
55
- catch (e) {
56
- this.model = { sandboxRunning, sessions: [] };
57
- this.say(Theme.error(Theme.glyph.cross + ' ' + errMsg(e)));
58
- }
28
+ this.model = await readQuery(listSessions, this.ctx);
59
29
  }
60
30
  options() {
61
31
  return sessionsOptions(this.model);
62
32
  }
63
33
  async act(result) {
64
- if (result.kind === 'pick')
65
- return { exit: { kind: 'run', argv: ['attach', result.value] } };
66
- if (result.kind !== 'action')
34
+ const chosen = view(this.model).resolve(result);
35
+ if (!chosen)
67
36
  return {};
68
- if (result.key === 'l')
37
+ if (chosen.kind === 'refresh')
69
38
  return { reload: true };
70
- if (result.key === 'o')
71
- return { exit: { kind: 'run', argv: ['resume'] } };
72
- if (!this.model.sandboxRunning)
73
- return { notice: Theme.warn('No sandbox is running.') };
74
- const scope = this.service.restartScope(false);
75
- const what = scope.guest ? 'the agents of ' + scope.projectName : 'every agent';
76
- const ok = await this.app.ask('Restart ' + what + '?', [
77
- 'The agents are started again and continue their conversations where they can.',
78
- ...(scope.notAProject
79
- ? [scope.folder + ' is not a project of the running sandbox: every session restarts.']
80
- : []),
81
- ], 'Restart');
82
- if (!ok)
83
- return {};
84
- try {
85
- return {
86
- reload: true,
87
- notice: Theme.ok(Theme.glyph.ok + ' ' + safeText(await this.service.restart(null, scope.guest))),
88
- };
89
- }
90
- catch (e) {
91
- return { notice: Theme.error(Theme.glyph.cross + ' ' + errMsg(e)) };
92
- }
39
+ return this.operations.perform(chosen.action, [this.label], (text) => this.busy(text));
93
40
  }
94
41
  }
@@ -1,27 +1,23 @@
1
- import { type App, type ListOptions, type ListResult } from '../../tui/index.js';
2
- import type { ConfigFile } from '../settings/config-file.js';
1
+ import { settingsOf, type ConfigFile, type Setting } from '../../../app/features/settings/index.js';
2
+ import type { Context } from '../../commands/context.js';
3
+ import { type App, type ListItem, type ListOptions, type ListResult } from '../../tui/index.js';
3
4
  import type { Draft } from '../settings/draft.js';
4
- import type { SchemaNode } from '../settings/schema-node.js';
5
5
  import { type Scope } from './scopes.js';
6
6
  import { ListPage, type Outcome } from './list-page.js';
7
- export interface Setting {
8
- readonly key: string[];
9
- readonly node: SchemaNode;
10
- readonly category: string;
11
- readonly section?: string;
12
- }
13
- /** Every editable setting with the category and heading it is shown under. */
14
- export declare function settingsOf(file: ConfigFile): Setting[];
15
- /** The list for the settings tab. Pure (reads the files it is given). */
16
- export declare function settingsOptions(files: Record<Scope, ConfigFile>, scope: Scope, draft: Draft): ListOptions<string>;
7
+ export { settingsOf, type Setting };
8
+ /** The row in General that opens the data folder flow (your own settings only). */
9
+ export declare const DATA_FOLDER = "@data-folder";
10
+ /** The list for the settings section. Pure (reads the files it is given). `extra` are rows that are not settings. */
11
+ export declare function settingsOptions(files: Record<Scope, ConfigFile>, scope: Scope, draft: Draft, extra?: readonly ListItem<string>[]): ListOptions<string>;
17
12
  export declare class SettingsPage extends ListPage<string> {
18
13
  private readonly files;
19
14
  private readonly draft;
15
+ private readonly ctx;
20
16
  readonly label = "Settings";
21
17
  readonly stages = true;
22
18
  private scope;
23
19
  private readonly editor;
24
- constructor(app: App, files: Record<Scope, ConfigFile>, draft: Draft);
20
+ constructor(app: App, files: Record<Scope, ConfigFile>, draft: Draft, ctx: Context);
25
21
  private get file();
26
22
  protected load(): Promise<void>;
27
23
  protected options(): ListOptions<string>;