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
@@ -2,16 +2,26 @@
2
2
  // `openssl` shim onto the copy Git for Windows already ships.
3
3
  import fs from 'node:fs';
4
4
  import path from 'node:path';
5
- import { dryRun, errMsg, exists, log, mkdirp, stateDir, warn } from '../env.js';
6
- import { projectWorkspace } from '../project-context.js';
7
- import { CLI_TOOLS, decideCli } from './catalogue.js';
8
- import { arch, tool } from './common.js';
9
- import { setupSingleExe } from './runtimes.js';
10
- import { ensureCompiled } from '../helpers.js';
11
- /** gh keeps `gh auth login` here, under the agent state (persists like Claude's own login; never copied from the PC). */
12
- export const ghConfigDir = () => path.join(stateDir, 'gh');
5
+ import { dryRun } from '../../runtime/paths.js';
6
+ import { exists, mkdirp } from '../../runtime/fs.js';
7
+ import { log, warn } from '../../runtime/log.js';
8
+ import { stateDir } from '../../runtime/session.js';
9
+ import { errMsg } from '../../../core/util/errors.js';
10
+ import { projectWorkspace } from '../../runtime/project-context.js';
11
+ import { CLI_TOOLS, decideCli } from '../catalogue.js';
12
+ import { arch, tool } from '../tool-env.js';
13
+ import { setupSingleExe } from '../runtimes.js';
14
+ import { ensureCompiled } from '../../runtime/csc.js';
15
+ /** gh keeps `gh auth login` here, under the agent state (persists like Claude's login; never copied from the PC). */
16
+ export function ghConfigDir() {
17
+ return path.join(stateDir, 'gh');
18
+ }
13
19
  const toolVars = {
14
- gh: () => ({ GH_CONFIG_DIR: mkdirp(ghConfigDir()), GH_NO_UPDATE_NOTIFIER: '1', GH_NO_EXTENSION_UPDATE_NOTIFIER: '1' }),
20
+ gh: () => ({
21
+ GH_CONFIG_DIR: mkdirp(ghConfigDir()),
22
+ GH_NO_UPDATE_NOTIFIER: '1',
23
+ GH_NO_EXTENSION_UPDATE_NOTIFIER: '1',
24
+ }),
15
25
  };
16
26
  /**
17
27
  * tools\shims\openssl.exe (sandbox/openssl.cs), a launcher for Git's mingw64\bin\openssl.exe. A real .exe so programs
@@ -28,22 +38,28 @@ const shimOpenssl = (env) => {
28
38
  // An earlier version wrote a .cmd; it would still win for shells that prefer it.
29
39
  fs.rmSync(path.join(shims, 'openssl.cmd'), { force: true });
30
40
  env.prepend.push(shims);
31
- env.summary.push('openssl: Git for Windows\' copy');
41
+ env.summary.push("openssl: Git for Windows' copy");
32
42
  };
33
43
  /**
34
44
  * Installs the tools toolchains.cli asks for. Settings still "auto" here (normally the host decides) use the same
35
45
  * rules on the workspace as the host would. The gh rule is enforced here again, whatever the host sent.
36
46
  */
