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,116 +1,86 @@
1
- // Tab 5: every setting, for all projects or just this project (two scopes), grouped into categories on the left and
2
- // searchable, with each value, its default and its description. Changes are staged in the Draft (marked *) and
3
- // written with Ctrl+S; Enter edits, r resets to the default, z undoes an unsaved change.
1
+ // Section 5: every setting, for all projects or just this project (two scopes), grouped into categories on the left and
2
+ // searchable, with each value, its default and its description. The rows (which settings, their values, secrets as
3
+ // ***) are the settings feature's; this page lays the unsaved changes over them: changes are staged in the Draft
4
+ // (marked *) and written with Ctrl+S; Enter edits, r resets to the default, z undoes an unsaved change.
4
5
  import _ from 'lodash';
5
- import { NEVER_LOOSER } from '../../../core/local-config/index.js';
6
+ import { CATEGORIES, labelOf, nameOf, settingRow, settingsOf, } from '../../../app/features/settings/index.js';
7
+ import { valueText } from '../../../app/kernel/index.js';
6
8
  import { errMsg } from '../../../core/util/index.js';
7
9
  import { Text, Theme, } from '../../tui/index.js';
8
- import { CATEGORIES, categoryOf, nameOf } from '../settings/categories.js';
9
- import { formatValue } from '../settings/format.js';
10
+ import { dataFolderRow, DataFolderFlow } from '../data-folder.js';
11
+ import { EXPORT_SETTINGS, IMPORT_SETTINGS, ShareSettingsFlow, shareSettingsRows } from '../share-settings.js';
12
+ import { VpnLoginFlow, vpnLoginRow, VPN_LOGIN } from '../vpn-login.js';
10
13
  import { ValueEditor } from '../settings/value-editor.js';
11
14
  import { SCOPES, scopeStatus } from './scopes.js';
12
15
  import { ListPage } from './list-page.js';
