windows-development-sandbox 1.7.0 → 1.10.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 (432) hide show
  1. package/config.example.json +12 -1
  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 +49 -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 +20 -3
  82. package/dist/cli/commands/web.d.ts +5 -0
  83. package/dist/cli/commands/web.js +40 -0
  84. package/dist/cli/index.js +2 -1
  85. package/dist/cli/manifest.d.ts +72 -104
  86. package/dist/cli/manifest.js +64 -39
  87. package/dist/cli/menu/add-agent.d.ts +1 -1
  88. package/dist/cli/menu/add-agent.js +1 -1
  89. package/dist/cli/menu/apps.d.ts +7 -1
  90. package/dist/cli/menu/apps.js +36 -0
  91. package/dist/cli/menu/command-fields.d.ts +1 -1
  92. package/dist/cli/menu/command-form.js +2 -2
  93. package/dist/cli/menu/io-menu.d.ts +29 -0
  94. package/dist/cli/menu/io-menu.js +126 -0
  95. package/dist/cli/menu/live.d.ts +27 -0
  96. package/dist/cli/menu/live.js +69 -0
  97. package/dist/cli/menu/memory.d.ts +19 -0
  98. package/dist/cli/menu/memory.js +53 -0
  99. package/dist/cli/menu/menu.d.ts +10 -1
  100. package/dist/cli/menu/menu.js +27 -9
  101. package/dist/cli/menu/pages/agents-page.d.ts +3 -1
  102. package/dist/cli/menu/pages/agents-page.js +12 -5
  103. package/dist/cli/menu/pages/apps-page.d.ts +3 -1
  104. package/dist/cli/menu/pages/apps-page.js +19 -2
  105. package/dist/cli/menu/pages/list-page.d.ts +27 -0
  106. package/dist/cli/menu/pages/list-page.js +109 -7
  107. package/dist/cli/menu/pages/maintenance-page.d.ts +0 -5
  108. package/dist/cli/menu/pages/maintenance-page.js +17 -19
  109. package/dist/cli/menu/pages/sandbox-page.d.ts +4 -6
  110. package/dist/cli/menu/pages/sandbox-page.js +26 -118
  111. package/dist/cli/menu/pages/scopes.d.ts +1 -1
  112. package/dist/cli/menu/pages/sessions-page.d.ts +5 -11
  113. package/dist/cli/menu/pages/sessions-page.js +19 -88
  114. package/dist/cli/menu/pages/settings-page.d.ts +2 -10
  115. package/dist/cli/menu/pages/settings-page.js +64 -94
  116. package/dist/cli/menu/render-view.d.ts +28 -0
  117. package/dist/cli/menu/render-view.js +112 -0
  118. package/dist/cli/menu/settings/{path-kind.d.ts → ask-path.d.ts} +1 -7
  119. package/dist/cli/menu/settings/ask-path.js +14 -0
  120. package/dist/cli/menu/settings/collections/collection-editor.d.ts +1 -1
  121. package/dist/cli/menu/settings/collections/string-list-editor.d.ts +1 -2
  122. package/dist/cli/menu/settings/collections/string-list-editor.js +1 -1
  123. package/dist/cli/menu/settings/draft.d.ts +1 -1
  124. package/dist/cli/menu/settings/format.d.ts +1 -3
  125. package/dist/cli/menu/settings/format.js +6 -36
  126. package/dist/cli/menu/settings/index.d.ts +1 -3
  127. package/dist/cli/menu/settings/index.js +3 -3
  128. package/dist/cli/menu/settings/object-editor.d.ts +1 -1
  129. package/dist/cli/menu/settings/share.d.ts +36 -0
  130. package/dist/cli/menu/settings/share.js +131 -0
  131. package/dist/cli/menu/settings/value-editor.d.ts +5 -1
  132. package/dist/cli/menu/settings/value-editor.js +57 -54
  133. package/dist/cli/menu/several.js +1 -1
  134. package/dist/cli/menu/share-settings.d.ts +21 -0
  135. package/dist/cli/menu/share-settings.js +112 -0
  136. package/dist/cli/menu/shell.d.ts +21 -5
  137. package/dist/cli/menu/shell.js +31 -6
  138. package/dist/cli/menu/views.d.ts +7 -0
  139. package/dist/cli/menu/views.js +11 -0
  140. package/dist/cli/menu/vpn-login.js +8 -0
  141. package/dist/cli/operations/handler.d.ts +6 -0
  142. package/dist/cli/operations/handler.js +61 -0
  143. package/dist/cli/operations/index.d.ts +4 -0
  144. package/dist/cli/operations/index.js +5 -0
  145. package/dist/cli/operations/input.d.ts +6 -0
  146. package/dist/cli/operations/input.js +37 -0
  147. package/dist/cli/operations/io-cli.d.ts +7 -0
  148. package/dist/cli/operations/io-cli.js +62 -0
  149. package/dist/cli/operations/spec.d.ts +18 -0
  150. package/dist/cli/operations/spec.js +108 -0
  151. package/dist/cli/output/colors.d.ts +2 -2
  152. package/dist/cli/output/colors.js +2 -11
  153. package/dist/cli/output/index.d.ts +1 -0
  154. package/dist/cli/output/index.js +1 -0
  155. package/dist/cli/output/print.d.ts +3 -1
  156. package/dist/cli/output/print.js +7 -3
  157. package/dist/cli/output/progress.d.ts +15 -0
  158. package/dist/cli/output/progress.js +44 -0
  159. package/dist/cli/output/render-view.d.ts +4 -0
  160. package/dist/cli/output/render-view.js +63 -0
  161. package/dist/cli/services/agent-commands-service.d.ts +2 -0
  162. package/dist/cli/services/agent-commands-service.js +11 -2
  163. package/dist/cli/services/logs-service.js +4 -3
  164. package/dist/cli/tui/app.d.ts +6 -1
  165. package/dist/cli/tui/app.js +26 -4
  166. package/dist/cli/tui/list/list-screen.d.ts +14 -0
  167. package/dist/cli/tui/list/list-screen.js +64 -36
  168. package/dist/cli/tui/list/list-types.d.ts +2 -0
  169. package/dist/cli/tui/terminal.d.ts +7 -0
  170. package/dist/cli/tui/terminal.js +30 -10
  171. package/dist/core/config/defaults.js +9 -1
  172. package/dist/core/schema/config.d.ts +14 -0
  173. package/dist/core/schema/config.js +16 -1
  174. package/dist/core/schema/harness.d.ts +1 -0
  175. package/dist/core/schema/harness.js +5 -0
  176. package/dist/core/schema/sandbox.d.ts +6 -0
  177. package/dist/core/schema/sandbox.js +20 -3
  178. package/dist/core/schema/vpn.d.ts +2 -1
  179. package/dist/core/schema/vpn.js +4 -4
  180. package/dist/core/schema/web.d.ts +1 -0
  181. package/dist/core/schema/web.js +4 -1
  182. package/dist/core/types.d.ts +23 -5
  183. package/dist/core/util/fs.d.ts +2 -0
  184. package/dist/core/util/fs.js +9 -0
  185. package/dist/core/util/index.d.ts +1 -1
  186. package/dist/core/util/index.js +1 -1
  187. package/dist/guest/agents/agent-files.d.ts +5 -0
  188. package/dist/guest/agents/agent-files.js +4 -0
  189. package/dist/guest/agents/local-state.d.ts +2 -0
  190. package/dist/guest/agents/local-state.js +21 -1
  191. package/dist/guest/boot/boot.js +5 -2
  192. package/dist/guest/daemon/daemon.js +4 -0
  193. package/dist/guest/daemon/sessions.d.ts +5 -0
  194. package/dist/guest/daemon/sessions.js +17 -3
  195. package/dist/guest/entries/daemon.js +3 -0
  196. package/dist/guest/governor/decide.d.ts +71 -0
  197. package/dist/guest/governor/decide.js +211 -0
  198. package/dist/guest/governor/governor.d.ts +45 -0
  199. package/dist/guest/governor/governor.js +230 -0
  200. package/dist/guest/governor/index.d.ts +2 -0
  201. package/dist/guest/governor/index.js +2 -0
  202. package/dist/guest/network/firewall.d.ts +1 -0
  203. package/dist/guest/network/firewall.js +65 -23
  204. package/dist/guest/runtime/csc.d.ts +1 -0
  205. package/dist/guest/runtime/csc.js +1 -0
  206. package/dist/guest/runtime/process.js +53 -5
  207. package/dist/guest/sessions/viewer.js +3 -1
  208. package/dist/guest/setup/claude-mem.js +12 -4
  209. package/dist/guest/toolchains/languages/node.js +29 -3
  210. package/dist/guest/toolchains/native/rust-extras.js +4 -2
  211. package/dist/guest/vpn/vpn.js +69 -21
  212. package/dist/guest/vpn/wireguard.d.ts +32 -0
  213. package/dist/guest/vpn/wireguard.js +132 -0
  214. package/dist/host/agent-commands/commands.d.ts +4 -0
  215. package/dist/host/agent-commands/commands.js +31 -7
  216. package/dist/host/audit/log.d.ts +1 -1
  217. package/dist/host/channel/attach.d.ts +3 -1
  218. package/dist/host/channel/attach.js +5 -2
  219. package/dist/host/channel/channel.d.ts +2 -0
  220. package/dist/host/channel/channel.js +4 -0
  221. package/dist/host/engines/engine.d.ts +12 -0
  222. package/dist/host/engines/engine.js +1 -0
  223. package/dist/host/engines/hcs/check.d.ts +25 -0
  224. package/dist/host/engines/hcs/check.js +95 -0
  225. package/dist/host/engines/hcs/documents.d.ts +44 -0
  226. package/dist/host/engines/hcs/documents.js +155 -0
  227. package/dist/host/engines/hcs/engine.d.ts +39 -0
  228. package/dist/host/engines/hcs/engine.js +171 -0
  229. package/dist/host/engines/hcs/helper.d.ts +43 -0
  230. package/dist/host/engines/hcs/helper.js +173 -0
  231. package/dist/host/engines/hcs/images.d.ts +37 -0
  232. package/dist/host/engines/hcs/images.js +152 -0
  233. package/dist/host/engines/index.d.ts +7 -0
  234. package/dist/host/engines/index.js +5 -0
  235. package/dist/host/engines/registry.d.ts +16 -0
  236. package/dist/host/engines/registry.js +30 -0
  237. package/dist/host/engines/types.d.ts +58 -0
  238. package/dist/host/engines/types.js +1 -0
  239. package/dist/host/engines/windows-sandbox/engine.d.ts +16 -0
  240. package/dist/host/engines/windows-sandbox/engine.js +63 -0
  241. package/dist/host/engines/windows-sandbox/wsb-text.d.ts +2 -0
  242. package/dist/host/engines/windows-sandbox/wsb-text.js +29 -0
  243. package/dist/host/launch/generate.d.ts +5 -1
  244. package/dist/host/launch/generate.js +50 -8
  245. package/dist/host/launch/index.d.ts +3 -1
  246. package/dist/host/launch/index.js +3 -1
  247. package/dist/host/launch/launch-plan.d.ts +13 -0
  248. package/dist/host/launch/launch-plan.js +26 -0
  249. package/dist/host/launch/mappings.js +2 -1
  250. package/dist/host/launch/risk-notes.d.ts +10 -0
  251. package/dist/host/launch/risk-notes.js +18 -0
  252. package/dist/host/launch/session-file.d.ts +2 -0
  253. package/dist/host/launch/session-file.js +7 -1
  254. package/dist/host/launch/wsb-file.d.ts +28 -4
  255. package/dist/host/launch/wsb-file.js +61 -42
  256. package/dist/host/life/crash-report.d.ts +27 -1
  257. package/dist/host/life/crash-report.js +173 -7
  258. package/dist/host/life/host-memory.d.ts +41 -0
  259. package/dist/host/life/host-memory.js +140 -0
  260. package/dist/host/life/index.d.ts +2 -0
  261. package/dist/host/life/index.js +2 -0
  262. package/dist/host/life/stop-events.d.ts +2 -0
  263. package/dist/host/life/stop-events.js +20 -3
  264. package/dist/host/life/stop-warning.js +1 -1
  265. package/dist/host/life/watchdog.d.ts +56 -0
  266. package/dist/host/life/watchdog.js +124 -0
  267. package/dist/host/native.d.ts +3 -2
  268. package/dist/host/native.js +22 -3
  269. package/dist/host/profile/claude-login.js +3 -2
  270. package/dist/host/sandbox/contained-deps.d.ts +2 -0
  271. package/dist/host/sandbox/contained-deps.js +17 -0
  272. package/dist/host/sandbox/index.d.ts +2 -0
  273. package/dist/host/sandbox/index.js +2 -0
  274. package/dist/host/sandbox/platform.d.ts +2 -0
  275. package/dist/host/sandbox/platform.js +7 -7
  276. package/dist/host/sandbox/tasklist.d.ts +13 -0
  277. package/dist/host/sandbox/tasklist.js +47 -0
  278. package/dist/host/secrets/launch-secrets.js +2 -1
  279. package/dist/host/sharing/current.js +2 -6
  280. package/dist/host/storage/contained/check.d.ts +9 -0
  281. package/dist/host/storage/contained/check.js +37 -0
  282. package/dist/host/storage/contained/contained-storage.d.ts +66 -0
  283. package/dist/host/storage/contained/contained-storage.js +168 -0
  284. package/dist/host/storage/contained/disk-port.d.ts +43 -0
  285. package/dist/host/storage/contained/disk-port.js +122 -0
  286. package/dist/host/storage/contained/index.d.ts +9 -0
  287. package/dist/host/storage/contained/index.js +8 -0
  288. package/dist/host/storage/contained/layout.d.ts +28 -0
  289. package/dist/host/storage/contained/layout.js +45 -0
  290. package/dist/host/storage/contained/resolve.d.ts +4 -0
  291. package/dist/host/storage/contained/resolve.js +30 -0
  292. package/dist/host/storage/contained/setting.d.ts +1 -0
  293. package/dist/host/storage/contained/setting.js +5 -0
  294. package/dist/host/storage/contained/state.d.ts +89 -0
  295. package/dist/host/storage/contained/state.js +166 -0
  296. package/dist/host/storage/contained/transfer.d.ts +24 -0
  297. package/dist/host/storage/contained/transfer.js +121 -0
  298. package/dist/host/storage/index.d.ts +2 -0
  299. package/dist/host/storage/index.js +2 -0
  300. package/dist/host/storage/providers/contained.d.ts +15 -0
  301. package/dist/host/storage/providers/contained.js +39 -0
  302. package/dist/host/storage/providers/folder.d.ts +12 -0
  303. package/dist/host/storage/providers/folder.js +20 -0
  304. package/dist/host/storage/providers/index.d.ts +4 -0
  305. package/dist/host/storage/providers/index.js +3 -0
  306. package/dist/host/storage/providers/registry.d.ts +9 -0
  307. package/dist/host/storage/providers/registry.js +14 -0
  308. package/dist/host/storage/providers/types.d.ts +33 -0
  309. package/dist/host/storage/providers/types.js +1 -0
  310. package/dist/host/tools/conpty.js +3 -2
  311. package/dist/host/tools/windows-terminal.js +8 -7
  312. package/dist/host/vpn/index.d.ts +1 -1
  313. package/dist/host/vpn/index.js +1 -1
  314. package/dist/host/vpn/prepare.d.ts +2 -0
  315. package/dist/host/vpn/prepare.js +63 -2
  316. package/dist/host/web/browser.d.ts +2 -0
  317. package/dist/host/web/browser.js +14 -1
  318. package/dist/host/web/index.d.ts +3 -2
  319. package/dist/host/web/index.js +3 -2
  320. package/dist/host/web/rpc.d.ts +24 -0
  321. package/dist/host/web/rpc.js +149 -0
  322. package/dist/host/web/runner.d.ts +2 -0
  323. package/dist/host/web/runner.js +1 -2
  324. package/dist/host/web/server.d.ts +7 -0
  325. package/dist/host/web/server.js +23 -3
  326. package/dist/runtime/agent.js +83 -18
  327. package/dist/runtime/daemon.js +1805 -1221
  328. package/dist/runtime/db.js +83 -18
  329. package/dist/runtime/main.js +779 -219
  330. package/dist/runtime/netproxy.js +73 -11
  331. package/dist/runtime/view.js +91 -16
  332. package/dist/selftest/agent-paths.test.js +11 -1
  333. package/dist/selftest/app.test.d.ts +2 -0
  334. package/dist/selftest/app.test.js +324 -0
  335. package/dist/selftest/channel.test.js +13 -0
  336. package/dist/selftest/cli.test.js +2 -1
  337. package/dist/selftest/config.test.js +59 -0
  338. package/dist/selftest/contained.test.d.ts +2 -0
  339. package/dist/selftest/contained.test.js +544 -0
  340. package/dist/selftest/credentials.test.js +1 -1
  341. package/dist/selftest/engine.test.d.ts +2 -0
  342. package/dist/selftest/engine.test.js +127 -0
  343. package/dist/selftest/guest-boot.test.js +47 -1
  344. package/dist/selftest/hcs.test.d.ts +2 -0
  345. package/dist/selftest/hcs.test.js +482 -0
  346. package/dist/selftest/heavy-load.test.d.ts +2 -0
  347. package/dist/selftest/heavy-load.test.js +355 -0
  348. package/dist/selftest/index.js +12 -0
  349. package/dist/selftest/layout.test.js +12 -0
  350. package/dist/selftest/menu-perf.test.d.ts +2 -0
  351. package/dist/selftest/menu-perf.test.js +248 -0
  352. package/dist/selftest/menu-screens.js +4 -2
  353. package/dist/selftest/menu.test.js +36 -8
  354. package/dist/selftest/network.test.js +20 -1
  355. package/dist/selftest/support/engine-cases.d.ts +8 -0
  356. package/dist/selftest/support/engine-cases.js +65 -0
  357. package/dist/selftest/support/engine-golden.d.ts +3 -0
  358. package/dist/selftest/support/engine-golden.js +66 -0
  359. package/dist/selftest/support/fixtures.d.ts +8 -1
  360. package/dist/selftest/support/hcs-probes.d.ts +17 -0
  361. package/dist/selftest/support/hcs-probes.js +41 -0
  362. package/dist/selftest/vpn.test.js +136 -3
  363. package/dist/selftest/web.test.js +101 -3
  364. package/dist/shared/channel/run-dir.d.ts +4 -1
  365. package/dist/shared/channel/run-dir.js +7 -1
  366. package/dist/shared/channel/schema.d.ts +35 -1
  367. package/dist/shared/channel/schema.js +27 -0
  368. package/dist/shared/channel/secrets.d.ts +1 -0
  369. package/dist/shared/channel/secrets.js +6 -0
  370. package/dist/shared/io/copy-tree.d.ts +7 -0
  371. package/dist/shared/io/copy-tree.js +45 -0
  372. package/dist/shared/io/index.d.ts +2 -0
  373. package/dist/shared/io/index.js +2 -0
  374. package/dist/shared/io/robocopy-result.d.ts +6 -0
  375. package/dist/shared/io/robocopy-result.js +23 -0
  376. package/dist/shared/memory/index.d.ts +1 -0
  377. package/dist/shared/memory/index.js +1 -0
  378. package/dist/shared/memory/policy.d.ts +38 -0
  379. package/dist/shared/memory/policy.js +63 -0
  380. package/dist/shared/network/firewall-rules.d.ts +8 -0
  381. package/dist/shared/network/firewall-rules.js +28 -0
  382. package/dist/shared/pty/output-filter.d.ts +14 -1
  383. package/dist/shared/pty/output-filter.js +22 -4
  384. package/dist/shared/pty/terminal.d.ts +4 -1
  385. package/dist/shared/pty/terminal.js +4 -2
  386. package/dist/shared/system.d.ts +1 -0
  387. package/dist/shared/system.js +1 -0
  388. package/dist/shared/vpn/download.d.ts +16 -0
  389. package/dist/shared/vpn/download.js +16 -0
  390. package/dist/shared/vpn/wireguard.d.ts +51 -0
  391. package/dist/shared/vpn/wireguard.js +227 -0
  392. package/dist/sync/sync-cycle.js +5 -5
  393. package/dist/sync/watcher.d.ts +13 -0
  394. package/dist/sync/watcher.js +92 -3
  395. package/dist/web/index.html +4 -3
  396. package/dist/web/main-NRRS5O6Z.js +157 -0
  397. package/dist/web/main-T5DMCHYV.css +1 -0
  398. package/native/csharp/HcsHost/AssemblyInfo.cs +14 -0
  399. package/native/csharp/HcsHost/Guard.cs +100 -0
  400. package/native/csharp/HcsHost/Hcs.cs +256 -0
  401. package/native/csharp/HcsHost/Json.cs +78 -0
  402. package/native/csharp/HcsHost/Program.cs +185 -0
  403. package/native/csharp/HcsHost/VirtualDisk.cs +95 -0
  404. package/native/csharp/HostTools/AssemblyInfo.cs +14 -0
  405. package/native/csharp/HostTools/MemoryStatus.cs +128 -0
  406. package/native/csharp/HostTools/Program.cs +58 -17
  407. package/native/scripts/check-contained.ps1 +28 -0
  408. package/native/scripts/contained-common.ps1 +241 -0
  409. package/native/scripts/dismount-contained.ps1 +66 -0
  410. package/native/scripts/memory-status.ps1 +42 -0
  411. package/native/scripts/mount-contained.ps1 +139 -0
  412. package/native/scripts/run-elevated.ps1 +17 -4
  413. package/native/scripts/stop-events.ps1 +23 -8
  414. package/package.json +9 -2
  415. package/sandbox/csharp/MemGov.cs +466 -0
  416. package/sandbox/csharp/PtyHost.cs +111 -5
  417. package/sandbox/scripts/new-shortcuts.ps1 +3 -1
  418. package/schemas/config.schema.json +66 -8
  419. package/schemas/sandbox-config.schema.json +3 -3
  420. package/dist/cli/commands/sessions/control.d.ts +0 -4
  421. package/dist/cli/commands/sessions/control.js +0 -66
  422. package/dist/cli/commands/sessions/list.d.ts +0 -2
  423. package/dist/cli/commands/sessions/list.js +0 -48
  424. package/dist/cli/commands/sessions/status.d.ts +0 -4
  425. package/dist/cli/commands/sessions/status.js +0 -114
  426. package/dist/cli/commands/sessions/window.d.ts +0 -3
  427. package/dist/cli/commands/sessions/window.js +0 -18
  428. package/dist/cli/menu/settings/path-kind.js +0 -44
  429. package/dist/web/main-CXESL347.js +0 -45
  430. package/dist/web/main-VLR7DVQ4.css +0 -1
  431. /package/dist/{cli/menu/settings → app/kernel}/schema-node.d.ts +0 -0
  432. /package/dist/{cli/menu/settings → app/kernel}/schema-node.js +0 -0
