windows-development-sandbox 1.4.1 → 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 (872) hide show
  1. package/config.example.json +3 -1
  2. package/dist/api.js +27 -16
  3. package/dist/cli/args.d.ts +4 -6
  4. package/dist/cli/args.js +67 -34
  5. package/dist/cli/argv.d.ts +9 -0
  6. package/dist/cli/argv.js +22 -0
  7. package/dist/cli/commands/accounts.d.ts +1 -1
  8. package/dist/cli/commands/accounts.js +42 -27
  9. package/dist/cli/commands/agent-commands.d.ts +3 -3
  10. package/dist/cli/commands/agent-commands.js +27 -18
  11. package/dist/cli/commands/context.d.ts +9 -11
  12. package/dist/cli/commands/context.js +35 -32
  13. package/dist/cli/commands/data/clean.d.ts +2 -2
  14. package/dist/cli/commands/data/clean.js +27 -11
  15. package/dist/cli/commands/data/collect.d.ts +6 -3
  16. package/dist/cli/commands/data/collect.js +46 -15
  17. package/dist/cli/commands/data/index.d.ts +2 -2
  18. package/dist/cli/commands/data/index.js +30 -12
  19. package/dist/cli/commands/data/remove.d.ts +1 -1
  20. package/dist/cli/commands/data/remove.js +4 -4
  21. package/dist/cli/commands/index.d.ts +5 -4
  22. package/dist/cli/commands/index.js +5 -4
  23. package/dist/cli/commands/launch/add-root.d.ts +7 -0
  24. package/dist/cli/commands/launch/add-root.js +64 -0
  25. package/dist/cli/commands/launch/boot-progress.d.ts +7 -0
  26. package/dist/cli/commands/launch/boot-progress.js +48 -0
  27. package/dist/cli/commands/launch/boot-wants.d.ts +11 -0
  28. package/dist/cli/commands/launch/boot-wants.js +48 -0
  29. package/dist/cli/commands/launch/first-start.d.ts +10 -0
  30. package/dist/cli/commands/launch/first-start.js +53 -0
  31. package/dist/cli/commands/launch/index.d.ts +6 -0
  32. package/dist/cli/commands/launch/index.js +6 -0
  33. package/dist/cli/commands/launch/launch.d.ts +8 -0
  34. package/dist/cli/commands/launch/launch.js +211 -0
  35. package/dist/cli/commands/launch/prepare.d.ts +23 -0
  36. package/dist/cli/commands/launch/prepare.js +109 -0
  37. package/dist/cli/commands/launch/running.d.ts +45 -0
  38. package/dist/cli/commands/launch/running.js +218 -0
  39. package/dist/cli/commands/launch/summary.d.ts +8 -0
  40. package/dist/cli/commands/launch/summary.js +98 -0
  41. package/dist/cli/commands/maintenance/audit.d.ts +3 -0
  42. package/dist/cli/commands/maintenance/audit.js +58 -0
  43. package/dist/cli/commands/maintenance/clean.d.ts +2 -0
  44. package/dist/cli/commands/maintenance/clean.js +10 -0
  45. package/dist/cli/commands/maintenance/config.d.ts +2 -0
  46. package/dist/cli/commands/maintenance/config.js +145 -0
  47. package/dist/cli/commands/maintenance/doctor.d.ts +2 -0
  48. package/dist/cli/commands/maintenance/doctor.js +52 -0
  49. package/dist/cli/commands/maintenance/host-claude.d.ts +2 -0
  50. package/dist/cli/commands/maintenance/host-claude.js +4 -0
  51. package/dist/cli/commands/maintenance/index.d.ts +8 -0
  52. package/dist/cli/commands/maintenance/index.js +9 -0
  53. package/dist/cli/commands/maintenance/logs.d.ts +2 -0
  54. package/dist/cli/commands/maintenance/logs.js +44 -0
  55. package/dist/cli/commands/maintenance/sync.d.ts +2 -0
  56. package/dist/cli/commands/maintenance/sync.js +12 -0
  57. package/dist/cli/commands/maintenance/watch.d.ts +3 -0
  58. package/dist/cli/commands/maintenance/watch.js +6 -0
  59. package/dist/cli/commands/projects/describe-sessions.d.ts +3 -0
  60. package/dist/cli/commands/projects/describe-sessions.js +15 -0
  61. package/dist/cli/commands/projects/here.d.ts +38 -0
  62. package/dist/cli/commands/projects/here.js +145 -0
  63. package/dist/cli/commands/projects/index.d.ts +4 -0
  64. package/dist/cli/commands/projects/index.js +4 -0
  65. package/dist/cli/commands/projects/projects.d.ts +14 -0
  66. package/dist/cli/commands/projects/projects.js +213 -0
  67. package/dist/cli/commands/projects/restart.d.ts +15 -0
  68. package/dist/cli/commands/projects/restart.js +149 -0
  69. package/dist/cli/commands/registry.d.ts +3 -0
  70. package/dist/cli/commands/registry.js +34 -0
  71. package/dist/cli/commands/repair/checks.js +105 -29
  72. package/dist/cli/commands/repair/finders.d.ts +13 -10
  73. package/dist/cli/commands/repair/finders.js +63 -43
  74. package/dist/cli/commands/repair/index.d.ts +4 -4
  75. package/dist/cli/commands/repair/index.js +47 -21
  76. package/dist/cli/commands/repair/types.d.ts +2 -2
  77. package/dist/cli/commands/repair/types.js +7 -2
  78. package/dist/cli/commands/sessions/attach.d.ts +2 -0
  79. package/dist/cli/commands/sessions/attach.js +45 -0
  80. package/dist/cli/commands/sessions/control.d.ts +4 -0
  81. package/dist/cli/commands/sessions/control.js +62 -0
  82. package/dist/cli/commands/sessions/exec.d.ts +6 -0
  83. package/dist/cli/commands/sessions/exec.js +72 -0
  84. package/dist/cli/commands/sessions/index.d.ts +6 -0
  85. package/dist/cli/commands/sessions/index.js +9 -0
  86. package/dist/cli/commands/sessions/list.d.ts +15 -0
  87. package/dist/cli/commands/sessions/list.js +65 -0
  88. package/dist/cli/commands/sessions/status.d.ts +2 -0
  89. package/dist/cli/commands/sessions/status.js +153 -0
  90. package/dist/cli/commands/sessions/window.d.ts +3 -0
  91. package/dist/cli/commands/sessions/window.js +18 -0
  92. package/dist/cli/commands/setup/checks.d.ts +4 -4
  93. package/dist/cli/commands/setup/checks.js +36 -19
  94. package/dist/cli/commands/setup/facts.d.ts +6 -6
  95. package/dist/cli/commands/setup/facts.js +23 -11
  96. package/dist/cli/commands/setup/index.d.ts +1 -1
  97. package/dist/cli/commands/setup/index.js +25 -12
  98. package/dist/cli/commands/user-config.d.ts +5 -5
  99. package/dist/cli/commands/user-config.js +14 -12
  100. package/dist/cli/history.d.ts +5 -4
  101. package/dist/cli/history.js +23 -11
  102. package/dist/cli/index.d.ts +4 -14
  103. package/dist/cli/index.js +27 -77
  104. package/dist/cli/manifest.d.ts +464 -10
  105. package/dist/cli/manifest.js +327 -53
  106. package/dist/cli/menu/apps.d.ts +7 -5
  107. package/dist/cli/menu/apps.js +64 -16
  108. package/dist/cli/menu/command-fields.d.ts +15 -0
  109. package/dist/cli/menu/command-fields.js +23 -0
  110. package/dist/cli/menu/command-form.d.ts +3 -5
  111. package/dist/cli/menu/command-form.js +116 -48
  112. package/dist/cli/menu/home.d.ts +22 -0
  113. package/dist/cli/menu/home.js +72 -0
  114. package/dist/cli/menu/index.d.ts +2 -24
  115. package/dist/cli/menu/index.js +4 -178
  116. package/dist/cli/menu/menu.d.ts +23 -0
  117. package/dist/cli/menu/menu.js +185 -0
  118. package/dist/cli/menu/settings/categories.d.ts +2 -2
  119. package/dist/cli/menu/settings/categories.js +123 -20
  120. package/dist/cli/menu/settings/collections/collection-editor.d.ts +23 -0
  121. package/dist/cli/menu/settings/collections/collection-editor.js +89 -0
  122. package/dist/cli/menu/settings/collections/map-editor.d.ts +10 -0
  123. package/dist/cli/menu/settings/collections/map-editor.js +34 -0
  124. package/dist/cli/menu/settings/collections/object-list-editor.d.ts +10 -0
  125. package/dist/cli/menu/settings/collections/object-list-editor.js +23 -0
  126. package/dist/cli/menu/settings/collections/object-map-editor.d.ts +10 -0
  127. package/dist/cli/menu/settings/collections/object-map-editor.js +35 -0
  128. package/dist/cli/menu/settings/collections/string-list-editor.d.ts +12 -0
  129. package/dist/cli/menu/settings/collections/string-list-editor.js +39 -0
  130. package/dist/cli/menu/settings/config-file.d.ts +2 -2
  131. package/dist/cli/menu/settings/config-file.js +42 -19
  132. package/dist/cli/menu/settings/editor-actions.d.ts +2 -0
  133. package/dist/cli/menu/settings/editor-actions.js +2 -0
  134. package/dist/cli/menu/settings/format.d.ts +5 -0
  135. package/dist/cli/menu/settings/format.js +39 -0
  136. package/dist/cli/menu/settings/index.d.ts +1 -29
  137. package/dist/cli/menu/settings/index.js +1 -133
  138. package/dist/cli/menu/settings/object-editor.d.ts +12 -0
  139. package/dist/cli/menu/settings/object-editor.js +86 -0
  140. package/dist/cli/menu/settings/schema-node.d.ts +3 -1
  141. package/dist/cli/menu/settings/schema-node.js +71 -24
  142. package/dist/cli/menu/settings/settings-editor.d.ts +30 -0
  143. package/dist/cli/menu/settings/settings-editor.js +176 -0
  144. package/dist/cli/menu/settings/{editors.d.ts → value-editor.d.ts} +2 -13
  145. package/dist/cli/menu/settings/value-editor.js +137 -0
  146. package/dist/cli/menu/several.d.ts +4 -4
  147. package/dist/cli/menu/several.js +61 -20
  148. package/dist/cli/{colors.d.ts → output/colors.d.ts} +8 -8
  149. package/dist/cli/{colors.js → output/colors.js} +32 -14
  150. package/dist/cli/output/index.d.ts +3 -0
  151. package/dist/cli/output/index.js +3 -0
  152. package/dist/cli/output/print.d.ts +5 -0
  153. package/dist/cli/output/print.js +14 -0
  154. package/dist/cli/{progress.d.ts → output/progress.d.ts} +5 -5
  155. package/dist/cli/{progress.js → output/progress.js} +42 -19
  156. package/dist/cli/report.d.ts +2 -0
  157. package/dist/cli/report.js +20 -0
  158. package/dist/cli/tui/app.d.ts +6 -16
  159. package/dist/cli/tui/app.js +28 -8
  160. package/dist/cli/tui/dialogs/confirm-screen.d.ts +20 -0
  161. package/dist/cli/tui/dialogs/confirm-screen.js +50 -0
  162. package/dist/cli/tui/dialogs/message-screen.d.ts +17 -0
  163. package/dist/cli/tui/dialogs/message-screen.js +55 -0
  164. package/dist/cli/tui/dialogs/paragraphs.d.ts +2 -0
  165. package/dist/cli/tui/dialogs/paragraphs.js +5 -0
  166. package/dist/cli/tui/dialogs/text-screen.d.ts +26 -0
  167. package/dist/cli/tui/dialogs/text-screen.js +107 -0
  168. package/dist/cli/tui/frame.js +3 -1
  169. package/dist/cli/tui/index.d.ts +7 -3
  170. package/dist/cli/tui/index.js +4 -2
  171. package/dist/cli/tui/list/list-screen.d.ts +29 -0
  172. package/dist/cli/tui/{list-screen.js → list/list-screen.js} +86 -23
  173. package/dist/cli/tui/{list-screen.d.ts → list/list-types.d.ts} +0 -28
  174. package/dist/cli/tui/screen.d.ts +14 -0
  175. package/dist/cli/tui/terminal.js +34 -10
  176. package/dist/cli/tui/text.d.ts +2 -1
  177. package/dist/cli/tui/text.js +37 -7
  178. package/dist/cli/tui/theme.js +27 -9
  179. package/dist/cli/validate.d.ts +8 -8
  180. package/dist/cli/validate.js +32 -21
  181. package/dist/core/config/defaults.d.ts +2 -0
  182. package/dist/core/config/defaults.js +203 -0
  183. package/dist/core/config/index.d.ts +2 -0
  184. package/dist/core/config/index.js +3 -0
  185. package/dist/core/{config.d.ts → config/loader.d.ts} +1 -2
  186. package/dist/core/config/loader.js +47 -0
  187. package/dist/core/{detect-databases.js → detect/databases.js} +111 -23
  188. package/dist/core/detect/index.d.ts +4 -0
  189. package/dist/core/detect/index.js +4 -0
  190. package/dist/core/{detect-pwsh.d.ts → detect/pwsh.d.ts} +1 -1
  191. package/dist/core/{detect-pwsh.js → detect/pwsh.js} +25 -11
  192. package/dist/core/{detect-toolchains.d.ts → detect/toolchains.d.ts} +1 -1
  193. package/dist/core/{detect-toolchains.js → detect/toolchains.js} +42 -5
  194. package/dist/{guest/toolchains → core/detect}/versions.js +28 -12
  195. package/dist/core/disk.d.ts +2 -0
  196. package/dist/core/disk.js +46 -3
  197. package/dist/core/local-config/boot-wants.d.ts +45 -0
  198. package/dist/core/local-config/boot-wants.js +120 -0
  199. package/dist/core/local-config/file.d.ts +3 -0
  200. package/dist/core/local-config/file.js +16 -0
  201. package/dist/core/local-config/index.d.ts +5 -0
  202. package/dist/core/local-config/index.js +7 -0
  203. package/dist/core/{local-config.d.ts → local-config/overrides.d.ts} +3 -18
  204. package/dist/core/{local-config.js → local-config/overrides.js} +45 -52
  205. package/dist/core/local-config/policy.d.ts +19 -0
  206. package/dist/core/local-config/policy.js +45 -0
  207. package/dist/core/local-config/trust.d.ts +13 -0
  208. package/dist/core/local-config/trust.js +43 -0
  209. package/dist/core/package-info.d.ts +4 -0
  210. package/dist/core/package-info.js +13 -0
  211. package/dist/core/run/guest-workspace.d.ts +23 -0
  212. package/dist/core/run/guest-workspace.js +47 -0
  213. package/dist/core/run/index.d.ts +3 -0
  214. package/dist/core/run/index.js +3 -0
  215. package/dist/core/run/resolve-run.d.ts +3 -0
  216. package/dist/core/run/resolve-run.js +202 -0
  217. package/dist/core/run/versions.d.ts +13 -0
  218. package/dist/core/run/versions.js +65 -0
  219. package/dist/core/safe-paths.js +17 -5
  220. package/dist/core/schema/apps.d.ts +4 -4
  221. package/dist/core/schema/apps.js +55 -21
  222. package/dist/core/schema/common.d.ts +13 -10
  223. package/dist/core/schema/common.js +16 -10
  224. package/dist/core/schema/config.d.ts +15 -10
  225. package/dist/core/schema/config.js +78 -53
  226. package/dist/core/schema/databases.d.ts +4 -3
  227. package/dist/core/schema/databases.js +16 -12
  228. package/dist/core/schema/harness.d.ts +1 -1
  229. package/dist/core/schema/harness.js +17 -7
  230. package/dist/core/schema/index.d.ts +6 -0
  231. package/dist/core/schema/index.js +8 -0
  232. package/dist/core/schema/json-schema.js +10 -5
  233. package/dist/core/schema/profile.d.ts +4 -4
  234. package/dist/core/schema/profile.js +37 -17
  235. package/dist/core/schema/projects.d.ts +1 -1
  236. package/dist/core/schema/projects.js +16 -6
  237. package/dist/core/schema/sandbox.d.ts +11 -11
  238. package/dist/core/schema/sandbox.js +101 -37
  239. package/dist/core/schema/toolchains.d.ts +6 -1
  240. package/dist/core/schema/toolchains.js +84 -34
  241. package/dist/core/types.d.ts +19 -9
  242. package/dist/core/util/errors.d.ts +8 -0
  243. package/dist/core/util/errors.js +14 -0
  244. package/dist/core/util/fs.d.ts +8 -0
  245. package/dist/core/util/fs.js +40 -0
  246. package/dist/core/util/index.d.ts +7 -0
  247. package/dist/core/util/index.js +7 -0
  248. package/dist/core/util/jsonc.d.ts +6 -0
  249. package/dist/core/util/jsonc.js +25 -0
  250. package/dist/core/util/links.d.ts +10 -0
  251. package/dist/core/util/links.js +39 -0
  252. package/dist/core/util/paths.d.ts +7 -0
  253. package/dist/core/util/paths.js +33 -0
  254. package/dist/core/util/process.d.ts +15 -0
  255. package/dist/core/util/process.js +54 -0
  256. package/dist/core/util/text.d.ts +8 -0
  257. package/dist/core/util/text.js +8 -0
  258. package/dist/guest/{setup/agents.js → agents/agent-installer.js} +24 -4
  259. package/dist/guest/apps/after-install.d.ts +3 -0
  260. package/dist/guest/apps/after-install.js +47 -0
  261. package/dist/guest/apps/app-installer.d.ts +22 -0
  262. package/dist/guest/apps/app-installer.js +116 -0
  263. package/dist/guest/apps/find-exe.d.ts +5 -0
  264. package/dist/guest/apps/find-exe.js +41 -0
  265. package/dist/guest/apps/index.d.ts +3 -10
  266. package/dist/guest/apps/index.js +6 -206
  267. package/dist/guest/apps/resolvers.js +37 -9
  268. package/dist/guest/apps/shortcuts.d.ts +6 -0
  269. package/dist/guest/apps/shortcuts.js +28 -0
  270. package/dist/guest/apps/sources.d.ts +4 -0
  271. package/dist/guest/apps/sources.js +17 -0
  272. package/dist/guest/apps/unpack.d.ts +3 -0
  273. package/dist/guest/apps/unpack.js +47 -0
  274. package/dist/guest/{audit-parse.js → audit/parse.js} +39 -3
  275. package/dist/guest/{audit.d.ts → audit/process-audit.d.ts} +3 -1
  276. package/dist/guest/{audit.js → audit/process-audit.js} +33 -8
  277. package/dist/guest/boot/boot-env.d.ts +4 -0
  278. package/dist/guest/{boot-env.js → boot/boot-env.js} +7 -5
  279. package/dist/guest/boot/boot.d.ts +1 -0
  280. package/dist/guest/{main.js → boot/boot.js} +96 -50
  281. package/dist/guest/{guide.js → boot/guide.js} +32 -7
  282. package/dist/guest/{project-env.d.ts → boot/project-env.d.ts} +3 -3
  283. package/dist/guest/{project-env.js → boot/project-env.js} +12 -4
  284. package/dist/guest/boot/project-status.d.ts +5 -0
  285. package/dist/guest/boot/project-status.js +28 -0
  286. package/dist/guest/daemon/daemon.d.ts +1 -0
  287. package/dist/guest/daemon/daemon.js +51 -0
  288. package/dist/guest/daemon/exec.js +18 -6
  289. package/dist/guest/daemon/{shutdown.js → idle-shutdown.js} +5 -4
  290. package/dist/guest/daemon/{project.d.ts → project-provisioner.d.ts} +3 -3
  291. package/dist/guest/daemon/{project.js → project-provisioner.js} +60 -22
  292. package/dist/guest/daemon/relays.js +5 -3
  293. package/dist/guest/daemon/{session.js → sessions.js} +84 -24
  294. package/dist/guest/daemon/state.d.ts +4 -1
  295. package/dist/guest/daemon/state.js +34 -20
  296. package/dist/guest/databases/database-server.d.ts +13 -0
  297. package/dist/guest/databases/database-server.js +35 -0
  298. package/dist/guest/databases/dynamodb.d.ts +12 -0
  299. package/dist/guest/databases/dynamodb.js +81 -0
  300. package/dist/guest/databases/index.d.ts +2 -0
  301. package/dist/guest/databases/index.js +2 -0
  302. package/dist/guest/databases/mongodb.d.ts +7 -0
  303. package/dist/guest/databases/mongodb.js +46 -0
  304. package/dist/guest/databases/mysql.d.ts +7 -0
  305. package/dist/guest/databases/mysql.js +59 -0
  306. package/dist/guest/databases/names.d.ts +5 -0
  307. package/dist/guest/databases/names.js +8 -0
  308. package/dist/guest/databases/postgres.d.ts +9 -0
  309. package/dist/guest/databases/postgres.js +85 -0
  310. package/dist/guest/databases/redis.d.ts +7 -0
  311. package/dist/guest/databases/redis.js +25 -0
  312. package/dist/guest/databases/registry.d.ts +5 -0
  313. package/dist/guest/databases/registry.js +51 -0
  314. package/dist/guest/databases/sbx-db.d.ts +1 -0
  315. package/dist/guest/{db.js → databases/sbx-db.js} +13 -13
  316. package/dist/guest/{toolchains/databases → databases}/server.d.ts +5 -5
  317. package/dist/guest/{toolchains/databases → databases}/server.js +18 -13
  318. package/dist/guest/entries/daemon.js +16 -0
  319. package/dist/guest/entries/db.js +10 -0
  320. package/dist/guest/entries/gitguard.js +20 -0
  321. package/dist/guest/entries/main.d.ts +1 -0
  322. package/dist/guest/entries/main.js +24 -0
  323. package/dist/guest/entries/netproxy.d.ts +1 -0
  324. package/dist/guest/entries/netproxy.js +7 -0
  325. package/dist/guest/entries/view.d.ts +1 -0
  326. package/dist/guest/entries/view.js +11 -0
  327. package/dist/guest/{gitguard.js → git/decision.js} +49 -26
  328. package/dist/guest/network/addresses.d.ts +2 -0
  329. package/dist/guest/network/addresses.js +6 -0
  330. package/dist/guest/{setup/network.d.ts → network/allow-only.d.ts} +0 -10
  331. package/dist/guest/network/allow-only.js +84 -0
  332. package/dist/guest/network/firewall.d.ts +9 -0
  333. package/dist/guest/{setup/network.js → network/firewall.js} +58 -63
  334. package/dist/guest/network/proxy-server.d.ts +2 -0
  335. package/dist/guest/{netproxy.js → network/proxy-server.js} +37 -18
  336. package/dist/guest/{helpers.d.ts → runtime/csc.d.ts} +1 -1
  337. package/dist/guest/{helpers.js → runtime/csc.js} +7 -2
  338. package/dist/guest/runtime/fs.d.ts +2 -0
  339. package/dist/guest/runtime/fs.js +6 -0
  340. package/dist/guest/runtime/log.d.ts +3 -0
  341. package/dist/guest/runtime/log.js +22 -0
  342. package/dist/guest/runtime/paths.d.ts +13 -0
  343. package/dist/guest/runtime/paths.js +14 -0
  344. package/dist/guest/{ports.js → runtime/ports.js} +8 -2
  345. package/dist/guest/runtime/process.d.ts +15 -0
  346. package/dist/guest/runtime/process.js +59 -0
  347. package/dist/guest/{project-context.js → runtime/project-context.js} +1 -1
  348. package/dist/guest/runtime/session.d.ts +5 -0
  349. package/dist/guest/runtime/session.js +10 -0
  350. package/dist/guest/runtime/status.d.ts +7 -0
  351. package/dist/guest/runtime/status.js +57 -0
  352. package/dist/guest/{cmdline.js → sessions/cmdline.js} +10 -4
  353. package/dist/guest/{ptyhost.js → sessions/pty-host.js} +12 -5
  354. package/dist/guest/{view.js → sessions/viewer.js} +8 -11
  355. package/dist/guest/setup/claude-mem.d.ts +10 -0
  356. package/dist/guest/setup/{claude.js → claude-mem.js} +18 -78
  357. package/dist/guest/setup/{claude.d.ts → claude-profile.d.ts} +0 -10
  358. package/dist/guest/setup/claude-profile.js +89 -0
  359. package/dist/guest/setup/desktop.d.ts +2 -0
  360. package/dist/guest/setup/desktop.js +32 -0
  361. package/dist/guest/setup/environment.js +28 -5
  362. package/dist/guest/setup/{user.d.ts → git-identity.d.ts} +0 -2
  363. package/dist/guest/setup/git-identity.js +34 -0
  364. package/dist/guest/{gitrules.d.ts → setup/git-rules.d.ts} +1 -1
  365. package/dist/guest/setup/git-rules.js +50 -0
  366. package/dist/guest/setup/hooks.js +22 -5
  367. package/dist/guest/setup/{policy.js → managed-policy.js} +2 -2
  368. package/dist/guest/toolchains/catalogue.d.ts +4 -4
  369. package/dist/guest/toolchains/catalogue.js +30 -7
  370. package/dist/guest/toolchains/detect.d.ts +12 -0
  371. package/dist/guest/toolchains/detect.js +54 -0
  372. package/dist/guest/toolchains/index.d.ts +3 -17
  373. package/dist/guest/toolchains/index.js +1 -106
  374. package/dist/guest/toolchains/install.d.ts +20 -0
  375. package/dist/guest/toolchains/install.js +29 -0
  376. package/dist/guest/toolchains/languages/go.d.ts +3 -0
  377. package/dist/guest/toolchains/{go.js → languages/go.js} +27 -9
  378. package/dist/guest/toolchains/languages/java.d.ts +8 -0
  379. package/dist/guest/toolchains/{java.js → languages/java.js} +57 -18
  380. package/dist/guest/toolchains/languages/node.d.ts +3 -0
  381. package/dist/guest/toolchains/{node.js → languages/node.js} +51 -18
  382. package/dist/guest/toolchains/languages/php.d.ts +3 -0
  383. package/dist/guest/toolchains/{scripting → languages}/php.js +36 -11
  384. package/dist/guest/toolchains/languages/python-tools.d.ts +3 -0
  385. package/dist/guest/toolchains/languages/python-tools.js +12 -0
  386. package/dist/guest/toolchains/languages/python.d.ts +3 -0
  387. package/dist/guest/toolchains/{python.js → languages/python.js} +29 -16
  388. package/dist/guest/toolchains/languages/ruby.d.ts +3 -0
  389. package/dist/guest/toolchains/{scripting → languages}/ruby.js +28 -10
  390. package/dist/guest/toolchains/leftovers.d.ts +1 -1
  391. package/dist/guest/toolchains/leftovers.js +13 -11
  392. package/dist/guest/toolchains/managers.d.ts +6 -6
  393. package/dist/guest/toolchains/managers.js +38 -17
  394. package/dist/guest/toolchains/native/binstall.d.ts +3 -2
  395. package/dist/guest/toolchains/native/binstall.js +20 -8
  396. package/dist/guest/toolchains/native/cpp.d.ts +2 -2
  397. package/dist/guest/toolchains/native/cpp.js +23 -8
  398. package/dist/guest/toolchains/native/dotnet.d.ts +5 -3
  399. package/dist/guest/toolchains/native/dotnet.js +72 -24
  400. package/dist/guest/toolchains/native/mesa.d.ts +2 -2
  401. package/dist/guest/toolchains/native/mesa.js +27 -10
  402. package/dist/guest/toolchains/native/msvc/environment.d.ts +4 -4
  403. package/dist/guest/toolchains/native/msvc/environment.js +30 -16
  404. package/dist/guest/toolchains/native/msvc/index.d.ts +3 -3
  405. package/dist/guest/toolchains/native/msvc/index.js +10 -8
  406. package/dist/guest/toolchains/native/msvc/packages.d.ts +1 -1
  407. package/dist/guest/toolchains/native/msvc/packages.js +69 -23
  408. package/dist/guest/toolchains/native/msvc/tree.d.ts +6 -6
  409. package/dist/guest/toolchains/native/msvc/tree.js +15 -9
  410. package/dist/guest/toolchains/native/rust-extras.d.ts +23 -0
  411. package/dist/guest/toolchains/native/rust-extras.js +100 -0
  412. package/dist/guest/toolchains/native/rust.d.ts +2 -2
  413. package/dist/guest/toolchains/native/rust.js +41 -10
  414. package/dist/guest/toolchains/{scripting → native}/vcruntime.d.ts +2 -2
  415. package/dist/guest/toolchains/{scripting → native}/vcruntime.js +17 -7
  416. package/dist/guest/toolchains/package-ledger.d.ts +17 -0
  417. package/dist/guest/toolchains/package-ledger.js +54 -0
  418. package/dist/guest/toolchains/plan.d.ts +3 -24
  419. package/dist/guest/toolchains/plan.js +99 -111
  420. package/dist/guest/toolchains/runtimes.d.ts +6 -6
  421. package/dist/guest/toolchains/runtimes.js +31 -13
  422. package/dist/guest/toolchains/scheduler.d.ts +22 -0
  423. package/dist/guest/toolchains/scheduler.js +123 -0
  424. package/dist/guest/toolchains/setup.d.ts +10 -0
  425. package/dist/guest/toolchains/setup.js +22 -0
  426. package/dist/guest/toolchains/state-file.d.ts +3 -0
  427. package/dist/guest/toolchains/state-file.js +10 -0
  428. package/dist/guest/toolchains/step.d.ts +24 -0
  429. package/dist/guest/toolchains/step.js +1 -0
  430. package/dist/guest/toolchains/tool-env.d.ts +12 -0
  431. package/dist/guest/toolchains/tool-env.js +16 -0
  432. package/dist/guest/toolchains/tools/cli.d.ts +10 -0
  433. package/dist/guest/toolchains/{cli.js → tools/cli.js} +35 -15
  434. package/dist/guest/toolchains/tools/git.d.ts +3 -0
  435. package/dist/guest/toolchains/{git.js → tools/git.js} +38 -15
  436. package/dist/guest/toolchains/tools/pwsh.d.ts +4 -0
  437. package/dist/guest/toolchains/{pwsh.js → tools/pwsh.js} +14 -7
  438. package/dist/guest/toolchains/{vscode-profile.d.ts → tools/vscode-profile.d.ts} +6 -6
  439. package/dist/guest/toolchains/{vscode-profile.js → tools/vscode-profile.js} +28 -12
  440. package/dist/guest/toolchains/{vscode.d.ts → tools/vscode.d.ts} +6 -6
  441. package/dist/guest/toolchains/{vscode.js → tools/vscode.js} +67 -21
  442. package/dist/guest/toolchains/version-cache.d.ts +16 -0
  443. package/dist/guest/toolchains/version-cache.js +67 -0
  444. package/dist/host/agent-commands/commands.d.ts +13 -0
  445. package/dist/host/agent-commands/commands.js +33 -0
  446. package/dist/host/agent-commands/forwarders.d.ts +7 -0
  447. package/dist/host/agent-commands/forwarders.js +31 -0
  448. package/dist/host/agent-commands/index.d.ts +4 -0
  449. package/dist/host/agent-commands/index.js +4 -0
  450. package/dist/host/agent-commands/reconcile.d.ts +12 -0
  451. package/dist/host/agent-commands/reconcile.js +69 -0
  452. package/dist/host/agent-commands/user-path.d.ts +2 -0
  453. package/dist/host/agent-commands/user-path.js +33 -0
  454. package/dist/host/audit/collect.d.ts +2 -2
  455. package/dist/host/audit/collect.js +59 -22
  456. package/dist/host/audit/log.d.ts +2 -2
  457. package/dist/host/audit/log.js +24 -8
  458. package/dist/host/{attach.d.ts → channel/attach.d.ts} +2 -2
  459. package/dist/host/{attach.js → channel/attach.js} +33 -15
  460. package/dist/host/channel/channel.d.ts +51 -0
  461. package/dist/host/channel/channel.js +196 -0
  462. package/dist/host/channel/index.d.ts +2 -0
  463. package/dist/host/channel/index.js +2 -0
  464. package/dist/host/guard/agent-files.d.ts +7 -0
  465. package/dist/host/guard/agent-files.js +103 -0
  466. package/dist/host/guard/commands.d.ts +10 -0
  467. package/dist/host/guard/commands.js +123 -0
  468. package/dist/host/guard/file-hash.d.ts +4 -0
  469. package/dist/host/guard/file-hash.js +37 -0
  470. package/dist/host/guard/git-config.d.ts +5 -0
  471. package/dist/host/guard/git-config.js +62 -0
  472. package/dist/host/guard/git-dirs.d.ts +12 -0
  473. package/dist/host/guard/git-dirs.js +53 -0
  474. package/dist/host/guard/index.d.ts +5 -0
  475. package/dist/host/guard/index.js +4 -0
  476. package/dist/host/guard/mark-of-the-web.d.ts +8 -0
  477. package/dist/host/guard/mark-of-the-web.js +74 -0
  478. package/dist/host/guard/nested-repos.d.ts +14 -0
  479. package/dist/host/guard/nested-repos.js +88 -0
  480. package/dist/host/guard/quarantine.d.ts +3 -0
  481. package/dist/host/guard/quarantine.js +24 -0
  482. package/dist/host/guard/repo-guard.d.ts +10 -0
  483. package/dist/host/guard/repo-guard.js +36 -0
  484. package/dist/host/guard/store.d.ts +40 -0
  485. package/dist/host/guard/store.js +145 -0
  486. package/dist/host/guard/types.d.ts +27 -0
  487. package/dist/host/guard/types.js +3 -0
  488. package/dist/host/guard/watch-state.d.ts +9 -0
  489. package/dist/host/guard/watch-state.js +26 -0
  490. package/dist/host/launch/boot-projects.d.ts +17 -0
  491. package/dist/host/launch/{projects.js → boot-projects.js} +22 -13
  492. package/dist/host/{database-plan.d.ts → launch/database-plan.d.ts} +5 -5
  493. package/dist/host/{database-plan.js → launch/database-plan.js} +24 -13
  494. package/dist/host/launch/generate.d.ts +4 -0
  495. package/dist/host/launch/generate.js +77 -0
  496. package/dist/host/launch/index.d.ts +10 -0
  497. package/dist/host/launch/index.js +10 -0
  498. package/dist/host/launch/mappings.d.ts +5 -5
  499. package/dist/host/launch/mappings.js +37 -24
  500. package/dist/host/launch/pc-scan.d.ts +5 -0
  501. package/dist/host/{pc-scan.js → launch/pc-scan.js} +20 -13
  502. package/dist/host/launch/project-scan.d.ts +7 -0
  503. package/dist/host/{project-scan.js → launch/project-scan.js} +29 -21
  504. package/dist/host/launch/session-file.d.ts +23 -0
  505. package/dist/host/launch/session-file.js +73 -0
  506. package/dist/host/launch/stage.d.ts +5 -5
  507. package/dist/host/launch/stage.js +14 -13
  508. package/dist/host/launch/toolchains.d.ts +4 -0
  509. package/dist/host/launch/toolchains.js +11 -0
  510. package/dist/host/launch/{wsb.d.ts → wsb-file.d.ts} +4 -2
  511. package/dist/host/launch/wsb-file.js +56 -0
  512. package/dist/host/life/crash-report.d.ts +8 -0
  513. package/dist/host/life/crash-report.js +87 -0
  514. package/dist/host/life/index.d.ts +6 -0
  515. package/dist/host/life/index.js +6 -0
  516. package/dist/host/life/keep-awake.d.ts +10 -0
  517. package/dist/host/life/keep-awake.js +29 -0
  518. package/dist/host/life/life-record.d.ts +48 -0
  519. package/dist/host/life/life-record.js +76 -0
  520. package/dist/host/life/stop-events.d.ts +27 -0
  521. package/dist/host/life/stop-events.js +96 -0
  522. package/dist/host/life/stop-warning.d.ts +4 -0
  523. package/dist/host/life/stop-warning.js +25 -0
  524. package/dist/host/life/windows-update.d.ts +3 -0
  525. package/dist/host/life/windows-update.js +11 -0
  526. package/dist/host/native.d.ts +4 -0
  527. package/dist/host/native.js +11 -0
  528. package/dist/host/network/index.d.ts +1 -0
  529. package/dist/host/network/index.js +1 -0
  530. package/dist/host/{port-forward.d.ts → network/port-forward.d.ts} +1 -1
  531. package/dist/host/{port-forward.js → network/port-forward.js} +16 -10
  532. package/dist/host/profile/accounts.d.ts +37 -0
  533. package/dist/host/profile/accounts.js +146 -0
  534. package/dist/host/profile/claude-login.d.ts +22 -0
  535. package/dist/host/profile/claude-login.js +57 -0
  536. package/dist/host/{claude-profile.d.ts → profile/claude-profile.d.ts} +9 -9
  537. package/dist/host/{claude-profile.js → profile/claude-profile.js} +32 -22
  538. package/dist/host/profile/index.d.ts +7 -0
  539. package/dist/host/profile/index.js +7 -0
  540. package/dist/host/profile/personalize.d.ts +2 -0
  541. package/dist/host/profile/personalize.js +127 -0
  542. package/dist/host/profile/reg-file.d.ts +8 -0
  543. package/dist/host/profile/reg-file.js +45 -0
  544. package/dist/host/profile/secret-files.d.ts +2 -0
  545. package/dist/host/profile/secret-files.js +25 -0
  546. package/dist/host/profile/secret-patterns.d.ts +6 -0
  547. package/dist/host/profile/secret-patterns.js +128 -0
  548. package/dist/host/profile/secrets.d.ts +12 -0
  549. package/dist/host/profile/secrets.js +100 -0
  550. package/dist/host/projects/index.d.ts +4 -0
  551. package/dist/host/projects/index.js +4 -0
  552. package/dist/host/{join.d.ts → projects/join.d.ts} +12 -9
  553. package/dist/host/{join.js → projects/join.js} +62 -33
  554. package/dist/host/projects/known.d.ts +28 -0
  555. package/dist/host/projects/known.js +55 -0
  556. package/dist/host/projects/mapper.d.ts +29 -0
  557. package/dist/host/projects/mapper.js +88 -0
  558. package/dist/host/projects/registry.d.ts +83 -0
  559. package/dist/host/projects/registry.js +136 -0
  560. package/dist/host/sandbox/doctor.d.ts +2 -0
  561. package/dist/host/sandbox/doctor.js +42 -0
  562. package/dist/host/sandbox/host-claude.d.ts +1 -0
  563. package/dist/host/sandbox/host-claude.js +26 -0
  564. package/dist/host/sandbox/index.d.ts +6 -0
  565. package/dist/host/sandbox/index.js +6 -0
  566. package/dist/host/{platform.d.ts → sandbox/platform.d.ts} +0 -5
  567. package/dist/host/sandbox/platform.js +60 -0
  568. package/dist/host/sandbox/probe.d.ts +3 -0
  569. package/dist/host/sandbox/probe.js +47 -0
  570. package/dist/host/{window.js → sandbox/window.js} +7 -5
  571. package/dist/host/{wsb.js → sandbox/wsb-cli.js} +31 -8
  572. package/dist/host/{cleanup.js → storage/cleanup.js} +27 -12
  573. package/dist/host/storage/index.d.ts +2 -0
  574. package/dist/host/storage/index.js +2 -0
  575. package/dist/host/storage/state-files.d.ts +4 -0
  576. package/dist/host/storage/state-files.js +10 -0
  577. package/dist/host/test-guard.js +1 -1
  578. package/dist/host/tools/conpty.d.ts +8 -0
  579. package/dist/host/tools/conpty.js +58 -0
  580. package/dist/host/tools/index.d.ts +2 -0
  581. package/dist/host/tools/index.js +2 -0
  582. package/dist/host/{terminal.d.ts → tools/windows-terminal.d.ts} +2 -10
  583. package/dist/host/{terminal.js → tools/windows-terminal.js} +33 -57
  584. package/dist/host/workspace-view/active-views.d.ts +3 -0
  585. package/dist/host/workspace-view/active-views.js +22 -0
  586. package/dist/host/workspace-view/index.d.ts +2 -18
  587. package/dist/host/workspace-view/index.js +2 -49
  588. package/dist/host/workspace-view/plan.d.ts +16 -0
  589. package/dist/host/workspace-view/plan.js +50 -0
  590. package/dist/host/workspace-view/rules.js +10 -3
  591. package/dist/host/workspace-view/view-state.d.ts +10 -0
  592. package/dist/host/workspace-view/view-state.js +31 -0
  593. package/dist/host/workspace-view/view.d.ts +1 -0
  594. package/dist/host/workspace-view/view.js +51 -55
  595. package/dist/runtime/daemon.js +4220 -1968
  596. package/dist/runtime/db.js +2134 -849
  597. package/dist/runtime/gitguard.js +29 -11
  598. package/dist/runtime/main.js +4687 -2243
  599. package/dist/runtime/netproxy.js +1644 -420
  600. package/dist/runtime/view.js +1356 -428
  601. package/dist/selftest/accounts.test.d.ts +1 -1
  602. package/dist/selftest/accounts.test.js +20 -17
  603. package/dist/selftest/agent-commands.test.d.ts +1 -1
  604. package/dist/selftest/agent-commands.test.js +9 -5
  605. package/dist/selftest/audit.test.d.ts +1 -1
  606. package/dist/selftest/audit.test.js +46 -13
  607. package/dist/selftest/channel.test.d.ts +1 -1
  608. package/dist/selftest/channel.test.js +63 -16
  609. package/dist/selftest/cli.test.d.ts +1 -1
  610. package/dist/selftest/cli.test.js +68 -16
  611. package/dist/selftest/cmdline.test.d.ts +1 -1
  612. package/dist/selftest/cmdline.test.js +36 -7
  613. package/dist/selftest/config.test.d.ts +1 -1
  614. package/dist/selftest/config.test.js +12 -5
  615. package/dist/selftest/data.test.d.ts +1 -1
  616. package/dist/selftest/data.test.js +35 -6
  617. package/dist/selftest/detect.test.d.ts +1 -1
  618. package/dist/selftest/detect.test.js +22 -9
  619. package/dist/selftest/generate.test.d.ts +1 -1
  620. package/dist/selftest/generate.test.js +33 -9
  621. package/dist/selftest/git-access.test.d.ts +1 -1
  622. package/dist/selftest/git-access.test.js +42 -4
  623. package/dist/selftest/guest-boot.test.d.ts +1 -1
  624. package/dist/selftest/guest-boot.test.js +25 -7
  625. package/dist/selftest/host-sim.test.d.ts +1 -1
  626. package/dist/selftest/host-sim.test.js +27 -3
  627. package/dist/selftest/hostile-input.test.d.ts +1 -1
  628. package/dist/selftest/hostile-input.test.js +5 -5
  629. package/dist/selftest/index.d.ts +1 -1
  630. package/dist/selftest/index.js +72 -16
  631. package/dist/selftest/layout.test.d.ts +2 -0
  632. package/dist/selftest/layout.test.js +131 -0
  633. package/dist/selftest/links.test.d.ts +1 -1
  634. package/dist/selftest/links.test.js +16 -11
  635. package/dist/selftest/live-daemon.test.d.ts +1 -1
  636. package/dist/selftest/live-daemon.test.js +20 -8
  637. package/dist/selftest/live-git.test.d.ts +1 -1
  638. package/dist/selftest/live-git.test.js +13 -4
  639. package/dist/selftest/live-network.test.d.ts +1 -1
  640. package/dist/selftest/live-network.test.js +24 -9
  641. package/dist/selftest/live-projects.test.d.ts +1 -1
  642. package/dist/selftest/live-projects.test.js +47 -20
  643. package/dist/selftest/live-terminal.test.d.ts +1 -1
  644. package/dist/selftest/live-terminal.test.js +41 -15
  645. package/dist/selftest/local-config.test.d.ts +1 -1
  646. package/dist/selftest/local-config.test.js +64 -16
  647. package/dist/selftest/mirror.test.d.ts +1 -1
  648. package/dist/selftest/mirror.test.js +102 -32
  649. package/dist/selftest/network.test.d.ts +1 -1
  650. package/dist/selftest/network.test.js +17 -8
  651. package/dist/selftest/personalization.test.d.ts +1 -1
  652. package/dist/selftest/personalization.test.js +12 -5
  653. package/dist/selftest/projects.test.d.ts +1 -1
  654. package/dist/selftest/projects.test.js +280 -85
  655. package/dist/selftest/repair.test.d.ts +1 -1
  656. package/dist/selftest/repair.test.js +17 -5
  657. package/dist/selftest/repo-guard.test.d.ts +1 -1
  658. package/dist/selftest/repo-guard.test.js +21 -20
  659. package/dist/selftest/secrets.test.d.ts +1 -1
  660. package/dist/selftest/secrets.test.js +57 -13
  661. package/dist/selftest/setup.test.d.ts +1 -1
  662. package/dist/selftest/setup.test.js +25 -5
  663. package/dist/selftest/{fixtures.d.ts → support/fixtures.d.ts} +5 -3
  664. package/dist/selftest/{fixtures.js → support/fixtures.js} +95 -17
  665. package/dist/selftest/{harness.js → support/harness.js} +24 -7
  666. package/dist/selftest/{live.d.ts → support/live.d.ts} +2 -2
  667. package/dist/selftest/{live.js → support/live.js} +34 -10
  668. package/dist/selftest/support/suite.js +1 -0
  669. package/dist/selftest/sync.test.d.ts +1 -1
  670. package/dist/selftest/sync.test.js +64 -26
  671. package/dist/selftest/test-guard.test.d.ts +1 -1
  672. package/dist/selftest/test-guard.test.js +43 -15
  673. package/dist/selftest/toolchains.test.d.ts +1 -1
  674. package/dist/selftest/toolchains.test.js +135 -36
  675. package/dist/selftest/workspace-view.test.d.ts +1 -1
  676. package/dist/selftest/workspace-view.test.js +48 -11
  677. package/dist/selftest/workspace.test.d.ts +1 -1
  678. package/dist/selftest/workspace.test.js +13 -4
  679. package/dist/shared/{apps.d.ts → apps/catalogue.d.ts} +1 -11
  680. package/dist/shared/apps/catalogue.js +768 -0
  681. package/dist/shared/apps/index.d.ts +2 -0
  682. package/dist/shared/apps/index.js +2 -0
  683. package/dist/shared/apps/selection.d.ts +11 -0
  684. package/dist/shared/apps/selection.js +40 -0
  685. package/dist/shared/channel/index.d.ts +2 -0
  686. package/dist/shared/channel/index.js +2 -0
  687. package/dist/shared/channel/run-dir.d.ts +30 -0
  688. package/dist/shared/channel/run-dir.js +84 -0
  689. package/dist/shared/{schema.d.ts → channel/schema.d.ts} +38 -21
  690. package/dist/shared/{schema.js → channel/schema.js} +62 -35
  691. package/dist/shared/download/archive.d.ts +13 -0
  692. package/dist/shared/download/archive.js +57 -0
  693. package/dist/shared/download/downloader.d.ts +35 -0
  694. package/dist/shared/download/downloader.js +110 -0
  695. package/dist/shared/download/github.d.ts +16 -0
  696. package/dist/shared/download/github.js +74 -0
  697. package/dist/shared/download/http.d.ts +5 -0
  698. package/dist/shared/download/http.js +30 -0
  699. package/dist/shared/download/index.d.ts +5 -0
  700. package/dist/shared/download/index.js +5 -0
  701. package/dist/shared/download/spawn.d.ts +2 -0
  702. package/dist/shared/download/spawn.js +7 -0
  703. package/dist/shared/io/index.d.ts +3 -0
  704. package/dist/shared/io/index.js +3 -0
  705. package/dist/shared/io/json-file.d.ts +10 -0
  706. package/dist/shared/io/json-file.js +21 -0
  707. package/dist/shared/io/json.d.ts +13 -0
  708. package/dist/shared/io/json.js +49 -0
  709. package/dist/shared/{safe-remove.js → io/safe-remove.js} +32 -7
  710. package/dist/shared/{netrules.js → network/firewall-rules.js} +36 -5
  711. package/dist/shared/network/index.d.ts +2 -0
  712. package/dist/shared/network/index.js +2 -0
  713. package/dist/shared/{netpolicy.js → network/policy.js} +66 -11
  714. package/dist/shared/{paths.js → paths/claude-paths.js} +12 -2
  715. package/dist/shared/{guest-paths.d.ts → paths/guest-paths.d.ts} +6 -12
  716. package/dist/shared/{guest-paths.js → paths/guest-paths.js} +53 -36
  717. package/dist/shared/paths/index.d.ts +3 -0
  718. package/dist/shared/paths/index.js +3 -0
  719. package/dist/shared/{projects.js → paths/projects.js} +13 -3
  720. package/dist/shared/pty/client.d.ts +21 -0
  721. package/dist/shared/pty/client.js +79 -0
  722. package/dist/shared/{console-input.js → pty/console-input.js} +26 -6
  723. package/dist/shared/pty/index.d.ts +6 -0
  724. package/dist/shared/pty/index.js +6 -0
  725. package/dist/shared/pty/input-joiner.d.ts +15 -0
  726. package/dist/shared/pty/input-joiner.js +44 -0
  727. package/dist/shared/pty/output-filter.d.ts +13 -0
  728. package/dist/shared/pty/output-filter.js +140 -0
  729. package/dist/shared/pty/protocol.d.ts +36 -0
  730. package/dist/shared/pty/protocol.js +60 -0
  731. package/dist/shared/pty/terminal.d.ts +24 -0
  732. package/dist/shared/pty/terminal.js +147 -0
  733. package/dist/shared/test-guard.js +3 -1
  734. package/dist/sync/claude-mem.d.ts +1 -1
  735. package/dist/sync/claude-mem.js +9 -4
  736. package/dist/sync/history.d.ts +1 -29
  737. package/dist/sync/history.js +57 -45
  738. package/dist/sync/index.d.ts +5 -0
  739. package/dist/sync/index.js +5 -0
  740. package/dist/sync/sync-cycle.d.ts +18 -0
  741. package/dist/sync/sync-cycle.js +85 -0
  742. package/dist/sync/sync-state.d.ts +32 -0
  743. package/dist/sync/sync-state.js +37 -0
  744. package/dist/sync/watcher.d.ts +0 -18
  745. package/dist/sync/watcher.js +66 -100
  746. package/native/keep-awake.ps1 +8 -0
  747. package/native/power.cs +23 -0
  748. package/native/stop-events.ps1 +38 -0
  749. package/package.json +11 -3
  750. package/sandbox/linkgate.cs +98 -0
  751. package/sandbox/memlog.ps1 +15 -6
  752. package/schemas/config.schema.json +34 -1
  753. package/schemas/sandbox-config.schema.json +34 -1
  754. package/dist/cli/boot-progress.d.ts +0 -22
  755. package/dist/cli/boot-progress.js +0 -59
  756. package/dist/cli/commands/launch.d.ts +0 -32
  757. package/dist/cli/commands/launch.js +0 -421
  758. package/dist/cli/commands/maintenance.d.ts +0 -10
  759. package/dist/cli/commands/maintenance.js +0 -220
  760. package/dist/cli/commands/project.d.ts +0 -33
  761. package/dist/cli/commands/project.js +0 -102
  762. package/dist/cli/commands/projects.d.ts +0 -14
  763. package/dist/cli/commands/projects.js +0 -146
  764. package/dist/cli/commands/restart.d.ts +0 -6
  765. package/dist/cli/commands/restart.js +0 -95
  766. package/dist/cli/commands/sessions.d.ts +0 -12
  767. package/dist/cli/commands/sessions.js +0 -258
  768. package/dist/cli/menu/settings/editors.js +0 -305
  769. package/dist/cli/tui/dialogs.d.ts +0 -57
  770. package/dist/cli/tui/dialogs.js +0 -162
  771. package/dist/core/config.js +0 -109
  772. package/dist/core/project-policy.d.ts +0 -62
  773. package/dist/core/project-policy.js +0 -121
  774. package/dist/core/schema.d.ts +0 -6
  775. package/dist/core/schema.js +0 -8
  776. package/dist/core/util.d.ts +0 -62
  777. package/dist/core/util.js +0 -156
  778. package/dist/core/workspace.d.ts +0 -35
  779. package/dist/core/workspace.js +0 -206
  780. package/dist/guest/boot-env.d.ts +0 -4
  781. package/dist/guest/daemon.js +0 -57
  782. package/dist/guest/env.d.ts +0 -56
  783. package/dist/guest/env.js +0 -115
  784. package/dist/guest/gitrules.js +0 -11
  785. package/dist/guest/project-status.d.ts +0 -5
  786. package/dist/guest/project-status.js +0 -17
  787. package/dist/guest/setup/user.js +0 -51
  788. package/dist/guest/toolchains/cli.d.ts +0 -10
  789. package/dist/guest/toolchains/common.d.ts +0 -54
  790. package/dist/guest/toolchains/common.js +0 -147
  791. package/dist/guest/toolchains/databases/dynamodb.d.ts +0 -8
  792. package/dist/guest/toolchains/databases/dynamodb.js +0 -52
  793. package/dist/guest/toolchains/databases/index.d.ts +0 -6
  794. package/dist/guest/toolchains/databases/index.js +0 -62
  795. package/dist/guest/toolchains/databases/mongodb.d.ts +0 -3
  796. package/dist/guest/toolchains/databases/mongodb.js +0 -31
  797. package/dist/guest/toolchains/databases/mysql.d.ts +0 -3
  798. package/dist/guest/toolchains/databases/mysql.js +0 -38
  799. package/dist/guest/toolchains/databases/postgres.d.ts +0 -5
  800. package/dist/guest/toolchains/databases/postgres.js +0 -38
  801. package/dist/guest/toolchains/databases/redis.d.ts +0 -3
  802. package/dist/guest/toolchains/databases/redis.js +0 -16
  803. package/dist/guest/toolchains/git.d.ts +0 -3
  804. package/dist/guest/toolchains/go.d.ts +0 -3
  805. package/dist/guest/toolchains/java.d.ts +0 -8
  806. package/dist/guest/toolchains/node.d.ts +0 -3
  807. package/dist/guest/toolchains/pwsh.d.ts +0 -4
  808. package/dist/guest/toolchains/python.d.ts +0 -3
  809. package/dist/guest/toolchains/scripting/php.d.ts +0 -3
  810. package/dist/guest/toolchains/scripting/ruby.d.ts +0 -3
  811. package/dist/host/accounts.d.ts +0 -32
  812. package/dist/host/accounts.js +0 -128
  813. package/dist/host/agent-commands.d.ts +0 -25
  814. package/dist/host/agent-commands.js +0 -145
  815. package/dist/host/channel.d.ts +0 -38
  816. package/dist/host/channel.js +0 -163
  817. package/dist/host/generate.d.ts +0 -13
  818. package/dist/host/generate.js +0 -115
  819. package/dist/host/launch/projects.d.ts +0 -17
  820. package/dist/host/launch/wsb.js +0 -34
  821. package/dist/host/motw.d.ts +0 -17
  822. package/dist/host/motw.js +0 -74
  823. package/dist/host/pc-scan.d.ts +0 -6
  824. package/dist/host/personalize.d.ts +0 -10
  825. package/dist/host/personalize.js +0 -97
  826. package/dist/host/platform.js +0 -129
  827. package/dist/host/project-scan.d.ts +0 -7
  828. package/dist/host/projects.d.ts +0 -123
  829. package/dist/host/projects.js +0 -196
  830. package/dist/host/repo-guard.d.ts +0 -43
  831. package/dist/host/repo-guard.js +0 -347
  832. package/dist/host/secrets.d.ts +0 -14
  833. package/dist/host/secrets.js +0 -133
  834. package/dist/host/stops.d.ts +0 -67
  835. package/dist/host/stops.js +0 -126
  836. package/dist/shared/apps.js +0 -114
  837. package/dist/shared/download.d.ts +0 -63
  838. package/dist/shared/download.js +0 -238
  839. package/dist/shared/pty-client.d.ts +0 -108
  840. package/dist/shared/pty-client.js +0 -406
  841. package/dist/shared/rundir.d.ts +0 -41
  842. package/dist/shared/rundir.js +0 -96
  843. /package/dist/{guest/daemon.d.ts → cli/tui/list/list-types.js} +0 -0
  844. /package/dist/{guest/db.d.ts → cli/tui/screen.js} +0 -0
  845. /package/dist/core/{detect-databases.d.ts → detect/databases.d.ts} +0 -0
  846. /package/dist/{guest/toolchains → core/detect}/versions.d.ts +0 -0
  847. /package/dist/guest/{setup/agents.d.ts → agents/agent-installer.d.ts} +0 -0
  848. /package/dist/guest/{audit-parse.d.ts → audit/parse.d.ts} +0 -0
  849. /package/dist/guest/{guide.d.ts → boot/guide.d.ts} +0 -0
  850. /package/dist/guest/daemon/{shutdown.d.ts → idle-shutdown.d.ts} +0 -0
  851. /package/dist/guest/daemon/{session.d.ts → sessions.d.ts} +0 -0
  852. /package/dist/guest/{main.d.ts → entries/daemon.d.ts} +0 -0
  853. /package/dist/guest/{netproxy.d.ts → entries/db.d.ts} +0 -0
  854. /package/dist/{selftest/suite.js → guest/entries/gitguard.d.ts} +0 -0
  855. /package/dist/guest/{gitguard.d.ts → git/decision.d.ts} +0 -0
  856. /package/dist/guest/{ports.d.ts → runtime/ports.d.ts} +0 -0
  857. /package/dist/guest/{project-context.d.ts → runtime/project-context.d.ts} +0 -0
  858. /package/dist/guest/{cmdline.d.ts → sessions/cmdline.d.ts} +0 -0
  859. /package/dist/guest/{ptyhost.d.ts → sessions/pty-host.d.ts} +0 -0
  860. /package/dist/guest/{view.d.ts → sessions/viewer.d.ts} +0 -0
  861. /package/dist/guest/setup/{policy.d.ts → managed-policy.d.ts} +0 -0
  862. /package/dist/host/{window.d.ts → sandbox/window.d.ts} +0 -0
  863. /package/dist/host/{wsb.d.ts → sandbox/wsb-cli.d.ts} +0 -0
  864. /package/dist/host/{cleanup.d.ts → storage/cleanup.d.ts} +0 -0
  865. /package/dist/selftest/{harness.d.ts → support/harness.d.ts} +0 -0
  866. /package/dist/selftest/{suite.d.ts → support/suite.d.ts} +0 -0
  867. /package/dist/shared/{safe-remove.d.ts → io/safe-remove.d.ts} +0 -0
  868. /package/dist/shared/{netrules.d.ts → network/firewall-rules.d.ts} +0 -0
  869. /package/dist/shared/{netpolicy.d.ts → network/policy.d.ts} +0 -0
  870. /package/dist/shared/{paths.d.ts → paths/claude-paths.d.ts} +0 -0
  871. /package/dist/shared/{projects.d.ts → paths/projects.d.ts} +0 -0
  872. /package/dist/shared/{console-input.d.ts → pty/console-input.d.ts} +0 -0
