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,13 @@
1
+ export declare const trustStorePath: (storageRoot: string) => string;
2
+ export declare const isTrusted: (store: string, file: string, hash: string) => boolean;
3
+ export declare const saveTrust: (store: string, file: string, hash: string) => void;
4
+ export declare const allowStorePath: (storageRoot: string) => string;
5
+ /** true = you allowed it, false = you said no (not asked again), null = not asked yet. */
6
+ export declare const allowedAnswer: (store: string, file: string, setting: string, value: unknown) => boolean | null;
7
+ export declare const saveAllowed: (store: string, file: string, setting: string, value: unknown, allow: boolean) => void;
8
+ /** Answers for folders outside the project are kept with the others, one per folder (and read-only or not). */
9
+ export declare const OUTSIDE_FOLDER = "folder outside the project";
10
+ export declare function outsideKey(m: {
11
+ host: string;
12
+ readOnly: boolean;
13
+ }): string;
@@ -0,0 +1,43 @@
1
+ import path from 'node:path';
2
+ import _ from 'lodash';
3
+ import { z } from 'zod';
4
+ import { tryReadJson, writeJson } from '../util/index.js';
5
+ // ---- approvals (host-only: <storage>\trusted-configs.json) ----------------------------------------------------------
6
+ export const trustStorePath = (storageRoot) => path.join(storageRoot, 'trusted-configs.json');
7
+ const loadTrust = (store) => tryReadJson(store) ?? {};
8
+ const key = (file) => path.resolve(file).toLowerCase();
9
+ export const isTrusted = (store, file, hash) => loadTrust(store)[key(file)] === hash;
10
+ export const saveTrust = (store, file, hash) => writeJson(store, { ...loadTrust(store), [key(file)]: hash });
11
+ // ---- looser settings you allowed for one project (host-only: <storage>\allowed-requests.json) ----------------------
12
+ // A project file can never loosen a protection by itself. When it asks, you are asked once (interactively); a "yes"
13
+ // is kept here, per project file and per "setting = value", so only that value is ever let through for that project.
14
+ export const allowStorePath = (storageRoot) => path.join(storageRoot, 'allowed-requests.json');
15
+ const loadAllowed = (store) => {
16
+ const parsed = z
17
+ .record(z.string(), z.array(z.string().max(2000)).max(500))
18
+ .safeParse(tryReadJson(store) ?? {});
19
+ return parsed.success ? parsed.data : {};
20
+ };
21
+ const allowKey = (setting, value) => setting + ' = ' + JSON.stringify(value);
22
+ /** true = you allowed it, false = you said no (not asked again), null = not asked yet. */
23
+ export const allowedAnswer = (store, file, setting, value) => {
24
+ const answers = loadAllowed(store)[key(file)] ?? [];
25
+ return answers.includes(allowKey(setting, value))
26
+ ? true
27
+ : answers.includes('no: ' + allowKey(setting, value))
28
+ ? false
29
+ : null;
30
+ };
31
+ export const saveAllowed = (store, file, setting, value, allow) => {
32
+ const all = loadAllowed(store);
33
+ const entry = allowKey(setting, value);
34
+ writeJson(store, {
35
+ ...all,
36
+ [key(file)]: _.union(_.without(all[key(file)] ?? [], entry, 'no: ' + entry), [(allow ? '' : 'no: ') + entry]),
37
+ });
38
+ };
39
+ /** Answers for folders outside the project are kept with the others, one per folder (and read-only or not). */
40
+ export const OUTSIDE_FOLDER = 'folder outside the project';
41
+ export function outsideKey(m) {
42
+ return (m.readOnly ? 'read-only ' : 'read/write ') + path.resolve(m.host).toLowerCase();
43
+ }
@@ -0,0 +1,4 @@
1
+ /** The package folder (the one with package.json, dist/, sandbox/ and schemas/). */
2
+ export declare const PACKAGE_ROOT: string;
3
+ /** This package's version. */
4
+ export declare const packageVersion: () => string;
@@ -0,0 +1,13 @@
1
+ // Where this package is installed and its version. This file is dist/core/package-info.js, two folders below
2
+ // package.json.
3
+ import path from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { z } from 'zod';
6
+ import { tryReadJson } from './util/index.js';
7
+ /** The package folder (the one with package.json, dist/, sandbox/ and schemas/). */
8
+ export const PACKAGE_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..');
9
+ /** This package's version. */
10
+ export const packageVersion = () => {
11
+ const file = path.join(PACKAGE_ROOT, 'package.json');
12
+ return z.object({ version: z.string() }).safeParse(tryReadJson(file)).data?.version ?? 'unknown';
13
+ };
@@ -0,0 +1,23 @@
1
+ import type { Config, Mapping } from '../types.js';
2
+ /** 'auto' guest workspace: C:\Workspace\<folder name> (shared/paths/projects.ts, where every project's place is decided). */
3
+ export declare const autoGuestWorkspace: (hostDir: string) => string;
4
+ /**
5
+ * A launch folder inside a project root appears under the root's folder (C:\Projects\<root>\<name>, or its PC path
6
+ * with "mirror"), where it also is when another project started the sandbox, so git worktrees and Claude's project
7
+ * folders keep working whichever project starts it. Only for "auto" / "mirror"; a filtered or read-only workspace
8
+ * keeps its own mapping (the root would show the folder unfiltered and writable at that place).
9
+ */
10
+ export declare function placeInRoot(config: Config, workspaceHost: string, mirror: boolean, notes: string[]): Config;
11
+ /** Where the workspace appears: guestWorkspace "auto", "mirror" (with a note when it falls back) or a path. */
12
+ export declare function guestWorkspaceOf(config: Pick<Config, 'guestWorkspace'>, workspaceHost: string): {
13
+ guest: string;
14
+ note: string | null;
15
+ };
16
+ /**
17
+ * Where a mapping will most likely appear, before the launch knows every other folder (the prompt and config check
18
+ * show it; the launch places it for real in host/launch/mappings.ts with the same rules).
19
+ */
20
+ export declare function previewGuest(m: Pick<Mapping, 'host' | 'guest'>, workspaceHost: string, workspaceGuest: string): {
21
+ guest: string;
22
+ note: string | null;
23
+ };
@@ -0,0 +1,47 @@
1
+ import { autoGuestFolder, deriveGuest, guestConflict, guestFix, planMirrorWorkspace, PROJECTS_GUEST, rootGuestDir, tidyGuestPath, usableRoots, } from '../../shared/paths/index.js';
2
+ import { dirExists, isInsideOrEqual } from '../util/index.js';
3
+ /** 'auto' guest workspace: C:\Workspace\<folder name> (shared/paths/projects.ts, where every project's place is decided). */
4
+ export const autoGuestWorkspace = autoGuestFolder;
5
+ /**
6
+ * A launch folder inside a project root appears under the root's folder (C:\Projects\<root>\<name>, or its PC path
7
+ * with "mirror"), where it also is when another project started the sandbox, so git worktrees and Claude's project
8
+ * folders keep working whichever project starts it. Only for "auto" / "mirror"; a filtered or read-only workspace
9
+ * keeps its own mapping (the root would show the folder unfiltered and writable at that place).
10
+ */
11
+ export function placeInRoot(config, workspaceHost, mirror, notes) {
12
+ const guest = rootGuestDir(usableRoots(config.projects.roots, dirExists), mirror, workspaceHost);
13
+ if (!guest)
14
+ return config;
15
+ if (config.workspaceFilter.enabled || config.readOnly) {
16
+ notes.push(workspaceHost +
17
+ ' is inside a project root, but ' +
18
+ (config.readOnly ? 'readOnly' : 'workspaceFilter') +
19
+ ' is on, so it is mapped on its own at ' +
20
+ config.guestWorkspace +
21
+ ' (when another project starts the sandbox it is at ' +
22
+ guest +
23
+ ').');
24
+ return config;
25
+ }
26
+ return { ...config, guestWorkspace: guest };
27
+ }
28
+ /** Where the workspace appears: guestWorkspace "auto", "mirror" (with a note when it falls back) or a path. */
29
+ export function guestWorkspaceOf(config, workspaceHost) {
30
+ if (config.guestWorkspace === 'auto')
31
+ return { guest: autoGuestWorkspace(workspaceHost), note: null };
32
+ if (config.guestWorkspace === 'mirror')
33
+ return planMirrorWorkspace(workspaceHost, autoGuestWorkspace(workspaceHost));
34
+ return { guest: config.guestWorkspace, note: null };
35
+ }
36
+ /**
37
+ * Where a mapping will most likely appear, before the launch knows every other folder (the prompt and config check
38
+ * show it; the launch places it for real in host/launch/mappings.ts with the same rules).
39
+ */
40
+ export function previewGuest(m, workspaceHost, workspaceGuest) {
41
+ const guest = tidyGuestPath(m.guest ?? deriveGuest(m.host, workspaceHost, workspaceGuest));
42
+ const conflict = guestConflict(guest, [
43
+ ...(m.guest || !isInsideOrEqual(workspaceHost, m.host) ? [{ guest: workspaceGuest, what: 'the project' }] : []),
44
+ { guest: PROJECTS_GUEST, what: 'other projects' },
45
+ ]);
46
+ return { guest, note: conflict ? m.host + ': ' + conflict + '. Fix: ' + guestFix(m.guest) : null };
47
+ }
@@ -0,0 +1,3 @@
1
+ export { autoGuestWorkspace, placeInRoot, guestWorkspaceOf, previewGuest } from './guest-workspace.js';
2
+ export { voltaNode, resolveVersions } from './versions.js';
3
+ export { resolveRun } from './resolve-run.js';
@@ -0,0 +1,3 @@
1
+ export { autoGuestWorkspace, placeInRoot, guestWorkspaceOf, previewGuest } from './guest-workspace.js';
2
+ export { voltaNode, resolveVersions } from './versions.js';
3
+ export { resolveRun } from './resolve-run.js';
@@ -0,0 +1,3 @@
1
+ import type { ResolvedRun, RunRequest } from '../types.js';
2
+ /** Precedence (lowest to highest): built-in defaults, user config, .sandbox-config.json in the workspace, command-line flags. */
3
+ export declare const resolveRun: (req: RunRequest, hostNodeVersion?: string) => Promise<ResolvedRun>;
@@ -0,0 +1,202 @@
1
+ import path from 'node:path';
2
+ import { DATABASES } from '../detect/index.js';
3
+ import { allowedAnswer, allowRequests, allowStorePath, applyOverrides, describeOverrides, isTrusted, LOCAL_CONFIG_NAME, loosenedRequests, normalizeOverrides, OUTSIDE_FOLDER, outsideKey, outsideMappings, readLocalConfig, saveAllowed, saveTrust, trustStorePath, } from '../local-config/index.js';
4
+ import { assertSafeWorkspace } from '../safe-paths.js';
5
+ import { dirExists, expandPath, fail, plainText } from '../util/index.js';
6
+ import { guestWorkspaceOf, placeInRoot, previewGuest } from './guest-workspace.js';
7
+ import { resolveVersions } from './versions.js';
8
+ /** Precedence (lowest to highest): built-in defaults, user config, .sandbox-config.json in the workspace, command-line flags. */
9
+ export const resolveRun = async (req, hostNodeVersion = process.version) => {
10
+ const notes = [];
11
+ // Mappings from the user config are relative to that config file; expand them before anything else uses them.
12
+ const expand = (list) => list.map((p) => expandPath(p, req.loaded.base));
13
+ const projects = req.loaded.config.projects;
14
+ let config = {
15
+ ...req.loaded.config,
16
+ mappings: req.loaded.config.mappings.map((m) => ({ ...m, host: expandPath(m.host, req.loaded.base) })),
17
+ projects: {
18
+ ...projects,
19
+ roots: expand(projects.roots),
20
+ exclude: expand(projects.exclude),
21
+ declinedRoots: expand(projects.declinedRoots),
22
+ },
23
+ };
24
+ const mirror = config.guestWorkspace === 'mirror';
25
+ const storageRoot = expandPath(config.storage.root, req.loaded.base);
26
+ const workspaceHost = path.resolve(req.workspace ?? req.cwd);
27
+ if (!dirExists(workspaceHost))
28
+ fail('The workspace folder does not exist: ' + workspaceHost, 'Check the --workspace path, or cd into the project first.');
29
+ assertSafeWorkspace(workspaceHost, req.packageRoot, storageRoot);
30
+ const scripts = [];
31
+ let localConfigPath = null;
32
+ let overrides = {};
33
+ const local = req.noLocalConfig ? null : readLocalConfig(workspaceHost);
34
+ let outsideAllowed = [];
35
+ if (local) {
36
+ overrides = normalizeOverrides(local.data, workspaceHost, local.path);
37
+ const store = trustStorePath(storageRoot);
38
+ if (!isTrusted(store, local.path, local.hash)) {
39
+ const summary = describeOverrides(overrides, workspaceHost);
40
+ let trusted = req.trustConfig;
41
+ if (!trusted && req.ask) {
42
+ console.log('\nFound ' + local.path + ' which is not trusted yet. It would apply:');
43
+ for (const line of summary)
44
+ console.log(' ' + plainText(line));
45
+ trusted = await req.ask('Trust and use this file?');
46
+ }
47
+ if (!trusted)
48
+ fail(local.path +
49
+ ' has not been approved yet (a repo can ship this file, so it needs your OK). It would apply:\n ' +
50
+ (summary.map(plainText).join('\n ') || '(no changes)'), 'Review it, then run again in an interactive terminal and answer y, or add --trust-config. To ignore the file: --no-local-config');
51
+ saveTrust(store, local.path, local.hash);
52
+ notes.push('Trusted ' + local.path + ' (you will only be asked again if the file changes).');
53
+ }
54
+ const requests = await projectFileRequests(req, config, overrides, local.path, workspaceHost, storageRoot, notes);
55
+ const allowed = requests.allowed;
56
+ outsideAllowed = requests.outside;
57
+ config = applyOverrides(allowRequests(config, allowed), overrides);
58
+ scripts.push(...(overrides.scripts ?? []));
59
+ localConfigPath = local.path;
60
+ notes.push('Using ' + local.path);
61
+ }
62
+ if (req.headless !== undefined)
63
+ config = { ...config, sandbox: { ...config.sandbox, headless: req.headless } };
64
+ for (const name of req.databases ?? []) {
65
+ const db = name.toLowerCase();
66
+ if (!DATABASES.includes(db))
67
+ fail('Unknown database "' + name + '".', 'Choose from: ' + DATABASES.join(', '));
68
+ config = { ...config, databases: { ...config.databases, [db]: { ...config.databases[db], enabled: true } } };
69
+ }
70
+ // auto / mirror: a project inside a root is where the root shows it, whichever project starts the sandbox.
71
+ const guest = guestWorkspaceOf(config, workspaceHost);
72
+ const placed = config.guestWorkspace === 'auto' || mirror
73
+ ? placeInRoot({ ...config, guestWorkspace: guest.guest }, workspaceHost, mirror, notes)
74
+ : { ...config, guestWorkspace: guest.guest };
75
+ if (guest.note && placed.guestWorkspace === guest.guest)
76
+ notes.push(guest.note);
77
+ config = placed;
78
+ scripts.push(...req.scripts.map((s) => path.resolve(s)));
79
+ const harnessName = req.noAgent ? 'none' : (req.harness ?? config.defaultHarness);
80
+ if (harnessName !== 'none' && !config.harnesses[harnessName])
81
+ fail('Unknown agent "' + harnessName + '".', 'Configured agents: ' +
82
+ Object.keys(config.harnesses).join(', ') +
83
+ ' (add more under "harnesses" in your config).');
84
+ const versions = resolveVersions(config, workspaceHost, overrides, req, hostNodeVersion);
85
+ const dataPath = path.join(storageRoot, 'data', config.storage.dataName);
86
+ // A project file may ask for "mirror" too (it decides only its own path); project roots follow the user's choice.
87
+ return {
88
+ config,
89
+ storageRoot,
90
+ dataPath,
91
+ workspaceHost,
92
+ harnessName,
93
+ scripts,
94
+ localConfigPath,
95
+ notes,
96
+ versions,
97
+ mirror,
98
+ outsideMappings: outsideAllowed,
99
+ };
100
+ };
101
+ /**
102
+ * A project may only tighten. What it asks for beyond that (a looser setting, a folder outside the project) is used
103
+ * only if you allowed it for this project: asked once, in one question, at an interactive launch, never by
104
+ * --trust-config. Folders outside the project follow projects.allowOutsideMappings (your settings only). A looser
105
+ * setting you did not allow is named in the notes instead of dropped silently.
106
+ */
107
+ async function projectFileRequests(req, config, overrides, localPath, workspaceHost, storageRoot, notes) {
108
+ const allowStore = allowStorePath(storageRoot);
109
+ const policy = config.projects.allowOutsideMappings;
110
+ // An optional folder that is not on this PC is skipped at launch, so it needs no answer (yet).
111
+ const outside = outsideMappings(workspaceHost, overrides.mappings).filter((m) => !m.optional || dirExists(m.host));
112
+ const name = path.basename(workspaceHost) + "'s " + LOCAL_CONFIG_NAME;
113
+ const preview = guestWorkspaceOf(applyOverrides(config, overrides), workspaceHost).guest;
114
+ const describe = (m) => (m.readOnly ? 'read-only ' : 'READ/WRITE ') + m.host + ' -> ' + previewGuest(m, workspaceHost, preview).guest;
115
+ const plural = (n) => (n === 1 ? '' : 's');
116
+ if (outside.length && policy === false) {
117
+ fail(name +
118
+ ' maps ' +
119
+ outside.length +
120
+ ' folder' +
121
+ plural(outside.length) +
122
+ ' outside the project, and your settings do not allow that:\n ' +
123
+ outside.map(describe).join('\n '), 'Allow it: set projects.allowOutsideMappings to "ask" or true in your settings (sandbox > Settings, or the file sandbox config path shows). Or remove those mappings from the file.');
124
+ }
125
+ const looser = loosenedRequests(config, overrides);
126
+ const interactive = Boolean(req.ask) && (req.interactive ?? Boolean(process.stdin.isTTY));
127
+ const notAllowedYet = () => policy === 'ask'
128
+ ? outside.filter((m) => allowedAnswer(allowStore, localPath, OUTSIDE_FOLDER, outsideKey(m)) !== true)
129
+ : [];
130
+ const openOutside = notAllowedYet();
131
+ const openLooser = looser.filter((a) => allowedAnswer(allowStore, localPath, a.key, a.wanted) === null);
132
+ let declinedOutside = false;
133
+ if (interactive && req.ask && (openOutside.length || openLooser.length)) {
134
+ console.log('\n' + name + ' asks for more than your settings allow:');
135
+ if (openOutside.length)
136
+ console.log(' Folders outside the project:\n' + openOutside.map((m) => ' ' + plainText(describe(m))).join('\n'));
137
+ for (const a of openLooser)
138
+ console.log(' ' + a.key + ' = ' + JSON.stringify(a.wanted) + ' (your settings: ' + JSON.stringify(a.yours) + ')');
139
+ const ok = await req.ask('Allow ' + (openOutside.length + openLooser.length === 1 ? 'it' : 'these') + ' for this project?');
140
+ for (const a of openLooser)
141
+ saveAllowed(allowStore, localPath, a.key, a.wanted, ok);
142
+ // A "no" to folders is not kept: the next interactive launch asks again.
143
+ if (ok)
144
+ for (const m of openOutside)
145
+ saveAllowed(allowStore, localPath, OUTSIDE_FOLDER, outsideKey(m), true);
146
+ declinedOutside = !ok && openOutside.length > 0;
147
+ }
148
+ const notAllowed = notAllowedYet();
149
+ if (notAllowed.length) {
150
+ const them = notAllowed.length === 1 ? 'it' : 'them';
151
+ const what = name +
152
+ ' maps ' +
153
+ notAllowed.length +
154
+ ' folder' +
155
+ plural(notAllowed.length) +
156
+ ' outside the project:\n ' +
157
+ notAllowed.map(describe).join('\n ');
158
+ fail(what +
159
+ (declinedOutside
160
+ ? '\nYou did not allow ' + them + ', so the sandbox was not started.'
161
+ : '\nThat needs your OK once (a repo ships this file), and this launch cannot ask (no interactive terminal).'), 'Allow ' +
162
+ them +
163
+ ': start it from an interactive terminal and answer y, or set projects.allowOutsideMappings to true in your settings (sandbox > Settings, or the file sandbox config path shows).');
164
+ }
165
+ const allowedHosts = [...new Set(outside.map((m) => m.host))];
166
+ if (outside.length)
167
+ notes.push('Folders outside the project allowed for ' +
168
+ name +
169
+ ' (' +
170
+ (policy === true ? 'projects.allowOutsideMappings is true' : 'your answer is kept in ' + allowStore) +
171
+ '): ' +
172
+ allowedHosts.join(', '));
173
+ const allowed = [];
174
+ for (const ask of looser) {
175
+ const ok = allowedAnswer(allowStore, localPath, ask.key, ask.wanted);
176
+ if (ok) {
177
+ allowed.push(ask);
178
+ notes.push('Allowed for this project: ' +
179
+ ask.key +
180
+ ' = ' +
181
+ JSON.stringify(ask.wanted) +
182
+ ' (your answer is kept in ' +
183
+ allowStore +
184
+ ').');
185
+ }
186
+ else
187
+ notes.push('The project asks for ' +
188
+ ask.key +
189
+ ' = ' +
190
+ JSON.stringify(ask.wanted) +
191
+ ', but your settings say ' +
192
+ JSON.stringify(ask.yours) +
193
+ ', so it is not used. ' +
194
+ (ok === false
195
+ ? 'You said no (kept in ' + allowStore + ').'
196
+ : 'Start it from an interactive terminal to allow it for this project.') +
197
+ ' Or set ' +
198
+ ask.key +
199
+ ' in your own settings (sandbox, then Settings > All projects).');
200
+ }
201
+ return { allowed, outside: allowedHosts };
202
+ }
@@ -0,0 +1,13 @@
1
+ import type { Config, Overrides, ToolVersions } from '../types.js';
2
+ /**
3
+ * The Node version a Volta project pins ("volta": { "node": "20.11.1" } in package.json), so nvm defaults to it too.
4
+ */
5
+ export declare const voltaNode: (workspace: string) => string | null;
6
+ /**
7
+ * Picks tool versions. Highest priority first: command line, the folder's .sandbox-config.json,
8
+ * version files in the workspace (.nvmrc, .node-version, .python-version), the tool config, this PC's node version.
9
+ */
10
+ export declare const resolveVersions: (config: Config, workspace: string, local: Overrides, req: {
11
+ nodeVersion?: string;
12
+ pythonVersion?: string;
13
+ }, hostNodeVersion: string) => ToolVersions;
@@ -0,0 +1,65 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { z } from 'zod';
4
+ import { fileExists } from '../util/index.js';
5
+ const firstLine = (file) => {
6
+ if (!fileExists(file))
7
+ return null;
8
+ const line = fs
9
+ .readFileSync(file, 'utf8')
10
+ .replace(/^\uFEFF/, '')
11
+ .split(/\r?\n/)
12
+ .map((l) => l.replace(/#.*$/, '').trim())
13
+ .find((l) => l !== '');
14
+ return line ?? null;
15
+ };
16
+ const VOLTA_PIN = 'package.json volta.node';
17
+ const PackageJsonSchema = z.object({
18
+ volta: z
19
+ .object({
20
+ node: z
21
+ .string()
22
+ .regex(/^\d+(\.\d+){0,2}$/)
23
+ .optional(),
24
+ })
25
+ .optional(),
26
+ });
27
+ /**
28
+ * The Node version a Volta project pins ("volta": { "node": "20.11.1" } in package.json), so nvm defaults to it too.
29
+ */
30
+ export const voltaNode = (workspace) => {
31
+ const file = path.join(workspace, 'package.json');
32
+ if (!fileExists(file))
33
+ return null;
34
+ try {
35
+ return (PackageJsonSchema.safeParse(JSON.parse(fs.readFileSync(file, 'utf8').replace(/^\uFEFF/, ''))).data?.volta?.node ??
36
+ null);
37
+ }
38
+ catch {
39
+ return null;
40
+ }
41
+ };
42
+ /**
43
+ * Picks tool versions. Highest priority first: command line, the folder's .sandbox-config.json,
44
+ * version files in the workspace (.nvmrc, .node-version, .python-version), the tool config, this PC's node version.
45
+ */
46
+ export const resolveVersions = (config, workspace, local, req, hostNodeVersion) => {
47
+ const localTools = (local.toolchains ?? {});
48
+ const pick = (cli, localValue, files, configured) => {
49
+ if (cli)
50
+ return { spec: cli, source: 'command line' };
51
+ if (localValue)
52
+ return { spec: localValue, source: '.sandbox-config.json' };
53
+ for (const name of files) {
54
+ const value = name === VOLTA_PIN ? voltaNode(workspace) : firstLine(path.join(workspace, name));
55
+ if (value)
56
+ return { spec: value, source: name };
57
+ }
58
+ return { spec: configured, source: 'config' };
59
+ };
60
+ let node = pick(req.nodeVersion, localTools.node?.version, ['.nvmrc', '.node-version', VOLTA_PIN], config.toolchains.node.version);
61
+ if (node.spec === 'host')
62
+ node = { spec: hostNodeVersion.replace(/^v/, ''), source: 'this PC' };
63
+ const python = pick(req.pythonVersion, localTools.python?.version, ['.python-version'], config.toolchains.python.version);
64
+ return { node, nodeExtra: config.toolchains.node.extraVersions, python };
65
+ };
@@ -1,10 +1,10 @@
1
1
  // Which folders may be shared with the sandbox. The agent gets read/write access to what is mapped, so nothing that
2
2
  // would let it reach this tool, its storage, your settings or the OS may be mapped.
3
- import { userDir } from './config.js';
4
- import { fail, isInsideOrEqual, isRootPath, isUserProfile } from './util.js';
3
+ import { userDir } from './config/index.js';
4
+ import { fail, isInsideOrEqual, isRootPath, isUserProfile } from './util/index.js';
5
5
  /** Folders the agent must never be able to write: the tool itself, its storage and your settings for it. */
6
6
  const protectedFolders = (packageRoot, storageRoot) => [
7
- ['this tool\'s install folder', packageRoot],
7
+ ["this tool's install folder", packageRoot],
8
8
  ['the sandbox storage folder', storageRoot],
9
9
  ['your sandbox settings folder', userDir()],
10
10
  ];
@@ -25,9 +25,21 @@ export const assertSafeWorkspace = (workspace, packageRoot, storageRoot) => {
25
25
  fail('Your whole user profile cannot be the workspace: ' + workspace, 'Run sandbox claude from a project folder (or pass --workspace <folder>).');
26
26
  for (const [label, dir] of protectedFolders(packageRoot, storageRoot)) {
27
27
  if (isInsideOrEqual(dir, workspace))
28
- fail(workspace + ' cannot be the workspace: it is inside ' + label + ' (' + dir + '), so the agent could change the code that runs on this PC.', dir === packageRoot ? 'Developing windows-development-sandbox itself? Install it as a copy instead of a link: run `npm run install:global` in the repository, then sandbox claude works there.' : 'Run sandbox claude from a project folder somewhere else.');
28
+ fail(workspace +
29
+ ' cannot be the workspace: it is inside ' +
30
+ label +
31
+ ' (' +
32
+ dir +
33
+ '), so the agent could change the code that runs on this PC.', dir === packageRoot
34
+ ? 'Developing windows-development-sandbox itself? Install it as a copy instead of a link: run `npm run install:global` in the repository, then sandbox claude works there.'
35
+ : 'Run sandbox claude from a project folder somewhere else.');
29
36
  if (isInsideOrEqual(workspace, dir))
30
- fail(workspace + ' cannot be the workspace: it contains ' + label + ' (' + dir + '), which the agent must not be able to change.', 'Run sandbox claude from a project folder that does not contain it.');
37
+ fail(workspace +
38
+ ' cannot be the workspace: it contains ' +
39
+ label +
40
+ ' (' +
41
+ dir +
42
+ '), which the agent must not be able to change.', 'Run sandbox claude from a project folder that does not contain it.');
31
43
  }
32
44
  for (const name of ['WINDIR', 'SystemRoot', 'ProgramFiles', 'ProgramFiles(x86)', 'ProgramData']) {
33
45
  const dir = process.env[name];
@@ -1,9 +1,9 @@
1
1
  import { z } from 'zod';
2
- export declare const AppId: z.ZodEnum<{
2
+ export declare const AppIdSchema: z.ZodEnum<{
3
3
  [x: string]: string;
4
4
  }>;
5
- export declare const CustomAppId: z.ZodString;
6
- export declare const CustomApp: z.ZodObject<{
5
+ export declare const CustomAppIdSchema: z.ZodString;
6
+ export declare const CustomAppSchema: z.ZodObject<{
7
7
  name: z.ZodString;
8
8
  github: z.ZodOptional<z.ZodString>;
9
9
  asset: z.ZodOptional<z.ZodString>;
@@ -18,7 +18,7 @@ export declare const CustomApp: z.ZodObject<{
18
18
  exe: z.ZodString;
19
19
  cli: z.ZodOptional<z.ZodBoolean>;
20
20
  }, z.core.$strict>;
21
- export declare const Apps: z.ZodObject<{
21
+ export declare const AppsSchema: z.ZodObject<{
22
22
  install: z.ZodArray<z.ZodEnum<{
23
23
  [x: string]: string;
24
24
  }>>;
@@ -1,27 +1,61 @@
1
1
  // Apps installed in the sandbox: entries from the catalogue (shared/apps.ts) and programs of your own.
2
2
  import { z } from 'zod';
3
- import { APPS } from '../../shared/apps.js';
3
+ import { APPS } from '../../shared/apps/index.js';
4
4
  const CATALOGUE_IDS = APPS.filter((a) => !a.setting).map((a) => a.id);
5
- export const AppId = z.enum(CATALOGUE_IDS);
6
- export const CustomAppId = z.string().regex(/^[a-z0-9][a-z0-9-]{0,40}$/, 'lower-case letters, digits and - only');
7
- const compiles = (pattern) => { try {
8
- new RegExp(pattern);
9
- return true;
10
- }
11
- catch {
12
- return false;
13
- } };
14
- export const CustomApp = z.strictObject({
5
+ export const AppIdSchema = z.enum(CATALOGUE_IDS);
6
+ export const CustomAppIdSchema = z.string().regex(/^[a-z0-9][a-z0-9-]{0,40}$/, 'lower-case letters, digits and - only');
7
+ const compiles = (pattern) => {
8
+ try {
9
+ new RegExp(pattern);
10
+ return true;
11
+ }
12
+ catch {
13
+ return false;
14
+ }
15
+ };
16
+ export const CustomAppSchema = z
17
+ .strictObject({
15
18
  name: z.string().min(1).max(80).describe('The name on the desktop shortcut, e.g. "My Tool".'),
16
- github: z.string().regex(/^[\w.-]+\/[\w.-]+$/, 'owner/repo, e.g. sharkdp/bat').optional().describe('GitHub repository (owner/repo): the file comes from its latest release.'),
17
- asset: z.string().max(200).refine(compiles, 'not a valid pattern').optional().describe('With github: a pattern (regular expression) matching the release file, e.g. windows.*x64\\.zip$'),
18
- url: z.string().url().startsWith('https://', 'https:// only').optional().describe('Or a direct https:// download link (zip, 7z, exe or msi).'),
19
- sha256: z.string().regex(/^[0-9a-fA-F]{64}$/, '64 hex characters').optional().describe('SHA-256 of the download (GitHub releases usually publish one; then this is not needed).'),
20
- unpack: z.enum(['archive', 'file', 'nsis', 'msi']).optional().describe('archive (zip, 7z, tar: the default), file (a single .exe), nsis (an installer 7-Zip can open) or msi.'),
19
+ github: z
20
+ .string()
21
+ .regex(/^[\w.-]+\/[\w.-]+$/, 'owner/repo, e.g. sharkdp/bat')
22
+ .optional()
23
+ .describe('GitHub repository (owner/repo): the file comes from its latest release.'),
24
+ asset: z
25
+ .string()
26
+ .max(200)
27
+ .refine(compiles, 'not a valid pattern')
28
+ .optional()
29
+ .describe('With github: a pattern (regular expression) matching the release file, e.g. windows.*x64\\.zip$'),
30
+ url: z
31
+ .string()
32
+ .url()
33
+ .startsWith('https://', 'https:// only')
34
+ .optional()
35
+ .describe('Or a direct https:// download link (zip, 7z, exe or msi).'),
36
+ sha256: z
37
+ .string()
38
+ .regex(/^[0-9a-fA-F]{64}$/, '64 hex characters')
39
+ .optional()
40
+ .describe('SHA-256 of the download (GitHub releases usually publish one; then this is not needed).'),
41
+ unpack: z
42
+ .enum(['archive', 'file', 'nsis', 'msi'])
43
+ .optional()
44
+ .describe('archive (zip, 7z, tar: the default), file (a single .exe), nsis (an installer 7-Zip can open) or msi.'),
21
45
  exe: z.string().min(1).max(200).describe('The program to start (found anywhere in the download), e.g. mytool.exe.'),
22
- cli: z.boolean().optional().describe('A command-line tool: its folder goes on PATH instead of getting a desktop shortcut.'),
23
- }).refine((a) => (a.github && a.asset ? !a.url : Boolean(a.url) && !a.github && !a.asset), { message: 'give github + asset, or url (not both)' });
24
- export const Apps = z.strictObject({
25
- install: z.array(AppId).describe('Apps from the catalogue to install in every sandbox (the Apps screen in the menu lists them by category). Each is downloaded once and kept.'),
26
- custom: z.record(CustomAppId, CustomApp).describe('Programs of your own: a GitHub release or a download link, and the program to start. Installed like the catalogue apps.'),
46
+ cli: z
47
+ .boolean()
48
+ .optional()
49
+ .describe('A command-line tool: its folder goes on PATH instead of getting a desktop shortcut.'),
50
+ })
51
+ .refine((a) => (a.github && a.asset ? !a.url : Boolean(a.url) && !a.github && !a.asset), {
52
+ message: 'give github + asset, or url (not both)',
53
+ });
54
+ export const AppsSchema = z.strictObject({
55
+ install: z
56
+ .array(AppIdSchema)
57
+ .describe('Apps from the catalogue to install in every sandbox (the Apps screen in the menu lists them by category). Each is downloaded once and kept.'),
58
+ custom: z
59
+ .record(CustomAppIdSchema, CustomAppSchema)
60
+ .describe('Programs of your own: a GitHub release or a download link, and the program to start. Installed like the catalogue apps.'),
27
61
  });
@@ -1,17 +1,20 @@
1
1
  import { z } from 'zod';
2
- export declare const GuestPath: z.ZodString;
3
- export declare const Name: z.ZodString;
4
- export declare const Strings: z.ZodArray<z.ZodString>;
2
+ export declare const GuestPathSchema: z.ZodString;
3
+ export declare const NameSchema: z.ZodString;
4
+ export declare const StringsSchema: z.ZodArray<z.ZodString>;
5
5
  export declare const toggle: (description: string) => z.ZodObject<{
6
6
  enabled: z.ZodBoolean;
7
7
  }, z.core.$strict>;
8
- export declare const SchemaRef: z.ZodString;
9
- export declare const GitAccess: z.ZodEnum<{
8
+ export declare const SchemaRefSchema: z.ZodString;
9
+ export declare const GitAccessSchema: z.ZodEnum<{
10
10
  readonly: "readonly";
11
- full: "full";
12
11
  none: "none";
12
+ full: "full";
13
13
  }>;
14
- /** true, false, or "auto": only when the project uses it (found from files like go.mod in the workspace or one level down). */
15
- export declare const Enabled: z.ZodUnion<readonly [z.ZodBoolean, z.ZodLiteral<"auto">]>;
16
- export declare const enabled: (what: string, markers: string) => z.ZodUnion<readonly [z.ZodBoolean, z.ZodLiteral<"auto">]>;
17
- export declare const Packages: (what: string, example: string) => z.ZodArray<z.ZodString>;
14
+ /**
15
+ * true, false, or "auto": only when the project uses it (found from files like go.mod in the workspace or one level
16
+ * down).
17
+ */
18
+ export declare const EnabledSchema: z.ZodUnion<readonly [z.ZodBoolean, z.ZodLiteral<"auto">]>;
19
+ export declare const enabled: (what: string, markers: string) => typeof EnabledSchema;
20
+ export declare const Packages: (what: string, example: string) => typeof StringsSchema;