windows-development-sandbox 1.5.0 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (709) hide show
  1. package/README.md +1 -0
  2. package/config.example.json +27 -1
  3. package/dist/app/context.d.ts +8 -0
  4. package/dist/app/context.js +12 -0
  5. package/dist/app/features/defs.d.ts +322 -0
  6. package/dist/app/features/defs.js +28 -0
  7. package/dist/app/features/sandbox/index.d.ts +2 -0
  8. package/dist/app/features/sandbox/index.js +3 -0
  9. package/dist/app/features/sandbox/sandbox.def.d.ts +193 -0
  10. package/dist/app/features/sandbox/sandbox.def.js +245 -0
  11. package/dist/app/features/sandbox/sandbox.run.d.ts +72 -0
  12. package/dist/app/features/sandbox/sandbox.run.js +98 -0
  13. package/dist/app/features/sessions/index.d.ts +2 -0
  14. package/dist/app/features/sessions/index.js +3 -0
  15. package/dist/app/features/sessions/sessions.def.d.ts +141 -0
  16. package/dist/app/features/sessions/sessions.def.js +176 -0
  17. package/dist/app/features/sessions/sessions.run.d.ts +39 -0
  18. package/dist/app/features/sessions/sessions.run.js +58 -0
  19. package/dist/{cli/menu/settings/categories.d.ts → app/features/settings/categories.def.d.ts} +4 -0
  20. package/dist/{cli/menu/settings/categories.js → app/features/settings/categories.def.js} +40 -46
  21. package/dist/app/features/settings/index.d.ts +5 -0
  22. package/dist/app/features/settings/index.js +6 -0
  23. package/dist/{cli/menu/settings/config-file.d.ts → app/features/settings/settings-file.d.ts} +1 -1
  24. package/dist/{cli/menu/settings/config-file.js → app/features/settings/settings-file.js} +1 -1
  25. package/dist/app/features/settings/settings-rows.d.ts +35 -0
  26. package/dist/app/features/settings/settings-rows.js +94 -0
  27. package/dist/app/features/settings/settings.def.d.ts +157 -0
  28. package/dist/app/features/settings/settings.def.js +179 -0
  29. package/dist/app/features/settings/settings.run.d.ts +67 -0
  30. package/dist/app/features/settings/settings.run.js +84 -0
  31. package/dist/app/kernel/define.d.ts +143 -0
  32. package/dist/app/kernel/define.js +42 -0
  33. package/dist/app/kernel/errors.d.ts +34 -0
  34. package/dist/app/kernel/errors.js +45 -0
  35. package/dist/app/kernel/fields.d.ts +70 -0
  36. package/dist/app/kernel/fields.js +243 -0
  37. package/dist/app/kernel/index.d.ts +8 -0
  38. package/dist/app/kernel/index.js +10 -0
  39. package/dist/app/kernel/io.d.ts +193 -0
  40. package/dist/app/kernel/io.js +126 -0
  41. package/dist/app/kernel/rpc.d.ts +156 -0
  42. package/dist/app/kernel/rpc.js +47 -0
  43. package/dist/{cli/menu/settings → app/kernel}/schema-node.d.ts +9 -0
  44. package/dist/{cli/menu/settings → app/kernel}/schema-node.js +26 -0
  45. package/dist/app/kernel/text.d.ts +6 -0
  46. package/dist/app/kernel/text.js +57 -0
  47. package/dist/app/kernel/view.d.ts +146 -0
  48. package/dist/app/kernel/view.js +28 -0
  49. package/dist/app/registry.d.ts +10 -0
  50. package/dist/app/registry.js +50 -0
  51. package/dist/cli/args.d.ts +18 -2
  52. package/dist/cli/args.js +101 -24
  53. package/dist/cli/commands/accounts.js +45 -17
  54. package/dist/cli/commands/context.d.ts +2 -0
  55. package/dist/cli/commands/context.js +9 -2
  56. package/dist/cli/commands/data/clean.js +32 -9
  57. package/dist/cli/commands/engine.d.ts +2 -0
  58. package/dist/cli/commands/engine.js +60 -0
  59. package/dist/cli/commands/index.d.ts +2 -1
  60. package/dist/cli/commands/index.js +2 -1
  61. package/dist/cli/commands/launch/add-root.d.ts +3 -2
  62. package/dist/cli/commands/launch/add-root.js +11 -10
  63. package/dist/cli/commands/launch/launch.js +102 -9
  64. package/dist/cli/commands/launch/prepare.js +6 -4
  65. package/dist/cli/commands/launch/running.js +2 -1
  66. package/dist/cli/commands/launch/summary.d.ts +2 -0
  67. package/dist/cli/commands/maintenance/audit.js +1 -1
  68. package/dist/cli/commands/maintenance/clean.d.ts +1 -1
  69. package/dist/cli/commands/maintenance/clean.js +17 -3
  70. package/dist/cli/commands/maintenance/config-share.d.ts +12 -0
  71. package/dist/cli/commands/maintenance/config-share.js +80 -0
  72. package/dist/cli/commands/maintenance/config.d.ts +1 -1
  73. package/dist/cli/commands/maintenance/config.js +38 -10
  74. package/dist/cli/commands/maintenance/doctor.d.ts +1 -1
  75. package/dist/cli/commands/maintenance/doctor.js +2 -4
  76. package/dist/cli/commands/maintenance/logs.js +14 -0
  77. package/dist/cli/commands/maintenance/migrate.d.ts +2 -1
  78. package/dist/cli/commands/maintenance/migrate.js +19 -4
  79. package/dist/cli/commands/maintenance/sync.js +2 -0
  80. package/dist/cli/commands/maintenance/update.d.ts +2 -0
  81. package/dist/cli/commands/maintenance/update.js +27 -4
  82. package/dist/cli/commands/projects/here.js +12 -7
  83. package/dist/cli/commands/projects/projects.js +26 -17
  84. package/dist/cli/commands/registry.js +10 -7
  85. package/dist/cli/commands/repair/checks/agents.d.ts +2 -0
  86. package/dist/cli/commands/repair/checks/agents.js +70 -0
  87. package/dist/cli/commands/repair/checks/common.d.ts +8 -0
  88. package/dist/cli/commands/repair/checks/common.js +22 -0
  89. package/dist/cli/commands/repair/checks/contained.d.ts +2 -0
  90. package/dist/cli/commands/repair/checks/contained.js +139 -0
  91. package/dist/cli/commands/repair/checks/data.d.ts +2 -0
  92. package/dist/cli/commands/repair/checks/data.js +241 -0
  93. package/dist/cli/commands/repair/checks/hcs.d.ts +7 -0
  94. package/dist/cli/commands/repair/checks/hcs.js +28 -0
  95. package/dist/cli/commands/repair/checks/index.d.ts +2 -0
  96. package/dist/cli/commands/repair/checks/index.js +24 -0
  97. package/dist/cli/commands/repair/checks/install.d.ts +5 -0
  98. package/dist/cli/commands/repair/checks/install.js +318 -0
  99. package/dist/cli/commands/repair/checks/machine.d.ts +2 -0
  100. package/dist/cli/commands/repair/checks/machine.js +232 -0
  101. package/dist/cli/commands/repair/checks/network.d.ts +6 -0
  102. package/dist/cli/commands/repair/checks/network.js +60 -0
  103. package/dist/cli/commands/repair/checks/pc.d.ts +4 -0
  104. package/dist/cli/commands/repair/checks/pc.js +86 -0
  105. package/dist/cli/commands/repair/checks/sandbox.d.ts +2 -0
  106. package/dist/cli/commands/repair/checks/sandbox.js +282 -0
  107. package/dist/cli/commands/repair/checks/settings.d.ts +2 -0
  108. package/dist/cli/commands/repair/checks/settings.js +169 -0
  109. package/dist/cli/commands/repair/checks/vpn.d.ts +2 -0
  110. package/dist/cli/commands/repair/checks/vpn.js +78 -0
  111. package/dist/cli/commands/repair/engine.d.ts +32 -0
  112. package/dist/cli/commands/repair/engine.js +127 -0
  113. package/dist/cli/commands/repair/env.d.ts +7 -0
  114. package/dist/cli/commands/repair/env.js +50 -0
  115. package/dist/cli/commands/repair/index.d.ts +1 -9
  116. package/dist/cli/commands/repair/index.js +2 -54
  117. package/dist/cli/commands/repair/log.d.ts +17 -0
  118. package/dist/cli/commands/repair/log.js +82 -0
  119. package/dist/cli/commands/repair/printer.d.ts +32 -0
  120. package/dist/cli/commands/repair/printer.js +132 -0
  121. package/dist/cli/commands/repair/run.d.ts +33 -0
  122. package/dist/cli/commands/repair/run.js +133 -0
  123. package/dist/cli/commands/repair/types.d.ts +97 -9
  124. package/dist/cli/commands/repair/types.js +11 -7
  125. package/dist/cli/commands/resume.js +2 -2
  126. package/dist/cli/commands/sessions/index.d.ts +0 -4
  127. package/dist/cli/commands/sessions/index.js +3 -7
  128. package/dist/cli/commands/setup/index.d.ts +5 -0
  129. package/dist/cli/commands/setup/index.js +25 -1
  130. package/dist/cli/commands/shared-use.d.ts +5 -2
  131. package/dist/cli/commands/shared-use.js +11 -8
  132. package/dist/cli/commands/storage/contained.d.ts +3 -0
  133. package/dist/cli/commands/storage/contained.js +179 -0
  134. package/dist/cli/commands/storage/index.d.ts +2 -0
  135. package/dist/cli/commands/storage/index.js +2 -0
  136. package/dist/cli/commands/storage/offer.d.ts +3 -0
  137. package/dist/cli/commands/storage/offer.js +91 -0
  138. package/dist/cli/commands/storage/storage.d.ts +8 -0
  139. package/dist/cli/commands/storage/storage.js +179 -0
  140. package/dist/cli/commands/user-config.js +2 -2
  141. package/dist/cli/commands/vpn.d.ts +4 -0
  142. package/dist/cli/commands/vpn.js +91 -0
  143. package/dist/cli/commands/web.d.ts +4 -0
  144. package/dist/cli/commands/web.js +97 -0
  145. package/dist/cli/history.js +1 -1
  146. package/dist/cli/index.js +48 -4
  147. package/dist/cli/manifest.d.ts +339 -97
  148. package/dist/cli/manifest.js +222 -67
  149. package/dist/cli/menu/add-agent.d.ts +47 -0
  150. package/dist/cli/menu/add-agent.js +168 -0
  151. package/dist/cli/menu/apps.d.ts +38 -3
  152. package/dist/cli/menu/apps.js +80 -5
  153. package/dist/cli/menu/command-fields.d.ts +18 -0
  154. package/dist/cli/menu/command-fields.js +61 -0
  155. package/dist/cli/menu/command-form.d.ts +22 -0
  156. package/dist/cli/menu/command-form.js +169 -46
  157. package/dist/cli/menu/data-folder.d.ts +18 -0
  158. package/dist/cli/menu/data-folder.js +99 -0
  159. package/dist/cli/menu/io-menu.d.ts +29 -0
  160. package/dist/cli/menu/io-menu.js +126 -0
  161. package/dist/cli/menu/live.d.ts +27 -0
  162. package/dist/cli/menu/live.js +69 -0
  163. package/dist/cli/menu/memory.d.ts +19 -0
  164. package/dist/cli/menu/memory.js +53 -0
  165. package/dist/cli/menu/menu.d.ts +11 -2
  166. package/dist/cli/menu/menu.js +36 -15
  167. package/dist/cli/menu/pages/accounts-page.js +55 -24
  168. package/dist/cli/menu/pages/agents-page.d.ts +68 -0
  169. package/dist/cli/menu/pages/agents-page.js +345 -0
  170. package/dist/cli/menu/pages/apps-page.d.ts +3 -1
  171. package/dist/cli/menu/pages/apps-page.js +20 -4
  172. package/dist/cli/menu/pages/list-page.d.ts +43 -3
  173. package/dist/cli/menu/pages/list-page.js +146 -12
  174. package/dist/cli/menu/pages/maintenance-page.d.ts +9 -5
  175. package/dist/cli/menu/pages/maintenance-page.js +172 -85
  176. package/dist/cli/menu/pages/sandbox-page.d.ts +7 -6
  177. package/dist/cli/menu/pages/sandbox-page.js +117 -120
  178. package/dist/cli/menu/pages/scopes.d.ts +1 -1
  179. package/dist/cli/menu/pages/sessions-page.d.ts +6 -8
  180. package/dist/cli/menu/pages/sessions-page.js +22 -75
  181. package/dist/cli/menu/pages/settings-page.d.ts +10 -14
  182. package/dist/cli/menu/pages/settings-page.js +95 -102
  183. package/dist/cli/menu/render-view.d.ts +28 -0
  184. package/dist/cli/menu/render-view.js +112 -0
  185. package/dist/cli/menu/settings/ask-path.d.ts +14 -0
  186. package/dist/cli/menu/settings/ask-path.js +14 -0
  187. package/dist/cli/menu/settings/collections/collection-editor.d.ts +8 -2
  188. package/dist/cli/menu/settings/collections/collection-editor.js +12 -8
  189. package/dist/cli/menu/settings/collections/map-editor.js +5 -1
  190. package/dist/cli/menu/settings/collections/object-list-editor.js +2 -2
  191. package/dist/cli/menu/settings/collections/object-map-editor.js +2 -2
  192. package/dist/cli/menu/settings/collections/string-list-editor.d.ts +10 -1
  193. package/dist/cli/menu/settings/collections/string-list-editor.js +23 -0
  194. package/dist/cli/menu/settings/draft.d.ts +1 -1
  195. package/dist/cli/menu/settings/format.d.ts +1 -3
  196. package/dist/cli/menu/settings/format.js +6 -36
  197. package/dist/cli/menu/settings/index.d.ts +1 -3
  198. package/dist/cli/menu/settings/index.js +3 -3
  199. package/dist/cli/menu/settings/object-editor.d.ts +6 -2
  200. package/dist/cli/menu/settings/object-editor.js +15 -4
  201. package/dist/cli/menu/settings/share.d.ts +36 -0
  202. package/dist/cli/menu/settings/share.js +131 -0
  203. package/dist/cli/menu/settings/value-editor.d.ts +10 -1
  204. package/dist/cli/menu/settings/value-editor.js +99 -63
  205. package/dist/cli/menu/several.js +7 -5
  206. package/dist/cli/menu/share-settings.d.ts +21 -0
  207. package/dist/cli/menu/share-settings.js +112 -0
  208. package/dist/cli/menu/shell.d.ts +53 -10
  209. package/dist/cli/menu/shell.js +115 -10
  210. package/dist/cli/menu/views.d.ts +7 -0
  211. package/dist/cli/menu/views.js +11 -0
  212. package/dist/cli/menu/vpn-login.d.ts +16 -0
  213. package/dist/cli/menu/vpn-login.js +74 -0
  214. package/dist/cli/operations/handler.d.ts +6 -0
  215. package/dist/cli/operations/handler.js +61 -0
  216. package/dist/cli/operations/index.d.ts +4 -0
  217. package/dist/cli/operations/index.js +5 -0
  218. package/dist/cli/operations/input.d.ts +6 -0
  219. package/dist/cli/operations/input.js +37 -0
  220. package/dist/cli/operations/io-cli.d.ts +7 -0
  221. package/dist/cli/operations/io-cli.js +62 -0
  222. package/dist/cli/operations/spec.d.ts +18 -0
  223. package/dist/cli/operations/spec.js +108 -0
  224. package/dist/cli/output/colors.d.ts +2 -2
  225. package/dist/cli/output/colors.js +2 -11
  226. package/dist/cli/output/index.d.ts +1 -0
  227. package/dist/cli/output/index.js +1 -0
  228. package/dist/cli/output/print.d.ts +5 -1
  229. package/dist/cli/output/print.js +15 -4
  230. package/dist/cli/output/progress.d.ts +15 -0
  231. package/dist/cli/output/progress.js +44 -0
  232. package/dist/cli/output/render-view.d.ts +4 -0
  233. package/dist/cli/output/render-view.js +63 -0
  234. package/dist/cli/services/accounts-service.d.ts +2 -0
  235. package/dist/cli/services/accounts-service.js +2 -2
  236. package/dist/cli/services/agent-commands-service.d.ts +2 -0
  237. package/dist/cli/services/agent-commands-service.js +11 -2
  238. package/dist/cli/services/health-service.d.ts +0 -6
  239. package/dist/cli/services/health-service.js +5 -42
  240. package/dist/cli/services/index.d.ts +3 -1
  241. package/dist/cli/services/index.js +3 -1
  242. package/dist/cli/services/logs-service.js +4 -3
  243. package/dist/cli/services/migrate-service.js +1 -1
  244. package/dist/cli/services/update-service.d.ts +2 -0
  245. package/dist/cli/services/update-service.js +13 -6
  246. package/dist/cli/services/vpn-service.d.ts +28 -0
  247. package/dist/cli/services/vpn-service.js +46 -0
  248. package/dist/cli/services/web-service.d.ts +22 -0
  249. package/dist/cli/services/web-service.js +111 -0
  250. package/dist/cli/tui/app.d.ts +12 -4
  251. package/dist/cli/tui/app.js +38 -9
  252. package/dist/cli/tui/dialogs/path-listing.d.ts +43 -0
  253. package/dist/cli/tui/dialogs/path-listing.js +127 -0
  254. package/dist/cli/tui/dialogs/path-picker.d.ts +67 -0
  255. package/dist/cli/tui/dialogs/path-picker.js +423 -0
  256. package/dist/cli/tui/dialogs/text-screen.d.ts +6 -0
  257. package/dist/cli/tui/dialogs/text-screen.js +10 -3
  258. package/dist/cli/tui/frame.d.ts +7 -10
  259. package/dist/cli/tui/frame.js +19 -10
  260. package/dist/cli/tui/index.d.ts +4 -3
  261. package/dist/cli/tui/index.js +2 -1
  262. package/dist/cli/tui/list/list-screen.d.ts +28 -2
  263. package/dist/cli/tui/list/list-screen.js +130 -66
  264. package/dist/cli/tui/list/list-types.d.ts +10 -4
  265. package/dist/cli/tui/nav.d.ts +29 -0
  266. package/dist/cli/tui/nav.js +67 -0
  267. package/dist/cli/tui/terminal.d.ts +7 -0
  268. package/dist/cli/tui/terminal.js +30 -10
  269. package/dist/cli/validate.d.ts +1 -1
  270. package/dist/cli/validate.js +3 -3
  271. package/dist/cli/version.d.ts +2 -0
  272. package/dist/cli/version.js +11 -0
  273. package/dist/core/config/defaults.js +13 -1
  274. package/dist/core/config/loader.js +12 -2
  275. package/dist/core/local-config/overrides.js +1 -0
  276. package/dist/core/prompt.d.ts +19 -0
  277. package/dist/core/prompt.js +43 -3
  278. package/dist/core/schema/common.d.ts +6 -0
  279. package/dist/core/schema/common.js +8 -0
  280. package/dist/core/schema/config.d.ts +36 -0
  281. package/dist/core/schema/config.js +26 -2
  282. package/dist/core/schema/harness.d.ts +2 -0
  283. package/dist/core/schema/harness.js +13 -2
  284. package/dist/core/schema/index.d.ts +3 -1
  285. package/dist/core/schema/index.js +3 -1
  286. package/dist/core/schema/profile.d.ts +1 -0
  287. package/dist/core/schema/profile.js +3 -0
  288. package/dist/core/schema/redact.d.ts +13 -0
  289. package/dist/core/schema/redact.js +75 -0
  290. package/dist/core/schema/sandbox.d.ts +6 -0
  291. package/dist/core/schema/sandbox.js +21 -3
  292. package/dist/core/schema/vpn.d.ts +18 -0
  293. package/dist/core/schema/vpn.js +22 -0
  294. package/dist/core/schema/web.d.ts +6 -0
  295. package/dist/core/schema/web.js +14 -0
  296. package/dist/core/types.d.ts +44 -0
  297. package/dist/core/util/fs.d.ts +2 -0
  298. package/dist/core/util/fs.js +9 -0
  299. package/dist/core/util/index.d.ts +1 -1
  300. package/dist/core/util/index.js +1 -1
  301. package/dist/guest/agents/agent-files.d.ts +54 -0
  302. package/dist/guest/agents/agent-files.js +67 -0
  303. package/dist/guest/agents/agent-installer.js +2 -9
  304. package/dist/guest/agents/local-state.d.ts +14 -0
  305. package/dist/guest/agents/local-state.js +218 -0
  306. package/dist/guest/agents/sbx-agent.d.ts +2 -0
  307. package/dist/guest/agents/sbx-agent.js +35 -0
  308. package/dist/guest/boot/boot.d.ts +4 -0
  309. package/dist/guest/boot/boot.js +51 -11
  310. package/dist/guest/daemon/daemon.js +8 -1
  311. package/dist/guest/daemon/exec.js +2 -1
  312. package/dist/guest/daemon/idle-shutdown.js +2 -0
  313. package/dist/guest/daemon/sessions.d.ts +5 -0
  314. package/dist/guest/daemon/sessions.js +20 -3
  315. package/dist/guest/entries/agent.d.ts +1 -0
  316. package/dist/guest/entries/agent.js +10 -0
  317. package/dist/guest/entries/daemon.js +5 -0
  318. package/dist/guest/governor/decide.d.ts +61 -0
  319. package/dist/guest/governor/decide.js +182 -0
  320. package/dist/guest/governor/governor.d.ts +42 -0
  321. package/dist/guest/governor/governor.js +214 -0
  322. package/dist/guest/governor/index.d.ts +2 -0
  323. package/dist/guest/governor/index.js +2 -0
  324. package/dist/guest/runtime/csc.d.ts +2 -0
  325. package/dist/guest/runtime/csc.js +2 -0
  326. package/dist/guest/runtime/secrets.d.ts +12 -0
  327. package/dist/guest/runtime/secrets.js +63 -0
  328. package/dist/guest/sessions/viewer.js +3 -1
  329. package/dist/guest/setup/claude-profile.d.ts +2 -1
  330. package/dist/guest/setup/claude-profile.js +12 -1
  331. package/dist/guest/setup/environment.d.ts +6 -0
  332. package/dist/guest/setup/environment.js +56 -6
  333. package/dist/guest/setup/path-plan.d.ts +32 -0
  334. package/dist/guest/setup/path-plan.js +67 -0
  335. package/dist/guest/setup/shell-path.d.ts +1 -0
  336. package/dist/guest/setup/shell-path.js +22 -0
  337. package/dist/guest/toolchains/languages/python.js +1 -1
  338. package/dist/guest/toolchains/native/rust-extras.js +4 -2
  339. package/dist/guest/toolchains/runtimes.js +2 -2
  340. package/dist/guest/vpn/index.d.ts +1 -0
  341. package/dist/guest/vpn/index.js +1 -0
  342. package/dist/guest/vpn/openvpn.d.ts +9 -0
  343. package/dist/guest/vpn/openvpn.js +47 -0
  344. package/dist/guest/vpn/tunnel.d.ts +17 -0
  345. package/dist/guest/vpn/tunnel.js +78 -0
  346. package/dist/guest/vpn/vpn.d.ts +6 -0
  347. package/dist/guest/vpn/vpn.js +174 -0
  348. package/dist/guest/vpn/wireguard.d.ts +32 -0
  349. package/dist/guest/vpn/wireguard.js +132 -0
  350. package/dist/host/agent-commands/commands.d.ts +4 -0
  351. package/dist/host/agent-commands/commands.js +31 -7
  352. package/dist/host/audit/log.d.ts +1 -1
  353. package/dist/host/channel/attach.d.ts +6 -2
  354. package/dist/host/channel/attach.js +6 -3
  355. package/dist/host/channel/channel.d.ts +9 -0
  356. package/dist/host/channel/channel.js +30 -2
  357. package/dist/host/engines/engine.d.ts +12 -0
  358. package/dist/host/engines/engine.js +1 -0
  359. package/dist/host/engines/hcs/check.d.ts +25 -0
  360. package/dist/host/engines/hcs/check.js +95 -0
  361. package/dist/host/engines/hcs/documents.d.ts +44 -0
  362. package/dist/host/engines/hcs/documents.js +155 -0
  363. package/dist/host/engines/hcs/engine.d.ts +39 -0
  364. package/dist/host/engines/hcs/engine.js +171 -0
  365. package/dist/host/engines/hcs/helper.d.ts +43 -0
  366. package/dist/host/engines/hcs/helper.js +173 -0
  367. package/dist/host/engines/hcs/images.d.ts +37 -0
  368. package/dist/host/engines/hcs/images.js +152 -0
  369. package/dist/host/engines/index.d.ts +7 -0
  370. package/dist/host/engines/index.js +5 -0
  371. package/dist/host/engines/registry.d.ts +16 -0
  372. package/dist/host/engines/registry.js +30 -0
  373. package/dist/host/engines/types.d.ts +58 -0
  374. package/dist/host/engines/types.js +1 -0
  375. package/dist/host/engines/windows-sandbox/engine.d.ts +16 -0
  376. package/dist/host/engines/windows-sandbox/engine.js +63 -0
  377. package/dist/host/engines/windows-sandbox/wsb-text.d.ts +2 -0
  378. package/dist/host/engines/windows-sandbox/wsb-text.js +29 -0
  379. package/dist/host/health/acl-read.d.ts +17 -0
  380. package/dist/host/health/acl-read.js +45 -0
  381. package/dist/host/health/config-backup.d.ts +11 -0
  382. package/dist/host/health/config-backup.js +73 -0
  383. package/dist/host/health/index.d.ts +6 -0
  384. package/dist/host/health/index.js +7 -0
  385. package/dist/host/health/install-state.d.ts +33 -0
  386. package/dist/host/health/install-state.js +110 -0
  387. package/dist/host/health/path-copies.d.ts +32 -0
  388. package/dist/host/health/path-copies.js +82 -0
  389. package/dist/host/health/stale.d.ts +45 -0
  390. package/dist/host/health/stale.js +120 -0
  391. package/dist/host/health/system.d.ts +37 -0
  392. package/dist/host/health/system.js +87 -0
  393. package/dist/host/install/copies.d.ts +13 -0
  394. package/dist/host/install/copies.js +63 -0
  395. package/dist/host/install/index.d.ts +1 -0
  396. package/dist/host/install/index.js +1 -0
  397. package/dist/host/launch/generate.d.ts +5 -1
  398. package/dist/host/launch/generate.js +73 -7
  399. package/dist/host/launch/index.d.ts +3 -1
  400. package/dist/host/launch/index.js +3 -1
  401. package/dist/host/launch/launch-plan.d.ts +13 -0
  402. package/dist/host/launch/launch-plan.js +26 -0
  403. package/dist/host/launch/mappings.js +2 -1
  404. package/dist/host/launch/risk-notes.d.ts +10 -0
  405. package/dist/host/launch/risk-notes.js +18 -0
  406. package/dist/host/launch/session-file.d.ts +2 -0
  407. package/dist/host/launch/session-file.js +11 -2
  408. package/dist/host/launch/stage.js +1 -1
  409. package/dist/host/launch/wsb-file.d.ts +28 -4
  410. package/dist/host/launch/wsb-file.js +61 -42
  411. package/dist/host/life/crash-report.d.ts +27 -1
  412. package/dist/host/life/crash-report.js +173 -7
  413. package/dist/host/life/host-memory.d.ts +40 -0
  414. package/dist/host/life/host-memory.js +137 -0
  415. package/dist/host/life/index.d.ts +2 -0
  416. package/dist/host/life/index.js +2 -0
  417. package/dist/host/life/stop-events.d.ts +2 -0
  418. package/dist/host/life/stop-events.js +20 -3
  419. package/dist/host/life/stop-warning.js +1 -1
  420. package/dist/host/life/watchdog.d.ts +54 -0
  421. package/dist/host/life/watchdog.js +108 -0
  422. package/dist/host/migrate/backup.js +3 -0
  423. package/dist/host/migrate/migrations/config-file.d.ts +2 -0
  424. package/dist/host/migrate/migrations/config-file.js +7 -0
  425. package/dist/host/migrate/migrations/follow-machine-storage.js +9 -1
  426. package/dist/host/migrate/migrations/pin-storage-root.d.ts +4 -0
  427. package/dist/host/migrate/migrations/pin-storage-root.js +46 -0
  428. package/dist/host/migrate/migrations/unpin-config-defaults.js +4 -1
  429. package/dist/host/migrate/registry.js +2 -1
  430. package/dist/host/native.d.ts +3 -2
  431. package/dist/host/native.js +22 -3
  432. package/dist/host/profile/accounts.d.ts +25 -1
  433. package/dist/host/profile/accounts.js +96 -13
  434. package/dist/host/profile/agent-accounts.d.ts +5 -1
  435. package/dist/host/profile/agent-accounts.js +35 -5
  436. package/dist/host/profile/claude-login.js +3 -2
  437. package/dist/host/profile/index.d.ts +2 -1
  438. package/dist/host/profile/index.js +1 -0
  439. package/dist/host/profile/plugin-share.d.ts +26 -0
  440. package/dist/host/profile/plugin-share.js +146 -0
  441. package/dist/host/projects/join.d.ts +7 -1
  442. package/dist/host/projects/join.js +21 -4
  443. package/dist/host/projects/registry.d.ts +16 -10
  444. package/dist/host/projects/registry.js +74 -6
  445. package/dist/host/sandbox/contained-deps.d.ts +2 -0
  446. package/dist/host/sandbox/contained-deps.js +17 -0
  447. package/dist/host/sandbox/index.d.ts +2 -0
  448. package/dist/host/sandbox/index.js +2 -0
  449. package/dist/host/sandbox/platform.d.ts +4 -0
  450. package/dist/host/sandbox/platform.js +23 -4
  451. package/dist/host/sandbox/tasklist.d.ts +13 -0
  452. package/dist/host/sandbox/tasklist.js +47 -0
  453. package/dist/host/secrets/index.d.ts +2 -0
  454. package/dist/host/secrets/index.js +2 -0
  455. package/dist/host/secrets/launch-secrets.d.ts +17 -0
  456. package/dist/host/secrets/launch-secrets.js +94 -0
  457. package/dist/host/secrets/secret-store.d.ts +25 -0
  458. package/dist/host/secrets/secret-store.js +89 -0
  459. package/dist/host/sharing/acl.d.ts +16 -2
  460. package/dist/host/sharing/acl.js +35 -10
  461. package/dist/host/sharing/current.js +8 -3
  462. package/dist/host/sharing/doctor.d.ts +2 -0
  463. package/dist/host/sharing/doctor.js +44 -0
  464. package/dist/host/sharing/group-access.d.ts +6 -0
  465. package/dist/host/sharing/group-access.js +24 -0
  466. package/dist/host/sharing/index.d.ts +2 -1
  467. package/dist/host/sharing/index.js +2 -1
  468. package/dist/host/sharing/lifecycle.d.ts +8 -2
  469. package/dist/host/sharing/lifecycle.js +16 -7
  470. package/dist/host/storage/cleanup.d.ts +2 -0
  471. package/dist/host/storage/cleanup.js +2 -1
  472. package/dist/host/storage/contained/check.d.ts +9 -0
  473. package/dist/host/storage/contained/check.js +37 -0
  474. package/dist/host/storage/contained/contained-storage.d.ts +66 -0
  475. package/dist/host/storage/contained/contained-storage.js +168 -0
  476. package/dist/host/storage/contained/disk-port.d.ts +43 -0
  477. package/dist/host/storage/contained/disk-port.js +122 -0
  478. package/dist/host/storage/contained/index.d.ts +9 -0
  479. package/dist/host/storage/contained/index.js +8 -0
  480. package/dist/host/storage/contained/layout.d.ts +28 -0
  481. package/dist/host/storage/contained/layout.js +45 -0
  482. package/dist/host/storage/contained/resolve.d.ts +4 -0
  483. package/dist/host/storage/contained/resolve.js +30 -0
  484. package/dist/host/storage/contained/setting.d.ts +1 -0
  485. package/dist/host/storage/contained/setting.js +5 -0
  486. package/dist/host/storage/contained/state.d.ts +89 -0
  487. package/dist/host/storage/contained/state.js +166 -0
  488. package/dist/host/storage/contained/transfer.d.ts +24 -0
  489. package/dist/host/storage/contained/transfer.js +121 -0
  490. package/dist/host/storage/history.d.ts +21 -0
  491. package/dist/host/storage/history.js +49 -0
  492. package/dist/host/storage/index.d.ts +6 -0
  493. package/dist/host/storage/index.js +6 -0
  494. package/dist/host/storage/move.d.ts +95 -0
  495. package/dist/host/storage/move.js +384 -0
  496. package/dist/host/storage/offer.d.ts +11 -0
  497. package/dist/host/storage/offer.js +36 -0
  498. package/dist/host/storage/providers/contained.d.ts +15 -0
  499. package/dist/host/storage/providers/contained.js +39 -0
  500. package/dist/host/storage/providers/folder.d.ts +12 -0
  501. package/dist/host/storage/providers/folder.js +20 -0
  502. package/dist/host/storage/providers/index.d.ts +4 -0
  503. package/dist/host/storage/providers/index.js +3 -0
  504. package/dist/host/storage/providers/registry.d.ts +9 -0
  505. package/dist/host/storage/providers/registry.js +14 -0
  506. package/dist/host/storage/providers/types.d.ts +33 -0
  507. package/dist/host/storage/providers/types.js +1 -0
  508. package/dist/host/storage/root.d.ts +18 -0
  509. package/dist/host/storage/root.js +77 -0
  510. package/dist/host/tools/conpty.js +3 -2
  511. package/dist/host/tools/windows-terminal.d.ts +2 -0
  512. package/dist/host/tools/windows-terminal.js +31 -12
  513. package/dist/host/update/index.d.ts +1 -1
  514. package/dist/host/update/index.js +1 -1
  515. package/dist/host/update/notice.d.ts +2 -0
  516. package/dist/host/update/notice.js +13 -1
  517. package/dist/host/update/update-state.d.ts +6 -0
  518. package/dist/host/update/update-state.js +2 -0
  519. package/dist/host/update/updater.d.ts +19 -0
  520. package/dist/host/update/updater.js +88 -12
  521. package/dist/host/vpn/index.d.ts +4 -0
  522. package/dist/host/vpn/index.js +4 -0
  523. package/dist/host/vpn/login.d.ts +24 -0
  524. package/dist/host/vpn/login.js +79 -0
  525. package/dist/host/vpn/nordvpn.d.ts +21 -0
  526. package/dist/host/vpn/nordvpn.js +77 -0
  527. package/dist/host/vpn/prepare.d.ts +19 -0
  528. package/dist/host/vpn/prepare.js +138 -0
  529. package/dist/host/vpn/status.d.ts +12 -0
  530. package/dist/host/vpn/status.js +53 -0
  531. package/dist/host/web/auth.d.ts +38 -0
  532. package/dist/host/web/auth.js +96 -0
  533. package/dist/host/web/backend.d.ts +14 -0
  534. package/dist/host/web/backend.js +1 -0
  535. package/dist/host/web/bridge.d.ts +27 -0
  536. package/dist/host/web/bridge.js +144 -0
  537. package/dist/host/web/browser.d.ts +3 -0
  538. package/dist/host/web/browser.js +23 -0
  539. package/dist/host/web/control.d.ts +17 -0
  540. package/dist/host/web/control.js +67 -0
  541. package/dist/host/web/index.d.ts +10 -0
  542. package/dist/host/web/index.js +9 -0
  543. package/dist/host/web/rpc.d.ts +24 -0
  544. package/dist/host/web/rpc.js +149 -0
  545. package/dist/host/web/runner.d.ts +16 -0
  546. package/dist/host/web/runner.js +44 -0
  547. package/dist/host/web/server.d.ts +47 -0
  548. package/dist/host/web/server.js +238 -0
  549. package/dist/host/web/state.d.ts +20 -0
  550. package/dist/host/web/state.js +41 -0
  551. package/dist/host/web/static-files.d.ts +13 -0
  552. package/dist/host/web/static-files.js +57 -0
  553. package/dist/runtime/agent.js +27675 -0
  554. package/dist/runtime/daemon.js +1950 -1122
  555. package/dist/runtime/db.js +302 -111
  556. package/dist/runtime/main.js +1560 -275
  557. package/dist/runtime/netproxy.js +168 -8
  558. package/dist/runtime/view.js +186 -13
  559. package/dist/selftest/accounts.test.js +40 -0
  560. package/dist/selftest/agent-paths.test.d.ts +2 -0
  561. package/dist/selftest/agent-paths.test.js +125 -0
  562. package/dist/selftest/app.test.d.ts +2 -0
  563. package/dist/selftest/app.test.js +324 -0
  564. package/dist/selftest/channel.test.js +18 -0
  565. package/dist/selftest/cli.test.js +35 -4
  566. package/dist/selftest/config.test.js +59 -0
  567. package/dist/selftest/contained.test.d.ts +2 -0
  568. package/dist/selftest/contained.test.js +544 -0
  569. package/dist/selftest/credentials.test.d.ts +2 -0
  570. package/dist/selftest/credentials.test.js +198 -0
  571. package/dist/selftest/engine.test.d.ts +2 -0
  572. package/dist/selftest/engine.test.js +127 -0
  573. package/dist/selftest/generate.test.js +1 -1
  574. package/dist/selftest/hcs.test.d.ts +2 -0
  575. package/dist/selftest/hcs.test.js +482 -0
  576. package/dist/selftest/health.test.d.ts +2 -0
  577. package/dist/selftest/health.test.js +470 -0
  578. package/dist/selftest/heavy-load.test.d.ts +2 -0
  579. package/dist/selftest/heavy-load.test.js +329 -0
  580. package/dist/selftest/host-sim.test.js +2 -0
  581. package/dist/selftest/index.js +31 -0
  582. package/dist/selftest/layout.test.js +14 -0
  583. package/dist/selftest/menu-perf.test.d.ts +2 -0
  584. package/dist/selftest/menu-perf.test.js +248 -0
  585. package/dist/selftest/menu-screens.d.ts +7 -0
  586. package/dist/selftest/menu-screens.js +68 -17
  587. package/dist/selftest/menu.test.js +603 -22
  588. package/dist/selftest/migrate.test.js +1 -1
  589. package/dist/selftest/personalization.test.js +3 -1
  590. package/dist/selftest/projects.test.js +39 -1
  591. package/dist/selftest/shared-use.test.js +64 -2
  592. package/dist/selftest/sharing.test.js +50 -1
  593. package/dist/selftest/storage.test.d.ts +2 -0
  594. package/dist/selftest/storage.test.js +363 -0
  595. package/dist/selftest/support/engine-cases.d.ts +8 -0
  596. package/dist/selftest/support/engine-cases.js +65 -0
  597. package/dist/selftest/support/engine-golden.d.ts +3 -0
  598. package/dist/selftest/support/engine-golden.js +66 -0
  599. package/dist/selftest/support/fixtures.d.ts +20 -0
  600. package/dist/selftest/support/hcs-probes.d.ts +17 -0
  601. package/dist/selftest/support/hcs-probes.js +41 -0
  602. package/dist/selftest/support/releases.js +1 -1
  603. package/dist/selftest/toolchains.test.js +21 -0
  604. package/dist/selftest/update-service.test.js +87 -3
  605. package/dist/selftest/vpn.test.d.ts +2 -0
  606. package/dist/selftest/vpn.test.js +412 -0
  607. package/dist/selftest/web.test.d.ts +2 -0
  608. package/dist/selftest/web.test.js +402 -0
  609. package/dist/shared/apps/catalogue.js +31 -0
  610. package/dist/shared/channel/index.d.ts +1 -0
  611. package/dist/shared/channel/index.js +1 -0
  612. package/dist/shared/channel/run-dir.d.ts +9 -1
  613. package/dist/shared/channel/run-dir.js +18 -1
  614. package/dist/shared/channel/schema.d.ts +53 -0
  615. package/dist/shared/channel/schema.js +38 -0
  616. package/dist/shared/channel/secrets.d.ts +29 -0
  617. package/dist/shared/channel/secrets.js +50 -0
  618. package/dist/shared/memory/index.d.ts +1 -0
  619. package/dist/shared/memory/index.js +1 -0
  620. package/dist/shared/memory/policy.d.ts +33 -0
  621. package/dist/shared/memory/policy.js +55 -0
  622. package/dist/shared/pty/output-filter.d.ts +14 -1
  623. package/dist/shared/pty/output-filter.js +22 -4
  624. package/dist/shared/pty/terminal.d.ts +4 -1
  625. package/dist/shared/pty/terminal.js +4 -2
  626. package/dist/shared/system.d.ts +1 -0
  627. package/dist/shared/system.js +1 -0
  628. package/dist/shared/vpn/download.d.ts +29 -0
  629. package/dist/shared/vpn/download.js +30 -0
  630. package/dist/shared/vpn/kill-switch.d.ts +18 -0
  631. package/dist/shared/vpn/kill-switch.js +81 -0
  632. package/dist/shared/vpn/ovpn.d.ts +23 -0
  633. package/dist/shared/vpn/ovpn.js +244 -0
  634. package/dist/shared/vpn/wireguard.d.ts +51 -0
  635. package/dist/shared/vpn/wireguard.js +227 -0
  636. package/dist/shared/web/index.d.ts +1 -0
  637. package/dist/shared/web/index.js +1 -0
  638. package/dist/shared/web/protocol.d.ts +61 -0
  639. package/dist/shared/web/protocol.js +35 -0
  640. package/dist/sync/sync-cycle.js +9 -5
  641. package/dist/sync/sync-state.d.ts +1 -0
  642. package/dist/sync/sync-state.js +1 -0
  643. package/dist/sync/watcher.d.ts +13 -0
  644. package/dist/sync/watcher.js +102 -3
  645. package/dist/web/index.html +14 -0
  646. package/dist/web/main-NRRS5O6Z.js +157 -0
  647. package/dist/web/main-T5DMCHYV.css +1 -0
  648. package/native/csharp/FolderSecurity.cs +29 -0
  649. package/native/csharp/HcsHost/AssemblyInfo.cs +14 -0
  650. package/native/csharp/HcsHost/Guard.cs +100 -0
  651. package/native/csharp/HcsHost/Hcs.cs +256 -0
  652. package/native/csharp/HcsHost/Json.cs +78 -0
  653. package/native/csharp/HcsHost/Program.cs +185 -0
  654. package/native/csharp/HcsHost/VirtualDisk.cs +95 -0
  655. package/native/csharp/HostTools/AssemblyInfo.cs +14 -0
  656. package/native/csharp/HostTools/MemoryStatus.cs +107 -0
  657. package/native/csharp/HostTools/Program.cs +58 -17
  658. package/native/scripts/check-contained.ps1 +28 -0
  659. package/native/scripts/contained-common.ps1 +241 -0
  660. package/native/scripts/dismount-contained.ps1 +66 -0
  661. package/native/scripts/memory-status.ps1 +34 -0
  662. package/native/scripts/mount-contained.ps1 +139 -0
  663. package/native/scripts/protect-data.ps1 +29 -0
  664. package/native/scripts/read-folder-sddl.ps1 +10 -0
  665. package/native/scripts/run-elevated.ps1 +17 -4
  666. package/native/scripts/set-folder-access.ps1 +49 -7
  667. package/native/scripts/stop-events.ps1 +23 -8
  668. package/node_modules/ws/LICENSE +20 -0
  669. package/node_modules/ws/README.md +548 -0
  670. package/node_modules/ws/browser.js +8 -0
  671. package/node_modules/ws/index.js +22 -0
  672. package/node_modules/ws/lib/buffer-util.js +131 -0
  673. package/node_modules/ws/lib/constants.js +19 -0
  674. package/node_modules/ws/lib/event-target.js +292 -0
  675. package/node_modules/ws/lib/extension.js +203 -0
  676. package/node_modules/ws/lib/limiter.js +55 -0
  677. package/node_modules/ws/lib/permessage-deflate.js +530 -0
  678. package/node_modules/ws/lib/receiver.js +743 -0
  679. package/node_modules/ws/lib/sender.js +607 -0
  680. package/node_modules/ws/lib/stream.js +161 -0
  681. package/node_modules/ws/lib/subprotocol.js +62 -0
  682. package/node_modules/ws/lib/validation.js +152 -0
  683. package/node_modules/ws/lib/websocket-server.js +562 -0
  684. package/node_modules/ws/lib/websocket.js +1421 -0
  685. package/node_modules/ws/package.json +74 -0
  686. package/node_modules/ws/wrapper.mjs +21 -0
  687. package/package.json +22 -5
  688. package/sandbox/csharp/EnvBroadcast.cs +33 -0
  689. package/sandbox/csharp/MemGov.cs +398 -0
  690. package/sandbox/csharp/PathSync.cs +90 -0
  691. package/sandbox/csharp/PtyHost.cs +111 -5
  692. package/sandbox/scripts/install-shell-path.ps1 +73 -0
  693. package/sandbox/scripts/set-machine-environment.ps1 +37 -4
  694. package/schemas/config.schema.json +136 -7
  695. package/schemas/sandbox-config.schema.json +17 -4
  696. package/dist/cli/commands/repair/checks.d.ts +0 -2
  697. package/dist/cli/commands/repair/checks.js +0 -246
  698. package/dist/cli/commands/sessions/control.d.ts +0 -4
  699. package/dist/cli/commands/sessions/control.js +0 -66
  700. package/dist/cli/commands/sessions/list.d.ts +0 -2
  701. package/dist/cli/commands/sessions/list.js +0 -45
  702. package/dist/cli/commands/sessions/status.d.ts +0 -2
  703. package/dist/cli/commands/sessions/status.js +0 -93
  704. package/dist/cli/commands/sessions/window.d.ts +0 -3
  705. package/dist/cli/commands/sessions/window.js +0 -18
  706. package/dist/cli/menu/pages/start-page.d.ts +0 -43
  707. package/dist/cli/menu/pages/start-page.js +0 -192
  708. package/dist/cli/tui/tab-bar.d.ts +0 -9
  709. package/dist/cli/tui/tab-bar.js +0 -33