@@ -3,18 +3,21 @@
3
3
  // only to an address the sandbox published that is on this PC's Hyper-V network (isSandboxAddress). Bytes are passed
4
4
  // through, never looked at. No admin rights needed (no netsh portproxy).
5
5
  import net from 'node:net';
6
- import path from 'node:path';
7
6
  import { z } from 'zod';
8
- import { relayPort } from '../shared/netpolicy.js';
9
- import { readSandboxStatus, readValid, writeJsonAtomic } from '../shared/rundir.js';
10
- import { isSandboxAddress } from './attach.js';
11
- const Forwards = z.array(z.object({ pc: z.number().int().min(1).max(65535), sandbox: z.number().int().min(1).max(65535) })).max(64);
12
- const forwardsFile = (storageRoot, dataPath) => path.join(storageRoot, 'sync', path.basename(dataPath) + '-forwards.json');
7
+ import { relayPort } from '../../shared/network/index.js';
8
+ import { RunDir } from '../../shared/channel/index.js';
9
+ import { JsonFile } from '../../shared/io/index.js';
10
+ import { hostStateFile } from '../storage/index.js';
11
+ import { isSandboxAddress } from '../channel/index.js';
12
+ const ForwardsSchema = z
13
+ .array(z.object({ pc: z.number().int().min(1).max(65535), sandbox: z.number().int().min(1).max(65535) }))
14
+ .max(64);
15
+ const forwardsFile = (storageRoot, dataPath) => new JsonFile(ForwardsSchema, hostStateFile(storageRoot, dataPath, '-forwards.json'));
13
16
  /** Host-only: the forwards of the running sandbox (written at launch, read by the watcher). */
