windows-development-sandbox 1.5.0 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (709) hide show
  1. package/README.md +1 -0
  2. package/config.example.json +27 -1
  3. package/dist/app/context.d.ts +8 -0
  4. package/dist/app/context.js +12 -0
  5. package/dist/app/features/defs.d.ts +322 -0
  6. package/dist/app/features/defs.js +28 -0
  7. package/dist/app/features/sandbox/index.d.ts +2 -0
  8. package/dist/app/features/sandbox/index.js +3 -0
  9. package/dist/app/features/sandbox/sandbox.def.d.ts +193 -0
  10. package/dist/app/features/sandbox/sandbox.def.js +245 -0
  11. package/dist/app/features/sandbox/sandbox.run.d.ts +72 -0
  12. package/dist/app/features/sandbox/sandbox.run.js +98 -0
  13. package/dist/app/features/sessions/index.d.ts +2 -0
  14. package/dist/app/features/sessions/index.js +3 -0
  15. package/dist/app/features/sessions/sessions.def.d.ts +141 -0
  16. package/dist/app/features/sessions/sessions.def.js +176 -0
  17. package/dist/app/features/sessions/sessions.run.d.ts +39 -0
  18. package/dist/app/features/sessions/sessions.run.js +58 -0
  19. package/dist/{cli/menu/settings/categories.d.ts → app/features/settings/categories.def.d.ts} +4 -0
  20. package/dist/{cli/menu/settings/categories.js → app/features/settings/categories.def.js} +40 -46
  21. package/dist/app/features/settings/index.d.ts +5 -0
  22. package/dist/app/features/settings/index.js +6 -0
  23. package/dist/{cli/menu/settings/config-file.d.ts → app/features/settings/settings-file.d.ts} +1 -1
  24. package/dist/{cli/menu/settings/config-file.js → app/features/settings/settings-file.js} +1 -1
  25. package/dist/app/features/settings/settings-rows.d.ts +35 -0
  26. package/dist/app/features/settings/settings-rows.js +94 -0
  27. package/dist/app/features/settings/settings.def.d.ts +157 -0
  28. package/dist/app/features/settings/settings.def.js +179 -0
  29. package/dist/app/features/settings/settings.run.d.ts +67 -0
  30. package/dist/app/features/settings/settings.run.js +84 -0
  31. package/dist/app/kernel/define.d.ts +143 -0
  32. package/dist/app/kernel/define.js +42 -0
  33. package/dist/app/kernel/errors.d.ts +34 -0
  34. package/dist/app/kernel/errors.js +45 -0
  35. package/dist/app/kernel/fields.d.ts +70 -0
  36. package/dist/app/kernel/fields.js +243 -0
  37. package/dist/app/kernel/index.d.ts +8 -0
  38. package/dist/app/kernel/index.js +10 -0
  39. package/dist/app/kernel/io.d.ts +193 -0
  40. package/dist/app/kernel/io.js +126 -0
  41. package/dist/app/kernel/rpc.d.ts +156 -0
  42. package/dist/app/kernel/rpc.js +47 -0
  43. package/dist/{cli/menu/settings → app/kernel}/schema-node.d.ts +9 -0
  44. package/dist/{cli/menu/settings → app/kernel}/schema-node.js +26 -0
  45. package/dist/app/kernel/text.d.ts +6 -0
  46. package/dist/app/kernel/text.js +57 -0
  47. package/dist/app/kernel/view.d.ts +146 -0
  48. package/dist/app/kernel/view.js +28 -0
  49. package/dist/app/registry.d.ts +10 -0
  50. package/dist/app/registry.js +50 -0
  51. package/dist/cli/args.d.ts +18 -2
  52. package/dist/cli/args.js +101 -24
  53. package/dist/cli/commands/accounts.js +45 -17
  54. package/dist/cli/commands/context.d.ts +2 -0
  55. package/dist/cli/commands/context.js +9 -2
  56. package/dist/cli/commands/data/clean.js +32 -9
  57. package/dist/cli/commands/engine.d.ts +2 -0
  58. package/dist/cli/commands/engine.js +60 -0
  59. package/dist/cli/commands/index.d.ts +2 -1
  60. package/dist/cli/commands/index.js +2 -1
  61. package/dist/cli/commands/launch/add-root.d.ts +3 -2
  62. package/dist/cli/commands/launch/add-root.js +11 -10
  63. package/dist/cli/commands/launch/launch.js +102 -9
  64. package/dist/cli/commands/launch/prepare.js +6 -4
  65. package/dist/cli/commands/launch/running.js +2 -1
  66. package/dist/cli/commands/launch/summary.d.ts +2 -0
  67. package/dist/cli/commands/maintenance/audit.js +1 -1
  68. package/dist/cli/commands/maintenance/clean.d.ts +1 -1
  69. package/dist/cli/commands/maintenance/clean.js +17 -3
  70. package/dist/cli/commands/maintenance/config-share.d.ts +12 -0
  71. package/dist/cli/commands/maintenance/config-share.js +80 -0
  72. package/dist/cli/commands/maintenance/config.d.ts +1 -1
  73. package/dist/cli/commands/maintenance/config.js +38 -10
  74. package/dist/cli/commands/maintenance/doctor.d.ts +1 -1
  75. package/dist/cli/commands/maintenance/doctor.js +2 -4
  76. package/dist/cli/commands/maintenance/logs.js +14 -0
  77. package/dist/cli/commands/maintenance/migrate.d.ts +2 -1
  78. package/dist/cli/commands/maintenance/migrate.js +19 -4
  79. package/dist/cli/commands/maintenance/sync.js +2 -0
  80. package/dist/cli/commands/maintenance/update.d.ts +2 -0
  81. package/dist/cli/commands/maintenance/update.js +27 -4
  82. package/dist/cli/commands/projects/here.js +12 -7
  83. package/dist/cli/commands/projects/projects.js +26 -17
  84. package/dist/cli/commands/registry.js +10 -7
  85. package/dist/cli/commands/repair/checks/agents.d.ts +2 -0
  86. package/dist/cli/commands/repair/checks/agents.js +70 -0
  87. package/dist/cli/commands/repair/checks/common.d.ts +8 -0
  88. package/dist/cli/commands/repair/checks/common.js +22 -0
  89. package/dist/cli/commands/repair/checks/contained.d.ts +2 -0
  90. package/dist/cli/commands/repair/checks/contained.js +139 -0
  91. package/dist/cli/commands/repair/checks/data.d.ts +2 -0
  92. package/dist/cli/commands/repair/checks/data.js +241 -0
  93. package/dist/cli/commands/repair/checks/hcs.d.ts +7 -0
  94. package/dist/cli/commands/repair/checks/hcs.js +28 -0
  95. package/dist/cli/commands/repair/checks/index.d.ts +2 -0
  96. package/dist/cli/commands/repair/checks/index.js +24 -0
  97. package/dist/cli/commands/repair/checks/install.d.ts +5 -0
  98. package/dist/cli/commands/repair/checks/install.js +318 -0
  99. package/dist/cli/commands/repair/checks/machine.d.ts +2 -0
  100. package/dist/cli/commands/repair/checks/machine.js +232 -0
  101. package/dist/cli/commands/repair/checks/network.d.ts +6 -0
  102. package/dist/cli/commands/repair/checks/network.js +60 -0
  103. package/dist/cli/commands/repair/checks/pc.d.ts +4 -0
  104. package/dist/cli/commands/repair/checks/pc.js +86 -0
  105. package/dist/cli/commands/repair/checks/sandbox.d.ts +2 -0
  106. package/dist/cli/commands/repair/checks/sandbox.js +282 -0
  107. package/dist/cli/commands/repair/checks/settings.d.ts +2 -0
  108. package/dist/cli/commands/repair/checks/settings.js +169 -0
  109. package/dist/cli/commands/repair/checks/vpn.d.ts +2 -0
  110. package/dist/cli/commands/repair/checks/vpn.js +78 -0
  111. package/dist/cli/commands/repair/engine.d.ts +32 -0
  112. package/dist/cli/commands/repair/engine.js +127 -0
  113. package/dist/cli/commands/repair/env.d.ts +7 -0
  114. package/dist/cli/commands/repair/env.js +50 -0
  115. package/dist/cli/commands/repair/index.d.ts +1 -9
  116. package/dist/cli/commands/repair/index.js +2 -54
  117. package/dist/cli/commands/repair/log.d.ts +17 -0
  118. package/dist/cli/commands/repair/log.js +82 -0
  119. package/dist/cli/commands/repair/printer.d.ts +32 -0
  120. package/dist/cli/commands/repair/printer.js +132 -0
  121. package/dist/cli/commands/repair/run.d.ts +33 -0
  122. package/dist/cli/commands/repair/run.js +133 -0
  123. package/dist/cli/commands/repair/types.d.ts +97 -9
  124. package/dist/cli/commands/repair/types.js +11 -7
  125. package/dist/cli/commands/resume.js +2 -2
  126. package/dist/cli/commands/sessions/index.d.ts +0 -4
  127. package/dist/cli/commands/sessions/index.js +3 -7
  128. package/dist/cli/commands/setup/index.d.ts +5 -0
  129. package/dist/cli/commands/setup/index.js +25 -1
  130. package/dist/cli/commands/shared-use.d.ts +5 -2
  131. package/dist/cli/commands/shared-use.js +11 -8
  132. package/dist/cli/commands/storage/contained.d.ts +3 -0
  133. package/dist/cli/commands/storage/contained.js +179 -0
  134. package/dist/cli/commands/storage/index.d.ts +2 -0
  135. package/dist/cli/commands/storage/index.js +2 -0
  136. package/dist/cli/commands/storage/offer.d.ts +3 -0
  137. package/dist/cli/commands/storage/offer.js +91 -0
  138. package/dist/cli/commands/storage/storage.d.ts +8 -0
  139. package/dist/cli/commands/storage/storage.js +179 -0
  140. package/dist/cli/commands/user-config.js +2 -2
  141. package/dist/cli/commands/vpn.d.ts +4 -0
  142. package/dist/cli/commands/vpn.js +91 -0
  143. package/dist/cli/commands/web.d.ts +4 -0
  144. package/dist/cli/commands/web.js +97 -0
  145. package/dist/cli/history.js +1 -1
  146. package/dist/cli/index.js +48 -4
  147. package/dist/cli/manifest.d.ts +339 -97
  148. package/dist/cli/manifest.js +222 -67
  149. package/dist/cli/menu/add-agent.d.ts +47 -0
  150. package/dist/cli/menu/add-agent.js +168 -0
  151. package/dist/cli/menu/apps.d.ts +38 -3
  152. package/dist/cli/menu/apps.js +80 -5
  153. package/dist/cli/menu/command-fields.d.ts +18 -0
  154. package/dist/cli/menu/command-fields.js +61 -0
  155. package/dist/cli/menu/command-form.d.ts +22 -0
  156. package/dist/cli/menu/command-form.js +169 -46
  157. package/dist/cli/menu/data-folder.d.ts +18 -0
  158. package/dist/cli/menu/data-folder.js +99 -0
  159. package/dist/cli/menu/io-menu.d.ts +29 -0
  160. package/dist/cli/menu/io-menu.js +126 -0
  161. package/dist/cli/menu/live.d.ts +27 -0
  162. package/dist/cli/menu/live.js +69 -0
  163. package/dist/cli/menu/memory.d.ts +19 -0
  164. package/dist/cli/menu/memory.js +53 -0
  165. package/dist/cli/menu/menu.d.ts +11 -2
  166. package/dist/cli/menu/menu.js +36 -15
  167. package/dist/cli/menu/pages/accounts-page.js +55 -24
  168. package/dist/cli/menu/pages/agents-page.d.ts +68 -0
  169. package/dist/cli/menu/pages/agents-page.js +345 -0
  170. package/dist/cli/menu/pages/apps-page.d.ts +3 -1
  171. package/dist/cli/menu/pages/apps-page.js +20 -4
  172. package/dist/cli/menu/pages/list-page.d.ts +43 -3
  173. package/dist/cli/menu/pages/list-page.js +146 -12
  174. package/dist/cli/menu/pages/maintenance-page.d.ts +9 -5
  175. package/dist/cli/menu/pages/maintenance-page.js +172 -85
  176. package/dist/cli/menu/pages/sandbox-page.d.ts +7 -6
  177. package/dist/cli/menu/pages/sandbox-page.js +117 -120
  178. package/dist/cli/menu/pages/scopes.d.ts +1 -1
  179. package/dist/cli/menu/pages/sessions-page.d.ts +6 -8
  180. package/dist/cli/menu/pages/sessions-page.js +22 -75
  181. package/dist/cli/menu/pages/settings-page.d.ts +10 -14
  182. package/dist/cli/menu/pages/settings-page.js +95 -102
  183. package/dist/cli/menu/render-view.d.ts +28 -0
  184. package/dist/cli/menu/render-view.js +112 -0
  185. package/dist/cli/menu/settings/ask-path.d.ts +14 -0
  186. package/dist/cli/menu/settings/ask-path.js +14 -0
  187. package/dist/cli/menu/settings/collections/collection-editor.d.ts +8 -2
  188. package/dist/cli/menu/settings/collections/collection-editor.js +12 -8
  189. package/dist/cli/menu/settings/collections/map-editor.js +5 -1
  190. package/dist/cli/menu/settings/collections/object-list-editor.js +2 -2
  191. package/dist/cli/menu/settings/collections/object-map-editor.js +2 -2
  192. package/dist/cli/menu/settings/collections/string-list-editor.d.ts +10 -1
  193. package/dist/cli/menu/settings/collections/string-list-editor.js +23 -0
  194. package/dist/cli/menu/settings/draft.d.ts +1 -1
  195. package/dist/cli/menu/settings/format.d.ts +1 -3
  196. package/dist/cli/menu/settings/format.js +6 -36
  197. package/dist/cli/menu/settings/index.d.ts +1 -3
  198. package/dist/cli/menu/settings/index.js +3 -3
  199. package/dist/cli/menu/settings/object-editor.d.ts +6 -2
  200. package/dist/cli/menu/settings/object-editor.js +15 -4
  201. package/dist/cli/menu/settings/share.d.ts +36 -0
  202. package/dist/cli/menu/settings/share.js +131 -0
  203. package/dist/cli/menu/settings/value-editor.d.ts +10 -1
  204. package/dist/cli/menu/settings/value-editor.js +99 -63
  205. package/dist/cli/menu/several.js +7 -5
  206. package/dist/cli/menu/share-settings.d.ts +21 -0
  207. package/dist/cli/menu/share-settings.js +112 -0
  208. package/dist/cli/menu/shell.d.ts +53 -10
  209. package/dist/cli/menu/shell.js +115 -10
  210. package/dist/cli/menu/views.d.ts +7 -0
  211. package/dist/cli/menu/views.js +11 -0
  212. package/dist/cli/menu/vpn-login.d.ts +16 -0
  213. package/dist/cli/menu/vpn-login.js +74 -0
  214. package/dist/cli/operations/handler.d.ts +6 -0
  215. package/dist/cli/operations/handler.js +61 -0
  216. package/dist/cli/operations/index.d.ts +4 -0
  217. package/dist/cli/operations/index.js +5 -0
  218. package/dist/cli/operations/input.d.ts +6 -0
  219. package/dist/cli/operations/input.js +37 -0
  220. package/dist/cli/operations/io-cli.d.ts +7 -0
  221. package/dist/cli/operations/io-cli.js +62 -0
  222. package/dist/cli/operations/spec.d.ts +18 -0
  223. package/dist/cli/operations/spec.js +108 -0
  224. package/dist/cli/output/colors.d.ts +2 -2
  225. package/dist/cli/output/colors.js +2 -11
  226. package/dist/cli/output/index.d.ts +1 -0
  227. package/dist/cli/output/index.js +1 -0
  228. package/dist/cli/output/print.d.ts +5 -1
  229. package/dist/cli/output/print.js +15 -4
  230. package/dist/cli/output/progress.d.ts +15 -0
  231. package/dist/cli/output/progress.js +44 -0
  232. package/dist/cli/output/render-view.d.ts +4 -0
  233. package/dist/cli/output/render-view.js +63 -0
  234. package/dist/cli/services/accounts-service.d.ts +2 -0
  235. package/dist/cli/services/accounts-service.js +2 -2
  236. package/dist/cli/services/agent-commands-service.d.ts +2 -0
  237. package/dist/cli/services/agent-commands-service.js +11 -2
  238. package/dist/cli/services/health-service.d.ts +0 -6
  239. package/dist/cli/services/health-service.js +5 -42
  240. package/dist/cli/services/index.d.ts +3 -1
  241. package/dist/cli/services/index.js +3 -1
  242. package/dist/cli/services/logs-service.js +4 -3
  243. package/dist/cli/services/migrate-service.js +1 -1
  244. package/dist/cli/services/update-service.d.ts +2 -0
  245. package/dist/cli/services/update-service.js +13 -6
  246. package/dist/cli/services/vpn-service.d.ts +28 -0
  247. package/dist/cli/services/vpn-service.js +46 -0
  248. package/dist/cli/services/web-service.d.ts +22 -0
  249. package/dist/cli/services/web-service.js +111 -0
  250. package/dist/cli/tui/app.d.ts +12 -4
  251. package/dist/cli/tui/app.js +38 -9
  252. package/dist/cli/tui/dialogs/path-listing.d.ts +43 -0
  253. package/dist/cli/tui/dialogs/path-listing.js +127 -0
  254. package/dist/cli/tui/dialogs/path-picker.d.ts +67 -0
  255. package/dist/cli/tui/dialogs/path-picker.js +423 -0
  256. package/dist/cli/tui/dialogs/text-screen.d.ts +6 -0
  257. package/dist/cli/tui/dialogs/text-screen.js +10 -3
  258. package/dist/cli/tui/frame.d.ts +7 -10
  259. package/dist/cli/tui/frame.js +19 -10
  260. package/dist/cli/tui/index.d.ts +4 -3
  261. package/dist/cli/tui/index.js +2 -1
  262. package/dist/cli/tui/list/list-screen.d.ts +28 -2
  263. package/dist/cli/tui/list/list-screen.js +130 -66
  264. package/dist/cli/tui/list/list-types.d.ts +10 -4
  265. package/dist/cli/tui/nav.d.ts +29 -0
  266. package/dist/cli/tui/nav.js +67 -0
  267. package/dist/cli/tui/terminal.d.ts +7 -0
  268. package/dist/cli/tui/terminal.js +30 -10
  269. package/dist/cli/validate.d.ts +1 -1
  270. package/dist/cli/validate.js +3 -3
  271. package/dist/cli/version.d.ts +2 -0
  272. package/dist/cli/version.js +11 -0
  273. package/dist/core/config/defaults.js +13 -1
  274. package/dist/core/config/loader.js +12 -2
  275. package/dist/core/local-config/overrides.js +1 -0
  276. package/dist/core/prompt.d.ts +19 -0
  277. package/dist/core/prompt.js +43 -3
  278. package/dist/core/schema/common.d.ts +6 -0
  279. package/dist/core/schema/common.js +8 -0
  280. package/dist/core/schema/config.d.ts +36 -0
  281. package/dist/core/schema/config.js +26 -2
  282. package/dist/core/schema/harness.d.ts +2 -0
  283. package/dist/core/schema/harness.js +13 -2
  284. package/dist/core/schema/index.d.ts +3 -1
  285. package/dist/core/schema/index.js +3 -1
  286. package/dist/core/schema/profile.d.ts +1 -0
  287. package/dist/core/schema/profile.js +3 -0
  288. package/dist/core/schema/redact.d.ts +13 -0
  289. package/dist/core/schema/redact.js +75 -0
  290. package/dist/core/schema/sandbox.d.ts +6 -0
  291. package/dist/core/schema/sandbox.js +21 -3
  292. package/dist/core/schema/vpn.d.ts +18 -0
  293. package/dist/core/schema/vpn.js +22 -0
  294. package/dist/core/schema/web.d.ts +6 -0
  295. package/dist/core/schema/web.js +14 -0
  296. package/dist/core/types.d.ts +44 -0
  297. package/dist/core/util/fs.d.ts +2 -0
  298. package/dist/core/util/fs.js +9 -0
  299. package/dist/core/util/index.d.ts +1 -1
  300. package/dist/core/util/index.js +1 -1
  301. package/dist/guest/agents/agent-files.d.ts +54 -0
  302. package/dist/guest/agents/agent-files.js +67 -0
  303. package/dist/guest/agents/agent-installer.js +2 -9
  304. package/dist/guest/agents/local-state.d.ts +14 -0
  305. package/dist/guest/agents/local-state.js +218 -0
  306. package/dist/guest/agents/sbx-agent.d.ts +2 -0
  307. package/dist/guest/agents/sbx-agent.js +35 -0
  308. package/dist/guest/boot/boot.d.ts +4 -0
  309. package/dist/guest/boot/boot.js +51 -11
  310. package/dist/guest/daemon/daemon.js +8 -1
  311. package/dist/guest/daemon/exec.js +2 -1
  312. package/dist/guest/daemon/idle-shutdown.js +2 -0
  313. package/dist/guest/daemon/sessions.d.ts +5 -0
  314. package/dist/guest/daemon/sessions.js +20 -3
  315. package/dist/guest/entries/agent.d.ts +1 -0
  316. package/dist/guest/entries/agent.js +10 -0
  317. package/dist/guest/entries/daemon.js +5 -0
  318. package/dist/guest/governor/decide.d.ts +61 -0
  319. package/dist/guest/governor/decide.js +182 -0
  320. package/dist/guest/governor/governor.d.ts +42 -0
  321. package/dist/guest/governor/governor.js +214 -0
  322. package/dist/guest/governor/index.d.ts +2 -0
  323. package/dist/guest/governor/index.js +2 -0
  324. package/dist/guest/runtime/csc.d.ts +2 -0
  325. package/dist/guest/runtime/csc.js +2 -0
  326. package/dist/guest/runtime/secrets.d.ts +12 -0
  327. package/dist/guest/runtime/secrets.js +63 -0
  328. package/dist/guest/sessions/viewer.js +3 -1
  329. package/dist/guest/setup/claude-profile.d.ts +2 -1
  330. package/dist/guest/setup/claude-profile.js +12 -1
  331. package/dist/guest/setup/environment.d.ts +6 -0
  332. package/dist/guest/setup/environment.js +56 -6
  333. package/dist/guest/setup/path-plan.d.ts +32 -0
  334. package/dist/guest/setup/path-plan.js +67 -0
  335. package/dist/guest/setup/shell-path.d.ts +1 -0
  336. package/dist/guest/setup/shell-path.js +22 -0
  337. package/dist/guest/toolchains/languages/python.js +1 -1
  338. package/dist/guest/toolchains/native/rust-extras.js +4 -2
  339. package/dist/guest/toolchains/runtimes.js +2 -2
  340. package/dist/guest/vpn/index.d.ts +1 -0
  341. package/dist/guest/vpn/index.js +1 -0
  342. package/dist/guest/vpn/openvpn.d.ts +9 -0
  343. package/dist/guest/vpn/openvpn.js +47 -0
  344. package/dist/guest/vpn/tunnel.d.ts +17 -0
  345. package/dist/guest/vpn/tunnel.js +78 -0
  346. package/dist/guest/vpn/vpn.d.ts +6 -0
  347. package/dist/guest/vpn/vpn.js +174 -0
  348. package/dist/guest/vpn/wireguard.d.ts +32 -0
  349. package/dist/guest/vpn/wireguard.js +132 -0
  350. package/dist/host/agent-commands/commands.d.ts +4 -0
  351. package/dist/host/agent-commands/commands.js +31 -7
  352. package/dist/host/audit/log.d.ts +1 -1
  353. package/dist/host/channel/attach.d.ts +6 -2
  354. package/dist/host/channel/attach.js +6 -3
  355. package/dist/host/channel/channel.d.ts +9 -0
  356. package/dist/host/channel/channel.js +30 -2
  357. package/dist/host/engines/engine.d.ts +12 -0
  358. package/dist/host/engines/engine.js +1 -0
  359. package/dist/host/engines/hcs/check.d.ts +25 -0
  360. package/dist/host/engines/hcs/check.js +95 -0
  361. package/dist/host/engines/hcs/documents.d.ts +44 -0
  362. package/dist/host/engines/hcs/documents.js +155 -0
  363. package/dist/host/engines/hcs/engine.d.ts +39 -0
  364. package/dist/host/engines/hcs/engine.js +171 -0
  365. package/dist/host/engines/hcs/helper.d.ts +43 -0
  366. package/dist/host/engines/hcs/helper.js +173 -0
  367. package/dist/host/engines/hcs/images.d.ts +37 -0
  368. package/dist/host/engines/hcs/images.js +152 -0
  369. package/dist/host/engines/index.d.ts +7 -0
  370. package/dist/host/engines/index.js +5 -0
  371. package/dist/host/engines/registry.d.ts +16 -0
  372. package/dist/host/engines/registry.js +30 -0
  373. package/dist/host/engines/types.d.ts +58 -0
  374. package/dist/host/engines/types.js +1 -0
  375. package/dist/host/engines/windows-sandbox/engine.d.ts +16 -0
  376. package/dist/host/engines/windows-sandbox/engine.js +63 -0
  377. package/dist/host/engines/windows-sandbox/wsb-text.d.ts +2 -0
  378. package/dist/host/engines/windows-sandbox/wsb-text.js +29 -0
  379. package/dist/host/health/acl-read.d.ts +17 -0
  380. package/dist/host/health/acl-read.js +45 -0
  381. package/dist/host/health/config-backup.d.ts +11 -0
  382. package/dist/host/health/config-backup.js +73 -0
  383. package/dist/host/health/index.d.ts +6 -0
  384. package/dist/host/health/index.js +7 -0
  385. package/dist/host/health/install-state.d.ts +33 -0
  386. package/dist/host/health/install-state.js +110 -0
  387. package/dist/host/health/path-copies.d.ts +32 -0
  388. package/dist/host/health/path-copies.js +82 -0
  389. package/dist/host/health/stale.d.ts +45 -0
  390. package/dist/host/health/stale.js +120 -0
  391. package/dist/host/health/system.d.ts +37 -0
  392. package/dist/host/health/system.js +87 -0
  393. package/dist/host/install/copies.d.ts +13 -0
  394. package/dist/host/install/copies.js +63 -0
  395. package/dist/host/install/index.d.ts +1 -0
  396. package/dist/host/install/index.js +1 -0
  397. package/dist/host/launch/generate.d.ts +5 -1
  398. package/dist/host/launch/generate.js +73 -7
  399. package/dist/host/launch/index.d.ts +3 -1
  400. package/dist/host/launch/index.js +3 -1
  401. package/dist/host/launch/launch-plan.d.ts +13 -0
  402. package/dist/host/launch/launch-plan.js +26 -0
  403. package/dist/host/launch/mappings.js +2 -1
  404. package/dist/host/launch/risk-notes.d.ts +10 -0
  405. package/dist/host/launch/risk-notes.js +18 -0
  406. package/dist/host/launch/session-file.d.ts +2 -0
  407. package/dist/host/launch/session-file.js +11 -2
  408. package/dist/host/launch/stage.js +1 -1
  409. package/dist/host/launch/wsb-file.d.ts +28 -4
  410. package/dist/host/launch/wsb-file.js +61 -42
  411. package/dist/host/life/crash-report.d.ts +27 -1
  412. package/dist/host/life/crash-report.js +173 -7
  413. package/dist/host/life/host-memory.d.ts +40 -0
  414. package/dist/host/life/host-memory.js +137 -0
  415. package/dist/host/life/index.d.ts +2 -0
  416. package/dist/host/life/index.js +2 -0
  417. package/dist/host/life/stop-events.d.ts +2 -0
  418. package/dist/host/life/stop-events.js +20 -3
  419. package/dist/host/life/stop-warning.js +1 -1
  420. package/dist/host/life/watchdog.d.ts +54 -0
  421. package/dist/host/life/watchdog.js +108 -0
  422. package/dist/host/migrate/backup.js +3 -0
  423. package/dist/host/migrate/migrations/config-file.d.ts +2 -0
  424. package/dist/host/migrate/migrations/config-file.js +7 -0
  425. package/dist/host/migrate/migrations/follow-machine-storage.js +9 -1
  426. package/dist/host/migrate/migrations/pin-storage-root.d.ts +4 -0
  427. package/dist/host/migrate/migrations/pin-storage-root.js +46 -0
  428. package/dist/host/migrate/migrations/unpin-config-defaults.js +4 -1
  429. package/dist/host/migrate/registry.js +2 -1
  430. package/dist/host/native.d.ts +3 -2
  431. package/dist/host/native.js +22 -3
  432. package/dist/host/profile/accounts.d.ts +25 -1
  433. package/dist/host/profile/accounts.js +96 -13
  434. package/dist/host/profile/agent-accounts.d.ts +5 -1
  435. package/dist/host/profile/agent-accounts.js +35 -5
  436. package/dist/host/profile/claude-login.js +3 -2
  437. package/dist/host/profile/index.d.ts +2 -1
  438. package/dist/host/profile/index.js +1 -0
  439. package/dist/host/profile/plugin-share.d.ts +26 -0
  440. package/dist/host/profile/plugin-share.js +146 -0
  441. package/dist/host/projects/join.d.ts +7 -1
  442. package/dist/host/projects/join.js +21 -4
  443. package/dist/host/projects/registry.d.ts +16 -10
  444. package/dist/host/projects/registry.js +74 -6
  445. package/dist/host/sandbox/contained-deps.d.ts +2 -0
  446. package/dist/host/sandbox/contained-deps.js +17 -0
  447. package/dist/host/sandbox/index.d.ts +2 -0
  448. package/dist/host/sandbox/index.js +2 -0
  449. package/dist/host/sandbox/platform.d.ts +4 -0
  450. package/dist/host/sandbox/platform.js +23 -4
  451. package/dist/host/sandbox/tasklist.d.ts +13 -0
  452. package/dist/host/sandbox/tasklist.js +47 -0
  453. package/dist/host/secrets/index.d.ts +2 -0
  454. package/dist/host/secrets/index.js +2 -0
  455. package/dist/host/secrets/launch-secrets.d.ts +17 -0
  456. package/dist/host/secrets/launch-secrets.js +94 -0
  457. package/dist/host/secrets/secret-store.d.ts +25 -0
  458. package/dist/host/secrets/secret-store.js +89 -0
  459. package/dist/host/sharing/acl.d.ts +16 -2
  460. package/dist/host/sharing/acl.js +35 -10
  461. package/dist/host/sharing/current.js +8 -3
  462. package/dist/host/sharing/doctor.d.ts +2 -0
  463. package/dist/host/sharing/doctor.js +44 -0
  464. package/dist/host/sharing/group-access.d.ts +6 -0
  465. package/dist/host/sharing/group-access.js +24 -0
  466. package/dist/host/sharing/index.d.ts +2 -1
  467. package/dist/host/sharing/index.js +2 -1
  468. package/dist/host/sharing/lifecycle.d.ts +8 -2
  469. package/dist/host/sharing/lifecycle.js +16 -7
  470. package/dist/host/storage/cleanup.d.ts +2 -0
  471. package/dist/host/storage/cleanup.js +2 -1
  472. package/dist/host/storage/contained/check.d.ts +9 -0
  473. package/dist/host/storage/contained/check.js +37 -0
  474. package/dist/host/storage/contained/contained-storage.d.ts +66 -0
  475. package/dist/host/storage/contained/contained-storage.js +168 -0
  476. package/dist/host/storage/contained/disk-port.d.ts +43 -0
  477. package/dist/host/storage/contained/disk-port.js +122 -0
  478. package/dist/host/storage/contained/index.d.ts +9 -0
  479. package/dist/host/storage/contained/index.js +8 -0
  480. package/dist/host/storage/contained/layout.d.ts +28 -0
  481. package/dist/host/storage/contained/layout.js +45 -0
  482. package/dist/host/storage/contained/resolve.d.ts +4 -0
  483. package/dist/host/storage/contained/resolve.js +30 -0
  484. package/dist/host/storage/contained/setting.d.ts +1 -0
  485. package/dist/host/storage/contained/setting.js +5 -0
  486. package/dist/host/storage/contained/state.d.ts +89 -0
  487. package/dist/host/storage/contained/state.js +166 -0
  488. package/dist/host/storage/contained/transfer.d.ts +24 -0
  489. package/dist/host/storage/contained/transfer.js +121 -0
  490. package/dist/host/storage/history.d.ts +21 -0
  491. package/dist/host/storage/history.js +49 -0
  492. package/dist/host/storage/index.d.ts +6 -0
  493. package/dist/host/storage/index.js +6 -0
  494. package/dist/host/storage/move.d.ts +95 -0
  495. package/dist/host/storage/move.js +384 -0
  496. package/dist/host/storage/offer.d.ts +11 -0
  497. package/dist/host/storage/offer.js +36 -0
  498. package/dist/host/storage/providers/contained.d.ts +15 -0
  499. package/dist/host/storage/providers/contained.js +39 -0
  500. package/dist/host/storage/providers/folder.d.ts +12 -0
  501. package/dist/host/storage/providers/folder.js +20 -0
  502. package/dist/host/storage/providers/index.d.ts +4 -0
  503. package/dist/host/storage/providers/index.js +3 -0
  504. package/dist/host/storage/providers/registry.d.ts +9 -0
  505. package/dist/host/storage/providers/registry.js +14 -0
  506. package/dist/host/storage/providers/types.d.ts +33 -0
  507. package/dist/host/storage/providers/types.js +1 -0
  508. package/dist/host/storage/root.d.ts +18 -0
  509. package/dist/host/storage/root.js +77 -0
  510. package/dist/host/tools/conpty.js +3 -2
  511. package/dist/host/tools/windows-terminal.d.ts +2 -0
  512. package/dist/host/tools/windows-terminal.js +31 -12
  513. package/dist/host/update/index.d.ts +1 -1
  514. package/dist/host/update/index.js +1 -1
  515. package/dist/host/update/notice.d.ts +2 -0
  516. package/dist/host/update/notice.js +13 -1
  517. package/dist/host/update/update-state.d.ts +6 -0
  518. package/dist/host/update/update-state.js +2 -0
  519. package/dist/host/update/updater.d.ts +19 -0
  520. package/dist/host/update/updater.js +88 -12
  521. package/dist/host/vpn/index.d.ts +4 -0
  522. package/dist/host/vpn/index.js +4 -0
  523. package/dist/host/vpn/login.d.ts +24 -0
  524. package/dist/host/vpn/login.js +79 -0
  525. package/dist/host/vpn/nordvpn.d.ts +21 -0
  526. package/dist/host/vpn/nordvpn.js +77 -0
  527. package/dist/host/vpn/prepare.d.ts +19 -0
  528. package/dist/host/vpn/prepare.js +138 -0
  529. package/dist/host/vpn/status.d.ts +12 -0
  530. package/dist/host/vpn/status.js +53 -0
  531. package/dist/host/web/auth.d.ts +38 -0
  532. package/dist/host/web/auth.js +96 -0
  533. package/dist/host/web/backend.d.ts +14 -0
  534. package/dist/host/web/backend.js +1 -0
  535. package/dist/host/web/bridge.d.ts +27 -0
  536. package/dist/host/web/bridge.js +144 -0
  537. package/dist/host/web/browser.d.ts +3 -0
  538. package/dist/host/web/browser.js +23 -0
  539. package/dist/host/web/control.d.ts +17 -0
  540. package/dist/host/web/control.js +67 -0
  541. package/dist/host/web/index.d.ts +10 -0
  542. package/dist/host/web/index.js +9 -0
  543. package/dist/host/web/rpc.d.ts +24 -0
  544. package/dist/host/web/rpc.js +149 -0
  545. package/dist/host/web/runner.d.ts +16 -0
  546. package/dist/host/web/runner.js +44 -0
  547. package/dist/host/web/server.d.ts +47 -0
  548. package/dist/host/web/server.js +238 -0
  549. package/dist/host/web/state.d.ts +20 -0
  550. package/dist/host/web/state.js +41 -0
  551. package/dist/host/web/static-files.d.ts +13 -0
  552. package/dist/host/web/static-files.js +57 -0
  553. package/dist/runtime/agent.js +27675 -0
  554. package/dist/runtime/daemon.js +1950 -1122
  555. package/dist/runtime/db.js +302 -111
  556. package/dist/runtime/main.js +1560 -275
  557. package/dist/runtime/netproxy.js +168 -8
  558. package/dist/runtime/view.js +186 -13
  559. package/dist/selftest/accounts.test.js +40 -0
  560. package/dist/selftest/agent-paths.test.d.ts +2 -0
  561. package/dist/selftest/agent-paths.test.js +125 -0
  562. package/dist/selftest/app.test.d.ts +2 -0
  563. package/dist/selftest/app.test.js +324 -0
  564. package/dist/selftest/channel.test.js +18 -0
  565. package/dist/selftest/cli.test.js +35 -4
  566. package/dist/selftest/config.test.js +59 -0
  567. package/dist/selftest/contained.test.d.ts +2 -0
  568. package/dist/selftest/contained.test.js +544 -0
  569. package/dist/selftest/credentials.test.d.ts +2 -0
  570. package/dist/selftest/credentials.test.js +198 -0
  571. package/dist/selftest/engine.test.d.ts +2 -0
  572. package/dist/selftest/engine.test.js +127 -0
  573. package/dist/selftest/generate.test.js +1 -1
  574. package/dist/selftest/hcs.test.d.ts +2 -0
  575. package/dist/selftest/hcs.test.js +482 -0
  576. package/dist/selftest/health.test.d.ts +2 -0
  577. package/dist/selftest/health.test.js +470 -0
  578. package/dist/selftest/heavy-load.test.d.ts +2 -0
  579. package/dist/selftest/heavy-load.test.js +329 -0
  580. package/dist/selftest/host-sim.test.js +2 -0
  581. package/dist/selftest/index.js +31 -0
  582. package/dist/selftest/layout.test.js +14 -0
  583. package/dist/selftest/menu-perf.test.d.ts +2 -0
  584. package/dist/selftest/menu-perf.test.js +248 -0
  585. package/dist/selftest/menu-screens.d.ts +7 -0
  586. package/dist/selftest/menu-screens.js +68 -17
  587. package/dist/selftest/menu.test.js +603 -22
  588. package/dist/selftest/migrate.test.js +1 -1
  589. package/dist/selftest/personalization.test.js +3 -1
  590. package/dist/selftest/projects.test.js +39 -1
  591. package/dist/selftest/shared-use.test.js +64 -2
  592. package/dist/selftest/sharing.test.js +50 -1
  593. package/dist/selftest/storage.test.d.ts +2 -0
  594. package/dist/selftest/storage.test.js +363 -0
  595. package/dist/selftest/support/engine-cases.d.ts +8 -0
  596. package/dist/selftest/support/engine-cases.js +65 -0
  597. package/dist/selftest/support/engine-golden.d.ts +3 -0
  598. package/dist/selftest/support/engine-golden.js +66 -0
  599. package/dist/selftest/support/fixtures.d.ts +20 -0
  600. package/dist/selftest/support/hcs-probes.d.ts +17 -0
  601. package/dist/selftest/support/hcs-probes.js +41 -0
  602. package/dist/selftest/support/releases.js +1 -1
  603. package/dist/selftest/toolchains.test.js +21 -0
  604. package/dist/selftest/update-service.test.js +87 -3
  605. package/dist/selftest/vpn.test.d.ts +2 -0
  606. package/dist/selftest/vpn.test.js +412 -0
  607. package/dist/selftest/web.test.d.ts +2 -0
  608. package/dist/selftest/web.test.js +402 -0
  609. package/dist/shared/apps/catalogue.js +31 -0
  610. package/dist/shared/channel/index.d.ts +1 -0
  611. package/dist/shared/channel/index.js +1 -0
  612. package/dist/shared/channel/run-dir.d.ts +9 -1
  613. package/dist/shared/channel/run-dir.js +18 -1
  614. package/dist/shared/channel/schema.d.ts +53 -0
  615. package/dist/shared/channel/schema.js +38 -0
  616. package/dist/shared/channel/secrets.d.ts +29 -0
  617. package/dist/shared/channel/secrets.js +50 -0
  618. package/dist/shared/memory/index.d.ts +1 -0
  619. package/dist/shared/memory/index.js +1 -0
  620. package/dist/shared/memory/policy.d.ts +33 -0
  621. package/dist/shared/memory/policy.js +55 -0
  622. package/dist/shared/pty/output-filter.d.ts +14 -1
  623. package/dist/shared/pty/output-filter.js +22 -4
  624. package/dist/shared/pty/terminal.d.ts +4 -1
  625. package/dist/shared/pty/terminal.js +4 -2
  626. package/dist/shared/system.d.ts +1 -0
  627. package/dist/shared/system.js +1 -0
  628. package/dist/shared/vpn/download.d.ts +29 -0
  629. package/dist/shared/vpn/download.js +30 -0
  630. package/dist/shared/vpn/kill-switch.d.ts +18 -0
  631. package/dist/shared/vpn/kill-switch.js +81 -0
  632. package/dist/shared/vpn/ovpn.d.ts +23 -0
  633. package/dist/shared/vpn/ovpn.js +244 -0
  634. package/dist/shared/vpn/wireguard.d.ts +51 -0
  635. package/dist/shared/vpn/wireguard.js +227 -0
  636. package/dist/shared/web/index.d.ts +1 -0
  637. package/dist/shared/web/index.js +1 -0
  638. package/dist/shared/web/protocol.d.ts +61 -0
  639. package/dist/shared/web/protocol.js +35 -0
  640. package/dist/sync/sync-cycle.js +9 -5
  641. package/dist/sync/sync-state.d.ts +1 -0
  642. package/dist/sync/sync-state.js +1 -0
  643. package/dist/sync/watcher.d.ts +13 -0
  644. package/dist/sync/watcher.js +102 -3
  645. package/dist/web/index.html +14 -0
  646. package/dist/web/main-NRRS5O6Z.js +157 -0
  647. package/dist/web/main-T5DMCHYV.css +1 -0
  648. package/native/csharp/FolderSecurity.cs +29 -0
  649. package/native/csharp/HcsHost/AssemblyInfo.cs +14 -0
  650. package/native/csharp/HcsHost/Guard.cs +100 -0
  651. package/native/csharp/HcsHost/Hcs.cs +256 -0
  652. package/native/csharp/HcsHost/Json.cs +78 -0
  653. package/native/csharp/HcsHost/Program.cs +185 -0
  654. package/native/csharp/HcsHost/VirtualDisk.cs +95 -0
  655. package/native/csharp/HostTools/AssemblyInfo.cs +14 -0
  656. package/native/csharp/HostTools/MemoryStatus.cs +107 -0
  657. package/native/csharp/HostTools/Program.cs +58 -17
  658. package/native/scripts/check-contained.ps1 +28 -0
  659. package/native/scripts/contained-common.ps1 +241 -0
  660. package/native/scripts/dismount-contained.ps1 +66 -0
  661. package/native/scripts/memory-status.ps1 +34 -0
  662. package/native/scripts/mount-contained.ps1 +139 -0
  663. package/native/scripts/protect-data.ps1 +29 -0
  664. package/native/scripts/read-folder-sddl.ps1 +10 -0
  665. package/native/scripts/run-elevated.ps1 +17 -4
  666. package/native/scripts/set-folder-access.ps1 +49 -7
  667. package/native/scripts/stop-events.ps1 +23 -8
  668. package/node_modules/ws/LICENSE +20 -0
  669. package/node_modules/ws/README.md +548 -0
  670. package/node_modules/ws/browser.js +8 -0
  671. package/node_modules/ws/index.js +22 -0
  672. package/node_modules/ws/lib/buffer-util.js +131 -0
  673. package/node_modules/ws/lib/constants.js +19 -0
  674. package/node_modules/ws/lib/event-target.js +292 -0
  675. package/node_modules/ws/lib/extension.js +203 -0
  676. package/node_modules/ws/lib/limiter.js +55 -0
  677. package/node_modules/ws/lib/permessage-deflate.js +530 -0
  678. package/node_modules/ws/lib/receiver.js +743 -0
  679. package/node_modules/ws/lib/sender.js +607 -0
  680. package/node_modules/ws/lib/stream.js +161 -0
  681. package/node_modules/ws/lib/subprotocol.js +62 -0
  682. package/node_modules/ws/lib/validation.js +152 -0
  683. package/node_modules/ws/lib/websocket-server.js +562 -0
  684. package/node_modules/ws/lib/websocket.js +1421 -0
  685. package/node_modules/ws/package.json +74 -0
  686. package/node_modules/ws/wrapper.mjs +21 -0
  687. package/package.json +22 -5
  688. package/sandbox/csharp/EnvBroadcast.cs +33 -0
  689. package/sandbox/csharp/MemGov.cs +398 -0
  690. package/sandbox/csharp/PathSync.cs +90 -0
  691. package/sandbox/csharp/PtyHost.cs +111 -5
  692. package/sandbox/scripts/install-shell-path.ps1 +73 -0
  693. package/sandbox/scripts/set-machine-environment.ps1 +37 -4
  694. package/schemas/config.schema.json +136 -7
  695. package/schemas/sandbox-config.schema.json +17 -4
  696. package/dist/cli/commands/repair/checks.d.ts +0 -2
  697. package/dist/cli/commands/repair/checks.js +0 -246
  698. package/dist/cli/commands/sessions/control.d.ts +0 -4
  699. package/dist/cli/commands/sessions/control.js +0 -66
  700. package/dist/cli/commands/sessions/list.d.ts +0 -2
  701. package/dist/cli/commands/sessions/list.js +0 -45
  702. package/dist/cli/commands/sessions/status.d.ts +0 -2
  703. package/dist/cli/commands/sessions/status.js +0 -93
  704. package/dist/cli/commands/sessions/window.d.ts +0 -3
  705. package/dist/cli/commands/sessions/window.js +0 -18
  706. package/dist/cli/menu/pages/start-page.d.ts +0 -43
  707. package/dist/cli/menu/pages/start-page.js +0 -192
  708. package/dist/cli/tui/tab-bar.d.ts +0 -9
  709. package/dist/cli/tui/tab-bar.js +0 -33