@@ -0,0 +1,112 @@
1
+ // The "Export settings…" and "Import settings…" rows in Settings > General: pick a file, then (for an import) read the
2
+ // diff of what would change and say yes once. Same rules as sandbox config export / import.
3
+ import fs from 'node:fs';
4
+ import path from 'node:path';
5
+ import { loadConfig } from '../../core/config/index.js';
6
+ import { errMsg } from '../../core/util/index.js';
7
+ import { applyImport, DEFAULT_EXPORT, readImport, writeExport } from '../commands/maintenance/config-share.js';
8
+ import { Theme } from '../tui/index.js';
9
+ import { askPath } from './settings/ask-path.js';
10
+ import { diffText, skippedLine } from './settings/index.js';
11
+ /** The rows' ids in the settings list. */
12
+ export const EXPORT_SETTINGS = '@export-settings';
13
+ export const IMPORT_SETTINGS = '@import-settings';
14
+ export function shareSettingsRows() {
15
+ return [
16
+ {
17
+ value: EXPORT_SETTINGS,
18
+ label: 'Export settings…',
19
+ hint: '.json',
20
+ description: 'Write the settings you changed to a .json file you can share with a team. Secrets, the data folder and folders or files of this PC are left out.',
21
+ },
22
+ {
23
+ value: IMPORT_SETTINGS,
24
+ label: 'Import settings…',
25
+ hint: '.json',
26
+ description: 'Read a settings file someone shared, see what it would change, and apply it once you say yes. Secrets, the data folder and paths in it are never taken.',
27
+ },
28
+ ];
29
+ }
30
+ export class ShareSettingsFlow {
31
+ app;
32
+ ctx;
33
+ constructor(app, ctx) {
34
+ this.app = app;
35
+ this.ctx = ctx;
36
+ }
37
+ /** Your settings as they are on disk now (the menu may have saved changes since it started). */
38
+ fresh() {
39
+ return { ...this.ctx, loaded: loadConfig(this.ctx.loaded.configPath ?? undefined) };
40
+ }
41
+ /** Returns the notice to show (undefined when cancelled). */
42
+ async export() {
43
+ const where = ['Settings', 'Export settings'];
44
+ try {
45
+ const file = await askPath(this.app, {
46
+ path: where,
47
+ title: 'Where to write the settings file',
48
+ about: ['Only what differs from the defaults is written; secrets and paths of this PC are left out.'],
49
+ initial: path.resolve(DEFAULT_EXPORT),
50
+ kind: 'file',
51
+ validate: (p) => (p.toLowerCase().endsWith('.json') ? true : 'The file name should end in .json.'),
52
+ });
53
+ if (!file)
54
+ return undefined;
55
+ const exists = path.resolve(file);
56
+ const replace = fs.existsSync(exists);
57
+ if (replace &&
58
+ !(await this.app.confirm({ path: where, question: exists + ' exists. Replace it?', initial: false })))
59
+ return undefined;
60
+ const skipped = writeExport(this.fresh(), file, false, replace);
61
+ return (Theme.ok(Theme.glyph.ok + ' Wrote ' + exists + '.') +
62
+ (skipped.length ? Theme.muted(' Left out: ' + skipped.join(', ') + '.') : ''));
63
+ }
64
+ catch (e) {
65
+ return Theme.error(Theme.glyph.cross + ' ' + errMsg(e));
66
+ }
67
+ }
68
+ async import() {
69
+ const where = ['Settings', 'Import settings'];
70
+ try {
71
+ const file = await askPath(this.app, {
72
+ path: where,
73
+ title: 'Which settings file',
74
+ about: ['A file made by Export settings (or sandbox config export).'],
75
+ kind: 'file',
76
+ });
77
+ if (!file)
78
+ return undefined;
79
+ const ctx = this.fresh();
80
+ const plan = readImport(ctx, file);
81
+ const lines = [
82
+ ...(plan.changes.length
83
+ ? [
84
+ plan.changes.length + ' setting' + (plan.changes.length === 1 ? '' : 's') + ' would change:',
85
+ '',
86
+ ...diffText(plan.lines),
87
+ ]
88
+ : ['Nothing to change: your settings already match the file.']),
89
+ ...(plan.skipped.length
90
+ ? ['', 'Not imported (never taken from a file):', ...plan.skipped.map((s) => skippedLine(s))]
91
+ : []),
92
+ ];
93
+ if (!plan.changes.length) {
94
+ await this.app.message({ path: where, lines });
95
+ return Theme.muted('Nothing changed.');
96
+ }
97
+ const yes = await this.app.confirm({
98
+ path: where,
99
+ question: 'Change your settings like this?',
100
+ about: lines,
101
+ initial: false,
102
+ });
103
+ if (!yes)
104
+ return Theme.muted('Nothing changed.');
105
+ const n = applyImport(ctx, plan);
106
+ return Theme.ok(Theme.glyph.ok + ' Imported ' + n + ' setting' + (n === 1 ? '' : 's') + '.');
107
+ }
108
+ catch (e) {
109
+ return Theme.error(Theme.glyph.cross + ' ' + errMsg(e));
110
+ }
111
+ }
112
+ }
@@ -1,4 +1,4 @@
1
- import type { App, FrameParts, Key, Screen, Size, Step, TabsState } from '../tui/index.js';
1
+ import type { App, Category, FrameParts, Key, NavState, Screen, Size, Step } from '../tui/index.js';
2
2
  import type { Draft, DraftResult } from './settings/draft.js';