14
- export const saveForwards = (storageRoot, dataPath, forwards) => writeJsonAtomic(forwardsFile(storageRoot, dataPath), forwards);
15
- export const readForwards = (storageRoot, dataPath) => readValid(Forwards, forwardsFile(storageRoot, dataPath)) ?? [];
17
+ export const saveForwards = (storageRoot, dataPath, forwards) => forwardsFile(storageRoot, dataPath).write(forwards);
18
+ export const readForwards = (storageRoot, dataPath) => forwardsFile(storageRoot, dataPath).read() ?? [];
16
19
  /** The sandbox's address on this PC's Hyper-V network, from its status (null until it has one). */
17
- export const sandboxAddress = (dataPath) => readSandboxStatus(dataPath)?.addresses?.find((a) => isSandboxAddress(a)) ?? null;
20
+ export const sandboxAddress = (dataPath) => new RunDir(dataPath).readSandboxStatus()?.addresses?.find((a) => isSandboxAddress(a)) ?? null;
18
21
  /** Starts one listener per forward; returns a function that stops them. */
19
22
  export const startPortForwards = (forwards, address, note = () => undefined) => {
20
23
  const servers = forwards.map((f, i) => {
@@ -29,7 +32,10 @@ export const startPortForwards = (forwards, address, note = () => undefined) =>
29
32
  target.on('error', () => client.destroy());
30
33
  client.on('error', () => target.destroy());
31
34
  });
32
- server.on('error', (e) => note('localhost:' + f.pc + ' could not be forwarded' + (e.code === 'EADDRINUSE' ? ': something on this PC already uses that port' : ': ' + e.message)));
35
+ server.on('error', (e) => note('localhost:' +
36
+ f.pc +
37
+ ' could not be forwarded' +
38
+ (e.code === 'EADDRINUSE' ? ': something on this PC already uses that port' : ': ' + e.message)));
33
39
  server.listen(f.pc, '127.0.0.1', () => note('localhost:' + f.pc + ' -> sandbox port ' + f.sandbox));
34
40
  return server;
35
41
  });
