windows-development-sandbox 1.4.0 → 1.4.3

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 (877) hide show
  1. package/.sandbox-config.example.json +2 -1
  2. package/config.example.json +4 -1
  3. package/dist/api.js +27 -16
  4. package/dist/cli/args.d.ts +4 -6
  5. package/dist/cli/args.js +67 -34
  6. package/dist/cli/argv.d.ts +9 -0
  7. package/dist/cli/argv.js +22 -0
  8. package/dist/cli/commands/accounts.d.ts +1 -1
  9. package/dist/cli/commands/accounts.js +42 -27
  10. package/dist/cli/commands/agent-commands.d.ts +3 -3
  11. package/dist/cli/commands/agent-commands.js +27 -18
  12. package/dist/cli/commands/context.d.ts +9 -11
  13. package/dist/cli/commands/context.js +35 -32
  14. package/dist/cli/commands/data/clean.d.ts +2 -2
  15. package/dist/cli/commands/data/clean.js +27 -11
  16. package/dist/cli/commands/data/collect.d.ts +6 -3
  17. package/dist/cli/commands/data/collect.js +46 -15
  18. package/dist/cli/commands/data/index.d.ts +2 -2
  19. package/dist/cli/commands/data/index.js +30 -12
  20. package/dist/cli/commands/data/remove.d.ts +1 -1
  21. package/dist/cli/commands/data/remove.js +4 -4
  22. package/dist/cli/commands/index.d.ts +5 -4
  23. package/dist/cli/commands/index.js +5 -4
  24. package/dist/cli/commands/launch/add-root.d.ts +7 -0
  25. package/dist/cli/commands/launch/add-root.js +64 -0
  26. package/dist/cli/commands/launch/boot-progress.d.ts +7 -0
  27. package/dist/cli/commands/launch/boot-progress.js +48 -0
  28. package/dist/cli/commands/launch/boot-wants.d.ts +11 -0
  29. package/dist/cli/commands/launch/boot-wants.js +48 -0
  30. package/dist/cli/commands/launch/first-start.d.ts +10 -0
  31. package/dist/cli/commands/launch/first-start.js +53 -0
  32. package/dist/cli/commands/launch/index.d.ts +6 -0
  33. package/dist/cli/commands/launch/index.js +6 -0
  34. package/dist/cli/commands/launch/launch.d.ts +8 -0
  35. package/dist/cli/commands/launch/launch.js +211 -0
  36. package/dist/cli/commands/launch/prepare.d.ts +23 -0
  37. package/dist/cli/commands/launch/prepare.js +109 -0
  38. package/dist/cli/commands/launch/running.d.ts +45 -0
  39. package/dist/cli/commands/launch/running.js +218 -0
  40. package/dist/cli/commands/launch/summary.d.ts +8 -0
  41. package/dist/cli/commands/launch/summary.js +98 -0
  42. package/dist/cli/commands/maintenance/audit.d.ts +3 -0
  43. package/dist/cli/commands/maintenance/audit.js +58 -0
  44. package/dist/cli/commands/maintenance/clean.d.ts +2 -0
  45. package/dist/cli/commands/maintenance/clean.js +10 -0
  46. package/dist/cli/commands/maintenance/config.d.ts +2 -0
  47. package/dist/cli/commands/maintenance/config.js +145 -0
  48. package/dist/cli/commands/maintenance/doctor.d.ts +2 -0
  49. package/dist/cli/commands/maintenance/doctor.js +52 -0
  50. package/dist/cli/commands/maintenance/host-claude.d.ts +2 -0
  51. package/dist/cli/commands/maintenance/host-claude.js +4 -0
  52. package/dist/cli/commands/maintenance/index.d.ts +8 -0
  53. package/dist/cli/commands/maintenance/index.js +9 -0
  54. package/dist/cli/commands/maintenance/logs.d.ts +2 -0
  55. package/dist/cli/commands/maintenance/logs.js +44 -0
  56. package/dist/cli/commands/maintenance/sync.d.ts +2 -0
  57. package/dist/cli/commands/maintenance/sync.js +12 -0
  58. package/dist/cli/commands/maintenance/watch.d.ts +3 -0
  59. package/dist/cli/commands/maintenance/watch.js +6 -0
  60. package/dist/cli/commands/projects/describe-sessions.d.ts +3 -0
  61. package/dist/cli/commands/projects/describe-sessions.js +15 -0
  62. package/dist/cli/commands/projects/here.d.ts +38 -0
  63. package/dist/cli/commands/projects/here.js +145 -0
  64. package/dist/cli/commands/projects/index.d.ts +4 -0
  65. package/dist/cli/commands/projects/index.js +4 -0
  66. package/dist/cli/commands/projects/projects.d.ts +14 -0
  67. package/dist/cli/commands/projects/projects.js +213 -0
  68. package/dist/cli/commands/projects/restart.d.ts +15 -0
  69. package/dist/cli/commands/projects/restart.js +149 -0
  70. package/dist/cli/commands/registry.d.ts +3 -0
  71. package/dist/cli/commands/registry.js +34 -0
  72. package/dist/cli/commands/repair/checks.js +105 -29
  73. package/dist/cli/commands/repair/finders.d.ts +13 -10
  74. package/dist/cli/commands/repair/finders.js +63 -43
  75. package/dist/cli/commands/repair/index.d.ts +4 -4
  76. package/dist/cli/commands/repair/index.js +47 -21
  77. package/dist/cli/commands/repair/types.d.ts +2 -2
  78. package/dist/cli/commands/repair/types.js +7 -2
  79. package/dist/cli/commands/sessions/attach.d.ts +2 -0
  80. package/dist/cli/commands/sessions/attach.js +45 -0
  81. package/dist/cli/commands/sessions/control.d.ts +4 -0
  82. package/dist/cli/commands/sessions/control.js +62 -0
  83. package/dist/cli/commands/sessions/exec.d.ts +6 -0
  84. package/dist/cli/commands/sessions/exec.js +72 -0
  85. package/dist/cli/commands/sessions/index.d.ts +6 -0
  86. package/dist/cli/commands/sessions/index.js +9 -0
  87. package/dist/cli/commands/sessions/list.d.ts +15 -0
  88. package/dist/cli/commands/sessions/list.js +65 -0
  89. package/dist/cli/commands/sessions/status.d.ts +2 -0
  90. package/dist/cli/commands/sessions/status.js +153 -0
  91. package/dist/cli/commands/sessions/window.d.ts +3 -0
  92. package/dist/cli/commands/sessions/window.js +18 -0
  93. package/dist/cli/commands/setup/checks.d.ts +4 -4
  94. package/dist/cli/commands/setup/checks.js +36 -19
  95. package/dist/cli/commands/setup/facts.d.ts +6 -6
  96. package/dist/cli/commands/setup/facts.js +23 -11
  97. package/dist/cli/commands/setup/index.d.ts +1 -1
  98. package/dist/cli/commands/setup/index.js +25 -12
  99. package/dist/cli/commands/user-config.d.ts +5 -5
  100. package/dist/cli/commands/user-config.js +14 -12
  101. package/dist/cli/history.d.ts +5 -4
  102. package/dist/cli/history.js +23 -11
  103. package/dist/cli/index.d.ts +4 -14
  104. package/dist/cli/index.js +27 -77
  105. package/dist/cli/manifest.d.ts +464 -10
  106. package/dist/cli/manifest.js +328 -54
  107. package/dist/cli/menu/apps.d.ts +7 -5
  108. package/dist/cli/menu/apps.js +64 -16
  109. package/dist/cli/menu/command-fields.d.ts +15 -0
  110. package/dist/cli/menu/command-fields.js +23 -0
  111. package/dist/cli/menu/command-form.d.ts +3 -5
  112. package/dist/cli/menu/command-form.js +116 -48
  113. package/dist/cli/menu/home.d.ts +22 -0
  114. package/dist/cli/menu/home.js +72 -0
  115. package/dist/cli/menu/index.d.ts +2 -24
  116. package/dist/cli/menu/index.js +4 -178
  117. package/dist/cli/menu/menu.d.ts +23 -0
  118. package/dist/cli/menu/menu.js +185 -0
  119. package/dist/cli/menu/settings/categories.d.ts +2 -2
  120. package/dist/cli/menu/settings/categories.js +123 -20
  121. package/dist/cli/menu/settings/collections/collection-editor.d.ts +23 -0
  122. package/dist/cli/menu/settings/collections/collection-editor.js +89 -0
  123. package/dist/cli/menu/settings/collections/map-editor.d.ts +10 -0
  124. package/dist/cli/menu/settings/collections/map-editor.js +34 -0
  125. package/dist/cli/menu/settings/collections/object-list-editor.d.ts +10 -0
  126. package/dist/cli/menu/settings/collections/object-list-editor.js +23 -0
  127. package/dist/cli/menu/settings/collections/object-map-editor.d.ts +10 -0
  128. package/dist/cli/menu/settings/collections/object-map-editor.js +35 -0
  129. package/dist/cli/menu/settings/collections/string-list-editor.d.ts +12 -0
  130. package/dist/cli/menu/settings/collections/string-list-editor.js +39 -0
  131. package/dist/cli/menu/settings/config-file.d.ts +2 -2
  132. package/dist/cli/menu/settings/config-file.js +42 -19
  133. package/dist/cli/menu/settings/editor-actions.d.ts +2 -0
  134. package/dist/cli/menu/settings/editor-actions.js +2 -0
  135. package/dist/cli/menu/settings/format.d.ts +5 -0
  136. package/dist/cli/menu/settings/format.js +39 -0
  137. package/dist/cli/menu/settings/index.d.ts +1 -29
  138. package/dist/cli/menu/settings/index.js +1 -133
  139. package/dist/cli/menu/settings/object-editor.d.ts +12 -0
  140. package/dist/cli/menu/settings/object-editor.js +86 -0
  141. package/dist/cli/menu/settings/schema-node.d.ts +3 -1
  142. package/dist/cli/menu/settings/schema-node.js +71 -24
  143. package/dist/cli/menu/settings/settings-editor.d.ts +30 -0
  144. package/dist/cli/menu/settings/settings-editor.js +176 -0
  145. package/dist/cli/menu/settings/{editors.d.ts → value-editor.d.ts} +2 -13
  146. package/dist/cli/menu/settings/value-editor.js +137 -0
  147. package/dist/cli/menu/several.d.ts +4 -4
  148. package/dist/cli/menu/several.js +61 -20
  149. package/dist/cli/{colors.d.ts → output/colors.d.ts} +8 -8
  150. package/dist/cli/{colors.js → output/colors.js} +32 -14
  151. package/dist/cli/output/index.d.ts +3 -0
  152. package/dist/cli/output/index.js +3 -0
  153. package/dist/cli/output/print.d.ts +5 -0
  154. package/dist/cli/output/print.js +14 -0
  155. package/dist/cli/output/progress.d.ts +24 -0
  156. package/dist/cli/output/progress.js +124 -0
  157. package/dist/cli/report.d.ts +2 -0
  158. package/dist/cli/report.js +20 -0
  159. package/dist/cli/tui/app.d.ts +6 -16
  160. package/dist/cli/tui/app.js +28 -8
  161. package/dist/cli/tui/dialogs/confirm-screen.d.ts +20 -0
  162. package/dist/cli/tui/dialogs/confirm-screen.js +50 -0
  163. package/dist/cli/tui/dialogs/message-screen.d.ts +17 -0
  164. package/dist/cli/tui/dialogs/message-screen.js +55 -0
  165. package/dist/cli/tui/dialogs/paragraphs.d.ts +2 -0
  166. package/dist/cli/tui/dialogs/paragraphs.js +5 -0
  167. package/dist/cli/tui/dialogs/text-screen.d.ts +26 -0
  168. package/dist/cli/tui/dialogs/text-screen.js +107 -0
  169. package/dist/cli/tui/frame.js +3 -1
  170. package/dist/cli/tui/index.d.ts +7 -3
  171. package/dist/cli/tui/index.js +4 -2
  172. package/dist/cli/tui/list/list-screen.d.ts +29 -0
  173. package/dist/cli/tui/{list-screen.js → list/list-screen.js} +86 -23
  174. package/dist/cli/tui/{list-screen.d.ts → list/list-types.d.ts} +0 -28
  175. package/dist/cli/tui/screen.d.ts +14 -0
  176. package/dist/cli/tui/terminal.js +34 -10
  177. package/dist/cli/tui/text.d.ts +2 -1
  178. package/dist/cli/tui/text.js +37 -7
  179. package/dist/cli/tui/theme.js +27 -9
  180. package/dist/cli/validate.d.ts +8 -8
  181. package/dist/cli/validate.js +32 -21
  182. package/dist/core/config/defaults.d.ts +2 -0
  183. package/dist/core/config/defaults.js +203 -0
  184. package/dist/core/config/index.d.ts +2 -0
  185. package/dist/core/config/index.js +3 -0
  186. package/dist/core/{config.d.ts → config/loader.d.ts} +1 -2
  187. package/dist/core/config/loader.js +47 -0
  188. package/dist/core/{detect-databases.js → detect/databases.js} +111 -23
  189. package/dist/core/detect/index.d.ts +4 -0
  190. package/dist/core/detect/index.js +4 -0
  191. package/dist/core/{detect-pwsh.d.ts → detect/pwsh.d.ts} +1 -1
  192. package/dist/core/{detect-pwsh.js → detect/pwsh.js} +25 -11
  193. package/dist/core/{detect-toolchains.d.ts → detect/toolchains.d.ts} +1 -1
  194. package/dist/core/{detect-toolchains.js → detect/toolchains.js} +42 -5
  195. package/dist/{guest/toolchains → core/detect}/versions.js +28 -12
  196. package/dist/core/disk.d.ts +2 -0
  197. package/dist/core/disk.js +46 -3
  198. package/dist/core/local-config/boot-wants.d.ts +45 -0
  199. package/dist/core/local-config/boot-wants.js +120 -0
  200. package/dist/core/local-config/file.d.ts +3 -0
  201. package/dist/core/local-config/file.js +16 -0
  202. package/dist/core/local-config/index.d.ts +5 -0
  203. package/dist/core/local-config/index.js +7 -0
  204. package/dist/core/{local-config.d.ts → local-config/overrides.d.ts} +11 -11
  205. package/dist/core/{local-config.js → local-config/overrides.js} +53 -54
  206. package/dist/core/{project-policy.d.ts → local-config/policy.d.ts} +7 -3
  207. package/dist/core/{project-policy.js → local-config/policy.js} +16 -6
  208. package/dist/core/local-config/trust.d.ts +13 -0
  209. package/dist/core/local-config/trust.js +43 -0
  210. package/dist/core/package-info.d.ts +4 -0
  211. package/dist/core/package-info.js +13 -0
  212. package/dist/core/run/guest-workspace.d.ts +23 -0
  213. package/dist/core/run/guest-workspace.js +47 -0
  214. package/dist/core/run/index.d.ts +3 -0
  215. package/dist/core/run/index.js +3 -0
  216. package/dist/core/run/resolve-run.d.ts +3 -0
  217. package/dist/core/run/resolve-run.js +202 -0
  218. package/dist/core/run/versions.d.ts +13 -0
  219. package/dist/core/run/versions.js +65 -0
  220. package/dist/core/safe-paths.js +17 -5
  221. package/dist/core/schema/apps.d.ts +4 -4
  222. package/dist/core/schema/apps.js +55 -21
  223. package/dist/core/schema/common.d.ts +13 -10
  224. package/dist/core/schema/common.js +16 -10
  225. package/dist/core/schema/config.d.ts +18 -12
  226. package/dist/core/schema/config.js +78 -53
  227. package/dist/core/schema/databases.d.ts +4 -3
  228. package/dist/core/schema/databases.js +16 -12
  229. package/dist/core/schema/harness.d.ts +1 -1
  230. package/dist/core/schema/harness.js +17 -7
  231. package/dist/core/schema/index.d.ts +6 -0
  232. package/dist/core/schema/index.js +8 -0
  233. package/dist/core/schema/json-schema.js +10 -5
  234. package/dist/core/schema/profile.d.ts +4 -4
  235. package/dist/core/schema/profile.js +37 -17
  236. package/dist/core/schema/projects.d.ts +2 -1
  237. package/dist/core/schema/projects.js +16 -5
  238. package/dist/core/schema/sandbox.d.ts +12 -12
  239. package/dist/core/schema/sandbox.js +101 -37
  240. package/dist/core/schema/toolchains.d.ts +6 -1
  241. package/dist/core/schema/toolchains.js +84 -34
  242. package/dist/core/types.d.ts +36 -9
  243. package/dist/core/util/errors.d.ts +8 -0
  244. package/dist/core/util/errors.js +14 -0
  245. package/dist/core/util/fs.d.ts +8 -0
  246. package/dist/core/util/fs.js +40 -0
  247. package/dist/core/util/index.d.ts +7 -0
  248. package/dist/core/util/index.js +7 -0
  249. package/dist/core/util/jsonc.d.ts +6 -0
  250. package/dist/core/util/jsonc.js +25 -0
  251. package/dist/core/util/links.d.ts +10 -0
  252. package/dist/core/util/links.js +39 -0
  253. package/dist/core/util/paths.d.ts +7 -0
  254. package/dist/core/util/paths.js +33 -0
  255. package/dist/core/util/process.d.ts +15 -0
  256. package/dist/core/util/process.js +54 -0
  257. package/dist/core/util/text.d.ts +8 -0
  258. package/dist/core/util/text.js +8 -0
  259. package/dist/guest/{setup/agents.js → agents/agent-installer.js} +24 -4
  260. package/dist/guest/apps/after-install.d.ts +3 -0
  261. package/dist/guest/apps/after-install.js +47 -0
  262. package/dist/guest/apps/app-installer.d.ts +22 -0
  263. package/dist/guest/apps/app-installer.js +116 -0
  264. package/dist/guest/apps/find-exe.d.ts +5 -0
  265. package/dist/guest/apps/find-exe.js +41 -0
  266. package/dist/guest/apps/index.d.ts +3 -10
  267. package/dist/guest/apps/index.js +6 -206
  268. package/dist/guest/apps/resolvers.js +37 -9
  269. package/dist/guest/apps/shortcuts.d.ts +6 -0
  270. package/dist/guest/apps/shortcuts.js +28 -0
  271. package/dist/guest/apps/sources.d.ts +4 -0
  272. package/dist/guest/apps/sources.js +17 -0
  273. package/dist/guest/apps/unpack.d.ts +3 -0
  274. package/dist/guest/apps/unpack.js +47 -0
  275. package/dist/guest/{audit-parse.js → audit/parse.js} +39 -3
  276. package/dist/guest/{audit.d.ts → audit/process-audit.d.ts} +3 -1
  277. package/dist/guest/{audit.js → audit/process-audit.js} +33 -8
  278. package/dist/guest/boot/boot-env.d.ts +4 -0
  279. package/dist/guest/{boot-env.js → boot/boot-env.js} +7 -5
  280. package/dist/guest/boot/boot.d.ts +1 -0
  281. package/dist/guest/{main.js → boot/boot.js} +100 -50
  282. package/dist/guest/{guide.js → boot/guide.js} +32 -7
  283. package/dist/guest/{project-env.d.ts → boot/project-env.d.ts} +3 -3
  284. package/dist/guest/{project-env.js → boot/project-env.js} +12 -4
  285. package/dist/guest/boot/project-status.d.ts +5 -0
  286. package/dist/guest/boot/project-status.js +28 -0
  287. package/dist/guest/daemon/daemon.d.ts +1 -0
  288. package/dist/guest/daemon/daemon.js +51 -0
  289. package/dist/guest/daemon/exec.js +18 -6
  290. package/dist/guest/daemon/{shutdown.js → idle-shutdown.js} +5 -4
  291. package/dist/guest/daemon/{project.d.ts → project-provisioner.d.ts} +3 -3
  292. package/dist/guest/daemon/{project.js → project-provisioner.js} +60 -22
  293. package/dist/guest/daemon/relays.js +5 -3
  294. package/dist/guest/daemon/{session.js → sessions.js} +84 -24
  295. package/dist/guest/daemon/state.d.ts +4 -1
  296. package/dist/guest/daemon/state.js +34 -20
  297. package/dist/guest/databases/database-server.d.ts +13 -0
  298. package/dist/guest/databases/database-server.js +35 -0
  299. package/dist/guest/databases/dynamodb.d.ts +12 -0
  300. package/dist/guest/databases/dynamodb.js +81 -0
  301. package/dist/guest/databases/index.d.ts +2 -0
  302. package/dist/guest/databases/index.js +2 -0
  303. package/dist/guest/databases/mongodb.d.ts +7 -0
  304. package/dist/guest/databases/mongodb.js +46 -0
  305. package/dist/guest/databases/mysql.d.ts +7 -0
  306. package/dist/guest/databases/mysql.js +59 -0
  307. package/dist/guest/databases/names.d.ts +5 -0
  308. package/dist/guest/databases/names.js +8 -0
  309. package/dist/guest/databases/postgres.d.ts +9 -0
  310. package/dist/guest/databases/postgres.js +85 -0
  311. package/dist/guest/databases/redis.d.ts +7 -0
  312. package/dist/guest/databases/redis.js +25 -0
  313. package/dist/guest/databases/registry.d.ts +5 -0
  314. package/dist/guest/databases/registry.js +51 -0
  315. package/dist/guest/databases/sbx-db.d.ts +1 -0
  316. package/dist/guest/{db.js → databases/sbx-db.js} +13 -13
  317. package/dist/guest/{toolchains/databases → databases}/server.d.ts +5 -5
  318. package/dist/guest/{toolchains/databases → databases}/server.js +18 -13
  319. package/dist/guest/entries/daemon.js +16 -0
  320. package/dist/guest/entries/db.js +10 -0
  321. package/dist/guest/entries/gitguard.js +20 -0
  322. package/dist/guest/entries/main.d.ts +1 -0
  323. package/dist/guest/entries/main.js +24 -0
  324. package/dist/guest/entries/netproxy.d.ts +1 -0
  325. package/dist/guest/entries/netproxy.js +7 -0
  326. package/dist/guest/entries/view.d.ts +1 -0
  327. package/dist/guest/entries/view.js +11 -0
  328. package/dist/guest/{gitguard.js → git/decision.js} +49 -26
  329. package/dist/guest/network/addresses.d.ts +2 -0
  330. package/dist/guest/network/addresses.js +6 -0
  331. package/dist/guest/{setup/network.d.ts → network/allow-only.d.ts} +0 -10
  332. package/dist/guest/network/allow-only.js +84 -0
  333. package/dist/guest/network/firewall.d.ts +9 -0
  334. package/dist/guest/{setup/network.js → network/firewall.js} +58 -63
  335. package/dist/guest/network/proxy-server.d.ts +2 -0
  336. package/dist/guest/{netproxy.js → network/proxy-server.js} +37 -18
  337. package/dist/guest/{helpers.d.ts → runtime/csc.d.ts} +1 -1
  338. package/dist/guest/{helpers.js → runtime/csc.js} +7 -2
  339. package/dist/guest/runtime/fs.d.ts +2 -0
  340. package/dist/guest/runtime/fs.js +6 -0
  341. package/dist/guest/runtime/log.d.ts +3 -0
  342. package/dist/guest/runtime/log.js +22 -0
  343. package/dist/guest/runtime/paths.d.ts +13 -0
  344. package/dist/guest/runtime/paths.js +14 -0
  345. package/dist/guest/{ports.js → runtime/ports.js} +8 -2
  346. package/dist/guest/runtime/process.d.ts +15 -0
  347. package/dist/guest/runtime/process.js +59 -0
  348. package/dist/guest/{project-context.js → runtime/project-context.js} +1 -1
  349. package/dist/guest/runtime/session.d.ts +5 -0
  350. package/dist/guest/runtime/session.js +10 -0
  351. package/dist/guest/runtime/status.d.ts +7 -0
  352. package/dist/guest/runtime/status.js +57 -0
  353. package/dist/guest/{cmdline.js → sessions/cmdline.js} +10 -4
  354. package/dist/guest/{ptyhost.js → sessions/pty-host.js} +12 -5
  355. package/dist/guest/{view.js → sessions/viewer.js} +8 -11
  356. package/dist/guest/setup/claude-mem.d.ts +10 -0
  357. package/dist/guest/setup/{claude.js → claude-mem.js} +18 -78
  358. package/dist/guest/setup/{claude.d.ts → claude-profile.d.ts} +0 -10
  359. package/dist/guest/setup/claude-profile.js +89 -0
  360. package/dist/guest/setup/desktop.d.ts +2 -0
  361. package/dist/guest/setup/desktop.js +32 -0
  362. package/dist/guest/setup/environment.js +28 -5
  363. package/dist/guest/setup/{user.d.ts → git-identity.d.ts} +0 -2
  364. package/dist/guest/setup/git-identity.js +34 -0
  365. package/dist/guest/{gitrules.d.ts → setup/git-rules.d.ts} +1 -1
  366. package/dist/guest/setup/git-rules.js +50 -0
  367. package/dist/guest/setup/hooks.js +22 -5
  368. package/dist/guest/setup/{policy.js → managed-policy.js} +2 -2
  369. package/dist/guest/toolchains/catalogue.d.ts +4 -4
  370. package/dist/guest/toolchains/catalogue.js +30 -7
  371. package/dist/guest/toolchains/detect.d.ts +12 -0
  372. package/dist/guest/toolchains/detect.js +54 -0
  373. package/dist/guest/toolchains/index.d.ts +3 -17
  374. package/dist/guest/toolchains/index.js +1 -80
  375. package/dist/guest/toolchains/install.d.ts +20 -0
  376. package/dist/guest/toolchains/install.js +29 -0
  377. package/dist/guest/toolchains/languages/go.d.ts +3 -0
  378. package/dist/guest/toolchains/{go.js → languages/go.js} +27 -9
  379. package/dist/guest/toolchains/languages/java.d.ts +8 -0
  380. package/dist/guest/toolchains/{java.js → languages/java.js} +57 -18
  381. package/dist/guest/toolchains/languages/node.d.ts +3 -0
  382. package/dist/guest/toolchains/{node.js → languages/node.js} +51 -18
  383. package/dist/guest/toolchains/languages/php.d.ts +3 -0
  384. package/dist/guest/toolchains/{scripting → languages}/php.js +36 -11
  385. package/dist/guest/toolchains/languages/python-tools.d.ts +3 -0
  386. package/dist/guest/toolchains/languages/python-tools.js +12 -0
  387. package/dist/guest/toolchains/languages/python.d.ts +3 -0
  388. package/dist/guest/toolchains/{python.js → languages/python.js} +29 -16
  389. package/dist/guest/toolchains/languages/ruby.d.ts +3 -0
  390. package/dist/guest/toolchains/{scripting → languages}/ruby.js +28 -10
  391. package/dist/guest/toolchains/leftovers.d.ts +1 -1
  392. package/dist/guest/toolchains/leftovers.js +13 -11
  393. package/dist/guest/toolchains/managers.d.ts +6 -6
  394. package/dist/guest/toolchains/managers.js +38 -17
  395. package/dist/guest/toolchains/native/binstall.d.ts +3 -2
  396. package/dist/guest/toolchains/native/binstall.js +20 -8
  397. package/dist/guest/toolchains/native/cpp.d.ts +2 -2
  398. package/dist/guest/toolchains/native/cpp.js +23 -8
  399. package/dist/guest/toolchains/native/dotnet.d.ts +5 -3
  400. package/dist/guest/toolchains/native/dotnet.js +72 -24
  401. package/dist/guest/toolchains/native/mesa.d.ts +2 -2
  402. package/dist/guest/toolchains/native/mesa.js +27 -10
  403. package/dist/guest/toolchains/native/msvc/environment.d.ts +4 -4
  404. package/dist/guest/toolchains/native/msvc/environment.js +30 -16
  405. package/dist/guest/toolchains/native/msvc/index.d.ts +3 -3
  406. package/dist/guest/toolchains/native/msvc/index.js +10 -8
  407. package/dist/guest/toolchains/native/msvc/packages.d.ts +1 -1
  408. package/dist/guest/toolchains/native/msvc/packages.js +69 -23
  409. package/dist/guest/toolchains/native/msvc/tree.d.ts +6 -6
  410. package/dist/guest/toolchains/native/msvc/tree.js +15 -9
  411. package/dist/guest/toolchains/native/rust-extras.d.ts +23 -0
  412. package/dist/guest/toolchains/native/rust-extras.js +100 -0
  413. package/dist/guest/toolchains/native/rust.d.ts +2 -2
  414. package/dist/guest/toolchains/native/rust.js +41 -10
  415. package/dist/guest/toolchains/{scripting → native}/vcruntime.d.ts +2 -2
  416. package/dist/guest/toolchains/{scripting → native}/vcruntime.js +17 -7
  417. package/dist/guest/toolchains/package-ledger.d.ts +17 -0
  418. package/dist/guest/toolchains/package-ledger.js +54 -0
  419. package/dist/guest/toolchains/plan.d.ts +3 -24
  420. package/dist/guest/toolchains/plan.js +99 -111
  421. package/dist/guest/toolchains/runtimes.d.ts +6 -6
  422. package/dist/guest/toolchains/runtimes.js +31 -13
  423. package/dist/guest/toolchains/scheduler.d.ts +22 -0
  424. package/dist/guest/toolchains/scheduler.js +123 -0
  425. package/dist/guest/toolchains/setup.d.ts +10 -0
  426. package/dist/guest/toolchains/setup.js +22 -0
  427. package/dist/guest/toolchains/state-file.d.ts +3 -0
  428. package/dist/guest/toolchains/state-file.js +10 -0
  429. package/dist/guest/toolchains/step.d.ts +24 -0
  430. package/dist/guest/toolchains/step.js +1 -0
  431. package/dist/guest/toolchains/tool-env.d.ts +12 -0
  432. package/dist/guest/toolchains/tool-env.js +16 -0
  433. package/dist/guest/toolchains/tools/cli.d.ts +10 -0
  434. package/dist/guest/toolchains/{cli.js → tools/cli.js} +35 -15
  435. package/dist/guest/toolchains/tools/git.d.ts +3 -0
  436. package/dist/guest/toolchains/{git.js → tools/git.js} +38 -15
  437. package/dist/guest/toolchains/tools/pwsh.d.ts +4 -0
  438. package/dist/guest/toolchains/{pwsh.js → tools/pwsh.js} +14 -7
  439. package/dist/guest/toolchains/{vscode-profile.d.ts → tools/vscode-profile.d.ts} +6 -6
  440. package/dist/guest/toolchains/{vscode-profile.js → tools/vscode-profile.js} +28 -12
  441. package/dist/guest/toolchains/{vscode.d.ts → tools/vscode.d.ts} +6 -6
  442. package/dist/guest/toolchains/{vscode.js → tools/vscode.js} +67 -21
  443. package/dist/guest/toolchains/version-cache.d.ts +16 -0
  444. package/dist/guest/toolchains/version-cache.js +67 -0
  445. package/dist/host/agent-commands/commands.d.ts +13 -0
  446. package/dist/host/agent-commands/commands.js +33 -0
  447. package/dist/host/agent-commands/forwarders.d.ts +7 -0
  448. package/dist/host/agent-commands/forwarders.js +31 -0
  449. package/dist/host/agent-commands/index.d.ts +4 -0
  450. package/dist/host/agent-commands/index.js +4 -0
  451. package/dist/host/agent-commands/reconcile.d.ts +12 -0
  452. package/dist/host/agent-commands/reconcile.js +69 -0
  453. package/dist/host/agent-commands/user-path.d.ts +2 -0
  454. package/dist/host/agent-commands/user-path.js +33 -0
  455. package/dist/host/audit/collect.d.ts +2 -2
  456. package/dist/host/audit/collect.js +59 -22
  457. package/dist/host/audit/log.d.ts +2 -2
  458. package/dist/host/audit/log.js +24 -8
  459. package/dist/host/{attach.d.ts → channel/attach.d.ts} +2 -2
  460. package/dist/host/{attach.js → channel/attach.js} +33 -15
  461. package/dist/host/channel/channel.d.ts +51 -0
  462. package/dist/host/channel/channel.js +196 -0
  463. package/dist/host/channel/index.d.ts +2 -0
  464. package/dist/host/channel/index.js +2 -0
  465. package/dist/host/guard/agent-files.d.ts +7 -0
  466. package/dist/host/guard/agent-files.js +103 -0
  467. package/dist/host/guard/commands.d.ts +10 -0
  468. package/dist/host/guard/commands.js +123 -0
  469. package/dist/host/guard/file-hash.d.ts +4 -0
  470. package/dist/host/guard/file-hash.js +37 -0
  471. package/dist/host/guard/git-config.d.ts +5 -0
  472. package/dist/host/guard/git-config.js +62 -0
  473. package/dist/host/guard/git-dirs.d.ts +12 -0
  474. package/dist/host/guard/git-dirs.js +53 -0
  475. package/dist/host/guard/index.d.ts +5 -0
  476. package/dist/host/guard/index.js +4 -0
  477. package/dist/host/guard/mark-of-the-web.d.ts +8 -0
  478. package/dist/host/guard/mark-of-the-web.js +74 -0
  479. package/dist/host/guard/nested-repos.d.ts +14 -0
  480. package/dist/host/guard/nested-repos.js +88 -0
  481. package/dist/host/guard/quarantine.d.ts +3 -0
  482. package/dist/host/guard/quarantine.js +24 -0
  483. package/dist/host/guard/repo-guard.d.ts +10 -0
  484. package/dist/host/guard/repo-guard.js +36 -0
  485. package/dist/host/guard/store.d.ts +40 -0
  486. package/dist/host/guard/store.js +145 -0
  487. package/dist/host/guard/types.d.ts +27 -0
  488. package/dist/host/guard/types.js +3 -0
  489. package/dist/host/guard/watch-state.d.ts +9 -0
  490. package/dist/host/guard/watch-state.js +26 -0
  491. package/dist/host/launch/boot-projects.d.ts +17 -0
  492. package/dist/host/launch/{projects.js → boot-projects.js} +27 -12
  493. package/dist/host/{database-plan.d.ts → launch/database-plan.d.ts} +5 -5
  494. package/dist/host/{database-plan.js → launch/database-plan.js} +24 -13
  495. package/dist/host/launch/generate.d.ts +4 -0
  496. package/dist/host/launch/generate.js +77 -0
  497. package/dist/host/launch/index.d.ts +10 -0
  498. package/dist/host/launch/index.js +10 -0
  499. package/dist/host/launch/mappings.d.ts +7 -2
  500. package/dist/host/launch/mappings.js +83 -24
  501. package/dist/host/launch/pc-scan.d.ts +5 -0
  502. package/dist/host/{pc-scan.js → launch/pc-scan.js} +20 -13
  503. package/dist/host/launch/project-scan.d.ts +7 -0
  504. package/dist/host/{project-scan.js → launch/project-scan.js} +29 -21
  505. package/dist/host/launch/session-file.d.ts +23 -0
  506. package/dist/host/launch/session-file.js +73 -0
  507. package/dist/host/launch/stage.d.ts +5 -5
  508. package/dist/host/launch/stage.js +14 -13
  509. package/dist/host/launch/toolchains.d.ts +4 -0
  510. package/dist/host/launch/toolchains.js +11 -0
  511. package/dist/host/launch/{wsb.d.ts → wsb-file.d.ts} +4 -2
  512. package/dist/host/launch/wsb-file.js +56 -0
  513. package/dist/host/life/crash-report.d.ts +8 -0
  514. package/dist/host/life/crash-report.js +87 -0
  515. package/dist/host/life/index.d.ts +6 -0
  516. package/dist/host/life/index.js +6 -0
  517. package/dist/host/life/keep-awake.d.ts +10 -0
  518. package/dist/host/life/keep-awake.js +29 -0
  519. package/dist/host/life/life-record.d.ts +48 -0
  520. package/dist/host/life/life-record.js +76 -0
  521. package/dist/host/life/stop-events.d.ts +27 -0
  522. package/dist/host/life/stop-events.js +96 -0
  523. package/dist/host/life/stop-warning.d.ts +4 -0
  524. package/dist/host/life/stop-warning.js +25 -0
  525. package/dist/host/life/windows-update.d.ts +3 -0
  526. package/dist/host/life/windows-update.js +11 -0
  527. package/dist/host/native.d.ts +4 -0
  528. package/dist/host/native.js +11 -0
  529. package/dist/host/network/index.d.ts +1 -0
  530. package/dist/host/network/index.js +1 -0
  531. package/dist/host/{port-forward.d.ts → network/port-forward.d.ts} +1 -1
  532. package/dist/host/{port-forward.js → network/port-forward.js} +16 -10
  533. package/dist/host/profile/accounts.d.ts +37 -0
  534. package/dist/host/profile/accounts.js +146 -0
  535. package/dist/host/profile/claude-login.d.ts +22 -0
  536. package/dist/host/profile/claude-login.js +57 -0
  537. package/dist/host/{claude-profile.d.ts → profile/claude-profile.d.ts} +9 -9
  538. package/dist/host/{claude-profile.js → profile/claude-profile.js} +32 -22
  539. package/dist/host/profile/index.d.ts +7 -0
  540. package/dist/host/profile/index.js +7 -0
  541. package/dist/host/profile/personalize.d.ts +2 -0
  542. package/dist/host/profile/personalize.js +127 -0
  543. package/dist/host/profile/reg-file.d.ts +8 -0
  544. package/dist/host/profile/reg-file.js +45 -0
  545. package/dist/host/profile/secret-files.d.ts +2 -0
  546. package/dist/host/profile/secret-files.js +25 -0
  547. package/dist/host/profile/secret-patterns.d.ts +6 -0
  548. package/dist/host/profile/secret-patterns.js +128 -0
  549. package/dist/host/profile/secrets.d.ts +12 -0
  550. package/dist/host/profile/secrets.js +100 -0
  551. package/dist/host/projects/index.d.ts +4 -0
  552. package/dist/host/projects/index.js +4 -0
  553. package/dist/host/projects/join.d.ts +38 -0
  554. package/dist/host/projects/join.js +119 -0
  555. package/dist/host/projects/known.d.ts +28 -0
  556. package/dist/host/projects/known.js +55 -0
  557. package/dist/host/projects/mapper.d.ts +29 -0
  558. package/dist/host/projects/mapper.js +88 -0
  559. package/dist/host/projects/registry.d.ts +83 -0
  560. package/dist/host/projects/registry.js +136 -0
  561. package/dist/host/sandbox/doctor.d.ts +2 -0
  562. package/dist/host/sandbox/doctor.js +42 -0
  563. package/dist/host/sandbox/host-claude.d.ts +1 -0
  564. package/dist/host/sandbox/host-claude.js +26 -0
  565. package/dist/host/sandbox/index.d.ts +6 -0
  566. package/dist/host/sandbox/index.js +6 -0
  567. package/dist/host/{platform.d.ts → sandbox/platform.d.ts} +0 -5
  568. package/dist/host/sandbox/platform.js +60 -0
  569. package/dist/host/sandbox/probe.d.ts +3 -0
  570. package/dist/host/sandbox/probe.js +47 -0
  571. package/dist/host/{window.js → sandbox/window.js} +7 -5
  572. package/dist/host/{wsb.js → sandbox/wsb-cli.js} +31 -8
  573. package/dist/host/{cleanup.js → storage/cleanup.js} +27 -12
  574. package/dist/host/storage/index.d.ts +2 -0
  575. package/dist/host/storage/index.js +2 -0
  576. package/dist/host/storage/state-files.d.ts +4 -0
  577. package/dist/host/storage/state-files.js +10 -0
  578. package/dist/host/test-guard.js +1 -1
  579. package/dist/host/tools/conpty.d.ts +8 -0
  580. package/dist/host/tools/conpty.js +58 -0
  581. package/dist/host/tools/index.d.ts +2 -0
  582. package/dist/host/tools/index.js +2 -0
  583. package/dist/host/{terminal.d.ts → tools/windows-terminal.d.ts} +2 -10
  584. package/dist/host/{terminal.js → tools/windows-terminal.js} +33 -57
  585. package/dist/host/workspace-view/active-views.d.ts +3 -0
  586. package/dist/host/workspace-view/active-views.js +22 -0
  587. package/dist/host/workspace-view/index.d.ts +2 -18
  588. package/dist/host/workspace-view/index.js +2 -49
  589. package/dist/host/workspace-view/plan.d.ts +16 -0
  590. package/dist/host/workspace-view/plan.js +50 -0
  591. package/dist/host/workspace-view/rules.js +10 -3
  592. package/dist/host/workspace-view/view-state.d.ts +10 -0
  593. package/dist/host/workspace-view/view-state.js +31 -0
  594. package/dist/host/workspace-view/view.d.ts +1 -0
  595. package/dist/host/workspace-view/view.js +51 -55
  596. package/dist/runtime/daemon.js +4232 -1918
  597. package/dist/runtime/db.js +2145 -830
  598. package/dist/runtime/gitguard.js +29 -11
  599. package/dist/runtime/main.js +4760 -2155
  600. package/dist/runtime/netproxy.js +1654 -418
  601. package/dist/runtime/view.js +1515 -453
  602. package/dist/selftest/accounts.test.d.ts +1 -1
  603. package/dist/selftest/accounts.test.js +20 -17
  604. package/dist/selftest/agent-commands.test.d.ts +1 -1
  605. package/dist/selftest/agent-commands.test.js +9 -5
  606. package/dist/selftest/audit.test.d.ts +1 -1
  607. package/dist/selftest/audit.test.js +46 -13
  608. package/dist/selftest/channel.test.d.ts +1 -1
  609. package/dist/selftest/channel.test.js +91 -8
  610. package/dist/selftest/cli.test.d.ts +1 -1
  611. package/dist/selftest/cli.test.js +68 -16
  612. package/dist/selftest/cmdline.test.d.ts +1 -1
  613. package/dist/selftest/cmdline.test.js +36 -7
  614. package/dist/selftest/config.test.d.ts +1 -1
  615. package/dist/selftest/config.test.js +12 -5
  616. package/dist/selftest/data.test.d.ts +1 -1
  617. package/dist/selftest/data.test.js +35 -6
  618. package/dist/selftest/detect.test.d.ts +1 -1
  619. package/dist/selftest/detect.test.js +22 -9
  620. package/dist/selftest/generate.test.d.ts +1 -1
  621. package/dist/selftest/generate.test.js +33 -9
  622. package/dist/selftest/git-access.test.d.ts +1 -1
  623. package/dist/selftest/git-access.test.js +42 -4
  624. package/dist/selftest/guest-boot.test.d.ts +1 -1
  625. package/dist/selftest/guest-boot.test.js +25 -7
  626. package/dist/selftest/host-sim.test.d.ts +1 -1
  627. package/dist/selftest/host-sim.test.js +27 -3
  628. package/dist/selftest/hostile-input.test.d.ts +1 -1
  629. package/dist/selftest/hostile-input.test.js +5 -5
  630. package/dist/selftest/index.d.ts +1 -1
  631. package/dist/selftest/index.js +73 -16
  632. package/dist/selftest/layout.test.d.ts +2 -0
  633. package/dist/selftest/layout.test.js +131 -0
  634. package/dist/selftest/links.test.d.ts +1 -1
  635. package/dist/selftest/links.test.js +16 -11
  636. package/dist/selftest/live-daemon.test.d.ts +1 -1
  637. package/dist/selftest/live-daemon.test.js +20 -8
  638. package/dist/selftest/live-git.test.d.ts +1 -1
  639. package/dist/selftest/live-git.test.js +13 -4
  640. package/dist/selftest/live-network.test.d.ts +1 -1
  641. package/dist/selftest/live-network.test.js +24 -9
  642. package/dist/selftest/live-projects.test.d.ts +1 -1
  643. package/dist/selftest/live-projects.test.js +47 -20
  644. package/dist/selftest/live-terminal.test.d.ts +2 -0
  645. package/dist/selftest/live-terminal.test.js +195 -0
  646. package/dist/selftest/local-config.test.d.ts +1 -1
  647. package/dist/selftest/local-config.test.js +88 -15
  648. package/dist/selftest/mirror.test.d.ts +1 -1
  649. package/dist/selftest/mirror.test.js +118 -19
  650. package/dist/selftest/network.test.d.ts +1 -1
  651. package/dist/selftest/network.test.js +17 -8
  652. package/dist/selftest/personalization.test.d.ts +1 -1
  653. package/dist/selftest/personalization.test.js +12 -5
  654. package/dist/selftest/projects.test.d.ts +1 -1
  655. package/dist/selftest/projects.test.js +336 -72
  656. package/dist/selftest/repair.test.d.ts +1 -1
  657. package/dist/selftest/repair.test.js +17 -5
  658. package/dist/selftest/repo-guard.test.d.ts +1 -1
  659. package/dist/selftest/repo-guard.test.js +21 -20
  660. package/dist/selftest/secrets.test.d.ts +1 -1
  661. package/dist/selftest/secrets.test.js +57 -13
  662. package/dist/selftest/setup.test.d.ts +1 -1
  663. package/dist/selftest/setup.test.js +25 -5
  664. package/dist/selftest/{fixtures.d.ts → support/fixtures.d.ts} +7 -4
  665. package/dist/selftest/{fixtures.js → support/fixtures.js} +95 -17
  666. package/dist/selftest/{harness.js → support/harness.js} +24 -7
  667. package/dist/selftest/{live.d.ts → support/live.d.ts} +2 -2
  668. package/dist/selftest/{live.js → support/live.js} +34 -10
  669. package/dist/selftest/support/suite.js +1 -0
  670. package/dist/selftest/sync.test.d.ts +1 -1
  671. package/dist/selftest/sync.test.js +64 -26
  672. package/dist/selftest/test-guard.test.d.ts +1 -1
  673. package/dist/selftest/test-guard.test.js +43 -15
  674. package/dist/selftest/toolchains.test.d.ts +1 -1
  675. package/dist/selftest/toolchains.test.js +135 -36
  676. package/dist/selftest/workspace-view.test.d.ts +1 -1
  677. package/dist/selftest/workspace-view.test.js +48 -11
  678. package/dist/selftest/workspace.test.d.ts +1 -1
  679. package/dist/selftest/workspace.test.js +13 -4
  680. package/dist/shared/{apps.d.ts → apps/catalogue.d.ts} +1 -11
  681. package/dist/shared/apps/catalogue.js +768 -0
  682. package/dist/shared/apps/index.d.ts +2 -0
  683. package/dist/shared/apps/index.js +2 -0
  684. package/dist/shared/apps/selection.d.ts +11 -0
  685. package/dist/shared/apps/selection.js +40 -0
  686. package/dist/shared/channel/index.d.ts +2 -0
  687. package/dist/shared/channel/index.js +2 -0
  688. package/dist/shared/channel/run-dir.d.ts +30 -0
  689. package/dist/shared/channel/run-dir.js +84 -0
  690. package/dist/shared/{schema.d.ts → channel/schema.d.ts} +60 -19
  691. package/dist/shared/channel/schema.js +131 -0
  692. package/dist/shared/download/archive.d.ts +13 -0
  693. package/dist/shared/download/archive.js +57 -0
  694. package/dist/shared/download/downloader.d.ts +35 -0
  695. package/dist/shared/download/downloader.js +110 -0
  696. package/dist/shared/download/github.d.ts +16 -0
  697. package/dist/shared/download/github.js +74 -0
  698. package/dist/shared/download/http.d.ts +5 -0
  699. package/dist/shared/download/http.js +30 -0
  700. package/dist/shared/download/index.d.ts +5 -0
  701. package/dist/shared/download/index.js +5 -0
  702. package/dist/shared/download/spawn.d.ts +2 -0
  703. package/dist/shared/download/spawn.js +7 -0
  704. package/dist/shared/io/index.d.ts +3 -0
  705. package/dist/shared/io/index.js +3 -0
  706. package/dist/shared/io/json-file.d.ts +10 -0
  707. package/dist/shared/io/json-file.js +21 -0
  708. package/dist/shared/io/json.d.ts +13 -0
  709. package/dist/shared/io/json.js +49 -0
  710. package/dist/shared/{safe-remove.js → io/safe-remove.js} +32 -7
  711. package/dist/shared/{netrules.js → network/firewall-rules.js} +36 -5
  712. package/dist/shared/network/index.d.ts +2 -0
  713. package/dist/shared/network/index.js +2 -0
  714. package/dist/shared/{netpolicy.js → network/policy.js} +66 -11
  715. package/dist/shared/{paths.js → paths/claude-paths.js} +12 -2
  716. package/dist/shared/{guest-paths.d.ts → paths/guest-paths.d.ts} +21 -0
  717. package/dist/shared/paths/guest-paths.js +146 -0
  718. package/dist/shared/paths/index.d.ts +3 -0
  719. package/dist/shared/paths/index.js +3 -0
  720. package/dist/shared/{projects.d.ts → paths/projects.d.ts} +27 -4
  721. package/dist/shared/paths/projects.js +136 -0
  722. package/dist/shared/pty/client.d.ts +21 -0
  723. package/dist/shared/pty/client.js +79 -0
  724. package/dist/shared/pty/console-input.d.ts +11 -0
  725. package/dist/shared/pty/console-input.js +81 -0
  726. package/dist/shared/pty/index.d.ts +6 -0
  727. package/dist/shared/pty/index.js +6 -0
  728. package/dist/shared/pty/input-joiner.d.ts +15 -0
  729. package/dist/shared/pty/input-joiner.js +44 -0
  730. package/dist/shared/pty/output-filter.d.ts +13 -0
  731. package/dist/shared/pty/output-filter.js +140 -0
  732. package/dist/shared/pty/protocol.d.ts +36 -0
  733. package/dist/shared/pty/protocol.js +60 -0
  734. package/dist/shared/pty/terminal.d.ts +24 -0
  735. package/dist/shared/pty/terminal.js +147 -0
  736. package/dist/shared/test-guard.js +3 -1
  737. package/dist/sync/claude-mem.d.ts +1 -1
  738. package/dist/sync/claude-mem.js +9 -4
  739. package/dist/sync/history.d.ts +1 -29
  740. package/dist/sync/history.js +57 -45
  741. package/dist/sync/index.d.ts +5 -0
  742. package/dist/sync/index.js +5 -0
  743. package/dist/sync/sync-cycle.d.ts +18 -0
  744. package/dist/sync/sync-cycle.js +85 -0
  745. package/dist/sync/sync-state.d.ts +32 -0
  746. package/dist/sync/sync-state.js +37 -0
  747. package/dist/sync/watcher.d.ts +0 -18
  748. package/dist/sync/watcher.js +66 -100
  749. package/native/keep-awake.ps1 +8 -0
  750. package/native/power.cs +23 -0
  751. package/native/stop-events.ps1 +38 -0
  752. package/package.json +11 -3
  753. package/sandbox/linkgate.cs +98 -0
  754. package/sandbox/memlog.ps1 +15 -6
  755. package/sandbox/ptyhost.cs +60 -3
  756. package/schemas/config.schema.json +48 -1
  757. package/schemas/sandbox-config.schema.json +37 -3
  758. package/dist/cli/commands/launch.d.ts +0 -29
  759. package/dist/cli/commands/launch.js +0 -366
  760. package/dist/cli/commands/maintenance.d.ts +0 -10
  761. package/dist/cli/commands/maintenance.js +0 -187
  762. package/dist/cli/commands/project.d.ts +0 -29
  763. package/dist/cli/commands/project.js +0 -63
  764. package/dist/cli/commands/projects.d.ts +0 -14
  765. package/dist/cli/commands/projects.js +0 -146
  766. package/dist/cli/commands/restart.d.ts +0 -6
  767. package/dist/cli/commands/restart.js +0 -85
  768. package/dist/cli/commands/sessions.d.ts +0 -12
  769. package/dist/cli/commands/sessions.js +0 -257
  770. package/dist/cli/menu/settings/editors.js +0 -305
  771. package/dist/cli/progress.d.ts +0 -9
  772. package/dist/cli/progress.js +0 -49
  773. package/dist/cli/tui/dialogs.d.ts +0 -57
  774. package/dist/cli/tui/dialogs.js +0 -162
  775. package/dist/core/config.js +0 -109
  776. package/dist/core/schema.d.ts +0 -6
  777. package/dist/core/schema.js +0 -8
  778. package/dist/core/util.d.ts +0 -62
  779. package/dist/core/util.js +0 -156
  780. package/dist/core/workspace.d.ts +0 -18
  781. package/dist/core/workspace.js +0 -145
  782. package/dist/guest/boot-env.d.ts +0 -4
  783. package/dist/guest/daemon.js +0 -57
  784. package/dist/guest/env.d.ts +0 -52
  785. package/dist/guest/env.js +0 -103
  786. package/dist/guest/gitrules.js +0 -11
  787. package/dist/guest/project-status.d.ts +0 -5
  788. package/dist/guest/project-status.js +0 -17
  789. package/dist/guest/setup/user.js +0 -51
  790. package/dist/guest/toolchains/cli.d.ts +0 -10
  791. package/dist/guest/toolchains/common.d.ts +0 -54
  792. package/dist/guest/toolchains/common.js +0 -147
  793. package/dist/guest/toolchains/databases/dynamodb.d.ts +0 -8
  794. package/dist/guest/toolchains/databases/dynamodb.js +0 -52
  795. package/dist/guest/toolchains/databases/index.d.ts +0 -6
  796. package/dist/guest/toolchains/databases/index.js +0 -62
  797. package/dist/guest/toolchains/databases/mongodb.d.ts +0 -3
  798. package/dist/guest/toolchains/databases/mongodb.js +0 -31
  799. package/dist/guest/toolchains/databases/mysql.d.ts +0 -3
  800. package/dist/guest/toolchains/databases/mysql.js +0 -38
  801. package/dist/guest/toolchains/databases/postgres.d.ts +0 -5
  802. package/dist/guest/toolchains/databases/postgres.js +0 -38
  803. package/dist/guest/toolchains/databases/redis.d.ts +0 -3
  804. package/dist/guest/toolchains/databases/redis.js +0 -16
  805. package/dist/guest/toolchains/git.d.ts +0 -3
  806. package/dist/guest/toolchains/go.d.ts +0 -3
  807. package/dist/guest/toolchains/java.d.ts +0 -8
  808. package/dist/guest/toolchains/node.d.ts +0 -3
  809. package/dist/guest/toolchains/pwsh.d.ts +0 -4
  810. package/dist/guest/toolchains/python.d.ts +0 -3
  811. package/dist/guest/toolchains/scripting/php.d.ts +0 -3
  812. package/dist/guest/toolchains/scripting/ruby.d.ts +0 -3
  813. package/dist/host/accounts.d.ts +0 -32
  814. package/dist/host/accounts.js +0 -128
  815. package/dist/host/agent-commands.d.ts +0 -25
  816. package/dist/host/agent-commands.js +0 -145
  817. package/dist/host/channel.d.ts +0 -38
  818. package/dist/host/channel.js +0 -162
  819. package/dist/host/generate.d.ts +0 -13
  820. package/dist/host/generate.js +0 -108
  821. package/dist/host/join.d.ts +0 -28
  822. package/dist/host/join.js +0 -76
  823. package/dist/host/launch/projects.d.ts +0 -15
  824. package/dist/host/launch/wsb.js +0 -34
  825. package/dist/host/motw.d.ts +0 -17
  826. package/dist/host/motw.js +0 -74
  827. package/dist/host/pc-scan.d.ts +0 -6
  828. package/dist/host/personalize.d.ts +0 -10
  829. package/dist/host/personalize.js +0 -97
  830. package/dist/host/platform.js +0 -129
  831. package/dist/host/project-scan.d.ts +0 -7
  832. package/dist/host/projects.d.ts +0 -100
  833. package/dist/host/projects.js +0 -147
  834. package/dist/host/repo-guard.d.ts +0 -43
  835. package/dist/host/repo-guard.js +0 -347
  836. package/dist/host/secrets.d.ts +0 -14
  837. package/dist/host/secrets.js +0 -133
  838. package/dist/host/stops.d.ts +0 -67
  839. package/dist/host/stops.js +0 -126
  840. package/dist/shared/apps.js +0 -114
  841. package/dist/shared/download.d.ts +0 -60
  842. package/dist/shared/download.js +0 -215
  843. package/dist/shared/guest-paths.js +0 -61
  844. package/dist/shared/projects.js +0 -67
  845. package/dist/shared/pty-client.d.ts +0 -91
  846. package/dist/shared/pty-client.js +0 -349
  847. package/dist/shared/rundir.d.ts +0 -41
  848. package/dist/shared/rundir.js +0 -96
  849. package/dist/shared/schema.js +0 -92
  850. /package/dist/{guest/daemon.d.ts → cli/tui/list/list-types.js} +0 -0
  851. /package/dist/{guest/db.d.ts → cli/tui/screen.js} +0 -0
  852. /package/dist/core/{detect-databases.d.ts → detect/databases.d.ts} +0 -0
  853. /package/dist/{guest/toolchains → core/detect}/versions.d.ts +0 -0
  854. /package/dist/guest/{setup/agents.d.ts → agents/agent-installer.d.ts} +0 -0
  855. /package/dist/guest/{audit-parse.d.ts → audit/parse.d.ts} +0 -0
  856. /package/dist/guest/{guide.d.ts → boot/guide.d.ts} +0 -0
  857. /package/dist/guest/daemon/{shutdown.d.ts → idle-shutdown.d.ts} +0 -0
  858. /package/dist/guest/daemon/{session.d.ts → sessions.d.ts} +0 -0
  859. /package/dist/guest/{main.d.ts → entries/daemon.d.ts} +0 -0
  860. /package/dist/guest/{netproxy.d.ts → entries/db.d.ts} +0 -0
  861. /package/dist/{selftest/suite.js → guest/entries/gitguard.d.ts} +0 -0
  862. /package/dist/guest/{gitguard.d.ts → git/decision.d.ts} +0 -0
  863. /package/dist/guest/{ports.d.ts → runtime/ports.d.ts} +0 -0
  864. /package/dist/guest/{project-context.d.ts → runtime/project-context.d.ts} +0 -0
  865. /package/dist/guest/{cmdline.d.ts → sessions/cmdline.d.ts} +0 -0
  866. /package/dist/guest/{ptyhost.d.ts → sessions/pty-host.d.ts} +0 -0
  867. /package/dist/guest/{view.d.ts → sessions/viewer.d.ts} +0 -0
  868. /package/dist/guest/setup/{policy.d.ts → managed-policy.d.ts} +0 -0
  869. /package/dist/host/{window.d.ts → sandbox/window.d.ts} +0 -0
  870. /package/dist/host/{wsb.d.ts → sandbox/wsb-cli.d.ts} +0 -0
  871. /package/dist/host/{cleanup.d.ts → storage/cleanup.d.ts} +0 -0
  872. /package/dist/selftest/{harness.d.ts → support/harness.d.ts} +0 -0
  873. /package/dist/selftest/{suite.d.ts → support/suite.d.ts} +0 -0
  874. /package/dist/shared/{safe-remove.d.ts → io/safe-remove.d.ts} +0 -0
  875. /package/dist/shared/{netrules.d.ts → network/firewall-rules.d.ts} +0 -0
  876. /package/dist/shared/{netpolicy.d.ts → network/policy.d.ts} +0 -0
  877. /package/dist/shared/{paths.d.ts → paths/claude-paths.d.ts} +0 -0