@@ -1,18 +1,26 @@
1
- // One command as a form: its arguments and options listed with their current values, each changed in place, and the
2
- // exact command line it will run shown live (the same line you could type yourself). Built from manifest.ts, so a new
3
- // command or option appears here on its own.
1
+ // One command as a form: its arguments and options listed with their current values, each changed in place with the
2
+ // input that fits it (a switch flips, a choice is picked, a number is typed within its limits, a folder or file is
3
+ // picked in the path picker, a list is edited item by item), and the exact command line it will run shown live (the
4
+ // same line you could type yourself). Built from manifest.ts, so a new command or option appears here on its own.
5
+ import { z } from 'zod';
4
6
  import { humanBytes } from '../../core/disk.js';
5
- import { fail, plainText } from '../../core/util/index.js';
7
+ import { plainText } from '../../core/util/index.js';
6
8
  import { SandboxChannel } from '../../host/channel/index.js';
7
9
  import { isSandboxRunning } from '../../host/sandbox/index.js';
10
+ import { moveProblem } from '../../host/storage/index.js';
8
11
  import { splitArgs } from '../args.js';
9
12
  import { cleanTargetOf } from '../commands/data/collect.js';
10
- import { AccountsService, DataService } from '../services/index.js';
13
+ import { AccountsService, DataService, ProjectsService } from '../services/index.js';
11
14
  import { commandLine } from '../history.js';