@@ -0,0 +1,37 @@
1
+ import { type LoginFiles } from './claude-login.js';
2
+ export interface Account {
3
+ readonly name: string;
4
+ readonly savedAt: string;
5
+ readonly email: string | null;
6
+ readonly credentials: unknown;
7
+ readonly oauthAccount: unknown;
8
+ }
9
+ export interface AccountRow {
10
+ readonly name: string;
11
+ readonly email: string | null;
12
+ readonly isDefault: boolean;
13
+ readonly isActive: boolean;
14
+ readonly savedAt: string;
15
+ }
16
+ export declare function accountsDir(storageRoot: string): string;
17
+ /** The saved Claude logins under <storage>\accounts, and which one each sandbox data folder uses. */
18
+ export declare class AccountStore {
19
+ private readonly storageRoot;
20
+ constructor(storageRoot: string);
21
+ private file;
22
+ private store;
23
+ read(name: string): Account | null;
24
+ defaultName(): string | null;
25
+ /** The account a data folder uses (kept in the index of the storage folder that data folder is in). */
26
+ activeFor(dataPath: string): string | null;
27
+ list(dataPath: string): AccountRow[];
28
+ /** Saves the sandbox's current login (or this PC's, with fromHost) under `name`. */
29
+ save(dataPath: string, name: string, fromHost: LoginFiles | null): Account;
30
+ /**
31
+ * Makes `name` the sandbox's login. Claude refreshes (rotates) tokens while it runs, so the outgoing account's
32
+ * current tokens are saved back first; otherwise its stored refresh token could already be invalid.
33
+ */
34
+ activate(dataPath: string, name: string): Account;
35
+ setDefault(name: string | null): void;
36
+ remove(name: string): void;
37
+ }
@@ -0,0 +1,146 @@
1
+ // Several Claude logins for the sandbox. Each account is a saved copy of Claude's .credentials.json plus the
2
+ // `oauthAccount` block of .claude.json, kept in host-only storage (<storage>\accounts, never mapped into a sandbox).
3
+ // Switching writes them into the sandbox's persistent Claude state; when the sandbox is running the agent is then
4
+ // restarted in place with --continue so the conversation carries on.
5
+ import fs from 'node:fs';
6
+ import path from 'node:path';
7
+ import { z } from 'zod';
8
+ import { isSafeFileName } from '../../shared/paths/index.js';
9
+ import { JsonFile } from '../../shared/io/index.js';
10
+ import { storageOf } from '../storage/index.js';
11
+ import { fail, fileExists } from '../../core/util/index.js';
12
+ import { clearAccountCaches, emailOf, MAX_STATE_BYTES, readLogin, readUntrusted, sandboxLogin, writeSandboxJson, } from './claude-login.js';
13
+ const NAME = /^[A-Za-z0-9_-]{1,40}$/;
14
+ const AccountSchema = z.object({
15
+ name: z.string().regex(NAME),
16
+ savedAt: z.string().max(64),
17
+ email: z.string().max(200).nullable(),
18
+ credentials: z.looseObject({}),
19
+ oauthAccount: z.unknown(),
20
+ });
21
+ const IndexSchema = z.object({
22
+ default: z.string().regex(NAME).optional(),
23
+ active: z.record(z.string().max(200), z.string().regex(NAME)).optional(),
24
+ });
25
+ export function accountsDir(storageRoot) {
26
+ return path.join(storageRoot, 'accounts');
27
+ }
28
+ function dataName(dataPath) {
29
+ return path.basename(dataPath);
30
+ }
31
+ function indexFile(storageRoot) {
32
+ return new JsonFile(IndexSchema, path.join(accountsDir(storageRoot), 'index.json'));
33
+ }
34
+ function readIndex(storageRoot) {
35
+ return indexFile(storageRoot).read() ?? {};
36
+ }
37
+ function updateIndex(storageRoot, change) {
38
+ indexFile(storageRoot).write(change(readIndex(storageRoot)));
39
+ }
40
+ function setActive(dataPath, name) {
41
+ updateIndex(storageOf(dataPath), (i) => ({ ...i, active: { ...i.active, [dataName(dataPath)]: name } }));
42
+ }
43
+ /** A file name of its own: not "index" (the index file), not a Windows device name such as con or nul. */
44
+ function validName(name) {
45
+ return NAME.test(name) && name.toLowerCase() !== 'index' && isSafeFileName(name + '.json');
46
+ }
47
+ function assertName(name) {
48
+ if (!validName(name))
49
+ fail('Invalid account name "' + name + '".', 'Use letters, numbers, - and _ only (max 40), e.g. work or personal.');
50
+ }
51
+ /** The saved Claude logins under <storage>\accounts, and which one each sandbox data folder uses. */
52
+ export class AccountStore {
53
+ storageRoot;
54
+ constructor(storageRoot) {
55
+ this.storageRoot = storageRoot;
56
+ }
57
+ file(name) {
58
+ return new JsonFile(AccountSchema, path.join(accountsDir(this.storageRoot), name + '.json'));
59
+ }
60
+ store(name, login) {
61
+ const account = { name, savedAt: new Date().toISOString(), email: emailOf(login.oauthAccount), ...login };
62
+ this.file(name).write(account);
63
+ return account;
64
+ }
65
+ read(name) {
66
+ return validName(name) ? this.file(name).read() : null;
67
+ }
68
+ defaultName() {
69
+ return readIndex(this.storageRoot).default ?? null;
70
+ }
71
+ /** The account a data folder uses (kept in the index of the storage folder that data folder is in). */
72
+ activeFor(dataPath) {
73
+ return readIndex(storageOf(dataPath)).active?.[dataName(dataPath)] ?? null;
74
+ }
75
+ list(dataPath) {
76
+ const dir = accountsDir(this.storageRoot);
77
+ if (!fs.existsSync(dir))
78
+ return [];
79
+ const def = this.defaultName();
80
+ const active = this.activeFor(dataPath);
81
+ return fs
82
+ .readdirSync(dir)
83
+ .filter((f) => f.endsWith('.json') && f !== 'index.json')
84
+ .map((f) => this.read(f.slice(0, -5)))
85
+ .filter((a) => a !== null)
86
+ .map((a) => ({
87
+ name: a.name,
88
+ email: a.email,
89
+ isDefault: a.name === def,
90
+ isActive: a.name === active,
91
+ savedAt: a.savedAt,
92
+ }));
93
+ }
94
+ /** Saves the sandbox's current login (or this PC's, with fromHost) under `name`. */
95
+ save(dataPath, name, fromHost) {
96
+ assertName(name);
97
+ const source = fromHost ?? sandboxLogin(dataPath);
98
+ const account = this.store(name, readLogin(source.claudeDir, source.globalStateFile));
99
+ if (!fromHost)
100
+ setActive(dataPath, name);
101
+ if (!this.defaultName())
102
+ this.setDefault(name);
103
+ return account;
104
+ }
105
+ /**
106
+ * Makes `name` the sandbox's login. Claude refreshes (rotates) tokens while it runs, so the outgoing account's
107
+ * current tokens are saved back first; otherwise its stored refresh token could already be invalid.
108
+ */
109
+ activate(dataPath, name) {
110
+ const account = this.read(name) ??
111
+ fail('Unknown account "' + name + '".', 'Saved accounts: ' +
112
+ (this.list(dataPath)
113
+ .map((a) => a.name)
114
+ .join(', ') || 'none yet; save one with sandbox account save <name>'));
115
+ const { claudeDir, globalStateFile } = sandboxLogin(dataPath);
116
+ const outgoing = this.activeFor(dataPath);
117
+ if (outgoing && outgoing !== name && this.read(outgoing) && fileExists(path.join(claudeDir, '.credentials.json'))) {
118
+ try {
119
+ this.store(outgoing, readLogin(claudeDir, globalStateFile));
120
+ }
121
+ catch {
122
+ /* nothing usable to save back */
123
+ }
124
+ }
125
+ fs.mkdirSync(claudeDir, { recursive: true });
126
+ clearAccountCaches(claudeDir);
127
+ writeSandboxJson(path.join(claudeDir, '.credentials.json'), account.credentials);
128
+ const state = readUntrusted(globalStateFile, MAX_STATE_BYTES);
129
+ if (account.oauthAccount && (state || !fileExists(globalStateFile)))
130
+ writeSandboxJson(globalStateFile, { ...(state ?? {}), oauthAccount: account.oauthAccount });
131
+ setActive(dataPath, name);
132
+ return account;
133
+ }
134
+ setDefault(name) {
135
+ if (name !== null && !this.read(name))
136
+ fail('Unknown account "' + name + '".', 'See your accounts with: sandbox account list');
137
+ updateIndex(this.storageRoot, (i) => ({ ...i, default: name ?? undefined }));
138
+ }
139
+ remove(name) {
140
+ if (!this.read(name))
141
+ fail('Unknown account "' + name + '".', 'See your accounts with: sandbox account list');
142
+ fs.rmSync(this.file(name).file);
143
+ if (this.defaultName() === name)
144
+ this.setDefault(null);
145
+ }
146
+ }
@@ -0,0 +1,22 @@
1
+ export interface Login {
2
+ readonly credentials: unknown;
3
+ readonly oauthAccount: unknown;
4
+ }
5
+ export interface LoginFiles {
6
+ readonly claudeDir: string;
7
+ readonly globalStateFile: string;
8
+ }
9
+ /** .claude.json holds per-project state and can be large; still capped so a hostile file cannot exhaust memory. */
10
+ export declare const MAX_STATE_BYTES: number;
11
+ export declare function sandboxClaudeDir(dataPath: string): string;
12
+ export declare function emailOf(oauthAccount: unknown): string | null;
13
+ /** Reads a JSON file that may be sandbox-written: no links, size-capped. */
14
+ export declare function readUntrusted(file: string, max: number): unknown;
15
+ /** The login currently in a Claude config folder (+ its global state file). */
16
+ export declare function readLogin(claudeDir: string, globalStateFile: string): Login;
17
+ /** The sandbox's Claude login files (refuses when the data folder holds a link on the way). */
18
+ export declare function sandboxLogin(dataPath: string): LoginFiles;
19
+ /** Replaces a file that may be a sandbox-planted link instead of writing through it. */
20
+ export declare function writeSandboxJson(file: string, value: unknown): void;
21
+ /** Removes the previous account's caches; otherwise its org policy could linger. A link is removed, not followed. */
22
+ export declare function clearAccountCaches(claudeDir: string): void;
@@ -0,0 +1,57 @@
1
+ // A Claude login as files: .credentials.json plus the `oauthAccount` block of .claude.json. The sandbox's copies are
2
+ // guest-written: read without following links and size-capped; links are replaced, never written through.
3
+ import fs from 'node:fs';
4
+ import path from 'node:path';
5
+ import { assertTestWritable } from '../test-guard.js';
6
+ import { assertNoLinks, fail, fileExists, isLink, removeLink, tryReadJson, writeJson } from '../../core/util/index.js';
7
+ const MAX_LOGIN_BYTES = 1024 * 1024;
8
+ /** .claude.json holds per-project state and can be large; still capped so a hostile file cannot exhaust memory. */
9
+ export const MAX_STATE_BYTES = 256 * 1024 * 1024;
10
+ /** Caches tied to an account (Claude deletes these on /logout). */
11
+ const ACCOUNT_CACHES = ['remote-settings.json', 'policy-limits.json', 'policy-limits.json.stamp.json'];
12
+ export function sandboxClaudeDir(dataPath) {
13
+ return path.join(dataPath, 'state', 'claude');
14
+ }
15
+ export function emailOf(oauthAccount) {
16
+ const email = oauthAccount?.emailAddress;
17
+ return typeof email === 'string' ? email.slice(0, 200) : null;
18
+ }
19
+ /** Reads a JSON file that may be sandbox-written: no links, size-capped. */
20
+ export function readUntrusted(file, max) {
21
+ return fileExists(file) && !isLink(file) && fs.statSync(file).size <= max ? tryReadJson(file) : null;
22
+ }
23
+ /** The login currently in a Claude config folder (+ its global state file). */
24
+ export function readLogin(claudeDir, globalStateFile) {
25
+ const credentials = readUntrusted(path.join(claudeDir, '.credentials.json'), MAX_LOGIN_BYTES);
26
+ if (!credentials || typeof credentials !== 'object')
27
+ fail('No Claude login found in ' + claudeDir + '.', 'Sign in to Claude first (inside the sandbox, or on this PC with --from-host), then save it again.');
28
+ return {
29
+ credentials,
30
+ oauthAccount: readUntrusted(globalStateFile, MAX_STATE_BYTES)?.oauthAccount ?? null,
31
+ };
32
+ }
33
+ /** The sandbox's Claude login files (refuses when the data folder holds a link on the way). */
34
+ export function sandboxLogin(dataPath) {
35
+ assertNoLinks(dataPath, sandboxClaudeDir(dataPath));
36
+ return {
37
+ claudeDir: sandboxClaudeDir(dataPath),
38
+ globalStateFile: path.join(sandboxClaudeDir(dataPath), '.claude.json'),
39
+ };
40
+ }
41
+ /** Replaces a file that may be a sandbox-planted link instead of writing through it. */
42
+ export function writeSandboxJson(file, value) {
43
+ assertTestWritable(file);
44
+ if (isLink(file))
45
+ removeLink(file);
46
+ writeJson(file, value);
47
+ }
48
+ /** Removes the previous account's caches; otherwise its org policy could linger. A link is removed, not followed. */
49
+ export function clearAccountCaches(claudeDir) {
50
+ for (const cache of ACCOUNT_CACHES) {
51
+ const file = path.join(claudeDir, cache);
52
+ if (isLink(file))
53
+ removeLink(file);
54
+ else
55
+ fs.rmSync(file, { force: true });
56
+ }
57
+ }
@@ -1,15 +1,15 @@
1
- import type { ClaudeProfileConfig, ProfileResult } from '../core/types.js';
1
+ import type { ClaudeProfileConfig, ProfileResult } from '../../core/types.js';
2
2
  import { type SecretsConfig } from './secrets.js';