@@ -0,0 +1,176 @@
1
+ // The settings screen: two scopes on tabs, your own settings ("All projects", blue) and this folder's
2
+ // .sandbox-config.json ("This project", purple); Tab switches and keeps your place. Every setting is grouped into
3
+ // categories (sidebar), searchable, with its value in both scopes, its default and description. Enter edits (on/off
4
+ // flips at once), r resets. Edits keep the file's comments and formatting, and nothing is saved unless the whole file
5
+ // stays valid.
6
+ import _ from 'lodash';
7
+ import { NEVER_LOOSER } from '../../../core/local-config/index.js';
8
+ import { Text, Theme } from '../../tui/index.js';
9
+ import { AppsCatalogue } from '../apps.js';
10
+ import { CATEGORIES, categoryOf, nameOf } from './categories.js';
11
+ import { formatValue } from './format.js';
12
+ import { ValueEditor } from './value-editor.js';
13
+ const SCOPES = [
14
+ { scope: 'user', tab: { label: 'All projects', badge: 'YOURS', paint: Theme.scopeGlobal } },
15
+ { scope: 'project', tab: { label: 'This project', badge: 'PROJECT', paint: Theme.scopeProject } },
16
+ ];
17
+ export class SettingsEditor {
18
+ app;
19
+ files;
20
+ scope;
21
+ dataPath;
22
+ editor;
23
+ /** files: your config and this folder's project file; dataPath: where the apps catalogue looks for installed apps. */
24
+ constructor(app, files, scope = 'user', dataPath = '') {
25
+ this.app = app;
26
+ this.files = files;
27
+ this.scope = scope;
28
+ this.dataPath = dataPath;
29
+ this.editor = new ValueEditor(app, {
30
+ suggestions: (key) => ['defaultHarness', 'harness'].includes(key.join('.'))
31
+ ? Object.keys(this.file.userConfig().harnesses)
32
+ : undefined,
33
+ });
34
+ }
35
+ /** The file the current tab edits. */
36
+ get file() {
37
+ return this.files[this.scope];
38
+ }
39
+ get title() {
40
+ return 'Settings · ' + (this.file.isProject ? 'This project' : 'All projects');
41
+ }
42
+ /** Every editable setting with the category and heading it is shown under. */
43
+ settings() {
44
+ return this.file.schema.children().flatMap(([top, node]) => {
45
+ const category = categoryOf(top);
46
+ if (!category)
47
+ return [];
48
+ const several = category.keys.filter((k) => this.file.schema.child(k)).length > 1;
49
+ if (!node.isSection)
50
+ return [
51
+ {
52
+ key: [top],
53
+ node,
54
+ category: category.id,
55
+ section: several && category.id !== 'general' ? nameOf(top) : undefined,
56
+ },
57
+ ];
58
+ return node.leaves([top]).map(({ key, node: leaf }) => {
59
+ const heading = [
60
+ several ? nameOf(top) : undefined,
61
+ key.length > 2 ? key.slice(1, -1).map(nameOf).join(' › ') : undefined,
62
+ ]
63
+ .filter(Boolean)
64
+ .join(' › ');
65
+ return { key, node: leaf, category: category.id, section: heading || undefined };
66
+ });
67
+ });
68
+ }
69
+ item(s, config) {
70
+ const inFile = this.file.valueInFile(s.key);
71
+ const set = inFile !== undefined;
72
+ const yours = _.get(config, s.key);
73
+ const id = s.key.join('.');
74
+ const project = this.files.project;
75
+ const inProject = project.schema.leaves().some((l) => l.key.join('.') === id)
76
+ ? project.valueInFile(s.key)
77
+ : undefined;
78
+ const paint = this.file.isProject ? Theme.project : Theme.changed;
79
+ const value = this.file.isProject && !set
80
+ ? Theme.muted('all projects: ') + formatValue(yours, 40)
81
+ : formatValue(this.file.effective(s.key, config));
82
+ const details = [
83
+ Theme.muted('Setting ') + id,
84
+ Theme.muted('All projects ') +
85
+ formatValue(yours, 40) +
86
+ Theme.muted(this.files.user.valueInFile(s.key) === undefined ? ' (built-in default)' : ' (your file)'),
87
+ Theme.muted('This project ') +
88
+ (inProject === undefined ? Theme.muted('not set') : Theme.project(Text.strip(formatValue(inProject, 40)))),
89
+ ...(!this.file.isProject ? [Theme.muted('Default ') + formatValue(this.file.defaultOf(s.key), 40)] : []),
90
+ ...(this.file.isProject && NEVER_LOOSER.includes(id)
91
+ ? [Theme.warn(Theme.glyph.lock + ' A project can only make this stricter than your own setting.')]
92
+ : []),
93
+ ];
94
+ return {
95
+ value: id,
96
+ label: Text.humanize(s.key[s.key.length - 1]),
97
+ hint: set ? paint(Text.strip(value)) + ' ' + paint(Theme.glyph.changed) : value,
98
+ description: s.node.description,
99
+ details,
100
+ section: s.section,
101
+ category: s.category,
102
+ keywords: id,
103
+ };
104
+ }
105
+ async run() {
106
+ let focus;
107
+ let notice;
108
+ for (;;) {
109
+ const config = this.file.userConfig();
110
+ const settings = this.settings();
111
+ const categories = CATEGORIES.filter((c) => settings.some((s) => s.category === c.id)).map((c) => ({
112
+ id: c.id,
113
+ label: c.label,
114
+ description: c.description,
115
+ }));
116
+ const picked = await this.app.list({
117
+ path: [this.title],
118
+ tabs: { items: SCOPES.map((x) => x.tab), active: SCOPES.findIndex((x) => x.scope === this.scope) },
119
+ status: (this.file.isProject ? Theme.project('●') : Theme.accent('●')) +
120
+ Theme.muted(' Editing ') +
121
+ Text.middle(this.file.file, 80) +
122
+ (this.file.exists ? '' : Theme.muted(' (created when you save)')) +
123
+ (this.file.isProject
124
+ ? Theme.muted(' · only what a project may set; needs your approval at the next launch')
125
+ : ''),
126
+ items: settings.map((s) => this.item(s, config)),
127
+ categories,
128
+ startAt: focus,
129
+ actions: [{ key: 'r', label: this.file.isProject ? 'remove from project' : 'reset to default' }],
130
+ notice,
131
+ });
132
+ notice = undefined;
133
+ if (picked.kind === 'back')
134
+ return;
135
+ // The other tab, on the same setting when that scope has it.
136
+ if (picked.kind === 'tab') {
137
+ this.scope = SCOPES[picked.index].scope;
138
+ continue;
139
+ }
140
+ if (picked.kind !== 'pick' && picked.kind !== 'action')
141
+ continue;
142
+ if (picked.value === undefined)
143
+ continue;
144
+ focus = picked.value;
145
+ const setting = settings.find((s) => s.key.join('.') === picked.value);
146
+ if (picked.kind === 'action')
147
+ notice = this.save(setting.key, undefined, 'reset');
148
+ else
149
+ notice = await this.edit(setting, config);
150
+ }
151
+ }
152
+ async edit(s, config) {
153
+ // The apps list is picked from the catalogue (by category, with sizes), not typed.
154
+ if (s.key.join('.') === 'apps.install')
155
+ return new AppsCatalogue(this.app, this.file, this.dataPath).run();
156
+ const current = this.file.isProject ? (this.file.valueInFile(s.key) ?? _.get(config, s.key)) : _.get(config, s.key);
157
+ const path = [this.title, ...s.key.slice(0, -1).map(nameOf), Text.humanize(s.key[s.key.length - 1])];
158
+ const edited = await this.editor.edit(path, s.key, s.node, current);
159
+ return edited ? this.save(s.key, edited.value, 'save') : undefined;
160
+ }
161
+ /** Saves (or resets) one setting and returns the notice to show. */
162
+ save(key, value, how) {
163
+ const name = key.join('.');
164
+ const result = this.file.set(key, value);
165
+ if (result === 'unchanged')
166
+ return Theme.muted(how === 'reset' ? name + ' is already the default.' : 'Unchanged.');
167
+ if (typeof result === 'object')
168
+ return Theme.error(Theme.glyph.cross + ' Not saved: ' + result.problems.join('; '));
169
+ // The approval is tied to the file's exact contents, so any change makes the project file need approval again.
170
+ const after = this.file.isProject
171
+ ? ' The next launch asks you to approve the project file again.'
172
+ : ' New sandboxes use it.';
173
+ return (Theme.ok(Theme.glyph.ok + ' ' + (how === 'reset' ? 'Reset ' + name + '.' : 'Saved ' + name + '.')) +
174
+ Theme.muted(after));
175
+ }
176
+ }
@@ -1,11 +1,9 @@
1
- import { App } from '../../tui/index.js';
2
- import { SchemaNode } from './schema-node.js';
1
+ import { type App } from '../../tui/index.js';
2
+ import { type SchemaNode } from './schema-node.js';
3
3
  /** The new value, or undefined when you backed out without changing anything. */