37
- export const setupCli = async (env, settings, gitAccess, refresh = false) => {
47
+ export async function setupCli(env, settings, gitAccess, refresh = false) {
38
48
  const decisions = decideCli(settings, { gitAccess, hasGithubDir: exists(path.join(projectWorkspace(), '.github')) });
39
49
  if (settings.gh && !decisions.gh.on) {
40
50
  env.summary.push('gh: off (' + decisions.gh.reason + ')');
41
51
  // A login from an earlier full-access sandbox is still on disk; the agent could read the token from there.
42
52
  if (exists(path.join(ghConfigDir(), 'hosts.yml')))
43
- warn('gh is off (git access is not "full"), but an earlier gh login is still stored in ' + ghConfigDir() + ' and readable by the agent. Run `gh auth logout` in a full-access sandbox, or delete that folder.');
53
+ warn('gh is off (git access is not "full"), but an earlier gh login is still stored in ' +
54
+ ghConfigDir() +
55
+ ' and readable by the agent. Run `gh auth logout` in a full-access sandbox, or delete that folder.');
44
56
  }
45
57
  if (dryRun) {
46
- log('(dry run) would provision CLI tools: ' + Object.entries(decisions).filter(([, d]) => d.on).map(([n]) => n).join(', '));
58
+ log('(dry run) would provision CLI tools: ' +
59
+ Object.entries(decisions)
60
+ .filter(([, d]) => d.on)
61
+ .map(([n]) => n)
62
+ .join(', '));
47
63
  return;
48
64
  }
49
65
  for (const entry of CLI_TOOLS) {
@@ -51,7 +67,11 @@ export const setupCli = async (env, settings, gitAccess, refresh = false) => {
51
67
  if (!decisions[name].on)
52
68
  continue;
53
69
  try {
54
- await setupSingleExe(env, name, entry.repo, entry.asset(arch), entry.exe, tool('cli', name), { refresh, subdir: entry.subdir, size: entry.size });
70
+ await setupSingleExe(env, name, entry.repo, entry.asset(arch), entry.exe, tool('cli', name), {
71
+ refresh,
72
+ subdir: entry.subdir,
73
+ size: entry.size,
74
+ });
55
75
  Object.assign(env.vars, toolVars[name]?.() ?? {});
56
76
  }
57
77
  catch (e) {
@@ -69,4 +89,4 @@ export const setupCli = async (env, settings, gitAccess, refresh = false) => {
69
89
  env.summary.push('openssl: FAILED');
70
90
  }
71
91
  }
72
- };
92
+ }
@@ -0,0 +1,3 @@
1
+ import type { GitAccess } from '../../../core/types.js';
2
+ import { type ToolEnv } from '../tool-env.js';
3
+ export declare function setupGit(env: ToolEnv, hostCopy: boolean, refresh: boolean, access: GitAccess): Promise<void>;
@@ -2,20 +2,32 @@
2
2
  // provisioning.git.access decides what the agent gets: 'full' git, a 'readonly' guarded git, or 'none' (bash only).
3
3
  import fs from 'node:fs';
4
4
  import path from 'node:path';
5
- import { download, githubAsset, moveIntoPlace, stagingFolder } from '../../shared/download.js';
6
- import { safeRemove } from '../../shared/safe-remove.js';
7
- import { dataDir, dryRun, errMsg, execAsync, execOutput, exists, hostToolsDir, launchDir, log, mkdirp, robocopy, toolsDir, warn } from '../env.js';
8
- import { ensureCompiled } from '../helpers.js';
9
- import { arch, tool } from './common.js';
10
- import { duringSession } from '../project-context.js';
11
- const BLOCKED_HOOKS = ['pre-commit', 'commit-msg', 'pre-merge-commit', 'pre-push', 'pre-rebase', 'pre-applypatch', 'applypatch-msg'];
5
+ import { downloader, githubAsset, moveIntoPlace, stagingFolder } from '../../../shared/download/index.js';
6
+ import { safeRemove } from '../../../shared/io/safe-remove.js';
7
+ import { dataDir, dryRun, hostToolsDir, launchDir, toolsDir } from '../../runtime/paths.js';
8
+ import { execAsync, execOutput, robocopy } from '../../runtime/process.js';
9
+ import { exists, mkdirp } from '../../runtime/fs.js';
10
+ import { log, warn } from '../../runtime/log.js';
11
+ import { errMsg } from '../../../core/util/errors.js';
12
+ import { ensureCompiled } from '../../runtime/csc.js';
13
+ import { arch, tool } from '../tool-env.js';
14
+ import { duringSession } from '../../runtime/project-context.js';
15
+ const BLOCKED_HOOKS = [
16
+ 'pre-commit',
17
+ 'commit-msg',
18
+ 'pre-merge-commit',
19
+ 'pre-push',
20
+ 'pre-rebase',
21
+ 'pre-applypatch',
22
+ 'applypatch-msg',
23
+ ];
12
24
  const posix = (p) => p.replace(/\\/g, '/');
13
25
  const installPortableGit = async (root) => {
14
26
  const asset = await githubAsset('git-for-windows/git', arch === 'arm64' ? /^PortableGit-[\d.]+-arm64\.7z\.exe$/ : /^PortableGit-[\d.]+-64-bit\.7z\.exe$/);
15
27
  const sfx = tool(asset.name);
16
28
  log('Downloading Git for Windows (' + asset.name + ', ~60 MB once) ...');
17
29
  try {
18
- await download(asset.url, sfx, asset.sha256);
30
+ await downloader.file(asset.url, sfx, asset.sha256);
19
31
  await execAsync(sfx, ['-o' + root, '-y'], { stdio: 'ignore' });
20
32
  }
21
33
  finally {
@@ -31,7 +43,9 @@ const installGuard = (env, access, realGit) => {
31
43
  const guard = path.join(launchDir, 'runtime', 'gitguard.js');
32
44
  // A real git.exe (programs like Claude Code only look for .exe); a .cmd only if the C# compiler is unavailable.
33
45
  // A project added later reuses the boot's: sessions may be running it, and Windows cannot replace a running exe.
34
- if (duringSession() && (exists(path.join(dir, 'git.exe')) || exists(path.join(dir, 'git.cmd')))) { /* keep it */ }
46
+ if (duringSession() && (exists(path.join(dir, 'git.exe')) || exists(path.join(dir, 'git.cmd')))) {
47
+ /* keep it */
48
+ }
35
49
  else
36
50
  try {
37
51
  fs.copyFileSync(ensureCompiled('gitshim'), path.join(dir, 'git.exe'));
@@ -44,14 +58,21 @@ const installGuard = (env, access, realGit) => {
44
58
  fs.writeFileSync(path.join(dir, 'bashenv.sh'), 'git() { "' + posix(process.execPath) + '" "' + posix(guard) + '" "$@"; }\nexport -f git\n');
45
59
  env.prepend.unshift(dir);
46
60
  Object.assign(env.vars, {
47
- AGENT_GIT_ACCESS: access, AGENT_REAL_GIT: access === 'readonly' ? realGit : '',
48
- AGENT_GUARD_NODE: process.execPath, AGENT_GUARD_SCRIPT: guard, BASH_ENV: posix(path.join(dir, 'bashenv.sh')),
61
+ AGENT_GIT_ACCESS: access,
62
+ AGENT_REAL_GIT: access === 'readonly' ? realGit : '',
63
+ AGENT_GUARD_NODE: process.execPath,
64
+ AGENT_GUARD_SCRIPT: guard,
65
+ BASH_ENV: posix(path.join(dir, 'bashenv.sh')),
49
66
  });
50
67
  if (access === 'readonly') {
51
68
  const hooks = mkdirp(path.join(dir, 'hooks'));
52
69
  for (const hook of BLOCKED_HOOKS)
53
70
  fs.writeFileSync(path.join(hooks, hook), '#!/bin/sh\necho "git is read-only in this sandbox: ' + hook + ' refused." >&2\nexit 1\n');
54
- Object.assign(env.vars, { GIT_CONFIG_COUNT: '1', GIT_CONFIG_KEY_0: 'core.hooksPath', GIT_CONFIG_VALUE_0: posix(hooks) });
71
+ Object.assign(env.vars, {
72
+ GIT_CONFIG_COUNT: '1',
73
+ GIT_CONFIG_KEY_0: 'core.hooksPath',
74
+ GIT_CONFIG_VALUE_0: posix(hooks),
75
+ });
55
76
  }
56
77
  else {
57
78
  // Even a git.exe found some other way sees no repository.
@@ -73,7 +94,7 @@ const pointAtOwnCertificates = (root) => {
73
94
  if (fixed !== text)
74
95
  fs.writeFileSync(config, fixed);
75
96
  };
76
- export const setupGit = async (env, hostCopy, refresh, access) => {
97
+ export async function setupGit(env, hostCopy, refresh, access) {
77
98
  const root = tool('git');
78
99
  const bash = path.join(root, 'bin', 'bash.exe');
79
100
  const gitExe = path.join(root, 'cmd', 'git.exe');
@@ -117,5 +138,7 @@ export const setupGit = async (env, hostCopy, refresh, access) => {
117
138
  return;
118
139
  }
119
140
  installGuard(env, access, gitExe);
120
- env.summary.push(access === 'readonly' ? 'git: ' + version + ' READ-ONLY (status/log/diff/show/blame; no commit, push, checkout, ...)' : 'git: DISABLED (bash only; the agent cannot use git)');
121
- };
141
+ env.summary.push(access === 'readonly'
142
+ ? 'git: ' + version + ' READ-ONLY (status/log/diff/show/blame; no commit, push, checkout, ...)'
143
+ : 'git: DISABLED (bash only; the agent cannot use git)');
144
+ }
@@ -0,0 +1,4 @@
1
+ import { type ToolEnv } from '../tool-env.js';
2
+ /** Where pwsh.exe lives (the host's Windows Terminal profile points at the same folder under C:\AgentData). */
3
+ export declare function pwshDir(): string;
4
+ export declare function setupPwsh(env: ToolEnv, refresh?: boolean): Promise<void>;
@@ -1,14 +1,21 @@
1
1
  // PowerShell 7 (pwsh): the portable zip from PowerShell/PowerShell releases (no MSI: Windows Sandbox would lose it on
2
2
  // every boot). Only `pwsh` is added; Windows PowerShell 5.1 (`powershell`, SYSTEM.powershell()) stays what the
3
3
  // sandbox's own hooks and scripts use.
4
- import { pwshAsset } from './catalogue.js';
5
- import { arch, tool } from './common.js';
6
- import { setupSingleExe } from './runtimes.js';
4
+ import { pwshAsset } from '../catalogue.js';
5
+ import { arch, tool } from '../tool-env.js';
6
+ import { setupSingleExe } from '../runtimes.js';
7
7
  /** Where pwsh.exe lives (the host's Windows Terminal profile points at the same folder under C:\AgentData). */
8
- export const pwshDir = () => tool('pwsh');
9
- export const setupPwsh = async (env, refresh = false) => {
8
+ export function pwshDir() {
9
+ return tool('pwsh');
10
+ }
11
+ export async function setupPwsh(env, refresh = false) {
10
12
  // pwsh.exe sits at the zip's root next to its runtime and modules: the whole folder is kept.
11
- await setupSingleExe(env, 'pwsh', 'PowerShell/PowerShell', pwshAsset(arch), 'pwsh.exe', pwshDir(), { refresh, size: '100 MB', versionArgs: ['-Version'], note: ' (PowerShell 7; powershell is still 5.1)' });
13
+ await setupSingleExe(env, 'pwsh', 'PowerShell/PowerShell', pwshAsset(arch), 'pwsh.exe', pwshDir(), {
14
+ refresh,
15
+ size: '100 MB',
16
+ versionArgs: ['-Version'],
17
+ note: ' (PowerShell 7; powershell is still 5.1)',
18
+ });
12
19
  // No update banner or telemetry from a copy that provisioning.refresh replaces anyway.
13
20
  Object.assign(env.vars, { POWERSHELL_UPDATECHECK: 'Off', POWERSHELL_TELEMETRY_OPTOUT: '1' });
14
- };
21
+ }
@@ -16,15 +16,15 @@ export interface ToolPaths {
16
16
  ruby?: string;
17
17
  deno?: string;
18
18
  }
19
- /** User settings for the sandbox's VS Code. Only keys with a value are set; the caller removes the ones it set before. */
20
- export declare const vscodeSettings: (p: ToolPaths) => Record<string, unknown>;
19
+ /** User settings for the sandbox's VS Code. Only keys with a value are set; the caller removes those it set before. */
20
+ export declare function vscodeSettings(p: ToolPaths): Record<string, unknown>;
21
21
  export declare const EXTENSION_ID: RegExp;
22
22
  /** The extensions to have: always EditorConfig, then per toolchain and database in use, the project's, and yours. */
23
- export declare const vscodeExtensions: (o: {
23
+ export declare function vscodeExtensions(o: {
24
24
  toolchains: string[];
25
25
  databases: string[];
26
26
  recommended: string[];
27
27
  extra: string[];
28
- }) => string[];
29
- /** Extensions not installed yet, from the names of the folders in VS Code's extensions folder (publisher.name-1.2.3). */
30
- export declare const missingExtensions: (wanted: string[], folders: string[]) => string[];
28
+ }): string[];
29
+ /** Extensions not installed yet, from the folder names in VS Code's extensions folder (publisher.name-1.2.3). */
30
+ export declare function missingExtensions(wanted: string[], folders: string[]): string[];
@@ -2,8 +2,8 @@
2
2
  // for the languages in use. Pure (tested); vscode.ts finds the paths and writes them.
3
3
  /** The JDK's major version from its folder name (jdk-21.0.5+11 -> 21). */
4
4
  const javaMajor = (home) => /(?:jdk|jre)?-?(\d{1,2})(?:[.+_-]|$)/i.exec(home.split(/[\\/]/).pop() ?? '')?.[1];
5
- /** User settings for the sandbox's VS Code. Only keys with a value are set; the caller removes the ones it set before. */
6
- export const vscodeSettings = (p) => {
5
+ /** User settings for the sandbox's VS Code. Only keys with a value are set; the caller removes those it set before. */
6
+ export function vscodeSettings(p) {
7
7
  const profiles = {};
8
8
  if (p.pwsh)
9
9
  profiles['PowerShell 7'] = { path: p.pwsh, args: ['-NoLogo'] };
@@ -18,14 +18,18 @@ export const vscodeSettings = (p) => {
18
18
  'terminal.integrated.defaultProfile.windows': p.pwsh ? 'PowerShell 7' : undefined,
19
19
  'python.defaultInterpreterPath': p.python,
20
20
  'java.jdt.ls.java.home': p.javaHome,
21
- 'java.configuration.runtimes': p.javaHome ? [{ name: 'JavaSE-' + (javaMajor(p.javaHome) ?? '21'), path: p.javaHome, default: true }] : undefined,
21
+ 'java.configuration.runtimes': p.javaHome
22
+ ? [{ name: 'JavaSE-' + (javaMajor(p.javaHome) ?? '21'), path: p.javaHome, default: true }]
23
+ : undefined,
22
24
  'maven.terminal.useJavaHome': p.javaHome ? true : undefined,
23
25
  'go.goroot': p.goRoot,
24
26
  'go.alternateTools': p.go ? { go: p.go } : undefined,
25
27
  'C_Cpp.default.compilerPath': p.cl ?? p.gcc,
26
28
  'cmake.cmakePath': p.cmake,
27
29
  'dotnet.dotnetPath': p.dotnet ? p.dotnet.replace(/[\\/]dotnet\.exe$/i, '') : undefined,
28
- 'dotnetAcquisitionExtension.existingDotnetPath': p.dotnet ? [{ extensionId: 'ms-dotnettools.csharp', path: p.dotnet }] : undefined,
30
+ 'dotnetAcquisitionExtension.existingDotnetPath': p.dotnet
31
+ ? [{ extensionId: 'ms-dotnettools.csharp', path: p.dotnet }]
32
+ : undefined,
29
33
  'php.validate.executablePath': p.php,
30
34
  'php.debug.executablePath': p.php,
31
35
  'rubyLsp.rubyVersionManager': p.ruby ? { identifier: 'none' } : undefined,
@@ -34,12 +38,18 @@ export const vscodeSettings = (p) => {
34
38
  'npm.packageManager': 'auto',
35
39
  };
36
40
  return Object.fromEntries(Object.entries(settings).filter(([, v]) => v !== undefined));
37
- };
41
+ }
38
42
  /** Extensions per toolchain (Marketplace ids). */
39
43
  const BY_TOOLCHAIN = {
40
44
  node: ['dbaeumer.vscode-eslint', 'esbenp.prettier-vscode'],
41
45
  python: ['ms-python.python', 'ms-python.debugpy'],
42
- java: ['redhat.java', 'vscjava.vscode-java-debug', 'vscjava.vscode-java-test', 'vscjava.vscode-maven', 'vscjava.vscode-gradle'],
46
+ java: [
47
+ 'redhat.java',
48
+ 'vscjava.vscode-java-debug',
49
+ 'vscjava.vscode-java-test',
50
+ 'vscjava.vscode-maven',
51
+ 'vscjava.vscode-gradle',
52
+ ],
43
53
  go: ['golang.go'],
44
54
  rust: ['rust-lang.rust-analyzer', 'vadimcn.vscode-lldb'],
45
55
  cpp: ['ms-vscode.cpptools', 'ms-vscode.cmake-tools'],
@@ -58,12 +68,18 @@ const BY_DATABASE = {
58
68
  };
59
69
  export const EXTENSION_ID = /^[\w-]+\.[\w-]+$/;
60
70
  /** The extensions to have: always EditorConfig, then per toolchain and database in use, the project's, and yours. */
61
- export const vscodeExtensions = (o) => {
62
- const all = ['editorconfig.editorconfig', ...o.toolchains.flatMap((t) => BY_TOOLCHAIN[t] ?? []), ...o.databases.flatMap((d) => BY_DATABASE[d] ?? []), ...o.recommended, ...o.extra];
71
+ export function vscodeExtensions(o) {
72
+ const all = [
73
+ 'editorconfig.editorconfig',
74
+ ...o.toolchains.flatMap((t) => BY_TOOLCHAIN[t] ?? []),
75
+ ...o.databases.flatMap((d) => BY_DATABASE[d] ?? []),
76
+ ...o.recommended,
77
+ ...o.extra,
78
+ ];
63
79
  return [...new Set(all.map((e) => e.toLowerCase()))].filter((e) => EXTENSION_ID.test(e));
64
- };
65
- /** Extensions not installed yet, from the names of the folders in VS Code's extensions folder (publisher.name-1.2.3). */
66
- export const missingExtensions = (wanted, folders) => {
80
+ }
81
+ /** Extensions not installed yet, from the folder names in VS Code's extensions folder (publisher.name-1.2.3). */
82
+ export function missingExtensions(wanted, folders) {
67
83
  const have = folders.map((f) => f.toLowerCase());
68
84
  return wanted.filter((id) => !have.some((f) => f.startsWith(id + '-')));
69
- };
85
+ }
@@ -1,11 +1,11 @@
1
- import type { Toolchains } from '../../core/types.js';
2
- import { type ToolEnv } from './common.js';
1
+ import type { Toolchains } from '../../../core/types.js';
2
+ import { type ToolEnv } from '../tool-env.js';
3
3
  /**
4
4
  * After every toolchain is installed: points VS Code at the sandbox's own JDK, Python, Go, compilers, .NET, Git and
5
5
  * terminals (user settings; only the keys this tool manages are changed, your own stay), and installs the extensions
6
6
  * for the languages in use in the background (they persist, so only new ones are downloaded).
7
7
  */
8
- export declare const configureVscode: (tools: {
8
+ export declare function configureVscode(tools: {
9
9
  vars: Record<string, string>;
10
10
  prepend: string[];
11
11
  append: string[];
@@ -13,7 +13,7 @@ export declare const configureVscode: (tools: {
13
13
  }, o: {
14
14
  toolchains: string[];
15
15
  databases: string[];
16
- config: Toolchains["vscode"];
16
+ config: Toolchains['vscode'];
17
17
  workspace: string;
18
- }) => void;
19
- export declare const setupVscode: (env: ToolEnv, refresh: boolean) => Promise<void>;
18
+ }): void;
19
+ export declare function setupVscode(env: ToolEnv, refresh: boolean): Promise<void>;
@@ -5,10 +5,13 @@ import os from 'node:os';
5
5
  import path from 'node:path';
6
6
  import { spawn } from 'node:child_process';
7
7
  import { applyEdits, modify, parse as parseJsonc } from 'jsonc-parser';
8
- import { fetchJson, installArchive } from '../../shared/download.js';
9
- import { SYSTEM } from '../../shared/system.js';
10
- import { dryRun, exists, isWin, log, logsDir, mkdirp, powershell } from '../env.js';
11
- import { arch, tool } from './common.js';
8
+ import { downloader, fetchJson } from '../../../shared/download/index.js';
9
+ import { SYSTEM } from '../../../shared/system.js';
10
+ import { dryRun, isWin, logsDir } from '../../runtime/paths.js';
11
+ import { exists, mkdirp } from '../../runtime/fs.js';
12
+ import { log } from '../../runtime/log.js';
13
+ import { powershell } from '../../runtime/process.js';
14
+ import { arch, tool } from '../tool-env.js';
12
15
  import { EXTENSION_ID, missingExtensions, vscodeExtensions, vscodeSettings } from './vscode-profile.js';
13
16
  /** Newer builds keep their files under a commit-hash folder, so the installed version is recorded here. */
14
17
  const VERSION_MARKER = '.agent-sandbox-version';
@@ -17,7 +20,13 @@ const desktopShortcut = (exe) => {
17
20
  return;
18
21
  const link = path.join(os.homedir(), 'Desktop', 'Visual Studio Code.lnk');
19
22
  const q = (s) => "'" + s.replace(/'/g, "''") + "'";
20
- powershell('$s = (New-Object -ComObject WScript.Shell).CreateShortcut(' + q(link) + '); $s.TargetPath = ' + q(exe) + '; $s.Arguments = ' + q('"' + (process.env.AGENT_WORKSPACE ?? '') + '"') + '; $s.Save()');
23
+ powershell('$s = (New-Object -ComObject WScript.Shell).CreateShortcut(' +
24
+ q(link) +
25
+ '); $s.TargetPath = ' +
26
+ q(exe) +
27
+ '; $s.Arguments = ' +
28
+ q('"' + (process.env.AGENT_WORKSPACE ?? '') + '"') +
29
+ '; $s.Save()');
21
30
  };
22
31
  /** The first of `names` in one of `dirs`. */
23
32
  const findIn = (dirs, ...names) => {
@@ -36,7 +45,9 @@ const recommendedBy = (workspace) => {
36
45
  if (!exists(file) || fs.statSync(file).size > 64 * 1024)
37
46
  return [];
38
47
  const data = parseJsonc(fs.readFileSync(file, 'utf8'));
39
- return Array.isArray(data?.recommendations) ? data.recommendations.filter((r) => typeof r === 'string' && EXTENSION_ID.test(r)).slice(0, 50) : [];
48
+ return Array.isArray(data?.recommendations)
49
+ ? data.recommendations.filter((r) => typeof r === 'string' && EXTENSION_ID.test(r)).slice(0, 50)
50
+ : [];
40
51
  }
41
52
  catch {
42
53
  return [];
@@ -47,7 +58,7 @@ const recommendedBy = (workspace) => {
47
58
  * terminals (user settings; only the keys this tool manages are changed, your own stay), and installs the extensions
48
59
  * for the languages in use in the background (they persist, so only new ones are downloaded).
49
60
  */
50
- export const configureVscode = (tools, o) => {
61
+ export function configureVscode(tools, o) {
51
62
  const root = tool('vscode');
52
63
  const code = path.join(root, 'bin', 'code.cmd');
53
64
  if (dryRun) {
@@ -59,26 +70,51 @@ export const configureVscode = (tools, o) => {
59
70
  const dirs = [...tools.prepend, ...tools.append];
60
71
  const git = findIn([tool('git', 'cmd'), ...dirs], 'git.exe');
61
72
  const settings = vscodeSettings({
62
- javaHome: tools.vars.JAVA_HOME, goRoot: tools.vars.GOROOT, go: findIn(dirs, 'go.exe'), python: findIn(dirs, 'python.exe'), gcc: findIn(dirs, 'gcc.exe'), cl: findIn(dirs, 'cl.exe'),
63
- cmake: findIn(dirs, 'cmake.exe'), dotnet: findIn(dirs, 'dotnet.exe'), node: findIn(dirs, 'node.exe'), pwsh: findIn(dirs, 'pwsh.exe'), git,
64
- bash: git ? findIn([path.join(path.dirname(path.dirname(git)), 'bin')], 'bash.exe') : undefined, php: findIn(dirs, 'php.exe'), ruby: findIn(dirs, 'ruby.exe'), deno: findIn(dirs, 'deno.exe'),
73
+ javaHome: tools.vars.JAVA_HOME,
74
+ goRoot: tools.vars.GOROOT,
75
+ go: findIn(dirs, 'go.exe'),
76
+ python: findIn(dirs, 'python.exe'),
77
+ gcc: findIn(dirs, 'gcc.exe'),
78
+ cl: findIn(dirs, 'cl.exe'),
79
+ cmake: findIn(dirs, 'cmake.exe'),
80
+ dotnet: findIn(dirs, 'dotnet.exe'),
81
+ node: findIn(dirs, 'node.exe'),
82
+ pwsh: findIn(dirs, 'pwsh.exe'),
83
+ git,
84
+ bash: git ? findIn([path.join(path.dirname(path.dirname(git)), 'bin')], 'bash.exe') : undefined,
85
+ php: findIn(dirs, 'php.exe'),
86
+ ruby: findIn(dirs, 'ruby.exe'),
87
+ deno: findIn(dirs, 'deno.exe'),
65
88
  });
66
89
  writeManagedSettings(path.join(root, 'data', 'user-data', 'User', 'settings.json'), path.join(root, 'data', '.agent-sandbox-managed.json'), settings);
67
- const wanted = vscodeExtensions({ toolchains: o.toolchains, databases: o.databases, recommended: o.config.recommended ? recommendedBy(o.workspace) : [], extra: o.config.extensions });
90
+ const wanted = vscodeExtensions({
91
+ toolchains: o.toolchains,
92
+ databases: o.databases,
93
+ recommended: o.config.recommended ? recommendedBy(o.workspace) : [],
94
+ extra: o.config.extensions,
95
+ });
68
96
  let folders = [];
69
97
  try {
70
98
  folders = fs.readdirSync(path.join(root, 'data', 'extensions'));
71
99
  }
72
- catch { /* none yet */ }
100
+ catch {
101
+ /* none yet */
102
+ }
73
103
  const missing = missingExtensions(wanted, folders);
74
- tools.summary.push('vscode: set up for ' + (o.toolchains.join(', ') || 'Node') + (missing.length ? '; installing ' + missing.length + ' extension(s) in the background' : '; extensions ready'));
104
+ tools.summary.push('vscode: set up for ' +
105
+ (o.toolchains.join(', ') || 'Node') +
106
+ (missing.length ? '; installing ' + missing.length + ' extension(s) in the background' : '; extensions ready'));
75
107
  if (!missing.length)
76
108
  return;
77
109
  // In the background: the Marketplace can take a minute, and nothing else waits for it.
78
110
  const logFile = fs.openSync(path.join(logsDir, 'vscode-extensions.log'), 'a');
79
- spawn(SYSTEM.cmd(), ['/d', '/c', code, ...missing.flatMap((id) => ['--install-extension', id])], { detached: true, stdio: ['ignore', logFile, logFile], windowsHide: true }).unref();
111
+ spawn(SYSTEM.cmd(), ['/d', '/c', code, ...missing.flatMap((id) => ['--install-extension', id])], {
112
+ detached: true,
113
+ stdio: ['ignore', logFile, logFile],
114
+ windowsHide: true,
115
+ }).unref();
80
116
  fs.closeSync(logFile);
81
- };
117
+ }
82
118
  /**
83
119
  * Sets `values` in a settings file, keeping everything else (comments too), and removes keys this tool set last time
84
120
  * but no longer has a value for (a toolchain turned off). The keys it manages are remembered in `managedFile`.
@@ -89,7 +125,9 @@ const writeManagedSettings = (file, managedFile, values) => {
89
125
  try {
90
126
  before = JSON.parse(fs.readFileSync(managedFile, 'utf8'));
91
127
  }
92
- catch { /* first time */ }
128
+ catch {
129
+ /* first time */
130
+ }
93
131
  const format = { formattingOptions: { insertSpaces: true, tabSize: 2, eol: '\n' } };
94
132
  for (const key of before.filter((k) => !(k in values))) {
95
133
  if (parseJsonc(text)?.[key] !== undefined)
@@ -101,7 +139,7 @@ const writeManagedSettings = (file, managedFile, values) => {
101
139
  fs.writeFileSync(file, text);
102
140
  fs.writeFileSync(managedFile, JSON.stringify(Object.keys(values)));
103
141
  };
104
- export const setupVscode = async (env, refresh) => {
142
+ export async function setupVscode(env, refresh) {
105
143
  const root = tool('vscode');
106
144
  const exe = path.join(root, 'Code.exe');
107
145
  if (dryRun) {
@@ -109,7 +147,9 @@ export const setupVscode = async (env, refresh) => {
109
147
  return;
110
148
  }
111
149
  if (!exists(exe) || refresh) {
112
- const release = await fetchJson('https://update.code.visualstudio.com/api/update/win32-' + (arch === 'arm64' ? 'arm64' : 'x64') + '-archive/stable/latest');
150
+ const release = await fetchJson('https://update.code.visualstudio.com/api/update/win32-' +
151
+ (arch === 'arm64' ? 'arm64' : 'x64') +
152
+ '-archive/stable/latest');
113
153
  log('Downloading VS Code ' + release.productVersion + ' (~150 MB once) ...');
114
154
  // Keep settings/extensions across a refresh: move the portable data folder aside and back, also when the install
115
155
  // fails (finally). A folder still parked from an interrupted earlier run is the one to keep.
@@ -120,7 +160,11 @@ export const setupVscode = async (env, refresh) => {
120
160
  fs.renameSync(keep, parked);
121
161
  }
122
162
  try {
123
- await installArchive(release.url, root, { sha256: release.sha256hash, locate: 'Code.exe', fileName: 'vscode.zip' });
163
+ await downloader.archive(release.url, root, {
164
+ sha256: release.sha256hash,
165
+ locate: 'Code.exe',
166
+ fileName: 'vscode.zip',
167
+ });
124
168
  fs.writeFileSync(path.join(root, VERSION_MARKER), release.productVersion);
125
169
  }
126
170
  finally {
@@ -134,6 +178,8 @@ export const setupVscode = async (env, refresh) => {
134
178
  mkdirp(path.join(root, 'data'));
135
179
  env.prepend.push(path.join(root, 'bin'));
136
180
  desktopShortcut(exe);
137
- const version = exists(path.join(root, VERSION_MARKER)) ? fs.readFileSync(path.join(root, VERSION_MARKER), 'utf8').trim() : 'installed';
181
+ const version = exists(path.join(root, VERSION_MARKER))
182
+ ? fs.readFileSync(path.join(root, VERSION_MARKER), 'utf8').trim()
183
+ : 'installed';
138
184
  env.summary.push('vscode: ' + version + ' (portable; run code . or use the desktop shortcut)');
139
- };
185
+ }
@@ -0,0 +1,16 @@
1
+ export declare class VersionCache {
2
+ private readonly file;
3
+ /** Set after a network failure: the remaining lookups go straight to the remembered versions. */
4
+ private offline;
5
+ constructor(file?: () => string);
6
+ /**
7
+ * Resolves a version online and remembers it for a day (provisioning.refresh looks again). After a network failure
8
+ * the remaining lookups use the remembered versions instead of each waiting for the network; other errors (no such
9
+ * version) do not.
10
+ */
11
+ resolve(key: string, resolve: () => Promise<string>): Promise<string>;
12
+ private remembered;
13
+ }
14
+ export declare const versionCache: VersionCache;
15
+ /** versionCache.resolve: the version for `key`, looked up at most once a day. */
16
+ export declare function resolveCached(key: string, resolve: () => Promise<string>): Promise<string>;
@@ -0,0 +1,67 @@
1
+ // Versions looked up online, remembered in tools\resolved-versions.json so most boots make no lookups and an offline
2
+ // boot reuses what was installed last time.
3
+ import fs from 'node:fs';
4
+ import { z } from 'zod';
5
+ import { writeJsonAtomic } from '../../shared/io/json.js';
6
+ import { warn } from '../runtime/log.js';
7
+ import { session } from '../runtime/session.js';
8
+ import { toolsDir } from '../runtime/paths.js';
9
+ import { errMsg } from '../../core/util/errors.js';
10
+ import { tool } from './tool-env.js';
11
+ import { readState } from './state-file.js';
12
+ /** A remembered lookup; plain strings are what older versions wrote (treated as stale, still usable offline). */
13
+ const ResolvedSchema = z.record(z.string(), z.union([z.string(), z.strictObject({ value: z.string(), at: z.number() })]));
14
+ /** How long a looked-up version is trusted: boots within a day make no version lookups at all. */
15
+ const FRESH_MS = 24 * 60 * 60 * 1000;
16
+ function isNetworkError(e) {
17
+ return /fetch failed|timed? ?out|aborted|ENOTFOUND|EAI_AGAIN|ECONN|ENETUNREACH|EHOSTUNREACH|HTTP 5\d\d|socket/i.test(errMsg(e) + ' ' + String(e?.cause ?? ''));
18
+ }
19
+ export class VersionCache {
20
+ file;
21
+ /** Set after a network failure: the remaining lookups go straight to the remembered versions. */
22
+ offline = false;
23
+ constructor(file = () => tool('resolved-versions.json')) {
24
+ this.file = file;
25
+ }
26
+ /**
27
+ * Resolves a version online and remembers it for a day (provisioning.refresh looks again). After a network failure
28
+ * the remaining lookups use the remembered versions instead of each waiting for the network; other errors (no such
29
+ * version) do not.
30
+ */
31
+ async resolve(key, resolve) {
32
+ const cached = this.remembered()[key];
33
+ if (cached && (this.offline || (!session.provisioning.refresh && Date.now() - cached.at < FRESH_MS)))
34
+ return cached.value;
35
+ try {
36
+ const value = await resolve();
37
+ fs.mkdirSync(toolsDir, { recursive: true });
38
+ writeJsonAtomic(this.file(), { ...this.remembered(), [key]: { value, at: Date.now() } });
39
+ return value;
40
+ }
41
+ catch (e) {
42
+ if (isNetworkError(e))
43
+ this.offline = true;
44
+ if (!cached)
45
+ throw e;
46
+ warn('Could not look up the latest ' +
47
+ key +
48
+ ' online (' +
49
+ errMsg(e) +
50
+ '); using ' +
51
+ cached.value +
52
+ ' from an earlier start.');
53
+ return cached.value;
54
+ }
55
+ }
56
+ remembered() {
57
+ return Object.fromEntries(Object.entries(readState(this.file(), ResolvedSchema, {})).map(([k, v]) => [
58
+ k,
59
+ typeof v === 'string' ? { value: v, at: 0 } : v,
60
+ ]));
61
+ }
62
+ }
63
+ export const versionCache = new VersionCache();
64
+ /** versionCache.resolve: the version for `key`, looked up at most once a day. */
65
+ export function resolveCached(key, resolve) {
66
+ return versionCache.resolve(key, resolve);
67
+ }
@@ -0,0 +1,13 @@
1
+ import type { Config } from '../../core/types.js';
2
+ export declare const commandsDir: (storageRoot: string) => string;
3
+ export interface AgentCommand {
4
+ harness: string;
5
+ command: string;
6
+ real: string;
7
+ }
8
+ /** cmd.exe expands % and ^ even inside quotes: such paths cannot go into a forwarding file safely. */
9
+ export declare const cmdSafe: (p: string) => boolean;
10
+ /** The agent's own executable on this PC, skipping this tool's forwarding files. */
11
+ export declare const realAgent: (command: string, skipDir: string, pathValue?: string) => string | null;
12
+ /** The agents that get a forwarding command: installed on this PC, and listed (or "auto" = all of them). */
13
+ export declare const agentCommands: (config: Config, storageRoot: string, pathValue?: string) => AgentCommand[];