3
- export declare const hostClaudeDir: (settings: ClaudeProfileConfig) => string;
4
- export declare const hostGlobalStateFile: (settings: ClaudeProfileConfig) => string;
5
- /**
6
- * Copies SELECTED Claude settings from this PC into the launch folder. Conversation history is handled
7
- * separately by history.ts (it needs path translation), and the login only travels when copyCredentials is on.
8
- */
3
+ export declare function hostClaudeDir(settings: ClaudeProfileConfig): string;
4
+ export declare function hostGlobalStateFile(settings: ClaudeProfileConfig): string;
9
5
  /**
10
6
  * What of your .claude.json the sandbox gets: everything except secrets and other projects. API keys and the account
11
7
  * block stay on this PC (logins travel only through `sandbox account`), and of the per-project entries only
12
8
  * this workspace's (with its MCP servers) is kept; other projects' entries can hold their MCP servers' tokens.
13
9
  */
14
- export declare const sandboxGlobalState: (state: Record<string, unknown>, workspaceHost: string) => Record<string, unknown>;
15
- export declare const stageClaudeProfile: (settings: ClaudeProfileConfig, launchPath: string, workspaceHost: string, secrets: SecretsConfig) => ProfileResult;
10
+ export declare function sandboxGlobalState(state: Record<string, unknown>, workspaceHost: string): Record<string, unknown>;
11
+ /**
12
+ * Copies SELECTED Claude settings from this PC into the launch folder. Conversation history is handled
13
+ * separately by history.ts (it needs path translation), and the login only travels when copyCredentials is on.
14
+ */
15
+ export declare function stageClaudeProfile(settings: ClaudeProfileConfig, launchPath: string, workspaceHost: string, secrets: SecretsConfig): ProfileResult;
@@ -1,10 +1,11 @@
1
+ // Your Claude settings from this PC, staged into the launch folder for the sandbox with secrets stripped.
1
2
  import fs from 'node:fs';