4
4
  export type Edited = {
5
5
  value: unknown;
6
6
  } | undefined;
7
- /** A value in one short line, for the right-hand column. */
8
- export declare const formatValue: (value: unknown, max?: number) => string;
9
7
  /** Optional extra knowledge: values to suggest for some settings (the configured agents for defaultHarness). */
10
8
  export interface EditorHints {
11
9
  suggestions?: (key: string[]) => string[] | undefined;
@@ -19,12 +17,3 @@ export declare class ValueEditor {
19
17
  private suggest;
20
18
  private json;
21
19
  }
22
- /** One object as a form: each field with its value, Enter to change it, r to clear an optional one. */
23
- export declare class ObjectEditor {
24
- private readonly app;
25
- private readonly path;
26
- private readonly node;
27
- private readonly editor;
28
- constructor(app: App, path: string[], node: SchemaNode, editor: ValueEditor);
29
- run(start: Record<string, unknown>, isNew?: boolean): Promise<Edited>;
30
- }
@@ -0,0 +1,137 @@
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.
4
+ import _ from 'lodash';
5
+ import { Text } from '../../tui/index.js';
6
+ import { choiceLabel } from './format.js';
7
+ import { StringListEditor } from './collections/string-list-editor.js';
8
+ import { MapEditor } from './collections/map-editor.js';
9
+ import { ObjectListEditor } from './collections/object-list-editor.js';
10
+ import { ObjectMapEditor } from './collections/object-map-editor.js';
11
+ import { ObjectEditor } from './object-editor.js';
12
+ export class ValueEditor {
13
+ app;
14
+ hints;
15
+ constructor(app, hints = {}) {
16
+ this.app = app;
17
+ this.hints = hints;
18
+ }
19
+ async edit(path, key, node, current) {
20
+ const about = node.description ? [node.description] : [];
21
+ const suggestions = this.hints.suggestions?.(key);
22
+ if (suggestions?.length && node.type === 'string')
23
+ return this.suggest(path, key, node, current, suggestions);
24
+ switch (node.editor) {
25
+ case 'boolean':
26
+ 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': {
64
+ const typed = await this.app.text({
65
+ path,
66
+ label: Text.humanize(key[key.length - 1]),
67
+ about,
68
+ initial: typeof current === 'string' ? current : '',
69
+ allowEmpty: node.check('') === true,
70
+ validate: (v) => node.check(v),
71
+ });
72
+ return typed === undefined ? undefined : { value: typed };
73
+ }
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 : {});
92
+ case 'object':
93
+ return new ObjectEditor(this.app, path, node, this).run(_.isPlainObject(current) ? current : node.initial());
94
+ default:
95
+ return this.json(path, key, node, current);
96
+ }
97
+ }
98
+ async pick(path, node, current, values) {
99
+ const picked = await this.app.choose(path, node.description ?? '', values.map((v) => ({ value: v, label: choiceLabel(v) })), current);
100
+ return picked === undefined ? undefined : { value: picked };
101
+ }
102
+ async suggest(path, key, node, current, suggestions) {
103
+ const other = '@other';
104
+ const picked = await this.app.choose(path, node.description ?? '', [
105
+ ...suggestions.map((s) => ({ value: s, label: s })),
106
+ { value: other, label: 'Other…', description: 'Type a name that is not in the list.' },
107
+ ], typeof current === 'string' ? current : undefined);
108
+ if (picked === undefined)
109
+ return undefined;
110
+ if (picked !== other)
111
+ return { value: picked };
112
+ const typed = await this.app.text({
113
+ path,
114
+ label: Text.humanize(key[key.length - 1]),
115
+ initial: typeof current === 'string' ? current : '',
116
+ validate: (v) => node.check(v),
117
+ });
118
+ return typed === undefined ? undefined : { value: typed };
119
+ }
120
+ async json(path, key, node, current) {
121
+ const typed = await this.app.text({
122
+ path,
123
+ label: Text.humanize(key[key.length - 1]) + ' (JSON)',
124
+ about: node.description ? [node.description] : [],
125
+ initial: current === undefined ? '' : JSON.stringify(current),
126
+ validate: (v) => {
127
+ try {
128
+ return node.check(JSON.parse(v));
129
+ }
130
+ catch {
131
+ return 'This is not valid JSON.';
132
+ }
133
+ },
134
+ });
135
+ return typed === undefined ? undefined : { value: JSON.parse(typed) };
136
+ }
137
+ }
@@ -1,15 +1,15 @@
1
1
  import type { Context } from '../commands/context.js';
