windows-development-sandbox 1.4.0 → 1.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (877) hide show
  1. package/.sandbox-config.example.json +2 -1
  2. package/config.example.json +4 -1
  3. package/dist/api.js +27 -16
  4. package/dist/cli/args.d.ts +4 -6
  5. package/dist/cli/args.js +67 -34
  6. package/dist/cli/argv.d.ts +9 -0
  7. package/dist/cli/argv.js +22 -0
  8. package/dist/cli/commands/accounts.d.ts +1 -1
  9. package/dist/cli/commands/accounts.js +42 -27
  10. package/dist/cli/commands/agent-commands.d.ts +3 -3
  11. package/dist/cli/commands/agent-commands.js +27 -18
  12. package/dist/cli/commands/context.d.ts +9 -11
  13. package/dist/cli/commands/context.js +35 -32
  14. package/dist/cli/commands/data/clean.d.ts +2 -2
  15. package/dist/cli/commands/data/clean.js +27 -11
  16. package/dist/cli/commands/data/collect.d.ts +6 -3
  17. package/dist/cli/commands/data/collect.js +46 -15
  18. package/dist/cli/commands/data/index.d.ts +2 -2
  19. package/dist/cli/commands/data/index.js +30 -12
  20. package/dist/cli/commands/data/remove.d.ts +1 -1
  21. package/dist/cli/commands/data/remove.js +4 -4
  22. package/dist/cli/commands/index.d.ts +5 -4
  23. package/dist/cli/commands/index.js +5 -4
  24. package/dist/cli/commands/launch/add-root.d.ts +7 -0
  25. package/dist/cli/commands/launch/add-root.js +64 -0
  26. package/dist/cli/commands/launch/boot-progress.d.ts +7 -0
  27. package/dist/cli/commands/launch/boot-progress.js +48 -0
  28. package/dist/cli/commands/launch/boot-wants.d.ts +11 -0
  29. package/dist/cli/commands/launch/boot-wants.js +48 -0
  30. package/dist/cli/commands/launch/first-start.d.ts +10 -0
  31. package/dist/cli/commands/launch/first-start.js +53 -0
  32. package/dist/cli/commands/launch/index.d.ts +6 -0
  33. package/dist/cli/commands/launch/index.js +6 -0
  34. package/dist/cli/commands/launch/launch.d.ts +8 -0
  35. package/dist/cli/commands/launch/launch.js +211 -0
  36. package/dist/cli/commands/launch/prepare.d.ts +23 -0
  37. package/dist/cli/commands/launch/prepare.js +109 -0
  38. package/dist/cli/commands/launch/running.d.ts +45 -0
  39. package/dist/cli/commands/launch/running.js +218 -0
  40. package/dist/cli/commands/launch/summary.d.ts +8 -0
  41. package/dist/cli/commands/launch/summary.js +98 -0
  42. package/dist/cli/commands/maintenance/audit.d.ts +3 -0
  43. package/dist/cli/commands/maintenance/audit.js +58 -0
  44. package/dist/cli/commands/maintenance/clean.d.ts +2 -0
  45. package/dist/cli/commands/maintenance/clean.js +10 -0
  46. package/dist/cli/commands/maintenance/config.d.ts +2 -0
  47. package/dist/cli/commands/maintenance/config.js +145 -0
  48. package/dist/cli/commands/maintenance/doctor.d.ts +2 -0
  49. package/dist/cli/commands/maintenance/doctor.js +52 -0
  50. package/dist/cli/commands/maintenance/host-claude.d.ts +2 -0
  51. package/dist/cli/commands/maintenance/host-claude.js +4 -0
  52. package/dist/cli/commands/maintenance/index.d.ts +8 -0
  53. package/dist/cli/commands/maintenance/index.js +9 -0
  54. package/dist/cli/commands/maintenance/logs.d.ts +2 -0
  55. package/dist/cli/commands/maintenance/logs.js +44 -0
  56. package/dist/cli/commands/maintenance/sync.d.ts +2 -0
  57. package/dist/cli/commands/maintenance/sync.js +12 -0
  58. package/dist/cli/commands/maintenance/watch.d.ts +3 -0
  59. package/dist/cli/commands/maintenance/watch.js +6 -0
  60. package/dist/cli/commands/projects/describe-sessions.d.ts +3 -0
  61. package/dist/cli/commands/projects/describe-sessions.js +15 -0
  62. package/dist/cli/commands/projects/here.d.ts +38 -0
  63. package/dist/cli/commands/projects/here.js +145 -0
  64. package/dist/cli/commands/projects/index.d.ts +4 -0
  65. package/dist/cli/commands/projects/index.js +4 -0
  66. package/dist/cli/commands/projects/projects.d.ts +14 -0
  67. package/dist/cli/commands/projects/projects.js +213 -0
  68. package/dist/cli/commands/projects/restart.d.ts +15 -0
  69. package/dist/cli/commands/projects/restart.js +149 -0
  70. package/dist/cli/commands/registry.d.ts +3 -0
  71. package/dist/cli/commands/registry.js +34 -0
  72. package/dist/cli/commands/repair/checks.js +105 -29
  73. package/dist/cli/commands/repair/finders.d.ts +13 -10
  74. package/dist/cli/commands/repair/finders.js +63 -43
  75. package/dist/cli/commands/repair/index.d.ts +4 -4
  76. package/dist/cli/commands/repair/index.js +47 -21
  77. package/dist/cli/commands/repair/types.d.ts +2 -2
  78. package/dist/cli/commands/repair/types.js +7 -2
  79. package/dist/cli/commands/sessions/attach.d.ts +2 -0
  80. package/dist/cli/commands/sessions/attach.js +45 -0
  81. package/dist/cli/commands/sessions/control.d.ts +4 -0
  82. package/dist/cli/commands/sessions/control.js +62 -0
  83. package/dist/cli/commands/sessions/exec.d.ts +6 -0
  84. package/dist/cli/commands/sessions/exec.js +72 -0
  85. package/dist/cli/commands/sessions/index.d.ts +6 -0
  86. package/dist/cli/commands/sessions/index.js +9 -0
  87. package/dist/cli/commands/sessions/list.d.ts +15 -0
  88. package/dist/cli/commands/sessions/list.js +65 -0
  89. package/dist/cli/commands/sessions/status.d.ts +2 -0
  90. package/dist/cli/commands/sessions/status.js +153 -0
  91. package/dist/cli/commands/sessions/window.d.ts +3 -0
  92. package/dist/cli/commands/sessions/window.js +18 -0
  93. package/dist/cli/commands/setup/checks.d.ts +4 -4
  94. package/dist/cli/commands/setup/checks.js +36 -19
  95. package/dist/cli/commands/setup/facts.d.ts +6 -6
  96. package/dist/cli/commands/setup/facts.js +23 -11
  97. package/dist/cli/commands/setup/index.d.ts +1 -1
  98. package/dist/cli/commands/setup/index.js +25 -12
  99. package/dist/cli/commands/user-config.d.ts +5 -5
  100. package/dist/cli/commands/user-config.js +14 -12
  101. package/dist/cli/history.d.ts +5 -4
  102. package/dist/cli/history.js +23 -11
  103. package/dist/cli/index.d.ts +4 -14
  104. package/dist/cli/index.js +27 -77
  105. package/dist/cli/manifest.d.ts +464 -10
  106. package/dist/cli/manifest.js +328 -54
  107. package/dist/cli/menu/apps.d.ts +7 -5
  108. package/dist/cli/menu/apps.js +64 -16
  109. package/dist/cli/menu/command-fields.d.ts +15 -0
  110. package/dist/cli/menu/command-fields.js +23 -0
  111. package/dist/cli/menu/command-form.d.ts +3 -5
  112. package/dist/cli/menu/command-form.js +116 -48
  113. package/dist/cli/menu/home.d.ts +22 -0
  114. package/dist/cli/menu/home.js +72 -0
  115. package/dist/cli/menu/index.d.ts +2 -24
  116. package/dist/cli/menu/index.js +4 -178
  117. package/dist/cli/menu/menu.d.ts +23 -0
  118. package/dist/cli/menu/menu.js +185 -0
  119. package/dist/cli/menu/settings/categories.d.ts +2 -2
  120. package/dist/cli/menu/settings/categories.js +123 -20
  121. package/dist/cli/menu/settings/collections/collection-editor.d.ts +23 -0
  122. package/dist/cli/menu/settings/collections/collection-editor.js +89 -0
  123. package/dist/cli/menu/settings/collections/map-editor.d.ts +10 -0
  124. package/dist/cli/menu/settings/collections/map-editor.js +34 -0
  125. package/dist/cli/menu/settings/collections/object-list-editor.d.ts +10 -0
  126. package/dist/cli/menu/settings/collections/object-list-editor.js +23 -0
  127. package/dist/cli/menu/settings/collections/object-map-editor.d.ts +10 -0
  128. package/dist/cli/menu/settings/collections/object-map-editor.js +35 -0
  129. package/dist/cli/menu/settings/collections/string-list-editor.d.ts +12 -0
  130. package/dist/cli/menu/settings/collections/string-list-editor.js +39 -0
  131. package/dist/cli/menu/settings/config-file.d.ts +2 -2
  132. package/dist/cli/menu/settings/config-file.js +42 -19
  133. package/dist/cli/menu/settings/editor-actions.d.ts +2 -0
  134. package/dist/cli/menu/settings/editor-actions.js +2 -0
  135. package/dist/cli/menu/settings/format.d.ts +5 -0
  136. package/dist/cli/menu/settings/format.js +39 -0
  137. package/dist/cli/menu/settings/index.d.ts +1 -29
  138. package/dist/cli/menu/settings/index.js +1 -133
  139. package/dist/cli/menu/settings/object-editor.d.ts +12 -0
  140. package/dist/cli/menu/settings/object-editor.js +86 -0
  141. package/dist/cli/menu/settings/schema-node.d.ts +3 -1
  142. package/dist/cli/menu/settings/schema-node.js +71 -24
  143. package/dist/cli/menu/settings/settings-editor.d.ts +30 -0
  144. package/dist/cli/menu/settings/settings-editor.js +176 -0
  145. package/dist/cli/menu/settings/{editors.d.ts → value-editor.d.ts} +2 -13
  146. package/dist/cli/menu/settings/value-editor.js +137 -0
  147. package/dist/cli/menu/several.d.ts +4 -4
  148. package/dist/cli/menu/several.js +61 -20
  149. package/dist/cli/{colors.d.ts → output/colors.d.ts} +8 -8
  150. package/dist/cli/{colors.js → output/colors.js} +32 -14
  151. package/dist/cli/output/index.d.ts +3 -0
  152. package/dist/cli/output/index.js +3 -0
  153. package/dist/cli/output/print.d.ts +5 -0
  154. package/dist/cli/output/print.js +14 -0
  155. package/dist/cli/output/progress.d.ts +24 -0
  156. package/dist/cli/output/progress.js +124 -0
  157. package/dist/cli/report.d.ts +2 -0
  158. package/dist/cli/report.js +20 -0
  159. package/dist/cli/tui/app.d.ts +6 -16
  160. package/dist/cli/tui/app.js +28 -8
  161. package/dist/cli/tui/dialogs/confirm-screen.d.ts +20 -0
  162. package/dist/cli/tui/dialogs/confirm-screen.js +50 -0
  163. package/dist/cli/tui/dialogs/message-screen.d.ts +17 -0
  164. package/dist/cli/tui/dialogs/message-screen.js +55 -0
  165. package/dist/cli/tui/dialogs/paragraphs.d.ts +2 -0
  166. package/dist/cli/tui/dialogs/paragraphs.js +5 -0
  167. package/dist/cli/tui/dialogs/text-screen.d.ts +26 -0
  168. package/dist/cli/tui/dialogs/text-screen.js +107 -0
  169. package/dist/cli/tui/frame.js +3 -1
  170. package/dist/cli/tui/index.d.ts +7 -3
  171. package/dist/cli/tui/index.js +4 -2
  172. package/dist/cli/tui/list/list-screen.d.ts +29 -0
  173. package/dist/cli/tui/{list-screen.js → list/list-screen.js} +86 -23
  174. package/dist/cli/tui/{list-screen.d.ts → list/list-types.d.ts} +0 -28
  175. package/dist/cli/tui/screen.d.ts +14 -0
  176. package/dist/cli/tui/terminal.js +34 -10
  177. package/dist/cli/tui/text.d.ts +2 -1
  178. package/dist/cli/tui/text.js +37 -7
  179. package/dist/cli/tui/theme.js +27 -9
  180. package/dist/cli/validate.d.ts +8 -8
  181. package/dist/cli/validate.js +32 -21
  182. package/dist/core/config/defaults.d.ts +2 -0
  183. package/dist/core/config/defaults.js +203 -0
  184. package/dist/core/config/index.d.ts +2 -0
  185. package/dist/core/config/index.js +3 -0
  186. package/dist/core/{config.d.ts → config/loader.d.ts} +1 -2
  187. package/dist/core/config/loader.js +47 -0
  188. package/dist/core/{detect-databases.js → detect/databases.js} +111 -23
  189. package/dist/core/detect/index.d.ts +4 -0
  190. package/dist/core/detect/index.js +4 -0
  191. package/dist/core/{detect-pwsh.d.ts → detect/pwsh.d.ts} +1 -1
  192. package/dist/core/{detect-pwsh.js → detect/pwsh.js} +25 -11
  193. package/dist/core/{detect-toolchains.d.ts → detect/toolchains.d.ts} +1 -1
  194. package/dist/core/{detect-toolchains.js → detect/toolchains.js} +42 -5
  195. package/dist/{guest/toolchains → core/detect}/versions.js +28 -12
  196. package/dist/core/disk.d.ts +2 -0
  197. package/dist/core/disk.js +46 -3
  198. package/dist/core/local-config/boot-wants.d.ts +45 -0
  199. package/dist/core/local-config/boot-wants.js +120 -0
  200. package/dist/core/local-config/file.d.ts +3 -0
  201. package/dist/core/local-config/file.js +16 -0
  202. package/dist/core/local-config/index.d.ts +5 -0
  203. package/dist/core/local-config/index.js +7 -0
  204. package/dist/core/{local-config.d.ts → local-config/overrides.d.ts} +11 -11
  205. package/dist/core/{local-config.js → local-config/overrides.js} +53 -54
  206. package/dist/core/{project-policy.d.ts → local-config/policy.d.ts} +7 -3
  207. package/dist/core/{project-policy.js → local-config/policy.js} +16 -6
  208. package/dist/core/local-config/trust.d.ts +13 -0
  209. package/dist/core/local-config/trust.js +43 -0
  210. package/dist/core/package-info.d.ts +4 -0
  211. package/dist/core/package-info.js +13 -0
  212. package/dist/core/run/guest-workspace.d.ts +23 -0
  213. package/dist/core/run/guest-workspace.js +47 -0
  214. package/dist/core/run/index.d.ts +3 -0
  215. package/dist/core/run/index.js +3 -0
  216. package/dist/core/run/resolve-run.d.ts +3 -0
  217. package/dist/core/run/resolve-run.js +202 -0
  218. package/dist/core/run/versions.d.ts +13 -0
  219. package/dist/core/run/versions.js +65 -0
  220. package/dist/core/safe-paths.js +17 -5
  221. package/dist/core/schema/apps.d.ts +4 -4
  222. package/dist/core/schema/apps.js +55 -21
  223. package/dist/core/schema/common.d.ts +13 -10
  224. package/dist/core/schema/common.js +16 -10
  225. package/dist/core/schema/config.d.ts +18 -12
  226. package/dist/core/schema/config.js +78 -53
  227. package/dist/core/schema/databases.d.ts +4 -3
  228. package/dist/core/schema/databases.js +16 -12
  229. package/dist/core/schema/harness.d.ts +1 -1
  230. package/dist/core/schema/harness.js +17 -7
  231. package/dist/core/schema/index.d.ts +6 -0
  232. package/dist/core/schema/index.js +8 -0
  233. package/dist/core/schema/json-schema.js +10 -5
  234. package/dist/core/schema/profile.d.ts +4 -4
  235. package/dist/core/schema/profile.js +37 -17
  236. package/dist/core/schema/projects.d.ts +2 -1
  237. package/dist/core/schema/projects.js +16 -5
  238. package/dist/core/schema/sandbox.d.ts +12 -12
  239. package/dist/core/schema/sandbox.js +101 -37
  240. package/dist/core/schema/toolchains.d.ts +6 -1
  241. package/dist/core/schema/toolchains.js +84 -34
  242. package/dist/core/types.d.ts +36 -9
  243. package/dist/core/util/errors.d.ts +8 -0
  244. package/dist/core/util/errors.js +14 -0
  245. package/dist/core/util/fs.d.ts +8 -0
  246. package/dist/core/util/fs.js +40 -0
  247. package/dist/core/util/index.d.ts +7 -0
  248. package/dist/core/util/index.js +7 -0
  249. package/dist/core/util/jsonc.d.ts +6 -0
  250. package/dist/core/util/jsonc.js +25 -0
  251. package/dist/core/util/links.d.ts +10 -0
  252. package/dist/core/util/links.js +39 -0
  253. package/dist/core/util/paths.d.ts +7 -0
  254. package/dist/core/util/paths.js +33 -0
  255. package/dist/core/util/process.d.ts +15 -0
  256. package/dist/core/util/process.js +54 -0
  257. package/dist/core/util/text.d.ts +8 -0
  258. package/dist/core/util/text.js +8 -0
  259. package/dist/guest/{setup/agents.js → agents/agent-installer.js} +24 -4
  260. package/dist/guest/apps/after-install.d.ts +3 -0
  261. package/dist/guest/apps/after-install.js +47 -0
  262. package/dist/guest/apps/app-installer.d.ts +22 -0
  263. package/dist/guest/apps/app-installer.js +116 -0
  264. package/dist/guest/apps/find-exe.d.ts +5 -0
  265. package/dist/guest/apps/find-exe.js +41 -0
  266. package/dist/guest/apps/index.d.ts +3 -10
  267. package/dist/guest/apps/index.js +6 -206
  268. package/dist/guest/apps/resolvers.js +37 -9
  269. package/dist/guest/apps/shortcuts.d.ts +6 -0
  270. package/dist/guest/apps/shortcuts.js +28 -0
  271. package/dist/guest/apps/sources.d.ts +4 -0
  272. package/dist/guest/apps/sources.js +17 -0
  273. package/dist/guest/apps/unpack.d.ts +3 -0
  274. package/dist/guest/apps/unpack.js +47 -0
  275. package/dist/guest/{audit-parse.js → audit/parse.js} +39 -3
  276. package/dist/guest/{audit.d.ts → audit/process-audit.d.ts} +3 -1
  277. package/dist/guest/{audit.js → audit/process-audit.js} +33 -8
  278. package/dist/guest/boot/boot-env.d.ts +4 -0
  279. package/dist/guest/{boot-env.js → boot/boot-env.js} +7 -5
  280. package/dist/guest/boot/boot.d.ts +1 -0
  281. package/dist/guest/{main.js → boot/boot.js} +100 -50
  282. package/dist/guest/{guide.js → boot/guide.js} +32 -7
  283. package/dist/guest/{project-env.d.ts → boot/project-env.d.ts} +3 -3
  284. package/dist/guest/{project-env.js → boot/project-env.js} +12 -4
  285. package/dist/guest/boot/project-status.d.ts +5 -0
  286. package/dist/guest/boot/project-status.js +28 -0
  287. package/dist/guest/daemon/daemon.d.ts +1 -0
  288. package/dist/guest/daemon/daemon.js +51 -0
  289. package/dist/guest/daemon/exec.js +18 -6
  290. package/dist/guest/daemon/{shutdown.js → idle-shutdown.js} +5 -4
  291. package/dist/guest/daemon/{project.d.ts → project-provisioner.d.ts} +3 -3
  292. package/dist/guest/daemon/{project.js → project-provisioner.js} +60 -22
  293. package/dist/guest/daemon/relays.js +5 -3
  294. package/dist/guest/daemon/{session.js → sessions.js} +84 -24
  295. package/dist/guest/daemon/state.d.ts +4 -1
  296. package/dist/guest/daemon/state.js +34 -20
  297. package/dist/guest/databases/database-server.d.ts +13 -0
  298. package/dist/guest/databases/database-server.js +35 -0
  299. package/dist/guest/databases/dynamodb.d.ts +12 -0
  300. package/dist/guest/databases/dynamodb.js +81 -0
  301. package/dist/guest/databases/index.d.ts +2 -0
  302. package/dist/guest/databases/index.js +2 -0
  303. package/dist/guest/databases/mongodb.d.ts +7 -0
  304. package/dist/guest/databases/mongodb.js +46 -0
  305. package/dist/guest/databases/mysql.d.ts +7 -0
  306. package/dist/guest/databases/mysql.js +59 -0
  307. package/dist/guest/databases/names.d.ts +5 -0
  308. package/dist/guest/databases/names.js +8 -0
  309. package/dist/guest/databases/postgres.d.ts +9 -0
  310. package/dist/guest/databases/postgres.js +85 -0
  311. package/dist/guest/databases/redis.d.ts +7 -0
  312. package/dist/guest/databases/redis.js +25 -0
  313. package/dist/guest/databases/registry.d.ts +5 -0
  314. package/dist/guest/databases/registry.js +51 -0
  315. package/dist/guest/databases/sbx-db.d.ts +1 -0
  316. package/dist/guest/{db.js → databases/sbx-db.js} +13 -13
  317. package/dist/guest/{toolchains/databases → databases}/server.d.ts +5 -5
  318. package/dist/guest/{toolchains/databases → databases}/server.js +18 -13
  319. package/dist/guest/entries/daemon.js +16 -0
  320. package/dist/guest/entries/db.js +10 -0
  321. package/dist/guest/entries/gitguard.js +20 -0
  322. package/dist/guest/entries/main.d.ts +1 -0
  323. package/dist/guest/entries/main.js +24 -0
  324. package/dist/guest/entries/netproxy.d.ts +1 -0
  325. package/dist/guest/entries/netproxy.js +7 -0
  326. package/dist/guest/entries/view.d.ts +1 -0
  327. package/dist/guest/entries/view.js +11 -0
  328. package/dist/guest/{gitguard.js → git/decision.js} +49 -26
  329. package/dist/guest/network/addresses.d.ts +2 -0
  330. package/dist/guest/network/addresses.js +6 -0
  331. package/dist/guest/{setup/network.d.ts → network/allow-only.d.ts} +0 -10
  332. package/dist/guest/network/allow-only.js +84 -0
  333. package/dist/guest/network/firewall.d.ts +9 -0
  334. package/dist/guest/{setup/network.js → network/firewall.js} +58 -63
  335. package/dist/guest/network/proxy-server.d.ts +2 -0
  336. package/dist/guest/{netproxy.js → network/proxy-server.js} +37 -18
  337. package/dist/guest/{helpers.d.ts → runtime/csc.d.ts} +1 -1
  338. package/dist/guest/{helpers.js → runtime/csc.js} +7 -2
  339. package/dist/guest/runtime/fs.d.ts +2 -0
  340. package/dist/guest/runtime/fs.js +6 -0
  341. package/dist/guest/runtime/log.d.ts +3 -0
  342. package/dist/guest/runtime/log.js +22 -0
  343. package/dist/guest/runtime/paths.d.ts +13 -0
  344. package/dist/guest/runtime/paths.js +14 -0
  345. package/dist/guest/{ports.js → runtime/ports.js} +8 -2
  346. package/dist/guest/runtime/process.d.ts +15 -0
  347. package/dist/guest/runtime/process.js +59 -0
  348. package/dist/guest/{project-context.js → runtime/project-context.js} +1 -1
  349. package/dist/guest/runtime/session.d.ts +5 -0
  350. package/dist/guest/runtime/session.js +10 -0
  351. package/dist/guest/runtime/status.d.ts +7 -0
  352. package/dist/guest/runtime/status.js +57 -0
  353. package/dist/guest/{cmdline.js → sessions/cmdline.js} +10 -4
  354. package/dist/guest/{ptyhost.js → sessions/pty-host.js} +12 -5
  355. package/dist/guest/{view.js → sessions/viewer.js} +8 -11
  356. package/dist/guest/setup/claude-mem.d.ts +10 -0
  357. package/dist/guest/setup/{claude.js → claude-mem.js} +18 -78
  358. package/dist/guest/setup/{claude.d.ts → claude-profile.d.ts} +0 -10
  359. package/dist/guest/setup/claude-profile.js +89 -0
  360. package/dist/guest/setup/desktop.d.ts +2 -0
  361. package/dist/guest/setup/desktop.js +32 -0
  362. package/dist/guest/setup/environment.js +28 -5
  363. package/dist/guest/setup/{user.d.ts → git-identity.d.ts} +0 -2
  364. package/dist/guest/setup/git-identity.js +34 -0
  365. package/dist/guest/{gitrules.d.ts → setup/git-rules.d.ts} +1 -1
  366. package/dist/guest/setup/git-rules.js +50 -0
  367. package/dist/guest/setup/hooks.js +22 -5
  368. package/dist/guest/setup/{policy.js → managed-policy.js} +2 -2
  369. package/dist/guest/toolchains/catalogue.d.ts +4 -4
  370. package/dist/guest/toolchains/catalogue.js +30 -7
  371. package/dist/guest/toolchains/detect.d.ts +12 -0
  372. package/dist/guest/toolchains/detect.js +54 -0
  373. package/dist/guest/toolchains/index.d.ts +3 -17
  374. package/dist/guest/toolchains/index.js +1 -80
  375. package/dist/guest/toolchains/install.d.ts +20 -0
  376. package/dist/guest/toolchains/install.js +29 -0
  377. package/dist/guest/toolchains/languages/go.d.ts +3 -0
  378. package/dist/guest/toolchains/{go.js → languages/go.js} +27 -9
  379. package/dist/guest/toolchains/languages/java.d.ts +8 -0
  380. package/dist/guest/toolchains/{java.js → languages/java.js} +57 -18
  381. package/dist/guest/toolchains/languages/node.d.ts +3 -0
  382. package/dist/guest/toolchains/{node.js → languages/node.js} +51 -18
  383. package/dist/guest/toolchains/languages/php.d.ts +3 -0
  384. package/dist/guest/toolchains/{scripting → languages}/php.js +36 -11
  385. package/dist/guest/toolchains/languages/python-tools.d.ts +3 -0
  386. package/dist/guest/toolchains/languages/python-tools.js +12 -0
  387. package/dist/guest/toolchains/languages/python.d.ts +3 -0
  388. package/dist/guest/toolchains/{python.js → languages/python.js} +29 -16
  389. package/dist/guest/toolchains/languages/ruby.d.ts +3 -0
  390. package/dist/guest/toolchains/{scripting → languages}/ruby.js +28 -10
  391. package/dist/guest/toolchains/leftovers.d.ts +1 -1
  392. package/dist/guest/toolchains/leftovers.js +13 -11
  393. package/dist/guest/toolchains/managers.d.ts +6 -6
  394. package/dist/guest/toolchains/managers.js +38 -17
  395. package/dist/guest/toolchains/native/binstall.d.ts +3 -2
  396. package/dist/guest/toolchains/native/binstall.js +20 -8
  397. package/dist/guest/toolchains/native/cpp.d.ts +2 -2
  398. package/dist/guest/toolchains/native/cpp.js +23 -8
  399. package/dist/guest/toolchains/native/dotnet.d.ts +5 -3
  400. package/dist/guest/toolchains/native/dotnet.js +72 -24
  401. package/dist/guest/toolchains/native/mesa.d.ts +2 -2
  402. package/dist/guest/toolchains/native/mesa.js +27 -10
  403. package/dist/guest/toolchains/native/msvc/environment.d.ts +4 -4
  404. package/dist/guest/toolchains/native/msvc/environment.js +30 -16
  405. package/dist/guest/toolchains/native/msvc/index.d.ts +3 -3
  406. package/dist/guest/toolchains/native/msvc/index.js +10 -8
  407. package/dist/guest/toolchains/native/msvc/packages.d.ts +1 -1
  408. package/dist/guest/toolchains/native/msvc/packages.js +69 -23
  409. package/dist/guest/toolchains/native/msvc/tree.d.ts +6 -6
  410. package/dist/guest/toolchains/native/msvc/tree.js +15 -9
  411. package/dist/guest/toolchains/native/rust-extras.d.ts +23 -0
  412. package/dist/guest/toolchains/native/rust-extras.js +100 -0
  413. package/dist/guest/toolchains/native/rust.d.ts +2 -2
  414. package/dist/guest/toolchains/native/rust.js +41 -10
  415. package/dist/guest/toolchains/{scripting → native}/vcruntime.d.ts +2 -2
  416. package/dist/guest/toolchains/{scripting → native}/vcruntime.js +17 -7
  417. package/dist/guest/toolchains/package-ledger.d.ts +17 -0
  418. package/dist/guest/toolchains/package-ledger.js +54 -0
  419. package/dist/guest/toolchains/plan.d.ts +3 -24
  420. package/dist/guest/toolchains/plan.js +99 -111
  421. package/dist/guest/toolchains/runtimes.d.ts +6 -6
  422. package/dist/guest/toolchains/runtimes.js +31 -13
  423. package/dist/guest/toolchains/scheduler.d.ts +22 -0
  424. package/dist/guest/toolchains/scheduler.js +123 -0
  425. package/dist/guest/toolchains/setup.d.ts +10 -0
  426. package/dist/guest/toolchains/setup.js +22 -0
  427. package/dist/guest/toolchains/state-file.d.ts +3 -0
  428. package/dist/guest/toolchains/state-file.js +10 -0
  429. package/dist/guest/toolchains/step.d.ts +24 -0
  430. package/dist/guest/toolchains/step.js +1 -0
  431. package/dist/guest/toolchains/tool-env.d.ts +12 -0
  432. package/dist/guest/toolchains/tool-env.js +16 -0
  433. package/dist/guest/toolchains/tools/cli.d.ts +10 -0
  434. package/dist/guest/toolchains/{cli.js → tools/cli.js} +35 -15
  435. package/dist/guest/toolchains/tools/git.d.ts +3 -0
  436. package/dist/guest/toolchains/{git.js → tools/git.js} +38 -15
  437. package/dist/guest/toolchains/tools/pwsh.d.ts +4 -0
  438. package/dist/guest/toolchains/{pwsh.js → tools/pwsh.js} +14 -7
  439. package/dist/guest/toolchains/{vscode-profile.d.ts → tools/vscode-profile.d.ts} +6 -6
  440. package/dist/guest/toolchains/{vscode-profile.js → tools/vscode-profile.js} +28 -12
  441. package/dist/guest/toolchains/{vscode.d.ts → tools/vscode.d.ts} +6 -6
  442. package/dist/guest/toolchains/{vscode.js → tools/vscode.js} +67 -21
  443. package/dist/guest/toolchains/version-cache.d.ts +16 -0
  444. package/dist/guest/toolchains/version-cache.js +67 -0
  445. package/dist/host/agent-commands/commands.d.ts +13 -0
  446. package/dist/host/agent-commands/commands.js +33 -0
  447. package/dist/host/agent-commands/forwarders.d.ts +7 -0
  448. package/dist/host/agent-commands/forwarders.js +31 -0
  449. package/dist/host/agent-commands/index.d.ts +4 -0
  450. package/dist/host/agent-commands/index.js +4 -0
  451. package/dist/host/agent-commands/reconcile.d.ts +12 -0
  452. package/dist/host/agent-commands/reconcile.js +69 -0
  453. package/dist/host/agent-commands/user-path.d.ts +2 -0
  454. package/dist/host/agent-commands/user-path.js +33 -0
  455. package/dist/host/audit/collect.d.ts +2 -2
  456. package/dist/host/audit/collect.js +59 -22
  457. package/dist/host/audit/log.d.ts +2 -2
  458. package/dist/host/audit/log.js +24 -8
  459. package/dist/host/{attach.d.ts → channel/attach.d.ts} +2 -2
  460. package/dist/host/{attach.js → channel/attach.js} +33 -15
  461. package/dist/host/channel/channel.d.ts +51 -0
  462. package/dist/host/channel/channel.js +196 -0
  463. package/dist/host/channel/index.d.ts +2 -0
  464. package/dist/host/channel/index.js +2 -0
  465. package/dist/host/guard/agent-files.d.ts +7 -0
  466. package/dist/host/guard/agent-files.js +103 -0
  467. package/dist/host/guard/commands.d.ts +10 -0
  468. package/dist/host/guard/commands.js +123 -0
  469. package/dist/host/guard/file-hash.d.ts +4 -0
  470. package/dist/host/guard/file-hash.js +37 -0
  471. package/dist/host/guard/git-config.d.ts +5 -0
  472. package/dist/host/guard/git-config.js +62 -0
  473. package/dist/host/guard/git-dirs.d.ts +12 -0
  474. package/dist/host/guard/git-dirs.js +53 -0
  475. package/dist/host/guard/index.d.ts +5 -0
  476. package/dist/host/guard/index.js +4 -0
  477. package/dist/host/guard/mark-of-the-web.d.ts +8 -0
  478. package/dist/host/guard/mark-of-the-web.js +74 -0
  479. package/dist/host/guard/nested-repos.d.ts +14 -0
  480. package/dist/host/guard/nested-repos.js +88 -0
  481. package/dist/host/guard/quarantine.d.ts +3 -0
  482. package/dist/host/guard/quarantine.js +24 -0
  483. package/dist/host/guard/repo-guard.d.ts +10 -0
  484. package/dist/host/guard/repo-guard.js +36 -0
  485. package/dist/host/guard/store.d.ts +40 -0
  486. package/dist/host/guard/store.js +145 -0
  487. package/dist/host/guard/types.d.ts +27 -0
  488. package/dist/host/guard/types.js +3 -0
  489. package/dist/host/guard/watch-state.d.ts +9 -0
  490. package/dist/host/guard/watch-state.js +26 -0
  491. package/dist/host/launch/boot-projects.d.ts +17 -0
  492. package/dist/host/launch/{projects.js → boot-projects.js} +27 -12
  493. package/dist/host/{database-plan.d.ts → launch/database-plan.d.ts} +5 -5
  494. package/dist/host/{database-plan.js → launch/database-plan.js} +24 -13
  495. package/dist/host/launch/generate.d.ts +4 -0
  496. package/dist/host/launch/generate.js +77 -0
  497. package/dist/host/launch/index.d.ts +10 -0
  498. package/dist/host/launch/index.js +10 -0
  499. package/dist/host/launch/mappings.d.ts +7 -2
  500. package/dist/host/launch/mappings.js +83 -24
  501. package/dist/host/launch/pc-scan.d.ts +5 -0
  502. package/dist/host/{pc-scan.js → launch/pc-scan.js} +20 -13
  503. package/dist/host/launch/project-scan.d.ts +7 -0
  504. package/dist/host/{project-scan.js → launch/project-scan.js} +29 -21
  505. package/dist/host/launch/session-file.d.ts +23 -0
  506. package/dist/host/launch/session-file.js +73 -0
  507. package/dist/host/launch/stage.d.ts +5 -5
  508. package/dist/host/launch/stage.js +14 -13
  509. package/dist/host/launch/toolchains.d.ts +4 -0
  510. package/dist/host/launch/toolchains.js +11 -0
  511. package/dist/host/launch/{wsb.d.ts → wsb-file.d.ts} +4 -2
  512. package/dist/host/launch/wsb-file.js +56 -0
  513. package/dist/host/life/crash-report.d.ts +8 -0
  514. package/dist/host/life/crash-report.js +87 -0
  515. package/dist/host/life/index.d.ts +6 -0
  516. package/dist/host/life/index.js +6 -0
  517. package/dist/host/life/keep-awake.d.ts +10 -0
  518. package/dist/host/life/keep-awake.js +29 -0
  519. package/dist/host/life/life-record.d.ts +48 -0
  520. package/dist/host/life/life-record.js +76 -0
  521. package/dist/host/life/stop-events.d.ts +27 -0
  522. package/dist/host/life/stop-events.js +96 -0
  523. package/dist/host/life/stop-warning.d.ts +4 -0
  524. package/dist/host/life/stop-warning.js +25 -0
  525. package/dist/host/life/windows-update.d.ts +3 -0
  526. package/dist/host/life/windows-update.js +11 -0
  527. package/dist/host/native.d.ts +4 -0
  528. package/dist/host/native.js +11 -0
  529. package/dist/host/network/index.d.ts +1 -0
  530. package/dist/host/network/index.js +1 -0
  531. package/dist/host/{port-forward.d.ts → network/port-forward.d.ts} +1 -1
  532. package/dist/host/{port-forward.js → network/port-forward.js} +16 -10
  533. package/dist/host/profile/accounts.d.ts +37 -0
  534. package/dist/host/profile/accounts.js +146 -0
  535. package/dist/host/profile/claude-login.d.ts +22 -0
  536. package/dist/host/profile/claude-login.js +57 -0
  537. package/dist/host/{claude-profile.d.ts → profile/claude-profile.d.ts} +9 -9
  538. package/dist/host/{claude-profile.js → profile/claude-profile.js} +32 -22
  539. package/dist/host/profile/index.d.ts +7 -0
  540. package/dist/host/profile/index.js +7 -0
  541. package/dist/host/profile/personalize.d.ts +2 -0
  542. package/dist/host/profile/personalize.js +127 -0
  543. package/dist/host/profile/reg-file.d.ts +8 -0
  544. package/dist/host/profile/reg-file.js +45 -0
  545. package/dist/host/profile/secret-files.d.ts +2 -0
  546. package/dist/host/profile/secret-files.js +25 -0
  547. package/dist/host/profile/secret-patterns.d.ts +6 -0
  548. package/dist/host/profile/secret-patterns.js +128 -0
  549. package/dist/host/profile/secrets.d.ts +12 -0
  550. package/dist/host/profile/secrets.js +100 -0
  551. package/dist/host/projects/index.d.ts +4 -0
  552. package/dist/host/projects/index.js +4 -0
  553. package/dist/host/projects/join.d.ts +38 -0
  554. package/dist/host/projects/join.js +119 -0
  555. package/dist/host/projects/known.d.ts +28 -0
  556. package/dist/host/projects/known.js +55 -0
  557. package/dist/host/projects/mapper.d.ts +29 -0
  558. package/dist/host/projects/mapper.js +88 -0
  559. package/dist/host/projects/registry.d.ts +83 -0
  560. package/dist/host/projects/registry.js +136 -0
  561. package/dist/host/sandbox/doctor.d.ts +2 -0
  562. package/dist/host/sandbox/doctor.js +42 -0
  563. package/dist/host/sandbox/host-claude.d.ts +1 -0
  564. package/dist/host/sandbox/host-claude.js +26 -0
  565. package/dist/host/sandbox/index.d.ts +6 -0
  566. package/dist/host/sandbox/index.js +6 -0
  567. package/dist/host/{platform.d.ts → sandbox/platform.d.ts} +0 -5
  568. package/dist/host/sandbox/platform.js +60 -0
  569. package/dist/host/sandbox/probe.d.ts +3 -0
  570. package/dist/host/sandbox/probe.js +47 -0
  571. package/dist/host/{window.js → sandbox/window.js} +7 -5
  572. package/dist/host/{wsb.js → sandbox/wsb-cli.js} +31 -8
  573. package/dist/host/{cleanup.js → storage/cleanup.js} +27 -12
  574. package/dist/host/storage/index.d.ts +2 -0
  575. package/dist/host/storage/index.js +2 -0
  576. package/dist/host/storage/state-files.d.ts +4 -0
  577. package/dist/host/storage/state-files.js +10 -0
  578. package/dist/host/test-guard.js +1 -1
  579. package/dist/host/tools/conpty.d.ts +8 -0
  580. package/dist/host/tools/conpty.js +58 -0
  581. package/dist/host/tools/index.d.ts +2 -0
  582. package/dist/host/tools/index.js +2 -0
  583. package/dist/host/{terminal.d.ts → tools/windows-terminal.d.ts} +2 -10
  584. package/dist/host/{terminal.js → tools/windows-terminal.js} +33 -57
  585. package/dist/host/workspace-view/active-views.d.ts +3 -0
  586. package/dist/host/workspace-view/active-views.js +22 -0
  587. package/dist/host/workspace-view/index.d.ts +2 -18
  588. package/dist/host/workspace-view/index.js +2 -49
  589. package/dist/host/workspace-view/plan.d.ts +16 -0
  590. package/dist/host/workspace-view/plan.js +50 -0
  591. package/dist/host/workspace-view/rules.js +10 -3
  592. package/dist/host/workspace-view/view-state.d.ts +10 -0
  593. package/dist/host/workspace-view/view-state.js +31 -0
  594. package/dist/host/workspace-view/view.d.ts +1 -0
  595. package/dist/host/workspace-view/view.js +51 -55
  596. package/dist/runtime/daemon.js +4232 -1918
  597. package/dist/runtime/db.js +2145 -830
  598. package/dist/runtime/gitguard.js +29 -11
  599. package/dist/runtime/main.js +4760 -2155
  600. package/dist/runtime/netproxy.js +1654 -418
  601. package/dist/runtime/view.js +1515 -453
  602. package/dist/selftest/accounts.test.d.ts +1 -1
  603. package/dist/selftest/accounts.test.js +20 -17
  604. package/dist/selftest/agent-commands.test.d.ts +1 -1
  605. package/dist/selftest/agent-commands.test.js +9 -5
  606. package/dist/selftest/audit.test.d.ts +1 -1
  607. package/dist/selftest/audit.test.js +46 -13
  608. package/dist/selftest/channel.test.d.ts +1 -1
  609. package/dist/selftest/channel.test.js +91 -8
  610. package/dist/selftest/cli.test.d.ts +1 -1
  611. package/dist/selftest/cli.test.js +68 -16
  612. package/dist/selftest/cmdline.test.d.ts +1 -1
  613. package/dist/selftest/cmdline.test.js +36 -7
  614. package/dist/selftest/config.test.d.ts +1 -1
  615. package/dist/selftest/config.test.js +12 -5
  616. package/dist/selftest/data.test.d.ts +1 -1
  617. package/dist/selftest/data.test.js +35 -6
  618. package/dist/selftest/detect.test.d.ts +1 -1
  619. package/dist/selftest/detect.test.js +22 -9
  620. package/dist/selftest/generate.test.d.ts +1 -1
  621. package/dist/selftest/generate.test.js +33 -9
  622. package/dist/selftest/git-access.test.d.ts +1 -1
  623. package/dist/selftest/git-access.test.js +42 -4
  624. package/dist/selftest/guest-boot.test.d.ts +1 -1
  625. package/dist/selftest/guest-boot.test.js +25 -7
  626. package/dist/selftest/host-sim.test.d.ts +1 -1
  627. package/dist/selftest/host-sim.test.js +27 -3
  628. package/dist/selftest/hostile-input.test.d.ts +1 -1
  629. package/dist/selftest/hostile-input.test.js +5 -5
  630. package/dist/selftest/index.d.ts +1 -1
  631. package/dist/selftest/index.js +73 -16
  632. package/dist/selftest/layout.test.d.ts +2 -0
  633. package/dist/selftest/layout.test.js +131 -0
  634. package/dist/selftest/links.test.d.ts +1 -1
  635. package/dist/selftest/links.test.js +16 -11
  636. package/dist/selftest/live-daemon.test.d.ts +1 -1
  637. package/dist/selftest/live-daemon.test.js +20 -8
  638. package/dist/selftest/live-git.test.d.ts +1 -1
  639. package/dist/selftest/live-git.test.js +13 -4
  640. package/dist/selftest/live-network.test.d.ts +1 -1
  641. package/dist/selftest/live-network.test.js +24 -9
  642. package/dist/selftest/live-projects.test.d.ts +1 -1
  643. package/dist/selftest/live-projects.test.js +47 -20
  644. package/dist/selftest/live-terminal.test.d.ts +2 -0
  645. package/dist/selftest/live-terminal.test.js +195 -0
  646. package/dist/selftest/local-config.test.d.ts +1 -1
  647. package/dist/selftest/local-config.test.js +88 -15
  648. package/dist/selftest/mirror.test.d.ts +1 -1
  649. package/dist/selftest/mirror.test.js +118 -19
  650. package/dist/selftest/network.test.d.ts +1 -1
  651. package/dist/selftest/network.test.js +17 -8
  652. package/dist/selftest/personalization.test.d.ts +1 -1
  653. package/dist/selftest/personalization.test.js +12 -5
  654. package/dist/selftest/projects.test.d.ts +1 -1
  655. package/dist/selftest/projects.test.js +336 -72
  656. package/dist/selftest/repair.test.d.ts +1 -1
  657. package/dist/selftest/repair.test.js +17 -5
  658. package/dist/selftest/repo-guard.test.d.ts +1 -1
  659. package/dist/selftest/repo-guard.test.js +21 -20
  660. package/dist/selftest/secrets.test.d.ts +1 -1
  661. package/dist/selftest/secrets.test.js +57 -13
  662. package/dist/selftest/setup.test.d.ts +1 -1
  663. package/dist/selftest/setup.test.js +25 -5
  664. package/dist/selftest/{fixtures.d.ts → support/fixtures.d.ts} +7 -4
  665. package/dist/selftest/{fixtures.js → support/fixtures.js} +95 -17
  666. package/dist/selftest/{harness.js → support/harness.js} +24 -7
  667. package/dist/selftest/{live.d.ts → support/live.d.ts} +2 -2
  668. package/dist/selftest/{live.js → support/live.js} +34 -10
  669. package/dist/selftest/support/suite.js +1 -0
  670. package/dist/selftest/sync.test.d.ts +1 -1
  671. package/dist/selftest/sync.test.js +64 -26
  672. package/dist/selftest/test-guard.test.d.ts +1 -1
  673. package/dist/selftest/test-guard.test.js +43 -15
  674. package/dist/selftest/toolchains.test.d.ts +1 -1
  675. package/dist/selftest/toolchains.test.js +135 -36
  676. package/dist/selftest/workspace-view.test.d.ts +1 -1
  677. package/dist/selftest/workspace-view.test.js +48 -11
  678. package/dist/selftest/workspace.test.d.ts +1 -1
  679. package/dist/selftest/workspace.test.js +13 -4
  680. package/dist/shared/{apps.d.ts → apps/catalogue.d.ts} +1 -11
  681. package/dist/shared/apps/catalogue.js +768 -0
  682. package/dist/shared/apps/index.d.ts +2 -0
  683. package/dist/shared/apps/index.js +2 -0
  684. package/dist/shared/apps/selection.d.ts +11 -0
  685. package/dist/shared/apps/selection.js +40 -0
  686. package/dist/shared/channel/index.d.ts +2 -0
  687. package/dist/shared/channel/index.js +2 -0
  688. package/dist/shared/channel/run-dir.d.ts +30 -0
  689. package/dist/shared/channel/run-dir.js +84 -0
  690. package/dist/shared/{schema.d.ts → channel/schema.d.ts} +60 -19
  691. package/dist/shared/channel/schema.js +131 -0
  692. package/dist/shared/download/archive.d.ts +13 -0
  693. package/dist/shared/download/archive.js +57 -0
  694. package/dist/shared/download/downloader.d.ts +35 -0
  695. package/dist/shared/download/downloader.js +110 -0
  696. package/dist/shared/download/github.d.ts +16 -0
  697. package/dist/shared/download/github.js +74 -0
  698. package/dist/shared/download/http.d.ts +5 -0
  699. package/dist/shared/download/http.js +30 -0
  700. package/dist/shared/download/index.d.ts +5 -0
  701. package/dist/shared/download/index.js +5 -0
  702. package/dist/shared/download/spawn.d.ts +2 -0
  703. package/dist/shared/download/spawn.js +7 -0
  704. package/dist/shared/io/index.d.ts +3 -0
  705. package/dist/shared/io/index.js +3 -0
  706. package/dist/shared/io/json-file.d.ts +10 -0
  707. package/dist/shared/io/json-file.js +21 -0
  708. package/dist/shared/io/json.d.ts +13 -0
  709. package/dist/shared/io/json.js +49 -0
  710. package/dist/shared/{safe-remove.js → io/safe-remove.js} +32 -7
  711. package/dist/shared/{netrules.js → network/firewall-rules.js} +36 -5
  712. package/dist/shared/network/index.d.ts +2 -0
  713. package/dist/shared/network/index.js +2 -0
  714. package/dist/shared/{netpolicy.js → network/policy.js} +66 -11
  715. package/dist/shared/{paths.js → paths/claude-paths.js} +12 -2
  716. package/dist/shared/{guest-paths.d.ts → paths/guest-paths.d.ts} +21 -0
  717. package/dist/shared/paths/guest-paths.js +146 -0
  718. package/dist/shared/paths/index.d.ts +3 -0
  719. package/dist/shared/paths/index.js +3 -0
  720. package/dist/shared/{projects.d.ts → paths/projects.d.ts} +27 -4
  721. package/dist/shared/paths/projects.js +136 -0
  722. package/dist/shared/pty/client.d.ts +21 -0
  723. package/dist/shared/pty/client.js +79 -0
  724. package/dist/shared/pty/console-input.d.ts +11 -0
  725. package/dist/shared/pty/console-input.js +81 -0
  726. package/dist/shared/pty/index.d.ts +6 -0
  727. package/dist/shared/pty/index.js +6 -0
  728. package/dist/shared/pty/input-joiner.d.ts +15 -0
  729. package/dist/shared/pty/input-joiner.js +44 -0
  730. package/dist/shared/pty/output-filter.d.ts +13 -0
  731. package/dist/shared/pty/output-filter.js +140 -0
  732. package/dist/shared/pty/protocol.d.ts +36 -0
  733. package/dist/shared/pty/protocol.js +60 -0
  734. package/dist/shared/pty/terminal.d.ts +24 -0
  735. package/dist/shared/pty/terminal.js +147 -0
  736. package/dist/shared/test-guard.js +3 -1
  737. package/dist/sync/claude-mem.d.ts +1 -1
  738. package/dist/sync/claude-mem.js +9 -4
  739. package/dist/sync/history.d.ts +1 -29
  740. package/dist/sync/history.js +57 -45
  741. package/dist/sync/index.d.ts +5 -0
  742. package/dist/sync/index.js +5 -0
  743. package/dist/sync/sync-cycle.d.ts +18 -0
  744. package/dist/sync/sync-cycle.js +85 -0
  745. package/dist/sync/sync-state.d.ts +32 -0
  746. package/dist/sync/sync-state.js +37 -0
  747. package/dist/sync/watcher.d.ts +0 -18
  748. package/dist/sync/watcher.js +66 -100
  749. package/native/keep-awake.ps1 +8 -0
  750. package/native/power.cs +23 -0
  751. package/native/stop-events.ps1 +38 -0
  752. package/package.json +11 -3
  753. package/sandbox/linkgate.cs +98 -0
  754. package/sandbox/memlog.ps1 +15 -6
  755. package/sandbox/ptyhost.cs +60 -3
  756. package/schemas/config.schema.json +48 -1
  757. package/schemas/sandbox-config.schema.json +37 -3
  758. package/dist/cli/commands/launch.d.ts +0 -29
  759. package/dist/cli/commands/launch.js +0 -366
  760. package/dist/cli/commands/maintenance.d.ts +0 -10
  761. package/dist/cli/commands/maintenance.js +0 -187
  762. package/dist/cli/commands/project.d.ts +0 -29
  763. package/dist/cli/commands/project.js +0 -63
  764. package/dist/cli/commands/projects.d.ts +0 -14
  765. package/dist/cli/commands/projects.js +0 -146
  766. package/dist/cli/commands/restart.d.ts +0 -6
  767. package/dist/cli/commands/restart.js +0 -85
  768. package/dist/cli/commands/sessions.d.ts +0 -12
  769. package/dist/cli/commands/sessions.js +0 -257
  770. package/dist/cli/menu/settings/editors.js +0 -305
  771. package/dist/cli/progress.d.ts +0 -9
  772. package/dist/cli/progress.js +0 -49
  773. package/dist/cli/tui/dialogs.d.ts +0 -57
  774. package/dist/cli/tui/dialogs.js +0 -162
  775. package/dist/core/config.js +0 -109
  776. package/dist/core/schema.d.ts +0 -6
  777. package/dist/core/schema.js +0 -8
  778. package/dist/core/util.d.ts +0 -62
  779. package/dist/core/util.js +0 -156
  780. package/dist/core/workspace.d.ts +0 -18
  781. package/dist/core/workspace.js +0 -145
  782. package/dist/guest/boot-env.d.ts +0 -4
  783. package/dist/guest/daemon.js +0 -57
  784. package/dist/guest/env.d.ts +0 -52
  785. package/dist/guest/env.js +0 -103
  786. package/dist/guest/gitrules.js +0 -11
  787. package/dist/guest/project-status.d.ts +0 -5
  788. package/dist/guest/project-status.js +0 -17
  789. package/dist/guest/setup/user.js +0 -51
  790. package/dist/guest/toolchains/cli.d.ts +0 -10
  791. package/dist/guest/toolchains/common.d.ts +0 -54
  792. package/dist/guest/toolchains/common.js +0 -147
  793. package/dist/guest/toolchains/databases/dynamodb.d.ts +0 -8
  794. package/dist/guest/toolchains/databases/dynamodb.js +0 -52
  795. package/dist/guest/toolchains/databases/index.d.ts +0 -6
  796. package/dist/guest/toolchains/databases/index.js +0 -62
  797. package/dist/guest/toolchains/databases/mongodb.d.ts +0 -3
  798. package/dist/guest/toolchains/databases/mongodb.js +0 -31
  799. package/dist/guest/toolchains/databases/mysql.d.ts +0 -3
  800. package/dist/guest/toolchains/databases/mysql.js +0 -38
  801. package/dist/guest/toolchains/databases/postgres.d.ts +0 -5
  802. package/dist/guest/toolchains/databases/postgres.js +0 -38
  803. package/dist/guest/toolchains/databases/redis.d.ts +0 -3
  804. package/dist/guest/toolchains/databases/redis.js +0 -16
  805. package/dist/guest/toolchains/git.d.ts +0 -3
  806. package/dist/guest/toolchains/go.d.ts +0 -3
  807. package/dist/guest/toolchains/java.d.ts +0 -8
  808. package/dist/guest/toolchains/node.d.ts +0 -3
  809. package/dist/guest/toolchains/pwsh.d.ts +0 -4
  810. package/dist/guest/toolchains/python.d.ts +0 -3
  811. package/dist/guest/toolchains/scripting/php.d.ts +0 -3
  812. package/dist/guest/toolchains/scripting/ruby.d.ts +0 -3
  813. package/dist/host/accounts.d.ts +0 -32
  814. package/dist/host/accounts.js +0 -128
  815. package/dist/host/agent-commands.d.ts +0 -25
  816. package/dist/host/agent-commands.js +0 -145
  817. package/dist/host/channel.d.ts +0 -38
  818. package/dist/host/channel.js +0 -162
  819. package/dist/host/generate.d.ts +0 -13
  820. package/dist/host/generate.js +0 -108
  821. package/dist/host/join.d.ts +0 -28
  822. package/dist/host/join.js +0 -76
  823. package/dist/host/launch/projects.d.ts +0 -15
  824. package/dist/host/launch/wsb.js +0 -34
  825. package/dist/host/motw.d.ts +0 -17
  826. package/dist/host/motw.js +0 -74
  827. package/dist/host/pc-scan.d.ts +0 -6
  828. package/dist/host/personalize.d.ts +0 -10
  829. package/dist/host/personalize.js +0 -97
  830. package/dist/host/platform.js +0 -129
  831. package/dist/host/project-scan.d.ts +0 -7
  832. package/dist/host/projects.d.ts +0 -100
  833. package/dist/host/projects.js +0 -147
  834. package/dist/host/repo-guard.d.ts +0 -43
  835. package/dist/host/repo-guard.js +0 -347
  836. package/dist/host/secrets.d.ts +0 -14
  837. package/dist/host/secrets.js +0 -133
  838. package/dist/host/stops.d.ts +0 -67
  839. package/dist/host/stops.js +0 -126
  840. package/dist/shared/apps.js +0 -114
  841. package/dist/shared/download.d.ts +0 -60
  842. package/dist/shared/download.js +0 -215
  843. package/dist/shared/guest-paths.js +0 -61
  844. package/dist/shared/projects.js +0 -67
  845. package/dist/shared/pty-client.d.ts +0 -91
  846. package/dist/shared/pty-client.js +0 -349
  847. package/dist/shared/rundir.d.ts +0 -41
  848. package/dist/shared/rundir.js +0 -96
  849. package/dist/shared/schema.js +0 -92
  850. /package/dist/{guest/daemon.d.ts → cli/tui/list/list-types.js} +0 -0
  851. /package/dist/{guest/db.d.ts → cli/tui/screen.js} +0 -0
  852. /package/dist/core/{detect-databases.d.ts → detect/databases.d.ts} +0 -0
  853. /package/dist/{guest/toolchains → core/detect}/versions.d.ts +0 -0
  854. /package/dist/guest/{setup/agents.d.ts → agents/agent-installer.d.ts} +0 -0
  855. /package/dist/guest/{audit-parse.d.ts → audit/parse.d.ts} +0 -0
  856. /package/dist/guest/{guide.d.ts → boot/guide.d.ts} +0 -0
  857. /package/dist/guest/daemon/{shutdown.d.ts → idle-shutdown.d.ts} +0 -0
  858. /package/dist/guest/daemon/{session.d.ts → sessions.d.ts} +0 -0
  859. /package/dist/guest/{main.d.ts → entries/daemon.d.ts} +0 -0
  860. /package/dist/guest/{netproxy.d.ts → entries/db.d.ts} +0 -0
  861. /package/dist/{selftest/suite.js → guest/entries/gitguard.d.ts} +0 -0
  862. /package/dist/guest/{gitguard.d.ts → git/decision.d.ts} +0 -0
  863. /package/dist/guest/{ports.d.ts → runtime/ports.d.ts} +0 -0
  864. /package/dist/guest/{project-context.d.ts → runtime/project-context.d.ts} +0 -0
  865. /package/dist/guest/{cmdline.d.ts → sessions/cmdline.d.ts} +0 -0
  866. /package/dist/guest/{ptyhost.d.ts → sessions/pty-host.d.ts} +0 -0
  867. /package/dist/guest/{view.d.ts → sessions/viewer.d.ts} +0 -0
  868. /package/dist/guest/setup/{policy.d.ts → managed-policy.d.ts} +0 -0
  869. /package/dist/host/{window.d.ts → sandbox/window.d.ts} +0 -0
  870. /package/dist/host/{wsb.d.ts → sandbox/wsb-cli.d.ts} +0 -0
  871. /package/dist/host/{cleanup.d.ts → storage/cleanup.d.ts} +0 -0
  872. /package/dist/selftest/{harness.d.ts → support/harness.d.ts} +0 -0
  873. /package/dist/selftest/{suite.d.ts → support/suite.d.ts} +0 -0
  874. /package/dist/shared/{safe-remove.d.ts → io/safe-remove.d.ts} +0 -0
  875. /package/dist/shared/{netrules.d.ts → network/firewall-rules.d.ts} +0 -0
  876. /package/dist/shared/{netpolicy.d.ts → network/policy.d.ts} +0 -0
  877. /package/dist/shared/{paths.d.ts → paths/claude-paths.d.ts} +0 -0