@@ -205,34 +205,6 @@ declare const COMMAND_LIST: readonly [{
205
205
  group?: string | undefined;
206
206
  shownAs?: string | undefined;
207
207
  }];
208
- }, {
209
- readonly name: "sessions";
210
- readonly summary: "list agent sessions and who is attached";
211
- readonly group: "Sessions";
212
- readonly args: readonly [];
213
- readonly options: readonly [{
214
- flag: string;
215
- type: "string" | "number" | "boolean" | "list";
216
- description: string;
217
- short?: string | undefined;
218
- value?: string | undefined;
219
- label?: string | undefined;
220
- default?: string | number | undefined;
221
- choices?: string[] | "harnesses" | "sessions" | "accounts" | undefined;
222
- advanced?: boolean | undefined;
223
- when?: string | undefined;
224
- noMenu?: boolean | undefined;
225
- group?: string | undefined;
226
- shownAs?: string | undefined;
227
- }];
228
- readonly json: true;
229
- }, {
230
- readonly name: "status";
231
- readonly summary: "show what the sandbox is doing";
232
- readonly group: "Sessions";
233
- readonly args: readonly [];
234
- readonly options: readonly [];
235
- readonly json: true;
236
208
  }, {
237
209
  readonly name: "db";
238
210
  readonly summary: "list, start or stop databases in the running sandbox";
@@ -283,60 +255,6 @@ declare const COMMAND_LIST: readonly [{
283
255
  }];
284
256
  readonly passthrough: "command";
285
257
  readonly json: true;
286
- }, {
287
- readonly name: "restart";
288
- readonly summary: "restart this project's running agents in place; they resume their conversation";
289
- readonly group: "Agents";
290
- readonly args: readonly [];
291
- readonly options: readonly [{
292
- flag: string;
293
- type: "string" | "number" | "boolean" | "list";
294
- description: string;
295
- short?: string | undefined;
296
- value?: string | undefined;
297
- label?: string | undefined;
298
- default?: string | number | undefined;
299
- choices?: string[] | "harnesses" | "sessions" | "accounts" | undefined;
300
- advanced?: boolean | undefined;
301
- when?: string | undefined;
302
- noMenu?: boolean | undefined;
303
- group?: string | undefined;
304
- shownAs?: string | undefined;
305
- }, {
306
- flag: string;
307
- type: "string" | "number" | "boolean" | "list";
308
- description: string;
309
- short?: string | undefined;
310
- value?: string | undefined;
311
- label?: string | undefined;
312
- default?: string | number | undefined;
313
- choices?: string[] | "harnesses" | "sessions" | "accounts" | undefined;
314
- advanced?: boolean | undefined;
315
- when?: string | undefined;
316
- noMenu?: boolean | undefined;
317
- group?: string | undefined;
318
- shownAs?: string | undefined;
319
- }];
320
- }, {
321
- readonly name: "stop";
322
- readonly summary: "shut the sandbox down (every project's sessions end)";
323
- readonly group: "Agents";
324
- readonly args: readonly [];
325
- readonly options: readonly [{
326
- flag: string;
327
- type: "string" | "number" | "boolean" | "list";
328
- description: string;
329
- short?: string | undefined;
330
- value?: string | undefined;
331
- label?: string | undefined;
332
- default?: string | number | undefined;
333
- choices?: string[] | "harnesses" | "sessions" | "accounts" | undefined;
334
- advanced?: boolean | undefined;
335
- when?: string | undefined;
336
- noMenu?: boolean | undefined;
337
- group?: string | undefined;
338
- shownAs?: string | undefined;
339
- }];
340
258
  }, {
341
259
  readonly name: "projects";
342
260
  readonly summary: "the projects a sandbox can open without a restart: list, choose, roots, all/exclude";
@@ -374,18 +292,6 @@ declare const COMMAND_LIST: readonly [{
374
292
  group?: string | undefined;
375
293
  shownAs?: string | undefined;
376
294
  }];
377
- }, {
378
- readonly name: "show";
379
- readonly summary: "show the sandbox window";
380
- readonly group: "Sessions";
381
- readonly args: readonly [];
382
- readonly options: readonly [];
383
- }, {
384
- readonly name: "hide";
385
- readonly summary: "hide the sandbox window (it keeps running)";
386
- readonly group: "Sessions";
387
- readonly args: readonly [];
388
- readonly options: readonly [];
389
295
  }, {
390
296
  readonly name: "account";
391
297
  readonly summary: "Claude logins: list, save, use, set the default, remove";
@@ -510,19 +416,19 @@ declare const COMMAND_LIST: readonly [{
510
416
  readonly examples: readonly ["sandbox data clean pick what to delete from a list", "sandbox data clean logs tools/go delete these"];
511
417
  }, {
512
418
  readonly name: "storage";
513
- readonly summary: "where your saved data lives: show it, move it to another folder, or switch folders";
419
+ readonly summary: "where your saved data lives: show it, move it to another folder, switch folders, or (beta) keep it in a disk image";
514
420
  readonly group: "Data";
515
- readonly examples: readonly ["sandbox storage where the data is", "sandbox storage move D:\\sandbox-data move it (asks first)"];
421
+ readonly examples: readonly ["sandbox storage where the data is", "sandbox storage move D:\\sandbox-data move it (asks first)", "sandbox storage contained status (beta) the disk image for tools, state and logs", "sandbox storage contained on (beta) keep them in a disk image (asks first)"];
516
422
  readonly args: readonly [{
517
423
  readonly name: "action";
518
- readonly description: "show, move or use";
424
+ readonly description: "show, move, use or contained";
519
425
  readonly required: false;
520
- readonly choices: readonly ["show", "move", "use"];
426
+ readonly choices: readonly ["show", "move", "use", "contained"];
521
427
  }, {
522
428
  readonly name: "folder";
523
- readonly description: "the folder to move to, or to use";
429
+ readonly description: "the folder to move to, or to use; for contained: on, off or status";
524
430
  readonly required: false;
525
- readonly when: readonly ["move", "use"];
431
+ readonly when: readonly ["move", "use", "contained"];
526
432
  }];
527
433
  readonly options: readonly [{
528
434
  flag: string;
@@ -554,6 +460,25 @@ declare const COMMAND_LIST: readonly [{
554
460
  shownAs?: string | undefined;
555
461
  }];
556
462
  readonly json: true;
463
+ }, {
464
+ readonly name: "engine";
465
+ readonly summary: "(beta) what runs your sandbox (Windows Sandbox or HCS) and what each engine can do on this PC";
466
+ readonly group: "Health";
467
+ readonly examples: readonly ["sandbox engine the engine in use and what each can do", "sandbox engine check hcs what this PC lacks for the HCS engine, and the commands that would fix it"];
468
+ readonly args: readonly [{
469
+ readonly name: "action";
470
+ readonly description: "show or check";
471
+ readonly required: false;
472
+ readonly choices: readonly ["show", "check"];
473
+ }, {
474
+ readonly name: "engine";
475
+ readonly description: "the engine to check";
476
+ readonly required: false;
477
+ readonly choices: readonly ["windows-sandbox", "hcs"];
478
+ readonly when: "check";
479
+ }];
480
+ readonly options: readonly [];
481
+ readonly json: true;
557
482
  }, {
558
483
  readonly name: "clean";
559
484
  readonly summary: "delete old launch folders, logs and leftovers";
@@ -646,6 +571,20 @@ declare const COMMAND_LIST: readonly [{
646
571
  noMenu?: boolean | undefined;
647
572
  group?: string | undefined;
648
573
  shownAs?: string | undefined;
574
+ }, {
575
+ flag: string;
576
+ type: "string" | "number" | "boolean" | "list";
577
+ description: string;
578
+ short?: string | undefined;
579
+ value?: string | undefined;
580
+ label?: string | undefined;
581
+ default?: string | number | undefined;
582
+ choices?: string[] | "harnesses" | "sessions" | "accounts" | undefined;
583
+ advanced?: boolean | undefined;
584
+ when?: string | undefined;
585
+ noMenu?: boolean | undefined;
586
+ group?: string | undefined;
587
+ shownAs?: string | undefined;
649
588
  }];
650
589
  }, {
651
590
  readonly name: "setup";
@@ -867,13 +806,13 @@ declare const COMMAND_LIST: readonly [{
867
806
  readonly name: "action";
868
807
  readonly description: "what to do";
869
808
  readonly required: false;
870
- readonly choices: readonly ["show", "path", "init", "schema", "check", "get", "set"];
809
+ readonly choices: readonly ["show", "path", "init", "schema", "check", "get", "set", "export", "import"];
871
810
  readonly aliases: readonly ["summary"];
872
811
  }, {
873
812
  readonly name: "key";
874
- readonly description: "(get, set) the setting, e.g. sandbox.memoryMb";
813
+ readonly description: "(get, set, reset) the setting, e.g. sandbox.memoryMb; (export, import) the .json file";
875
814
  readonly required: false;
876
- readonly when: readonly ["get", "set"];
815
+ readonly when: readonly ["get", "set", "export", "import"];
877
816
  }, {
878
817
  readonly name: "value";
879
818
  readonly description: "(set) the new value";
@@ -894,8 +833,36 @@ declare const COMMAND_LIST: readonly [{
894
833
  noMenu?: boolean | undefined;
895
834
  group?: string | undefined;
896
835
  shownAs?: string | undefined;
836
+ }, {
837
+ flag: string;
838
+ type: "string" | "number" | "boolean" | "list";
839
+ description: string;
840
+ short?: string | undefined;
841
+ value?: string | undefined;
842
+ label?: string | undefined;
843
+ default?: string | number | undefined;
844
+ choices?: string[] | "harnesses" | "sessions" | "accounts" | undefined;
845
+ advanced?: boolean | undefined;
846
+ when?: string | undefined;
847
+ noMenu?: boolean | undefined;
848
+ group?: string | undefined;
849
+ shownAs?: string | undefined;
850
+ }, {
851
+ flag: string;
852
+ type: "string" | "number" | "boolean" | "list";
853
+ description: string;
854
+ short?: string | undefined;
855
+ value?: string | undefined;
856
+ label?: string | undefined;
857
+ default?: string | number | undefined;
858
+ choices?: string[] | "harnesses" | "sessions" | "accounts" | undefined;
859
+ advanced?: boolean | undefined;
860
+ when?: string | undefined;
861
+ noMenu?: boolean | undefined;
862
+ group?: string | undefined;
863
+ shownAs?: string | undefined;
897
864
  }];
898
- readonly examples: readonly ["sandbox config set sandbox.memoryMb 8192", "sandbox config get sandbox.memoryMb"];
865
+ readonly examples: readonly ["sandbox config set sandbox.memoryMb 8192", "sandbox config get sandbox.memoryMb", "sandbox config reset sandbox.memoryMb", "sandbox config list", "sandbox config export team-settings.json", "sandbox config import team-settings.json"];
899
866
  }, {
900
867
  readonly name: "agent-commands";
901
868
  readonly summary: "(Beta) make claude, codex ... on this PC start in a hidden sandbox and attach";
@@ -1006,6 +973,7 @@ declare const COMMAND_LIST: readonly [{
1006
973
  readonly options: readonly [];
1007
974
  readonly hidden: true;
1008
975
  }];
976
+ /** The hand-written commands (the shared core's own commands are not in this union). */
1009
977
  export type CommandName = (typeof COMMAND_LIST)[number]['name'];
1010
978
  export declare const COMMANDS: CommandSpec[];
1011
979
  export declare function commandSpec(name: string): CommandSpec | undefined;
@@ -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.');
@@ -208,15 +212,6 @@ const COMMAND_LIST = [
208
212
  bool('--auto', 'used by the background sync after a crash: no questions', { noMenu: true, advanced: true }),
209
213
  ],
210
214
  },
211
- {
212
- name: 'sessions',
213
- summary: 'list agent sessions and who is attached',
214
- group: 'Sessions',
215
- args: [],
216
- options: [bool('--wide', "also show each session's folder", { noMenu: true })],
217
- json,
218
- },
219
- { name: 'status', summary: 'show what the sandbox is doing', group: 'Sessions', args: [], options: [], json },
220
215
  {
221
216
  name: 'db',
222
217
  summary: 'list, start or stop databases in the running sandbox',
@@ -254,23 +249,6 @@ const COMMAND_LIST = [
254
249
  passthrough: 'command',
255
250
  json,
256
251
  },
257
- {
258
- name: 'restart',
259
- summary: "restart this project's running agents in place; they resume their conversation",
260
- group: 'Agents',
261
- args: [],
262
- options: [
263
- text('--harness', 'name', 'only this agent', { choices: 'harnesses', shownAs: '--agent' }),
264
- bool('--all', "every project's sessions, not only this folder's"),
265
- ],
266
- },
267
- {
268
- name: 'stop',
269
- summary: "shut the sandbox down (every project's sessions end)",
270
- group: 'Agents',
271
- args: [],
272
- options: [bool('--yes', "do not ask when other projects' sessions would end", { short: '-y', noMenu: true })],
273
- },
274
252
  {
275
253
  name: 'projects',
276
254
  summary: 'the projects a sandbox can open without a restart: list, choose, roots, all/exclude',
@@ -298,8 +276,6 @@ const COMMAND_LIST = [
298
276
  ],
299
277
  options: [bool('--yes', 'do not ask before removing', { short: '-y', when: 'remove', noMenu: true })],
300
278
  },
301
- { name: 'show', summary: 'show the sandbox window', group: 'Sessions', args: [], options: [] },
302
- { name: 'hide', summary: 'hide the sandbox window (it keeps running)', group: 'Sessions', args: [], options: [] },
303
279
  {
304
280
  name: 'account',
305
281
  summary: 'Claude logins: list, save, use, set the default, remove',
@@ -358,15 +334,27 @@ const COMMAND_LIST = [
358
334
  },
359
335
  {
360
336
  name: 'storage',
361
- summary: 'where your saved data lives: show it, move it to another folder, or switch folders',
337
+ summary: 'where your saved data lives: show it, move it to another folder, switch folders, or (beta) keep it in a disk image',
362
338
  group: 'Data',
363
339
  examples: [
364
340
  'sandbox storage where the data is',
365
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)',
366
344
  ],
367
345
  args: [
368
- { name: 'action', description: 'show, move or use', required: false, choices: ['show', 'move', 'use'] },
369
- { name: 'folder', description: 'the folder to move to, or to use', required: false, when: ['move', 'use'] },
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
+ },
370
358
  ],
371
359
  options: [
372
360
  bool('--yes', 'do not ask before moving or switching', { short: '-y', noMenu: true }),
@@ -374,6 +362,27 @@ const COMMAND_LIST = [
374
362
  ],
375
363
  json,
376
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: [],
384
+ json,
385
+ },
377
386
  {
378
387
  name: 'clean',
379
388
  summary: 'delete old launch folders, logs and leftovers',
@@ -410,7 +419,10 @@ const COMMAND_LIST = [
410
419
  summary: 'print the newest sandbox log',
411
420
  group: 'Health',
412
421
  args: [],
413
- 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
+ ],
414
426
  },
415
427
  {
416
428
  name: 'setup',
@@ -494,19 +506,30 @@ const COMMAND_LIST = [
494
506
  name: 'action',
495
507
  description: 'what to do',
496
508
  required: false,
497
- choices: ['show', 'path', 'init', 'schema', 'check', 'get', 'set'],
509
+ choices: ['show', 'path', 'init', 'schema', 'check', 'get', 'set', 'export', 'import'],
498
510
  aliases: ['summary'],
499
511
  },
500
512
  {
501
513
  name: 'key',
502
- description: '(get, set) the setting, e.g. sandbox.memoryMb',
514
+ description: '(get, set, reset) the setting, e.g. sandbox.memoryMb; (export, import) the .json file',
503
515
  required: false,
504
- when: ['get', 'set'],
516
+ when: ['get', 'set', 'export', 'import'],
505
517
  },
506
518
  { name: 'value', description: '(set) the new value', required: false, when: 'set' },
507
519
  ],
508
- options: [text('--workspace', 'dir', '(check) the project folder; default: the current one')],
509
- examples: ['sandbox config set sandbox.memoryMb 8192', 'sandbox config get sandbox.memoryMb'],
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',
532
+ ],
510
533
  },
511
534
  {
512
535
  name: 'agent-commands',
@@ -585,7 +608,9 @@ const COMMAND_LIST = [
585
608
  hidden: true,
586
609
  },
587
610
  ];
588
- 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)));
589
614
  export function commandSpec(name) {
590
615
  return COMMANDS.find((c) => c.name === name);
591
616
  }
@@ -1,6 +1,6 @@
1
1
  import type { Harness } from '../../core/types.js';
2
2
  import type { App } from '../tui/index.js';
3
- import type { ConfigFile } from './settings/config-file.js';
3
+ import type { ConfigFile } from '../../app/features/settings/index.js';
4
4
  import type { Draft } from './settings/draft.js';
5
5
  /** How a new agent gets into the sandbox. */
6
6
  export type AgentSource = 'npm' | 'uv' | 'host';
@@ -5,7 +5,7 @@
5
5
  import { DEFAULTS } from '../../core/config/index.js';
6
6
  import { HarnessSchema, NameSchema, describeIssues } from '../../core/schema/index.js';
7
7
  import { fail } from '../../core/util/index.js';
8
- import { askPath } from './settings/path-kind.js';
8
+ import { askPath } from './settings/ask-path.js';
9
9
  /** Nothing wrong with the name (true), or what is wrong. Pure. */
10
10
  export function agentNameProblem(name, taken) {
11
11
  const typed = name.trim();
@@ -1,6 +1,6 @@
1
1
  import { type AppCategory, type AppEntry } from '../../shared/apps/index.js';
2
2
  import { type Category, type ListItem } from '../tui/index.js';
3
- import type { ConfigFile } from './settings/config-file.js';
3
+ import type { ConfigFile } from '../../app/features/settings/index.js';
4
4
  import type { Draft } from './settings/draft.js';
5
5
  export declare const CUSTOM = "@custom:";
6
6
  /** The catalogue has many small categories; the menu shows these few groups so the navigation stays short. */
@@ -32,6 +32,12 @@ export declare const APP_GROUPS: readonly [{
32
32
  }];
33
33
  /** The group an app category is shown under. */
34
34
  export declare function groupOf(category: AppCategory): string;
35
+ /** The row in Apps that opens the "request an app" issue form (its id is not an app). */
36
+ export declare const REQUEST_APP = "@request-app";
37
+ /** This project's new-issue page on GitHub. */
38
+ export declare const ISSUES_URL = "https://github.com/JoshDiDuca/windows-development-sandbox/issues/new";
39
+ /** The new-issue address with a title and a body to fill in (the page needs no login to show it). */
40
+ export declare function requestAppUrl(): string;
35
41
  export declare class AppsModel {
36
42
  private readonly file;
37
43
  private readonly dataPath;
@@ -45,6 +45,30 @@ export function groupOf(category) {
45
45
  return APP_GROUPS.find((g) => g.members.includes(category))?.id ?? 'tools';
46
46
  }
47
47
  const INSTALL = ['apps', 'install'];
48
+ /** The row in Apps that opens the "request an app" issue form (its id is not an app). */
49
+ export const REQUEST_APP = '@request-app';
50
+ /** This project's new-issue page on GitHub. */
51
+ export const ISSUES_URL = 'https://github.com/JoshDiDuca/windows-development-sandbox/issues/new';
52
+ /** The new-issue address with a title and a body to fill in (the page needs no login to show it). */
53
+ export function requestAppUrl() {
54
+ const body = [
55
+ '**App name:**',
56
+ '',
57
+ '**Where to get it** (GitHub releases page or a direct download link):',
58
+ '',
59
+ '**What it is for:**',
60
+ '',
61
+ '**Command-line tool or desktop app?**',
62
+ '',
63
+ '**Does it need a GPU, a license or an account?**',
64
+ ].join('\n');
65
+ const query = [
66
+ ['title', 'App request: '],
67
+ ['body', body],
68
+ ['labels', 'app-request'],
69
+ ];
70
+ return ISSUES_URL + '?' + query.map(([k, v]) => k + '=' + encodeURIComponent(v)).join('&');
71
+ }
48
72
  export class AppsModel {
49
73
  file;
50
74
  dataPath;
@@ -137,6 +161,18 @@ export class AppsModel {
137
161
  items(draft) {
138
162
  return [
139
163
  ...this.entries().map((a) => this.item(a, draft)),
164
+ ...(this.file.isProject
165
+ ? []
166
+ : [
167
+ {
168
+ value: REQUEST_APP,
169
+ label: 'Request an app…',
170
+ category: 'custom',
171
+ description: 'Not in the list? Press r: your browser opens a prefilled request on GitHub (' + ISSUES_URL + ').',
172
+ hint: Theme.muted('press r'),
173
+ disabled: 'Press r to open the request form on GitHub.',
174
+ },
175
+ ]),
140
176
  ...Object.entries(this.custom(draft)).map(([id, a]) => ({
141
177
  value: CUSTOM + id,
142
178
  label: a.name,
@@ -1,5 +1,5 @@
1
1
  import { type ArgSpec, type OptionSpec } from '../manifest.js';
2
- import type { PathKind } from './settings/path-kind.js';
2
+ import type { PathKind } from '../../app/kernel/index.js';
3
3
  /** What an option accepts, checked while typing (undefined = fine). */
4
4
  export declare function optionProblem(o: OptionSpec, v: string): string | undefined;
5
5
  export type Field = {
@@ -16,8 +16,8 @@ import { askedWhen } from '../manifest.js';
16
16
  import { Text, Theme } from '../tui/index.js';
17
17
  import { actionOf, argLabel, argPathKind, optionLabel, optionPathKind, optionProblem, plainDescription, plainSummary, } from './command-fields.js';
18
18
  import { StringListEditor } from './settings/collections/string-list-editor.js';
19
- import { askPath } from './settings/path-kind.js';
20
- import { SchemaNode } from './settings/schema-node.js';
19
+ import { askPath } from './settings/ask-path.js';
20
+ import { SchemaNode } from '../../app/kernel/index.js';
21
21
  import { ValueEditor } from './settings/value-editor.js';
22
22
  const MORE = '@more';
23
23
  const OTHER = '@other';
@@ -0,0 +1,29 @@
1
+ import { type Action, type AnyDefinition } from '../../app/kernel/index.js';
2
+ import type { Context } from '../commands/context.js';
3
+ import { type App } from '../tui/index.js';
4
+ import type { ShellExit } from './shell.js';
5
+ /** Where the dialogs say they are (the menu's path line). */
6
+ type Where = readonly string[];
7
+ /** How a page shows progress while an operation runs (ListPage.busy). */
8
+ export type ShowBusy = (text: string) => void;
9
+ /** What an action did: leave the menu to run a command, and/or a notice after the page loads again. */
10
+ export interface Performed {
11
+ readonly exit?: ShellExit;
12
+ readonly notice?: string;
13
+ readonly reload?: boolean;
14
+ }
15
+ export declare class MenuOperations {
16
+ private readonly app;
17
+ private readonly ctx;
18
+ constructor(app: App, ctx: Context);
19
+ /** Does what an action of a page says: follows a link, or asks for its fields and runs its operation. */
20
+ perform(action: Action, where: Where, busy?: ShowBusy): Promise<Performed>;
21
+ /** The values of an action's fields, from the editors that fit them (undefined: one was backed out of). */
22
+ private fields;
23
+ /**
24
+ * Runs a definition with this input and returns the notice to show: its text (✓), the problem and its fix (✘), or
25
+ * undefined when a question was declined (nothing changed, nothing to say).
26
+ */
27
+ run(def: AnyDefinition, input: unknown, where: Where, busy?: ShowBusy): Promise<string | undefined>;
28
+ }
29
+ export {};