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,6 +1,10 @@
1
1
  // Every command, defined once: name, group, arguments and options with their types. args.ts builds the commander
2
- // parser from it and menu.ts builds the interactive menu from it, so a command added here works both ways.
2
+ // parser from it and menu.ts builds the interactive menu from it, so a command added here works both ways. Commands of
3
+ // the shared core (status, sessions, stop ... and actions such as config get) come from their definitions' CLI hints
4
+ // (cli/operations/spec.ts); this list shrinks as areas move into src/app.
3
5
  import { z } from 'zod';
6
+ // The file rather than the barrel: the barrel's handlers need the registry, which needs the commands.
7
+ import { withOperationCommands } from './operations/spec.js';
4
8
  const ChoicesSchema = z
5
9
  .union([z.array(z.string()), z.enum(['harnesses', 'accounts', 'sessions'])])
6
10
  .describe('Fixed values, or a list the menu fills in at run time.');
@@ -26,6 +30,13 @@ export const OptionSpecSchema = z.strictObject({
26
30
  when: z.string().optional(),
27
31
  /** Never offered in the menu (dangerous shortcuts such as --yes); typing it on the command line still works. */
28
32
  noMenu: z.boolean().optional(),
33
+ /** Heading for this option in the command's --help (launch: Session, Folder ...). */
34
+ group: z.string().optional(),
35
+ /** The name shown in --help; `flag` stays accepted as a hidden alias (--agent shown, --harness still works). */
36
+ shownAs: z
37
+ .string()
38
+ .regex(/^--[a-z][a-z0-9-]*$/)
39
+ .optional(),
29
40
  });
