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,39 +1,9 @@
1
- import _ from 'lodash';
2
- import { Text, Theme } from '../../tui/index.js';
1
+ // A value in one short line for the menu's right-hand column: the kernel's valueText, painted with the theme.
2
+ import { valueText } from '../../../app/kernel/index.js';
3
+ import { Theme } from '../../tui/index.js';
4
+ export { choiceLabel, summary } from '../../../app/kernel/index.js';
3
5
  /** A value in one short line, for the right-hand column. */
4
6
  export function formatValue(value, max = 60) {
5
- if (value === undefined)
6
- return Theme.muted('not set');
7
- if (value === true)
8
- return Theme.ok('On');
9
- if (value === false)
10
- return Theme.muted('Off');
11
- if (value === null)
12
- return Theme.muted('none');
13
- if (typeof value === 'string')
14
- return value === '' ? Theme.muted('(empty)') : Text.truncate(value, max);
15
- if (typeof value === 'number')
16
- return String(value);
17
- if (Array.isArray(value))
18
- return value.length === 0
19
- ? Theme.muted('none')
20
- : Text.truncate(value.length + ' · ' + value.map((v) => (typeof v === 'object' ? summary(v) : String(v))).join(', '), max);
21
- const keys = Object.keys(value);
22
- return keys.length ? Text.truncate(keys.length + ' · ' + keys.join(', '), max) : Theme.muted('none');
23
- }
24
- /** A one-line name for an object in a list (a mapping's folders, an agent's package ...). */
25
- export function summary(value) {
26
- if (!_.isPlainObject(value))
27
- return String(value);
28
- const o = value;
29
- const strings = Object.entries(o).filter(([, v]) => typeof v === 'string' && v);
30
- if (typeof o.host === 'string' && typeof o.guest === 'string')
31
- return o.host + ' → ' + o.guest + (o.readOnly ? ' (read-only)' : '');
32
- return (strings
33
- .slice(0, 2)
34
- .map(([, v]) => v)
35
- .join(' · ') || '{ ' + Object.keys(o).join(', ') + ' }');
36
- }
37
- export function choiceLabel(v) {
38
- return v === true ? 'On' : v === false ? 'Off' : String(v);
7
+ const shown = valueText(value, undefined, max);
8
+ return shown.tone === 'ok' ? Theme.ok(shown.text) : shown.tone === 'muted' ? Theme.muted(shown.text) : shown.text;
39
9
  }
@@ -1,4 +1,2 @@
1
- export { CATEGORIES, nameOf } from './categories.js';
2
- export { ConfigFile, editConfigText, fileValue, type SettingChange, type SettingsTarget } from './config-file.js';
3
1
  export { Draft, type DraftResult } from './draft.js';
4
- export { SchemaNode } from './schema-node.js';
2
+ export { diffText, exportSettings, planImport, skippedLine, type DiffLine, type ImportPlan, type Pruned, type Skipped, } from './share.js';
@@ -1,4 +1,4 @@
1
- export { CATEGORIES, nameOf } from './categories.js';
2
- export { ConfigFile, editConfigText, fileValue } from './config-file.js';
1
+ // The menu's settings editing: staged changes (Ctrl+S saves them), sharing settings, and the editors for each kind of
2
+ // value. What the settings are, their files and rows live in the settings feature (src/app/features/settings).
3
3
  export { Draft } from './draft.js';
4
- export { SchemaNode } from './schema-node.js';
4
+ export { diffText, exportSettings, planImport, skippedLine, } from './share.js';
@@ -1,5 +1,5 @@
1
1
  import { type App } 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
  /** One object as a form: each field with its value, Enter to change it, r to clear an optional one. */
