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
@@ -15,25 +15,13 @@
15
15
  import fs from 'node:fs';
16
16
  import path from 'node:path';
17
17
  import _ from 'lodash';
18
- import { z } from 'zod';
19
- import { guestWorkspaceAliases, isSafeFileName, projectFolderName, translatePaths } from '../shared/paths.js';
20
- import { readValid, writeJsonAtomic } from '../shared/rundir.js';
18
+ import { guestWorkspaceAliases, isSafeFileName, projectFolderName, translatePaths } from '../shared/paths/index.js';
21
19
  import { assertTestWritable } from '../host/test-guard.js';
22
- import { dirExists, ensureDir, fileExists, isLink, removeLink } from '../core/util.js';
20
+ import { dirExists, ensureDir, fileExists, isLink, removeLink } from '../core/util/index.js';
23
21
  export { projectFolderName, translatePaths };
24
22
  const SESSION_DIRS = ['todos', 'plans', 'file-history'];
25
23
  const DATA_FILE = /\.(jsonl?|txt|md)$/i;
26
24
  const MAX_FILE_BYTES = 100 * 1024 * 1024;
27
- /** Host-only record of the last launch: which folders map to each other and what syncs (from the effective config). */
28
- const AbsolutePath = z.string().max(1024).refine((p) => path.isAbsolute(p), 'must be an absolute path');
29
- const SyncStateSchema = z.object({
30
- hostClaudeDir: AbsolutePath, hostWorkspace: AbsolutePath, guestWorkspace: z.string().max(1024),
31
- syncHistory: z.boolean().optional(), syncClaudeMem: z.boolean().optional(), syncClaudeMemBack: z.boolean().optional(), historyScope: z.enum(['project', 'all']).optional(),
32
- /** Newest claude-mem database time on each side right after the last sync (detects edits on both sides). */
33
- memHostStamp: z.number().optional(), memGuestStamp: z.number().optional(),
34
- /** Projects registered while the sandbox ran (their history goes back to their own folders). */
35
- projects: z.array(z.object({ hostWorkspace: AbsolutePath, guestWorkspace: z.string().max(1024) })).max(256).optional(),
36
- });
37
25
  const anyFile = () => true;
38
26
  const transcript = (name) => name.endsWith('.jsonl');
39
27
  const json = (name) => name.endsWith('.json');
@@ -86,30 +74,40 @@ const copyNewer = (from, to, options = {}) => {
86
74
  return 1;
87
75
  });
88
76
  };
89
- const readLines = (file) => fileExists(file) && !isLink(file) && fs.statSync(file).size <= MAX_FILE_BYTES ? fs.readFileSync(file, 'utf8').split(/\r?\n/).filter((l) => l.trim() !== '') : [];
90
- const isJsonObject = (line) => { try {
91
- const v = JSON.parse(line);
92
- return typeof v === 'object' && v !== null && !Array.isArray(v);
93
- }
94
- catch {
95
- return false;
96
- } };
77
+ const readLines = (file) => fileExists(file) && !isLink(file) && fs.statSync(file).size <= MAX_FILE_BYTES
78
+ ? fs
79
+ .readFileSync(file, 'utf8')
80
+ .split(/\r?\n/)
81
+ .filter((l) => l.trim() !== '')
82
+ : [];
83
+ const isJsonObject = (line) => {
84
+ try {
85
+ const v = JSON.parse(line);
86
+ return typeof v === 'object' && v !== null && !Array.isArray(v);
87
+ }
88
+ catch {
89
+ return false;
90
+ }
91
+ };
97
92
  /** A prompt-history line whose project is one of `workspaces` (on this PC's side). */
98
93
  const inProjects = (line, workspaces) => {
99
94
  try {
100
95
  const project = JSON.parse(line).project;
101
- return typeof project === 'string' && workspaces.some((w) => path.resolve(w).toLowerCase() === path.resolve(project).toLowerCase());
96
+ return (typeof project === 'string' &&
97
+ workspaces.some((w) => path.resolve(w).toLowerCase() === path.resolve(project).toLowerCase()));
102
98
  }
103
99
  catch {
104
100
  return false;
105
101
  }
106
102
  };
107
- const lineTime = (line) => { try {
108
- return Number(JSON.parse(line).timestamp) || 0;
109
- }
110
- catch {
111
- return 0;
112
- } };
103
+ const lineTime = (line) => {
104
+ try {
105
+ return Number(JSON.parse(line).timestamp) || 0;
106
+ }
107
+ catch {
108
+ return 0;
109
+ }
110
+ };
113
111
  /** Every workspace pair of the sandbox: the launch folder's, then the projects registered later (most specific first). */
