windows-development-sandbox 1.5.0 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (709) hide show
  1. package/README.md +1 -0
  2. package/config.example.json +27 -1
  3. package/dist/app/context.d.ts +8 -0
  4. package/dist/app/context.js +12 -0
  5. package/dist/app/features/defs.d.ts +322 -0
  6. package/dist/app/features/defs.js +28 -0
  7. package/dist/app/features/sandbox/index.d.ts +2 -0
  8. package/dist/app/features/sandbox/index.js +3 -0
  9. package/dist/app/features/sandbox/sandbox.def.d.ts +193 -0
  10. package/dist/app/features/sandbox/sandbox.def.js +245 -0
  11. package/dist/app/features/sandbox/sandbox.run.d.ts +72 -0
  12. package/dist/app/features/sandbox/sandbox.run.js +98 -0
  13. package/dist/app/features/sessions/index.d.ts +2 -0
  14. package/dist/app/features/sessions/index.js +3 -0
  15. package/dist/app/features/sessions/sessions.def.d.ts +141 -0
  16. package/dist/app/features/sessions/sessions.def.js +176 -0
  17. package/dist/app/features/sessions/sessions.run.d.ts +39 -0
  18. package/dist/app/features/sessions/sessions.run.js +58 -0
  19. package/dist/{cli/menu/settings/categories.d.ts → app/features/settings/categories.def.d.ts} +4 -0
  20. package/dist/{cli/menu/settings/categories.js → app/features/settings/categories.def.js} +40 -46
  21. package/dist/app/features/settings/index.d.ts +5 -0
  22. package/dist/app/features/settings/index.js +6 -0
  23. package/dist/{cli/menu/settings/config-file.d.ts → app/features/settings/settings-file.d.ts} +1 -1
  24. package/dist/{cli/menu/settings/config-file.js → app/features/settings/settings-file.js} +1 -1
  25. package/dist/app/features/settings/settings-rows.d.ts +35 -0
  26. package/dist/app/features/settings/settings-rows.js +94 -0
  27. package/dist/app/features/settings/settings.def.d.ts +157 -0
  28. package/dist/app/features/settings/settings.def.js +179 -0
  29. package/dist/app/features/settings/settings.run.d.ts +67 -0
  30. package/dist/app/features/settings/settings.run.js +84 -0
  31. package/dist/app/kernel/define.d.ts +143 -0
  32. package/dist/app/kernel/define.js +42 -0
  33. package/dist/app/kernel/errors.d.ts +34 -0
  34. package/dist/app/kernel/errors.js +45 -0
  35. package/dist/app/kernel/fields.d.ts +70 -0
  36. package/dist/app/kernel/fields.js +243 -0
  37. package/dist/app/kernel/index.d.ts +8 -0
  38. package/dist/app/kernel/index.js +10 -0
  39. package/dist/app/kernel/io.d.ts +193 -0
  40. package/dist/app/kernel/io.js +126 -0
  41. package/dist/app/kernel/rpc.d.ts +156 -0
  42. package/dist/app/kernel/rpc.js +47 -0
  43. package/dist/{cli/menu/settings → app/kernel}/schema-node.d.ts +9 -0
  44. package/dist/{cli/menu/settings → app/kernel}/schema-node.js +26 -0
  45. package/dist/app/kernel/text.d.ts +6 -0
  46. package/dist/app/kernel/text.js +57 -0
  47. package/dist/app/kernel/view.d.ts +146 -0
  48. package/dist/app/kernel/view.js +28 -0
  49. package/dist/app/registry.d.ts +10 -0
  50. package/dist/app/registry.js +50 -0
  51. package/dist/cli/args.d.ts +18 -2
  52. package/dist/cli/args.js +101 -24
  53. package/dist/cli/commands/accounts.js +45 -17
  54. package/dist/cli/commands/context.d.ts +2 -0
  55. package/dist/cli/commands/context.js +9 -2
  56. package/dist/cli/commands/data/clean.js +32 -9
  57. package/dist/cli/commands/engine.d.ts +2 -0
  58. package/dist/cli/commands/engine.js +60 -0
  59. package/dist/cli/commands/index.d.ts +2 -1
  60. package/dist/cli/commands/index.js +2 -1
  61. package/dist/cli/commands/launch/add-root.d.ts +3 -2
  62. package/dist/cli/commands/launch/add-root.js +11 -10
  63. package/dist/cli/commands/launch/launch.js +102 -9
  64. package/dist/cli/commands/launch/prepare.js +6 -4
  65. package/dist/cli/commands/launch/running.js +2 -1
  66. package/dist/cli/commands/launch/summary.d.ts +2 -0
  67. package/dist/cli/commands/maintenance/audit.js +1 -1
  68. package/dist/cli/commands/maintenance/clean.d.ts +1 -1
  69. package/dist/cli/commands/maintenance/clean.js +17 -3
  70. package/dist/cli/commands/maintenance/config-share.d.ts +12 -0
  71. package/dist/cli/commands/maintenance/config-share.js +80 -0
  72. package/dist/cli/commands/maintenance/config.d.ts +1 -1
  73. package/dist/cli/commands/maintenance/config.js +38 -10
  74. package/dist/cli/commands/maintenance/doctor.d.ts +1 -1
  75. package/dist/cli/commands/maintenance/doctor.js +2 -4
  76. package/dist/cli/commands/maintenance/logs.js +14 -0
  77. package/dist/cli/commands/maintenance/migrate.d.ts +2 -1
  78. package/dist/cli/commands/maintenance/migrate.js +19 -4
  79. package/dist/cli/commands/maintenance/sync.js +2 -0
  80. package/dist/cli/commands/maintenance/update.d.ts +2 -0
  81. package/dist/cli/commands/maintenance/update.js +27 -4
  82. package/dist/cli/commands/projects/here.js +12 -7
  83. package/dist/cli/commands/projects/projects.js +26 -17
  84. package/dist/cli/commands/registry.js +10 -7
  85. package/dist/cli/commands/repair/checks/agents.d.ts +2 -0
  86. package/dist/cli/commands/repair/checks/agents.js +70 -0
  87. package/dist/cli/commands/repair/checks/common.d.ts +8 -0
  88. package/dist/cli/commands/repair/checks/common.js +22 -0
  89. package/dist/cli/commands/repair/checks/contained.d.ts +2 -0
  90. package/dist/cli/commands/repair/checks/contained.js +139 -0
  91. package/dist/cli/commands/repair/checks/data.d.ts +2 -0
  92. package/dist/cli/commands/repair/checks/data.js +241 -0
  93. package/dist/cli/commands/repair/checks/hcs.d.ts +7 -0
  94. package/dist/cli/commands/repair/checks/hcs.js +28 -0
  95. package/dist/cli/commands/repair/checks/index.d.ts +2 -0
  96. package/dist/cli/commands/repair/checks/index.js +24 -0
  97. package/dist/cli/commands/repair/checks/install.d.ts +5 -0
  98. package/dist/cli/commands/repair/checks/install.js +318 -0
  99. package/dist/cli/commands/repair/checks/machine.d.ts +2 -0
  100. package/dist/cli/commands/repair/checks/machine.js +232 -0
  101. package/dist/cli/commands/repair/checks/network.d.ts +6 -0
  102. package/dist/cli/commands/repair/checks/network.js +60 -0
  103. package/dist/cli/commands/repair/checks/pc.d.ts +4 -0
  104. package/dist/cli/commands/repair/checks/pc.js +86 -0
  105. package/dist/cli/commands/repair/checks/sandbox.d.ts +2 -0
  106. package/dist/cli/commands/repair/checks/sandbox.js +282 -0
  107. package/dist/cli/commands/repair/checks/settings.d.ts +2 -0
  108. package/dist/cli/commands/repair/checks/settings.js +169 -0
  109. package/dist/cli/commands/repair/checks/vpn.d.ts +2 -0
  110. package/dist/cli/commands/repair/checks/vpn.js +78 -0
  111. package/dist/cli/commands/repair/engine.d.ts +32 -0
  112. package/dist/cli/commands/repair/engine.js +127 -0
  113. package/dist/cli/commands/repair/env.d.ts +7 -0
  114. package/dist/cli/commands/repair/env.js +50 -0
  115. package/dist/cli/commands/repair/index.d.ts +1 -9
  116. package/dist/cli/commands/repair/index.js +2 -54
  117. package/dist/cli/commands/repair/log.d.ts +17 -0
  118. package/dist/cli/commands/repair/log.js +82 -0
  119. package/dist/cli/commands/repair/printer.d.ts +32 -0
  120. package/dist/cli/commands/repair/printer.js +132 -0
  121. package/dist/cli/commands/repair/run.d.ts +33 -0
  122. package/dist/cli/commands/repair/run.js +133 -0
  123. package/dist/cli/commands/repair/types.d.ts +97 -9
  124. package/dist/cli/commands/repair/types.js +11 -7
  125. package/dist/cli/commands/resume.js +2 -2
  126. package/dist/cli/commands/sessions/index.d.ts +0 -4
  127. package/dist/cli/commands/sessions/index.js +3 -7
  128. package/dist/cli/commands/setup/index.d.ts +5 -0
  129. package/dist/cli/commands/setup/index.js +25 -1
  130. package/dist/cli/commands/shared-use.d.ts +5 -2
  131. package/dist/cli/commands/shared-use.js +11 -8
  132. package/dist/cli/commands/storage/contained.d.ts +3 -0
  133. package/dist/cli/commands/storage/contained.js +179 -0
  134. package/dist/cli/commands/storage/index.d.ts +2 -0
  135. package/dist/cli/commands/storage/index.js +2 -0
  136. package/dist/cli/commands/storage/offer.d.ts +3 -0
  137. package/dist/cli/commands/storage/offer.js +91 -0
  138. package/dist/cli/commands/storage/storage.d.ts +8 -0
  139. package/dist/cli/commands/storage/storage.js +179 -0
  140. package/dist/cli/commands/user-config.js +2 -2
  141. package/dist/cli/commands/vpn.d.ts +4 -0
  142. package/dist/cli/commands/vpn.js +91 -0
  143. package/dist/cli/commands/web.d.ts +4 -0
  144. package/dist/cli/commands/web.js +97 -0
  145. package/dist/cli/history.js +1 -1
  146. package/dist/cli/index.js +48 -4
  147. package/dist/cli/manifest.d.ts +339 -97
  148. package/dist/cli/manifest.js +222 -67
  149. package/dist/cli/menu/add-agent.d.ts +47 -0
  150. package/dist/cli/menu/add-agent.js +168 -0
  151. package/dist/cli/menu/apps.d.ts +38 -3
  152. package/dist/cli/menu/apps.js +80 -5
  153. package/dist/cli/menu/command-fields.d.ts +18 -0
  154. package/dist/cli/menu/command-fields.js +61 -0
  155. package/dist/cli/menu/command-form.d.ts +22 -0
  156. package/dist/cli/menu/command-form.js +169 -46
  157. package/dist/cli/menu/data-folder.d.ts +18 -0
  158. package/dist/cli/menu/data-folder.js +99 -0
  159. package/dist/cli/menu/io-menu.d.ts +29 -0
  160. package/dist/cli/menu/io-menu.js +126 -0
  161. package/dist/cli/menu/live.d.ts +27 -0
  162. package/dist/cli/menu/live.js +69 -0
  163. package/dist/cli/menu/memory.d.ts +19 -0
  164. package/dist/cli/menu/memory.js +53 -0
  165. package/dist/cli/menu/menu.d.ts +11 -2
  166. package/dist/cli/menu/menu.js +36 -15
  167. package/dist/cli/menu/pages/accounts-page.js +55 -24
  168. package/dist/cli/menu/pages/agents-page.d.ts +68 -0
  169. package/dist/cli/menu/pages/agents-page.js +345 -0
  170. package/dist/cli/menu/pages/apps-page.d.ts +3 -1
  171. package/dist/cli/menu/pages/apps-page.js +20 -4
  172. package/dist/cli/menu/pages/list-page.d.ts +43 -3
  173. package/dist/cli/menu/pages/list-page.js +146 -12
  174. package/dist/cli/menu/pages/maintenance-page.d.ts +9 -5
  175. package/dist/cli/menu/pages/maintenance-page.js +172 -85
  176. package/dist/cli/menu/pages/sandbox-page.d.ts +7 -6
  177. package/dist/cli/menu/pages/sandbox-page.js +117 -120
  178. package/dist/cli/menu/pages/scopes.d.ts +1 -1
  179. package/dist/cli/menu/pages/sessions-page.d.ts +6 -8
  180. package/dist/cli/menu/pages/sessions-page.js +22 -75
  181. package/dist/cli/menu/pages/settings-page.d.ts +10 -14
  182. package/dist/cli/menu/pages/settings-page.js +95 -102
  183. package/dist/cli/menu/render-view.d.ts +28 -0
  184. package/dist/cli/menu/render-view.js +112 -0
  185. package/dist/cli/menu/settings/ask-path.d.ts +14 -0
  186. package/dist/cli/menu/settings/ask-path.js +14 -0
  187. package/dist/cli/menu/settings/collections/collection-editor.d.ts +8 -2
  188. package/dist/cli/menu/settings/collections/collection-editor.js +12 -8
  189. package/dist/cli/menu/settings/collections/map-editor.js +5 -1
  190. package/dist/cli/menu/settings/collections/object-list-editor.js +2 -2
  191. package/dist/cli/menu/settings/collections/object-map-editor.js +2 -2
  192. package/dist/cli/menu/settings/collections/string-list-editor.d.ts +10 -1
  193. package/dist/cli/menu/settings/collections/string-list-editor.js +23 -0
  194. package/dist/cli/menu/settings/draft.d.ts +1 -1
  195. package/dist/cli/menu/settings/format.d.ts +1 -3
  196. package/dist/cli/menu/settings/format.js +6 -36
  197. package/dist/cli/menu/settings/index.d.ts +1 -3
  198. package/dist/cli/menu/settings/index.js +3 -3
  199. package/dist/cli/menu/settings/object-editor.d.ts +6 -2
  200. package/dist/cli/menu/settings/object-editor.js +15 -4
  201. package/dist/cli/menu/settings/share.d.ts +36 -0
  202. package/dist/cli/menu/settings/share.js +131 -0
  203. package/dist/cli/menu/settings/value-editor.d.ts +10 -1
  204. package/dist/cli/menu/settings/value-editor.js +99 -63
  205. package/dist/cli/menu/several.js +7 -5
  206. package/dist/cli/menu/share-settings.d.ts +21 -0
  207. package/dist/cli/menu/share-settings.js +112 -0
  208. package/dist/cli/menu/shell.d.ts +53 -10
  209. package/dist/cli/menu/shell.js +115 -10
  210. package/dist/cli/menu/views.d.ts +7 -0
  211. package/dist/cli/menu/views.js +11 -0
  212. package/dist/cli/menu/vpn-login.d.ts +16 -0
  213. package/dist/cli/menu/vpn-login.js +74 -0
  214. package/dist/cli/operations/handler.d.ts +6 -0
  215. package/dist/cli/operations/handler.js +61 -0
  216. package/dist/cli/operations/index.d.ts +4 -0
  217. package/dist/cli/operations/index.js +5 -0
  218. package/dist/cli/operations/input.d.ts +6 -0
  219. package/dist/cli/operations/input.js +37 -0
  220. package/dist/cli/operations/io-cli.d.ts +7 -0
  221. package/dist/cli/operations/io-cli.js +62 -0
  222. package/dist/cli/operations/spec.d.ts +18 -0
  223. package/dist/cli/operations/spec.js +108 -0
  224. package/dist/cli/output/colors.d.ts +2 -2
  225. package/dist/cli/output/colors.js +2 -11
  226. package/dist/cli/output/index.d.ts +1 -0
  227. package/dist/cli/output/index.js +1 -0
  228. package/dist/cli/output/print.d.ts +5 -1
  229. package/dist/cli/output/print.js +15 -4
  230. package/dist/cli/output/progress.d.ts +15 -0
  231. package/dist/cli/output/progress.js +44 -0
  232. package/dist/cli/output/render-view.d.ts +4 -0
  233. package/dist/cli/output/render-view.js +63 -0
  234. package/dist/cli/services/accounts-service.d.ts +2 -0
  235. package/dist/cli/services/accounts-service.js +2 -2
  236. package/dist/cli/services/agent-commands-service.d.ts +2 -0
  237. package/dist/cli/services/agent-commands-service.js +11 -2
  238. package/dist/cli/services/health-service.d.ts +0 -6
  239. package/dist/cli/services/health-service.js +5 -42
  240. package/dist/cli/services/index.d.ts +3 -1
  241. package/dist/cli/services/index.js +3 -1
  242. package/dist/cli/services/logs-service.js +4 -3
  243. package/dist/cli/services/migrate-service.js +1 -1
  244. package/dist/cli/services/update-service.d.ts +2 -0
  245. package/dist/cli/services/update-service.js +13 -6
  246. package/dist/cli/services/vpn-service.d.ts +28 -0
  247. package/dist/cli/services/vpn-service.js +46 -0
  248. package/dist/cli/services/web-service.d.ts +22 -0
  249. package/dist/cli/services/web-service.js +111 -0
  250. package/dist/cli/tui/app.d.ts +12 -4
  251. package/dist/cli/tui/app.js +38 -9
  252. package/dist/cli/tui/dialogs/path-listing.d.ts +43 -0
  253. package/dist/cli/tui/dialogs/path-listing.js +127 -0
  254. package/dist/cli/tui/dialogs/path-picker.d.ts +67 -0
  255. package/dist/cli/tui/dialogs/path-picker.js +423 -0
  256. package/dist/cli/tui/dialogs/text-screen.d.ts +6 -0
  257. package/dist/cli/tui/dialogs/text-screen.js +10 -3
  258. package/dist/cli/tui/frame.d.ts +7 -10
  259. package/dist/cli/tui/frame.js +19 -10
  260. package/dist/cli/tui/index.d.ts +4 -3
  261. package/dist/cli/tui/index.js +2 -1
  262. package/dist/cli/tui/list/list-screen.d.ts +28 -2
  263. package/dist/cli/tui/list/list-screen.js +130 -66
  264. package/dist/cli/tui/list/list-types.d.ts +10 -4
  265. package/dist/cli/tui/nav.d.ts +29 -0
  266. package/dist/cli/tui/nav.js +67 -0
  267. package/dist/cli/tui/terminal.d.ts +7 -0
  268. package/dist/cli/tui/terminal.js +30 -10
  269. package/dist/cli/validate.d.ts +1 -1
  270. package/dist/cli/validate.js +3 -3
  271. package/dist/cli/version.d.ts +2 -0
  272. package/dist/cli/version.js +11 -0
  273. package/dist/core/config/defaults.js +13 -1
  274. package/dist/core/config/loader.js +12 -2
  275. package/dist/core/local-config/overrides.js +1 -0
  276. package/dist/core/prompt.d.ts +19 -0
  277. package/dist/core/prompt.js +43 -3
  278. package/dist/core/schema/common.d.ts +6 -0
  279. package/dist/core/schema/common.js +8 -0
  280. package/dist/core/schema/config.d.ts +36 -0
  281. package/dist/core/schema/config.js +26 -2
  282. package/dist/core/schema/harness.d.ts +2 -0
  283. package/dist/core/schema/harness.js +13 -2
  284. package/dist/core/schema/index.d.ts +3 -1
  285. package/dist/core/schema/index.js +3 -1
  286. package/dist/core/schema/profile.d.ts +1 -0
  287. package/dist/core/schema/profile.js +3 -0
  288. package/dist/core/schema/redact.d.ts +13 -0
  289. package/dist/core/schema/redact.js +75 -0
  290. package/dist/core/schema/sandbox.d.ts +6 -0
  291. package/dist/core/schema/sandbox.js +21 -3
  292. package/dist/core/schema/vpn.d.ts +18 -0
  293. package/dist/core/schema/vpn.js +22 -0
  294. package/dist/core/schema/web.d.ts +6 -0
  295. package/dist/core/schema/web.js +14 -0
  296. package/dist/core/types.d.ts +44 -0
  297. package/dist/core/util/fs.d.ts +2 -0
  298. package/dist/core/util/fs.js +9 -0
  299. package/dist/core/util/index.d.ts +1 -1
  300. package/dist/core/util/index.js +1 -1
  301. package/dist/guest/agents/agent-files.d.ts +54 -0
  302. package/dist/guest/agents/agent-files.js +67 -0
  303. package/dist/guest/agents/agent-installer.js +2 -9
  304. package/dist/guest/agents/local-state.d.ts +14 -0
  305. package/dist/guest/agents/local-state.js +218 -0
  306. package/dist/guest/agents/sbx-agent.d.ts +2 -0
  307. package/dist/guest/agents/sbx-agent.js +35 -0
  308. package/dist/guest/boot/boot.d.ts +4 -0
  309. package/dist/guest/boot/boot.js +51 -11
  310. package/dist/guest/daemon/daemon.js +8 -1
  311. package/dist/guest/daemon/exec.js +2 -1
  312. package/dist/guest/daemon/idle-shutdown.js +2 -0
  313. package/dist/guest/daemon/sessions.d.ts +5 -0
  314. package/dist/guest/daemon/sessions.js +20 -3
  315. package/dist/guest/entries/agent.d.ts +1 -0
  316. package/dist/guest/entries/agent.js +10 -0
  317. package/dist/guest/entries/daemon.js +5 -0
  318. package/dist/guest/governor/decide.d.ts +61 -0
  319. package/dist/guest/governor/decide.js +182 -0
  320. package/dist/guest/governor/governor.d.ts +42 -0
  321. package/dist/guest/governor/governor.js +214 -0
  322. package/dist/guest/governor/index.d.ts +2 -0
  323. package/dist/guest/governor/index.js +2 -0
  324. package/dist/guest/runtime/csc.d.ts +2 -0
  325. package/dist/guest/runtime/csc.js +2 -0
  326. package/dist/guest/runtime/secrets.d.ts +12 -0
  327. package/dist/guest/runtime/secrets.js +63 -0
  328. package/dist/guest/sessions/viewer.js +3 -1
  329. package/dist/guest/setup/claude-profile.d.ts +2 -1
  330. package/dist/guest/setup/claude-profile.js +12 -1
  331. package/dist/guest/setup/environment.d.ts +6 -0
  332. package/dist/guest/setup/environment.js +56 -6
  333. package/dist/guest/setup/path-plan.d.ts +32 -0
  334. package/dist/guest/setup/path-plan.js +67 -0
  335. package/dist/guest/setup/shell-path.d.ts +1 -0
  336. package/dist/guest/setup/shell-path.js +22 -0
  337. package/dist/guest/toolchains/languages/python.js +1 -1
  338. package/dist/guest/toolchains/native/rust-extras.js +4 -2
  339. package/dist/guest/toolchains/runtimes.js +2 -2
  340. package/dist/guest/vpn/index.d.ts +1 -0
  341. package/dist/guest/vpn/index.js +1 -0
  342. package/dist/guest/vpn/openvpn.d.ts +9 -0
  343. package/dist/guest/vpn/openvpn.js +47 -0
  344. package/dist/guest/vpn/tunnel.d.ts +17 -0
  345. package/dist/guest/vpn/tunnel.js +78 -0
  346. package/dist/guest/vpn/vpn.d.ts +6 -0
  347. package/dist/guest/vpn/vpn.js +174 -0
  348. package/dist/guest/vpn/wireguard.d.ts +32 -0
  349. package/dist/guest/vpn/wireguard.js +132 -0
  350. package/dist/host/agent-commands/commands.d.ts +4 -0
  351. package/dist/host/agent-commands/commands.js +31 -7
  352. package/dist/host/audit/log.d.ts +1 -1
  353. package/dist/host/channel/attach.d.ts +6 -2
  354. package/dist/host/channel/attach.js +6 -3
  355. package/dist/host/channel/channel.d.ts +9 -0
  356. package/dist/host/channel/channel.js +30 -2
  357. package/dist/host/engines/engine.d.ts +12 -0
  358. package/dist/host/engines/engine.js +1 -0
  359. package/dist/host/engines/hcs/check.d.ts +25 -0
  360. package/dist/host/engines/hcs/check.js +95 -0
  361. package/dist/host/engines/hcs/documents.d.ts +44 -0
  362. package/dist/host/engines/hcs/documents.js +155 -0
  363. package/dist/host/engines/hcs/engine.d.ts +39 -0
  364. package/dist/host/engines/hcs/engine.js +171 -0
  365. package/dist/host/engines/hcs/helper.d.ts +43 -0
  366. package/dist/host/engines/hcs/helper.js +173 -0
  367. package/dist/host/engines/hcs/images.d.ts +37 -0
  368. package/dist/host/engines/hcs/images.js +152 -0
  369. package/dist/host/engines/index.d.ts +7 -0
  370. package/dist/host/engines/index.js +5 -0
  371. package/dist/host/engines/registry.d.ts +16 -0
  372. package/dist/host/engines/registry.js +30 -0
  373. package/dist/host/engines/types.d.ts +58 -0
  374. package/dist/host/engines/types.js +1 -0
  375. package/dist/host/engines/windows-sandbox/engine.d.ts +16 -0
  376. package/dist/host/engines/windows-sandbox/engine.js +63 -0
  377. package/dist/host/engines/windows-sandbox/wsb-text.d.ts +2 -0
  378. package/dist/host/engines/windows-sandbox/wsb-text.js +29 -0
  379. package/dist/host/health/acl-read.d.ts +17 -0
  380. package/dist/host/health/acl-read.js +45 -0
  381. package/dist/host/health/config-backup.d.ts +11 -0
  382. package/dist/host/health/config-backup.js +73 -0
  383. package/dist/host/health/index.d.ts +6 -0
  384. package/dist/host/health/index.js +7 -0
  385. package/dist/host/health/install-state.d.ts +33 -0
  386. package/dist/host/health/install-state.js +110 -0
  387. package/dist/host/health/path-copies.d.ts +32 -0
  388. package/dist/host/health/path-copies.js +82 -0
  389. package/dist/host/health/stale.d.ts +45 -0
  390. package/dist/host/health/stale.js +120 -0
  391. package/dist/host/health/system.d.ts +37 -0
  392. package/dist/host/health/system.js +87 -0
  393. package/dist/host/install/copies.d.ts +13 -0
  394. package/dist/host/install/copies.js +63 -0
  395. package/dist/host/install/index.d.ts +1 -0
  396. package/dist/host/install/index.js +1 -0
  397. package/dist/host/launch/generate.d.ts +5 -1
  398. package/dist/host/launch/generate.js +73 -7
  399. package/dist/host/launch/index.d.ts +3 -1
  400. package/dist/host/launch/index.js +3 -1
  401. package/dist/host/launch/launch-plan.d.ts +13 -0
  402. package/dist/host/launch/launch-plan.js +26 -0
  403. package/dist/host/launch/mappings.js +2 -1
  404. package/dist/host/launch/risk-notes.d.ts +10 -0
  405. package/dist/host/launch/risk-notes.js +18 -0
  406. package/dist/host/launch/session-file.d.ts +2 -0
  407. package/dist/host/launch/session-file.js +11 -2
  408. package/dist/host/launch/stage.js +1 -1
  409. package/dist/host/launch/wsb-file.d.ts +28 -4
  410. package/dist/host/launch/wsb-file.js +61 -42
  411. package/dist/host/life/crash-report.d.ts +27 -1
  412. package/dist/host/life/crash-report.js +173 -7
  413. package/dist/host/life/host-memory.d.ts +40 -0
  414. package/dist/host/life/host-memory.js +137 -0
  415. package/dist/host/life/index.d.ts +2 -0
  416. package/dist/host/life/index.js +2 -0
  417. package/dist/host/life/stop-events.d.ts +2 -0
  418. package/dist/host/life/stop-events.js +20 -3
  419. package/dist/host/life/stop-warning.js +1 -1
  420. package/dist/host/life/watchdog.d.ts +54 -0
  421. package/dist/host/life/watchdog.js +108 -0
  422. package/dist/host/migrate/backup.js +3 -0
  423. package/dist/host/migrate/migrations/config-file.d.ts +2 -0
  424. package/dist/host/migrate/migrations/config-file.js +7 -0
  425. package/dist/host/migrate/migrations/follow-machine-storage.js +9 -1
  426. package/dist/host/migrate/migrations/pin-storage-root.d.ts +4 -0
  427. package/dist/host/migrate/migrations/pin-storage-root.js +46 -0
  428. package/dist/host/migrate/migrations/unpin-config-defaults.js +4 -1
  429. package/dist/host/migrate/registry.js +2 -1
  430. package/dist/host/native.d.ts +3 -2
  431. package/dist/host/native.js +22 -3
  432. package/dist/host/profile/accounts.d.ts +25 -1
  433. package/dist/host/profile/accounts.js +96 -13
  434. package/dist/host/profile/agent-accounts.d.ts +5 -1
  435. package/dist/host/profile/agent-accounts.js +35 -5
  436. package/dist/host/profile/claude-login.js +3 -2
  437. package/dist/host/profile/index.d.ts +2 -1
  438. package/dist/host/profile/index.js +1 -0
  439. package/dist/host/profile/plugin-share.d.ts +26 -0
  440. package/dist/host/profile/plugin-share.js +146 -0
  441. package/dist/host/projects/join.d.ts +7 -1
  442. package/dist/host/projects/join.js +21 -4
  443. package/dist/host/projects/registry.d.ts +16 -10
  444. package/dist/host/projects/registry.js +74 -6
  445. package/dist/host/sandbox/contained-deps.d.ts +2 -0
  446. package/dist/host/sandbox/contained-deps.js +17 -0
  447. package/dist/host/sandbox/index.d.ts +2 -0
  448. package/dist/host/sandbox/index.js +2 -0
  449. package/dist/host/sandbox/platform.d.ts +4 -0
  450. package/dist/host/sandbox/platform.js +23 -4
  451. package/dist/host/sandbox/tasklist.d.ts +13 -0
  452. package/dist/host/sandbox/tasklist.js +47 -0
  453. package/dist/host/secrets/index.d.ts +2 -0
  454. package/dist/host/secrets/index.js +2 -0
  455. package/dist/host/secrets/launch-secrets.d.ts +17 -0
  456. package/dist/host/secrets/launch-secrets.js +94 -0
  457. package/dist/host/secrets/secret-store.d.ts +25 -0
  458. package/dist/host/secrets/secret-store.js +89 -0
  459. package/dist/host/sharing/acl.d.ts +16 -2
  460. package/dist/host/sharing/acl.js +35 -10
  461. package/dist/host/sharing/current.js +8 -3
  462. package/dist/host/sharing/doctor.d.ts +2 -0
  463. package/dist/host/sharing/doctor.js +44 -0
  464. package/dist/host/sharing/group-access.d.ts +6 -0
  465. package/dist/host/sharing/group-access.js +24 -0
  466. package/dist/host/sharing/index.d.ts +2 -1
  467. package/dist/host/sharing/index.js +2 -1
  468. package/dist/host/sharing/lifecycle.d.ts +8 -2
  469. package/dist/host/sharing/lifecycle.js +16 -7
  470. package/dist/host/storage/cleanup.d.ts +2 -0
  471. package/dist/host/storage/cleanup.js +2 -1
  472. package/dist/host/storage/contained/check.d.ts +9 -0
  473. package/dist/host/storage/contained/check.js +37 -0
  474. package/dist/host/storage/contained/contained-storage.d.ts +66 -0
  475. package/dist/host/storage/contained/contained-storage.js +168 -0
  476. package/dist/host/storage/contained/disk-port.d.ts +43 -0
  477. package/dist/host/storage/contained/disk-port.js +122 -0
  478. package/dist/host/storage/contained/index.d.ts +9 -0
  479. package/dist/host/storage/contained/index.js +8 -0
  480. package/dist/host/storage/contained/layout.d.ts +28 -0
  481. package/dist/host/storage/contained/layout.js +45 -0
  482. package/dist/host/storage/contained/resolve.d.ts +4 -0
  483. package/dist/host/storage/contained/resolve.js +30 -0
  484. package/dist/host/storage/contained/setting.d.ts +1 -0
  485. package/dist/host/storage/contained/setting.js +5 -0
  486. package/dist/host/storage/contained/state.d.ts +89 -0
  487. package/dist/host/storage/contained/state.js +166 -0
  488. package/dist/host/storage/contained/transfer.d.ts +24 -0
  489. package/dist/host/storage/contained/transfer.js +121 -0
  490. package/dist/host/storage/history.d.ts +21 -0
  491. package/dist/host/storage/history.js +49 -0
  492. package/dist/host/storage/index.d.ts +6 -0
  493. package/dist/host/storage/index.js +6 -0
  494. package/dist/host/storage/move.d.ts +95 -0
  495. package/dist/host/storage/move.js +384 -0
  496. package/dist/host/storage/offer.d.ts +11 -0
  497. package/dist/host/storage/offer.js +36 -0
  498. package/dist/host/storage/providers/contained.d.ts +15 -0
  499. package/dist/host/storage/providers/contained.js +39 -0
  500. package/dist/host/storage/providers/folder.d.ts +12 -0
  501. package/dist/host/storage/providers/folder.js +20 -0
  502. package/dist/host/storage/providers/index.d.ts +4 -0
  503. package/dist/host/storage/providers/index.js +3 -0
  504. package/dist/host/storage/providers/registry.d.ts +9 -0
  505. package/dist/host/storage/providers/registry.js +14 -0
  506. package/dist/host/storage/providers/types.d.ts +33 -0
  507. package/dist/host/storage/providers/types.js +1 -0
  508. package/dist/host/storage/root.d.ts +18 -0
  509. package/dist/host/storage/root.js +77 -0
  510. package/dist/host/tools/conpty.js +3 -2
  511. package/dist/host/tools/windows-terminal.d.ts +2 -0
  512. package/dist/host/tools/windows-terminal.js +31 -12
  513. package/dist/host/update/index.d.ts +1 -1
  514. package/dist/host/update/index.js +1 -1
  515. package/dist/host/update/notice.d.ts +2 -0
  516. package/dist/host/update/notice.js +13 -1
  517. package/dist/host/update/update-state.d.ts +6 -0
  518. package/dist/host/update/update-state.js +2 -0
  519. package/dist/host/update/updater.d.ts +19 -0
  520. package/dist/host/update/updater.js +88 -12
  521. package/dist/host/vpn/index.d.ts +4 -0
  522. package/dist/host/vpn/index.js +4 -0
  523. package/dist/host/vpn/login.d.ts +24 -0
  524. package/dist/host/vpn/login.js +79 -0
  525. package/dist/host/vpn/nordvpn.d.ts +21 -0
  526. package/dist/host/vpn/nordvpn.js +77 -0
  527. package/dist/host/vpn/prepare.d.ts +19 -0
  528. package/dist/host/vpn/prepare.js +138 -0
  529. package/dist/host/vpn/status.d.ts +12 -0
  530. package/dist/host/vpn/status.js +53 -0
  531. package/dist/host/web/auth.d.ts +38 -0
  532. package/dist/host/web/auth.js +96 -0
  533. package/dist/host/web/backend.d.ts +14 -0
  534. package/dist/host/web/backend.js +1 -0
  535. package/dist/host/web/bridge.d.ts +27 -0
  536. package/dist/host/web/bridge.js +144 -0
  537. package/dist/host/web/browser.d.ts +3 -0
  538. package/dist/host/web/browser.js +23 -0
  539. package/dist/host/web/control.d.ts +17 -0
  540. package/dist/host/web/control.js +67 -0
  541. package/dist/host/web/index.d.ts +10 -0
  542. package/dist/host/web/index.js +9 -0
  543. package/dist/host/web/rpc.d.ts +24 -0
  544. package/dist/host/web/rpc.js +149 -0
  545. package/dist/host/web/runner.d.ts +16 -0
  546. package/dist/host/web/runner.js +44 -0
  547. package/dist/host/web/server.d.ts +47 -0
  548. package/dist/host/web/server.js +238 -0
  549. package/dist/host/web/state.d.ts +20 -0
  550. package/dist/host/web/state.js +41 -0
  551. package/dist/host/web/static-files.d.ts +13 -0
  552. package/dist/host/web/static-files.js +57 -0
  553. package/dist/runtime/agent.js +27675 -0
  554. package/dist/runtime/daemon.js +1950 -1122
  555. package/dist/runtime/db.js +302 -111
  556. package/dist/runtime/main.js +1560 -275
  557. package/dist/runtime/netproxy.js +168 -8
  558. package/dist/runtime/view.js +186 -13
  559. package/dist/selftest/accounts.test.js +40 -0
  560. package/dist/selftest/agent-paths.test.d.ts +2 -0
  561. package/dist/selftest/agent-paths.test.js +125 -0
  562. package/dist/selftest/app.test.d.ts +2 -0
  563. package/dist/selftest/app.test.js +324 -0
  564. package/dist/selftest/channel.test.js +18 -0
  565. package/dist/selftest/cli.test.js +35 -4
  566. package/dist/selftest/config.test.js +59 -0
  567. package/dist/selftest/contained.test.d.ts +2 -0
  568. package/dist/selftest/contained.test.js +544 -0
  569. package/dist/selftest/credentials.test.d.ts +2 -0
  570. package/dist/selftest/credentials.test.js +198 -0
  571. package/dist/selftest/engine.test.d.ts +2 -0
  572. package/dist/selftest/engine.test.js +127 -0
  573. package/dist/selftest/generate.test.js +1 -1
  574. package/dist/selftest/hcs.test.d.ts +2 -0
  575. package/dist/selftest/hcs.test.js +482 -0
  576. package/dist/selftest/health.test.d.ts +2 -0
  577. package/dist/selftest/health.test.js +470 -0
  578. package/dist/selftest/heavy-load.test.d.ts +2 -0
  579. package/dist/selftest/heavy-load.test.js +329 -0
  580. package/dist/selftest/host-sim.test.js +2 -0
  581. package/dist/selftest/index.js +31 -0
  582. package/dist/selftest/layout.test.js +14 -0
  583. package/dist/selftest/menu-perf.test.d.ts +2 -0
  584. package/dist/selftest/menu-perf.test.js +248 -0
  585. package/dist/selftest/menu-screens.d.ts +7 -0
  586. package/dist/selftest/menu-screens.js +68 -17
  587. package/dist/selftest/menu.test.js +603 -22
  588. package/dist/selftest/migrate.test.js +1 -1
  589. package/dist/selftest/personalization.test.js +3 -1
  590. package/dist/selftest/projects.test.js +39 -1
  591. package/dist/selftest/shared-use.test.js +64 -2
  592. package/dist/selftest/sharing.test.js +50 -1
  593. package/dist/selftest/storage.test.d.ts +2 -0
  594. package/dist/selftest/storage.test.js +363 -0
  595. package/dist/selftest/support/engine-cases.d.ts +8 -0
  596. package/dist/selftest/support/engine-cases.js +65 -0
  597. package/dist/selftest/support/engine-golden.d.ts +3 -0
  598. package/dist/selftest/support/engine-golden.js +66 -0
  599. package/dist/selftest/support/fixtures.d.ts +20 -0
  600. package/dist/selftest/support/hcs-probes.d.ts +17 -0
  601. package/dist/selftest/support/hcs-probes.js +41 -0
  602. package/dist/selftest/support/releases.js +1 -1
  603. package/dist/selftest/toolchains.test.js +21 -0
  604. package/dist/selftest/update-service.test.js +87 -3
  605. package/dist/selftest/vpn.test.d.ts +2 -0
  606. package/dist/selftest/vpn.test.js +412 -0
  607. package/dist/selftest/web.test.d.ts +2 -0
  608. package/dist/selftest/web.test.js +402 -0
  609. package/dist/shared/apps/catalogue.js +31 -0
  610. package/dist/shared/channel/index.d.ts +1 -0
  611. package/dist/shared/channel/index.js +1 -0
  612. package/dist/shared/channel/run-dir.d.ts +9 -1
  613. package/dist/shared/channel/run-dir.js +18 -1
  614. package/dist/shared/channel/schema.d.ts +53 -0
  615. package/dist/shared/channel/schema.js +38 -0
  616. package/dist/shared/channel/secrets.d.ts +29 -0
  617. package/dist/shared/channel/secrets.js +50 -0
  618. package/dist/shared/memory/index.d.ts +1 -0
  619. package/dist/shared/memory/index.js +1 -0
  620. package/dist/shared/memory/policy.d.ts +33 -0
  621. package/dist/shared/memory/policy.js +55 -0
  622. package/dist/shared/pty/output-filter.d.ts +14 -1
  623. package/dist/shared/pty/output-filter.js +22 -4
  624. package/dist/shared/pty/terminal.d.ts +4 -1
  625. package/dist/shared/pty/terminal.js +4 -2
  626. package/dist/shared/system.d.ts +1 -0
  627. package/dist/shared/system.js +1 -0
  628. package/dist/shared/vpn/download.d.ts +29 -0
  629. package/dist/shared/vpn/download.js +30 -0
  630. package/dist/shared/vpn/kill-switch.d.ts +18 -0
  631. package/dist/shared/vpn/kill-switch.js +81 -0
  632. package/dist/shared/vpn/ovpn.d.ts +23 -0
  633. package/dist/shared/vpn/ovpn.js +244 -0
  634. package/dist/shared/vpn/wireguard.d.ts +51 -0
  635. package/dist/shared/vpn/wireguard.js +227 -0
  636. package/dist/shared/web/index.d.ts +1 -0
  637. package/dist/shared/web/index.js +1 -0
  638. package/dist/shared/web/protocol.d.ts +61 -0
  639. package/dist/shared/web/protocol.js +35 -0
  640. package/dist/sync/sync-cycle.js +9 -5
  641. package/dist/sync/sync-state.d.ts +1 -0
  642. package/dist/sync/sync-state.js +1 -0
  643. package/dist/sync/watcher.d.ts +13 -0
  644. package/dist/sync/watcher.js +102 -3
  645. package/dist/web/index.html +14 -0
  646. package/dist/web/main-NRRS5O6Z.js +157 -0
  647. package/dist/web/main-T5DMCHYV.css +1 -0
  648. package/native/csharp/FolderSecurity.cs +29 -0
  649. package/native/csharp/HcsHost/AssemblyInfo.cs +14 -0
  650. package/native/csharp/HcsHost/Guard.cs +100 -0
  651. package/native/csharp/HcsHost/Hcs.cs +256 -0
  652. package/native/csharp/HcsHost/Json.cs +78 -0
  653. package/native/csharp/HcsHost/Program.cs +185 -0
  654. package/native/csharp/HcsHost/VirtualDisk.cs +95 -0
  655. package/native/csharp/HostTools/AssemblyInfo.cs +14 -0
  656. package/native/csharp/HostTools/MemoryStatus.cs +107 -0
  657. package/native/csharp/HostTools/Program.cs +58 -17
  658. package/native/scripts/check-contained.ps1 +28 -0
  659. package/native/scripts/contained-common.ps1 +241 -0
  660. package/native/scripts/dismount-contained.ps1 +66 -0
  661. package/native/scripts/memory-status.ps1 +34 -0
  662. package/native/scripts/mount-contained.ps1 +139 -0
  663. package/native/scripts/protect-data.ps1 +29 -0
  664. package/native/scripts/read-folder-sddl.ps1 +10 -0
  665. package/native/scripts/run-elevated.ps1 +17 -4
  666. package/native/scripts/set-folder-access.ps1 +49 -7
  667. package/native/scripts/stop-events.ps1 +23 -8
  668. package/node_modules/ws/LICENSE +20 -0
  669. package/node_modules/ws/README.md +548 -0
  670. package/node_modules/ws/browser.js +8 -0
  671. package/node_modules/ws/index.js +22 -0
  672. package/node_modules/ws/lib/buffer-util.js +131 -0
  673. package/node_modules/ws/lib/constants.js +19 -0
  674. package/node_modules/ws/lib/event-target.js +292 -0
  675. package/node_modules/ws/lib/extension.js +203 -0
  676. package/node_modules/ws/lib/limiter.js +55 -0
  677. package/node_modules/ws/lib/permessage-deflate.js +530 -0
  678. package/node_modules/ws/lib/receiver.js +743 -0
  679. package/node_modules/ws/lib/sender.js +607 -0
  680. package/node_modules/ws/lib/stream.js +161 -0
  681. package/node_modules/ws/lib/subprotocol.js +62 -0
  682. package/node_modules/ws/lib/validation.js +152 -0
  683. package/node_modules/ws/lib/websocket-server.js +562 -0
  684. package/node_modules/ws/lib/websocket.js +1421 -0
  685. package/node_modules/ws/package.json +74 -0
  686. package/node_modules/ws/wrapper.mjs +21 -0
  687. package/package.json +22 -5
  688. package/sandbox/csharp/EnvBroadcast.cs +33 -0
  689. package/sandbox/csharp/MemGov.cs +398 -0
  690. package/sandbox/csharp/PathSync.cs +90 -0
  691. package/sandbox/csharp/PtyHost.cs +111 -5
  692. package/sandbox/scripts/install-shell-path.ps1 +73 -0
  693. package/sandbox/scripts/set-machine-environment.ps1 +37 -4
  694. package/schemas/config.schema.json +136 -7
  695. package/schemas/sandbox-config.schema.json +17 -4
  696. package/dist/cli/commands/repair/checks.d.ts +0 -2
  697. package/dist/cli/commands/repair/checks.js +0 -246
  698. package/dist/cli/commands/sessions/control.d.ts +0 -4
  699. package/dist/cli/commands/sessions/control.js +0 -66
  700. package/dist/cli/commands/sessions/list.d.ts +0 -2
  701. package/dist/cli/commands/sessions/list.js +0 -45
  702. package/dist/cli/commands/sessions/status.d.ts +0 -2
  703. package/dist/cli/commands/sessions/status.js +0 -93
  704. package/dist/cli/commands/sessions/window.d.ts +0 -3
  705. package/dist/cli/commands/sessions/window.js +0 -18
  706. package/dist/cli/menu/pages/start-page.d.ts +0 -43
  707. package/dist/cli/menu/pages/start-page.js +0 -192
  708. package/dist/cli/tui/tab-bar.d.ts +0 -9
  709. package/dist/cli/tui/tab-bar.js +0 -33