@@ -0,0 +1,25 @@
1
+ // Secret-looking files in a workspace, for a warning at launch (the agent can read them: the folder is mapped).
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ /** Files that usually hold secrets. The agent CAN read them (the whole folder is mapped); we only warn. */
5
+ const SECRET_FILES = /^(\.env(\..+)?|\.envrc|.*\.(pem|key|p12|pfx|jks|keystore|kdbx|tfvars|ovpn)|credentials(\.json)?|secrets?\.(json|ya?ml|toml)|service[-_]?account.*\.json|id_(rsa|ed25519|ecdsa)|\.npmrc|\.pypirc|\.netrc|\.git-credentials)$/i;
6
+ const TEMPLATE = /\.(example|sample|template|dist|defaults?)$/i;
7
+ /** Secret-looking files in the workspace root and one folder down (skipping dependency folders). */
8
+ export function findSecretFiles(workspace) {
9
+ const list = (dir) => {
10
+ try {
11
+ return fs.readdirSync(dir, { withFileTypes: true });
12
+ }
13
+ catch {
14
+ return [];
15
+ }
16
+ };
17
+ const hit = (name) => SECRET_FILES.test(name) && !TEMPLATE.test(name);
18
+ const top = list(workspace);
19
+ const below = top
20
+ .filter((d) => d.isDirectory() && !/^(node_modules|\.git|vendor|target|dist|build|\.venv|venv)$/i.test(d.name))
21
+ .flatMap((d) => list(path.join(workspace, d.name))
22
+ .filter((f) => f.isFile() && hit(f.name))
23
+ .map((f) => d.name + '\\' + f.name));
24
+ return [...top.filter((d) => d.isFile() && hit(d.name)).map((d) => d.name), ...below];
25
+ }
@@ -0,0 +1,6 @@
1
+ /** Variable names that are credentials by definition: cloud, hosting, CI, registries, payment, AI APIs, ... */
2
+ export declare const SECRET_NAMES: readonly RegExp[];
3
+ /** Any name that says what it holds: ..._TOKEN, ..._SECRET, PASSWORD, API_KEY, PRIVATE_KEY, connection strings. */
4
+ export declare const SECRET_WORDS: RegExp;
5
+ /** Values that are credentials whatever they are called. */
6
+ export declare const SECRET_VALUES: readonly RegExp[];
@@ -0,0 +1,128 @@
1
+ // What counts as a credential: variable names, words in names, and values that are credentials whatever their name.
2
+ /** Variable names that are credentials by definition: cloud, hosting, CI, registries, payment, AI APIs, ... */
3
+ export const SECRET_NAMES = [
4
+ /^AWS_/,
5
+ /^AMAZON_/,
6
+ /^AZURE_/,
7
+ /^ARM_(CLIENT|TENANT|SUBSCRIPTION|ACCESS)_/,
8
+ /^MSAL_/,
9
+ /^CLOUDFLARE_/,
10
+ /^CF_(API|ACCOUNT|ZONE|ACCESS)/,
11
+ /^GOOGLE_(APPLICATION_CREDENTIALS|API_KEY|CLOUD_|CLIENT_SECRET)/,
12
+ /^GCP_/,
13
+ /^GCLOUD_/,
14
+ /^GOOGLE_GHA_/,
15
+ /^FIREBASE_/,
16
+ /^DIGITALOCEAN_/,
17
+ /^DO_(API|AUTH)_/,
18
+ /^LINODE_/,
19
+ /^HCLOUD_/,
20
+ /^OCI_/,
21
+ /^ALIBABA_CLOUD_/,
22
+ /^ALICLOUD_/,
23
+ /^IBMCLOUD_/,
24
+ /^HEROKU_/,
25
+ /^VERCEL_/,
26
+ /^NETLIFY_/,
27
+ /^RENDER_API/,
28
+ /^FLY_(API|ACCESS)_/,
29
+ /^RAILWAY_/,
30
+ /^SUPABASE_/,
31
+ /^NEON_/,
32
+ /^PLANETSCALE_/,
33
+ /^GITHUB_TOKEN$/,
34
+ /^GH_TOKEN$/,
35
+ /^GH_ENTERPRISE_TOKEN$/,
36
+ /^GITHUB_PAT/,
37
+ /^GITLAB_/,
38
+ /^BITBUCKET_/,
39
+ /^CIRCLE_TOKEN$/,
40
+ /^TRAVIS_/,
41
+ /^BUILDKITE_/,
42
+ /^NPM_TOKEN$/,
43
+ /^NODE_AUTH_TOKEN$/,
44
+ /^YARN_NPM_AUTH/,
45
+ /^NUGET_(API_KEY|AUTH)/,
46
+ /^PYPI_/,
47
+ /^TWINE_/,
48
+ /^CARGO_REGISTRY_TOKEN$/,
49
+ /^GEM_HOST_API_KEY$/,
50
+ /^DOCKER_(PASSWORD|TOKEN|AUTH)/,
51
+ /^REGISTRY_(PASSWORD|TOKEN)/,
52
+ /^KUBECONFIG$/,
53
+ /^KUBE_TOKEN$/,
54
+ /^HELM_/,
55
+ /^VAULT_/,
56
+ /^CONSUL_HTTP_TOKEN$/,
57
+ /^NOMAD_TOKEN$/,
58
+ /^TF_VAR_/,
59
+ /^TF_TOKEN_/,
60
+ /^TFE_TOKEN$/,
61
+ /^PULUMI_ACCESS_TOKEN$/,
62
+ /^SPACELIFT_/,
63
+ /^ANSIBLE_VAULT/,
64
+ /^STRIPE_/,
65
+ /^PAYPAL_/,
66
+ /^BRAINTREE_/,
67
+ /^SQUARE_/,
68
+ /^ADYEN_/,
69
+ /^TWILIO_/,
70
+ /^SENDGRID_/,
71
+ /^MAILGUN_/,
72
+ /^POSTMARK_/,
73
+ /^MAILCHIMP_/,
74
+ /^RESEND_/,
75
+ /^SLACK_/,
76
+ /^DISCORD_(TOKEN|BOT|WEBHOOK)/,
77
+ /^TELEGRAM_BOT/,
78
+ /^SENTRY_(AUTH|DSN)/,
79
+ /^DATADOG_/,
80
+ /^DD_(API|APP)_KEY$/,
81
+ /^NEW_RELIC_/,
82
+ /^HONEYCOMB_/,
83
+ /^OPENAI_/,
84
+ /^ANTHROPIC_(API_KEY|AUTH_TOKEN)$/,
85
+ /^CLAUDE_CODE_OAUTH_TOKEN$/,
86
+ /^GEMINI_API_KEY$/,
87
+ /^MISTRAL_API_KEY$/,
88
+ /^COHERE_API_KEY$/,
89
+ /^GROQ_API_KEY$/,
90
+ /^HF_TOKEN$/,
91
+ /^HUGGING_?FACE_/,
92
+ /^REPLICATE_API/,
93
+ /^PINECONE_/,
94
+ /^ELEVENLABS_/,
95
+ /^DATABASE_URL$/,
96
+ /^.*_DATABASE_URL$/,
97
+ /^(PG|POSTGRES|MYSQL|MARIADB|MSSQL|MONGO(DB)?|REDIS|ELASTIC(SEARCH)?|RABBITMQ|SNOWFLAKE|DATABRICKS)_/,
98
+ /^SSH_AUTH_SOCK$/,
99
+ /^GPG_/,
100
+ /^OP_(SERVICE_ACCOUNT|CONNECT)_/,
101
+ /^BWS_ACCESS_TOKEN$/,
102
+ /^DOPPLER_/,
103
+ /^INFISICAL_/,
104
+ ];
105
+ /** Any name that says what it holds: ..._TOKEN, ..._SECRET, PASSWORD, API_KEY, PRIVATE_KEY, connection strings. */
106
+ export const SECRET_WORDS = /(^|_)(PROD|PRODUCTION|LIVE|SECRETS?|TOKENS?|PASSWORDS?|PASSWD|PWD|PASS|API_?KEYS?|ACCESS_?KEYS?|PRIVATE_?KEYS?|SIGNING_?KEYS?|CREDENTIALS?|CREDS|AUTH|AUTHORIZATION|BEARER|COOKIES?|SESSION_?KEYS?|CONN(ECTION)?_?STR(ING)?|DSN|WEBHOOK(_URL)?|CLIENT_?SECRET|SAS|SALT|PAT)(_|$)/;
107
+ /** Values that are credentials whatever they are called. */
108
+ export const SECRET_VALUES = [
109
+ /\b(AKIA|ASIA|AGPA|AIDA|AROA)[0-9A-Z]{16}\b/, // AWS access key ids
110
+ /\bgh[pousr]_[A-Za-z0-9]{30,}/,
111
+ /\bgithub_pat_[A-Za-z0-9_]{40,}/,
112
+ /\bglpat-[A-Za-z0-9_-]{20,}/,
113
+ /\bxox[abposr]-[A-Za-z0-9-]{10,}/,
114
+ /\bsk-(ant-|proj-|live_|test_)?[A-Za-z0-9_-]{20,}/,
115
+ /\b[rs]k_live_[A-Za-z0-9]{20,}/,
116
+ /\bAIza[0-9A-Za-z_-]{35}\b/,
117
+ /\bya29\.[0-9A-Za-z_-]{20,}/,
118
+ /\bnpm_[A-Za-z0-9]{36}\b/,
119
+ /\bhf_[A-Za-z0-9]{30,}/,
120
+ /-----BEGIN [A-Z ]*PRIVATE KEY-----/,
121
+ /AccountKey=[A-Za-z0-9+/=]{20,}/i,
122
+ /SharedAccessSignature=|[?&]sig=[A-Za-z0-9%+/=]{20,}/i,
123
+ /\b[a-z][a-z0-9+.-]*:\/\/[^\s:/@]+:[^\s@/]+@/i, // user:password@host in any URL (database URLs, registries)
124
+ /\bBearer\s+\S{16,}/i,
125
+ /\bBasic\s+[A-Za-z0-9+/=]{12,}/i,
126
+ /[?&](api[_-]?key|apikey|access[_-]?token|token|key|secret|password|sig|signature|auth)=[^&\s]{8,}/i, // credentials in a URL
127
+ /\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}/, // JWTs
128
+ ];
@@ -0,0 +1,12 @@
1
+ import type { Config } from '../../core/types.js';
2
+ export type SecretsConfig = Config['secrets'];
3
+ export declare function isSecretName(name: string, secrets: SecretsConfig): boolean;
4
+ export declare function isSecretValue(value: string): boolean;
5
+ /** Whether a variable (name and value) may go into the sandbox. secrets.allow always wins. */
6
+ export declare function mayPass(name: string, value: unknown, secrets: SecretsConfig): boolean;
7
+ /** A copy of an env/headers map without the secrets; the names removed are added to `removed` (with `where`). */
8
+ export declare function stripVariables(vars: unknown, secrets: SecretsConfig, where: string, removed: string[]): unknown;
9
+ /** settings.json for the sandbox: secrets out of "env", credential helper commands removed. */
10
+ export declare function stripSettings(settings: Record<string, unknown>, secrets: SecretsConfig, removed: string[]): Record<string, unknown>;
11
+ /** Every MCP server in a .claude.json-shaped object (top level and per project). */
12
+ export declare function stripMcpServers(state: Record<string, unknown>, secrets: SecretsConfig, removed: string[]): Record<string, unknown>;
@@ -0,0 +1,100 @@
1
+ import { SECRET_NAMES, SECRET_VALUES, SECRET_WORDS } from './secret-patterns.js';
2
+ /** "AWS_REGION", "MY_*", "*_URL": * matches anything. Case-insensitive, like Windows variable names. */
3
+ function globMatch(pattern, name) {
4
+ return new RegExp('^' +
5
+ pattern
6
+ .split('*')
7
+ .map((p) => p.replace(/[.+?^${}()|[\]\\]/g, '\\$&'))
8
+ .join('.*') +
9
+ '$', 'i').test(name);
10
+ }
11
+ export function isSecretName(name, secrets) {
12
+ // X-API-Key, x-auth-token, api.key: compared as X_API_KEY, X_AUTH_TOKEN, API_KEY.
13
+ const upper = name.toUpperCase().replace(/[-\s.]/g, '_');
14
+ return (SECRET_NAMES.some((r) => r.test(upper)) ||
15
+ SECRET_WORDS.test(upper) ||
16
+ secrets.patterns.some((p) => globMatch(p, name)));
17
+ }
18
+ export function isSecretValue(value) {
19
+ return SECRET_VALUES.some((r) => r.test(value));
20
+ }
21
+ /** Whether a variable (name and value) may go into the sandbox. secrets.allow always wins. */
22
+ export function mayPass(name, value, secrets) {
23
+ if (!secrets.strip || secrets.allow.some((p) => globMatch(p, name)))
24
+ return true;
25
+ return !isSecretName(name, secrets) && !(typeof value === 'string' && isSecretValue(value));
26
+ }
27
+ /** A copy of an env/headers map without the secrets; the names removed are added to `removed` (with `where`). */
28
+ export function stripVariables(vars, secrets, where, removed) {
29
+ if (typeof vars !== 'object' || vars === null || Array.isArray(vars))
30
+ return vars;
31
+ return Object.fromEntries(Object.entries(vars).filter(([name, value]) => {
32
+ const ok = mayPass(name, value, secrets);
33
+ if (!ok)
34
+ removed.push(where + name);
35
+ return ok;
36
+ }));
37
+ }
38
+ /** Claude settings keys that run commands to fetch credentials on this PC (they cannot work in the sandbox anyway). */
39
+ const CREDENTIAL_HELPERS = ['apiKeyHelper', 'awsAuthRefresh', 'awsCredentialExport', 'otelHeadersHelper'];
40
+ /** settings.json for the sandbox: secrets out of "env", credential helper commands removed. */
41
+ export function stripSettings(settings, secrets, removed) {
42
+ if (!secrets.strip)
43
+ return settings;
44
+ const out = { ...settings };
45
+ for (const key of CREDENTIAL_HELPERS.filter((k) => k in out)) {
46
+ delete out[key];
47
+ removed.push('settings.json ' + key);
48
+ }
49
+ if ('env' in out)
50
+ out.env = stripVariables(out.env, secrets, 'settings.json env.', removed);
51
+ return out;
52
+ }
53
+ /** One MCP server: secret env vars and headers removed, and secret-looking command-line arguments blanked. */
54
+ function stripServer(server, secrets, where, removed) {
55
+ if (typeof server !== 'object' || server === null)
56
+ return server;
57
+ const out = { ...server };
58
+ if ('env' in out)
59
+ out.env = stripVariables(out.env, secrets, where + ' env.', removed);
60
+ if ('headers' in out)
61
+ out.headers = stripVariables(out.headers, secrets, where + ' header ', removed);
62
+ if (typeof out.url === 'string' && secrets.strip && isSecretValue(out.url)) {
63
+ removed.push(where + ' url (it carried a credential)');
64
+ out.url = out.url.replace(/([?&])[^=&#]+=[^&#]*/g, (m, sep) => isSecretValue('?' + m.slice(1)) ? sep + m.slice(1).split('=')[0] + '=REMOVED' : m);
65
+ }
66
+ if (Array.isArray(out.args) && secrets.strip) {
67
+ out.args = out.args.map((arg, i) => {
68
+ const previous = i > 0 ? String(out.args[i - 1]) : '';
69
+ const [flag, inline] = typeof arg === 'string' && /^--?[\w-]+=/.test(arg)
70
+ ? [arg.slice(0, arg.indexOf('=')), arg.slice(arg.indexOf('=') + 1)]
71
+ : [null, null];
72
+ const secretFlag = (f) => /^--?[\w-]+$/.test(f) && isSecretName(f.replace(/^-+/, ''), secrets);
73
+ const flagged = typeof arg === 'string' &&
74
+ (isSecretValue(arg) || (flag !== null && (secretFlag(flag) || isSecretValue(inline))) || secretFlag(previous));
75
+ if (flagged)
76
+ removed.push(where + ' argument ' + (i + 1));
77
+ return flagged ? '[removed by agent-sandbox]' : arg;
78
+ });
79
+ }
80
+ return out;
81
+ }
82
+ /** Every MCP server in a .claude.json-shaped object (top level and per project). */
83
+ export function stripMcpServers(state, secrets, removed) {
84
+ if (!secrets.strip)
85
+ return state;
86
+ const servers = (owner, where) => {
87
+ const list = owner.mcpServers;
88
+ if (typeof list !== 'object' || list === null)
89
+ return owner;
90
+ return {
91
+ ...owner,
92
+ mcpServers: Object.fromEntries(Object.entries(list).map(([name, s]) => [name, stripServer(s, secrets, where + 'MCP ' + name, removed)])),
93
+ };
94
+ };
95
+ const top = servers(state, '');
96
+ const projects = top.projects;
97
+ return projects
98
+ ? { ...top, projects: Object.fromEntries(Object.entries(projects).map(([key, p]) => [key, servers(p, '')])) }
99
+ : top;
100
+ }
@@ -0,0 +1,4 @@
1
+ export * from './registry.js';
2
+ export * from './mapper.js';
3
+ export * from './known.js';
4
+ export * from './join.js';
@@ -0,0 +1,4 @@
1
+ export * from './registry.js';
2
+ export * from './mapper.js';
3
+ export * from './known.js';
4
+ export * from './join.js';
@@ -0,0 +1,38 @@
1
+ import type { ResolvedRun } from '../../core/types.js';
2
+ import { type Missing } from '../../core/local-config/index.js';
3
+ import { type ProjectSpec } from '../../shared/channel/index.js';
4
+ import { type RegistryEntry } from './registry.js';
5
+ import { type ProjectMapper } from './mapper.js';
6
+ /** The launch folder of the running sandbox (host-only storage; its id comes from the guest, so it is checked). */
7
+ export declare function runningLaunchPath(storageRoot: string, dataPath: string): string | null;
8
+ /** What a session or command from this folder needs: where it is inside, and (for another project) its spec. */
9
+ export interface Joined {
10
+ project: RegistryEntry;
11
+ guestDir: string;
12
+ spec: ProjectSpec | null;
13
+ run: ResolvedRun | null;
14
+ notes: string[];
15
+ /** What it wants at boot that the running sandbox started without (it joined without them). */
16
+ missing: Missing | null;
17
+ }
18
+ /** What to do when a joining project wants something the running sandbox started without. */
19
+ export type MissingChoice = 'continue' | 'restart' | 'cancel';
20
+ /** The project spec the guest provisions from (scans the project folder like a launch does). */
21
+ export declare function projectSpec(run: ResolvedRun, entry: RegistryEntry, hooks: boolean): ProjectSpec;
22
+ /**
23
+ * Makes `hostDir` usable in the running sandbox. The launch folder (or a folder below it) needs nothing; any other
24
+ * folder is resolved with `resolve` (the caller's resolveRun, with the approval prompt), checked, and registered.
25
+ */
26
+ export declare function joinRunning(o: {
27
+ storageRoot: string;
28
+ dataPath: string;
29
+ packageRoot: string;
30
+ hostDir: string;
31
+ wsbShare: boolean;
32
+ resolve: (projectRoot: string) => Promise<ResolvedRun>;
33
+ mapper?: ProjectMapper;
34
+ /** Asked before anything is registered when something is missing (default: continue without it). */
35
+ decide?: (name: string, missing: Missing) => Promise<MissingChoice>;
36
+ /** Asked when the project's own settings are stricter than the running sandbox's (default: refuse). */
37
+ acceptStricter?: (name: string, stricter: string[]) => Promise<boolean>;
38
+ }): Promise<Joined>;
@@ -0,0 +1,119 @@
1
+ // Joining the running sandbox from another folder. The folder's run is resolved exactly as a fresh launch would
2
+ // resolve it (its approved .sandbox-config.json, versions, toolchain detection, database plan), checked against the
3
+ // running sandbox's machine-wide protections, made visible inside (host/projects: a project root, a project
4
+ // mapped at boot, or wsb share) and described to the guest, which provisions what is missing before its session.
5
+ // When none of those can make it visible, NeedsRestart reaches the caller, which offers a restart. So does a project
6
+ // that wants what the sandbox only gets at its start (a .wsb device, more memory, its mappings) when you choose to
7
+ // restart for it; otherwise it joins without them and they are named.
8
+ import fs from 'node:fs';
9
+ import path from 'node:path';
10
+ import { checkJoin, missingAtBoot, nothingMissing, protectionsOf, } from '../../core/local-config/index.js';
11
+ import { resolveToolchains } from '../../core/detect/index.js';
12
+ import { assertNoLinks, dirExists, fail } from '../../core/util/index.js';
13
+ import { IdSchema, RunDir } from '../../shared/channel/index.js';
14
+ import { syncProjectIn } from '../../sync/index.js';
15
+ import { decideProjectToolchains, planDatabases, stageScripts } from '../launch/index.js';
16
+ import { RepoGuardStore } from '../guard/index.js';
17
+ import { ProjectRegistry } from './registry.js';
18
+ import { NeedsRestart, projectMapper } from './mapper.js';
19
+ import { KnownProjects } from './known.js';
20
+ /** The launch folder of the running sandbox (host-only storage; its id comes from the guest, so it is checked). */
21
+ export function runningLaunchPath(storageRoot, dataPath) {
22
+ const launchId = new RunDir(dataPath).readSandboxStatus()?.launchId;
23
+ if (!launchId ||
24
+ !/^\d+-[0-9a-f]{6}$/.test(launchId) ||
25
+ new ProjectRegistry(storageRoot).read()?.launchId !== launchId)
26
+ return null;
27
+ const launchPath = path.join(storageRoot, 'launches', launchId);
28
+ assertNoLinks(storageRoot, launchPath);
29
+ return fs.existsSync(path.join(launchPath, 'session.json')) ? launchPath : null;
30
+ }
31
+ /** The project spec the guest provisions from (scans the project folder like a launch does). */
32
+ export function projectSpec(run, entry, hooks) {
33
+ const { config } = run;
34
+ const toolchains = resolveToolchains(config.toolchains, decideProjectToolchains({ run }));
35
+ const harness = run.harnessName === 'none' ? null : config.harnesses[run.harnessName];
36
+ return {
37
+ name: IdSchema.parse(entry.name),
38
+ workspace: entry.guest,
39
+ workspaceHost: entry.host,
40
+ toolchains,
41
+ versions: run.versions,
42
+ databases: planDatabases(config.databases, run.workspaceHost).slice(0, 8),
43
+ harnesses: harness ? { [run.harnessName]: harness } : {},
44
+ hooks,
45
+ };
46
+ }
47
+ /**
48
+ * Makes `hostDir` usable in the running sandbox. The launch folder (or a folder below it) needs nothing; any other
49
+ * folder is resolved with `resolve` (the caller's resolveRun, with the approval prompt), checked, and registered.
50
+ */
51
+ export async function joinRunning(o) {
52
+ const registryFile = new ProjectRegistry(o.storageRoot);
53
+ const here = registryFile.here(o.hostDir);
54
+ if (here?.project.primary)
55
+ return { ...here, spec: null, run: null, notes: [], missing: null };
56
+ const registry = registryFile.read() ??
57
+ fail('The running sandbox was started by an older version, so it cannot take another folder.', 'Stop it (sandbox stop) and start it again.');
58
+ // A folder below a project already in the sandbox uses that project; anything else becomes a project of its own.
59
+ const root = here?.project.host ?? path.resolve(o.hostDir);
60
+ const run = await o.resolve(root);
61
+ const check = checkJoin(registry.protections, protectionsOf(run.config), Object.keys(registry.atBoot?.widened ?? {}));
62
+ // Machine-wide settings cannot change for one project, so it either runs with the sandbox's (your consent) or not
63
+ // at all.
64
+ const name = here?.project.name ?? path.basename(root);
65
+ const accepted = check.stricter.length > 0 && (await o.acceptStricter?.(name, check.stricter)) === true;
66
+ if (check.stricter.length && !accepted) {
67
+ fail("This project's settings are stricter than the running sandbox's, and those settings are machine-wide:\n " +
68
+ check.stricter.join('\n '), "Join with the sandbox's settings: answer yes in a terminal, or add --yes. Or stop the sandbox (sandbox stop) and start it from " +
69
+ root +
70
+ '.');
71
+ }
72
+ // Boot-only wishes (a .wsb device you allowed for it, more memory, its mappings) the running sandbox lacks.
73
+ const launchPath = runningLaunchPath(o.storageRoot, o.dataPath);
74
+ const boot = registryFile.bootRecord(launchPath);
75
+ const found = boot ? missingAtBoot(registry.protections, boot, run.config, dirExists) : null;
76
+ const missing = found && !nothingMissing(found) ? found : null;
77
+ if (missing) {
78
+ const choice = o.decide ? await o.decide(name, missing) : 'continue';
79
+ if (choice === 'cancel')
80
+ fail('Cancelled: nothing changed.');
81
+ if (choice === 'restart')
82
+ throw new NeedsRestart(root, 'it wants what the sandbox only gets at its start', missing);
83
+ }
84
+ const mapper = o.mapper ?? projectMapper({ storageRoot: o.storageRoot, packageRoot: o.packageRoot, wsbShare: o.wsbShare });
85
+ // Guarded from now on. A folder the sandbox could already write (inside a root, or mapped at boot) and that has no
86
+ // snapshot from the launch gets an empty one: what is there now may have been planted, so it counts as new.
87
+ // Anything else is snapshotted before it becomes visible.
88
+ new RepoGuardStore(o.dataPath).add(root, {
89
+ empty: Boolean(here) || Boolean(registryFile.rootHere(root)),
90
+ });
91
+ const entry = mapper.register(root);
92
+ new KnownProjects(o.storageRoot).remember(entry.host);
93
+ // Your hooks in ~/.agent-sandbox/hooks ran at boot (once per sandbox); the project's own scripts ("scripts" in its
94
+ // .sandbox-config.json, --script) run before its first agent. The launch folder is read-only for the sandbox, but
95
+ // this side can still add them to it.
96
+ const hooks = Boolean(launchPath) && run.scripts.length > 0;
97
+ if (launchPath && hooks)
98
+ stageScripts(path.join(launchPath, 'projects', entry.name, 'hooks', 'pre-agent'), run.scripts);
99
+ try {
100
+ syncProjectIn(o.dataPath, { hostWorkspace: entry.host, guestWorkspace: entry.guest });
101
+ }
102
+ catch {
103
+ /* history is a convenience; never block the session */
104
+ }
105
+ const notes = [
106
+ ...run.notes,
107
+ ...check.looser.map((l) => 'The running sandbox is stricter: ' + l + '.'),
108
+ ...(accepted ? ["Runs with the sandbox's settings (you agreed): " + check.stricter.join('; ') + '.'] : []),
109
+ ...check.shared.map((s) => s + ' is on in this sandbox for another of its projects (you allowed it there); this project shares it.'),
110
+ ];
111
+ return {
112
+ project: entry,
113
+ guestDir: here ? here.guestDir : entry.guest,
114
+ spec: projectSpec(run, entry, hooks),
115
+ run,
116
+ notes,
117
+ missing,
118
+ };
119
+ }
@@ -0,0 +1,28 @@
1
+ import { z } from 'zod';
2
+ declare const KnownSchema: z.ZodObject<{
3
+ projects: z.ZodArray<z.ZodObject<{
4
+ host: z.ZodString;
5
+ lastUsed: z.ZodString;
6
+ }, z.core.$strict>>;
7
+ }, z.core.$strict>;
8
+ type Known = z.output<typeof KnownSchema>;
9
+ export type KnownProject = Known['projects'][number];
10
+ /** known-projects.json under the storage folder: every folder a project was started in. */
11
+ export declare class KnownProjects {
12
+ private readonly file;
13
+ constructor(storageRoot: string);
14
+ list(): KnownProject[];
15
+ remember(hostDir: string): void;
16
+ forget(hostDir: string): boolean;
17
+ }
18
+ /**
19
+ * projects.all: the known projects mapped at boot on their own (existing folders, not excluded, not the launch folder,
20
+ * not inside it or a root, which already show them). Pure apart from checking that the folders exist.
21
+ */
22
+ export declare function allProjectsToMap(known: readonly string[], o: {
23
+ readonly primary: string;
24
+ readonly roots: readonly string[];
25
+ readonly exclude: readonly string[];
26
+ readonly exists?: (p: string) => boolean;
27
+ }): string[];
28
+ export {};
@@ -0,0 +1,55 @@
1
+ import path from 'node:path';
2
+ import { z } from 'zod';
3
+ import { dirExists } from '../../core/util/index.js';
4
+ import { JsonFile } from '../../shared/io/index.js';
5
+ import { isWithin } from '../../shared/paths/index.js';
6
+ import { AbsolutePathSchema } from './registry.js';
7
+ const KnownSchema = z.strictObject({
8
+ projects: z.array(z.strictObject({ host: AbsolutePathSchema, lastUsed: z.string().max(64) })).max(2000),
9
+ });
10
+ /** known-projects.json under the storage folder: every folder a project was started in. */
11
+ export class KnownProjects {
12
+ file;
13
+ constructor(storageRoot) {
14
+ this.file = new JsonFile(KnownSchema, path.join(storageRoot, 'known-projects.json'));
15
+ }
16
+ list() {
17
+ return this.file.read()?.projects ?? [];
18
+ }
19
+ remember(hostDir) {
20
+ const host = path.resolve(hostDir);
21
+ const rest = this.list().filter((p) => p.host.toLowerCase() !== host.toLowerCase());
22
+ try {
23
+ this.file.write({ projects: [{ host, lastUsed: new Date().toISOString() }, ...rest].slice(0, 2000) });
24
+ }
25
+ catch {
26
+ /* a convenience list */
27
+ }
28
+ }
29
+ forget(hostDir) {
30
+ const host = path.resolve(hostDir);
31
+ const all = this.list();
32
+ const rest = all.filter((p) => p.host.toLowerCase() !== host.toLowerCase());
33
+ if (rest.length !== all.length)
34
+ this.file.write({ projects: rest });
35
+ return rest.length !== all.length;
36
+ }
37
+ }
38
+ /**
39
+ * projects.all: the known projects mapped at boot on their own (existing folders, not excluded, not the launch folder,
40
+ * not inside it or a root, which already show them). Pure apart from checking that the folders exist.
41
+ */
42
+ export function allProjectsToMap(known, o) {
43
+ const exists = o.exists ?? dirExists;
44
+ const out = [];
45
+ for (const host of known.map((k) => path.resolve(k))) {
46
+ if (o.exclude.some((e) => isWithin(path.resolve(e), host)))
47
+ continue;
48
+ if (isWithin(o.primary, host) || o.roots.some((r) => isWithin(r, host)))
49
+ continue;
50
+ if (out.some((x) => isWithin(x, host) || isWithin(host, x)) || !exists(host))
51
+ continue;
52
+ out.push(host);
53
+ }
54
+ return out;
55
+ }
@@ -0,0 +1,29 @@
1
+ import type { Missing } from '../../core/local-config/index.js';
2
+ import { type Wsb } from '../sandbox/index.js';
3
+ import { type RegistryEntry } from './registry.js';
4
+ /**
5
+ * Why a folder cannot join the running sandbox without a restart (the caller offers one). With `missing`: it could
6
+ * join, but you chose to restart for what it wants at boot (core/local-config/boot-wants.ts).
7
+ */
8
+ export declare class NeedsRestart extends Error {
9
+ readonly hostDir: string;
10
+ readonly reason: string;
11
+ readonly missing?: Missing | undefined;
12
+ constructor(hostDir: string, reason: string, missing?: Missing | undefined);
13
+ }
14
+ export interface ProjectMapper {
15
+ /** The projects of the running sandbox (the launch folder first). */
16
+ list(): RegistryEntry[];
17
+ /** Makes a folder of this PC a project of the running sandbox; throws NeedsRestart when that needs a restart. */
18
+ register(hostDir: string): RegistryEntry;
19
+ /** Forgets a project (never the launch folder). Its folder stays visible until the next start if it is mapped. */
20
+ unregister(name: string): void;
21
+ }
22
+ export interface MapperOptions {
23
+ storageRoot: string;
24
+ packageRoot: string;
25
+ wsbShare: boolean;
26
+ detect?: () => Wsb | null;
27
+ }
28
+ /** Roots first (instant), then `wsb share` where the Windows Sandbox CLI exists, else NeedsRestart. */
29
+ export declare const projectMapper: (o: MapperOptions) => ProjectMapper;
@@ -0,0 +1,88 @@
1
+ import path from 'node:path';
2
+ import { assertSafeWorkspace } from '../../core/safe-paths.js';
3
+ import { dirExists, fail } from '../../core/util/index.js';
4
+ import { guestDirFor, hubName, ownGuestFolder, projectForHostDir } from '../../shared/paths/index.js';
5
+ import { detectWsb, runningSandboxId, shareFolder } from '../sandbox/index.js';
6
+ import { ProjectRegistry } from './registry.js';
7
+ /**
8
+ * Why a folder cannot join the running sandbox without a restart (the caller offers one). With `missing`: it could
9
+ * join, but you chose to restart for what it wants at boot (core/local-config/boot-wants.ts).
10
+ */
11
+ export class NeedsRestart extends Error {
12
+ hostDir;
13
+ reason;
14
+ missing;
15
+ constructor(hostDir, reason, missing) {
16
+ super(reason);
17
+ this.hostDir = hostDir;
18
+ this.reason = reason;
19
+ this.missing = missing;
20
+ }
21
+ }
22
+ /** Roots first (instant), then `wsb share` where the Windows Sandbox CLI exists, else NeedsRestart. */
23
+ export const projectMapper = (o) => {
24
+ const store = new ProjectRegistry(o.storageRoot);
25
+ const registry = () => store.read() ??
26
+ fail('The running sandbox was started by an older version, so it cannot take another folder.', 'Stop it (sandbox stop) and start it again.');
27
+ const add = (reg, host, guest, mechanism, name) => {
28
+ const entry = {
29
+ name,
30
+ host,
31
+ guest,
32
+ primary: false,
33
+ mechanism,
34
+ registeredAt: new Date().toISOString(),
35
+ };
36
+ // Re-read right before writing: another terminal may have registered something meanwhile.
37
+ const latest = store.read() ?? reg;
38
+ const same = latest.projects.find((p) => p.host.toLowerCase() === host.toLowerCase());
39
+ if (same)
40
+ return same;
41
+ store.save({ ...latest, projects: [...latest.projects, entry] });
42
+ return entry;
43
+ };
44
+ return {
45
+ list: () => store.read()?.projects ?? [],
46
+ register: (hostDir) => {
47
+ const host = path.resolve(hostDir);
48
+ const reg = registry();
49
+ const known = reg.projects.find((p) => p.host.toLowerCase() === host.toLowerCase());
50
+ if (known)
51
+ return known;
52
+ assertSafeWorkspace(host, o.packageRoot, o.storageRoot);
53
+ if (!dirExists(host))
54
+ fail('The folder does not exist: ' + host);
55
+ const name = hubName(host, reg.projects.map((p) => p.name));
56
+ // Inside a root: visible already (also a project created after the sandbox started).
57
+ const root = projectForHostDir(reg.roots, host);
58
+ if (root)
59
+ return add(reg, host, guestDirFor(root, host), 'root', name);
60
+ if (!o.wsbShare)
61
+ throw new NeedsRestart(host, 'it is not inside a project root (projects.roots), and adding folders with wsb share is off (projects.wsbShare)');
62
+ const wsb = (o.detect ?? detectWsb)();
63
+ if (!wsb?.has('share'))
64
+ throw new NeedsRestart(host, 'it is not inside a project root (projects.roots), and this Windows has no Windows Sandbox command line (wsb share needs Windows 11 24H2+ with the updated Windows Sandbox)');
65
+ const sandbox = runningSandboxId(wsb);
66
+ if (!sandbox.id)
67
+ throw new NeedsRestart(host, 'wsb share could not find the running sandbox: ' + sandbox.error);
68
+ // Where it is as a launch folder too (C:\Workspace\<name>), unless another project already uses that place.
69
+ const guest = ownGuestFolder(host, false, [
70
+ ...reg.projects.map((p) => p.guest),
71
+ ...reg.roots.map((r) => r.guest),
72
+ ]);
73
+ const shared = shareFolder(wsb, sandbox.id, host, guest);
74
+ if (!shared.ok)
75
+ throw new NeedsRestart(host, 'wsb share failed (untested on this Windows): ' + shared.error);
76
+ return add(reg, host, guest, 'wsb', name);
77
+ },
78
+ unregister: (name) => {
79
+ const reg = registry();
80
+ const entry = reg.projects.find((p) => p.name.toLowerCase() === name.toLowerCase());
81
+ if (!entry)
82
+ fail('No project "' + name + '" in the running sandbox.', 'sandbox projects lists them.');
83
+ if (entry.primary)
84
+ fail(entry.host + ' is the folder the sandbox started from; it stays until the sandbox stops.');
85
+ store.save({ ...reg, projects: reg.projects.filter((p) => p !== entry) });
86
+ },
87
+ };
88
+ };