2
3
  import path from 'node:path';
4
+ import { dirExists, ensureDir, fileExists, homeDir, isLink, readJson, writeJson } from '../../core/util/index.js';
3
5
  import { stripMcpServers, stripSettings } from './secrets.js';
4
- import { dirExists, ensureDir, fileExists, homeDir, isLink, readJson, writeJson } from '../core/util.js';
5
6
  const MAX_BYTES = 250 * 1024 * 1024;
6
7
  /** Real files only: a link inside ~/.claude (even a loop or a dead one) is neither followed nor counted nor copied. */
7
- const directorySize = (dir) => {
8
+ function directorySize(dir) {
8
9
  let total = 0;
9
10
  for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
10
11
  const full = path.join(dir, entry.name);
@@ -14,8 +15,8 @@ const directorySize = (dir) => {
14
15
  total += fs.statSync(full).size;
15
16
  }
16
17
  return total;
17
- };
18
- const validJson = (file) => {
18
+ }
19
+ function validJson(file) {
19
20
  try {
20
21
  JSON.parse(fs.readFileSync(file, 'utf8').replace(/^\uFEFF/, ''));
21
22
  return true;
@@ -23,31 +24,36 @@ const validJson = (file) => {
23
24
  catch {
24
25
  return false;
25
26
  }
26
- };
27
- export const hostClaudeDir = (settings) => {
28
- return settings.hostDir === 'auto' ? (process.env.CLAUDE_CONFIG_DIR ?? path.join(homeDir(), '.claude')) : settings.hostDir;
29
- };
30
- export const hostGlobalStateFile = (settings) => {
27
+ }
28
+ export function hostClaudeDir(settings) {
29
+ return settings.hostDir === 'auto'
30
+ ? (process.env.CLAUDE_CONFIG_DIR ?? path.join(homeDir(), '.claude'))
31
+ : settings.hostDir;
32
+ }
33
+ export function hostGlobalStateFile(settings) {
31
34
  if (settings.globalStateFile !== 'auto')
32
35
  return settings.globalStateFile;
33
- return process.env.CLAUDE_CONFIG_DIR ? path.join(process.env.CLAUDE_CONFIG_DIR, '.claude.json') : path.join(homeDir(), '.claude.json');
34
- };
35
- /**
36
- * Copies SELECTED Claude settings from this PC into the launch folder. Conversation history is handled
37
- * separately by history.ts (it needs path translation), and the login only travels when copyCredentials is on.
38
- */
36
+ return process.env.CLAUDE_CONFIG_DIR
37
+ ? path.join(process.env.CLAUDE_CONFIG_DIR, '.claude.json')
38
+ : path.join(homeDir(), '.claude.json');
39
+ }
39
40
  /**
40
41
  * What of your .claude.json the sandbox gets: everything except secrets and other projects. API keys and the account
41
42
  * block stay on this PC (logins travel only through `sandbox account`), and of the per-project entries only
42
43
  * this workspace's (with its MCP servers) is kept; other projects' entries can hold their MCP servers' tokens.
43
44
  */
44
- export const sandboxGlobalState = (state, workspaceHost) => {
45
+ export function sandboxGlobalState(state, workspaceHost) {
45
46
  const { primaryApiKey: _key, customApiKeyResponses: _responses, oauthAccount: _account, projects, ...rest } = state;
46
- const same = (key) => key.replace(/\\/g, '/').replace(/\/+$/, '').toLowerCase() === workspaceHost.replace(/\\/g, '/').replace(/\/+$/, '').toLowerCase();
47
+ const same = (key) => key.replace(/\\/g, '/').replace(/\/+$/, '').toLowerCase() ===
48
+ workspaceHost.replace(/\\/g, '/').replace(/\/+$/, '').toLowerCase();
47
49
  const own = Object.entries((projects ?? {})).filter(([key]) => same(key));
48
50
  return { ...rest, projects: Object.fromEntries(own) };
49
- };
50
- export const stageClaudeProfile = (settings, launchPath, workspaceHost, secrets) => {
51
+ }
52
+ /**
53
+ * Copies SELECTED Claude settings from this PC into the launch folder. Conversation history is handled
54
+ * separately by history.ts (it needs path translation), and the login only travels when copyCredentials is on.
55
+ */
56
+ export function stageClaudeProfile(settings, launchPath, workspaceHost, secrets) {
51
57
  const result = { hostDir: null, staged: [], skipped: [], credentials: false, secretsRemoved: [] };
52
58
  if (!settings.enabled)
53
59
  return result;
@@ -55,7 +61,7 @@ export const stageClaudeProfile = (settings, launchPath, workspaceHost, secrets)
55
61
  result.hostDir = hostDir;
56
62
  const target = path.join(launchPath, 'claude-profile');
57
63
  ensureDir(target);
58
- // The login file goes only through copyCredentials (a project file asking for it is flagged); include never copies it.
64
+ // The login goes only through copyCredentials (a project file asking for it is flagged); include never copies it.
59
65
  const items = settings.include.filter((name) => name.toLowerCase() !== '.credentials.json');
60
66
  if (settings.copyCredentials)
61
67
  items.push('.credentials.json');
@@ -82,7 +88,11 @@ export const stageClaudeProfile = (settings, launchPath, workspaceHost, secrets)
82
88
  result.skipped.push(name + ' (over 250 MB)');
83
89
  continue;
84
90
  }
85
- fs.cpSync(source, destination, { recursive: true, force: true, filter: (from) => from === source || !isLink(from) });
91
+ fs.cpSync(source, destination, {
92
+ recursive: true,
93
+ force: true,
94
+ filter: (from) => from === source || !isLink(from),
95
+ });
86
96
  }
87
97
  else {
88
98
  result.skipped.push(name + ' (not found)');
@@ -104,4 +114,4 @@ export const stageClaudeProfile = (settings, launchPath, workspaceHost, secrets)
104
114
  }
105
115
  }
106
116
  return result;
107
- };
117
+ }
@@ -0,0 +1,7 @@
1
+ export { isSecretName, isSecretValue, mayPass, stripMcpServers, stripSettings, stripVariables, type SecretsConfig, } from './secrets.js';
2
+ export { findSecretFiles } from './secret-files.js';
3
+ export { hostClaudeDir, hostGlobalStateFile, sandboxGlobalState, stageClaudeProfile } from './claude-profile.js';
4
+ export { capturePersonalization } from './personalize.js';
5
+ export { toRegFile, type RegValue } from './reg-file.js';
6
+ export { AccountStore, accountsDir, type Account, type AccountRow } from './accounts.js';
7
+ export { sandboxClaudeDir } from './claude-login.js';
@@ -0,0 +1,7 @@
1
+ export { isSecretName, isSecretValue, mayPass, stripMcpServers, stripSettings, stripVariables, } from './secrets.js';
2
+ export { findSecretFiles } from './secret-files.js';
3
+ export { hostClaudeDir, hostGlobalStateFile, sandboxGlobalState, stageClaudeProfile } from './claude-profile.js';
4
+ export { capturePersonalization } from './personalize.js';
5
+ export { toRegFile } from './reg-file.js';
6
+ export { AccountStore, accountsDir } from './accounts.js';
7
+ export { sandboxClaudeDir } from './claude-login.js';
@@ -0,0 +1,2 @@
1
+ /** Writes personalize.reg (+ the wallpaper image) into `<launch>\personalize`. Returns a short summary. */
2
+ export declare function capturePersonalization(launchPath: string): string;
@@ -0,0 +1,127 @@
1
+ // Captures the look of this desktop (theme, accent colour, taskbar, Explorer options, wallpaper, mouse/keyboard,
2
+ // regional formats) from HKCU as a .reg file the sandbox imports at logon. Only an allow-list of values is read.
3
+ import fs from 'node:fs';
4
+ import path from 'node:path';
5
+ import { ensureDir, errMsg, fileExists, isWin, runPowerShell } from '../../core/util/index.js';
6
+ import { toRegFile } from './reg-file.js';
7
+ /** The HKCU values captured, by key. */
8
+ const VALUES = {
9
+ 'Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize': [
10
+ 'AppsUseLightTheme',
11
+ 'SystemUsesLightTheme',
12
+ 'EnableTransparency',
13
+ 'ColorPrevalence',
14
+ ],
15
+ 'Software\\Microsoft\\Windows\\DWM': [
16
+ 'AccentColor',
17
+ 'AccentColorInactive',
18
+ 'ColorizationColor',
19
+ 'ColorizationAfterglow',
20
+ 'ColorizationColorBalance',
21
+ 'ColorPrevalence',
22
+ 'EnableWindowColorization',
23
+ ],
24
+ 'Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Accent': [
25
+ 'AccentPalette',
26
+ 'AccentColorMenu',
27
+ 'StartColorMenu',
28
+ ],
29
+ 'Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced': [
30
+ 'TaskbarAl',
31
+ 'TaskbarSi',
32
+ 'TaskbarDa',
33
+ 'TaskbarMn',
34
+ 'TaskbarGlomLevel',
35
+ 'ShowTaskViewButton',
36
+ 'Hidden',
37
+ 'HideFileExt',
38
+ 'ShowSuperHidden',
39
+ 'LaunchTo',
40
+ 'NavPaneExpandToCurrentFolder',
41
+ 'NavPaneShowAllFolders',
42
+ 'ShowCopilotButton',
43
+ 'Start_TrackDocs',
44
+ 'Start_Layout',
45
+ ],
46
+ 'Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\StuckRects3': ['Settings'],
47
+ 'Software\\Microsoft\\Windows\\CurrentVersion\\Search': ['SearchboxTaskbarMode'],
48
+ 'Control Panel\\Desktop': [
49
+ 'WallpaperStyle',
50
+ 'TileWallpaper',
51
+ 'MenuShowDelay',
52
+ 'CursorBlinkRate',
53
+ 'DragFullWindows',
54
+ 'FontSmoothing',
55
+ 'FontSmoothingType',
56
+ 'UserPreferencesMask',
57
+ ],
58
+ 'Control Panel\\Colors': ['Background', 'Hilight', 'HotTrackingColor'],
59
+ 'Control Panel\\Mouse': [
60
+ 'MouseSpeed',
61
+ 'MouseSensitivity',
62
+ 'MouseThreshold1',
63
+ 'MouseThreshold2',
64
+ 'DoubleClickSpeed',
65
+ 'SwapMouseButtons',
66
+ ],
67
+ 'Control Panel\\Keyboard': ['KeyboardDelay', 'KeyboardSpeed'],
68
+ 'Control Panel\\International': [
69
+ 'sShortDate',
70
+ 'sLongDate',
71
+ 'sShortTime',
72
+ 'sTimeFormat',
73
+ 'iFirstDayOfWeek',
74
+ 'sDecimal',
75
+ 'sThousand',
76
+ 'sList',
77
+ 'iMeasure',
78
+ 'iTime',
79
+ 'iTLZero',
80
+ ],
81
+ 'Control Panel\\Accessibility\\StickyKeys': ['Flags'],
82
+ };
83
+ function captureScript(spec) {
84
+ return [
85
+ '$ErrorActionPreference = "SilentlyContinue"',
86
+ "$spec = '" + JSON.stringify(spec).replace(/'/g, "''") + "' | ConvertFrom-Json",
87
+ '$out = @()',
88
+ 'foreach ($p in $spec.PSObject.Properties) {',
89
+ ' $key = Get-Item -LiteralPath ("HKCU:\\" + $p.Name)',
90
+ ' if (-not $key) { continue }',
91
+ ' foreach ($name in $p.Value) {',
92
+ ' $raw = $key.GetValue($name, $null, "DoNotExpandEnvironmentNames")',
93
+ ' if ($null -eq $raw) { continue }',
94
+ ' $kind = $key.GetValueKind($name).ToString()',
95
+ ' if ($kind -eq "Binary") { $raw = [Convert]::ToBase64String([byte[]]$raw) }',
96
+ ' $out += [pscustomobject]@{ key = $p.Name; name = $name; kind = $kind; value = $raw }',
97
+ ' }',
98
+ '}',
99
+ '$wall = (Get-ItemProperty -LiteralPath "HKCU:\\Control Panel\\Desktop").WallPaper',
100
+ '[pscustomobject]@{ values = $out; wallpaper = $wall } | ConvertTo-Json -Depth 5 -Compress',
101
+ ].join('\n');
102
+ }
103
+ /** Writes personalize.reg (+ the wallpaper image) into `<launch>\personalize`. Returns a short summary. */
104
+ export function capturePersonalization(launchPath) {
105
+ if (!isWin)
106
+ return 'skipped (not Windows)';
107
+ try {
108
+ const { status, stdout } = runPowerShell(captureScript(VALUES), true);
109
+ if (status !== 0)
110
+ return 'skipped (registry read failed)';
111
+ // runPowerShell has PowerShell write UTF-8 (non-ASCII date formats and wallpaper paths survive); a BOM is allowed.
112
+ const parsed = JSON.parse(stdout.replace(/^\uFEFF/, '').trim());
113
+ const values = parsed.values === null ? [] : Array.isArray(parsed.values) ? parsed.values : [parsed.values];
114
+ const dir = path.join(launchPath, 'personalize');
115
+ ensureDir(dir);
116
+ fs.writeFileSync(path.join(dir, 'personalize.reg'), '\uFEFF' + toRegFile(values), 'utf16le');
117
+ const wallpaper = parsed.wallpaper ?? '';
118
+ const themesCopy = path.join(process.env.APPDATA ?? '', 'Microsoft', 'Windows', 'Themes', 'TranscodedWallpaper');
119
+ const source = fileExists(wallpaper) ? wallpaper : fileExists(themesCopy) ? themesCopy : null;
120
+ if (source)
121
+ fs.copyFileSync(source, path.join(dir, 'wallpaper' + (path.extname(source) || '.jpg')));
122
+ return values.length + ' settings' + (source ? ' + wallpaper' : '');
123
+ }
124
+ catch (e) {
125
+ return 'skipped (' + errMsg(e) + ')';
126
+ }
127
+ }
@@ -0,0 +1,8 @@
1
+ export interface RegValue {
2
+ readonly key: string;
3
+ readonly name: string;
4
+ readonly kind: string;
5
+ readonly value: string | number | string[];
6
+ }
7
+ /** Formats captured values as a .reg file (UTF-16 friendly text; written as UTF-16LE with BOM). */
8
+ export declare function toRegFile(values: RegValue[]): string;
@@ -0,0 +1,45 @@
1
+ // The .reg file format (as regedit imports it) for values captured from HKCU.
2
+ function toHex(bytes) {
3
+ return [...bytes].map((b) => b.toString(16).padStart(2, '0')).join(',');
4
+ }
5
+ function regString(s) {
6
+ return '"' + s.replace(/\\/g, '\\\\').replace(/"/g, '\\"') + '"';
7
+ }
8
+ /** Formats captured values as a .reg file (UTF-16 friendly text; written as UTF-16LE with BOM). */
9
+ export function toRegFile(values) {
10
+ const byKey = new Map();
11
+ for (const v of values)
12
+ byKey.set(v.key, [...(byKey.get(v.key) ?? []), v]);
13
+ const lines = ['Windows Registry Editor Version 5.00', ''];
14
+ for (const [key, list] of byKey) {
15
+ lines.push('[HKEY_CURRENT_USER\\' + key + ']');
16
+ for (const v of list) {
17
+ const name = regString(v.name);
18
+ switch (v.kind) {
19
+ case 'DWord':
20
+ lines.push(name + '=dword:' + (Number(v.value) >>> 0).toString(16).padStart(8, '0'));
21
+ break;
22
+ case 'QWord':
23
+ lines.push(name +
24
+ '=hex(b):' +
25
+ toHex(Buffer.from(BigInt.asUintN(64, BigInt(v.value))
26
+ .toString(16)
27
+ .padStart(16, '0'), 'hex').reverse()));
28
+ break;
29
+ case 'Binary':
30
+ lines.push(name + '=hex:' + toHex(Buffer.from(String(v.value), 'base64')));
31
+ break;
32
+ case 'ExpandString':
33
+ lines.push(name + '=hex(2):' + toHex(Buffer.from(String(v.value) + '\0', 'utf16le')));
34
+ break;
35
+ case 'MultiString':
36
+ lines.push(name + '=hex(7):' + toHex(Buffer.from(v.value.join('\0') + '\0\0', 'utf16le')));
37
+ break;
38
+ default:
39
+ lines.push(name + '=' + regString(String(v.value)));
40
+ }
41
+ }
42
+ lines.push('');
43
+ }
44
+ return lines.join('\r\n');
45
+ }
@@ -0,0 +1,2 @@
1
+ /** Secret-looking files in the workspace root and one folder down (skipping dependency folders). */
2
+ export declare function findSecretFiles(workspace: string): string[];