3
3
  /** Why the shell closed. */
4
4
  export type ShellExit = {
@@ -14,20 +14,45 @@ export type ShellExit = {
14
14
  kind: 'view';
15
15
  file: string;
16
16
  };
17
- /** One tab. */
17
+ /** Where one section was left: its open category and its search. */
18
+ export interface ScreenView {
19
+ readonly category?: string;
20
+ readonly search?: string;
21
+ }
22
+ /** Which section the menu shows, and where each section was left (by section name). */
23
+ export interface MenuView {
24
+ readonly section: number;
25
+ readonly screens: Readonly<Record<string, ScreenView>>;
26
+ }
27
+ /** One section of the menu. */
18
28
  export interface Page {
19
29
  readonly label: string;
20
- /** This page stages changes in the Draft (its tab is marked while something is unsaved). */
30
+ /** This page stages changes in the Draft (its section is marked while something is unsaved). */
21
31
  readonly stages: boolean;
22
- /** Typing goes into a search box: digits are text, not tab numbers. */
32
+ /** Typing goes into a search box: digits are text, not section numbers. */
23
33
  readonly capturing: boolean;
24
- /** The tab was opened (or the shell came back from a command): load what it shows again. */
34
+ /** The categories listed under the section while it is open (none: the section is one list). */
35
+ categories(): readonly Category[];
36
+ /** The id of the open category. */
37
+ readonly category: string | undefined;
38
+ /** The data is still loading: its categories are not known yet (a category asked for opens when they are). */
39
+ readonly loading?: boolean;
40
+ /** The search typed in the list ('' or missing: none). */
41
+ readonly search?: string;
42
+ /** Types a search into the list (the menu opens on the one it was left on). */
43
+ restoreSearch?(text: string): void;
44
+ /** Opens a category (the navigation moved onto it). */
45
+ selectCategory(id: string): Promise<void>;
46
+ /** Whether the list has the keyboard (its highlight is softer while the navigation has it). */
47
+ setFocus(list: boolean): void;
48
+ /** The section was opened (or the shell came back from a command): load what it shows again. */
25
49
  open(): Promise<void>;
26
50
  render(size: Size): FrameParts;
51
+ /** A `quit` from the page means "Esc with nothing left to close": the shell moves to the navigation. */
27
52
  handle(key: Key): Promise<Step<ShellExit>> | Step<ShellExit>;
28
53
  }
29
- /** The tab names, in order. Number keys 1-7 open them. */
30
- export declare const TAB_LABELS: readonly ["Start", "Sessions", "Sandbox", "Apps", "Settings", "Accounts", "Maintenance"];
54
+ /** The section names, in order. Number keys 1-7 open them. */
55
+ export declare const SECTION_LABELS: readonly ["Agents", "Sessions", "Sandbox", "Apps", "Settings", "Accounts", "Maintenance"];
31
56
  export declare class Shell implements Screen<ShellExit> {
32
57
  private readonly app;
33
58
  readonly pages: readonly Page[];
@@ -35,20 +60,38 @@ export declare class Shell implements Screen<ShellExit> {
35
60
  /** Told after a save (the menu applies settings that act on this PC) and returns a note to add. */
36
61
  private readonly afterSave;
37
62
  private active;
63
+ private focus;
38
64
  private notice;
65
+ /** Where each section was left, by name; a section takes its entry the first time it opens in this shell. */
66
+ private readonly screens;
67
+ private readonly restored;
39
68
  constructor(app: App, pages: readonly Page[], draft: Draft,
40
69
  /** Told after a save (the menu applies settings that act on this PC) and returns a note to add. */
41
70
  afterSave?: (result: DraftResult) => string | undefined);
42
71
  get page(): Page;
43
- tabs(): TabsState;
44
- /** Opens a tab by index (loads its data). */
72
+ /** Which pane has the keyboard. */
73
+ get focused(): 'nav' | 'list';
74
+ nav(): NavState;
75
+ /** Notes where the open section is (its category and search). */
76
+ private remember;
77
+ /** The section that is open and where every section was left (the menu opens there again, also in a later run). */
78
+ view(): MenuView;
79
+ /** Opens the section a view names and puts each section back where it was (what is gone is ignored). */
80
+ restore(view: MenuView): Promise<void>;
81
+ /** Opens a section by index (loads its data); the first time, it goes back to the category and search it had. */
45
82
  openTab(index: number): Promise<void>;
46
- /** Loads the open tab again (after a command ran). */
83
+ /** Puts the keyboard in the navigation or in the list. */
84
+ setFocus(focus: 'nav' | 'list'): void;
85
+ /** Loads the open section again (after a command ran). */
47
86
  reload(): Promise<void>;
48
87
  render(size: Size): FrameParts;
49
88
  /** Writes the staged changes; the notice says what happened. */
50
89
  save(): string;
51
90
  handle(key: Key): Promise<Step<ShellExit>>;
91
+ /** A key while the navigation has the keyboard. */
92
+ private navKey;
93
+ /** One stop up or down the tree: the categories of the open section, then the next section. */
94
+ private move;
52
95
  /** Leaving with unsaved changes asks what to do with them. */
53
96
  private leave;
54
97
  }
@@ -1,13 +1,24 @@
1
1
  import { Theme } from '../tui/index.js';
2
- /** The tab names, in order. Number keys 1-7 open them. */
3
- export const TAB_LABELS = ['Start', 'Sessions', 'Sandbox', 'Apps', 'Settings', 'Accounts', 'Maintenance'];
2
+ /** The section names, in order. Number keys 1-7 open them. */
3
+ export const SECTION_LABELS = ['Agents', 'Sessions', 'Sandbox', 'Apps', 'Settings', 'Accounts', 'Maintenance'];
4
+ const NAV_KEYS = [
5
+ ['↑↓', 'move', 1],
6
+ ['→', 'open', 1],
7
+ ['1-7', 'jump', 4],
8
+ ['/', 'search', 6],
9
+ ['esc', 'quit', 0],
10
+ ];
4
11
  export class Shell {
5
12
  app;
6
13
  pages;
7
14
  draft;
8
15
  afterSave;
9
16
  active = 0;
17
+ focus = 'list';
10
18
  notice;
19
+ /** Where each section was left, by name; a section takes its entry the first time it opens in this shell. */
20
+ screens = new Map();
21
+ restored = new Set();
11
22
  constructor(app, pages, draft,
12
23
  /** Told after a save (the menu applies settings that act on this PC) and returns a note to add. */
13
24
  afterSave = () => undefined) {
@@ -15,24 +26,72 @@ export class Shell {
15
26
  this.pages = pages;
16
27
  this.draft = draft;
17
28
  this.afterSave = afterSave;
18
- app.tabs = () => this.tabs();
29
+ app.nav = () => this.nav();
19
30
  }
20
31
  get page() {
21
32
  return this.pages[this.active];
22
33
  }
23
- tabs() {
34
+ /** Which pane has the keyboard. */
35
+ get focused() {
36
+ return this.focus;
37
+ }
38
+ nav() {
24
39
  const unsaved = this.draft.count() > 0;
40
+ const current = this.page.category;
25
41
  return {
26
- tabs: this.pages.map((p) => ({ label: p.label, marked: p.stages && unsaved })),
42
+ sections: this.pages.map((p, i) => ({
43
+ label: p.label,
44
+ marked: p.stages && unsaved,
45
+ categories: i === this.active ? p.categories().map((c) => ({ label: c.label, current: c.id === current })) : [],
46
+ })),
27
47
  active: this.active,
48
+ focused: this.focus === 'nav',
28
49
  };
29
50
  }
30
- /** Opens a tab by index (loads its data). */
51
+ /** Notes where the open section is (its category and search). */
52
+ remember() {
53
+ // A section that was never opened here keeps what the last run knew about it.
54
+ if (!this.restored.has(this.active))
55
+ return;
56
+ const { category, search } = this.page;
57
+ if (category || search)
58
+ this.screens.set(this.page.label, { category, search: search || undefined });
59
+ else
60
+ this.screens.delete(this.page.label);
61
+ }
62
+ /** The section that is open and where every section was left (the menu opens there again, also in a later run). */
63
+ view() {
64
+ this.remember();
65
+ return { section: this.active, screens: Object.fromEntries(this.screens) };
66
+ }
67
+ /** Opens the section a view names and puts each section back where it was (what is gone is ignored). */
68
+ async restore(view) {
69
+ this.restored.clear();
70
+ for (const [label, screen] of Object.entries(view.screens))
71
+ this.screens.set(label, screen);
72
+ await this.openTab(view.section);
73
+ }
74
+ /** Opens a section by index (loads its data); the first time, it goes back to the category and search it had. */
31
75
  async openTab(index) {
76
+ this.remember();
32
77
  this.active = Math.max(0, Math.min(this.pages.length - 1, index));
78
+ this.page.setFocus(this.focus === 'list');
33
79
  await this.page.open();
80
+ if (this.restored.has(this.active))
81
+ return;
82
+ this.restored.add(this.active);
83
+ const wanted = this.screens.get(this.page.label);
84
+ if (wanted?.category && (this.page.loading || this.page.categories().some((c) => c.id === wanted.category)))
85
+ await this.page.selectCategory(wanted.category);
86
+ if (wanted?.search)
87
+ this.page.restoreSearch?.(wanted.search);
34
88
  }
35
- /** Loads the open tab again (after a command ran). */
89
+ /** Puts the keyboard in the navigation or in the list. */
90
+ setFocus(focus) {
91
+ this.focus = focus;
92
+ this.page.setFocus(focus === 'list');
93
+ }
94
+ /** Loads the open section again (after a command ran). */
36
95
  reload() {
37
96
  return this.page.open();
38
97
  }
@@ -40,11 +99,14 @@ export class Shell {
40
99
  const parts = this.page.render(size);
41
100
  const unsaved = this.draft.count();
42
101
  const status = parts.status ?? this.app.status();
102
+ const category = this.page.categories().find((c) => c.id === this.page.category);
103
+ const keys = this.focus === 'nav' ? NAV_KEYS : parts.keys;
43
104
  return {
44
105
  ...parts,
106
+ path: parts.path.length ? parts.path : [this.page.label, ...(category ? [category.label] : [])],
45
107
  status: unsaved ? Theme.changed('unsaved: ' + unsaved) + ' ' + status : status,
46
108
  notice: this.notice ?? parts.notice,
47
- keys: unsaved ? [['ctrl+s', 'save (' + unsaved + ')', 0], ...parts.keys] : parts.keys,
109
+ keys: unsaved ? [['ctrl+s', 'save (' + unsaved + ')', 0], ...keys] : keys,
48
110
  };
49
111
  }
50
112
  /** Writes the staged changes; the notice says what happened. */
@@ -75,11 +137,54 @@ export class Shell {
75
137
  await this.openTab(index);
76
138
  return;
77
139
  }
140
+ if (this.focus === 'nav')
141
+ return this.navKey(key);
78
142
  const step = await this.page.handle(key);
79
- if (step && step.done.kind === 'quit')
80
- return this.leave();
143
+ if (step && step.done.kind === 'quit') {
144
+ // Esc (or Left) in the list: nothing left to close there, so go to the navigation.
145
+ this.setFocus('nav');
146
+ return;
147
+ }
81
148
  return step;
82
149
  }
150
+ /** A key while the navigation has the keyboard. */
151
+ async navKey(key) {
152
+ if (key.name === 'up' || key.name === 'down') {
153
+ await this.move(key.name === 'up' ? -1 : 1);
154
+ return;
155
+ }
156
+ if (key.name === 'right' || key.name === 'return') {
157
+ this.setFocus('list');
158
+ return;
159
+ }
160
+ if (key.name === 'escape')
161
+ return this.leave();
162
+ // The scopes of Settings and Apps switch from anywhere; "/" starts a search in the list.
163
+ if (key.name === 'tab')
164
+ return this.page.handle(key);
165
+ if (key.text === '/') {
166
+ this.setFocus('list');
167
+ return this.page.handle(key);
168
+ }
169
+ return;
170
+ }
171
+ /** One stop up or down the tree: the categories of the open section, then the next section. */
172
+ async move(by) {
173
+ const categories = this.page.categories();
174
+ const at = categories.findIndex((c) => c.id === this.page.category);
175
+ const next = at + by;
176
+ if (categories.length && next >= 0 && next < categories.length) {
177
+ await this.page.selectCategory(categories[next].id);
178
+ return;
179
+ }
180
+ const section = this.active + by;
181
+ if (section < 0 || section >= this.pages.length)
182
+ return;
183
+ await this.openTab(section);
184
+ const entered = this.page.categories();
185
+ if (entered.length)
186
+ await this.page.selectCategory(entered[by === 1 ? 0 : entered.length - 1].id);
187
+ }
83
188
  /** Leaving with unsaved changes asks what to do with them. */
84
189
  async leave() {
85
190
  const count = this.draft.count();
@@ -0,0 +1,7 @@
1
+ import type { AnyView } from '../../app/kernel/index.js';
2
+ import type { SECTION_LABELS } from './shell.js';
3
+ export interface MenuViewPlace {
4
+ readonly view: AnyView;
5
+ readonly section: (typeof SECTION_LABELS)[number];
6
+ }
7
+ export declare const MENU_VIEWS: readonly MenuViewPlace[];
@@ -0,0 +1,11 @@
1
+ // The shared core's views the menu shows, and in which section (the parity self-test reads this list: an operation or
2
+ // query is reachable in the menu when a view here offers it). Settings is drawn by its own page over the same rows,
3
+ // because the menu stages changes until Ctrl+S.
4
+ import { sandboxView } from '../../app/features/sandbox/index.js';
5
+ import { sessionsView } from '../../app/features/sessions/index.js';
6
+ import { settingsView } from '../../app/features/settings/index.js';
7
+ export const MENU_VIEWS = [
8
+ { view: sessionsView, section: 'Sessions' },
9
+ { view: sandboxView, section: 'Sandbox' },
10
+ { view: settingsView, section: 'Settings' },
11
+ ];
@@ -0,0 +1,16 @@
1
+ import type { Context } from '../commands/context.js';
2
+ import { type App } from '../tui/index.js';
3
+ /** The row's id in the settings list. */
4
+ export declare const VPN_LOGIN = "@vpn-login";
5
+ export declare function vpnLoginRow(ctx: Context): {
6
+ label: string;
7
+ hint: string;
8
+ description: string;
9
+ };
10
+ export declare class VpnLoginFlow {
11
+ private readonly app;
12
+ private readonly ctx;
13
+ constructor(app: App, ctx: Context);
14
+ /** Returns the notice to show (undefined when cancelled). */
15
+ run(): Promise<string | undefined>;
16
+ }
@@ -0,0 +1,74 @@
1
+ import { VPN_WARNINGS } from '../commands/vpn.js';
2
+ import { NORD_STEPS, VpnService } from '../services/index.js';
3
+ import { Theme } from '../tui/index.js';
4
+ /** The row's id in the settings list. */
5
+ export const VPN_LOGIN = '@vpn-login';
6
+ export function vpnLoginRow(ctx) {
7
+ const service = new VpnService(ctx);
8
+ const nord = service.provider === 'nordvpn';
9
+ if (service.provider === 'wireguard-file')
10
+ return {
11
+ label: 'VPN login',
12
+ hint: 'not needed',
13
+ description: 'A WireGuard file carries its own keys (vpn.configFile): there is no login to set.',
14
+ };
15
+ const state = service.loginState();
16
+ return {
17
+ label: nord ? 'Set NordVPN login…' : 'Set VPN login…',
18
+ hint: state === 'saved' ? 'saved' : state === 'unreadable' ? 'cannot be read' : 'not saved',
19
+ description: 'The login the VPN uses (for NordVPN the service credentials from Nord Account > NordVPN > Set up NordVPN manually, not your account password). Typed hidden, kept encrypted for your Windows user, never shown. ' +
20
+ VPN_WARNINGS.join(' '),
21
+ };
22
+ }
23
+ export class VpnLoginFlow {
24
+ app;
25
+ ctx;
26
+ constructor(app, ctx) {
27
+ this.app = app;
28
+ this.ctx = ctx;
29
+ }
30
+ /** Returns the notice to show (undefined when cancelled). */
31
+ async run() {
32
+ const service = new VpnService(this.ctx);
33
+ const nord = service.provider === 'nordvpn';
34
+ if (service.provider === 'wireguard-file')
35
+ return 'A WireGuard file carries its own keys: no login is needed.';
36
+ const path = ['Settings', 'Network', 'VPN login'];
37
+ await this.app.message({
38
+ path,
39
+ title: nord ? 'NordVPN service credentials' : 'VPN login',
40
+ lines: [
41
+ ...(nord
42
+ ? ['To find them:', ...NORD_STEPS.map((s, i) => i + 1 + '. ' + s)]
43
+ : ['The user name and password your VPN profile asks for.']),
44
+ '',
45
+ 'What you type next is hidden, kept encrypted for your Windows user and never shown again.',
46
+ '',
47
+ ...VPN_WARNINGS,
48
+ ],
49
+ });
50
+ const username = await this.app.text({
51
+ path,
52
+ label: nord ? 'Service user name' : 'User name',
53
+ masked: true,
54
+ validate: (v) => (v.trim() ? true : 'Type the user name.'),
55
+ });
56
+ if (username === undefined)
57
+ return undefined;
58
+ const password = await this.app.text({
59
+ path,
60
+ label: nord ? 'Service password' : 'Password',
61
+ masked: true,
62
+ validate: (v) => (v ? true : 'Type the password.'),
63
+ });
64
+ if (password === undefined)
65
+ return undefined;
66
+ try {
67
+ service.save({ username, password });
68
+ }
69
+ catch (e) {
70
+ return Theme.error(Theme.glyph.cross + ' ' + (e instanceof Error ? e.message : String(e)));
71
+ }
72
+ return Theme.ok(Theme.glyph.ok + ' The VPN login is saved (encrypted). Turn the VPN on under Settings > Network.');
73
+ }
74
+ }
@@ -0,0 +1,6 @@
1
+ import { type AnyDefinition } from '../../app/kernel/index.js';
2
+ import type { Handler } from '../commands/registry.js';
3
+ /** The command for a definition. */
4
+ export declare function definitionHandler(def: AnyDefinition): Handler;
5
+ /** The command a parsed command line runs when it is one of the shared core's, else undefined. */
6
+ export declare function operationHandler(command: string, positionals: readonly string[]): Handler | undefined;
@@ -0,0 +1,61 @@
1
+ // Runs a definition as a command: its input from the command line, its questions on the terminal, and its output as
2
+ // --json, as the definition's one-line text, or as the page of the view that shows it. A declined question prints
3
+ // "Nothing changed." and exits 1, as the commands always have.
4
+ import { VIEWS } from '../../app/features/defs.js';
5
+ import { runDefinition } from '../../app/registry.js';
6
+ import { Cancelled } from '../../app/kernel/index.js';
7
+ import { printJson, printPage } from '../output/index.js';
8
+ import { cliInput, definitionFor } from './input.js';
9
+ import { cliIO } from './io-cli.js';
10
+ /** The view that shows only this query (its page is the command's text output). */
11
+ function viewOf(def) {
12
+ for (const view of VIEWS) {
13
+ const entries = Object.entries(view.queries);
14
+ if (entries.length === 1 && entries[0][1] === def)
15
+ return { view, name: entries[0][0] };
16
+ }
17
+ return undefined;
18
+ }
19
+ /** Prints what a definition returned, the way its command shows it. */
20
+ function printOutput(def, output, input) {
21
+ if (def.text) {
22
+ const text = def.text(output);
23
+ if (text)
24
+ console.log(text);
25
+ return;
26
+ }
27
+ const shown = viewOf(def);
28
+ if (shown)
29
+ printPage(shown.view.build({ [shown.name]: output }, input));
30
+ else
31
+ console.log(JSON.stringify(output, null, 2));
32
+ }
33
+ /** The command for a definition. */
34
+ export function definitionHandler(def) {
35
+ return async (ctx) => {
36
+ const input = cliInput(def, ctx.options);
37
+ const { io, close } = cliIO(ctx.options);
38
+ try {
39
+ const output = await runDefinition(def.id, ctx, input, io);
40
+ close();
41
+ if (def.cli?.json && ctx.options.json) {
42
+ printJson(ctx, def.cli.shapeJson ? def.cli.shapeJson(output) : output);
43
+ return 0;
44
+ }
45
+ printOutput(def, output, def.input.parse(input));
46
+ return 0;
47
+ }
48
+ catch (e) {
49
+ close();
50
+ if (!(e instanceof Cancelled))
51
+ throw e;
52
+ console.log(e.message);
53
+ return 1;
54
+ }
55
+ };
56
+ }
57
+ /** The command a parsed command line runs when it is one of the shared core's, else undefined. */
58
+ export function operationHandler(command, positionals) {
59
+ const def = definitionFor(command, positionals);
60
+ return def ? definitionHandler(def) : undefined;
61
+ }
@@ -0,0 +1,4 @@
1
+ export { definitionHandler, operationHandler } from './handler.js';
2
+ export { cliInput, definitionFor } from './input.js';
3
+ export { cliIO } from './io-cli.js';
4
+ export { actionDefinitions, commandDefinitions, commandSpecOf, inputField, withActions, withOperationCommands, } from './spec.js';
@@ -0,0 +1,5 @@
1
+ // The command line of the shared core: commands from definitions, their input, their terminal IO and their output.
2
+ export { definitionHandler, operationHandler } from './handler.js';
3
+ export { cliInput, definitionFor } from './input.js';
4
+ export { cliIO } from './io-cli.js';
5
+ export { actionDefinitions, commandDefinitions, commandSpecOf, inputField, withActions, withOperationCommands, } from './spec.js';
@@ -0,0 +1,6 @@
1
+ import type { AnyDefinition } from '../../app/kernel/index.js';
2
+ import type { CliOptions } from '../args.js';
3
+ /** The definition a command runs: its own command, or an action of a hand-written one (`config get`). */
4
+ export declare function definitionFor(command: string, positionals: readonly string[]): AnyDefinition | undefined;
5
+ /** The input a command line gives a definition (fields not on the line are left to the schema's defaults). */
6
+ export declare function cliInput(def: AnyDefinition, options: CliOptions): Record<string, unknown>;
@@ -0,0 +1,37 @@
1
+ // Which definition a parsed command line runs, and its input: positional arguments and flags mapped to input fields by
2
+ // the definition's CLI hint (zod then checks them like any other input).
3
+ import { DEFINITIONS } from '../../app/features/defs.js';
4
+ import { fail } from '../../core/util/index.js';
5
+ import { inputField } from './spec.js';
6
+ /** The definition a command runs: its own command, or an action of a hand-written one (`config get`). */
7
+ export function definitionFor(command, positionals) {
8
+ return DEFINITIONS.find((d) => d.cli?.name === command && (d.cli.action === undefined || d.cli.action === positionals[0]));
9
+ }
10
+ /** commander's attribute name for a long flag: --keep-old -> keepOld. */
11
+ function attribute(flag) {
12
+ return flag.replace(/^--/, '').replace(/-([a-z])/g, (_m, ch) => ch.toUpperCase());
13
+ }
14
+ /** The input a command line gives a definition (fields not on the line are left to the schema's defaults). */
15
+ export function cliInput(def, options) {
16
+ const hint = def.cli;
17
+ if (!hint)
18
+ return {};
19
+ const positionals = hint.action ? options.positionals.slice(1) : options.positionals;
20
+ const names = hint.positional ?? [];
21
+ const missing = names.slice(positionals.length).filter((name) => !inputField(def, name).optional);
22
+ if (missing.length)
23
+ fail('Missing ' + missing.join(' and ') + '.', 'Usage: sandbox ' + [hint.name, hint.action, ...names.map((n) => '<' + n + '>')].filter(Boolean).join(' '));
24
+ const input = {};
25
+ names.forEach((name, i) => {
26
+ if (positionals[i] !== undefined)
27
+ input[name] = positionals[i];
28
+ });
29
+ for (const [name, flag] of Object.entries(hint.flags ?? {})) {
30
+ if (!flag)
31
+ continue;
32
+ const value = (flag.shownAs ? options.raw[attribute(flag.shownAs)] : undefined) ?? options.raw[attribute(flag.flag)];
33
+ if (value !== undefined)
34
+ input[name] = value;
35
+ }
36
+ return input;
37
+ }
@@ -0,0 +1,7 @@
1
+ import type { OperationIO } from '../../app/kernel/index.js';
2
+ import type { CliOptions } from '../args.js';
3
+ /** An OperationIO for one command; close() removes a progress line still shown. */
4
+ export declare function cliIO(options: CliOptions): {
5
+ io: OperationIO;
6
+ close: () => void;
7
+ };