2
- import { App } from '../tui/index.js';
2
+ import { type App } from '../tui/index.js';
3
3
  /** Folders worth offering: this one, the projects started before, and the folders inside your roots. */
4
- export declare const candidateFolders: (ctx: Context, cwd?: string) => string[];
4
+ export declare function candidateFolders(ctx: Context, cwd?: string): string[];
5
5
  /** The command line for several sessions: one --session per (agent, folder), with the shared options. */
6
- export declare const severalAgentsArgv: (sessions: {
6
+ export declare function severalAgentsArgv(sessions: {
7
7
  harness: string;
8
8
  folder: string;
9
9
  }[], o: {
10
10
  headless: boolean;
11
11
  attachFirst: boolean;
12
- }) => string[];
12
+ }): string[];
13
13
  export declare class SeveralAgents {
14
14
  private readonly app;
15
15
  private readonly ctx;
@@ -3,25 +3,38 @@
3
3
  import fs from 'node:fs';
4
4
  import path from 'node:path';
5
5
  import { assertSafeWorkspace } from '../../core/safe-paths.js';
6
- import { errMsg, expandPath } from '../../core/util.js';
7
- import { readKnown } from '../../host/projects.js';
8
- import { isWithin } from '../../shared/projects.js';
6
+ import { errMsg, expandPath } from '../../core/util/index.js';
7
+ import { KnownProjects } from '../../host/projects/index.js';
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
11
  /** Folders worth offering: this one, the projects started before, and the folders inside your roots. */
12
- export const candidateFolders = (ctx, cwd = process.cwd()) => {
12
+ export function candidateFolders(ctx, cwd = process.cwd()) {
13
13
  const roots = ctx.loaded.config.projects.roots.map((r) => expandPath(r, ctx.loaded.base));
14
- const inRoots = roots.flatMap((r) => { try {
15
- return fs.readdirSync(r, { withFileTypes: true }).filter((e) => e.isDirectory() && !e.isSymbolicLink() && !e.name.startsWith('.')).slice(0, 200).map((e) => path.join(r, e.name));
16
- }
17
- catch {
18
- return [];
19
- } });
20
- const all = [path.resolve(cwd), ...readKnown(ctx.storageRoot).map((k) => k.host), ...inRoots];
14
+ const inRoots = roots.flatMap((r) => {
15
+ try {
16
+ return fs
17
+ .readdirSync(r, { withFileTypes: true })
18
+ .filter((e) => e.isDirectory() && !e.isSymbolicLink() && !e.name.startsWith('.'))
19
+ .slice(0, 200)
20
+ .map((e) => path.join(r, e.name));
21
+ }
22
+ catch {
23
+ return [];
24
+ }
25
+ });
26
+ const all = [path.resolve(cwd), ...new KnownProjects(ctx.storageRoot).list().map((k) => k.host), ...inRoots];
21
27
  return all.filter((f, i) => all.findIndex((g) => g.toLowerCase() === f.toLowerCase()) === i && fs.existsSync(f));
22
- };
28
+ }
23
29
  /** The command line for several sessions: one --session per (agent, folder), with the shared options. */
24
- export const severalAgentsArgv = (sessions, o) => ['launch', ...sessions.flatMap((s) => ['--session', s.harness + '@' + s.folder]), ...(o.headless ? ['--headless'] : []), ...(o.attachFirst ? ['-t'] : [])];
30
+ export function severalAgentsArgv(sessions, o) {
31
+ return [
32
+ 'launch',
33
+ ...sessions.flatMap((s) => ['--session', s.harness + '@' + s.folder]),
34
+ ...(o.headless ? ['--headless'] : []),
35
+ ...(o.attachFirst ? ['-t'] : []),
36
+ ];
37
+ }
25
38
  const ADD = '@add';
26
39
  export class SeveralAgents {
27
40
  app;
@@ -39,7 +52,9 @@ export class SeveralAgents {
39
52
  const sessions = [];
40
53
  for (const folder of folders) {
41
54
  const picked = await this.app.list({
42
- path: [...this.path, path.basename(folder)], intro: 'Agents for ' + folder + ' (one session each). Space ticks, Enter continues.', multi: true,
55
+ path: [...this.path, path.basename(folder)],
56
+ intro: 'Agents for ' + folder + ' (one session each). Space ticks, Enter continues.',
57
+ multi: true,
43
58
  items: agents.map((a) => ({ value: a, label: a, checked: a === this.ctx.loaded.config.defaultHarness })),
44
59
  });
45
60
  if (picked.kind !== 'multi')
@@ -48,7 +63,12 @@ export class SeveralAgents {
48
63
  }
49
64
  if (!sessions.length)
50
65
  return null;
51
- const headless = await this.app.confirm({ path: this.path, question: 'Hide the sandbox window (headless)?', about: ['sandbox show brings it back.'], initial: this.ctx.loaded.config.sandbox.headless });
66
+ const headless = await this.app.confirm({
67
+ path: this.path,
68
+ question: 'Hide the sandbox window (headless)?',
69
+ about: ['sandbox show brings it back.'],
70
+ initial: this.ctx.loaded.config.sandbox.headless,
71
+ });
52
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.', [
53
73
  { value: -1, label: 'None' },
54
74
  ...sessions.map((s, i) => ({ value: i, label: s.harness + ' in ' + Text.middle(s.folder, 60) })),
@@ -60,8 +80,21 @@ export class SeveralAgents {
60
80
  const argv = severalAgentsArgv(ordered, { headless, attachFirst: attach >= 0 });
61
81
  const projects = [...new Set(sessions.map((s) => path.basename(s.folder)))];
62
82
  const go = await this.app.confirm({
63
- path: this.path, question: 'Start them?',
64
- about: ['One sandbox with ' + sessions.length + ' session' + (sessions.length === 1 ? '' : 's') + ': ' + ordered.map((s) => s.harness + ' in ' + path.basename(s.folder)).join(', ') + '. Maps ' + projects.join(' and ') + '.', '', '$ ' + commandLine(argv)],
83
+ path: this.path,
84
+ question: 'Start them?',
85
+ about: [
86
+ 'One sandbox with ' +
87
+ sessions.length +
88
+ ' session' +
89
+ (sessions.length === 1 ? '' : 's') +
90
+ ': ' +
91
+ ordered.map((s) => s.harness + ' in ' + path.basename(s.folder)).join(', ') +
92
+ '. Maps ' +
93
+ projects.join(' and ') +
94
+ '.',
95
+ '',
96
+ '$ ' + commandLine(argv),
97
+ ],
65
98
  });
66
99
  return go ? argv : null;
67
100
  }
@@ -69,9 +102,16 @@ export class SeveralAgents {
69
102
  const here = path.resolve(process.cwd());
70
103
  const candidates = candidateFolders(this.ctx);
71
104
  const picked = await this.app.list({
72
- path: this.path, intro: 'Which projects? Each gets its own sessions; all of them are mapped into one sandbox. Space ticks, Enter continues.', multi: true,
105
+ path: this.path,
106
+ intro: 'Which projects? Each gets its own sessions; all of them are mapped into one sandbox. Space ticks, Enter continues.',
107
+ multi: true,
73
108
  items: [
74
- ...candidates.map((f) => ({ value: f, label: Text.middle(f, 90), hint: isWithin(f, here) && isWithin(here, f) ? Theme.muted('this folder') : undefined, checked: f.toLowerCase() === here.toLowerCase() })),
109
+ ...candidates.map((f) => ({
110
+ value: f,
111
+ label: Text.middle(f, 90),
112
+ hint: isWithin(f, here) && isWithin(here, f) ? Theme.muted('this folder') : undefined,
113
+ checked: f.toLowerCase() === here.toLowerCase(),
114
+ })),
75
115
  { value: ADD, label: '+ Another folder…' },
76
116
  ],
77
117
  });
@@ -80,7 +120,8 @@ export class SeveralAgents {
80
120
  const folders = picked.values.filter((f) => f !== ADD);
81
121
  if (picked.values.includes(ADD)) {
82
122
  const extra = await this.app.text({
83
- path: this.path, label: 'Folder to add',
123
+ path: this.path,
124
+ label: 'Folder to add',
84
125
  validate: (v) => {
85
126
  const dir = path.resolve(v.trim());
86
127
  if (!v.trim() || !fs.existsSync(dir) || !fs.statSync(dir).isDirectory())
@@ -1,5 +1,5 @@
1
1
  /** The colour policy as a pure function (tested); `isTTY` is that of the stream being written to. */
2
- export declare const colorEnabled: (env: NodeJS.ProcessEnv, isTTY: boolean) => boolean;
2
+ export declare function colorEnabled(env: NodeJS.ProcessEnv, isTTY: boolean): boolean;
3
3
  export declare const c: {
4
4
  bold: (text: string) => string;
5
5
  dim: (text: string) => string;
@@ -9,16 +9,16 @@ export declare const c: {
9
9
  cyan: (text: string) => string;
10
10
  };
11
11
  /** Removes colour codes (for measuring or comparing text). */
12
- export declare const stripAnsi: (text: string) => string;
12
+ export declare function stripAnsi(text: string): string;
13
13
  /** Cuts `text` to `max` visible characters, ending in an ellipsis (plain text only). */
14
- export declare const shorten: (text: string, max: number) => string;
14
+ export declare function shorten(text: string, max: number): string;
15
15
  /** Cuts the middle out of a long path or id so both ends stay readable. */
16
- export declare const shortenMiddle: (text: string, max: number) => string;
16
+ export declare function shortenMiddle(text: string, max: number): string;
17
17
  /** 1536 -> "1.5 KB" is in the data command; this is "3 min ago" for the tables. */
18
- export declare const ago: (then: number | string | Date, now?: number) => string;
18
+ export declare function ago(then: number | string | Date, now?: number): string;
19
19
  /** Width to lay text out in (terminal columns, 80 when unknown, never absurdly small). */
20
- export declare const termWidth: () => number;
20
+ export declare function termWidth(): number;
21
21
  /** Each menu page starts on a clean screen (answered prompts would otherwise pile up above it). */
22
- export declare const clearScreen: () => void;
22
+ export declare function clearScreen(): void;
23
23
  /** Rows of a list that fit the terminal (leaving room for the prompt and the help line). */
24
- export declare const pageSizeFor: (wanted: number) => number;
24
+ export declare function pageSizeFor(wanted: number): number;
@@ -1,29 +1,41 @@
1
1
  // ANSI colours for terminal output (one place, so menus, errors and warnings agree).
2
- // Colour is on only for a terminal that wants it: not with NO_COLOR, TERM=dumb or piped output; FORCE_COLOR turns it on.
2
+ // Colour is on only for a terminal that wants it: not with NO_COLOR, TERM=dumb or piped output; FORCE_COLOR turns it
3
+ // on.
3
4
  /** The colour policy as a pure function (tested); `isTTY` is that of the stream being written to. */
4
- export const colorEnabled = (env, isTTY) => {
5
+ export function colorEnabled(env, isTTY) {
5
6
  if (env.NO_COLOR)
6
7
  return false;
7
8
  if (env.FORCE_COLOR !== undefined && env.FORCE_COLOR !== '')
8
9
  return env.FORCE_COLOR !== '0' && env.FORCE_COLOR !== 'false';
9
10
  return isTTY && env.TERM !== 'dumb';
11
+ }
12
+ const paint = (code) => (text) => colorEnabled(process.env, Boolean(process.stdout.isTTY)) ? '\x1b[' + code + 'm' + text + '\x1b[0m' : text;
13
+ export const c = {
14
+ bold: paint(1),
15
+ dim: paint(2),
16
+ red: paint(31),
17
+ green: paint(32),
18
+ yellow: paint(33),
19
+ cyan: paint(36),
10
20
  };
11
- const paint = (code) => (text) => (colorEnabled(process.env, Boolean(process.stdout.isTTY)) ? '\x1b[' + code + 'm' + text + '\x1b[0m' : text);
12
- export const c = { bold: paint(1), dim: paint(2), red: paint(31), green: paint(32), yellow: paint(33), cyan: paint(36) };
13
21
  /** Removes colour codes (for measuring or comparing text). */
14
- export const stripAnsi = (text) => text.replace(/\x1b\[[0-9;]*m/g, '');
22
+ export function stripAnsi(text) {
23
+ return text.replace(/\x1b\[[0-9;]*m/g, '');
24
+ }
15
25
  /** Cuts `text` to `max` visible characters, ending in an ellipsis (plain text only). */
16
- export const shorten = (text, max) => (max < 2 || text.length <= max ? text : text.slice(0, max - 1) + '…');
26
+ export function shorten(text, max) {
27
+ return max < 2 || text.length <= max ? text : text.slice(0, max - 1) + '…';
28
+ }
17
29
  /** Cuts the middle out of a long path or id so both ends stay readable. */
18
- export const shortenMiddle = (text, max) => {
30
+ export function shortenMiddle(text, max) {
19
31
  if (max < 5 || text.length <= max)
20
32
  return text;
21
33
  const keep = max - 1;
22
34
  const head = Math.ceil(keep / 2);
23
35
  return text.slice(0, head) + '…' + text.slice(text.length - (keep - head));
24
- };
36
+ }
25
37
  /** 1536 -> "1.5 KB" is in the data command; this is "3 min ago" for the tables. */
26
- export const ago = (then, now = Date.now()) => {
38
+ export function ago(then, now = Date.now()) {
27
39
  const secs = Math.max(0, Math.round((now - new Date(then).getTime()) / 1000));
28
40
  if (secs < 45)
29
41
  return 'just now';
@@ -32,11 +44,17 @@ export const ago = (then, now = Date.now()) => {
32
44
  if (secs < 86400)
33
45
  return Math.round(secs / 3600) + ' h ago';
34
46
  return Math.round(secs / 86400) + ' d ago';
35
- };
47
+ }
36
48
  /** Width to lay text out in (terminal columns, 80 when unknown, never absurdly small). */
37
- export const termWidth = () => Math.max(40, process.stdout.columns ?? 80);
49
+ export function termWidth() {
50
+ return Math.max(40, process.stdout.columns ?? 80);
51
+ }
38
52
  /** Each menu page starts on a clean screen (answered prompts would otherwise pile up above it). */
39
- export const clearScreen = () => { if (process.stdout.isTTY)
40
- process.stdout.write('\x1b[2J\x1b[3J\x1b[H'); };
53
+ export function clearScreen() {
54
+ if (process.stdout.isTTY)
55
+ process.stdout.write('\x1b[2J\x1b[3J\x1b[H');
56
+ }
41
57
  /** Rows of a list that fit the terminal (leaving room for the prompt and the help line). */
42
- export const pageSizeFor = (wanted) => Math.max(5, Math.min(wanted, (process.stdout.rows ?? 30) - 6));
58
+ export function pageSizeFor(wanted) {
59
+ return Math.max(5, Math.min(wanted, (process.stdout.rows ?? 30) - 6));
60
+ }
@@ -0,0 +1,3 @@
1
+ export * from './colors.js';
2
+ export * from './progress.js';
3
+ export * from './print.js';
@@ -0,0 +1,3 @@
1
+ export * from './colors.js';
2
+ export * from './progress.js';
3
+ export * from './print.js';
@@ -0,0 +1,5 @@
1
+ import type { Context } from '../commands/context.js';
2
+ /** Prints rows as aligned columns (the last column is not padded). */
3
+ export declare function table(rows: string[][]): void;
4
+ /** Prints `value` as JSON when --json was given; returns whether it did. */
5
+ export declare function printJson(ctx: Context, value: unknown): boolean;
@@ -0,0 +1,14 @@
1
+ import _ from 'lodash';
2
+ /** Prints rows as aligned columns (the last column is not padded). */
3
+ export function table(rows) {
4
+ const widths = _.range(_.max(rows.map((r) => r.length)) ?? 0).map((i) => _.max(rows.map((r) => (r[i] ?? '').length)) ?? 0);
5
+ for (const row of rows)
6
+ console.log(row.map((cell, i) => (i === row.length - 1 ? cell : _.padEnd(cell, widths[i] + 2))).join(''));
7
+ }
8
+ /** Prints `value` as JSON when --json was given; returns whether it did. */
9
+ export function printJson(ctx, value) {
10
+ // JSON.stringify leaves C1 controls (U+0080-U+009F) as they are; text from the sandbox must not reach a terminal raw.
11
+ if (ctx.options.json)
12
+ console.log(JSON.stringify(value, null, 2).replace(/[\u0080-\u009f]/g, (ch) => '\\u' + ch.charCodeAt(0).toString(16).padStart(4, '0')));
13
+ return ctx.options.json;
14
+ }
@@ -0,0 +1,24 @@
1
+ /** Can a line be redrawn in place? */
2
+ export declare function canAnimate(env: NodeJS.ProcessEnv, isTTY: boolean): boolean;
3
+ /** "12 s", "2 min 5 s". */
4
+ export declare function elapsed(ms: number): string;
5
+ /** One line of progress: `line` is shown, `key` changes when it is worth a new plain line, `what` names what runs. */
6
+ export interface Progressing {
7
+ line: string;
8
+ key: string;
9
+ what: string;
10
+ }
11
+ /**
12
+ * Follows long work (a sandbox's boot): on a terminal one line redrawn in place with the time so far; without one a
13
+ * plain line each time `key` changes. When nothing changes for `stallMs` it says so (stall(what, ms)). A failure first
14
+ * prints where it stopped, then rethrows.
15
+ */
16
+ export declare function follow<T>(show: () => Progressing, work: () => Promise<T>, o: {
17
+ stallMs?: number;
18
+ stall: (what: string, ms: number) => string;
19
+ }): Promise<T>;
20
+ /**
21
+ * Shows `message` while work runs and removes the line afterwards. The spinner only moves while the event loop is free
22
+ * (waiting on the sandbox); for long synchronous work (measuring folders) the static line is what you see.
23
+ */
24
+ export declare function working<T>(message: string | (() => string), work: () => Promise<T> | T, enabled?: boolean): Promise<T>;