13
- /** Every editable setting with the category and heading it is shown under. */
14
- export function settingsOf(file) {
15
- return file.schema.children().flatMap(([top, node]) => {
16
- const category = categoryOf(top);
17
- if (!category)
18
- return [];
19
- const several = category.keys.filter((k) => file.schema.child(k)).length > 1;
20
- if (!node.isSection)
21
- return [
22
- {
23
- key: [top],
24
- node,
25
- category: category.id,
26
- section: several && category.id !== 'general' ? nameOf(top) : undefined,
27
- },
28
- ];
29
- return node.leaves([top]).map(({ key, node: leaf }) => {
30
- const heading = [
31
- several ? nameOf(top) : undefined,
32
- key.length > 2 ? key.slice(1, -1).map(nameOf).join(' › ') : undefined,
33
- ]
34
- .filter(Boolean)
35
- .join(' › ');
36
- return { key, node: leaf, category: category.id, section: heading || undefined };
37
- });
38
- });
39
- }
40
- /** What the file will say for a setting once the staged changes are saved (undefined = not set there). */
41
- function written(file, draft, key) {
42
- return draft.has(file, key) ? draft.value(file, key) : file.valueInFile(key);
43
- }
44
- /** What is in effect for a setting once the staged changes are saved. */
45
- function effective(file, draft, key, config) {
46
- if (file.isProject)
47
- return written(file, draft, key);
48
- return draft.has(file, key) ? (draft.value(file, key) ?? file.defaultOf(key)) : _.get(config, key);
16
+ export { settingsOf };
17
+ /** The files with the menu's unsaved changes laid over them. */
18
+ function draftSource(draft) {
19
+ const written = (file, key) => draft.has(file, key) ? draft.value(file, key) : file.valueInFile(key);
20
+ return {
21
+ written,
22
+ effective: (file, key, config) => file.isProject
23
+ ? written(file, key)
24
+ : draft.has(file, key)
25
+ ? (draft.value(file, key) ?? file.defaultOf(key))
26
+ : _.get(config, key),
27
+ };
49
28
  }
50
- /** Plain words for settings whose key is jargon (the key itself stays in the details pane). */
51
- const LABELS = {
52
- mappings: 'Extra folders from this PC',
53
- 'sandbox.vGpu': 'Graphics acceleration',
54
- 'sandbox.headless': 'Hide the sandbox window',
55
- 'sandbox.memoryMb': 'Memory (MB)',
56
- 'sandbox.pageFileMb': 'Swap file (MB)',
57
- 'network.dns': 'DNS servers',
58
- 'projects.wsbShare': 'Add folders while the sandbox runs',
59
- 'projects.all': 'Map all known projects at start',
60
- 'claudeProfile.hostDir': 'Claude folder on this PC',
61
- 'claudeProfile.globalStateFile': 'Claude state file on this PC',
62
- };
63
- function labelOf(key) {
64
- return LABELS[key.join('.')] ?? Text.humanize(key[key.length - 1]);
29
+ /** A value of a row in one short line, painted like every value in the menu. */
30
+ function shown(row, value, max = 60) {
31
+ const v = valueText(value, row.field, max);
32
+ return v.tone === 'ok' ? Theme.ok(v.text) : v.tone === 'muted' ? Theme.muted(v.text) : v.text;
65
33
  }
66
- function item(s, files, scope, draft, config) {
67
- const file = files[scope];
68
- const id = s.key.join('.');
69
- const set = written(file, draft, s.key) !== undefined;
70
- const unsaved = draft.has(file, s.key);
71
- const yours = effective(files.user, draft, s.key, config);
72
- const project = files.project;
73
- const inProject = project.schema.leaves().some((l) => l.key.join('.') === id)
74
- ? written(project, draft, s.key)
75
- : undefined;
34
+ function item(row, file, draft) {
35
+ const unsaved = draft.has(file, row.key);
76
36
  const paint = file.isProject ? Theme.project : Theme.changed;
77
- const value = file.isProject && !set
78
- ? Theme.muted('all projects: ') + formatValue(yours, 40)
79
- : formatValue(effective(file, draft, s.key, config));
37
+ const value = file.isProject && !row.set ? Theme.muted('all projects: ') + shown(row, row.yours, 40) : shown(row, row.value);
80
38
  const details = [
81
- Theme.muted('Setting ') + id,
39
+ Theme.muted('Setting ') + row.id,
82
40
  Theme.muted('All projects ') +
83
- formatValue(yours, 40) +
84
- Theme.muted(written(files.user, draft, s.key) === undefined ? ' (built-in default)' : ' (your file)'),
41
+ shown(row, row.yours, 40) +
42
+ Theme.muted(row.yoursSet ? ' (your file)' : ' (built-in default)'),
85
43
  Theme.muted('This project ') +
86
- (inProject === undefined ? Theme.muted('not set') : Theme.project(Text.strip(formatValue(inProject, 40)))),
87
- ...(!file.isProject ? [Theme.muted('Default ') + formatValue(file.defaultOf(s.key), 40)] : []),
44
+ (row.inProject === undefined ? Theme.muted('not set') : Theme.project(Text.strip(shown(row, row.inProject, 40)))),
45
+ ...(!file.isProject ? [Theme.muted('Default ') + shown(row, row.default, 40)] : []),
88
46
  ...(unsaved ? [Theme.warn('Unsaved: Ctrl+S saves, z undoes this change.')] : []),
89
- ...(file.isProject && NEVER_LOOSER.includes(id)
47
+ ...(file.isProject && row.locked
90
48
  ? [Theme.warn(Theme.glyph.lock + ' A project can only make this stricter than your own setting.')]
91
49
  : []),
92
50
  ];
93
51
  return {
94
- value: id,
95
- label: labelOf(s.key),
52
+ value: row.id,
53
+ label: row.label,
96
54
  hint: unsaved
97
55
  ? paint(Text.strip(value)) + ' ' + Theme.warn('*')
98
- : set
56
+ : row.set
99
57
  ? paint(Text.strip(value)) + ' ' + paint(Theme.glyph.changed)
100
58
  : value,
101
- description: s.node.description,
59
+ description: row.field.help,
102
60
  details,
103
- section: s.section,
104
- category: s.category,
105
- keywords: id,
106
- flip: s.node.editor === 'boolean',
61
+ section: row.section,
62
+ category: row.category,
63
+ keywords: row.id,
64
+ flip: row.field.kind === 'boolean',
107
65
  };
108
66
  }
109
- /** The list for the settings tab. Pure (reads the files it is given). */
110
- export function settingsOptions(files, scope, draft) {
67
+ /** What a setting is now for editing: the staged value, else the file's (a project), else what is in effect. */
68
+ function current(file, draft, key, config) {
69
+ const source = draftSource(draft);
70
+ return file.isProject ? (source.written(file, key) ?? _.get(config, key)) : source.effective(file, key, config);
71
+ }
72
+ /** The row in General that opens the data folder flow (your own settings only). */
73
+ export const DATA_FOLDER = '@data-folder';
74
+ /** The list for the settings section. Pure (reads the files it is given). `extra` are rows that are not settings. */
75
+ export function settingsOptions(files, scope, draft, extra = []) {
111
76
  const file = files[scope];
112
- const config = file.userConfig();
113
- const settings = settingsOf(file);
77
+ const config = files.user.userConfig();
78
+ // The Data folder row stands in for the storage folder setting (changing it moves the data, which is asked about).
79
+ const hideRoot = !file.isProject && extra.some((e) => e.value === DATA_FOLDER);
80
+ const settings = settingsOf(file).filter((s) => !(hideRoot && s.key.join('.') === 'storage.root'));
81
+ const rows = settings.map((s) => settingRow(s, files, scope, draftSource(draft), config));
82
+ const set = new Set(rows.filter((r) => r.set).map((r) => r.id));
83
+ const unsaved = new Set(rows.filter((r) => draft.has(file, r.key)).map((r) => r.id));
114
84
  const categories = CATEGORIES.filter((c) => settings.some((s) => s.category === c.id)).map((c) => ({
115
85
  id: c.id,
116
86
  label: c.label,
@@ -120,27 +90,32 @@ export function settingsOptions(files, scope, draft) {
120
90
  path: [],
121
91
  status: scopeStatus(file),
122
92
  tabs: { items: SCOPES.map((x) => x.tab), active: SCOPES.findIndex((x) => x.scope === scope) },
123
- items: settings.map((s) => item(s, files, scope, draft, config)),
93
+ items: [...rows.map((r) => item(r, file, draft)), ...(file.isProject ? [] : extra)],
124
94
  categories,
125
95
  actions: [
126
- { key: 'r', label: file.isProject ? 'remove' : 'reset' },
127
- { key: 'z', label: 'undo' },
96
+ { key: 'r', label: file.isProject ? 'remove' : 'reset to default', applies: (id) => set.has(id) },
97
+ { key: 'z', label: 'undo', applies: (id) => unsaved.has(id) },
128
98
  ],
129
- enterLabel: 'edit',
130
- escapeLabel: 'quit',
99
+ enterLabel: (_category, id) => id === DATA_FOLDER || id === VPN_LOGIN
100
+ ? 'change'
101
+ : id === EXPORT_SETTINGS || id === IMPORT_SETTINGS
102
+ ? 'open'
103
+ : 'edit',
131
104
  };
132
105
  }
133
106
  export class SettingsPage extends ListPage {
134
107
  files;
135
108
  draft;
109
+ ctx;
136
110
  label = 'Settings';
137
111
  stages = true;
138
112
  scope = 'user';
139
113
  editor;
140
- constructor(app, files, draft) {
114
+ constructor(app, files, draft, ctx) {
141
115
  super(app);
142
116
  this.files = files;
143
117
  this.draft = draft;
118
+ this.ctx = ctx;
144
119
  this.editor = new ValueEditor(app, {
145
120
  suggestions: (key) => ['defaultHarness', 'harness'].includes(key.join('.'))
146
121
  ? Object.keys(this.files.user.userConfig().harnesses)
@@ -154,7 +129,12 @@ export class SettingsPage extends ListPage {
154
129
  return Promise.resolve();
155
130
  }
156
131
  options() {
157
- return settingsOptions(this.files, this.scope, this.draft);
132
+ const row = dataFolderRow(this.ctx);
133
+ return settingsOptions(this.files, this.scope, this.draft, [
134
+ { value: DATA_FOLDER, category: 'general', ...row },
135
+ { value: VPN_LOGIN, category: 'network', ...vpnLoginRow(this.ctx) },
136
+ ...shareSettingsRows().map((r) => ({ ...r, category: 'general' })),
137
+ ]);
158
138
  }
159
139
  /** Stages a value; your own file never keeps a line that only repeats the default. */
160
140
  stage(key, value) {
@@ -176,6 +156,24 @@ export class SettingsPage extends ListPage {
176
156
  return {};
177
157
  if (result.value === undefined)
178
158
  return {};
159
+ if (result.value === DATA_FOLDER) {
160
+ if (result.kind !== 'pick')
161
+ return {};
162
+ const exit = await new DataFolderFlow(this.app, this.ctx).run();
163
+ return exit ? { exit } : { reload: true };
164
+ }
165
+ if (result.value === EXPORT_SETTINGS || result.value === IMPORT_SETTINGS) {
166
+ if (result.kind !== 'pick')
167
+ return {};
168
+ const flow = new ShareSettingsFlow(this.app, this.ctx);
169
+ const notice = await (result.value === EXPORT_SETTINGS ? flow.export() : flow.import());
170
+ return { reload: true, notice };
171
+ }
172
+ if (result.value === VPN_LOGIN) {
173
+ if (result.kind !== 'pick')
174
+ return {};
175
+ return { reload: true, notice: await new VpnLoginFlow(this.app, this.ctx).run() };
176
+ }
179
177
  const setting = settingsOf(this.file).find((s) => s.key.join('.') === result.value);
180
178
  if (!setting)
181
179
  return {};
@@ -187,15 +185,10 @@ export class SettingsPage extends ListPage {
187
185
  this.stage(setting.key, undefined);
188
186
  return {};
189
187
  }
190
- if (result.value === 'apps.install')
191
- return { notice: Theme.muted('Choose apps on the Apps tab (press 4); the list is picked there, not typed.') };
192
188
  try {
193
- const config = this.file.userConfig();
194
- const current = this.file.isProject
195
- ? (written(this.file, this.draft, setting.key) ?? _.get(config, setting.key))
196
- : effective(this.file, this.draft, setting.key, config);
189
+ const now = current(this.file, this.draft, setting.key, this.file.userConfig());
197
190
  const path = ['Settings', ...setting.key.slice(0, -1).map(nameOf), labelOf(setting.key)];
198
- const edited = await this.editor.edit(path, setting.key, setting.node, current);
191
+ const edited = await this.editor.edit(path, setting.key, setting.node, now);
199
192
  if (edited)
200
193
  this.stage(setting.key, edited.value);
201
194
  }
@@ -0,0 +1,28 @@
1
+ import type { Action, Page } from '../../app/kernel/index.js';
2
+ import { type ListAction, type ListItem, type ListResult } from '../tui/index.js';
3
+ /** The row that stands for the empty state. */
4
+ export declare const EMPTY_ROW = "@empty";
5
+ /** What the list returned, as the page means it. */
6
+ export type Chosen = {
7
+ readonly kind: 'refresh';
8
+ } | {
9
+ readonly kind: 'action';
10
+ readonly action: Action;
11
+ };
12
+ export interface MenuView {
13
+ readonly items: ListItem<string>[];
14
+ readonly actions: ListAction<string>[];
15
+ /** What Enter does on a row ("" = it only shows information). */
16
+ enterLabel(category: string | undefined, id: string | undefined): string;
17
+ resolve(result: ListResult<string>): Chosen | undefined;
18
+ }
19
+ export interface MenuViewOptions {
20
+ /** Every row goes in this category (a view that is one category of a page). */
21
+ readonly category?: string;
22
+ /** Put before every row's value, so the rows cannot clash with the page's own rows. */
23
+ readonly prefix?: string;
24
+ /** Offer l to load the data again (default: yes). */
25
+ readonly refresh?: boolean;
26
+ }
27
+ /** The menu's rows, keys and Enter labels for a page. */
28
+ export declare function menuView(page: Page, o?: MenuViewOptions): MenuView;
@@ -0,0 +1,112 @@
1
+ import { pageHasContent } from '../../app/kernel/index.js';
2
+ import { safeText } from '../../core/util/index.js';
3
+ import { Theme } from '../tui/index.js';
4
+ /** The row that stands for the empty state. */
5
+ export const EMPTY_ROW = '@empty';
6
+ const FACT = 'fact:';
7
+ const ACTION = 'action:';
8
+ const REFRESH_KEY = 'l';
9
+ const PAINT = {
10
+ ok: Theme.ok,
11
+ warn: Theme.warn,
12
+ danger: Theme.error,
13
+ muted: Theme.muted,
14
+ accent: Theme.accent,
15
+ };
16
+ const paint = (text, tone) => text === undefined ? undefined : tone ? PAINT[tone](safeText(text)) : safeText(text);
17
+ /** The menu's rows, keys and Enter labels for a page. */
18
+ export function menuView(page, o = {}) {
19
+ const category = o.category ? { category: o.category } : {};
20
+ const prefix = o.prefix ?? '';
21
+ const items = [];
22
+ /** The action Enter runs, by row. */
23
+ const enter = new Map();
24
+ /** Key actions that apply to one row, by row. */
25
+ const keyed = new Map();
26
+ /** Key actions that apply everywhere. */
27
+ const everywhere = [...(page.actions ?? [])];
28
+ if (!pageHasContent(page) && page.empty) {
29
+ const e = page.empty;
30
+ items.push({
31
+ value: prefix + EMPTY_ROW,
32
+ label: e.action?.label ?? e.text,
33
+ section: e.title,
34
+ description: e.text,
35
+ ...category,
36
+ });
37
+ if (e.action)
38
+ enter.set(prefix + EMPTY_ROW, e.action);
39
+ }
40
+ for (const section of page.sections) {
41
+ const heading = section.title ?? page.title;
42
+ for (const f of section.facts ?? [])
43
+ items.push({
44
+ value: prefix + FACT + f.id,
45
+ label: f.label,
46
+ hint: paint(f.value, f.tone),
47
+ description: f.description,
48
+ details: f.details?.map(safeText),
49
+ section: heading,
50
+ ...category,
51
+ });
52
+ for (const item of section.items ?? []) {
53
+ const id = prefix + item.id;
54
+ items.push({
55
+ value: id,
56
+ label: safeText(item.label),
57
+ hint: paint(item.hint, item.tone),
58
+ description: item.description,
59
+ details: item.details?.map(safeText),
60
+ section: item.group ?? heading,
61
+ keywords: item.keywords,
62
+ ...(item.disabled ? { disabled: item.disabled } : {}),
63
+ ...category,
64
+ });
65
+ if (item.primary && !item.disabled)
66
+ enter.set(id, item.primary);
67
+ if (item.actions?.length)
68
+ keyed.set(id, [...item.actions]);
69
+ }
70
+ (section.actions ?? []).forEach((a, i) => {
71
+ const id = prefix + ACTION + section.id + ':' + i;
72
+ items.push({ value: id, label: a.label, hint: '', description: a.description, section: 'Actions', ...category });
73
+ enter.set(id, a);
74
+ everywhere.push(a);
75
+ });
76
+ }
77
+ const keys = [];
78
+ const addKey = (a, applies) => {
79
+ if (!a.key || keys.some((k) => k.key === a.key && k.label === (a.verb ?? a.label)))
80
+ return;
81
+ keys.push({ key: a.key, label: a.verb ?? a.label, importance: a.importance ?? 2, ...(applies ? { applies } : {}) });
82
+ };
83
+ for (const a of everywhere)
84
+ addKey(a);
85
+ for (const list of keyed.values())
86
+ for (const a of list)
87
+ addKey(a, (row) => keyed.get(row)?.some((x) => x.key === a.key) ?? false);
88
+ if (o.refresh !== false)
89
+ keys.push({ key: REFRESH_KEY, label: 'refresh', importance: 3 });
90
+ return {
91
+ items,
92
+ actions: keys,
93
+ enterLabel: (_category, id) => {
94
+ const a = id === undefined ? undefined : enter.get(id);
95
+ return a ? (a.verb ?? a.label.toLowerCase()) : '';
96
+ },
97
+ resolve: (result) => {
98
+ if (result.kind === 'pick') {
99
+ const a = enter.get(result.value);
100
+ return a ? { kind: 'action', action: a } : undefined;
101
+ }
102
+ if (result.kind !== 'action')
103
+ return undefined;
104
+ if (result.key === REFRESH_KEY && o.refresh !== false)
105
+ return { kind: 'refresh' };
106
+ const own = result.value === undefined ? undefined : keyed.get(result.value)?.find((a) => a.key === result.key);
107
+ const shared = everywhere.find((a) => a.key === result.key);
108
+ const a = own ?? shared;
109
+ return a ? { kind: 'action', action: a } : undefined;
110
+ },
111
+ };
112
+ }
@@ -0,0 +1,14 @@
1
+ import type { PathKind } from '../../../app/kernel/index.js';
2
+ import type { App } from '../../tui/index.js';
3
+ export interface AskPathOptions {
4
+ readonly path: string[];
5
+ readonly title: string;
6
+ readonly about?: string[];
7
+ readonly kind: PathKind;
8
+ readonly initial?: string;
9
+ readonly literals?: readonly string[];
10
+ /** true = fine, a string = what is wrong (shown under the path). */
11
+ readonly validate?: (path: string) => true | string;
12
+ }
13
+ /** Picks a folder or file in the path picker; typing a path (or an allowed word) still works. */
14
+ export declare function askPath(app: App, o: AskPathOptions): Promise<string | undefined>;
@@ -0,0 +1,14 @@
1
+ /** Picks a folder or file in the path picker; typing a path (or an allowed word) still works. */
2
+ export function askPath(app, o) {
3
+ return app.pickPath({
4
+ path: o.path,
5
+ title: o.title,
6
+ about: o.about,
7
+ initial: o.initial,
8
+ files: o.kind === 'file',
9
+ use: o.kind === 'file' ? 'use this file' : 'use this folder',
10
+ literals: o.literals,
11
+ relative: true,
12
+ validate: o.validate,
13
+ });
14
+ }
@@ -1,5 +1,5 @@
1
1
  import { type App, type ListItem } from '../../../tui/index.js';
2
- import { type SchemaNode } from '../schema-node.js';
2
+ import type { SchemaNode } from '../../../../app/kernel/index.js';
3
3
  import type { ValueEditor, Edited } from '../value-editor.js';
4
4
  /**
5
5
  * The shared shape of the list and map editors: a working copy shown as a list with "Add" at the top, Enter to change
@@ -10,14 +10,20 @@ export declare abstract class CollectionEditor<C> {
10
10
  protected readonly path: string[];
11
11
  protected readonly node: SchemaNode;
12
12
  protected readonly editor: ValueEditor;
13
+ /** The setting's key (a list's own, without positions): what the entries are is read from it. */
14
+ protected readonly key: string[];
13
15
  protected value: C;
14
16
  private original;
15
- constructor(app: App, path: string[], node: SchemaNode, editor: ValueEditor);
17
+ constructor(app: App, path: string[], node: SchemaNode, editor: ValueEditor,
18
+ /** The setting's key (a list's own, without positions): what the entries are is read from it. */
19
+ key?: string[]);
16
20
  protected abstract entries(): ListItem<string>[];
17
21
  protected abstract add(): Promise<void>;
18
22
  protected abstract open(id: string): Promise<void>;
19
23
  protected abstract remove(id: string): void;
20
24
  protected move?(id: string, by: number): string | undefined;
21
25
  protected noun: string;
26
+ /** What leaving with changes does, shown under the list (settings: they wait for Ctrl+S). */
27
+ protected keepNote: string;
22
28
  run(start: C): Promise<Edited>;
23
29
  }
@@ -10,15 +10,21 @@ export class CollectionEditor {
10
10
  path;
11
11
  node;
12
12
  editor;
13
+ key;
13
14
  value;
14
15
  original;
15
- constructor(app, path, node, editor) {
16
+ constructor(app, path, node, editor,
17
+ /** The setting's key (a list's own, without positions): what the entries are is read from it. */
18
+ key = []) {
16
19
  this.app = app;
17
20
  this.path = path;
18
21
  this.node = node;
19
22
  this.editor = editor;
23
+ this.key = key;
20
24
  }
21
25
  noun = 'entry';
26
+ /** What leaving with changes does, shown under the list (settings: they wait for Ctrl+S). */
27
+ keepNote = 'Esc keeps it for saving with Ctrl+S';
22
28
  async run(start) {
23
29
  this.original = structuredClone(start);
24
30
  this.value = structuredClone(start);
@@ -29,9 +35,7 @@ export class CollectionEditor {
29
35
  const picked = await this.app.list({
30
36
  path: this.path,
31
37
  intro: this.node.description,
32
- status: dirty
33
- ? Theme.changed(Theme.glyph.changed + ' changed: Esc keeps it for saving with Ctrl+S')
34
- : undefined,
38
+ status: dirty ? Theme.changed(Theme.glyph.changed + ' changed: ' + this.keepNote) : undefined,
35
39
  items: [
36
40
  { value: ADD, label: '+ Add ' + this.noun, section: 'Actions' },
37
41
  ...entries.map((e) => ({
@@ -41,11 +45,11 @@ export class CollectionEditor {
41
45
  ],
42
46
  startAt: focus,
43
47
  actions: [
44
- { key: 'd', label: 'delete' },
45
- ...(this.move
48
+ { key: 'd', label: 'remove', applies: (id) => id !== ADD },
49
+ ...(this.move && entries.length > 1
46
50
  ? [
47
- { key: 'u', label: 'move up' },
48
- { key: 'j', label: 'move down' },
51
+ { key: 'u', label: 'move up', applies: (id) => id !== ADD },
52
+ { key: 'j', label: 'move down', applies: (id) => id !== ADD },
49
53
  ]
50
54
  : []),
51
55
  ],
@@ -4,7 +4,11 @@ import { formatValue } from '../format.js';
4
4
  export class MapEditor extends CollectionEditor {
5
5
  noun = 'variable';
6
6
  entries() {
7
- return Object.entries(this.value).map(([k, v]) => ({ value: k, label: k, hint: formatValue(v) }));
7
+ return Object.entries(this.value).map(([k, v]) => ({
8
+ value: k,
9
+ label: k,
10
+ hint: this.node.element?.secret ? '***' : formatValue(v),
11
+ }));
8
12
  }
9
13
  async add() {
10
14
  const name = await this.app.text({
@@ -8,12 +8,12 @@ export class ObjectListEditor extends CollectionEditor {
8
8
  return this.value.map((v, i) => ({ value: String(i), label: summary(v) }));
9
9
  }
10
10
  async add() {
11
- const edited = await new ObjectEditor(this.app, [...this.path, 'New'], this.node.element, this.editor).run(this.node.element.initial(), true);
11
+ const edited = await new ObjectEditor(this.app, [...this.path, 'New'], this.node.element, this.editor, this.key).run(this.node.element.initial(), true);
12
12
  if (edited)
13
13
  this.value.push(edited.value);
14
14
  }
15
15
  async open(id) {
16
- const edited = await new ObjectEditor(this.app, [...this.path, summary(this.value[Number(id)])], this.node.element, this.editor).run(this.value[Number(id)]);
16
+ const edited = await new ObjectEditor(this.app, [...this.path, summary(this.value[Number(id)])], this.node.element, this.editor, this.key).run(this.value[Number(id)]);
17
17
  if (edited)
18
18
  this.value[Number(id)] = edited.value;
19
19
  }
@@ -20,12 +20,12 @@ export class ObjectMapEditor extends CollectionEditor {
20
20
  });
21
21
  if (name === undefined)
22
22
  return;
23
- const edited = await new ObjectEditor(this.app, [...this.path, name], this.node.element, this.editor).run(this.node.element.initial(), true);
23
+ const edited = await new ObjectEditor(this.app, [...this.path, name], this.node.element, this.editor, this.key).run(this.node.element.initial(), true);
24
24
  if (edited)
25
25
  this.value[name] = edited.value;
26
26
  }
27
27
  async open(id) {
28
- const edited = await new ObjectEditor(this.app, [...this.path, id], this.node.element, this.editor).run(this.value[id]);
28
+ const edited = await new ObjectEditor(this.app, [...this.path, id], this.node.element, this.editor, this.key).run(this.value[id]);
29
29
  if (edited)
30
30
  this.value[id] = edited.value;
31
31
  }
@@ -1,8 +1,17 @@
1
- import { type ListItem } from '../../../tui/index.js';
1
+ import type { App, ListItem } from '../../../tui/index.js';
2
2
  import { CollectionEditor } from './collection-editor.js';
3
+ import type { PathKind, SchemaNode } from '../../../../app/kernel/index.js';
4
+ import type { ValueEditor } from '../value-editor.js';
3
5
  /** A list of strings (project roots, scripts, extra packages ...). */
4
6
  export declare class StringListEditor extends CollectionEditor<string[]> {
7
+ /** The items are folders or files on this PC: they are picked in the path picker. */
8
+ private readonly pathKind?;
5
9
  protected noun: string;
10
+ constructor(app: App, path: string[], node: SchemaNode, editor: ValueEditor, key: string[],
11
+ /** The items are folders or files on this PC: they are picked in the path picker. */
12
+ pathKind?: PathKind | undefined,
13
+ /** What leaving with changes does, when it is not "wait for Ctrl+S". */
14
+ keepNote?: string);
6
15
  protected entries(): ListItem<string>[];
7
16
  private ask;
8
17
  protected add(): Promise<void>;
@@ -1,13 +1,36 @@
1
1
  import { Theme } from '../../../tui/index.js';
2
2
  import { CollectionEditor } from './collection-editor.js';
3
+ import { askPath } from '../ask-path.js';
3
4
  /** A list of strings (project roots, scripts, extra packages ...). */
4
5
  export class StringListEditor extends CollectionEditor {
6
+ pathKind;
5
7
  noun = 'item';
8
+ constructor(app, path, node, editor, key,
9
+ /** The items are folders or files on this PC: they are picked in the path picker. */
10
+ pathKind,
11
+ /** What leaving with changes does, when it is not "wait for Ctrl+S". */
12
+ keepNote) {
13
+ super(app, path, node, editor, key);
14
+ this.pathKind = pathKind;
15
+ if (pathKind)
16
+ this.noun = pathKind === 'file' ? 'file' : 'folder';
17
+ if (keepNote)
18
+ this.keepNote = keepNote;
19
+ }
6
20
  entries() {
7
21
  return this.value.map((v, i) => ({ value: String(i), label: v || Theme.muted('(empty)') }));
8
22
  }
9
23
  async ask(initial) {
10
24
  const element = this.node.element;
25
+ if (this.pathKind)
26
+ return askPath(this.app, {
27
+ path: this.path,
28
+ title: this.pathKind === 'file' ? 'Choose a file' : 'Choose a folder',
29
+ about: this.node.description ? [this.node.description] : [],
30
+ kind: this.pathKind,
31
+ initial,
32
+ validate: (v) => element.check(v),
33
+ });
11
34
  return this.app.text({
12
35
  path: this.path,
13
36
  label: 'Value',
@@ -1,4 +1,4 @@
1
- import type { ConfigFile, SettingChange } from './config-file.js';
1
+ import type { ConfigFile, SettingChange } from '../../../app/features/settings/index.js';
2
2
  /** What saving did: how many settings were written and why a file was refused. */
3
3
  export interface DraftResult {
4
4
  readonly saved: number;
@@ -1,5 +1,3 @@
1
+ export { choiceLabel, summary } from '../../../app/kernel/index.js';
1
2
  /** A value in one short line, for the right-hand column. */
2
3
  export declare function formatValue(value: unknown, max?: number): string;
3
- /** A one-line name for an object in a list (a mapping's folders, an agent's package ...). */
4
- export declare function summary(value: unknown): string;
5
- export declare function choiceLabel(v: unknown): string;