5
5
  export declare class ObjectEditor {
@@ -7,6 +7,10 @@ export declare class ObjectEditor {
7
7
  private readonly path;
8
8
  private readonly node;
9
9
  private readonly editor;
10
- constructor(app: App, path: string[], node: SchemaNode, editor: ValueEditor);
10
+ /** The setting's key (the object's own, without list positions), so a field knows what it is. */
11
+ private readonly key;
12
+ constructor(app: App, path: string[], node: SchemaNode, editor: ValueEditor,
13
+ /** The setting's key (the object's own, without list positions), so a field knows what it is. */
14
+ key?: string[]);
11
15
  run(start: Record<string, unknown>, isNew?: boolean): Promise<Edited>;
12
16
  }
@@ -7,11 +7,15 @@ export class ObjectEditor {
7
7
  path;
8
8
  node;
9
9
  editor;
10
- constructor(app, path, node, editor) {
10
+ key;
11
+ constructor(app, path, node, editor,
12
+ /** The setting's key (the object's own, without list positions), so a field knows what it is. */
13
+ key = []) {
11
14
  this.app = app;
12
15
  this.path = path;
13
16
  this.node = node;
14
17
  this.editor = editor;
18
+ this.key = key;
15
19
  }
16
20
  async run(start, isNew = false) {
17
21
  const value = structuredClone(start);
@@ -30,13 +34,20 @@ export class ObjectEditor {
30
34
  ...fields.map(([name, field]) => ({
31
35
  value: name,
32
36
  label: Text.humanize(name),
33
- hint: formatValue(value[name]),
37
+ hint: field.secret && value[name] ? '***' : formatValue(value[name]),
34
38
  description: field.description,
35
39
  section: 'Fields',
40
+ flip: field.editor === 'boolean',
36
41
  })),
37
42
  ],
38
43
  startAt: focus,
39
- actions: [{ key: 'r', label: 'clear' }],
44
+ actions: [
45
+ {
46
+ key: 'r',
47
+ label: 'clear',
48
+ applies: (name) => Boolean(this.node.child(name)?.optional) && value[name] !== undefined,
49
+ },
50
+ ],
40
51
  });
41
52
  notice = undefined;
42
53
  if (picked.kind === 'back') {
@@ -58,7 +69,7 @@ export class ObjectEditor {
58
69
  delete value[name];
59
70
  continue;
60
71
  }
61
- const edited = await this.editor.edit([...this.path, Text.humanize(name)], [name], field, value[name]);
72
+ const edited = await this.editor.edit([...this.path, Text.humanize(name)], [...this.key, name], field, value[name]);
62
73
  if (edited)
63
74
  value[name] = edited.value;
64
75
  }
@@ -0,0 +1,36 @@
1
+ import type { Config } from '../../../core/types.js';
2
+ import type { SettingChange } from '../../../app/features/settings/index.js';
3
+ /** Why something was left out. */
4
+ export interface Skipped {
5
+ readonly key: string;
6
+ readonly why: 'secret' | 'path' | 'machine';
7
+ }
8
+ export interface Pruned {
9
+ readonly data: Record<string, unknown>;
10
+ readonly skipped: Skipped[];
11
+ }
12
+ /** One line for a skipped setting. */
13
+ export declare function skippedLine(s: Skipped): string;
14
+ /** Your settings as a shareable object: only what differs from the defaults, without secrets or (by default) paths. */
15
+ export declare function exportSettings(config: Config, withPaths: boolean): Pruned;
16
+ /** One changed setting in a diff: old -> new. */
17
+ export interface DiffLine {
18
+ readonly key: string[];
19
+ readonly from: unknown;
20
+ readonly to: unknown;
21
+ }
22
+ export interface ImportPlan {
23
+ /** What would change (empty: nothing). */
24
+ readonly changes: SettingChange[];
25
+ readonly lines: DiffLine[];
26
+ readonly skipped: Skipped[];
27
+ /** Why the file cannot be imported at all (not JSON, not settings). */
28
+ readonly problems: string[];
29
+ }
30
+ /**
31
+ * Reads a shared settings file and works out what importing it would do to `current` (your settings with defaults).
32
+ * Pure: nothing is written.
33
+ */
34
+ export declare function planImport(text: string, current: Config): ImportPlan;
35
+ /** The diff as plain lines: `key: old -> new`. */
36
+ export declare function diffText(lines: readonly DiffLine[]): string[];
@@ -0,0 +1,131 @@
1
+ // Sharing your settings: the part of them that differs from the defaults, as a .json a team can pass around, and the
2
+ // reverse (read a file, show what it would change, apply the rest). Secrets (anything the schema marks), the data
3
+ // folder and folders or files of this PC never go into a file and are never taken from one.
4
+ import { parse } from 'jsonc-parser';
5
+ import _ from 'lodash';
6
+ import { DEFAULTS, mergeConfig } from '../../../core/config/index.js';
7
+ import { ConfigSchema, describeIssues, secretPaths } from '../../../core/schema/index.js';
8
+ import { pathKindOf } from '../../../app/kernel/index.js';
9
+ /** Settings that are about this PC and never travel (the data folder). */
10
+ const MACHINE_ONLY = ['storage.root'];
11
+ /** A folder or file of this PC: a drive path, a network path, a rooted path or a %VARIABLE% path. */
12
+ const ABSOLUTE = /^([a-zA-Z]:[\\/]|\\\\|\/|%)/;
13
+ const WHY_TEXT = {
14
+ secret: 'a secret, never shared',
15
+ path: 'a folder or file of this PC',
16
+ machine: 'this PC only',
17
+ };
18
+ /** One line for a skipped setting. */
19
+ export function skippedLine(s) {
20
+ return s.key + ' (' + WHY_TEXT[s.why] + ')';
21
+ }
22
+ const isSecret = (trail) => secretPaths().some((p) => p.length === trail.length && p.every((part, i) => part === '*' || part === trail[i]));
23
+ /**
24
+ * `value` without secrets, machine-only settings and (unless `withPaths`) folders and files of this PC. A list item
25
+ * that holds such a path is dropped whole. `trail` is the key path, with * for a list item.
26
+ */
27
+ function prune(value, trail, withPaths, skipped) {
28
+ const name = () => trail.join('.').replace(/\.\*/g, '[]');
29
+ if (isSecret(trail)) {
30
+ skipped.push({ key: name(), why: 'secret' });
31
+ return undefined;
32
+ }
33
+ if (MACHINE_ONLY.includes(trail.join('.'))) {
34
+ skipped.push({ key: name(), why: 'machine' });
35
+ return undefined;
36
+ }
37
+ const isPath = !withPaths && pathKindOf(trail.filter((p) => p !== '*')) !== undefined;
38
+ if (typeof value === 'string') {
39
+ if (isPath && ABSOLUTE.test(value)) {
40
+ skipped.push({ key: name(), why: 'path' });
41
+ return undefined;
42
+ }
43
+ return value;
44
+ }
45
+ if (Array.isArray(value)) {
46
+ const kept = [];
47
+ for (const item of value) {
48
+ const before = skipped.length;
49
+ const out = prune(item, [...trail, '*'], withPaths, skipped);
50
+ // A list item that lost a path (a folder entry without its folder) means nothing any more.
51
+ const lostPath = skipped.slice(before).some((x) => x.why !== 'secret');
52
+ if (out !== undefined && !lostPath)
53
+ kept.push(out);
54
+ }
55
+ return kept.length || value.length === 0 ? kept : undefined;
56
+ }
57
+ if (_.isPlainObject(value)) {
58
+ const out = {};
59
+ for (const [k, v] of Object.entries(value)) {
60
+ const next = prune(v, [...trail, k], withPaths, skipped);
61
+ if (next !== undefined)
62
+ out[k] = next;
63
+ }
64
+ return _.isEmpty(out) && !_.isEmpty(value) ? undefined : out;
65
+ }
66
+ return value;
67
+ }
68
+ /** What `value` has that `base` does not (undefined when nothing). Lists and plain values are compared whole. */
69
+ function differences(value, base) {
70
+ if (_.isPlainObject(value) && _.isPlainObject(base)) {
71
+ const out = {};
72
+ for (const [k, v] of Object.entries(value)) {
73
+ const d = differences(v, base[k]);
74
+ if (d !== undefined)
75
+ out[k] = d;
76
+ }
77
+ return _.isEmpty(out) ? undefined : out;
78
+ }
79
+ return _.isEqual(value, base) ? undefined : value;
80
+ }
81
+ /** Your settings as a shareable object: only what differs from the defaults, without secrets or (by default) paths. */
82
+ export function exportSettings(config, withPaths) {
83
+ const skipped = [];
84
+ const diff = differences(config, DEFAULTS) ?? {};
85
+ const data = (prune(diff, [], withPaths, skipped) ?? {});
86
+ return { data, skipped };
87
+ }
88
+ /** The leaves of an object as key paths; lists and plain values are leaves. */
89
+ function leaves(value, key = []) {
90
+ if (_.isPlainObject(value) && !_.isEmpty(value))
91
+ return Object.entries(value).flatMap(([k, v]) => leaves(v, [...key, k]));
92
+ return key.length ? [{ key, value }] : [];
93
+ }
94
+ /**
95
+ * Reads a shared settings file and works out what importing it would do to `current` (your settings with defaults).
96
+ * Pure: nothing is written.
97
+ */
98
+ export function planImport(text, current) {
99
+ const none = { changes: [], lines: [], skipped: [] };
100
+ const errors = [];
101
+ const parsed = parse(text, errors, { allowTrailingComma: true });
102
+ if (errors.length || !_.isPlainObject(parsed))
103
+ return { ...none, problems: ['The file is not a settings file (a JSON object is expected).'] };
104
+ const raw = _.omit(parsed, '$schema');
105
+ const skipped = [];
106
+ const safe = (prune(raw, [], false, skipped) ?? {});
107
+ const checked = ConfigSchema.safeParse(mergeConfig(DEFAULTS, safe));
108
+ if (!checked.success)
109
+ return { ...none, skipped, problems: describeIssues(checked.error) };
110
+ const changes = [];
111
+ const lines = [];
112
+ for (const { key, value } of leaves(safe)) {
113
+ const from = _.get(current, key);
114
+ if (_.isEqual(from, value))
115
+ continue;
116
+ changes.push({ key, value });
117
+ lines.push({ key, from, to: value });
118
+ }
119
+ return { changes, lines, skipped, problems: [] };
120
+ }
121
+ /** A value as one short piece of text for a diff. */
122
+ function show(value) {
123
+ if (value === undefined)
124
+ return '(not set)';
125
+ const text = JSON.stringify(value);
126
+ return text.length > 60 ? text.slice(0, 57) + '...' : text;
127
+ }
128
+ /** The diff as plain lines: `key: old -> new`. */
129
+ export function diffText(lines) {
130
+ return lines.map((l) => l.key.join('.') + ': ' + show(l.from) + ' -> ' + show(l.to));
131
+ }
@@ -1,5 +1,7 @@
1
1
  import { type App } from '../../tui/index.js';
2
- import { type SchemaNode } from './schema-node.js';
2
+ import { type SchemaNode } from '../../../app/kernel/index.js';
3
+ /** What is wrong with the text typed for a number setting (true = fine), in words that name the allowed range. */
4
+ export declare function numberProblem(node: SchemaNode, text: string): true | string;
3
5
  /** The new value, or undefined when you backed out without changing anything. */
4
6
  export type Edited = {
5
7
  value: unknown;
@@ -13,6 +15,13 @@ export declare class ValueEditor {
13
15
  private readonly hints;
14
16
  constructor(app: App, hints?: EditorHints);
15
17
  edit(path: string[], key: string[], node: SchemaNode, current: unknown): Promise<Edited>;
18
+ /** A choice with "Custom…" for a value of your own (a number or a text besides the fixed values). */
19
+ private custom;
20
+ /** A list: ticks for fixed values, a form per entry for objects, otherwise text (or paths) one per entry. */
21
+ private list;
22
+ private number;
23
+ /** A folder or file on this PC: the path picker (typing a path still works). */
24
+ private folderOrFile;
16
25
  private pick;
17
26
  private suggest;
18
27
  private json;
@@ -1,14 +1,29 @@
1
- // Editing one value with the screen that fits it: on/off flips, choices are picked from a list, numbers and text are
2
- // typed and checked as you type, lists and maps get an editor of their own (add, change, remove), and objects (a
3
- // mapped folder, an agent) open as a small form. JSON is only the last resort for shapes none of these fit.
1
+ // Editing one value with the screen that fits its Field (app/kernel/fields.ts, the same descriptor the web's inputs
2
+ // read): on/off flips, choices are picked from a list, numbers and text are typed and checked as you type, lists and
3
+ // maps get an editor of their own (add, change, remove), and objects (a mapped folder, an agent) open as a small form.
4
+ // JSON is only the last resort for shapes none of these fit.
4
5
  import _ from 'lodash';
5
6
  import { Text } from '../../tui/index.js';
6
- import { choiceLabel } from './format.js';
7
+ import { choiceLabel, fieldOf, pathLiterals } from '../../../app/kernel/index.js';
7
8
  import { StringListEditor } from './collections/string-list-editor.js';
8
9
  import { MapEditor } from './collections/map-editor.js';
9
10
  import { ObjectListEditor } from './collections/object-list-editor.js';
10
11
  import { ObjectMapEditor } from './collections/object-map-editor.js';
11
12
  import { ObjectEditor } from './object-editor.js';
13
+ import { askPath } from './ask-path.js';
14
+ /** What is wrong with the text typed for a number setting (true = fine), in words that name the allowed range. */
15
+ export function numberProblem(node, text) {
16
+ const n = Number(text);
17
+ if (text.trim() === '' || !Number.isFinite(n))
18
+ return 'Enter a number.';
19
+ if (node.integer && !Number.isInteger(n))
20
+ return 'Enter a whole number.';
21
+ const verdict = node.check(n);
22
+ if (verdict === true)
23
+ return true;
24
+ const range = node.rangeText();
25
+ return range ? 'Use ' + range + '.' : verdict;
26
+ }
12
27
  export class ValueEditor {
13
28
  app;
14
29
  hints;
@@ -17,84 +32,105 @@ export class ValueEditor {
17
32
  this.hints = hints;
18
33
  }
19
34
  async edit(path, key, node, current) {
20
- const about = node.description ? [node.description] : [];
35
+ const field = fieldOf(node, key);
21
36
  const suggestions = this.hints.suggestions?.(key);
22
37
  if (suggestions?.length && node.type === 'string')
23
38
  return this.suggest(path, key, node, current, suggestions);
24
- switch (node.editor) {
39
+ switch (field.kind) {
25
40
  case 'boolean':
26
41
  return { value: !(current ?? false) };
27
- case 'choice':
28
- return this.pick(path, node, current, node.choiceValues);
29
- case 'union': {
30
- const open = node.openOption;
31
- const custom = '@custom';
32
- const picked = await this.app.choose(path, node.description ?? '', [
33
- ...node.choiceValues.map((v) => ({ value: v, label: choiceLabel(v) })),
34
- ...(open
35
- ? [
36
- {
37
- value: custom,
38
- label: 'Custom ' + open.type + '…',
39
- description: 'Type a ' + open.type + ' of your own.',
40
- },
41
- ]
42
- : []),
43
- ], node.choiceValues.includes(current) ? current : open && current !== undefined ? custom : undefined);
44
- if (picked === undefined)
45
- return undefined;
46
- return picked === custom && open
47
- ? this.edit(path, key, open, node.choiceValues.includes(current) ? undefined : current)
48
- : { value: picked };
49
- }
50
- case 'number': {
51
- const range = node.min !== undefined || node.max !== undefined
52
- ? ' (' + (node.min ?? '…') + ' to ' + (node.max ?? '…') + ')'
53
- : '';
54
- const typed = await this.app.text({
55
- path,
56
- label: Text.humanize(key[key.length - 1]) + range,
57
- about,
58
- initial: current === undefined ? '' : String(current),
59
- validate: (v) => (v.trim() === '' || !Number.isFinite(Number(v)) ? 'Enter a number.' : node.check(Number(v))),
60
- });
61
- return typed === undefined ? undefined : { value: Number(typed) };
62
- }
63
- case 'string': {
42
+ case 'enum':
43
+ return field.open ? this.custom(path, key, node, current) : this.pick(path, node, current, node.choiceValues);
44
+ case 'number':
45
+ return this.number(path, key, node, current);
46
+ case 'path':
47
+ return this.folderOrFile(path, key, node, current, field.pathKind ?? 'dir');
48
+ case 'text':
49
+ case 'secret': {
64
50
  const typed = await this.app.text({
65
51
  path,
66
52
  label: Text.humanize(key[key.length - 1]),
67
- about,
53
+ about: field.help ? [field.help] : [],
68
54
  initial: typeof current === 'string' ? current : '',
69
55
  allowEmpty: node.check('') === true,
56
+ masked: field.kind === 'secret',
70
57
  validate: (v) => node.check(v),
71
58
  });
72
59
  return typed === undefined ? undefined : { value: typed };
73
60
  }
74
- case 'choice-list': {
75
- const ticked = Array.isArray(current) ? current : [];
76
- const picked = await this.app.list({
77
- path,
78
- intro: node.description,
79
- multi: true,
80
- items: node.element.choices.map((v) => ({ value: v, label: String(v), checked: ticked.includes(v) })),
81
- });
82
- return picked.kind === 'multi' ? { value: picked.values } : undefined;
83
- }
84
- case 'string-list':
85
- return new StringListEditor(this.app, path, node, this).run(Array.isArray(current) ? current : []);
86
- case 'string-map':
87
- return new MapEditor(this.app, path, node, this).run(_.isPlainObject(current) ? current : {});
88
- case 'object-list':
89
- return new ObjectListEditor(this.app, path, node, this).run(Array.isArray(current) ? current : []);
90
- case 'object-map':
91
- return new ObjectMapEditor(this.app, path, node, this).run(_.isPlainObject(current) ? current : {});
61
+ case 'list':
62
+ return this.list(path, key, node, field, current);
63
+ case 'map':
64
+ return field.element?.kind === 'object'
65
+ ? new ObjectMapEditor(this.app, path, node, this, key).run(_.isPlainObject(current) ? current : {})
66
+ : new MapEditor(this.app, path, node, this, key).run(_.isPlainObject(current) ? current : {});
92
67
  case 'object':
93
- return new ObjectEditor(this.app, path, node, this).run(_.isPlainObject(current) ? current : node.initial());
68
+ return new ObjectEditor(this.app, path, node, this, key).run(_.isPlainObject(current) ? current : node.initial());
94
69
  default:
95
70
  return this.json(path, key, node, current);
96
71
  }
97
72
  }
73
+ /** A choice with "Custom…" for a value of your own (a number or a text besides the fixed values). */
74
+ async custom(path, key, node, current) {
75
+ const open = node.openOption;
76
+ const custom = '@custom';
77
+ const picked = await this.app.choose(path, node.description ?? '', [
78
+ ...node.choiceValues.map((v) => ({ value: v, label: choiceLabel(v) })),
79
+ {
80
+ value: custom,
81
+ label: 'Custom ' + open.type + '…',
82
+ description: 'Type a ' + open.type + ' of your own.',
83
+ },
84
+ ], node.choiceValues.includes(current) ? current : current !== undefined ? custom : undefined);
85
+ if (picked === undefined)
86
+ return undefined;
87
+ return picked === custom
88
+ ? this.edit(path, key, open, node.choiceValues.includes(current) ? undefined : current)
89
+ : { value: picked };
90
+ }
91
+ /** A list: ticks for fixed values, a form per entry for objects, otherwise text (or paths) one per entry. */
92
+ async list(path, key, node, field, current) {
93
+ const kind = field.element?.kind;
94
+ if (kind === 'enum') {
95
+ const ticked = Array.isArray(current) ? current : [];
96
+ const picked = await this.app.list({
97
+ path,
98
+ intro: node.description,
99
+ multi: true,
100
+ items: node.element.choices.map((v) => ({ value: v, label: String(v), checked: ticked.includes(v) })),
101
+ });
102
+ return picked.kind === 'multi' ? { value: picked.values } : undefined;
103
+ }
104
+ if (kind === 'object')
105
+ return new ObjectListEditor(this.app, path, node, this, key).run(Array.isArray(current) ? current : []);
106
+ return new StringListEditor(this.app, path, node, this, key, field.element?.pathKind).run(Array.isArray(current) ? current : []);
107
+ }
108
+ async number(path, key, node, current) {
109
+ const range = node.rangeText();
110
+ const typed = await this.app.text({
111
+ path,
112
+ label: Text.humanize(key[key.length - 1]),
113
+ about: node.description ? [node.description] : [],
114
+ hint: 'A ' + (node.integer ? 'whole number' : 'number') + (range ? ': ' + range : '') + '.',
115
+ accept: node.integer ? (node.min !== undefined && node.min >= 0 ? /[0-9]/ : /[-0-9]/) : /[-0-9.]/,
116
+ initial: current === undefined ? '' : String(current),
117
+ validate: (v) => numberProblem(node, v),
118
+ });
119
+ return typed === undefined ? undefined : { value: Number(typed) };
120
+ }
121
+ /** A folder or file on this PC: the path picker (typing a path still works). */
122
+ async folderOrFile(path, key, node, current, kind) {
123
+ const picked = await askPath(this.app, {
124
+ path,
125
+ title: 'Choose ' + (kind === 'file' ? 'the file' : 'the folder') + ': ' + Text.humanize(key[key.length - 1]),
126
+ about: node.description ? [node.description] : [],
127
+ kind,
128
+ initial: typeof current === 'string' && current !== 'auto' ? current : '',
129
+ literals: pathLiterals(node),
130
+ validate: (v) => node.check(v),
131
+ });
132
+ return picked === undefined ? undefined : { value: picked };
133
+ }
98
134
  async pick(path, node, current, values) {
99
135
  const picked = await this.app.choose(path, node.description ?? '', values.map((v) => ({ value: v, label: choiceLabel(v) })), current);
100
136
  return picked === undefined ? undefined : { value: picked };
@@ -8,6 +8,7 @@ import { KnownProjects } from '../../host/projects/index.js';
8
8
  import { isWithin } from '../../shared/paths/index.js';
9
9
  import { commandLine } from '../history.js';
10
10
  import { Text, Theme } from '../tui/index.js';
11
+ import { askPath } from './settings/ask-path.js';
11
12
  /** Folders worth offering: this one, the projects started before, and the folders inside your roots. */
12
13
  export function candidateFolders(ctx, cwd = process.cwd()) {
13
14
  const roots = ctx.loaded.config.projects.roots.map((r) => expandPath(r, ctx.loaded.base));
@@ -66,10 +67,10 @@ export class SeveralAgents {
66
67
  const headless = await this.app.confirm({
67
68
  path: this.path,
68
69
  question: 'Hide the sandbox window (headless)?',
69
- about: ['sandbox show brings it back.'],
70
+ about: ['Sandbox > Show the window brings it back.'],
70
71
  initial: this.ctx.loaded.config.sandbox.headless,
71
72
  });
72
- const attach = await this.app.choose(this.path, 'Attach this terminal to one of them? Each session also has a tab inside the sandbox; sandbox attach shows any of them later.', [
73
+ const attach = await this.app.choose(this.path, 'Attach this terminal to one of them? Each session also has a tab inside the sandbox; Sessions shows any of them later.', [
73
74
  { value: -1, label: 'None' },
74
75
  ...sessions.map((s, i) => ({ value: i, label: s.harness + ' in ' + Text.middle(s.folder, 60) })),
75
76
  ], 0);
@@ -119,9 +120,10 @@ export class SeveralAgents {
119
120
  return null;
120
121
  const folders = picked.values.filter((f) => f !== ADD);
121
122
  if (picked.values.includes(ADD)) {
122
- const extra = await this.app.text({
123
+ const extra = await askPath(this.app, {
123
124
  path: this.path,
124
- label: 'Folder to add',
125
+ title: 'Choose the folder to add',
126
+ kind: 'dir',
125
127
  validate: (v) => {
126
128
  const dir = path.resolve(v.trim());
127
129
  if (!v.trim() || !fs.existsSync(dir) || !fs.statSync(dir).isDirectory())
@@ -136,7 +138,7 @@ export class SeveralAgents {
136
138
  },
137
139
  });
138
140
  if (extra)
139
- folders.push(path.resolve(extra.trim()));
141
+ folders.push(path.resolve(extra));
140
142
  }
141
143
  return folders;
142
144
  }
@@ -0,0 +1,21 @@
1
+ import type { Context } from '../commands/context.js';
2
+ import { type App } from '../tui/index.js';
3
+ /** The rows' ids in the settings list. */
4
+ export declare const EXPORT_SETTINGS = "@export-settings";
5
+ export declare const IMPORT_SETTINGS = "@import-settings";
6
+ export declare function shareSettingsRows(): {
7
+ value: string;
8
+ label: string;
9
+ hint: string;
10
+ description: string;
11
+ }[];
12
+ export declare class ShareSettingsFlow {
13
+ private readonly app;
14
+ private readonly ctx;
15
+ constructor(app: App, ctx: Context);
16
+ /** Your settings as they are on disk now (the menu may have saved changes since it started). */
17
+ private fresh;
18
+ /** Returns the notice to show (undefined when cancelled). */
19
+ export(): Promise<string | undefined>;
20
+ import(): Promise<string | undefined>;
21
+ }