12
15
  import { askedWhen } from '../manifest.js';
13
16
  import { Text, Theme } from '../tui/index.js';
14
- import { optionProblem } from './command-fields.js';
17
+ import { actionOf, argLabel, argPathKind, optionLabel, optionPathKind, optionProblem, plainDescription, plainSummary, } from './command-fields.js';
18
+ import { StringListEditor } from './settings/collections/string-list-editor.js';
19
+ import { askPath } from './settings/ask-path.js';
20
+ import { SchemaNode } from '../../app/kernel/index.js';
21
+ import { ValueEditor } from './settings/value-editor.js';
15
22
  const MORE = '@more';
23
+ const OTHER = '@other';
16
24
  export class CommandForm {
17
25
  app;
18
26
  ctx;
@@ -36,6 +44,11 @@ export class CommandForm {
36
44
  ]);
37
45
  }
38
46
  }
47
+ /** The actions the command's first argument offers (account: save, use, rename ...). */
48
+ actions() {
49
+ const choices = this.spec.args[0]?.choices;
50
+ return Array.isArray(choices) ? choices : [];
51
+ }
39
52
  /** Values a choices list names, filled in from config and the running sandbox. */
40
53
  choices(choices) {
41
54
  if (Array.isArray(choices))
@@ -53,10 +66,21 @@ export class CommandForm {
53
66
  first() {
54
67
  return this.values.get('arg:' + this.spec.args[0]?.name)?.[0] ?? '';
55
68
  }
69
+ valueOf(name) {
70
+ return this.values.get('arg:' + name)?.[0] ?? '';
71
+ }
56
72
  /** Options the form may ask for at all (advanced ones included). */
57
73
  askable() {
58
74
  const first = this.first();
59
- return this.spec.options.filter((o) => !o.noMenu && askedWhen(o.when, first) && !(typeof o.choices === 'string' && !this.choices(o.choices).length));
75
+ return this.spec.options.filter((o) => {
76
+ if (o.noMenu || !askedWhen(o.when, first))
77
+ return false;
78
+ if (typeof o.choices === 'string' && !this.choices(o.choices).length)
79
+ return false;
80
+ // "(check) the folder": asked only for that action.
81
+ const action = actionOf(o.description, this.actions());
82
+ return !action || action === first;
83
+ });
60
84
  }
61
85
  hiddenCount() {
62
86
  return this.showAdvanced ? 0 : this.askable().filter((o) => o.advanced && !this.values.has('opt:' + o.flag)).length;
@@ -102,7 +126,7 @@ export class CommandForm {
102
126
  /** The name of a required argument that has no value yet. */
103
127
  missing() {
104
128
  const field = this.fields().find((f) => f.kind === 'arg' && f.spec.required && !this.values.get(this.id(f))?.length);
105
- return field?.kind === 'arg' ? Text.humanize(field.spec.name) : undefined;
129
+ return field?.kind === 'arg' ? argLabel(field.spec) : undefined;
106
130
  }
107
131
  item(f) {
108
132
  const v = this.values.get(this.id(f));
@@ -119,12 +143,13 @@ export class CommandForm {
119
143
  : Array.isArray(v) && v.length
120
144
  ? v.join(' ')
121
145
  : Theme.muted('not set');
146
+ const actions = this.actions();
122
147
  if (f.kind === 'arg')
123
148
  return {
124
149
  value: this.id(f),
125
- label: Text.humanize(f.spec.name),
150
+ label: argLabel(f.spec),
126
151
  hint: shown,
127
- description: f.spec.description,
152
+ description: plainDescription(f.spec.description, actions),
128
153
  section: 'What',
129
154
  keywords: f.spec.name,
130
155
  };
@@ -133,8 +158,9 @@ export class CommandForm {
133
158
  value: 'json',
134
159
  label: 'Machine-readable output',
135
160
  hint: shown,
136
- description: 'Print JSON instead of a table (--json).',
161
+ description: 'Print JSON instead of a table.',
137
162
  section: 'Output',
163
+ flip: true,
138
164
  };
139
165
  if (f.kind === 'extra')
140
166
  return {
@@ -148,15 +174,12 @@ export class CommandForm {
148
174
  };
149
175
  return {
150
176
  value: this.id(f),
151
- label: f.spec.label ??
152
- f.spec.flag
153
- .replace(/^--/, '')
154
- .replace(/-/g, ' ')
155
- .replace(/^./, (c) => c.toUpperCase()),
177
+ label: optionLabel(f.spec),
156
178
  hint: shown,
157
- description: f.spec.description,
179
+ description: plainDescription(f.spec.description, actions),
158
180
  section: f.spec.advanced ? 'Advanced' : 'Options',
159
181
  keywords: f.spec.flag,
182
+ flip: f.spec.type === 'boolean',
160
183
  };
161
184
  }
162
185
  /** Shows the form until you run the command (its argv) or go back (null). */
@@ -170,7 +193,7 @@ export class CommandForm {
170
193
  const line = commandLine(this.argv());
171
194
  const picked = await this.app.list({
172
195
  path,
173
- intro: this.spec.summary.replace(/^./, (c) => c.toUpperCase()) + '.',
196
+ intro: plainSummary(this.spec.summary),
174
197
  status: Theme.muted('$ ') + Theme.accent(line),
175
198
  items: [
176
199
  ...fields.map((f) => this.item(f)),
@@ -181,8 +204,9 @@ export class CommandForm {
181
204
  startAt: focus,
182
205
  actions: [
183
206
  { key: 'r', label: 'start', ctrl: true },
184
- { key: 'r', label: 'clear' },
207
+ { key: 'r', label: 'clear', applies: (id) => this.values.has(id) },
185
208
  ],
209
+ enterLabel: (_category, id) => (id === MORE ? 'show' : this.isSwitch(id) ? 'flip' : 'change'),
186
210
  notice,
187
211
  });
188
212
  notice = undefined;
@@ -210,64 +234,124 @@ export class CommandForm {
210
234
  this.values.delete(this.id(field));
211
235
  continue;
212
236
  }
213
- await this.edit(field, path);
237
+ notice = await this.edit(field, path);
214
238
  // Enter on the last field starts it (a switch only flips).
215
239
  const isSwitch = field.kind === 'json' || (field.kind === 'option' && field.spec.type === 'boolean');
216
240
  if (field === fields[fields.length - 1] && !isSwitch && !hidden && !this.missing())
217
241
  return this.argv();
218
242
  }
219
243
  }
244
+ isSwitch(id) {
245
+ const f = this.fields().find((x) => this.id(x) === id);
246
+ return f?.kind === 'json' || (f?.kind === 'option' && f.spec.type === 'boolean');
247
+ }
248
+ /** Sets (or, with no value, clears) a field's answer. */
249
+ set(id, value) {
250
+ if (value.length)
251
+ this.values.set(id, value);
252
+ else
253
+ this.values.delete(id);
254
+ }
255
+ /** The kind of path a field takes (a folder or a file), if it is one. */
256
+ pathKind(f) {
257
+ if (f.kind === 'option')
258
+ return optionPathKind(f.spec);
259
+ return f.kind === 'arg' ? argPathKind(f.spec, this.spec.name, this.first()) : undefined;
260
+ }
261
+ /** A name that does not exist yet (the new login's name): typed, not picked. */
262
+ freeText(f) {
263
+ return f.kind === 'arg' && this.spec.name === 'account' && f.spec.name === 'name' && this.first() === 'save';
264
+ }
265
+ /** The values to pick from for a field with a fixed or looked-up set of answers. */
266
+ options(f) {
267
+ if (f.kind === 'extra' || f.kind === 'json' || this.freeText(f))
268
+ return [];
269
+ const fixed = this.choices(f.spec.choices);
270
+ if (fixed.length || f.kind !== 'arg' || this.spec.name !== 'projects')
271
+ return fixed;
272
+ const first = this.first();
273
+ if (f.spec.name === 'value' && first === 'all')
274
+ return ['on', 'off'];
275
+ if (f.spec.name === 'value' && first === 'roots')
276
+ return ['list', 'add', 'remove'];
277
+ if (f.spec.name === 'folder' && this.valueOf('value') === 'remove')
278
+ return new ProjectsService(this.ctx).list().roots;
279
+ return [];
280
+ }
281
+ /** Changes one field with the input that fits it. Returns a notice to show (when there is something to say). */
220
282
  async edit(f, path) {
221
283
  const id = this.id(f);
222
284
  const current = this.values.get(id);
223
285
  if (f.kind === 'json' || (f.kind === 'option' && f.spec.type === 'boolean')) {
224
286
  this.values.set(id, current !== true);
225
- return;
287
+ return undefined;
226
288
  }
227
- const label = f.kind === 'extra' ? 'Arguments' : f.kind === 'arg' ? Text.humanize(f.spec.name) : f.spec.flag;
228
- const about = f.kind === 'extra' ? [] : [f.spec.description];
289
+ const label = f.kind === 'extra' ? 'Arguments' : f.kind === 'arg' ? argLabel(f.spec) : optionLabel(f.spec);
290
+ const about = f.kind === 'extra' ? [] : [plainDescription(f.spec.description, this.actions())];
291
+ const here = [...path, label];
229
292
  if (f.kind === 'arg' && this.spec.name === 'data' && f.spec.name === 'targets') {
230
293
  const picked = await this.dataTargets(path);
231
294
  if (picked)
232
295
  this.values.set(id, picked);
233
- return;
296
+ return undefined;
234
297
  }
235
- const list = f.kind === 'extra' ? [] : this.choices(f.spec.choices);
236
298
  const many = (f.kind === 'option' && f.spec.type === 'list') || (f.kind === 'arg' && f.spec.variadic);
299
+ const list = this.options(f);
237
300
  if (list.length && many) {
238
301
  const picked = await this.app.list({
239
- path: [...path, label],
302
+ path: here,
240
303
  intro: about,
241
304
  multi: true,
242
305
  items: list.map((v) => ({ value: v, label: v, checked: Array.isArray(current) && current.includes(v) })),
243
306
  });
244
307
  if (picked.kind === 'multi')
245
- this.values.set(id, picked.values);
246
- return;
308
+ this.set(id, picked.values);
309
+ return undefined;
310
+ }
311
+ if (f.kind === 'arg' && this.spec.name === 'projects' && f.spec.name === 'value' && this.projectAction()) {
312
+ await this.projectFolder(id, here, about);
313
+ return undefined;
247
314
  }
248
315
  if (list.length) {
249
316
  const optional = !(f.kind === 'arg' && f.spec.required);
250
- const picked = await this.app.choose([...path, label], about.join(' '), [
317
+ const picked = await this.app.choose(here, about.join(' '), [
251
318
  ...list.map((v) => ({ value: v, label: v })),
252
319
  ...(optional ? [{ value: '', label: Theme.muted('(not set)') }] : []),
253
320
  ], Array.isArray(current) ? current[0] : undefined);
254
- if (picked !== undefined) {
255
- if (picked === '')
256
- this.values.delete(id);
257
- else
258
- this.values.set(id, [picked]);
259
- }
260
- return;
321
+ if (picked !== undefined)
322
+ this.set(id, picked === '' ? [] : [picked]);
323
+ return undefined;
261
324
  }
262
- if (f.kind === 'arg' && typeof f.spec.choices === 'string')
263
- fail('There is nothing to choose from: no ' + f.spec.choices + ' yet.', f.spec.choices === 'accounts'
264
- ? 'Sign in inside the sandbox, then run: sandbox account save <name>'
265
- : 'Start one first (sandbox claude).');
325
+ if (f.kind !== 'extra' && typeof f.spec.choices === 'string' && !this.freeText(f))
326
+ return this.nothingToChoose(f.spec.choices);
327
+ const kind = this.pathKind(f);
328
+ if (kind && f.kind !== 'extra') {
329
+ if (many)
330
+ return this.pathList(id, here, about, kind);
331
+ const picked = await askPath(this.app, {
332
+ path: here,
333
+ title: kind === 'file' ? 'Choose the file' : 'Choose the folder',
334
+ about,
335
+ kind,
336
+ initial: Array.isArray(current) ? current[0] : '',
337
+ validate: (v) => this.pathProblem(f, v),
338
+ });
339
+ if (picked !== undefined)
340
+ this.set(id, [picked]);
341
+ return undefined;
342
+ }
343
+ if (f.kind === 'option' && f.spec.type === 'list')
344
+ return this.pathList(id, here, about, undefined);
345
+ const number = f.kind === 'option' && f.spec.type === 'number' ? f.spec : undefined;
266
346
  const typed = await this.app.text({
267
- path: [...path, label],
347
+ path: here,
268
348
  label,
269
349
  about,
270
350
  allowEmpty: true,
351
+ accept: number ? /[0-9]/ : undefined,
352
+ hint: number
353
+ ? 'A whole number greater than 0' + (number.default !== undefined ? '. Default: ' + number.default : '') + '.'
354
+ : undefined,
271
355
  initial: Array.isArray(current)
272
356
  ? many || f.kind === 'extra'
273
357
  ? current.map((x) => (/\s/.test(x) ? '"' + x + '"' : x)).join(' ')
@@ -276,12 +360,51 @@ export class CommandForm {
276
360
  validate: (v) => (f.kind === 'option' ? (optionProblem(f.spec, v) ?? true) : true),
277
361
  });
278
362
  if (typed === undefined)
363
+ return undefined;
364
+ this.set(id, many || f.kind === 'extra' ? splitArgs(typed) : typed.trim() ? [typed.trim()] : []);
365
+ return undefined;
366
+ }
367
+ /** Is the problem with a picked path (true = fine)? Moving or switching the data folder has its own rules. */
368
+ pathProblem(f, picked) {
369
+ if (this.spec.name === 'storage' && f.kind === 'arg') {
370
+ const problem = moveProblem(this.ctx.storageRoot, picked, true);
371
+ return problem ? problem.message : true;
372
+ }
373
+ return f.kind === 'option' ? (optionProblem(f.spec, picked) ?? true) : true;
374
+ }
375
+ /** Several folders or files (--script ...): a list to add to, change and remove from. */
376
+ async pathList(id, path, about, kind) {
377
+ const node = new SchemaNode(z.array(z.string()).describe(about.join(' ')));
378
+ const edited = await new StringListEditor(this.app, path, node, new ValueEditor(this.app), [], kind, 'Esc keeps it for the command').run(Array.isArray(this.values.get(id)) ? [...this.values.get(id)] : []);
379
+ if (edited)
380
+ this.set(id, edited.value);
381
+ return undefined;
382
+ }
383
+ /** projects remove / include / exclude pick from the known projects (or any folder); add takes a folder. */
384
+ projectAction() {
385
+ return ['remove', 'include', 'exclude'].includes(this.first());
386
+ }
387
+ async projectFolder(id, path, about) {
388
+ const known = new ProjectsService(this.ctx).list().projects.map((p) => p.folder);
389
+ const current = this.values.get(id);
390
+ const picked = await this.app.choose(path, about.join(' '), [...known.map((v) => ({ value: v, label: v })), { value: OTHER, label: 'Another folder…' }], Array.isArray(current) ? current[0] : undefined);
391
+ if (picked === undefined)
279
392
  return;
280
- const value = many || f.kind === 'extra' ? splitArgs(typed) : typed.trim() ? [typed.trim()] : [];
281
- if (value.length)
282
- this.values.set(id, value);
283
- else
284
- this.values.delete(id);
393
+ if (picked !== OTHER) {
394
+ this.set(id, [picked]);
395
+ return;
396
+ }
397
+ const folder = await askPath(this.app, { path, title: 'Choose the folder', about, kind: 'dir' });
398
+ if (folder !== undefined)
399
+ this.set(id, [folder]);
400
+ }
401
+ /** Nothing to pick from (no saved logins, no running session): say what to do, in the form, without an error. */
402
+ nothingToChoose(what) {
403
+ return Theme.warn(what === 'accounts'
404
+ ? 'No saved logins yet: sign in inside the sandbox, then save it in Accounts.'
405
+ : what === 'sessions'
406
+ ? 'No session is running: start an agent first.'
407
+ : 'There is nothing to choose from yet.');
285
408
  }
286
409
  /** `data clean` targets, ticked from a list with their sizes (never "all": that is typed on purpose). */
287
410
  async dataTargets(path) {
@@ -0,0 +1,18 @@
1
+ import type { Context } from '../commands/context.js';
2
+ import type { App } from '../tui/index.js';
3
+ import type { ShellExit } from './shell.js';
4
+ /** The row in Settings and Maintenance. */
5
+ export declare function dataFolderRow(ctx: Context): {
6
+ label: string;
7
+ hint: string;
8
+ description: string;
9
+ };
10
+ export declare class DataFolderFlow {
11
+ private readonly app;
12
+ private readonly ctx;
13
+ constructor(app: App, ctx: Context);
14
+ /** The command to run (move or use), or undefined when nothing was chosen. */
15
+ run(): Promise<ShellExit | undefined>;
16
+ private measure;
17
+ private decide;
18
+ }
@@ -0,0 +1,99 @@
1
+ // The "Data folder" row and its flow: shows where the saved data is, lets you pick another folder in the path picker,
2
+ // asks whether to move the data or only switch, and hands the command to run on the normal screen (the move prints its
3
+ // progress there).
4
+ import fs from 'node:fs';
5
+ import { humanBytes } from '../../core/disk.js';
6
+ import { describeDuration, describeSize, estimate, holdsData, measureFolder, moveProblem, moveWarning, } from '../../host/storage/index.js';
7
+ /** Measuring for the dialog stops after this long (the size then reads "at least"). */
8
+ const MEASURE_MS = 8000;
9
+ /** The row in Settings and Maintenance. */
10
+ export function dataFolderRow(ctx) {
11
+ return {
12
+ label: 'Data folder',
13
+ hint: ctx.storageRoot,
14
+ description: 'Where your tools, logins, history and logs are kept between sandboxes. Press Enter to move them to another folder or drive, or to use a different folder.',
15
+ };
16
+ }
17
+ export class DataFolderFlow {
18
+ app;
19
+ ctx;
20
+ constructor(app, ctx) {
21
+ this.app = app;
22
+ this.ctx = ctx;
23
+ }
24
+ /** The command to run (move or use), or undefined when nothing was chosen. */
25
+ async run() {
26
+ const from = this.ctx.storageRoot;
27
+ const exists = fs.existsSync(from);
28
+ const measured = exists ? this.measure(from) : { bytes: 0, files: 0, partial: false };
29
+ const size = exists && holdsData(from) ? describeSize(measured) : 'nothing in it yet';
30
+ const to = await this.app.pickPath({
31
+ path: ['Data folder'],
32
+ title: 'Choose the folder for your saved data',
33
+ about: [
34
+ 'Now: ' + from + ' (' + size + ').',
35
+ 'Pick a new or empty folder to move your data there, or a folder that already holds data to use it.',
36
+ ],
37
+ initial: from.replace(/[\\/][^\\/]*$/, '\\'),
38
+ use: 'use this folder',
39
+ validate: (picked) => {
40
+ const problem = moveProblem(from, picked, true);
41
+ return problem ? problem.message : true;
42
+ },
43
+ });
44
+ if (!to)
45
+ return undefined;
46
+ return this.decide(from, to, measured, exists);
47
+ }
48
+ measure(from) {
49
+ const before = this.app.status;
50
+ this.app.status = () => 'Measuring your saved data…';
51
+ this.app.redraw();
52
+ try {
53
+ return measureFolder(from, MEASURE_MS);
54
+ }
55
+ finally {
56
+ this.app.status = before;
57
+ }
58
+ }
59
+ async decide(from, to, measured, exists) {
60
+ if (to.toLowerCase() === from.toLowerCase())
61
+ return undefined;
62
+ const target = holdsData(to);
63
+ const lines = [];
64
+ let canMove = exists && holdsData(from) && !target;
65
+ if (canMove) {
66
+ const est = estimate(from, to, measured);
67
+ lines.push('From: ' + from, 'To: ' + to, 'Size: ' + describeSize(measured));
68
+ lines.push(est.sameVolume
69
+ ? 'Time: a few seconds (same drive, nothing is copied)'
70
+ : 'Time: ' + describeDuration(est.seconds) + ' (copied to another drive)');
71
+ if (est.freeBytes !== null)
72
+ lines.push('Free space on the target drive: ' + humanBytes(est.freeBytes));
73
+ const warning = moveWarning(measured, est);
74
+ if (warning)
75
+ lines.push('', warning);
76
+ if (!est.fits)
77
+ canMove = false;
78
+ }
79
+ else {
80
+ lines.push(target ? to + ' already holds data, so it is used as it is.' : 'There is nothing in ' + from + ' to move.', 'Your data stays where it is.');
81
+ }
82
+ const choice = await this.app.dialog({
83
+ title: canMove ? 'Move your data to ' + to + '?' : 'Use ' + to + '?',
84
+ lines: [...lines, '', 'Use without moving: the new folder is used from now on and your old data is left behind.'],
85
+ choices: [
86
+ ...(canMove ? [{ value: 'move', label: 'Move data', key: 'm' }] : []),
87
+ { value: 'use', label: 'Switch without moving', key: 's' },
88
+ { value: 'cancel', label: 'Cancel', key: 'c' },
89
+ ],
90
+ initial: 0,
91
+ escape: 'cancel',
92
+ });
93
+ if (choice === 'move')
94
+ return { kind: 'run', argv: ['storage', 'move', to, '--yes'] };
95
+ if (choice === 'use')
96
+ return { kind: 'run', argv: ['storage', 'use', to, '--yes'] };
97
+ return undefined;
98
+ }
99
+ }
@@ -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 {};
@@ -0,0 +1,126 @@
1
+ // Running the shared core's actions inside the menu: an operation's questions become the menu's dialogs (yes/no over
2
+ // the screen, a text field, the path picker, a list), its fields the settings editors, its progress the page's notice,
3
+ // and what it said so far is shown above its next question. The result is one notice line: what it did, or what went
4
+ // wrong and how to fix it. A link leaves the menu for what needs the terminal (attach, a start).
5
+ import { operationById } from '../../app/features/defs.js';
6
+ import { runDefinition } from '../../app/registry.js';
7
+ import { Cancelled, ioFromAsker, SchemaNode, toWireError, } from '../../app/kernel/index.js';
8
+ import { errMsg } from '../../core/util/index.js';
9
+ import { Theme } from '../tui/index.js';
10
+ import { askPath } from './settings/ask-path.js';
11
+ import { ValueEditor } from './settings/value-editor.js';
12
+ async function ask(app, where, q, said) {
13
+ const lines = [...said, ...(q.lines ?? []), ...('problem' in q && q.problem ? [Theme.warn(q.problem)] : [])];
14
+ const path = [...where];
15
+ switch (q.kind) {
16
+ case 'confirm': {
17
+ if (!q.typed)
18
+ return app.ask(q.title, lines, q.yes ?? 'Yes', q.danger ?? false);
19
+ const typed = await app.text({ path, label: 'Type "' + q.typed + '" to confirm', about: [q.title, ...lines] });
20
+ return typed?.trim().toLowerCase() === q.typed;
21
+ }
22
+ case 'choose':
23
+ return app.choose(path, [q.title, ...lines].join(' '), q.choices, q.initial);
24
+ case 'checklist': {
25
+ const picked = await app.list({
26
+ path,
27
+ intro: [q.title, ...lines],
28
+ multi: true,
29
+ items: q.choices.map((ch) => ({ ...ch, checked: q.checked?.includes(ch.value) ?? false })),
30
+ });
31
+ return picked.kind === 'multi' ? picked.values : undefined;
32
+ }
33
+ case 'path':
34
+ return askPath(app, {
35
+ path,
36
+ title: q.title,
37
+ about: lines,
38
+ kind: q.pathKind,
39
+ initial: q.initial,
40
+ literals: q.literals,
41
+ });
42
+ case 'text':
43
+ case 'secret':
44
+ return app.text({
45
+ path,
46
+ label: q.title,
47
+ about: lines,
48
+ initial: q.kind === 'text' ? q.initial : undefined,
49
+ allowEmpty: q.kind === 'text' ? q.allowEmpty : false,
50
+ masked: q.kind === 'secret',
51
+ });
52
+ }
53
+ }
54
+ /** Where a link goes in the menu: what needs the terminal is run on the normal screen. */
55
+ function follow(target) {
56
+ switch (target.kind) {
57
+ case 'terminal':
58
+ return { exit: { kind: 'run', argv: ['attach', target.session] } };
59
+ case 'start-agent':
60
+ return { exit: { kind: 'run', argv: ['launch', '--harness', target.agent] } };
61
+ case 'command':
62
+ return { exit: { kind: 'run', argv: [...target.argv] } };
63
+ case 'view':
64
+ return {};
65
+ }
66
+ }
67
+ export class MenuOperations {
68
+ app;
69
+ ctx;
70
+ constructor(app, ctx) {
71
+ this.app = app;
72
+ this.ctx = ctx;
73
+ }
74
+ /** Does what an action of a page says: follows a link, or asks for its fields and runs its operation. */
75
+ async perform(action, where, busy) {
76
+ if (action.kind === 'link')
77
+ return follow(action.target);
78
+ const def = operationById(action.op);
79
+ if (!def)
80
+ return { notice: Theme.error(Theme.glyph.cross + ' Unknown operation ' + action.op + '.') };
81
+ const answers = await this.fields(action, def, where);
82
+ if (!answers)
83
+ return {};
84
+ return { reload: true, notice: await this.run(def, { ...action.input, ...answers }, where, busy) };
85
+ }
86
+ /** The values of an action's fields, from the editors that fit them (undefined: one was backed out of). */
87
+ async fields(action, def, where) {
88
+ const answers = {};
89
+ const editor = new ValueEditor(this.app);
90
+ for (const field of action.fields ?? []) {
91
+ const node = new SchemaNode(def.input).child(field.name);
92
+ if (!node)
93
+ continue;
94
+ const edited = await editor.edit([...where, field.label], [...field.key], node, action.initial?.[field.name]);
95
+ if (!edited)
96
+ return undefined;
97
+ answers[field.name] = edited.value;
98
+ }
99
+ return answers;
100
+ }
101
+ /**
102
+ * Runs a definition with this input and returns the notice to show: its text (✓), the problem and its fix (✘), or
103
+ * undefined when a question was declined (nothing changed, nothing to say).
104
+ */
105
+ async run(def, input, where, busy = () => undefined) {
106
+ const said = [];
107
+ const asker = async (q) => (await ask(this.app, where, q, said.splice(0)));
108
+ const io = ioFromAsker(asker, {
109
+ progress: (text) => busy(Theme.muted(text + '…')),
110
+ log: (text, tone) => said.push(tone === 'warn' || tone === 'danger' ? Theme.warn(text) : text),
111
+ });
112
+ try {
113
+ const output = await runDefinition(def.id, this.ctx, input, io);
114
+ const text = def.text?.(output);
115
+ return text ? Theme.ok(Theme.glyph.ok + ' ' + text) : undefined;
116
+ }
117
+ catch (e) {
118
+ if (e instanceof Cancelled)
119
+ return undefined;
120
+ const problem = toWireError(e);
121
+ if (problem.kind === 'bug')
122
+ return Theme.error(Theme.glyph.cross + ' ' + errMsg(e));
123
+ return (Theme.error(Theme.glyph.cross + ' ' + problem.message) + (problem.fix ? Theme.muted(' ' + problem.fix) : ''));
124
+ }
125
+ }
126
+ }
@@ -0,0 +1,27 @@
1
+ export interface LiveOptions {
2
+ /** Fetches the process list (default: tasklist, run without blocking). */
3
+ readonly fetch?: () => Promise<string>;
4
+ /** The status line from the facts now (reads the cached process list and small files; never runs a program). */
5
+ readonly derive: () => string;
6
+ /** The line changed: draw again. */
7
+ readonly onChange: () => void;
8
+ readonly intervalMs?: number;
9
+ }
10
+ export declare class LiveStatus {
11
+ private readonly o;
12
+ private tasklist;
13
+ private text;
14
+ private timer;
15
+ private pending;
16
+ private running;
17
+ constructor(o: LiveOptions);
18
+ /** The status line as of the last refresh. */
19
+ line(): string;
20
+ /** Reads the process list now and derives the line (one fetch at a time; a caller during one waits for it). */
21
+ refresh(): Promise<void>;
22
+ private derive;
23
+ /** Starts keeping the line fresh and answers the host's process questions from it (until stop). */
24
+ start(): Promise<void>;
25
+ /** Stops; the host's questions run their own programs again (a command that runs after the menu needs the truth). */
26
+ stop(): void;
27
+ }