windows-development-sandbox 1.7.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 (413) hide show
  1. package/config.example.json +10 -0
  2. package/dist/app/context.d.ts +8 -0
  3. package/dist/app/context.js +12 -0
  4. package/dist/app/features/defs.d.ts +322 -0
  5. package/dist/app/features/defs.js +28 -0
  6. package/dist/app/features/sandbox/index.d.ts +2 -0
  7. package/dist/app/features/sandbox/index.js +3 -0
  8. package/dist/app/features/sandbox/sandbox.def.d.ts +193 -0
  9. package/dist/app/features/sandbox/sandbox.def.js +245 -0
  10. package/dist/app/features/sandbox/sandbox.run.d.ts +72 -0
  11. package/dist/app/features/sandbox/sandbox.run.js +98 -0
  12. package/dist/app/features/sessions/index.d.ts +2 -0
  13. package/dist/app/features/sessions/index.js +3 -0
  14. package/dist/app/features/sessions/sessions.def.d.ts +141 -0
  15. package/dist/app/features/sessions/sessions.def.js +176 -0
  16. package/dist/app/features/sessions/sessions.run.d.ts +39 -0
  17. package/dist/app/features/sessions/sessions.run.js +58 -0
  18. package/dist/{cli/menu/settings/categories.d.ts → app/features/settings/categories.def.d.ts} +2 -0
  19. package/dist/{cli/menu/settings/categories.js → app/features/settings/categories.def.js} +24 -5
  20. package/dist/app/features/settings/index.d.ts +5 -0
  21. package/dist/app/features/settings/index.js +6 -0
  22. package/dist/{cli/menu/settings/config-file.d.ts → app/features/settings/settings-file.d.ts} +1 -1
  23. package/dist/{cli/menu/settings/config-file.js → app/features/settings/settings-file.js} +1 -1
  24. package/dist/app/features/settings/settings-rows.d.ts +35 -0
  25. package/dist/app/features/settings/settings-rows.js +94 -0
  26. package/dist/app/features/settings/settings.def.d.ts +157 -0
  27. package/dist/app/features/settings/settings.def.js +179 -0
  28. package/dist/app/features/settings/settings.run.d.ts +67 -0
  29. package/dist/app/features/settings/settings.run.js +84 -0
  30. package/dist/app/kernel/define.d.ts +143 -0
  31. package/dist/app/kernel/define.js +42 -0
  32. package/dist/app/kernel/errors.d.ts +34 -0
  33. package/dist/app/kernel/errors.js +45 -0
  34. package/dist/app/kernel/fields.d.ts +70 -0
  35. package/dist/app/kernel/fields.js +243 -0
  36. package/dist/app/kernel/index.d.ts +8 -0
  37. package/dist/app/kernel/index.js +10 -0
  38. package/dist/app/kernel/io.d.ts +193 -0
  39. package/dist/app/kernel/io.js +126 -0
  40. package/dist/app/kernel/rpc.d.ts +156 -0
  41. package/dist/app/kernel/rpc.js +47 -0
  42. package/dist/app/kernel/text.d.ts +6 -0
  43. package/dist/app/kernel/text.js +57 -0
  44. package/dist/app/kernel/view.d.ts +146 -0
  45. package/dist/app/kernel/view.js +28 -0
  46. package/dist/app/registry.d.ts +10 -0
  47. package/dist/app/registry.js +50 -0
  48. package/dist/cli/args.d.ts +5 -0
  49. package/dist/cli/args.js +6 -0
  50. package/dist/cli/commands/engine.d.ts +2 -0
  51. package/dist/cli/commands/engine.js +60 -0
  52. package/dist/cli/commands/index.d.ts +1 -1
  53. package/dist/cli/commands/index.js +1 -1
  54. package/dist/cli/commands/launch/launch.js +47 -7
  55. package/dist/cli/commands/launch/prepare.js +3 -3
  56. package/dist/cli/commands/launch/running.js +2 -1
  57. package/dist/cli/commands/launch/summary.d.ts +2 -0
  58. package/dist/cli/commands/maintenance/config-share.d.ts +12 -0
  59. package/dist/cli/commands/maintenance/config-share.js +80 -0
  60. package/dist/cli/commands/maintenance/config.js +8 -82
  61. package/dist/cli/commands/maintenance/logs.js +14 -0
  62. package/dist/cli/commands/registry.js +3 -7
  63. package/dist/cli/commands/repair/checks/contained.d.ts +2 -0
  64. package/dist/cli/commands/repair/checks/contained.js +139 -0
  65. package/dist/cli/commands/repair/checks/hcs.d.ts +7 -0
  66. package/dist/cli/commands/repair/checks/hcs.js +28 -0
  67. package/dist/cli/commands/repair/checks/index.js +4 -0
  68. package/dist/cli/commands/repair/checks/pc.js +32 -1
  69. package/dist/cli/commands/repair/checks/sandbox.js +16 -1
  70. package/dist/cli/commands/repair/checks/vpn.js +34 -9
  71. package/dist/cli/commands/repair/env.js +2 -1
  72. package/dist/cli/commands/sessions/index.d.ts +0 -4
  73. package/dist/cli/commands/sessions/index.js +3 -7
  74. package/dist/cli/commands/shared-use.d.ts +5 -2
  75. package/dist/cli/commands/shared-use.js +11 -8
  76. package/dist/cli/commands/storage/contained.d.ts +3 -0
  77. package/dist/cli/commands/storage/contained.js +179 -0
  78. package/dist/cli/commands/storage/offer.js +7 -1
  79. package/dist/cli/commands/storage/storage.js +10 -2
  80. package/dist/cli/commands/user-config.js +1 -1
  81. package/dist/cli/commands/vpn.js +19 -3
  82. package/dist/cli/commands/web.js +2 -0
  83. package/dist/cli/index.js +2 -1
  84. package/dist/cli/manifest.d.ts +72 -104
  85. package/dist/cli/manifest.js +64 -39
  86. package/dist/cli/menu/add-agent.d.ts +1 -1
  87. package/dist/cli/menu/add-agent.js +1 -1
  88. package/dist/cli/menu/apps.d.ts +7 -1
  89. package/dist/cli/menu/apps.js +36 -0
  90. package/dist/cli/menu/command-fields.d.ts +1 -1
  91. package/dist/cli/menu/command-form.js +2 -2
  92. package/dist/cli/menu/io-menu.d.ts +29 -0
  93. package/dist/cli/menu/io-menu.js +126 -0
  94. package/dist/cli/menu/live.d.ts +27 -0
  95. package/dist/cli/menu/live.js +69 -0
  96. package/dist/cli/menu/memory.d.ts +19 -0
  97. package/dist/cli/menu/memory.js +53 -0
  98. package/dist/cli/menu/menu.d.ts +10 -1
  99. package/dist/cli/menu/menu.js +27 -9
  100. package/dist/cli/menu/pages/agents-page.d.ts +3 -1
  101. package/dist/cli/menu/pages/agents-page.js +12 -5
  102. package/dist/cli/menu/pages/apps-page.d.ts +3 -1
  103. package/dist/cli/menu/pages/apps-page.js +19 -2
  104. package/dist/cli/menu/pages/list-page.d.ts +27 -0
  105. package/dist/cli/menu/pages/list-page.js +109 -7
  106. package/dist/cli/menu/pages/maintenance-page.d.ts +0 -5
  107. package/dist/cli/menu/pages/maintenance-page.js +17 -19
  108. package/dist/cli/menu/pages/sandbox-page.d.ts +4 -6
  109. package/dist/cli/menu/pages/sandbox-page.js +26 -118
  110. package/dist/cli/menu/pages/scopes.d.ts +1 -1
  111. package/dist/cli/menu/pages/sessions-page.d.ts +5 -11
  112. package/dist/cli/menu/pages/sessions-page.js +19 -88
  113. package/dist/cli/menu/pages/settings-page.d.ts +2 -10
  114. package/dist/cli/menu/pages/settings-page.js +64 -94
  115. package/dist/cli/menu/render-view.d.ts +28 -0
  116. package/dist/cli/menu/render-view.js +112 -0
  117. package/dist/cli/menu/settings/{path-kind.d.ts → ask-path.d.ts} +1 -7
  118. package/dist/cli/menu/settings/ask-path.js +14 -0
  119. package/dist/cli/menu/settings/collections/collection-editor.d.ts +1 -1
  120. package/dist/cli/menu/settings/collections/string-list-editor.d.ts +1 -2
  121. package/dist/cli/menu/settings/collections/string-list-editor.js +1 -1
  122. package/dist/cli/menu/settings/draft.d.ts +1 -1
  123. package/dist/cli/menu/settings/format.d.ts +1 -3
  124. package/dist/cli/menu/settings/format.js +6 -36
  125. package/dist/cli/menu/settings/index.d.ts +1 -3
  126. package/dist/cli/menu/settings/index.js +3 -3
  127. package/dist/cli/menu/settings/object-editor.d.ts +1 -1
  128. package/dist/cli/menu/settings/share.d.ts +36 -0
  129. package/dist/cli/menu/settings/share.js +131 -0
  130. package/dist/cli/menu/settings/value-editor.d.ts +5 -1
  131. package/dist/cli/menu/settings/value-editor.js +57 -54
  132. package/dist/cli/menu/several.js +1 -1
  133. package/dist/cli/menu/share-settings.d.ts +21 -0
  134. package/dist/cli/menu/share-settings.js +112 -0
  135. package/dist/cli/menu/shell.d.ts +21 -5
  136. package/dist/cli/menu/shell.js +31 -6
  137. package/dist/cli/menu/views.d.ts +7 -0
  138. package/dist/cli/menu/views.js +11 -0
  139. package/dist/cli/menu/vpn-login.js +8 -0
  140. package/dist/cli/operations/handler.d.ts +6 -0
  141. package/dist/cli/operations/handler.js +61 -0
  142. package/dist/cli/operations/index.d.ts +4 -0
  143. package/dist/cli/operations/index.js +5 -0
  144. package/dist/cli/operations/input.d.ts +6 -0
  145. package/dist/cli/operations/input.js +37 -0
  146. package/dist/cli/operations/io-cli.d.ts +7 -0
  147. package/dist/cli/operations/io-cli.js +62 -0
  148. package/dist/cli/operations/spec.d.ts +18 -0
  149. package/dist/cli/operations/spec.js +108 -0
  150. package/dist/cli/output/colors.d.ts +2 -2
  151. package/dist/cli/output/colors.js +2 -11
  152. package/dist/cli/output/index.d.ts +1 -0
  153. package/dist/cli/output/index.js +1 -0
  154. package/dist/cli/output/print.d.ts +3 -1
  155. package/dist/cli/output/print.js +7 -3
  156. package/dist/cli/output/progress.d.ts +15 -0
  157. package/dist/cli/output/progress.js +44 -0
  158. package/dist/cli/output/render-view.d.ts +4 -0
  159. package/dist/cli/output/render-view.js +63 -0
  160. package/dist/cli/services/agent-commands-service.d.ts +2 -0
  161. package/dist/cli/services/agent-commands-service.js +11 -2
  162. package/dist/cli/services/logs-service.js +4 -3
  163. package/dist/cli/tui/app.d.ts +6 -1
  164. package/dist/cli/tui/app.js +26 -4
  165. package/dist/cli/tui/list/list-screen.d.ts +14 -0
  166. package/dist/cli/tui/list/list-screen.js +64 -36
  167. package/dist/cli/tui/list/list-types.d.ts +2 -0
  168. package/dist/cli/tui/terminal.d.ts +7 -0
  169. package/dist/cli/tui/terminal.js +30 -10
  170. package/dist/core/config/defaults.js +8 -0
  171. package/dist/core/schema/config.d.ts +13 -0
  172. package/dist/core/schema/config.js +16 -1
  173. package/dist/core/schema/harness.d.ts +1 -0
  174. package/dist/core/schema/harness.js +5 -0
  175. package/dist/core/schema/sandbox.d.ts +6 -0
  176. package/dist/core/schema/sandbox.js +20 -3
  177. package/dist/core/schema/vpn.d.ts +2 -1
  178. package/dist/core/schema/vpn.js +3 -3
  179. package/dist/core/types.d.ts +23 -5
  180. package/dist/core/util/fs.d.ts +2 -0
  181. package/dist/core/util/fs.js +9 -0
  182. package/dist/core/util/index.d.ts +1 -1
  183. package/dist/core/util/index.js +1 -1
  184. package/dist/guest/agents/agent-files.d.ts +5 -0
  185. package/dist/guest/agents/agent-files.js +4 -0
  186. package/dist/guest/agents/local-state.d.ts +2 -0
  187. package/dist/guest/agents/local-state.js +21 -1
  188. package/dist/guest/boot/boot.js +2 -1
  189. package/dist/guest/daemon/daemon.js +4 -0
  190. package/dist/guest/daemon/sessions.d.ts +5 -0
  191. package/dist/guest/daemon/sessions.js +17 -3
  192. package/dist/guest/entries/daemon.js +3 -0
  193. package/dist/guest/governor/decide.d.ts +61 -0
  194. package/dist/guest/governor/decide.js +182 -0
  195. package/dist/guest/governor/governor.d.ts +42 -0
  196. package/dist/guest/governor/governor.js +214 -0
  197. package/dist/guest/governor/index.d.ts +2 -0
  198. package/dist/guest/governor/index.js +2 -0
  199. package/dist/guest/runtime/csc.d.ts +1 -0
  200. package/dist/guest/runtime/csc.js +1 -0
  201. package/dist/guest/sessions/viewer.js +3 -1
  202. package/dist/guest/toolchains/native/rust-extras.js +4 -2
  203. package/dist/guest/vpn/vpn.js +69 -21
  204. package/dist/guest/vpn/wireguard.d.ts +32 -0
  205. package/dist/guest/vpn/wireguard.js +132 -0
  206. package/dist/host/agent-commands/commands.d.ts +4 -0
  207. package/dist/host/agent-commands/commands.js +31 -7
  208. package/dist/host/audit/log.d.ts +1 -1
  209. package/dist/host/channel/attach.d.ts +3 -1
  210. package/dist/host/channel/attach.js +5 -2
  211. package/dist/host/channel/channel.d.ts +2 -0
  212. package/dist/host/channel/channel.js +4 -0
  213. package/dist/host/engines/engine.d.ts +12 -0
  214. package/dist/host/engines/engine.js +1 -0
  215. package/dist/host/engines/hcs/check.d.ts +25 -0
  216. package/dist/host/engines/hcs/check.js +95 -0
  217. package/dist/host/engines/hcs/documents.d.ts +44 -0
  218. package/dist/host/engines/hcs/documents.js +155 -0
  219. package/dist/host/engines/hcs/engine.d.ts +39 -0
  220. package/dist/host/engines/hcs/engine.js +171 -0
  221. package/dist/host/engines/hcs/helper.d.ts +43 -0
  222. package/dist/host/engines/hcs/helper.js +173 -0
  223. package/dist/host/engines/hcs/images.d.ts +37 -0
  224. package/dist/host/engines/hcs/images.js +152 -0
  225. package/dist/host/engines/index.d.ts +7 -0
  226. package/dist/host/engines/index.js +5 -0
  227. package/dist/host/engines/registry.d.ts +16 -0
  228. package/dist/host/engines/registry.js +30 -0
  229. package/dist/host/engines/types.d.ts +58 -0
  230. package/dist/host/engines/types.js +1 -0
  231. package/dist/host/engines/windows-sandbox/engine.d.ts +16 -0
  232. package/dist/host/engines/windows-sandbox/engine.js +63 -0
  233. package/dist/host/engines/windows-sandbox/wsb-text.d.ts +2 -0
  234. package/dist/host/engines/windows-sandbox/wsb-text.js +29 -0
  235. package/dist/host/launch/generate.d.ts +5 -1
  236. package/dist/host/launch/generate.js +50 -8
  237. package/dist/host/launch/index.d.ts +3 -1
  238. package/dist/host/launch/index.js +3 -1
  239. package/dist/host/launch/launch-plan.d.ts +13 -0
  240. package/dist/host/launch/launch-plan.js +26 -0
  241. package/dist/host/launch/mappings.js +2 -1
  242. package/dist/host/launch/risk-notes.d.ts +10 -0
  243. package/dist/host/launch/risk-notes.js +18 -0
  244. package/dist/host/launch/session-file.d.ts +2 -0
  245. package/dist/host/launch/session-file.js +7 -1
  246. package/dist/host/launch/wsb-file.d.ts +28 -4
  247. package/dist/host/launch/wsb-file.js +61 -42
  248. package/dist/host/life/crash-report.d.ts +27 -1
  249. package/dist/host/life/crash-report.js +173 -7
  250. package/dist/host/life/host-memory.d.ts +40 -0
  251. package/dist/host/life/host-memory.js +137 -0
  252. package/dist/host/life/index.d.ts +2 -0
  253. package/dist/host/life/index.js +2 -0
  254. package/dist/host/life/stop-events.d.ts +2 -0
  255. package/dist/host/life/stop-events.js +20 -3
  256. package/dist/host/life/stop-warning.js +1 -1
  257. package/dist/host/life/watchdog.d.ts +54 -0
  258. package/dist/host/life/watchdog.js +108 -0
  259. package/dist/host/native.d.ts +3 -2
  260. package/dist/host/native.js +22 -3
  261. package/dist/host/profile/claude-login.js +3 -2
  262. package/dist/host/sandbox/contained-deps.d.ts +2 -0
  263. package/dist/host/sandbox/contained-deps.js +17 -0
  264. package/dist/host/sandbox/index.d.ts +2 -0
  265. package/dist/host/sandbox/index.js +2 -0
  266. package/dist/host/sandbox/platform.d.ts +2 -0
  267. package/dist/host/sandbox/platform.js +7 -7
  268. package/dist/host/sandbox/tasklist.d.ts +13 -0
  269. package/dist/host/sandbox/tasklist.js +47 -0
  270. package/dist/host/secrets/launch-secrets.js +2 -1
  271. package/dist/host/sharing/current.js +2 -6
  272. package/dist/host/storage/contained/check.d.ts +9 -0
  273. package/dist/host/storage/contained/check.js +37 -0
  274. package/dist/host/storage/contained/contained-storage.d.ts +66 -0
  275. package/dist/host/storage/contained/contained-storage.js +168 -0
  276. package/dist/host/storage/contained/disk-port.d.ts +43 -0
  277. package/dist/host/storage/contained/disk-port.js +122 -0
  278. package/dist/host/storage/contained/index.d.ts +9 -0
  279. package/dist/host/storage/contained/index.js +8 -0
  280. package/dist/host/storage/contained/layout.d.ts +28 -0
  281. package/dist/host/storage/contained/layout.js +45 -0
  282. package/dist/host/storage/contained/resolve.d.ts +4 -0
  283. package/dist/host/storage/contained/resolve.js +30 -0
  284. package/dist/host/storage/contained/setting.d.ts +1 -0
  285. package/dist/host/storage/contained/setting.js +5 -0
  286. package/dist/host/storage/contained/state.d.ts +89 -0
  287. package/dist/host/storage/contained/state.js +166 -0
  288. package/dist/host/storage/contained/transfer.d.ts +24 -0
  289. package/dist/host/storage/contained/transfer.js +121 -0
  290. package/dist/host/storage/index.d.ts +2 -0
  291. package/dist/host/storage/index.js +2 -0
  292. package/dist/host/storage/providers/contained.d.ts +15 -0
  293. package/dist/host/storage/providers/contained.js +39 -0
  294. package/dist/host/storage/providers/folder.d.ts +12 -0
  295. package/dist/host/storage/providers/folder.js +20 -0
  296. package/dist/host/storage/providers/index.d.ts +4 -0
  297. package/dist/host/storage/providers/index.js +3 -0
  298. package/dist/host/storage/providers/registry.d.ts +9 -0
  299. package/dist/host/storage/providers/registry.js +14 -0
  300. package/dist/host/storage/providers/types.d.ts +33 -0
  301. package/dist/host/storage/providers/types.js +1 -0
  302. package/dist/host/tools/conpty.js +3 -2
  303. package/dist/host/tools/windows-terminal.js +8 -7
  304. package/dist/host/vpn/index.d.ts +1 -1
  305. package/dist/host/vpn/index.js +1 -1
  306. package/dist/host/vpn/prepare.d.ts +2 -0
  307. package/dist/host/vpn/prepare.js +63 -2
  308. package/dist/host/web/browser.d.ts +2 -0
  309. package/dist/host/web/browser.js +14 -1
  310. package/dist/host/web/index.d.ts +3 -2
  311. package/dist/host/web/index.js +3 -2
  312. package/dist/host/web/rpc.d.ts +24 -0
  313. package/dist/host/web/rpc.js +149 -0
  314. package/dist/host/web/runner.d.ts +2 -0
  315. package/dist/host/web/runner.js +1 -2
  316. package/dist/host/web/server.d.ts +7 -0
  317. package/dist/host/web/server.js +23 -3
  318. package/dist/runtime/agent.js +69 -8
  319. package/dist/runtime/daemon.js +1058 -624
  320. package/dist/runtime/db.js +69 -8
  321. package/dist/runtime/main.js +624 -182
  322. package/dist/runtime/netproxy.js +69 -8
  323. package/dist/runtime/view.js +87 -13
  324. package/dist/selftest/agent-paths.test.js +11 -1
  325. package/dist/selftest/app.test.d.ts +2 -0
  326. package/dist/selftest/app.test.js +324 -0
  327. package/dist/selftest/channel.test.js +13 -0
  328. package/dist/selftest/cli.test.js +2 -1
  329. package/dist/selftest/config.test.js +59 -0
  330. package/dist/selftest/contained.test.d.ts +2 -0
  331. package/dist/selftest/contained.test.js +544 -0
  332. package/dist/selftest/credentials.test.js +1 -1
  333. package/dist/selftest/engine.test.d.ts +2 -0
  334. package/dist/selftest/engine.test.js +127 -0
  335. package/dist/selftest/hcs.test.d.ts +2 -0
  336. package/dist/selftest/hcs.test.js +482 -0
  337. package/dist/selftest/heavy-load.test.d.ts +2 -0
  338. package/dist/selftest/heavy-load.test.js +329 -0
  339. package/dist/selftest/index.js +12 -0
  340. package/dist/selftest/layout.test.js +12 -0
  341. package/dist/selftest/menu-perf.test.d.ts +2 -0
  342. package/dist/selftest/menu-perf.test.js +248 -0
  343. package/dist/selftest/menu-screens.js +4 -2
  344. package/dist/selftest/menu.test.js +36 -8
  345. package/dist/selftest/support/engine-cases.d.ts +8 -0
  346. package/dist/selftest/support/engine-cases.js +65 -0
  347. package/dist/selftest/support/engine-golden.d.ts +3 -0
  348. package/dist/selftest/support/engine-golden.js +66 -0
  349. package/dist/selftest/support/fixtures.d.ts +7 -1
  350. package/dist/selftest/support/hcs-probes.d.ts +17 -0
  351. package/dist/selftest/support/hcs-probes.js +41 -0
  352. package/dist/selftest/vpn.test.js +136 -3
  353. package/dist/selftest/web.test.js +101 -3
  354. package/dist/shared/channel/run-dir.d.ts +4 -1
  355. package/dist/shared/channel/run-dir.js +7 -1
  356. package/dist/shared/channel/schema.d.ts +35 -1
  357. package/dist/shared/channel/schema.js +27 -0
  358. package/dist/shared/channel/secrets.d.ts +1 -0
  359. package/dist/shared/channel/secrets.js +6 -0
  360. package/dist/shared/memory/index.d.ts +1 -0
  361. package/dist/shared/memory/index.js +1 -0
  362. package/dist/shared/memory/policy.d.ts +33 -0
  363. package/dist/shared/memory/policy.js +55 -0
  364. package/dist/shared/pty/output-filter.d.ts +14 -1
  365. package/dist/shared/pty/output-filter.js +22 -4
  366. package/dist/shared/pty/terminal.d.ts +4 -1
  367. package/dist/shared/pty/terminal.js +4 -2
  368. package/dist/shared/system.d.ts +1 -0
  369. package/dist/shared/system.js +1 -0
  370. package/dist/shared/vpn/download.d.ts +16 -0
  371. package/dist/shared/vpn/download.js +16 -0
  372. package/dist/shared/vpn/wireguard.d.ts +51 -0
  373. package/dist/shared/vpn/wireguard.js +227 -0
  374. package/dist/sync/sync-cycle.js +5 -5
  375. package/dist/sync/watcher.d.ts +13 -0
  376. package/dist/sync/watcher.js +92 -3
  377. package/dist/web/index.html +4 -3
  378. package/dist/web/main-NRRS5O6Z.js +157 -0
  379. package/dist/web/main-T5DMCHYV.css +1 -0
  380. package/native/csharp/HcsHost/AssemblyInfo.cs +14 -0
  381. package/native/csharp/HcsHost/Guard.cs +100 -0
  382. package/native/csharp/HcsHost/Hcs.cs +256 -0
  383. package/native/csharp/HcsHost/Json.cs +78 -0
  384. package/native/csharp/HcsHost/Program.cs +185 -0
  385. package/native/csharp/HcsHost/VirtualDisk.cs +95 -0
  386. package/native/csharp/HostTools/AssemblyInfo.cs +14 -0
  387. package/native/csharp/HostTools/MemoryStatus.cs +107 -0
  388. package/native/csharp/HostTools/Program.cs +58 -17
  389. package/native/scripts/check-contained.ps1 +28 -0
  390. package/native/scripts/contained-common.ps1 +241 -0
  391. package/native/scripts/dismount-contained.ps1 +66 -0
  392. package/native/scripts/memory-status.ps1 +34 -0
  393. package/native/scripts/mount-contained.ps1 +139 -0
  394. package/native/scripts/run-elevated.ps1 +17 -4
  395. package/native/scripts/stop-events.ps1 +23 -8
  396. package/package.json +9 -2
  397. package/sandbox/csharp/MemGov.cs +398 -0
  398. package/sandbox/csharp/PtyHost.cs +111 -5
  399. package/schemas/config.schema.json +60 -6
  400. package/schemas/sandbox-config.schema.json +3 -3
  401. package/dist/cli/commands/sessions/control.d.ts +0 -4
  402. package/dist/cli/commands/sessions/control.js +0 -66
  403. package/dist/cli/commands/sessions/list.d.ts +0 -2
  404. package/dist/cli/commands/sessions/list.js +0 -48
  405. package/dist/cli/commands/sessions/status.d.ts +0 -4
  406. package/dist/cli/commands/sessions/status.js +0 -114
  407. package/dist/cli/commands/sessions/window.d.ts +0 -3
  408. package/dist/cli/commands/sessions/window.js +0 -18
  409. package/dist/cli/menu/settings/path-kind.js +0 -44
  410. package/dist/web/main-CXESL347.js +0 -45
  411. package/dist/web/main-VLR7DVQ4.css +0 -1
  412. /package/dist/{cli/menu/settings → app/kernel}/schema-node.d.ts +0 -0
  413. /package/dist/{cli/menu/settings → app/kernel}/schema-node.js +0 -0