@@ -0,0 +1,42 @@
1
+ import { fail } from '../../core/util/errors.js';
2
+ import { issuesText } from './errors.js';
3
+ export const SURFACE_NAMES = ['cli', 'menu', 'web'];
4
+ export function defineOperation(def) {
5
+ return { ...def, cli: def.cli, kind: 'operation' };
6
+ }
7
+ export function defineQuery(def) {
8
+ return { ...def, cli: def.cli, kind: 'query' };
9
+ }
10
+ export function defineView(def) {
11
+ return { ...def, kind: 'view' };
12
+ }
13
+ /** Why a definition is not on a surface, or undefined when it is. */
14
+ export function exemption(def, surface) {
15
+ return def.surfaces === undefined || def.surfaces === 'all' ? undefined : def.surfaces.except[surface];
16
+ }
17
+ export function onSurface(def, surface) {
18
+ return exemption(def, surface) === undefined;
19
+ }
20
+ /** Binds implement() to the program's context type once (app/context.ts), so features write implement(def, run). */
21
+ export function implementer() {
22
+ return function implement(def, run) {
23
+ return { def, run: async (ctx, input, io) => run(ctx, input, io) };
24
+ };
25
+ }
26
+ /** The input as the definition reads it (defaults filled in); a value that does not fit says what is wrong. */
27
+ export function parseInput(def, input) {
28
+ const parsed = def.input.safeParse(input ?? {});
29
+ if (!parsed.success)
30
+ fail('That does not work for ' + def.title.toLowerCase() + ': ' + issuesText(parsed.error));
31
+ return parsed.data;
32
+ }
33
+ /** Runs an implementation the way every surface must: input checked before, output checked after. */
34
+ export async function invoke(impl, ctx, input, io) {
35
+ const output = await impl.run(ctx, parseInput(impl.def, input), io);
36
+ return impl.def.output.parse(output);
37
+ }
38
+ /** The inputs a view's queries run with for these parameters (defaults filled in). */
39
+ export function viewInputs(view, params) {
40
+ const given = view.inputs?.(params) ?? {};
41
+ return Object.fromEntries(Object.entries(view.queries).map(([name, query]) => [name, parseInput(query, given[name])]));
42
+ }
@@ -0,0 +1,34 @@
1
+ import { z } from 'zod';
2
+ export declare const ErrorKindSchema: z.ZodEnum<{
3
+ user: "user";
4
+ cancelled: "cancelled";
5
+ invalid: "invalid";
6
+ bug: "bug";
7
+ }>;
8
+ export type ErrorKind = z.output<typeof ErrorKindSchema>;
9
+ /** A failure as every surface shows it (and as the web receives it). */
10
+ export declare const WireErrorSchema: z.ZodObject<{
11
+ kind: z.ZodEnum<{
12
+ user: "user";
13
+ cancelled: "cancelled";
14
+ invalid: "invalid";
15
+ bug: "bug";
16
+ }>;
17
+ message: z.ZodString;
18
+ fix: z.ZodOptional<z.ZodString>;
19
+ }, z.core.$strict>;
20
+ export type WireError = z.output<typeof WireErrorSchema>;
21
+ /** The user said no to a question the operation needed: nothing changed. */
22
+ export declare class Cancelled extends Error {
23
+ constructor(message?: string);
24
+ }
25
+ /** Ends an operation because a question was declined. */
26
+ export declare function cancelled(message?: string): never;
27
+ /** What the user is told about a bug (its stack never leaves this PC). */
28
+ export declare const BUG_MESSAGE = "Something went wrong.";
29
+ /** Any thrown value as message + fix. */
30
+ export declare function toWireError(e: unknown): WireError;
31
+ /** The error to throw on the receiving side (the web client, a test). */
32
+ export declare function fromWireError(w: WireError): Error;
33
+ /** "key: problem; other: problem" for a value that did not fit its schema. */
34
+ export declare function issuesText(e: z.ZodError): string;
@@ -0,0 +1,45 @@
1
+ // How a failure crosses a surface: a UserError (fail(message, fix)) stays a message and a fix everywhere, a declined
2
+ // question is "cancelled" (nothing changed), a value that does not fit a schema is "invalid", and anything else is a
3
+ // bug whose details stay on this PC.
4
+ import { z } from 'zod';
5
+ import { UserError } from '../../core/util/errors.js';
6
+ export const ErrorKindSchema = z.enum(['user', 'cancelled', 'invalid', 'bug']);
7
+ /** A failure as every surface shows it (and as the web receives it). */
8
+ export const WireErrorSchema = z.strictObject({
9
+ kind: ErrorKindSchema,
10
+ message: z.string().max(2000),
11
+ fix: z.string().max(2000).optional(),
12
+ });
13
+ /** The user said no to a question the operation needed: nothing changed. */
14
+ export class Cancelled extends Error {
15
+ constructor(message = 'Nothing changed.') {
16
+ super(message);
17
+ this.name = 'Cancelled';
18
+ }
19
+ }
20
+ /** Ends an operation because a question was declined. */
21
+ export function cancelled(message) {
22
+ throw new Cancelled(message);
23
+ }
24
+ /** What the user is told about a bug (its stack never leaves this PC). */
25
+ export const BUG_MESSAGE = 'Something went wrong.';
26
+ /** Any thrown value as message + fix. */
27
+ export function toWireError(e) {
28
+ if (e instanceof Cancelled)
29
+ return { kind: 'cancelled', message: e.message };
30
+ if (e instanceof UserError)
31
+ return { kind: 'user', message: e.message, ...(e.fix ? { fix: e.fix } : {}) };
32
+ if (e instanceof z.ZodError)
33
+ return { kind: 'invalid', message: issuesText(e) };
34
+ return { kind: 'bug', message: BUG_MESSAGE };
35
+ }
36
+ /** The error to throw on the receiving side (the web client, a test). */
37
+ export function fromWireError(w) {
38
+ if (w.kind === 'cancelled')
39
+ return new Cancelled(w.message);
40
+ return new UserError(w.message, w.fix);
41
+ }
42
+ /** "key: problem; other: problem" for a value that did not fit its schema. */
43
+ export function issuesText(e) {
44
+ return e.issues.map((i) => (i.path.length ? i.path.join('.') + ': ' : '') + i.message).join('; ');
45
+ }
@@ -0,0 +1,70 @@
1
+ import { z } from 'zod';
2
+ import { SchemaNode } from './schema-node.js';
3
+ export declare const FIELD_KINDS: readonly ["boolean", "enum", "number", "text", "secret", "path", "list", "map", "object", "json"];
4
+ export type FieldKind = (typeof FIELD_KINDS)[number];
5
+ /** A folder or a file on this PC. */
6
+ export type PathKind = 'dir' | 'file';
7
+ export type ChoiceValue = string | number | boolean;
8
+ export interface Choice {
9
+ readonly value: ChoiceValue;
10
+ readonly label: string;
11
+ }
12
+ export interface Field {
13
+ /** The last part of the key ('' for a whole schema). */
14
+ readonly name: string;
15
+ /** Where the value sits, from the root of the schema (settings: sandbox.memoryMb). */
16
+ readonly key: readonly string[];
17
+ readonly kind: FieldKind;
18
+ readonly label: string;
19
+ readonly help?: string;
20
+ /** May be left out (it is optional or has a default). */
21
+ readonly optional: boolean;
22
+ /** The default (secrets: never sent; `***` when there is one). */
23
+ readonly default?: unknown;
24
+ /** enum: the values offered. */
25
+ readonly choices?: readonly Choice[];
26
+ /** enum: a value of your own is allowed too (a number, a text): typed as this field. */
27
+ readonly open?: Field;
28
+ /** number: the range and whether it must be whole; `range` says it in words ("1 to 365"). */
29
+ readonly min?: number;
30
+ readonly max?: number;
31
+ readonly integer?: boolean;
32
+ readonly range?: string;
33
+ /** path: a folder or a file; `literals` are words allowed instead of a path ("auto"). */
34
+ readonly pathKind?: PathKind;
35
+ readonly literals?: readonly string[];
36
+ /** list / map: one entry. */
37
+ readonly element?: Field;
38
+ /** object: its fields, in schema order. */
39
+ readonly fields?: readonly Field[];
40
+ }
41
+ /** The wire shape of a Field (validated wherever Fields arrive from elsewhere). */
42
+ export declare const FieldSchema: z.ZodType<Field>;
43
+ /** The kind of path a value holds (its key without list positions), or undefined when it is not a path. */
44
+ export declare function pathKindOf(key: readonly string[]): PathKind | undefined;
45
+ /** Words that are fine instead of a path ("auto"), read from the description. */
46
+ export declare function pathLiterals(node: SchemaNode): string[];
47
+ /** "On", "Off" or the value itself: how a choice is named. */
48
+ export declare function choiceLabel(v: unknown): string;
49
+ /** The Field for a schema (or one part of it, `key` naming where it sits). */
50
+ export declare function fieldOf(schema: z.ZodType | SchemaNode, key?: readonly string[], label?: string): Field;
51
+ /** The Fields of an object schema, in schema order (`key` = where the object sits). */
52
+ export declare function fieldsOf(schema: z.ZodType | SchemaNode, key?: readonly string[]): Field[];
53
+ /** A value in one short line, and the tone it is shown in (secrets as ***). */
54
+ export interface ValueText {
55
+ readonly text: string;
56
+ readonly tone?: 'ok' | 'muted';
57
+ }
58
+ /** A one-line name for an object in a list (a mapped folder, an agent's package ...). */
59
+ export declare function summary(value: unknown): string;
60
+ /** How a value reads in a list: On/Off, "not set", counts for lists and maps, *** for a secret. */
61
+ export declare function valueText(value: unknown, field?: Pick<Field, 'kind' | 'element'>, max?: number): ValueText;
62
+ /** What was typed for a value as the value it stands for: true/false/on/off, a number, JSON, or plain text. */
63
+ export declare function valueFromText(node: SchemaNode, text: string): unknown;
64
+ /** What a value accepts, in words: its fixed values, a number and its range, true or false. */
65
+ export declare function allowedText(node: SchemaNode): string;
66
+ /**
67
+ * What is wrong with a value for a Field, as far as the Field can tell (required, a number in range, one of the
68
+ * choices); undefined when nothing is. Forms check this as you type; the operation checks the value fully again.
69
+ */
70
+ export declare function fieldProblem(field: Field, value: unknown): string | undefined;
@@ -0,0 +1,243 @@
1
+ // One form model for every surface: any zod schema (an operation's input, the whole settings schema) becomes Field
2
+ // descriptors - the kind of input, its label and help (from .describe()), default, range, choices, whether it is a
3
+ // folder or a file. The menu's editors and the web's inputs both read Fields, so a new option or setting is editable
4
+ // everywhere as soon as it is in a schema. Fields are plain data (FieldSchema), so they can travel to the browser.
5
+ import { z } from 'zod';
6
+ import { SchemaNode } from './schema-node.js';
7
+ import { humanize } from './text.js';
8
+ export const FIELD_KINDS = [
9
+ 'boolean',
10
+ 'enum',
11
+ 'number',
12
+ 'text',
13
+ 'secret',
14
+ 'path',
15
+ 'list',
16
+ 'map',
17
+ 'object',
18
+ 'json',
19
+ ];
20
+ const ChoiceValueSchema = z.union([z.string(), z.number(), z.boolean()]);
21
+ /** The wire shape of a Field (validated wherever Fields arrive from elsewhere). */
22
+ export const FieldSchema = z.lazy(() => z.strictObject({
23
+ name: z.string(),
24
+ key: z.array(z.string()),
25
+ kind: z.enum(FIELD_KINDS),
26
+ label: z.string(),
27
+ help: z.string().optional(),
28
+ optional: z.boolean(),
29
+ default: z.unknown().optional(),
30
+ choices: z.array(z.strictObject({ value: ChoiceValueSchema, label: z.string() })).optional(),
31
+ open: FieldSchema.optional(),
32
+ min: z.number().optional(),
33
+ max: z.number().optional(),
34
+ integer: z.boolean().optional(),
35
+ range: z.string().optional(),
36
+ pathKind: z.enum(['dir', 'file']).optional(),
37
+ literals: z.array(z.string()).optional(),
38
+ element: FieldSchema.optional(),
39
+ fields: z.array(FieldSchema).optional(),
40
+ }));
41
+ /** Settings whose value (or list entries) are folders or files, besides the names that say so (…Dir, …File). */
42
+ const PATH_KINDS = {
43
+ 'storage.root': 'dir',
44
+ 'projects.roots': 'dir',
45
+ 'projects.exclude': 'dir',
46
+ 'projects.declinedRoots': 'dir',
47
+ 'claudeProfile.hostDir': 'dir',
48
+ 'claudeProfile.globalStateFile': 'file',
49
+ scripts: 'file',
50
+ };
51
+ /** The kind of path a value holds (its key without list positions), or undefined when it is not a path. */
52
+ export function pathKindOf(key) {
53
+ const id = key.join('.');
54
+ const last = key[key.length - 1] ?? '';
55
+ if (PATH_KINDS[id])
56
+ return PATH_KINDS[id];
57
+ if (key[0] === 'mappings' && last === 'host')
58
+ return 'dir';
59
+ if (last === 'hostDir')
60
+ return 'dir';
61
+ if (/(Dir|Folder)$/.test(last))
62
+ return 'dir';
63
+ if (/File$/.test(last))
64
+ return 'file';
65
+ return undefined;
66
+ }
67
+ /** Words that are fine instead of a path ("auto"), read from the description. */
68
+ export function pathLiterals(node) {
69
+ return /"auto"/.test(node.description ?? '') ? ['auto'] : [];
70
+ }
71
+ /** "On", "Off" or the value itself: how a choice is named. */
72
+ export function choiceLabel(v) {
73
+ return v === true ? 'On' : v === false ? 'Off' : String(v);
74
+ }
75
+ /** A real bound (zod reports none as ±Infinity or the safe-integer limits). */
76
+ function isLimit(n) {
77
+ return n !== undefined && Number.isFinite(n) && Math.abs(n) < Number.MAX_SAFE_INTEGER;
78
+ }
79
+ /** The schema's default, if it has one. */
80
+ function defaultOf(node) {
81
+ const def = node.schema._zod.def;
82
+ return def.type === 'default' ? def.defaultValue : undefined;
83
+ }
84
+ /** The Field for a schema (or one part of it, `key` naming where it sits). */
85
+ export function fieldOf(schema, key = [], label) {
86
+ const node = schema instanceof SchemaNode ? schema : new SchemaNode(schema);
87
+ const name = key[key.length - 1] ?? '';
88
+ const base = {
89
+ name,
90
+ key: [...key],
91
+ label: label ?? (name ? humanize(name) : ''),
92
+ ...(node.description ? { help: node.description } : {}),
93
+ optional: node.optional,
94
+ };
95
+ const fallback = defaultOf(node);
96
+ const withDefault = (secret) => fallback === undefined ? {} : { default: secret ? (fallback === '' ? '' : '***') : fallback };
97
+ switch (node.editor) {
98
+ case 'boolean':
99
+ return { ...base, kind: 'boolean', ...withDefault(false) };
100
+ case 'choice':
101
+ case 'union': {
102
+ const open = node.openOption;
103
+ return {
104
+ ...base,
105
+ kind: 'enum',
106
+ ...withDefault(false),
107
+ choices: node.choiceValues
108
+ .filter((v) => ['string', 'number', 'boolean'].includes(typeof v))
109
+ .map((v) => ({ value: v, label: choiceLabel(v) })),
110
+ ...(open ? { open: fieldOf(open, key, base.label) } : {}),
111
+ };
112
+ }
113
+ case 'number': {
114
+ const range = node.rangeText();
115
+ return {
116
+ ...base,
117
+ kind: 'number',
118
+ ...withDefault(false),
119
+ ...(isLimit(node.min) ? { min: node.min } : {}),
120
+ ...(isLimit(node.max) ? { max: node.max } : {}),
121
+ ...(node.integer ? { integer: true } : {}),
122
+ ...(range ? { range } : {}),
123
+ };
124
+ }
125
+ case 'string': {
126
+ if (node.secret)
127
+ return { ...base, kind: 'secret', ...withDefault(true) };
128
+ const pathKind = pathKindOf(key);
129
+ if (pathKind)
130
+ return { ...base, kind: 'path', ...withDefault(false), pathKind, literals: pathLiterals(node) };
131
+ return { ...base, kind: 'text', ...withDefault(false) };
132
+ }
133
+ case 'string-list':
134
+ case 'choice-list':
135
+ case 'object-list':
136
+ return { ...base, kind: 'list', ...withDefault(false), element: fieldOf(node.element, key, 'Entry') };
137
+ case 'string-map':
138
+ case 'object-map':
139
+ return { ...base, kind: 'map', ...withDefault(node.element?.secret ?? false), element: elementOf(node, key) };
140
+ case 'object':
141
+ return { ...base, kind: 'object', ...withDefault(false), fields: fieldsOf(node, key) };
142
+ default:
143
+ return { ...base, kind: 'json', ...withDefault(false) };
144
+ }
145
+ }
146
+ /** A map's entry: named by its key, so it is not a path or secret by the map's own name alone. */
147
+ function elementOf(node, key) {
148
+ return fieldOf(node.element, [...key, '*'], 'Value');
149
+ }
150
+ /** The Fields of an object schema, in schema order (`key` = where the object sits). */
151
+ export function fieldsOf(schema, key = []) {
152
+ const node = schema instanceof SchemaNode ? schema : new SchemaNode(schema);
153
+ return node.children().map(([name, child]) => fieldOf(child, [...key, name]));
154
+ }
155
+ /** A one-line name for an object in a list (a mapped folder, an agent's package ...). */
156
+ export function summary(value) {
157
+ if (typeof value !== 'object' || value === null || Array.isArray(value))
158
+ return String(value);
159
+ const o = value;
160
+ if (typeof o.host === 'string' && typeof o.guest === 'string')
161
+ return o.host + ' → ' + o.guest + (o.readOnly ? ' (read-only)' : '');
162
+ const strings = Object.values(o).filter((v) => typeof v === 'string' && v !== '');
163
+ return strings.slice(0, 2).join(' · ') || '{ ' + Object.keys(o).join(', ') + ' }';
164
+ }
165
+ /** Cuts text to `max` characters with an ellipsis. */
166
+ function cut(text, max) {
167
+ return text.length > max ? text.slice(0, Math.max(0, max - 1)) + '…' : text;
168
+ }
169
+ /** How a value reads in a list: On/Off, "not set", counts for lists and maps, *** for a secret. */
170
+ export function valueText(value, field, max = 60) {
171
+ if (value === undefined)
172
+ return { text: 'not set', tone: 'muted' };
173
+ if (field?.kind === 'secret')
174
+ return value === '' ? { text: '(empty)', tone: 'muted' } : { text: '***' };
175
+ if (value === true)
176
+ return { text: 'On', tone: 'ok' };
177
+ if (value === false)
178
+ return { text: 'Off', tone: 'muted' };
179
+ if (value === null)
180
+ return { text: 'none', tone: 'muted' };
181
+ if (typeof value === 'string')
182
+ return value === '' ? { text: '(empty)', tone: 'muted' } : { text: cut(value, max) };
183
+ if (typeof value === 'number')
184
+ return { text: String(value) };
185
+ if (Array.isArray(value))
186
+ return value.length === 0
187
+ ? { text: 'none', tone: 'muted' }
188
+ : {
189
+ text: cut(value.length + ' · ' + value.map((v) => (typeof v === 'object' ? summary(v) : String(v))).join(', '), max),
190
+ };
191
+ const keys = Object.keys(value);
192
+ return keys.length ? { text: cut(keys.length + ' · ' + keys.join(', '), max) } : { text: 'none', tone: 'muted' };
193
+ }
194
+ /** What was typed for a value as the value it stands for: true/false/on/off, a number, JSON, or plain text. */
195
+ export function valueFromText(node, text) {
196
+ const word = text.trim().toLowerCase();
197
+ if (node.type === 'string')
198
+ return text;
199
+ if (node.type === 'boolean' || node.options.some((o) => o.type === 'boolean')) {
200
+ if (['true', 'on', 'yes'].includes(word))
201
+ return true;
202
+ if (['false', 'off', 'no'].includes(word))
203
+ return false;
204
+ }
205
+ try {
206
+ return JSON.parse(text);
207
+ }
208
+ catch {
209
+ // Not JSON: a bare word such as auto or a path is the text itself.
210
+ return node.type === 'array' ? text.split(',').map((t) => t.trim()) : text;
211
+ }
212
+ }
213
+ /** What a value accepts, in words: its fixed values, a number and its range, true or false. */
214
+ export function allowedText(node) {
215
+ if (node.type === 'boolean')
216
+ return 'Use true or false.';
217
+ const values = node.choiceValues.map((v) => String(v));
218
+ const open = node.openOption ?? (node.type === 'number' ? node : undefined);
219
+ const range = (n) => (n.rangeText() ? ' (' + n.rangeText() + ')' : '');
220
+ const more = open ? (open.type === 'number' ? 'a number' + range(open) : 'text') : '';
221
+ const parts = [...values, ...(more ? [more] : [])];
222
+ return parts.length ? 'Allowed: ' + parts.join(', or ') + '.' : 'Check the value.';
223
+ }
224
+ /**
225
+ * What is wrong with a value for a Field, as far as the Field can tell (required, a number in range, one of the
226
+ * choices); undefined when nothing is. Forms check this as you type; the operation checks the value fully again.
227
+ */
228
+ export function fieldProblem(field, value) {
229
+ if (value === undefined || value === '')
230
+ return field.optional || field.kind === 'text' ? undefined : 'Required.';
231
+ if (field.kind === 'number') {
232
+ const n = typeof value === 'number' ? value : Number(value);
233
+ if (!Number.isFinite(n))
234
+ return 'Enter a number.';
235
+ if (field.integer && !Number.isInteger(n))
236
+ return 'Enter a whole number.';
237
+ if ((field.min !== undefined && n < field.min) || (field.max !== undefined && n > field.max))
238
+ return field.range ? 'Use ' + field.range + '.' : 'Out of range.';
239
+ }
240
+ if (field.kind === 'enum' && !field.open && !field.choices?.some((c) => c.value === value))
241
+ return 'Choose one.';
242
+ return undefined;
243
+ }
@@ -0,0 +1,8 @@
1
+ export * from './define.js';
2
+ export * from './errors.js';
3
+ export * from './fields.js';
4
+ export * from './io.js';
5
+ export * from './rpc.js';
6
+ export * from './schema-node.js';
7
+ export * from './text.js';
8
+ export * from './view.js';
@@ -0,0 +1,10 @@
1
+ // The kernel of the shared core: pure (zod and nothing of Node, the terminal or the DOM), so the CLI, the menu, the
2
+ // web server and the browser all import the same definitions, view model, form fields, questions and RPC messages.
3
+ export * from './define.js';
4
+ export * from './errors.js';
5
+ export * from './fields.js';
6
+ export * from './io.js';
7
+ export * from './rpc.js';
8
+ export * from './schema-node.js';
9
+ export * from './text.js';
10
+ export * from './view.js';
@@ -0,0 +1,193 @@
1
+ import { z } from 'zod';
2
+ import type { Tone } from './view.js';
3
+ declare const ChoiceSchema: z.ZodObject<{
4
+ value: z.ZodString;
5
+ label: z.ZodString;
6
+ description: z.ZodOptional<z.ZodString>;
7
+ }, z.core.$strict>;
8
+ export type QuestionChoice = z.output<typeof ChoiceSchema>;
9
+ export declare const ConfirmQuestionSchema: z.ZodObject<{
10
+ kind: z.ZodLiteral<"confirm">;
11
+ title: z.ZodString;
12
+ lines: z.ZodOptional<z.ZodArray<z.ZodString>>;
13
+ yes: z.ZodOptional<z.ZodString>;
14
+ danger: z.ZodOptional<z.ZodBoolean>;
15
+ typed: z.ZodOptional<z.ZodString>;
16
+ implied: z.ZodOptional<z.ZodBoolean>;
17
+ noTerminal: z.ZodOptional<z.ZodObject<{
18
+ message: z.ZodString;
19
+ fix: z.ZodString;
20
+ }, z.core.$strict>>;
21
+ }, z.core.$strict>;
22
+ export declare const ChooseQuestionSchema: z.ZodObject<{
23
+ kind: z.ZodLiteral<"choose">;
24
+ title: z.ZodString;
25
+ lines: z.ZodOptional<z.ZodArray<z.ZodString>>;
26
+ choices: z.ZodArray<z.ZodObject<{
27
+ value: z.ZodString;
28
+ label: z.ZodString;
29
+ description: z.ZodOptional<z.ZodString>;
30
+ }, z.core.$strict>>;
31
+ initial: z.ZodOptional<z.ZodString>;
32
+ }, z.core.$strict>;
33
+ export declare const TextQuestionSchema: z.ZodObject<{
34
+ kind: z.ZodLiteral<"text">;
35
+ title: z.ZodString;
36
+ lines: z.ZodOptional<z.ZodArray<z.ZodString>>;
37
+ initial: z.ZodOptional<z.ZodString>;
38
+ allowEmpty: z.ZodOptional<z.ZodBoolean>;
39
+ problem: z.ZodOptional<z.ZodString>;
40
+ }, z.core.$strict>;
41
+ export declare const SecretQuestionSchema: z.ZodObject<{
42
+ kind: z.ZodLiteral<"secret">;
43
+ title: z.ZodString;
44
+ lines: z.ZodOptional<z.ZodArray<z.ZodString>>;
45
+ problem: z.ZodOptional<z.ZodString>;
46
+ }, z.core.$strict>;
47
+ export declare const PathQuestionSchema: z.ZodObject<{
48
+ kind: z.ZodLiteral<"path">;
49
+ title: z.ZodString;
50
+ lines: z.ZodOptional<z.ZodArray<z.ZodString>>;
51
+ pathKind: z.ZodEnum<{
52
+ file: "file";
53
+ dir: "dir";
54
+ }>;
55
+ initial: z.ZodOptional<z.ZodString>;
56
+ literals: z.ZodOptional<z.ZodArray<z.ZodString>>;
57
+ problem: z.ZodOptional<z.ZodString>;
58
+ }, z.core.$strict>;
59
+ export declare const ChecklistQuestionSchema: z.ZodObject<{
60
+ kind: z.ZodLiteral<"checklist">;
61
+ title: z.ZodString;
62
+ lines: z.ZodOptional<z.ZodArray<z.ZodString>>;
63
+ choices: z.ZodArray<z.ZodObject<{
64
+ value: z.ZodString;
65
+ label: z.ZodString;
66
+ description: z.ZodOptional<z.ZodString>;
67
+ }, z.core.$strict>>;
68
+ checked: z.ZodOptional<z.ZodArray<z.ZodString>>;
69
+ }, z.core.$strict>;
70
+ export declare const QuestionSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
71
+ kind: z.ZodLiteral<"confirm">;
72
+ title: z.ZodString;
73
+ lines: z.ZodOptional<z.ZodArray<z.ZodString>>;
74
+ yes: z.ZodOptional<z.ZodString>;
75
+ danger: z.ZodOptional<z.ZodBoolean>;
76
+ typed: z.ZodOptional<z.ZodString>;
77
+ implied: z.ZodOptional<z.ZodBoolean>;
78
+ noTerminal: z.ZodOptional<z.ZodObject<{
79
+ message: z.ZodString;
80
+ fix: z.ZodString;
81
+ }, z.core.$strict>>;
82
+ }, z.core.$strict>, z.ZodObject<{
83
+ kind: z.ZodLiteral<"choose">;
84
+ title: z.ZodString;
85
+ lines: z.ZodOptional<z.ZodArray<z.ZodString>>;
86
+ choices: z.ZodArray<z.ZodObject<{
87
+ value: z.ZodString;
88
+ label: z.ZodString;
89
+ description: z.ZodOptional<z.ZodString>;
90
+ }, z.core.$strict>>;
91
+ initial: z.ZodOptional<z.ZodString>;
92
+ }, z.core.$strict>, z.ZodObject<{
93
+ kind: z.ZodLiteral<"text">;
94
+ title: z.ZodString;
95
+ lines: z.ZodOptional<z.ZodArray<z.ZodString>>;
96
+ initial: z.ZodOptional<z.ZodString>;
97
+ allowEmpty: z.ZodOptional<z.ZodBoolean>;
98
+ problem: z.ZodOptional<z.ZodString>;
99
+ }, z.core.$strict>, z.ZodObject<{
100
+ kind: z.ZodLiteral<"secret">;
101
+ title: z.ZodString;
102
+ lines: z.ZodOptional<z.ZodArray<z.ZodString>>;
103
+ problem: z.ZodOptional<z.ZodString>;
104
+ }, z.core.$strict>, z.ZodObject<{
105
+ kind: z.ZodLiteral<"path">;
106
+ title: z.ZodString;
107
+ lines: z.ZodOptional<z.ZodArray<z.ZodString>>;
108
+ pathKind: z.ZodEnum<{
109
+ file: "file";
110
+ dir: "dir";
111
+ }>;
112
+ initial: z.ZodOptional<z.ZodString>;
113
+ literals: z.ZodOptional<z.ZodArray<z.ZodString>>;
114
+ problem: z.ZodOptional<z.ZodString>;
115
+ }, z.core.$strict>, z.ZodObject<{
116
+ kind: z.ZodLiteral<"checklist">;
117
+ title: z.ZodString;
118
+ lines: z.ZodOptional<z.ZodArray<z.ZodString>>;
119
+ choices: z.ZodArray<z.ZodObject<{
120
+ value: z.ZodString;
121
+ label: z.ZodString;
122
+ description: z.ZodOptional<z.ZodString>;
123
+ }, z.core.$strict>>;
124
+ checked: z.ZodOptional<z.ZodArray<z.ZodString>>;
125
+ }, z.core.$strict>], "kind">;
126
+ export type Question = z.output<typeof QuestionSchema>;
127
+ export type ConfirmQuestion = z.output<typeof ConfirmQuestionSchema>;
128
+ export type ChooseQuestion = z.output<typeof ChooseQuestionSchema>;
129
+ export type TextQuestion = z.output<typeof TextQuestionSchema>;
130
+ export type SecretQuestion = z.output<typeof SecretQuestionSchema>;
131
+ export type PathQuestion = z.output<typeof PathQuestionSchema>;
132
+ export type ChecklistQuestion = z.output<typeof ChecklistQuestionSchema>;
133
+ /** The answer each kind of question gets (undefined = backed out). */
134
+ export interface AnswerOf {
135
+ confirm: boolean;
136
+ choose: string | undefined;
137
+ text: string | undefined;
138
+ secret: string | undefined;
139
+ path: string | undefined;
140
+ checklist: string[] | undefined;
141
+ }
142
+ export type Answer = AnswerOf[keyof AnswerOf];
143
+ /** The wire shape of an answer for each kind (the server checks what the browser sends). */
144
+ export declare const ANSWER_SCHEMAS: {
145
+ readonly [K in keyof AnswerOf]: z.ZodType<AnswerOf[K]>;
146
+ };
147
+ /** A check of a typed answer: true, or what is wrong (the question is asked again with it). */
148
+ export type Validate = (value: string) => true | string;
149
+ type Ask<K extends keyof AnswerOf, Q> = (question: Omit<Q, 'kind'>) => Promise<AnswerOf[K]>;
150
+ type AskTyped<K extends keyof AnswerOf, Q> = (question: Omit<Q, 'kind'> & {
151
+ validate?: Validate;
152
+ }) => Promise<AnswerOf[K]>;
153
+ export interface OperationIO {
154
+ /** What is happening now (a spinner in the CLI, a notice in the menu, a progress line in the web). */
155
+ progress(text: string): void;
156
+ /** A line of output worth keeping. */
157
+ log(text: string, tone?: Tone): void;
158
+ confirm: Ask<'confirm', ConfirmQuestion>;
159
+ choose: Ask<'choose', ChooseQuestion>;
160
+ text: AskTyped<'text', TextQuestion>;
161
+ secret: AskTyped<'secret', SecretQuestion>;
162
+ path: AskTyped<'path', PathQuestion>;
163
+ checklist: Ask<'checklist', ChecklistQuestion>;
164
+ }
165
+ /** Asks one question the way a surface can. */
166
+ export type Asker = <Q extends Question>(question: Q) => Promise<AnswerOf[Q['kind']]>;
167
+ /** Where progress and log lines go. */
168
+ export interface OutputSink {
169
+ progress(text: string): void;
170
+ log(text: string, tone?: Tone): void;
171
+ }
172
+ /** An OperationIO from one way of asking and one place for output lines. */
173
+ export declare function ioFromAsker(asker: Asker, sink: OutputSink): OperationIO;
174
+ /** What a FakeIO saw: every question asked and every line written. */
175
+ export interface FakeIORecord {
176
+ readonly questions: Question[];
177
+ readonly progress: string[];
178
+ readonly logs: {
179
+ text: string;
180
+ tone?: Tone;
181
+ }[];
182
+ }
183
+ /**
184
+ * An OperationIO for tests: answers come from a list in order (a function gets the question). Running out of answers
185
+ * fails the test with the question that had none.
186
+ */
187
+ export declare function fakeIO(answers?: readonly (Answer | ((q: Question) => Answer))[]): {
188
+ io: OperationIO;
189
+ seen: FakeIORecord;
190
+ };
191
+ /** For reads that never ask (queries): output is dropped, and a question is a bug. */
192
+ export declare const NO_QUESTIONS: OperationIO;
193
+ export {};