114
112
  const pairsOf = (p) => _.sortBy([{ hostWorkspace: p.hostWorkspace, guestWorkspace: p.guestWorkspace }, ...(p.extra ?? [])], (x) => -x.hostWorkspace.length);
115
113
  const translateAll = (text, pairs) => pairs.reduce((out, [from, to]) => translatePaths(out, from, to), text);
@@ -122,17 +120,28 @@ export const syncHistoryIn = (p, options = {}) => {
122
120
  const guestNames = new Set(pairs.map((x) => projectFolderName(x.guestWorkspace)));
123
121
  const transform = (t) => translateAll(t, pairs.map((x) => [x.hostWorkspace, x.guestWorkspace]));
124
122
  const hostProjects = path.join(p.hostClaudeDir, 'projects');
125
- const names = dirExists(hostProjects) ? fs.readdirSync(hostProjects).filter((name) => isSafeFileName(name) && (all ? !guestNames.has(name) || byHost.has(name) : byHost.has(name))) : [];
123
+ const names = dirExists(hostProjects)
124
+ ? fs
125
+ .readdirSync(hostProjects)
126
+ .filter((name) => isSafeFileName(name) && (all ? !guestNames.has(name) || byHost.has(name) : byHost.has(name)))
127
+ : [];
126
128
  const projects = _.sumBy(names, (name) => byHost.has(name)
127
- ? copyNewer(path.join(hostProjects, name), path.join(p.guestClaudeDir, 'projects', byHost.get(name)), { transform })
129
+ ? copyNewer(path.join(hostProjects, name), path.join(p.guestClaudeDir, 'projects', byHost.get(name)), {
130
+ transform,
131
+ })
128
132
  : copyNewer(path.join(hostProjects, name), path.join(p.guestClaudeDir, 'projects', name)));
129
133
  // To-do lists, plans and file backups are kept by session, not by project: only with historyScope "all".
130
- const sessions = all ? _.sumBy(SESSION_DIRS, (dir) => copyNewer(path.join(p.hostClaudeDir, dir), path.join(p.guestClaudeDir, dir))) : 0;
134
+ const sessions = all
135
+ ? _.sumBy(SESSION_DIRS, (dir) => copyNewer(path.join(p.hostClaudeDir, dir), path.join(p.guestClaudeDir, dir)))
136
+ : 0;
131
137
  if (options.promptHistory === false)
132
138
  return projects + sessions;
133
139
  // Prompt history: rebuild the sandbox copy from this PC's file plus anything only the sandbox has.
134
140
  const target = path.join(p.guestClaudeDir, 'history.jsonl');
135
- const hostLines = readLines(path.join(p.hostClaudeDir, 'history.jsonl')).filter((l) => all || inProjects(l, pairs.map((x) => x.hostWorkspace))).map(transform);
141
+ const hostLines = readLines(path.join(p.hostClaudeDir, 'history.jsonl'))
142
+ .filter((l) => all ||
143
+ inProjects(l, pairs.map((x) => x.hostWorkspace)))
144
+ .map(transform);
136
145
  const known = new Set(hostLines);
137
146
  const merged = _.sortBy([...hostLines, ...readLines(target).filter((l) => !known.has(l))], lineTime);
138
147
  if (merged.length) {
@@ -150,27 +159,30 @@ export const syncHistoryOut = (p) => {
150
159
  const byGuest = new Map(pairs.map(([guest, host]) => [projectFolderName(guest), projectFolderName(host)]));
151
160
  const transform = (t) => translateAll(t, pairs);
152
161
  const guestProjectsDir = path.join(p.guestClaudeDir, 'projects');
153
- const names = dirExists(guestProjectsDir) && !isLink(guestProjectsDir) ? fs.readdirSync(guestProjectsDir).filter(isSafeFileName) : [];
162
+ const names = dirExists(guestProjectsDir) && !isLink(guestProjectsDir)
163
+ ? fs.readdirSync(guestProjectsDir).filter(isSafeFileName)
164
+ : [];
154
165
  // Only this sandbox's projects: a transcript under any other folder name would be planted into that project on this PC.
155
- const projects = _.sumBy(names.filter((name) => byGuest.has(name)), (name) => copyNewer(path.join(guestProjectsDir, name), path.join(p.hostClaudeDir, 'projects', byGuest.get(name)), { accept: transcript, skipDirs: NO_MEMORY, transform }));
166
+ const projects = _.sumBy(names.filter((name) => byGuest.has(name)), (name) => copyNewer(path.join(guestProjectsDir, name), path.join(p.hostClaudeDir, 'projects', byGuest.get(name)), {
167
+ accept: transcript,
168
+ skipDirs: NO_MEMORY,
169
+ transform,
170
+ }));
156
171
  // Only to-do lists come back besides transcripts; plans and file backups stay in the sandbox.
157
- const sessions = copyNewer(path.join(p.guestClaudeDir, 'todos'), path.join(p.hostClaudeDir, 'todos'), { accept: json });
172
+ const sessions = copyNewer(path.join(p.guestClaudeDir, 'todos'), path.join(p.hostClaudeDir, 'todos'), {
173
+ accept: json,
174
+ });
158
175
  const hostFile = path.join(p.hostClaudeDir, 'history.jsonl');
159
176
  const known = new Set(readLines(hostFile));
160
177
  // Only prompt-history entries (one JSON object per line) of this sandbox's projects come back.
161
178
  const hostWorkspaces = pairsOf(p).map((x) => x.hostWorkspace);
162
- const missing = readLines(path.join(p.guestClaudeDir, 'history.jsonl')).filter(isJsonObject).map(transform).filter((l) => inProjects(l, hostWorkspaces) && !known.has(l));
179
+ const missing = readLines(path.join(p.guestClaudeDir, 'history.jsonl'))
180
+ .filter(isJsonObject)
181
+ .map(transform)
182
+ .filter((l) => inProjects(l, hostWorkspaces) && !known.has(l));
163
183
  if (missing.length) {
164
184
  ensureDir(p.hostClaudeDir);
165
185
  fs.appendFileSync(hostFile, missing.join('\n') + '\n', 'utf8');
166
186
  }
167
187
  return projects + sessions + missing.length;
168
188
  };
169
- /**
170
- * Host-only: <storage>\sync\<dataName>.json. It records which folder on this PC history flows back into, so it must
171
- * never live in the data folder the sandbox can write (a forged copy could redirect writes anywhere on this PC).
172
- */
173
- export const syncStatePath = (dataPath) => path.join(path.dirname(path.dirname(dataPath)), 'sync', path.basename(dataPath) + '.json');
174
- /** A state file that is missing, oversized or not in this shape counts as no state (nothing syncs back until the next launch). */
175
- export const readSyncState = (dataPath) => readValid(SyncStateSchema, syncStatePath(dataPath));
176
- export const writeSyncState = (dataPath, state) => writeJsonAtomic(syncStatePath(dataPath), state);
@@ -0,0 +1,5 @@
1
+ export * from './claude-mem.js';
2
+ export * from './history.js';
3
+ export * from './sync-state.js';
4
+ export * from './sync-cycle.js';
5
+ export * from './watcher.js';
@@ -0,0 +1,5 @@
1
+ export * from './claude-mem.js';
2
+ export * from './history.js';
3
+ export * from './sync-state.js';
4
+ export * from './sync-cycle.js';
5
+ export * from './watcher.js';
@@ -0,0 +1,18 @@
1
+ import type { Config } from '../core/types.js';
2
+ import { type MemResult } from './claude-mem.js';
3
+ /**
4
+ * A project registered while the sandbox runs: its history comes in now (the sandbox's copy only gains files), and
5
+ * from now on syncs back to its own folder on this PC.
6
+ */
7
+ export declare const syncProjectIn: (dataPath: string, project: {
8
+ hostWorkspace: string;
9
+ guestWorkspace: string;
10
+ }) => number;
11
+ export interface SyncSummary {
12
+ history: number;
13
+ claudeMem: MemResult | 'disabled';
14
+ }
15
+ /** Before launch: finish syncing the previous run out, then bring this PC's history (and claude-mem) in. */
16
+ export declare const syncBeforeLaunch: (config: Config, dataPath: string, hostWorkspace: string) => SyncSummary;
17
+ /** Syncs the sandbox's history (and, when `final`, claude-mem) back to this PC, as configured for the last launch. */
18
+ export declare const syncBack: (dataPath: string, final: boolean) => SyncSummary;
@@ -0,0 +1,85 @@
1
+ import path from 'node:path';
2
+ import { assertNoLinks } from '../core/util/index.js';
3
+ import { hostClaudeDir } from '../host/profile/index.js';
4
+ import { hostClaudeMemDir, syncClaudeMem } from './claude-mem.js';
5
+ import { readSyncState, writeSyncState } from './sync-state.js';
6
+ import { syncHistoryIn, syncHistoryOut } from './history.js';
7
+ const guestClaude = (dataPath) => path.join(dataPath, 'state', 'claude');
8
+ const guestMem = (dataPath) => path.join(dataPath, 'state', 'claude-mem');
9
+ /** Sync paths for the sandbox side, after checking nothing on the way there is a link planted by the sandbox. */
10
+ const toPaths = (state, dataPath) => {
11
+ assertNoLinks(dataPath, guestClaude(dataPath));
12
+ return {
13
+ hostClaudeDir: state.hostClaudeDir,
14
+ guestClaudeDir: guestClaude(dataPath),
15
+ hostWorkspace: state.hostWorkspace,
16
+ guestWorkspace: state.guestWorkspace,
17
+ extra: state.projects ?? [],
18
+ };
19
+ };
20
+ /**
21
+ * A project registered while the sandbox runs: its history comes in now (the sandbox's copy only gains files), and
22
+ * from now on syncs back to its own folder on this PC.
23
+ */
24
+ export const syncProjectIn = (dataPath, project) => {
25
+ const state = readSyncState(dataPath);
26
+ if (!state)
27
+ return 0;
28
+ const projects = [
29
+ ...(state.projects ?? []).filter((p) => p.hostWorkspace.toLowerCase() !== project.hostWorkspace.toLowerCase()),
30
+ project,
31
+ ];
32
+ const next = { ...state, projects };
33
+ writeSyncState(dataPath, next);
34
+ // Prompt history is left alone: sessions are appending to the sandbox's copy right now.
35
+ return state.syncHistory
36
+ ? syncHistoryIn(toPaths(next, dataPath), { promptHistory: false, scope: state.historyScope })
37
+ : 0;
38
+ };
39
+ const memSync = (dataPath, state, direction) => {
40
+ assertNoLinks(dataPath, guestMem(dataPath));
41
+ return syncClaudeMem(hostClaudeMemDir(), guestMem(dataPath), state, direction);
42
+ };
43
+ /** Before launch: finish syncing the previous run out, then bring this PC's history (and claude-mem) in. */
44
+ export const syncBeforeLaunch = (config, dataPath, hostWorkspace) => {
45
+ const profile = config.claudeProfile;
46
+ const summary = { history: 0, claudeMem: 'disabled' };
47
+ if (!config.storage.persistAgentState)
48
+ return summary;
49
+ const previous = readSyncState(dataPath);
50
+ if (previous?.syncHistory)
51
+ syncHistoryOut(toPaths(previous, dataPath));
52
+ const state = {
53
+ ...previous,
54
+ hostClaudeDir: hostClaudeDir(profile),
55
+ hostWorkspace,
56
+ guestWorkspace: config.guestWorkspace,
57
+ syncHistory: profile.syncHistory,
58
+ historyScope: profile.historyScope,
59
+ syncClaudeMem: profile.syncClaudeMem,
60
+ syncClaudeMemBack: profile.syncClaudeMemBack,
61
+ projects: [],
62
+ };
63
+ if (profile.syncHistory)
64
+ summary.history = syncHistoryIn(toPaths(state, dataPath), { scope: profile.historyScope });
65
+ if (profile.syncClaudeMem) {
66
+ if (previous?.syncClaudeMem && previous.syncClaudeMemBack)
67
+ memSync(dataPath, state, 'out');
68
+ summary.claudeMem = memSync(dataPath, state, 'in');
69
+ }
70
+ writeSyncState(dataPath, state);
71
+ return summary;
72
+ };
73
+ /** Syncs the sandbox's history (and, when `final`, claude-mem) back to this PC, as configured for the last launch. */
74
+ export const syncBack = (dataPath, final) => {
75
+ const state = readSyncState(dataPath);
76
+ const summary = { history: 0, claudeMem: 'disabled' };
77
+ if (!state)
78
+ return summary;
79
+ if (state.syncHistory)
80
+ summary.history = syncHistoryOut(toPaths(state, dataPath));
81
+ if (final && state.syncClaudeMem && state.syncClaudeMemBack)
82
+ summary.claudeMem = memSync(dataPath, state, 'out');
83
+ writeSyncState(dataPath, state);
84
+ return summary;
85
+ };
@@ -0,0 +1,32 @@
1
+ import { z } from 'zod';
2
+ declare const SyncStateSchema: z.ZodObject<{
3
+ hostClaudeDir: z.ZodString;
4
+ hostWorkspace: z.ZodString;
5
+ guestWorkspace: z.ZodString;
6
+ syncHistory: z.ZodOptional<z.ZodBoolean>;
7
+ syncClaudeMem: z.ZodOptional<z.ZodBoolean>;
8
+ syncClaudeMemBack: z.ZodOptional<z.ZodBoolean>;
9
+ historyScope: z.ZodOptional<z.ZodEnum<{
10
+ project: "project";
11
+ all: "all";
12
+ }>>;
13
+ memHostStamp: z.ZodOptional<z.ZodNumber>;
14
+ memGuestStamp: z.ZodOptional<z.ZodNumber>;
15
+ projects: z.ZodOptional<z.ZodArray<z.ZodObject<{
16
+ hostWorkspace: z.ZodString;
17
+ guestWorkspace: z.ZodString;
18
+ }, z.core.$strip>>>;
19
+ }, z.core.$strip>;
20
+ export type SyncState = z.output<typeof SyncStateSchema>;
21
+ /**
22
+ * Host-only: <storage>\sync\<dataName>.json. It records which folder on this PC history flows back into, so it must
23
+ * never live in the data folder the sandbox can write (a forged copy could redirect writes anywhere on this PC).
24
+ */
25
+ export declare const syncStatePath: (dataPath: string) => string;
26
+ /**
27
+ * A state file that is missing, oversized or not in this shape counts as no state (nothing syncs back until the next
28
+ * launch).
29
+ */
30
+ export declare const readSyncState: (dataPath: string) => SyncState | null;
31
+ export declare const writeSyncState: (dataPath: string, state: SyncState) => void;
32
+ export {};
@@ -0,0 +1,37 @@
1
+ import path from 'node:path';
2
+ import { z } from 'zod';
3
+ import { JsonFile } from '../shared/io/index.js';
4
+ import { hostStateFile, storageOf } from '../host/storage/index.js';
5
+ /** Host-only record of the last launch: which folders map to each other and what syncs (from the effective config). */
6
+ const AbsolutePathSchema = z
7
+ .string()
8
+ .max(1024)
9
+ .refine((p) => path.isAbsolute(p), 'must be an absolute path');
10
+ const SyncStateSchema = z.object({
11
+ hostClaudeDir: AbsolutePathSchema,
12
+ hostWorkspace: AbsolutePathSchema,
13
+ guestWorkspace: z.string().max(1024),
14
+ syncHistory: z.boolean().optional(),
15
+ syncClaudeMem: z.boolean().optional(),
16
+ syncClaudeMemBack: z.boolean().optional(),
17
+ historyScope: z.enum(['project', 'all']).optional(),
18
+ /** Newest claude-mem database time on each side right after the last sync (detects edits on both sides). */
19
+ memHostStamp: z.number().optional(),
20
+ memGuestStamp: z.number().optional(),
21
+ /** Projects registered while the sandbox ran (their history goes back to their own folders). */
22
+ projects: z
23
+ .array(z.object({ hostWorkspace: AbsolutePathSchema, guestWorkspace: z.string().max(1024) }))
24
+ .max(256)
25
+ .optional(),
26
+ });
27
+ /**
28
+ * Host-only: <storage>\sync\<dataName>.json. It records which folder on this PC history flows back into, so it must
29
+ * never live in the data folder the sandbox can write (a forged copy could redirect writes anywhere on this PC).
30
+ */
31
+ export const syncStatePath = (dataPath) => hostStateFile(storageOf(dataPath), dataPath, '.json');
32
+ /**
33
+ * A state file that is missing, oversized or not in this shape counts as no state (nothing syncs back until the next
34
+ * launch).
35
+ */
36
+ export const readSyncState = (dataPath) => new JsonFile(SyncStateSchema, syncStatePath(dataPath)).read();
37
+ export const writeSyncState = (dataPath, state) => new JsonFile(SyncStateSchema, syncStatePath(dataPath)).write(state);
@@ -1,21 +1,3 @@
1
- import type { Config } from '../core/types.js';
2
- import { type MemResult } from './claude-mem.js';
3
- /**
4
- * A project registered while the sandbox runs: its history comes in now (the sandbox's copy only gains files), and
5
- * from now on syncs back to its own folder on this PC.
6
- */
7
- export declare const syncProjectIn: (dataPath: string, project: {
8
- hostWorkspace: string;
9
- guestWorkspace: string;
10
- }) => number;
11
- export interface SyncSummary {
12
- history: number;
13
- claudeMem: MemResult | 'disabled';
14
- }
15
- /** Before launch: finish syncing the previous run out, then bring this PC's history (and claude-mem) in. */
16
- export declare const syncBeforeLaunch: (config: Config, dataPath: string, hostWorkspace: string) => SyncSummary;
17
- /** Syncs the sandbox's history (and, when `final`, claude-mem) back to this PC, as configured for the last launch. */
18
- export declare const syncBack: (dataPath: string, final: boolean) => SyncSummary;
19
1
  export declare const watcherRunning: (dataPath: string) => boolean;
20
2
  /** Body of the detached watcher process (`agent-sandbox _watch`). */
21
3
  export declare const watch: (dataPath: string) => Promise<void>;
@@ -3,92 +3,38 @@
3
3
  // Its pid file and log live in host-only storage, never in the data folder the sandbox can write.
4
4
  import fs from 'node:fs';
5
5
  import path from 'node:path';
6
- import { writeFileAtomic } from '../shared/rundir.js';
6
+ import { writeFileAtomic } from '../shared/io/index.js';
7
7
  import { refuseInSelfTest } from '../host/test-guard.js';
8
- import { assertNoLinks, errMsg, sleep } from '../core/util.js';
9
- import { hostClaudeDir } from '../host/claude-profile.js';
10
- import { checkRepo } from '../host/repo-guard.js';
11
- import { isSandboxRunning } from '../host/platform.js';
12
- import { readActiveViews, WorkspaceView } from '../host/workspace-view/index.js';
13
- import { readForwards, sandboxAddress, startPortForwards } from '../host/port-forward.js';
8
+ import { errMsg, sleep } from '../core/util/index.js';
9
+ import { RepoGuardStore } from '../host/guard/index.js';
10
+ import { isSandboxRunning } from '../host/sandbox/index.js';
11
+ import { readActiveViews } from '../host/workspace-view/index.js';
12
+ import { WorkspaceView } from '../host/workspace-view/index.js';
13
+ import { readForwards, sandboxAddress, startPortForwards } from '../host/network/index.js';
14
14
  import { AuditCollector, readAuditSettings } from '../host/audit/collect.js';
15
- import { readMarkedProjects, saveDataSize, watchAndMark } from '../host/motw.js';
16
- import { sizeOf } from '../core/disk.js';
17
- import { beatLife, causeSince, endLife, keepAwake, readLife } from '../host/stops.js';
18
- import { hostClaudeMemDir, syncClaudeMem } from './claude-mem.js';
19
- import { readSyncState, syncHistoryIn, syncHistoryOut, writeSyncState } from './history.js';
15
+ import { readMarkedProjects, saveDataSize, watchAndMark } from '../host/guard/index.js';
16
+ import { sizeWithin } from '../core/disk.js';
17
+ import { causeSince, KeepAwake, LifeRecord, saveCrashReport } from '../host/life/index.js';
18
+ import { storageOf } from '../host/storage/index.js';
19
+ import { syncBack } from './sync-cycle.js';
20
20
  const WATCH_INTERVAL_MS = 60 * 1000;
21
- const storageOf = (dataPath) => path.dirname(path.dirname(dataPath));
22
- const guestClaude = (dataPath) => path.join(dataPath, 'state', 'claude');
23
- const guestMem = (dataPath) => path.join(dataPath, 'state', 'claude-mem');
24
- /** Sync paths for the sandbox side, after checking nothing on the way there is a link planted by the sandbox. */
25
- const toPaths = (state, dataPath) => {
26
- assertNoLinks(dataPath, guestClaude(dataPath));
27
- return { hostClaudeDir: state.hostClaudeDir, guestClaudeDir: guestClaude(dataPath), hostWorkspace: state.hostWorkspace, guestWorkspace: state.guestWorkspace, extra: state.projects ?? [] };
28
- };
29
- /**
30
- * A project registered while the sandbox runs: its history comes in now (the sandbox's copy only gains files), and
31
- * from now on syncs back to its own folder on this PC.
32
- */
33
- export const syncProjectIn = (dataPath, project) => {
34
- const state = readSyncState(dataPath);
35
- if (!state)
36
- return 0;
37
- const projects = [...(state.projects ?? []).filter((p) => p.hostWorkspace.toLowerCase() !== project.hostWorkspace.toLowerCase()), project];
38
- const next = { ...state, projects };
39
- writeSyncState(dataPath, next);
40
- // Prompt history is left alone: sessions are appending to the sandbox's copy right now.
41
- return state.syncHistory ? syncHistoryIn(toPaths(next, dataPath), { promptHistory: false, scope: state.historyScope }) : 0;
42
- };
43
- const memSync = (dataPath, state, direction) => {
44
- assertNoLinks(dataPath, guestMem(dataPath));
45
- return syncClaudeMem(hostClaudeMemDir(), guestMem(dataPath), state, direction);
46
- };
47
- /** Before launch: finish syncing the previous run out, then bring this PC's history (and claude-mem) in. */
48
- export const syncBeforeLaunch = (config, dataPath, hostWorkspace) => {
49
- const profile = config.claudeProfile;
50
- const summary = { history: 0, claudeMem: 'disabled' };
51
- if (!config.storage.persistAgentState)
52
- return summary;
53
- const previous = readSyncState(dataPath);
54
- if (previous?.syncHistory)
55
- syncHistoryOut(toPaths(previous, dataPath));
56
- const state = { ...previous, hostClaudeDir: hostClaudeDir(profile), hostWorkspace, guestWorkspace: config.guestWorkspace, syncHistory: profile.syncHistory, historyScope: profile.historyScope, syncClaudeMem: profile.syncClaudeMem, syncClaudeMemBack: profile.syncClaudeMemBack, projects: [] };
57
- if (profile.syncHistory)
58
- summary.history = syncHistoryIn(toPaths(state, dataPath), { scope: profile.historyScope });
59
- if (profile.syncClaudeMem) {
60
- if (previous?.syncClaudeMem && previous.syncClaudeMemBack)
61
- memSync(dataPath, state, 'out');
62
- summary.claudeMem = memSync(dataPath, state, 'in');
63
- }
64
- writeSyncState(dataPath, state);
65
- return summary;
66
- };
67
- /** Syncs the sandbox's history (and, when `final`, claude-mem) back to this PC, as configured for the last launch. */
68
- export const syncBack = (dataPath, final) => {
69
- const state = readSyncState(dataPath);
70
- const summary = { history: 0, claudeMem: 'disabled' };
71
- if (!state)
72
- return summary;
73
- if (state.syncHistory)
74
- summary.history = syncHistoryOut(toPaths(state, dataPath));
75
- if (final && state.syncClaudeMem && state.syncClaudeMemBack)
76
- summary.claudeMem = memSync(dataPath, state, 'out');
77
- writeSyncState(dataPath, state);
78
- return summary;
79
- };
80
21
  const hostRunDir = (dataPath) => path.join(storageOf(dataPath), 'run');
22
+ /** The longest the watcher may take after the sandbox closed (final syncs) before it stops anyway. */
23
+ const END_DEADLINE_MS = 3 * 60 * 1000;
81
24
  const watcherPidFile = (dataPath) => path.join(hostRunDir(dataPath), 'watcher-' + path.basename(dataPath) + '.pid');
82
25
  const watcherLog = (dataPath) => path.join(storageOf(dataPath), 'logs', 'host-sync-' + path.basename(dataPath) + '.log');
83
26
  // Signal 0 only asks whether the process exists. pid 0 would mean "my own process group", so it never counts.
84
- const alive = (pid) => { if (!Number.isInteger(pid) || pid <= 0)
85
- return false; try {
86
- process.kill(pid, 0);
87
- return true;
88
- }
89
- catch {
90
- return false;
91
- } };
27
+ const alive = (pid) => {
28
+ if (!Number.isInteger(pid) || pid <= 0)
29
+ return false;
30
+ try {
31
+ process.kill(pid, 0);
32
+ return true;
33
+ }
34
+ catch {
35
+ return false;
36
+ }
37
+ };
92
38
  export const watcherRunning = (dataPath) => {
93
39
  try {
94
40
  return alive(Number(fs.readFileSync(watcherPidFile(dataPath), 'utf8')));
@@ -105,13 +51,17 @@ export const watch = async (dataPath) => {
105
51
  fs.mkdirSync(hostRunDir(dataPath), { recursive: true });
106
52
  fs.mkdirSync(path.dirname(watcherLog(dataPath)), { recursive: true });
107
53
  writeFileAtomic(watcherPidFile(dataPath), String(process.pid));
108
- const note = (message) => { try {
109
- fs.appendFileSync(watcherLog(dataPath), new Date().toISOString() + ' ' + message + '\n');
110
- }
111
- catch { /* ignore */ } };
54
+ const note = (message) => {
55
+ try {
56
+ fs.appendFileSync(watcherLog(dataPath), new Date().toISOString() + ' ' + message + '\n');
57
+ }
58
+ catch {
59
+ /* ignore */
60
+ }
61
+ };
112
62
  const sync = (final) => {
113
63
  try {
114
- for (const finding of checkRepo(dataPath)) {
64
+ for (const finding of new RepoGuardStore(dataPath).check()) {
115
65
  note('SECURITY: neutralised a git ' + finding.kind + ' added inside the sandbox: ' + finding.detail);
116
66
  audit?.guard(finding.kind + ': ' + finding.detail);
117
67
  }
@@ -133,12 +83,16 @@ export const watch = async (dataPath) => {
133
83
  const auditSettings = readAuditSettings(storageOf(dataPath), dataPath);
134
84
  const audit = auditSettings?.enabled ? new AuditCollector(dataPath, storageOf(dataPath), auditSettings) : null;
135
85
  audit?.start();
136
- const auditTimer = audit ? setInterval(() => { try {
137
- audit.flush();
138
- }
139
- catch (e) {
140
- note('audit: ' + errMsg(e));
141
- } }, 10000) : null;
86
+ const auditTimer = audit
87
+ ? setInterval(() => {
88
+ try {
89
+ audit.flush();
90
+ }
91
+ catch (e) {
92
+ note('audit: ' + errMsg(e));
93
+ }
94
+ }, 10000)
95
+ : null;
142
96
  // storage.markSandboxFiles: programs and scripts that appear in the projects get the "from the internet" mark.
143
97
  const stopMarking = watchAndMark(readMarkedProjects(storageOf(dataPath), dataPath), (m) => note(m));
144
98
  // network.forwardPorts: localhost on this PC reaches servers in the sandbox while it runs.
@@ -154,29 +108,37 @@ export const watch = async (dataPath) => {
154
108
  }
155
109
  });
156
110
  // sandbox.keepAwake, and the life record that tells the next launch how this run ended (host/stops.ts).
157
- const awake = readLife(storageOf(dataPath), dataPath)?.keepAwake ? keepAwake(process.pid) : null;
111
+ const life = new LifeRecord(storageOf(dataPath), dataPath);
112
+ const awake = life.read()?.keepAwake ? KeepAwake.start(process.pid) : null;
158
113
  try {
159
114
  await sleep(30000);
160
115
  while (isSandboxRunning()) {
161
- beatLife(storageOf(dataPath), dataPath);
116
+ life.beat();
162
117
  sync(false);
163
118
  await sleep(WATCH_INTERVAL_MS);
164
119
  }
165
120
  try {
166
- const life = readLife(storageOf(dataPath), dataPath);
167
- const cause = life ? causeSince(life.lastSeen) : null;
168
- endLife(storageOf(dataPath), dataPath, cause);
121
+ const last = life.read();
122
+ const cause = last ? causeSince(last.lastSeen) : null;
123
+ const report = last && cause ? saveCrashReport(storageOf(dataPath), dataPath, last.lastSeen) : null;
124
+ life.end(cause, new Date(), report);
169
125
  if (cause)
170
- note('sandbox ended: ' + cause.text);
126
+ note('sandbox ended: ' + cause.text + (report ? '; crash report: ' + report : ''));
171
127
  }
172
128
  catch (e) {
173
129
  note('could not record how the sandbox ended: ' + errMsg(e));
174
130
  }
175
131
  await sleep(3000);
132
+ // The sandbox is gone: this process ends within minutes whatever happens below (it must never outlive the sandbox).
133
+ setTimeout(() => {
134
+ note('final work took too long; stopped.');
135
+ fs.rmSync(watcherPidFile(dataPath), { force: true });
136
+ process.exit(0);
137
+ }, END_DEADLINE_MS).unref();
176
138
  sync(true);
177
139
  }
178
140
  finally {
179
- awake?.kill();
141
+ awake?.stop();
180
142
  stops.forEach((stop) => stop());
181
143
  stopForwards();
182
144
  stopMarking();
@@ -197,11 +159,15 @@ export const watch = async (dataPath) => {
197
159
  note('workspace ' + v.host + ': final sync failed: ' + errMsg(e));
198
160
  }
199
161
  }
200
- // For the next launch's storage.warnDataGb (measuring then would be slow).
162
+ // For the next launch's storage.warnDataGb, only when it can be measured quickly (a big data folder takes minutes).
201
163
  try {
202
- saveDataSize(storageOf(dataPath), dataPath, sizeOf(dataPath));
164
+ const bytes = sizeWithin(dataPath, 20000);
165
+ if (bytes !== null)
166
+ saveDataSize(storageOf(dataPath), dataPath, bytes);
167
+ }
168
+ catch {
169
+ /* best effort */
203
170
  }
204
- catch { /* best effort */ }
205
171
  fs.rmSync(watcherPidFile(dataPath), { force: true });
206
172
  }
207
173
  };
@@ -0,0 +1,8 @@
1
+ #Requires -Version 5.1
2
+ # Keeps this PC awake (the screen may still turn off) until the process -OwnerId ends: the background watcher, which
3
+ # ends with the sandbox. Used by host/stops.ts for sandbox.keepAwake.
4
+ param([Parameter(Mandatory = $true)][int]$OwnerId)
5
+ $ErrorActionPreference = 'Stop'
6
+ Add-Type -Path (Join-Path $PSScriptRoot 'power.cs')
7
+ [AgentSandbox.Power]::StayAwake()
8
+ Wait-Process -Id $OwnerId -ErrorAction SilentlyContinue
@@ -0,0 +1,23 @@
1
+ // Keeps this PC from sleeping while a sandbox runs (sandbox.keepAwake). Loaded by keep-awake.ps1 (Add-Type). C# 5.
2
+ using System.Runtime.InteropServices;
3
+
4
+ namespace AgentSandbox
5
+ {
6
+ public static class Power
7
+ {
8
+ // ES_CONTINUOUS | ES_SYSTEM_REQUIRED: the system stays awake until this thread ends or clears it.
9
+ private const uint ContinuousSystemRequired = 0x80000001;
10
+
11
+ private static class NativeMethods
12
+ {
13
+ [DllImport("kernel32.dll")]
14
+ public static extern uint SetThreadExecutionState(uint flags);
15
+ }
16
+
17
+ /// <summary>Asks Windows not to sleep for as long as the calling thread runs.</summary>
18
+ public static void StayAwake()
19
+ {
20
+ NativeMethods.SetThreadExecutionState(ContinuousSystemRequired);
21
+ }
22
+ }
23
+ }