@@ -0,0 +1,156 @@
1
+ import { z } from 'zod';
2
+ import { type OperationIO } from './io.js';
3
+ /** One call or subscription on the socket (chosen by the browser, unique while it runs). */
4
+ export declare const RpcIdSchema: z.ZodString;
5
+ /** A definition's id (sessions.restart). */
6
+ export declare const DefinitionIdSchema: z.ZodString;
7
+ export declare const CallMessageSchema: z.ZodObject<{
8
+ t: z.ZodLiteral<"call">;
9
+ id: z.ZodString;
10
+ op: z.ZodString;
11
+ input: z.ZodUnknown;
12
+ }, z.core.$strict>;
13
+ export declare const AnswerMessageSchema: z.ZodObject<{
14
+ t: z.ZodLiteral<"answer">;
15
+ id: z.ZodString;
16
+ value: z.ZodUnknown;
17
+ }, z.core.$strict>;
18
+ export declare const SubscribeMessageSchema: z.ZodObject<{
19
+ t: z.ZodLiteral<"subscribe">;
20
+ id: z.ZodString;
21
+ query: z.ZodString;
22
+ input: z.ZodUnknown;
23
+ }, z.core.$strict>;
24
+ export declare const UnsubscribeMessageSchema: z.ZodObject<{
25
+ t: z.ZodLiteral<"unsubscribe">;
26
+ id: z.ZodString;
27
+ }, z.core.$strict>;
28
+ /** Browser -> server. */
29
+ export declare const ClientMessageSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
30
+ t: z.ZodLiteral<"call">;
31
+ id: z.ZodString;
32
+ op: z.ZodString;
33
+ input: z.ZodUnknown;
34
+ }, z.core.$strict>, z.ZodObject<{
35
+ t: z.ZodLiteral<"answer">;
36
+ id: z.ZodString;
37
+ value: z.ZodUnknown;
38
+ }, z.core.$strict>, z.ZodObject<{
39
+ t: z.ZodLiteral<"subscribe">;
40
+ id: z.ZodString;
41
+ query: z.ZodString;
42
+ input: z.ZodUnknown;
43
+ }, z.core.$strict>, z.ZodObject<{
44
+ t: z.ZodLiteral<"unsubscribe">;
45
+ id: z.ZodString;
46
+ }, z.core.$strict>], "t">;
47
+ export type ClientMessage = z.output<typeof ClientMessageSchema>;
48
+ /** Server -> browser. */
49
+ export declare const ServerMessageSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
50
+ t: z.ZodLiteral<"progress">;
51
+ id: z.ZodString;
52
+ text: z.ZodString;
53
+ }, z.core.$strict>, z.ZodObject<{
54
+ t: z.ZodLiteral<"log">;
55
+ id: z.ZodString;
56
+ text: z.ZodString;
57
+ tone: z.ZodOptional<z.ZodEnum<{
58
+ ok: "ok";
59
+ muted: "muted";
60
+ warn: "warn";
61
+ danger: "danger";
62
+ accent: "accent";
63
+ }>>;
64
+ }, z.core.$strict>, z.ZodObject<{
65
+ t: z.ZodLiteral<"ask">;
66
+ id: z.ZodString;
67
+ question: z.ZodDiscriminatedUnion<[z.ZodObject<{
68
+ kind: z.ZodLiteral<"confirm">;
69
+ title: z.ZodString;
70
+ lines: z.ZodOptional<z.ZodArray<z.ZodString>>;
71
+ yes: z.ZodOptional<z.ZodString>;
72
+ danger: z.ZodOptional<z.ZodBoolean>;
73
+ typed: z.ZodOptional<z.ZodString>;
74
+ implied: z.ZodOptional<z.ZodBoolean>;
75
+ noTerminal: z.ZodOptional<z.ZodObject<{
76
+ message: z.ZodString;
77
+ fix: z.ZodString;
78
+ }, z.core.$strict>>;
79
+ }, z.core.$strict>, z.ZodObject<{
80
+ kind: z.ZodLiteral<"choose">;
81
+ title: z.ZodString;
82
+ lines: z.ZodOptional<z.ZodArray<z.ZodString>>;
83
+ choices: z.ZodArray<z.ZodObject<{
84
+ value: z.ZodString;
85
+ label: z.ZodString;
86
+ description: z.ZodOptional<z.ZodString>;
87
+ }, z.core.$strict>>;
88
+ initial: z.ZodOptional<z.ZodString>;
89
+ }, z.core.$strict>, z.ZodObject<{
90
+ kind: z.ZodLiteral<"text">;
91
+ title: z.ZodString;
92
+ lines: z.ZodOptional<z.ZodArray<z.ZodString>>;
93
+ initial: z.ZodOptional<z.ZodString>;
94
+ allowEmpty: z.ZodOptional<z.ZodBoolean>;
95
+ problem: z.ZodOptional<z.ZodString>;
96
+ }, z.core.$strict>, z.ZodObject<{
97
+ kind: z.ZodLiteral<"secret">;
98
+ title: z.ZodString;
99
+ lines: z.ZodOptional<z.ZodArray<z.ZodString>>;
100
+ problem: z.ZodOptional<z.ZodString>;
101
+ }, z.core.$strict>, z.ZodObject<{
102
+ kind: z.ZodLiteral<"path">;
103
+ title: z.ZodString;
104
+ lines: z.ZodOptional<z.ZodArray<z.ZodString>>;
105
+ pathKind: z.ZodEnum<{
106
+ file: "file";
107
+ dir: "dir";
108
+ }>;
109
+ initial: z.ZodOptional<z.ZodString>;
110
+ literals: z.ZodOptional<z.ZodArray<z.ZodString>>;
111
+ problem: z.ZodOptional<z.ZodString>;
112
+ }, z.core.$strict>, z.ZodObject<{
113
+ kind: z.ZodLiteral<"checklist">;
114
+ title: z.ZodString;
115
+ lines: z.ZodOptional<z.ZodArray<z.ZodString>>;
116
+ choices: z.ZodArray<z.ZodObject<{
117
+ value: z.ZodString;
118
+ label: z.ZodString;
119
+ description: z.ZodOptional<z.ZodString>;
120
+ }, z.core.$strict>>;
121
+ checked: z.ZodOptional<z.ZodArray<z.ZodString>>;
122
+ }, z.core.$strict>], "kind">;
123
+ }, z.core.$strict>, z.ZodObject<{
124
+ t: z.ZodLiteral<"result">;
125
+ id: z.ZodString;
126
+ output: z.ZodUnknown;
127
+ }, z.core.$strict>, z.ZodObject<{
128
+ t: z.ZodLiteral<"error">;
129
+ id: z.ZodString;
130
+ error: z.ZodObject<{
131
+ kind: z.ZodEnum<{
132
+ user: "user";
133
+ cancelled: "cancelled";
134
+ invalid: "invalid";
135
+ bug: "bug";
136
+ }>;
137
+ message: z.ZodString;
138
+ fix: z.ZodOptional<z.ZodString>;
139
+ }, z.core.$strict>;
140
+ }, z.core.$strict>, z.ZodObject<{
141
+ t: z.ZodLiteral<"data">;
142
+ id: z.ZodString;
143
+ output: z.ZodUnknown;
144
+ }, z.core.$strict>], "t">;
145
+ export type ServerMessage = z.output<typeof ServerMessageSchema>;
146
+ /** Most calls and subscriptions one socket may have open at once. */
147
+ export declare const MAX_OPEN_PER_SOCKET = 32;
148
+ /** What the RPC endpoint needs from the program: the definitions allowed on the web, and a way to run them. */
149
+ export interface RpcHost {
150
+ /** 'operation' or 'query' when the id is registered and allowed on the web, else undefined. */
151
+ kind(id: string): 'operation' | 'query' | undefined;
152
+ /** How often a query is read again while subscribed (undefined: once). */
153
+ liveMs(id: string): number | undefined;
154
+ /** Runs an allowed definition (input and output checked). */
155
+ run(id: string, input: unknown, io: OperationIO): Promise<unknown>;
156
+ }
@@ -0,0 +1,47 @@
1
+ // The messages of the web UI's RPC socket (/api/rpc), shared by the server and the browser. The browser calls
2
+ // operations and queries by id, answers questions, and subscribes to live queries; the server streams progress, log
3
+ // lines and questions, then a result or an error. A subscription gets `data` whenever the result changes (an `error`
4
+ // does not end it; `unsubscribe` does). The server checks every message against these schemas.
5
+ import { z } from 'zod';
6
+ import { WireErrorSchema } from './errors.js';
7
+ import { QuestionSchema } from './io.js';
8
+ /** One call or subscription on the socket (chosen by the browser, unique while it runs). */
9
+ export const RpcIdSchema = z.string().regex(/^[A-Za-z0-9_-]{1,64}$/);
10
+ /** A definition's id (sessions.restart). */
11
+ export const DefinitionIdSchema = z
12
+ .string()
13
+ .regex(/^[a-z][A-Za-z0-9]*(\.[a-z][A-Za-z0-9]*)+$/)
14
+ .max(80);
15
+ const ToneSchema = z.enum(['ok', 'warn', 'danger', 'muted', 'accent']);
16
+ export const CallMessageSchema = z.strictObject({
17
+ t: z.literal('call'),
18
+ id: RpcIdSchema,
19
+ op: DefinitionIdSchema,
20
+ input: z.unknown(),
21
+ });
22
+ export const AnswerMessageSchema = z.strictObject({ t: z.literal('answer'), id: RpcIdSchema, value: z.unknown() });
23
+ export const SubscribeMessageSchema = z.strictObject({
24
+ t: z.literal('subscribe'),
25
+ id: RpcIdSchema,
26
+ query: DefinitionIdSchema,
27
+ input: z.unknown(),
28
+ });
29
+ export const UnsubscribeMessageSchema = z.strictObject({ t: z.literal('unsubscribe'), id: RpcIdSchema });
30
+ /** Browser -> server. */
31
+ export const ClientMessageSchema = z.discriminatedUnion('t', [
32
+ CallMessageSchema,
33
+ AnswerMessageSchema,
34
+ SubscribeMessageSchema,
35
+ UnsubscribeMessageSchema,
36
+ ]);
37
+ /** Server -> browser. */
38
+ export const ServerMessageSchema = z.discriminatedUnion('t', [
39
+ z.strictObject({ t: z.literal('progress'), id: RpcIdSchema, text: z.string() }),
40
+ z.strictObject({ t: z.literal('log'), id: RpcIdSchema, text: z.string(), tone: ToneSchema.optional() }),
41
+ z.strictObject({ t: z.literal('ask'), id: RpcIdSchema, question: QuestionSchema }),
42
+ z.strictObject({ t: z.literal('result'), id: RpcIdSchema, output: z.unknown() }),
43
+ z.strictObject({ t: z.literal('error'), id: RpcIdSchema, error: WireErrorSchema }),
44
+ z.strictObject({ t: z.literal('data'), id: RpcIdSchema, output: z.unknown() }),
45
+ ]);
46
+ /** Most calls and subscriptions one socket may have open at once. */
47
+ export const MAX_OPEN_PER_SOCKET = 32;
@@ -0,0 +1,6 @@
1
+ /** "just now", "5 min ago", "3 h ago", "2 d ago". */
2
+ export declare function ago(then: number | string | Date, now?: number): string;
3
+ /** "1 session", "2 sessions". */
4
+ export declare function plural(n: number, noun: string, many?: string): string;
5
+ /** "memoryMb" -> "Memory MB", "vGpu" -> "V GPU": a readable label from a setting's key. */
6
+ export declare function humanize(key: string): string;
@@ -0,0 +1,57 @@
1
+ // Small text helpers every surface formats with the same way: times as "5 min ago", keys as readable labels, counts
2
+ // with the right noun. Pure (the browser bundle imports them too).
3
+ /** "just now", "5 min ago", "3 h ago", "2 d ago". */
4
+ export function ago(then, now = Date.now()) {
5
+ const secs = Math.max(0, Math.round((now - new Date(then).getTime()) / 1000));
6
+ if (Number.isNaN(secs))
7
+ return '';
8
+ if (secs < 45)
9
+ return 'just now';
10
+ if (secs < 3600)
11
+ return Math.round(secs / 60) + ' min ago';
12
+ if (secs < 86400)
13
+ return Math.round(secs / 3600) + ' h ago';
14
+ return Math.round(secs / 86400) + ' d ago';
15
+ }
16
+ /** "1 session", "2 sessions". */
17
+ export function plural(n, noun, many = noun + 's') {
18
+ return n + ' ' + (n === 1 ? noun : many);
19
+ }
20
+ /** Words written in capitals wherever they appear in a key. */
21
+ const UPPER = new Set([
22
+ 'mb',
23
+ 'gb',
24
+ 'cpu',
25
+ 'gpu',
26
+ 'jdk',
27
+ 'sdk',
28
+ 'id',
29
+ 'url',
30
+ 'ui',
31
+ 'npm',
32
+ 'msvc',
33
+ 'uv',
34
+ 'api',
35
+ 'ssh',
36
+ 'vm',
37
+ 'io',
38
+ ]);
39
+ /** "harness" is the code's word for an agent; screens say agent. */
40
+ const PLAIN = { harness: 'agent', harnesses: 'agents' };
41
+ /** "memoryMb" -> "Memory MB", "vGpu" -> "V GPU": a readable label from a setting's key. */
42
+ export function humanize(key) {
43
+ const words = key
44
+ .replace(/([a-z0-9])([A-Z])/g, '$1 $2')
45
+ .replace(/[_-]+/g, ' ')
46
+ .split(' ')
47
+ .filter(Boolean)
48
+ .map((w) => PLAIN[w.toLowerCase()] ?? w);
49
+ return words
50
+ .map((w, i) => {
51
+ const lower = w.toLowerCase();
52
+ if (UPPER.has(lower))
53
+ return w.toUpperCase();
54
+ return i === 0 ? w[0].toUpperCase() + w.slice(1) : lower;
55
+ })
56
+ .join(' ');
57
+ }
@@ -0,0 +1,146 @@
1
+ import type { z } from 'zod';
2
+ import type { OperationDef } from './define.js';
3
+ import type { Field } from './fields.js';
4
+ /** The one palette: the TUI theme and the web colours both map these. */
5
+ export type Tone = 'ok' | 'warn' | 'danger' | 'muted' | 'accent';
6
+ /** A short label the web shows as a pill next to an item ("running"); the menu and the CLI show the hint. */
7
+ export interface Badge {
8
+ readonly text: string;
9
+ readonly tone?: Tone;
10
+ }
11
+ /** Where a link goes. Each surface maps a target to what it can do (attach / terminal page / a command to type). */
12
+ export type Target =
13
+ /** A running session's terminal: the menu attaches, the web opens its terminal page. */
14
+ {
15
+ readonly kind: 'terminal';
16
+ readonly session: string;
17
+ }
18
+ /** Start an agent: the menu runs `launch`, the web opens its new-session dialog. */
19
+ | {
20
+ readonly kind: 'start-agent';
21
+ readonly agent: string;
22
+ }
23
+ /** A command line of an area that is not a feature yet: the menu runs it, the web does not offer it. */
24
+ | {
25
+ readonly kind: 'command';
26
+ readonly argv: readonly string[];
27
+ }
28
+ /** Another view. */
29
+ | {
30
+ readonly kind: 'view';
31
+ readonly view: string;
32
+ };
33
+ interface ActionBase {
34
+ /** The words on a button or a row ("Stop the sandbox…"). */
35
+ readonly label: string;
36
+ /** One word for a key bar or an Enter hint ("stop"). */
37
+ readonly verb?: string;
38
+ /** The menu key that does it (one letter). */
39
+ readonly key?: string;
40
+ /** How long it survives in a narrow key bar: 0 never goes, bigger goes earlier (menu). */
41
+ readonly importance?: number;
42
+ readonly description?: string;
43
+ }
44
+ /** Runs an operation with this input (plus the answers to `fields`, asked first). */
45
+ export interface OperationAction extends ActionBase {
46
+ readonly kind: 'operation';
47
+ readonly op: string;
48
+ readonly input: Readonly<Record<string, unknown>>;
49
+ /** Asks for a confirmation before running (from the operation's `danger`). */
50
+ readonly danger?: boolean;
51
+ /** Values to ask for before running; each answer goes into the input under the field's name. */
52
+ readonly fields?: readonly Field[];
53
+ /** What `fields` start as (the current value of a setting), by field name. */
54
+ readonly initial?: Readonly<Record<string, unknown>>;
55
+ }
56
+ export interface LinkAction extends ActionBase {
57
+ readonly kind: 'link';
58
+ readonly target: Target;
59
+ }
60
+ export type Action = OperationAction | LinkAction;
61
+ /** One label: value line (a status fact, a setting). */
62
+ export interface Fact {
63
+ readonly id: string;
64
+ readonly label: string;
65
+ readonly value: string;
66
+ readonly tone?: Tone;
67
+ readonly description?: string;
68
+ readonly details?: readonly string[];
69
+ }
70
+ /** A column of a section shown as a table (CLI table, web table); items fill it through `cells`. */
71
+ export interface Column {
72
+ readonly key: string;
73
+ readonly label: string;
74
+ }
75
+ /** One entry of a list. */
76
+ export interface Item {
77
+ readonly id: string;
78
+ readonly label: string;
79
+ /** The right-hand text (a state, a value). */
80
+ readonly hint?: string;
81
+ readonly tone?: Tone;
82
+ readonly badges?: readonly Badge[];
83
+ readonly description?: string;
84
+ /** Extra lines (the menu's details pane, the CLI's indented lines, the web's card body). */
85
+ readonly details?: readonly string[];
86
+ /** A heading inside the section ("This folder's project"). */
87
+ readonly group?: string;
88
+ /** Marked as "the one this is about" (the project of this folder): `*` in the CLI. */
89
+ readonly marked?: boolean;
90
+ /** The values for the section's columns. */
91
+ readonly cells?: Readonly<Record<string, string>>;
92
+ /** What Enter / a click does. */
93
+ readonly primary?: Action;
94
+ readonly actions?: readonly Action[];
95
+ /** Why it cannot be used now. */
96
+ readonly disabled?: string;
97
+ /** More words a search finds it by. */
98
+ readonly keywords?: string;
99
+ }
100
+ /** A line under a section; `only` limits it to one surface (a CLI flag hint). */
101
+ export interface Note {
102
+ readonly text: string;
103
+ readonly tone?: Tone;
104
+ readonly only?: 'cli' | 'menu' | 'web';
105
+ }
106
+ export interface Section {
107
+ readonly id: string;
108
+ readonly title?: string;
109
+ /** A short line next to the title ("2 folders guarded"). */
110
+ readonly summary?: string;
111
+ readonly description?: string;
112
+ readonly facts?: readonly Fact[];
113
+ readonly items?: readonly Item[];
114
+ /** Show the items as a table with these columns where a surface can (CLI, web). */
115
+ readonly columns?: readonly Column[];
116
+ /** Where `columns` is used: everywhere (default), or only on the command line (the web lists the items in full). */
117
+ readonly columnsOn?: 'all' | 'cli';
118
+ readonly actions?: readonly Action[];
119
+ readonly notes?: readonly Note[];
120
+ }
121
+ /** What a page shows when it has nothing: the text and the next step (the CLI prints `cliText`, naming a command). */
122
+ export interface Empty {
123
+ readonly title?: string;
124
+ readonly text: string;
125
+ readonly action?: Action;
126
+ readonly cliText?: string;
127
+ }
128
+ export interface Page {
129
+ readonly title: string;
130
+ /** One line above everything (whose sandbox this is). */
131
+ readonly notice?: Note;
132
+ readonly sections: readonly Section[];
133
+ /** Actions for the whole page (refresh-like, start). */
134
+ readonly actions?: readonly Action[];
135
+ /** Shown instead of the sections when they have no facts and no items. */
136
+ readonly empty?: Empty;
137
+ }
138
+ /** An action that runs `def` with `input` (typed from its input schema; `fields` may ask for the rest). */
139
+ export declare function action<I extends z.ZodType, O extends z.ZodType>(def: OperationDef<I, O>, input: Partial<z.input<I>>, extra?: Partial<Omit<OperationAction, 'kind' | 'op' | 'input'>>): OperationAction;
140
+ /** An action that goes somewhere. */
141
+ export declare function link(target: Target, label: string, extra?: Partial<Omit<LinkAction, 'kind' | 'target'>>): LinkAction;
142
+ /** Does the page show anything besides its empty state? */
143
+ export declare function pageHasContent(page: Page): boolean;
144
+ /** Every action a page offers, wherever it sits (for parity checks and key bars). */
145
+ export declare function pageActions(page: Page): Action[];
146
+ export {};
@@ -0,0 +1,28 @@
1
+ /** An action that runs `def` with `input` (typed from its input schema; `fields` may ask for the rest). */
2
+ export function action(def, input, extra = {}) {
3
+ return {
4
+ kind: 'operation',
5
+ op: def.id,
6
+ input: input,
7
+ label: def.title,
8
+ ...(def.danger ? { danger: true } : {}),
9
+ ...extra,
10
+ };
11
+ }
12
+ /** An action that goes somewhere. */
13
+ export function link(target, label, extra = {}) {
14
+ return { kind: 'link', target, label, ...extra };
15
+ }
16
+ /** Does the page show anything besides its empty state? */
17
+ export function pageHasContent(page) {
18
+ return page.sections.some((s) => (s.facts?.length ?? 0) > 0 || (s.items?.length ?? 0) > 0);
19
+ }
20
+ /** Every action a page offers, wherever it sits (for parity checks and key bars). */
21
+ export function pageActions(page) {
22
+ const fromItem = (i) => [...(i.primary ? [i.primary] : []), ...(i.actions ?? [])];
23
+ return [
24
+ ...(page.actions ?? []),
25
+ ...(page.empty?.action ? [page.empty.action] : []),
26
+ ...page.sections.flatMap((s) => [...(s.actions ?? []), ...(s.items ?? []).flatMap(fromItem)]),
27
+ ];
28
+ }
@@ -0,0 +1,10 @@
1
+ import type { AppContext } from './context.js';
2
+ import { type AnyDefinition, type Implementation, type OperationIO, type OutputOf, type QueryDef, type RpcHost } from './kernel/index.js';
3
+ export declare const IMPLEMENTATIONS: readonly Implementation<AnyDefinition, AppContext>[];
4
+ export declare function implementationOf(id: string): Implementation<AnyDefinition, AppContext> | undefined;
5
+ /** Runs a definition by id: input checked before, output checked after. */
6
+ export declare function runDefinition(id: string, ctx: AppContext, input: unknown, io: OperationIO): Promise<unknown>;
7
+ /** Reads a query in-process (the menu): typed output, and no questions. */
8
+ export declare function readQuery<D extends QueryDef>(def: D, ctx: AppContext, input?: unknown): Promise<OutputOf<D>>;
9
+ /** What the web server may run: the registered definitions whose surfaces include the web. */
10
+ export declare function createRpcHost(ctx: AppContext): RpcHost;
@@ -0,0 +1,50 @@
1
+ import { invoke, NO_QUESTIONS, onSurface, } from './kernel/index.js';
2
+ import { hideWindowRun, sandboxStatusRun, showWindowRun, stopSandboxRun } from './features/sandbox/index.js';
3
+ import { listSessionsRun, restartSessionsRun } from './features/sessions/index.js';
4
+ import { getSettingRun, listSettingsRun, resetSettingRun, setSettingRun } from './features/settings/index.js';
5
+ export const IMPLEMENTATIONS = [
6
+ sandboxStatusRun,
7
+ showWindowRun,
8
+ hideWindowRun,
9
+ stopSandboxRun,
10
+ listSessionsRun,
11
+ restartSessionsRun,
12
+ listSettingsRun,
13
+ getSettingRun,
14
+ setSettingRun,
15
+ resetSettingRun,
16
+ ];
17
+ export function implementationOf(id) {
18
+ return IMPLEMENTATIONS.find((i) => i.def.id === id);
19
+ }
20
+ /** Runs a definition by id: input checked before, output checked after. */
21
+ export function runDefinition(id, ctx, input, io) {
22
+ const impl = implementationOf(id);
23
+ if (!impl)
24
+ throw new Error('No implementation for ' + id);
25
+ return invoke(impl, ctx, input, io);
26
+ }
27
+ /** Reads a query in-process (the menu): typed output, and no questions. */
28
+ export async function readQuery(def, ctx, input = {}) {
29
+ return (await runDefinition(def.id, ctx, input, NO_QUESTIONS));
30
+ }
31
+ /** What the web server may run: the registered definitions whose surfaces include the web. */
32
+ export function createRpcHost(ctx) {
33
+ const allowed = (id) => {
34
+ const impl = implementationOf(id);
35
+ return impl && onSurface(impl.def, 'web') ? impl : undefined;
36
+ };
37
+ return {
38
+ kind: (id) => allowed(id)?.def.kind,
39
+ liveMs: (id) => {
40
+ const def = allowed(id)?.def;
41
+ return def?.kind === 'query' ? def.live?.everyMs : undefined;
42
+ },
43
+ run: (id, input, io) => {
44
+ const impl = allowed(id);
45
+ if (!impl)
46
+ throw new Error('Not allowed on the web: ' + id);
47
+ return invoke(impl, ctx, input, io);
48
+ },
49
+ };
50
+ }
@@ -3,6 +3,8 @@ export interface CliOptions {
3
3
  command: string;
4
4
  positionals: string[];
5
5
  passthrough: string[];
6
+ /** The options as commander parsed them, by attribute name (operation commands build their input from these). */
7
+ raw: Readonly<Record<string, unknown>>;
6
8
  config?: string;
7
9
  workspace?: string;
8
10
  harness?: string;
@@ -25,12 +27,15 @@ export interface CliOptions {
25
27
  accountTo?: string;
26
28
  noRestart: boolean;
27
29
  follow: boolean;
30
+ crash: boolean;
28
31
  json: boolean;
29
32
  yes: boolean;
30
33
  /** sessions --wide: also the folder column. */
31
34
  wide: boolean;
32
35
  /** storage move: keep the old folder (copy instead of rename). */
33
36
  keepOld: boolean;
37
+ /** config export: keep folders and files of this PC in the file. */
38
+ withPaths: boolean;
34
39
  timeout: number;
35
40
  days: number;
36
41
  /** restart: every session, not only this folder's project's. */
package/dist/cli/args.js CHANGED
@@ -186,6 +186,7 @@ export function parseCli(argv, wrapper = false) {
186
186
  command: name === 'start' ? 'launch' : name,
187
187
  positionals: forAgent || name === 'exec' ? [] : operands,
188
188
  passthrough: forAgent || name === 'exec' ? operands : [],
189
+ raw: o,
189
190
  config: o.config,
190
191
  workspace: o.workspace,
191
192
  harness: o.harness ?? (name !== 'account' && typeof o.agent === 'string' ? o.agent : undefined),
@@ -209,10 +210,12 @@ export function parseCli(argv, wrapper = false) {
209
210
  accountTo: name === 'account' && typeof o.to === 'string' ? o.to : undefined,
210
211
  noRestart: o.restart === false,
211
212
  follow: Boolean(o.follow),
213
+ crash: Boolean(o.crash),
212
214
  json: Boolean(o.json),
213
215
  yes: Boolean(o.yes),
214
216
  wide: Boolean(o.wide),
215
217
  keepOld: Boolean(o.keepOld),
218
+ withPaths: Boolean(o.withPaths),
216
219
  all: Boolean(o.all),
217
220
  sessions: (o.session ?? []).map((s) => parseSessionWant(s)),
218
221
  timeout: o.timeout ?? 600,
@@ -243,6 +246,7 @@ function defaults() {
243
246
  command: '',
244
247
  positionals: [],
245
248
  passthrough: [],
249
+ raw: {},
246
250
  scripts: [],
247
251
  databases: [],
248
252
  terminal: false,
@@ -254,6 +258,7 @@ function defaults() {
254
258
  fromHost: false,
255
259
  noRestart: false,
256
260
  follow: false,
261
+ crash: false,
257
262
  dryRun: false,
258
263
  fix: false,
259
264
  auto: false,
@@ -264,6 +269,7 @@ function defaults() {
264
269
  yes: false,
265
270
  wide: false,
266
271
  keepOld: false,
272
+ withPaths: false,
267
273
  all: false,
268
274
  sessions: [],
269
275
  timeout: 600,
@@ -0,0 +1,2 @@
1
+ import type { Context } from './context.js';
2
+ export declare function engine(ctx: Context): Promise<number>;
@@ -0,0 +1,60 @@
1
+ // `sandbox engine`: the engine in use and, for each engine, what it can do and whether this PC can run it.
2
+ import { fail } from '../../core/util/index.js';
3
+ import { engineReports } from '../../host/engines/index.js';
4
+ import { c, printJson, table } from '../output/index.js';
5
+ const CAPABILITY_NAMES = {
6
+ desktop: 'desktop window',
7
+ gpu: 'GPU',
8
+ clipboard: 'clipboard',
9
+ audio: 'audio',
10
+ video: 'camera',
11
+ printers: 'printers',
12
+ liveFolderAdd: 'add folders while running',
13
+ attachedDisks: 'attached disks',
14
+ multipleInstances: 'several at once',
15
+ hvsocket: 'Hyper-V sockets',
16
+ };
17
+ /** sandbox engine check <engine>: the reasons and the exact commands, in plain words. Nothing is run or changed. */
18
+ async function checkEngine(ctx, name) {
19
+ const report = (await engineReports(ctx.loaded.config)).find((r) => r.id === name);
20
+ if (!report)
21
+ return fail('Unknown engine: ' + name, 'Use windows-sandbox or hcs.');
22
+ if (printJson(ctx, report))
23
+ return report.check.available ? 0 : 1;
24
+ if (report.check.available) {
25
+ console.log(c.green(name + ' can be used on this PC.'));
26
+ if (name === 'hcs')
27
+ console.log('HCS is in alpha: starting it is not enabled yet (docs/design/engines.md).');
28
+ return 0;
29
+ }
30
+ console.log(c.yellow(name + ' cannot be used on this PC yet:'));
31
+ report.check.reasons.forEach((reason, i) => {
32
+ console.log('\n ' + (i + 1) + '. ' + reason);
33
+ console.log(' To fix: ' + (report.check.fixes[i] ?? 'see docs/design/engines.md'));
34
+ });
35
+ console.log('\nNothing was changed. These commands change Windows, so they are yours to run (or not).');
36
+ return 1;
37
+ }
38
+ export async function engine(ctx) {
39
+ const [action = 'show', name = 'hcs'] = ctx.options.positionals;
40
+ if (action === 'check')
41
+ return checkEngine(ctx, name);
42
+ const reports = await engineReports(ctx.loaded.config);
43
+ const using = reports.find((r) => r.inUse);
44
+ if (printJson(ctx, { engine: using?.id, engines: reports }))
45
+ return 0;
46
+ console.log('Engine in use: ' + (using?.id ?? ctx.loaded.config.sandbox.engine) + ' (setting: sandbox.engine)');
47
+ for (const report of reports) {
48
+ console.log('\n' + report.id + (report.inUse ? ' (in use)' : ''));
49
+ console.log(' ' + (report.check.available ? c.green('can be used on this PC') : c.yellow('cannot be used yet')));
50
+ for (const reason of report.check.reasons)
51
+ console.log(' ' + reason);
52
+ for (const fix of report.check.fixes)
53
+ console.log(' Fix: ' + fix);
54
+ table(Object.entries(CAPABILITY_NAMES).map(([key, name]) => [
55
+ ' ' + name,
56
+ report.capabilities[key] ? 'yes' : 'no',
57
+ ]));
58
+ }
59
+ return 0;
60
+ }
@@ -4,7 +4,7 @@ export { setup } from './setup/index.js';
4
4
  export { data } from './data/index.js';
5
5
  export { storage, storageBeforeCommand } from './storage/index.js';
6
6
  export { repairCommand } from './repair/index.js';
7
- export { attach, db, exec, hide, show, restart, stop, sessions, status } from './sessions/index.js';
7
+ export { attach, db, exec } from './sessions/index.js';
8
8
  export { account } from './accounts.js';
9
9
  export { resume } from './resume.js';
10
10
  export { projects } from './projects/index.js';
@@ -4,7 +4,7 @@ export { setup } from './setup/index.js';
4
4
  export { data } from './data/index.js';
5
5
  export { storage, storageBeforeCommand } from './storage/index.js';
6
6
  export { repairCommand } from './repair/index.js';
7
- export { attach, db, exec, hide, show, restart, stop, sessions, status } from './sessions/index.js';
7
+ export { attach, db, exec } from './sessions/index.js';
8
8
  export { account } from './accounts.js';
9
9
  export { resume } from './resume.js';
10
10
  export { projects } from './projects/index.js';