30
41
  export const ArgSpecSchema = z.strictObject({
31
42
  name: z.string(),
@@ -33,6 +44,8 @@ export const ArgSpecSchema = z.strictObject({
33
44
  required: z.boolean(),
34
45
  variadic: z.boolean().optional(),
35
46
  choices: ChoicesSchema.optional(),
47
+ /** Spellings accepted besides `choices` but not listed (old names). */
48
+ aliases: z.array(z.string()).optional(),
36
49
  /** Only asked in the menu when the command's first argument has this value, or one of these (data clean: targets). */
37
50
  when: z.union([z.string(), z.array(z.string())]).optional(),
38
51
  });
@@ -40,7 +53,7 @@ export const ArgSpecSchema = z.strictObject({
40
53
  export function askedWhen(when, first) {
41
54
  return when === undefined || (Array.isArray(when) ? when.includes(first) : when === first);
42
55
  }
43
- export const GroupSchema = z.enum(['Agents', 'Sandbox', 'Sessions', 'Accounts', 'Data', 'Health', 'Config']);
56
+ export const GroupSchema = z.enum(['Agents', 'Sessions', 'Projects & accounts', 'Data', 'Web', 'Health', 'Advanced']);
44
57
  export const CommandSpecSchema = z.strictObject({
45
58
  name: z.string(),
46
59
  summary: z.string(),
@@ -53,6 +66,8 @@ export const CommandSpecSchema = z.strictObject({
53
66
  /** Takes over the terminal or ends the session: the menu does not come back afterwards. */
54
67
  interactive: z.boolean().optional(),
55
68
  hidden: z.boolean().optional(),
69
+ /** Command lines shown in an Examples block at the end of the command's --help. */
70
+ examples: z.array(z.string()).optional(),
56
71
  });
57
72
  function bool(flag, description, extra = {}) {
58
73
  return {
@@ -91,16 +106,25 @@ const LABELS = {
91
106
  function labelled(options) {
92
107
  return options.map((o) => (LABELS[o.flag] ? { ...o, label: LABELS[o.flag] } : o));
93
108
  }
109
+ const SESSION = 'Session';
110
+ const FOLDER = 'Folder';
111
+ const VERSIONS = 'Versions & services';
112
+ const TRUST = 'Trust';
94
113
  const SANDBOX_OPTIONS = labelled([
95
- bool('--terminal', "attach this terminal (reuses this folder's session if nobody is watching it)", { short: '-t' }),
96
- bool('--headless', 'hide the sandbox window (sbx-show brings it back)'),
97
- bool('--new', 'always start a new session, even if this folder has an unattached one'),
98
- text('--workspace', 'dir', 'use this folder instead of the current one'),
99
- text('--node', 'version', 'Node version for nvm (default: .sandbox-config.json > .nvmrc > this PC)', {
114
+ bool('--terminal', "attach this terminal (reuses this folder's session if nobody is watching it)", {
115
+ short: '-t',
116
+ group: SESSION,
117
+ }),
118
+ bool('--headless', 'hide the sandbox window (sandbox show brings it back)', { group: SESSION }),
119
+ bool('--new', 'always start a new session, even if this folder has an unattached one', { group: SESSION }),
120
+ text('--workspace', 'dir', 'use this folder instead of the current one', { group: FOLDER }),
121
+ text('--node', 'version', "Node version (default: your project's .nvmrc or this PC's version)", {
100
122
  advanced: true,
123
+ group: VERSIONS,
101
124
  }),
102
- text('--python', 'version', 'Python 3 version (default: .sandbox-config.json > .python-version > config)', {
125
+ text('--python', 'version', "Python 3 version (default: your project's .python-version or your settings)", {
103
126
  advanced: true,
127
+ group: VERSIONS,
104
128
  }),
105
129
  {
106
130
  flag: '--database',
@@ -109,6 +133,7 @@ const SANDBOX_OPTIONS = labelled([
109
133
  description: 'also start this database (postgres, mysql, mongodb, redis, dynamodb; repeatable)',
110
134
  choices: ['postgres', 'mysql', 'mongodb', 'redis', 'dynamodb'],
111
135
  advanced: true,
136
+ group: VERSIONS,
112
137
  },
113
138
  {
114
139
  flag: '--script',
@@ -116,24 +141,26 @@ const SANDBOX_OPTIONS = labelled([
116
141
  value: 'file',
117
142
  description: 'run this .ps1/.mjs/.cmd inside the sandbox first (repeatable)',
118
143
  advanced: true,
144
+ group: VERSIONS,
119
145
  },
120
- bool('--window', 'show the sandbox window even if config says headless', { advanced: true }),
121
- bool('--trust-config', "approve the folder's .sandbox-config.json without asking", { advanced: true }),
122
- bool('--no-local-config', "ignore the folder's .sandbox-config.json", { advanced: true }),
123
- bool('--yes', 'when this folder is not in the running sandbox, or wants what it started without (vGPU, folders), restart without asking', { noMenu: true }),
146
+ bool('--window', 'show the sandbox window even if your settings say headless', { advanced: true, group: SESSION }),
147
+ bool('--trust-config', "approve the folder's .sandbox-config.json without asking", { advanced: true, group: TRUST }),
148
+ bool('--no-local-config', "ignore the folder's .sandbox-config.json", { advanced: true, group: TRUST }),
149
+ bool('--yes', 'restart the sandbox without asking if this folder needs it', { noMenu: true, group: TRUST }),
124
150
  ]);
125
151
  const AGENT_OPTIONS = labelled([
126
- text('--harness', 'name', 'agent to run', { choices: 'harnesses' }),
152
+ text('--harness', 'name', 'agent to run', { choices: 'harnesses', shownAs: '--agent', group: SESSION }),
127
153
  {
128
154
  flag: '--session',
129
155
  type: 'list',
130
156
  value: 'agent@folder',
131
- description: 'start several sessions at once, e.g. --session claude@C:\\code\\api --session "codex@C:\\code\\web|--model o3" (repeatable; after | = that agent\'s own arguments; -t attaches the first)',
157
+ description: 'start several sessions at once (repeatable; see the examples below; -t attaches the first)',
132
158
  noMenu: true,
159
+ group: SESSION,
133
160
  },
134
- text('--account', 'name', 'Claude account for this sandbox', { choices: 'accounts' }),
161
+ text('--account', 'name', 'Claude account for this sandbox', { choices: 'accounts', group: SESSION }),
135
162
  ...SANDBOX_OPTIONS,
136
- bool('--no-agent', 'set up the sandbox but do not start an agent', { advanced: true }),
163
+ bool('--no-agent', 'set up the sandbox but do not start an agent', { advanced: true, group: SESSION }),
137
164
  ]);
138
165
  const json = true;
139
166
  const COMMAND_LIST = [
@@ -145,11 +172,17 @@ const COMMAND_LIST = [
145
172
  options: AGENT_OPTIONS,
146
173
  passthrough: 'agent',
147
174
  interactive: true,
175
+ examples: [
176
+ 'sandbox claude -t start Claude here and attach this terminal',
177
+ 'sandbox launch --agent codex start Codex in the current folder',
178
+ 'sandbox launch --session claude@C:\\code\\api --session "codex@C:\\code\\web|--model o3"',
179
+ " two sessions at once (after | = that agent's own arguments)",
180
+ ],
148
181
  },
149
182
  {
150
183
  name: 'start',
151
184
  summary: 'start a sandbox with no agent (tools and databases only)',
152
- group: 'Sandbox',
185
+ group: 'Agents',
153
186
  args: [],
154
187
  options: SANDBOX_OPTIONS.filter((o) => o.flag !== '--new'),
155
188
  interactive: true,
@@ -157,7 +190,7 @@ const COMMAND_LIST = [
157
190
  {
158
191
  name: 'generate',
159
192
  summary: 'show what a start would do, without starting anything',
160
- group: 'Health',
193
+ group: 'Advanced',
161
194
  args: [],
162
195
  options: AGENT_OPTIONS,
163
196
  passthrough: 'agent',
@@ -173,25 +206,16 @@ const COMMAND_LIST = [
173
206
  {
174
207
  name: 'resume',
175
208
  summary: 'reopen the sessions from the last sandbox',
176
- group: 'Sessions',
209
+ group: 'Agents',
177
210
  args: [],
178
211
  options: [
179
212
  bool('--auto', 'used by the background sync after a crash: no questions', { noMenu: true, advanced: true }),
180
213
  ],
181
214
  },
182
- {
183
- name: 'sessions',
184
- summary: 'list agent sessions and who is attached',
185
- group: 'Sessions',
186
- args: [],
187
- options: [],
188
- json,
189
- },
190
- { name: 'status', summary: 'show what the sandbox is doing', group: 'Sandbox', args: [], options: [], json },
191
215
  {
192
216
  name: 'db',
193
217
  summary: 'list, start or stop databases in the running sandbox',
194
- group: 'Sandbox',
218
+ group: 'Sessions',
195
219
  args: [
196
220
  { name: 'action', description: 'list, start or stop', required: false, choices: ['list', 'start', 'stop'] },
197
221
  {
@@ -206,7 +230,11 @@ const COMMAND_LIST = [
206
230
  {
207
231
  name: 'exec',
208
232
  summary: 'run a command inside the sandbox and print its output',
209
- group: 'Sandbox',
233
+ group: 'Sessions',
234
+ examples: [
235
+ 'sandbox exec -- npm test run a command in the running sandbox',
236
+ 'sandbox exec --json -- node -v the result as JSON',
237
+ ],
210
238
  args: [{ name: 'command', description: 'command and its arguments', required: true, variadic: true }],
211
239
  options: [
212
240
  {
@@ -221,28 +249,16 @@ const COMMAND_LIST = [
221
249
  passthrough: 'command',
222
250
  json,
223
251
  },
224
- {
225
- name: 'restart',
226
- summary: "restart this project's running agents in place; they resume their conversation",
227
- group: 'Sessions',
228
- args: [],
229
- options: [
230
- text('--harness', 'name', 'only this agent', { choices: 'harnesses' }),
231
- bool('--all', "every project's sessions, not only this folder's"),
232
- ],
233
- },
234
- {
235
- name: 'stop',
236
- summary: "shut the sandbox down (every project's sessions end)",
237
- group: 'Sandbox',
238
- args: [],
239
- options: [bool('--yes', "do not ask when other projects' sessions would end", { noMenu: true })],
240
- },
241
252
  {
242
253
  name: 'projects',
243
254
  summary: 'the projects a sandbox can open without a restart: list, choose, roots, all/exclude',
244
- group: 'Sandbox',
255
+ group: 'Projects & accounts',
245
256
  json,
257
+ examples: [
258
+ 'sandbox projects list your projects',
259
+ 'sandbox projects add . remember this folder',
260
+ 'sandbox projects roots add C:\\code share every project in C:\\code',
261
+ ],
246
262
  args: [
247
263
  {
248
264
  name: 'action',
@@ -258,14 +274,16 @@ const COMMAND_LIST = [
258
274
  },
259
275
  { name: 'folder', description: '(roots add/remove) the folder', required: false, when: 'roots' },
260
276
  ],
261
- options: [],
277
+ options: [bool('--yes', 'do not ask before removing', { short: '-y', when: 'remove', noMenu: true })],
262
278
  },
263
- { name: 'show', summary: 'show the sandbox window', group: 'Sandbox', args: [], options: [] },
264
- { name: 'hide', summary: 'hide the sandbox window (it keeps running)', group: 'Sandbox', args: [], options: [] },
265
279
  {
266
280
  name: 'account',
267
281
  summary: 'Claude logins: list, save, use, set the default, remove',
268
- group: 'Accounts',
282
+ group: 'Projects & accounts',
283
+ examples: [
284
+ 'sandbox account save work save the login you signed in with inside the sandbox',
285
+ 'sandbox account use work the sandbox uses it (running sessions restart)',
286
+ ],
269
287
  args: [
270
288
  {
271
289
  name: 'action',
@@ -283,6 +301,7 @@ const COMMAND_LIST = [
283
301
  }),
284
302
  bool('--from-host', "(save) save this PC's login instead of the sandbox's", { when: 'save' }),
285
303
  bool('--no-restart', '(use) do not restart running sessions', { when: 'use' }),
304
+ bool('--yes', '(remove) do not ask first', { short: '-y', when: 'remove', noMenu: true }),
286
305
  ],
287
306
  json,
288
307
  },
@@ -291,7 +310,13 @@ const COMMAND_LIST = [
291
310
  summary: 'show what is kept between sandboxes (tools, databases, logins, logs), or delete some of it',
292
311
  group: 'Data',
293
312
  args: [
294
- { name: 'action', description: 'show or clean', required: false, choices: ['show', 'clean'] },
313
+ {
314
+ name: 'action',
315
+ description: 'show or clean',
316
+ required: false,
317
+ choices: ['show', 'clean'],
318
+ aliases: ['info', 'list', 'remove'],
319
+ },
295
320
  {
296
321
  name: 'targets',
297
322
  description: 'what to clean, e.g. tools/go databases logs',
@@ -300,7 +325,62 @@ const COMMAND_LIST = [
300
325
  when: 'clean',
301
326
  },
302
327
  ],
303
- options: [bool('--yes', 'do not ask before deleting', { noMenu: true })],
328
+ options: [bool('--yes', 'do not ask before deleting', { short: '-y', noMenu: true })],
329
+ json,
330
+ examples: [
331
+ 'sandbox data clean pick what to delete from a list',
332
+ 'sandbox data clean logs tools/go delete these',
333
+ ],
334
+ },
335
+ {
336
+ name: 'storage',
337
+ summary: 'where your saved data lives: show it, move it to another folder, switch folders, or (beta) keep it in a disk image',
338
+ group: 'Data',
339
+ examples: [
340
+ 'sandbox storage where the data is',
341
+ 'sandbox storage move D:\\sandbox-data move it (asks first)',
342
+ 'sandbox storage contained status (beta) the disk image for tools, state and logs',
343
+ 'sandbox storage contained on (beta) keep them in a disk image (asks first)',
344
+ ],
345
+ args: [
346
+ {
347
+ name: 'action',
348
+ description: 'show, move, use or contained',
349
+ required: false,
350
+ choices: ['show', 'move', 'use', 'contained'],
351
+ },
352
+ {
353
+ name: 'folder',
354
+ description: 'the folder to move to, or to use; for contained: on, off or status',
355
+ required: false,
356
+ when: ['move', 'use', 'contained'],
357
+ },
358
+ ],
359
+ options: [
360
+ bool('--yes', 'do not ask before moving or switching', { short: '-y', noMenu: true }),
361
+ bool('--keep-old', 'copy instead of moving: the old folder stays (needs room for both)', { when: 'move' }),
362
+ ],
363
+ json,
364
+ },
365
+ {
366
+ name: 'engine',
367
+ summary: '(beta) what runs your sandbox (Windows Sandbox or HCS) and what each engine can do on this PC',
368
+ group: 'Health',
369
+ examples: [
370
+ 'sandbox engine the engine in use and what each can do',
371
+ 'sandbox engine check hcs what this PC lacks for the HCS engine, and the commands that would fix it',
372
+ ],
373
+ args: [
374
+ { name: 'action', description: 'show or check', required: false, choices: ['show', 'check'] },
375
+ {
376
+ name: 'engine',
377
+ description: 'the engine to check',
378
+ required: false,
379
+ choices: ['windows-sandbox', 'hcs'],
380
+ when: 'check',
381
+ },
382
+ ],
383
+ options: [],
304
384
  json,
305
385
  },
306
386
  {
@@ -316,12 +396,13 @@ const COMMAND_LIST = [
316
396
  description: 'launch folders older than this many days',
317
397
  default: 7,
318
398
  },
399
+ bool('--yes', 'do not ask before deleting', { short: '-y', noMenu: true }),
319
400
  ],
320
401
  },
321
402
  { name: 'sync', summary: 'copy conversation history back to this PC now', group: 'Data', args: [], options: [] },
322
403
  {
323
404
  name: 'audit',
324
- summary: 'what happened in your sandboxes: programs started, files changed, sessions, repo guard (audit.enabled)',
405
+ summary: 'what happened in your sandboxes: programs started, files changed, sessions, repo guard (turn it on: sandbox config set audit.enabled true)',
325
406
  group: 'Health',
326
407
  json,
327
408
  args: [],
@@ -338,7 +419,10 @@ const COMMAND_LIST = [
338
419
  summary: 'print the newest sandbox log',
339
420
  group: 'Health',
340
421
  args: [],
341
- options: [bool('--follow', 'keep printing new lines', { short: '-f' })],
422
+ options: [
423
+ bool('--follow', 'keep printing new lines', { short: '-f' }),
424
+ bool('--crash', 'print the report of the last crash (what Windows logged, this PC and the sandbox memory)'),
425
+ ],
342
426
  },
343
427
  {
344
428
  name: 'setup',
@@ -349,10 +433,14 @@ const COMMAND_LIST = [
349
433
  },
350
434
  {
351
435
  name: 'doctor',
352
- summary: 'check this PC and show what will be copied or downloaded',
436
+ summary: 'check this PC, the install, your settings and the sandbox, and offer to fix what it finds',
353
437
  group: 'Health',
354
438
  args: [],
355
- options: [text('--harness', 'name', 'agent to check', { choices: 'harnesses' })],
439
+ options: [
440
+ text('--harness', 'name', 'agent to check', { choices: 'harnesses', shownAs: '--agent' }),
441
+ bool('--fix', 'fix what can be fixed without asking', { noMenu: true }),
442
+ ],
443
+ json: true,
356
444
  },
357
445
  {
358
446
  name: 'migrate',
@@ -364,6 +452,7 @@ const COMMAND_LIST = [
364
452
  text('--restore', 'backup', 'put back the files saved before an update (a folder under <storage>\\backups)', {
365
453
  advanced: true,
366
454
  }),
455
+ bool('--yes', '(--restore) do not ask first', { short: '-y', noMenu: true }),
367
456
  ],
368
457
  },
369
458
  {
@@ -374,6 +463,7 @@ const COMMAND_LIST = [
374
463
  options: [
375
464
  bool('--check', 'only look whether a newer version exists'),
376
465
  bool('--rollback', 'go back to the version before the last update'),
466
+ bool('--yes', '(--rollback) do not ask first', { short: '-y', noMenu: true }),
377
467
  text('--auto', 'on|off', 'install new versions by themselves (for everyone on this PC: needs an admin terminal)', {
378
468
  choices: ['on', 'off'],
379
469
  }),
@@ -386,15 +476,17 @@ const COMMAND_LIST = [
386
476
  },
387
477
  {
388
478
  name: 'repair',
389
- summary: 'find and fix common problems (stale state, broken downloads, half-installed tools)',
479
+ summary: 'find and fix problems (install, data folder, settings, stale state, half-installed tools)',
390
480
  group: 'Health',
391
481
  args: [],
392
- options: [],
482
+ options: [bool('--yes', 'do not ask before fixing', { short: '-y', noMenu: true })],
483
+ json: true,
393
484
  },
394
485
  {
395
486
  name: 'self-test',
396
487
  summary: 'run the built-in tests',
397
488
  group: 'Health',
489
+ hidden: true,
398
490
  args: [
399
491
  {
400
492
  name: 'suite',
@@ -408,32 +500,69 @@ const COMMAND_LIST = [
408
500
  {
409
501
  name: 'config',
410
502
  summary: "show or create your settings file, or check a project's .sandbox-config.json",
411
- group: 'Config',
503
+ group: 'Health',
412
504
  args: [
413
505
  {
414
506
  name: 'action',
415
507
  description: 'what to do',
416
508
  required: false,
417
- choices: ['show', 'path', 'init', 'schema', 'check'],
509
+ choices: ['show', 'path', 'init', 'schema', 'check', 'get', 'set', 'export', 'import'],
510
+ aliases: ['summary'],
511
+ },
512
+ {
513
+ name: 'key',
514
+ description: '(get, set, reset) the setting, e.g. sandbox.memoryMb; (export, import) the .json file',
515
+ required: false,
516
+ when: ['get', 'set', 'export', 'import'],
418
517
  },
518
+ { name: 'value', description: '(set) the new value', required: false, when: 'set' },
519
+ ],
520
+ options: [
521
+ text('--workspace', 'dir', '(check) the project folder; default: the current one'),
522
+ bool('--with-paths', '(export) keep folders and files of this PC in the file', { when: 'export' }),
523
+ bool('--yes', '(import) do not ask before changing your settings', { short: '-y', when: 'import', noMenu: true }),
524
+ ],
525
+ examples: [
526
+ 'sandbox config set sandbox.memoryMb 8192',
527
+ 'sandbox config get sandbox.memoryMb',
528
+ 'sandbox config reset sandbox.memoryMb',
529
+ 'sandbox config list',
530
+ 'sandbox config export team-settings.json',
531
+ 'sandbox config import team-settings.json',
419
532
  ],
420
- options: [text('--workspace', 'dir', '(check) the project folder; default: the current one')],
421
533
  },
422
534
  {
423
535
  name: 'agent-commands',
424
536
  summary: '(Beta) make claude, codex ... on this PC start in a hidden sandbox and attach',
425
- group: 'Agents',
537
+ group: 'Advanced',
426
538
  args: [{ name: 'action', description: 'on, off or status', required: false, choices: ['status', 'on', 'off'] }],
427
539
  options: [],
428
540
  },
541
+ {
542
+ name: 'vpn',
543
+ summary: 'the VPN for the sandbox: save your login, see whether it is on (NordVPN first)',
544
+ group: 'Advanced',
545
+ args: [
546
+ {
547
+ name: 'action',
548
+ description: 'status, login or logout',
549
+ required: false,
550
+ choices: ['status', 'login', 'logout'],
551
+ },
552
+ ],
553
+ options: [],
554
+ json: true,
555
+ examples: ['sandbox vpn login', 'sandbox vpn status'],
556
+ },
429
557
  {
430
558
  name: 'host-claude',
431
- summary: 'run Claude on this PC, NOT sandboxed, with its own profile',
559
+ summary: 'run Claude on this PC, NOT sandboxed, with its own profile (same as: sandbox host claude)',
432
560
  group: 'Agents',
433
561
  args: [],
434
562
  options: [bool('--personal', 'use your normal Claude profile')],
435
563
  passthrough: 'agent',
436
564
  interactive: true,
565
+ hidden: true,
437
566
  },
438
567
  {
439
568
  name: 'host',
@@ -447,15 +576,41 @@ const COMMAND_LIST = [
447
576
  {
448
577
  name: 'menu',
449
578
  summary: 'the interactive menu (what `sandbox` opens with no arguments)',
450
- group: 'Config',
579
+ group: 'Advanced',
451
580
  args: [],
452
581
  options: [],
453
582
  hidden: true,
454
583
  interactive: true,
455
584
  },
585
+ {
586
+ name: 'web',
587
+ summary: '(beta) your sandbox sessions in a browser on this PC: start, stop, status or open',
588
+ group: 'Web',
589
+ examples: ['sandbox web open start the web UI and open it in your browser'],
590
+ args: [
591
+ {
592
+ name: 'action',
593
+ description: 'start the server, stop it, show whether it runs, or open it in your browser',
594
+ required: false,
595
+ choices: ['start', 'stop', 'status', 'open'],
596
+ },
597
+ ],
598
+ options: [],
599
+ json,
600
+ },
456
601
  { name: '_watch', summary: 'background history sync', group: 'Data', args: [], options: [], hidden: true },
602
+ {
603
+ name: '_web',
604
+ summary: 'the web UI server (started by sandbox web start)',
605
+ group: 'Web',
606
+ args: [],
607
+ options: [],
608
+ hidden: true,
609
+ },
457
610
  ];
458
- export const COMMANDS = z.array(CommandSpecSchema).parse(COMMAND_LIST);
611
+ export const COMMANDS = z
612
+ .array(CommandSpecSchema)
613
+ .parse(withOperationCommands(z.array(CommandSpecSchema).parse(COMMAND_LIST)));
459
614
  export function commandSpec(name) {
460
615
  return COMMANDS.find((c) => c.name === name);
461
616
  }
@@ -0,0 +1,47 @@
1
+ import type { Harness } from '../../core/types.js';
2
+ import type { App } from '../tui/index.js';
3
+ import type { ConfigFile } from '../../app/features/settings/index.js';
4
+ import type { Draft } from './settings/draft.js';
5
+ /** How a new agent gets into the sandbox. */
6
+ export type AgentSource = 'npm' | 'uv' | 'host';
7
+ /** Nothing wrong with the name (true), or what is wrong. Pure. */
8
+ export declare function agentNameProblem(name: string, taken: readonly string[]): true | string;
9
+ /** The command a package usually provides: "@scope/my-agent@latest" gives "my-agent". Pure. */
10
+ export declare function commandFromPackage(pkg: string): string;
11
+ /** The config entry for a new agent. Pure. */
12
+ export declare function newAgent(source: AgentSource, what: string, command: string, hostDir?: string): Harness;
13
+ /** What `harnesses` should say with `name` taken out. Pure. */
14
+ export declare function withoutAgent(current: unknown, name: string): Record<string, unknown>;
15
+ /** Writes a setting to your config file now, or adds it to the unsaved changes when it has some already. */
16
+ export declare function writeOrStage(file: ConfigFile, draft: Draft, key: string[], value: unknown): {
17
+ saved: boolean;
18
+ };
19
+ /** What `harnesses` should say with `name` added to what is staged or in the file now. Pure. */
20
+ export declare function withAgent(current: unknown, name: string, harness: Harness): Record<string, unknown>;
21
+ /** Makes `name` the agent that starts by default (written now, or joined to unsaved changes to that setting). */
22
+ export declare function makeDefaultAgent(file: ConfigFile, draft: Draft, name: string): {
23
+ saved: boolean;
24
+ };
25
+ /** Takes an agent you added out of your settings (the built-in ones are not removable). */
26
+ export declare function removeAgent(file: ConfigFile, draft: Draft, name: string): {
27
+ saved: boolean;
28
+ };
29
+ export interface AddedAgent {
30
+ readonly name: string;
31
+ /** Written to your config file now (false: waiting for Ctrl+S with the other unsaved changes). */
32
+ readonly saved: boolean;
33
+ }
34
+ export declare class AddAgent {
35
+ private readonly app;
36
+ private readonly file;
37
+ private readonly draft;
38
+ /** Every agent that exists now (the new name must be different). */
39
+ private readonly taken;
40
+ constructor(app: App, file: ConfigFile, draft: Draft,
41
+ /** Every agent that exists now (the new name must be different). */
42
+ taken: readonly string[]);
43
+ /** Asks, then adds the agent. Undefined when you backed out. */
44
+ run(): Promise<AddedAgent | undefined>;
45
+ /** Validates and writes (or stages) the entry. */
46
+ private add;
47
+ }