windows-development-sandbox 1.11.7 → 1.13.0

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 (246) hide show
  1. package/README.md +13 -6
  2. package/config.example.json +15 -4
  3. package/dist/app/features/access/access.def.d.ts +190 -0
  4. package/dist/app/features/access/access.def.js +273 -0
  5. package/dist/app/features/access/access.run.d.ts +79 -0
  6. package/dist/app/features/access/access.run.js +129 -0
  7. package/dist/app/features/access/index.d.ts +2 -0
  8. package/dist/app/features/access/index.js +3 -0
  9. package/dist/app/features/agents/agent-entry.js +5 -0
  10. package/dist/app/features/agents/agents.def.js +1 -0
  11. package/dist/app/features/apps/apps-rows.d.ts +4 -1
  12. package/dist/app/features/apps/apps-rows.js +7 -2
  13. package/dist/app/features/apps/apps.def.d.ts +19 -0
  14. package/dist/app/features/apps/apps.def.js +50 -12
  15. package/dist/app/features/apps/apps.run.d.ts +2 -0
  16. package/dist/app/features/apps/apps.run.js +1 -1
  17. package/dist/app/features/audit/audit.def.d.ts +350 -0
  18. package/dist/app/features/audit/audit.def.js +457 -0
  19. package/dist/app/features/audit/audit.run.d.ts +110 -0
  20. package/dist/app/features/audit/audit.run.js +133 -0
  21. package/dist/app/features/audit/index.d.ts +2 -0
  22. package/dist/app/features/audit/index.js +3 -0
  23. package/dist/app/features/defs.d.ts +349 -4
  24. package/dist/app/features/defs.js +16 -1
  25. package/dist/app/features/files/files.def.js +1 -0
  26. package/dist/app/features/health/health.def.js +1 -0
  27. package/dist/app/features/sandbox/sandbox.def.js +3 -0
  28. package/dist/app/features/sessions/sessions.def.d.ts +36 -0
  29. package/dist/app/features/sessions/sessions.def.js +77 -9
  30. package/dist/app/features/sessions/sessions.run.d.ts +25 -2
  31. package/dist/app/features/sessions/sessions.run.js +71 -3
  32. package/dist/app/features/settings/settings.def.d.ts +8 -0
  33. package/dist/app/features/settings/settings.def.js +17 -0
  34. package/dist/app/features/settings/settings.run.d.ts +3 -0
  35. package/dist/app/features/settings/settings.run.js +16 -2
  36. package/dist/app/features/web/web.def.d.ts +9 -0
  37. package/dist/app/features/web/web.def.js +26 -1
  38. package/dist/app/features/web/web.run.d.ts +3 -0
  39. package/dist/app/features/web/web.run.js +11 -3
  40. package/dist/app/kernel/access.d.ts +33 -0
  41. package/dist/app/kernel/access.js +44 -0
  42. package/dist/app/kernel/define.d.ts +26 -2
  43. package/dist/app/kernel/index.d.ts +1 -0
  44. package/dist/app/kernel/index.js +1 -0
  45. package/dist/app/kernel/rpc.d.ts +5 -2
  46. package/dist/app/registry.d.ts +4 -1
  47. package/dist/app/registry.js +26 -4
  48. package/dist/cli/args.d.ts +0 -3
  49. package/dist/cli/args.js +3 -4
  50. package/dist/cli/commands/index.d.ts +1 -1
  51. package/dist/cli/commands/index.js +1 -1
  52. package/dist/cli/commands/launch/prepare.js +1 -1
  53. package/dist/cli/commands/maintenance/index.d.ts +0 -1
  54. package/dist/cli/commands/maintenance/index.js +0 -1
  55. package/dist/cli/commands/registry.js +3 -2
  56. package/dist/cli/commands/remote.d.ts +2 -0
  57. package/dist/cli/commands/remote.js +49 -0
  58. package/dist/cli/commands/sessions/reopen.js +3 -0
  59. package/dist/cli/commands/web.js +66 -0
  60. package/dist/cli/manifest.d.ts +63 -45
  61. package/dist/cli/manifest.js +33 -18
  62. package/dist/cli/menu/io-menu.d.ts +5 -3
  63. package/dist/cli/menu/io-menu.js +12 -5
  64. package/dist/cli/menu/pages/apps-page.js +2 -15
  65. package/dist/cli/menu/pages/maintenance-page.d.ts +4 -0
  66. package/dist/cli/menu/pages/maintenance-page.js +51 -8
  67. package/dist/cli/menu/remote-menu.d.ts +19 -0
  68. package/dist/cli/menu/remote-menu.js +108 -0
  69. package/dist/cli/menu/views.js +4 -0
  70. package/dist/cli/operations/handler.js +15 -1
  71. package/dist/cli/services/remote-client.d.ts +16 -0
  72. package/dist/cli/services/remote-client.js +141 -0
  73. package/dist/cli/services/sessions-service.d.ts +5 -0
  74. package/dist/cli/services/sessions-service.js +17 -1
  75. package/dist/core/config/defaults.js +12 -2
  76. package/dist/core/local-config/file.js +16 -2
  77. package/dist/core/local-config/overrides.js +7 -0
  78. package/dist/core/run/versions.js +9 -8
  79. package/dist/core/schema/apps.d.ts +9 -0
  80. package/dist/core/schema/apps.js +9 -0
  81. package/dist/core/schema/config.d.ts +23 -3
  82. package/dist/core/schema/config.js +42 -5
  83. package/dist/core/schema/sandbox.d.ts +1 -0
  84. package/dist/core/schema/sandbox.js +11 -3
  85. package/dist/core/schema/web.d.ts +51 -0
  86. package/dist/core/schema/web.js +46 -1
  87. package/dist/core/util/fs.d.ts +5 -0
  88. package/dist/core/util/fs.js +23 -0
  89. package/dist/core/util/index.d.ts +1 -1
  90. package/dist/core/util/index.js +1 -1
  91. package/dist/guest/apps/app-installer.js +50 -4
  92. package/dist/guest/apps/index.d.ts +1 -1
  93. package/dist/guest/apps/index.js +1 -1
  94. package/dist/guest/apps/sources.js +1 -1
  95. package/dist/guest/audit/parse.d.ts +32 -2
  96. package/dist/guest/audit/parse.js +43 -5
  97. package/dist/guest/audit/process-audit.d.ts +3 -1
  98. package/dist/guest/audit/process-audit.js +9 -6
  99. package/dist/guest/boot/boot.js +12 -3
  100. package/dist/guest/boot/guide.d.ts +1 -1
  101. package/dist/guest/boot/guide.js +27 -3
  102. package/dist/guest/daemon/daemon.js +2 -0
  103. package/dist/guest/daemon/idle-shutdown.js +2 -1
  104. package/dist/guest/daemon/sessions.d.ts +23 -2
  105. package/dist/guest/daemon/sessions.js +151 -20
  106. package/dist/guest/entries/daemon.js +2 -1
  107. package/dist/guest/git/decision.js +7 -0
  108. package/dist/guest/sessions/cmdline.d.ts +14 -0
  109. package/dist/guest/sessions/cmdline.js +10 -0
  110. package/dist/guest/setup/addon-mcp.d.ts +2 -0
  111. package/dist/guest/setup/addon-mcp.js +49 -0
  112. package/dist/guest/setup/agent-addons.d.ts +9 -0
  113. package/dist/guest/setup/agent-addons.js +22 -0
  114. package/dist/guest/setup/headroom.d.ts +7 -0
  115. package/dist/guest/setup/headroom.js +60 -0
  116. package/dist/guest/setup/managed-policy.d.ts +2 -1
  117. package/dist/guest/setup/managed-policy.js +15 -6
  118. package/dist/guest/toolchains/plan.js +8 -3
  119. package/dist/guest/toolchains/setup.js +3 -0
  120. package/dist/host/audit/attribute.d.ts +46 -0
  121. package/dist/host/audit/attribute.js +76 -0
  122. package/dist/host/audit/collect.d.ts +29 -3
  123. package/dist/host/audit/collect.js +256 -61
  124. package/dist/host/audit/git-commits.d.ts +29 -0
  125. package/dist/host/audit/git-commits.js +157 -0
  126. package/dist/host/audit/index.d.ts +5 -0
  127. package/dist/host/audit/index.js +6 -0
  128. package/dist/host/audit/log.d.ts +45 -7
  129. package/dist/host/audit/log.js +148 -45
  130. package/dist/host/audit/redact.d.ts +2 -0
  131. package/dist/host/audit/redact.js +67 -0
  132. package/dist/host/channel/channel.d.ts +5 -1
  133. package/dist/host/channel/channel.js +12 -0
  134. package/dist/host/guard/agent-files.js +7 -1
  135. package/dist/host/guard/commands.js +13 -1
  136. package/dist/host/guard/git-config.js +27 -7
  137. package/dist/host/guard/git-dirs.js +78 -3
  138. package/dist/host/guard/mark-of-the-web.js +3 -1
  139. package/dist/host/guard/nested-repos.js +7 -2
  140. package/dist/host/guard/store.js +1 -0
  141. package/dist/host/guard/types.d.ts +2 -0
  142. package/dist/host/launch/mappings.js +11 -1
  143. package/dist/host/launch/project-scan.js +2 -21
  144. package/dist/host/launch/stage.js +4 -0
  145. package/dist/host/life/session-ledger.js +2 -1
  146. package/dist/host/remote/access-store.d.ts +156 -0
  147. package/dist/host/remote/access-store.js +308 -0
  148. package/dist/host/remote/cert.d.ts +20 -0
  149. package/dist/host/remote/cert.js +103 -0
  150. package/dist/host/remote/door-client.d.ts +13 -0
  151. package/dist/host/remote/door-client.js +54 -0
  152. package/dist/host/remote/firewall.d.ts +44 -0
  153. package/dist/host/remote/firewall.js +118 -0
  154. package/dist/host/remote/gate.d.ts +125 -0
  155. package/dist/host/remote/gate.js +391 -0
  156. package/dist/host/remote/index.d.ts +8 -0
  157. package/dist/host/remote/index.js +10 -0
  158. package/dist/host/remote/lan.d.ts +24 -0
  159. package/dist/host/remote/lan.js +88 -0
  160. package/dist/host/remote/tls-store.d.ts +22 -0
  161. package/dist/host/remote/tls-store.js +63 -0
  162. package/dist/host/remote/windows-helper.d.ts +67 -0
  163. package/dist/host/remote/windows-helper.js +129 -0
  164. package/dist/host/web/bridge.d.ts +5 -1
  165. package/dist/host/web/bridge.js +6 -2
  166. package/dist/host/web/browser.js +1 -1
  167. package/dist/host/web/control.d.ts +4 -1
  168. package/dist/host/web/control.js +28 -4
  169. package/dist/host/web/rpc.d.ts +16 -2
  170. package/dist/host/web/rpc.js +37 -4
  171. package/dist/host/web/runner.d.ts +4 -0
  172. package/dist/host/web/runner.js +12 -0
  173. package/dist/host/web/server.d.ts +18 -2
  174. package/dist/host/web/server.js +97 -24
  175. package/dist/host/web/state.d.ts +5 -0
  176. package/dist/host/web/state.js +8 -0
  177. package/dist/runtime/agent.js +184 -18
  178. package/dist/runtime/daemon.js +772 -338
  179. package/dist/runtime/db.js +184 -18
  180. package/dist/runtime/gitguard.js +6 -0
  181. package/dist/runtime/main.js +966 -553
  182. package/dist/runtime/netproxy.js +184 -18
  183. package/dist/runtime/view.js +186 -18
  184. package/dist/selftest/app.test.js +66 -7
  185. package/dist/selftest/audit.test.js +354 -47
  186. package/dist/selftest/channel.test.js +16 -0
  187. package/dist/selftest/cmdline.test.js +16 -0
  188. package/dist/selftest/git-access.test.js +8 -0
  189. package/dist/selftest/hcs.test.js +35 -0
  190. package/dist/selftest/hostile-input.test.js +12 -1
  191. package/dist/selftest/index.js +2 -0
  192. package/dist/selftest/live-daemon.test.js +25 -0
  193. package/dist/selftest/local-config.test.js +30 -0
  194. package/dist/selftest/menu-screens.js +1 -1
  195. package/dist/selftest/menu.test.js +3 -3
  196. package/dist/selftest/remote.test.d.ts +2 -0
  197. package/dist/selftest/remote.test.js +536 -0
  198. package/dist/selftest/repo-guard.test.js +56 -2
  199. package/dist/selftest/resume.test.js +2 -1
  200. package/dist/selftest/sharing.test.js +9 -2
  201. package/dist/selftest/support/engine-golden.js +9 -0
  202. package/dist/selftest/support/fixtures.d.ts +14 -0
  203. package/dist/selftest/support/web-preview.js +157 -0
  204. package/dist/selftest/toolchains.test.js +147 -2
  205. package/dist/selftest/web.test.js +2 -0
  206. package/dist/shared/apps/agent-addons.d.ts +64 -0
  207. package/dist/shared/apps/agent-addons.js +95 -0
  208. package/dist/shared/apps/catalogue.d.ts +33 -2
  209. package/dist/shared/apps/catalogue.js +102 -11
  210. package/dist/shared/apps/index.d.ts +3 -2
  211. package/dist/shared/apps/index.js +3 -2
  212. package/dist/shared/apps/selection.d.ts +2 -0
  213. package/dist/shared/apps/selection.js +7 -0
  214. package/dist/shared/channel/schema.d.ts +23 -0
  215. package/dist/shared/channel/schema.js +8 -0
  216. package/dist/shared/pty/protocol.d.ts +2 -0
  217. package/dist/shared/pty/protocol.js +2 -0
  218. package/dist/sync/watcher.js +9 -1
  219. package/dist/web/index.html +2 -2
  220. package/dist/web/{main-RQFN4WBY.css → main-UAQPI5XD.css} +1 -1
  221. package/dist/web/main-Z2WYAE2Z.js +221 -0
  222. package/native/csharp/HcsHost/AssemblyInfo.cs +5 -3
  223. package/native/csharp/HcsHost/Hcs.cs +9 -0
  224. package/native/csharp/HcsHost/Program.cs +26 -1
  225. package/native/csharp/HcsHost/Share.cs +173 -0
  226. package/native/csharp/HostTools/AssemblyInfo.cs +3 -3
  227. package/native/csharp/HostTools/Program.cs +17 -1
  228. package/native/csharp/HostTools/WebHelper.cs +499 -0
  229. package/native/scripts/get-network-profile.ps1 +19 -0
  230. package/native/scripts/set-folder-access.ps1 +11 -0
  231. package/native/scripts/set-web-firewall.ps1 +103 -0
  232. package/package.json +1 -1
  233. package/sandbox/addons/ccusage/package-lock.json +111 -0
  234. package/sandbox/addons/ccusage/package.json +7 -0
  235. package/sandbox/addons/context7/package-lock.json +1313 -0
  236. package/sandbox/addons/context7/package.json +7 -0
  237. package/sandbox/addons/headroom/requirements.in +1 -0
  238. package/sandbox/addons/headroom/requirements.txt +2922 -0
  239. package/sandbox/addons/playwright-mcp/package-lock.json +56 -0
  240. package/sandbox/addons/playwright-mcp/package.json +7 -0
  241. package/sandbox/csharp/PtyHost.cs +20 -0
  242. package/schemas/config.schema.json +78 -4
  243. package/schemas/sandbox-config.schema.json +2 -20
  244. package/dist/cli/commands/maintenance/audit.d.ts +0 -3
  245. package/dist/cli/commands/maintenance/audit.js +0 -58
  246. package/dist/web/main-K2JMCAZI.js +0 -219
@@ -1,20 +1,36 @@
1
- export type AppCategory = 'editors' | 'databases' | 'api' | 'git' | 'utilities' | 'browsers' | 'gamedev' | 'cloud' | 'diagrams' | 'network' | 'reversing' | 'cli';
1
+ export type AppCategory = 'agents' | 'editors' | 'databases' | 'api' | 'git' | 'utilities' | 'browsers' | 'gamedev' | 'cloud' | 'diagrams' | 'network' | 'reversing' | 'cli';
2
2
  export declare const APP_CATEGORIES: {
3
3
  id: AppCategory;
4
4
  label: string;
5
5
  description: string;
6
6
  }[];
7
- /** Where a download comes from. Resolvers (sublime, kubectl ...) are code in guest/apps, named here by id. */
7
+ /**
8
+ * Where a download comes from. Resolvers (sublime, kubectl ...) are code in guest/apps, named here by id. `locked`: a
9
+ * pinned package installed from the lock file in sandbox\addons\<id> (npm: package.json + package-lock.json, every
10
+ * tarball checked against its integrity; uv: requirements.txt, every wheel checked against its SHA-256).
11
+ */
8
12
  export type AppSource = {
9
13
  github: string;
10
14
  asset: string;
11
15
  } | {
12
16
  url: string;
17
+ sha256?: string;
13
18
  } | {
14
19
  resolve: string;
15
20
  } | {
16
21
  npm: string;
22
+ } | {
23
+ locked: 'npm' | 'uv';
24
+ package: string;
25
+ version: string;
17
26
  };
27
+ /** An MCP server an add-on adds to the sandbox's Claude Code: `node <its folder>\<script> <args>`. */
28
+ export interface AddonMcp {
29
+ /** The server's name in Claude Code (sbx-...: the sandbox removes its own names again when the add-on is off). */
30
+ readonly name: string;
31
+ readonly script: string;
32
+ readonly args?: readonly string[];
33
+ }
18
34
  export interface AppEntry {
19
35
  id: string;
20
36
  name: string;
@@ -39,6 +55,21 @@ export interface AppEntry {
39
55
  setting?: string;
40
56
  /** Only with full git access (it pushes on its own, past the sandbox's git guard). */
41
57
  fullGitOnly?: boolean;
58
+ /** Which agents it plugs into, and how (agent add-ons). */
59
+ plugsInto?: string;
60
+ /** Only in your own settings: a project's .sandbox-config.json cannot turn it on (it changes what the agents run). */
61
+ userOnly?: boolean;
62
+ /** Started by the sandbox or the agent (a proxy, an MCP server): not on PATH and no shortcut. */
63
+ service?: boolean;
64
+ /** The MCP server it adds to the sandbox's Claude Code while it is on. */
65
+ mcp?: AddonMcp;
42
66
  }
67
+ /** rtk (rtk-ai/rtk), pinned: the Apache-2.0 edition's Windows build. The checksum is the release's checksums.txt. */
68
+ export declare const RTK_VERSION = "1.0.1";
69
+ /** Pinned agent add-ons, installed from the lock files in sandbox\addons\<id> (renewing them: docs/toolchains.md). */
70
+ export declare const HEADROOM_VERSION = "0.41.0";
71
+ export declare const CCUSAGE_VERSION = "20.0.36";
72
+ export declare const PLAYWRIGHT_MCP_VERSION = "0.0.83";
73
+ export declare const CONTEXT7_MCP_VERSION = "4.4.2";
43
74
  export declare const APPS: AppEntry[];
44
75
  export declare function appById(id: string): AppEntry | undefined;
@@ -1,8 +1,14 @@
1
1
  // The apps catalogue: desktop programs and command-line tools the sandbox can install on request (apps.install), each a
2
2
  // portable download kept in C:\AgentData\tools\apps\<id> (installers would be lost when the sandbox closes). Pure data,
3
3
  // shared by the menu on the PC (to list them) and the sandbox (to install them, guest/apps). VS Code and Windows
4
- // Terminal have settings of their own (toolchains.vscode, provisioning.terminal) and are listed here too.
4
+ // Terminal have settings of their own (toolchains.vscode, provisioning.terminal) and are listed here too, like
5
+ // claude-mem (claudeProfile.syncClaudeMem) among the agent add-ons.
5
6
  export const APP_CATEGORIES = [
7
+ {
8
+ id: 'agents',
9
+ label: 'Agent add-ons',
10
+ description: 'Things that plug into the agents: token savers, memory, MCP servers.',
11
+ },
6
12
  {
7
13
  id: 'editors',
8
14
  label: 'Editors & IDEs',
@@ -49,7 +55,102 @@ export const APP_CATEGORIES = [
49
55
  },
50
56
  ];
51
57
  const gh = (github, asset) => ({ github, asset });
58
+ /** rtk (rtk-ai/rtk), pinned: the Apache-2.0 edition's Windows build. The checksum is the release's checksums.txt. */
59
+ export const RTK_VERSION = '1.0.1';
60
+ const RTK_URL = 'https://github.com/rtk-ai/rtk/releases/download/v' + RTK_VERSION + '/rtk-oss-x86_64-pc-windows-msvc.zip';
61
+ const RTK_SHA256 = '0e53e2eca471e15fbd3636e64e6bc0b182cbc278ed0339c80450a2dd03f4cd6b';
62
+ /** Pinned agent add-ons, installed from the lock files in sandbox\addons\<id> (renewing them: docs/toolchains.md). */
63
+ export const HEADROOM_VERSION = '0.41.0';
64
+ export const CCUSAGE_VERSION = '20.0.36';
65
+ export const PLAYWRIGHT_MCP_VERSION = '0.0.83';
66
+ export const CONTEXT7_MCP_VERSION = '4.4.2';
52
67
  export const APPS = [
68
+ // ---- agent add-ons
69
+ {
70
+ id: 'rtk',
71
+ name: 'rtk (Rust Token Killer)',
72
+ category: 'agents',
73
+ about: "Compacts the output of shell commands (git, tests, builds, ls ...) before the agent reads it, so it uses fewer tokens. Claude Code's Bash commands go through it on their own.",
74
+ size: '6 MB',
75
+ source: { url: RTK_URL, sha256: RTK_SHA256 },
76
+ exe: 'rtk.exe',
77
+ cli: true,
78
+ plugsInto: "Claude Code through a hook in the sandbox's managed settings; other agents are told to use it",
79
+ userOnly: true,
80
+ },
81
+ {
82
+ id: 'headroom',
83
+ name: 'Headroom',
84
+ category: 'agents',
85
+ about: "Compresses what Claude Code sends to the model (tool output, logs, files) so it uses fewer tokens: a local proxy on 127.0.0.1:8787 that sits in Claude Code's API path, offline apart from forwarding to api.anthropic.com.",
86
+ size: '150 MB',
87
+ source: { locked: 'uv', package: 'headroom-ai', version: HEADROOM_VERSION },
88
+ exe: 'headroom.exe',
89
+ service: true,
90
+ plugsInto: 'Claude Code: the sandbox starts the proxy and points Claude Code at it (managed settings)',
91
+ userOnly: true,
92
+ },
93
+ {
94
+ id: 'ccusage',
95
+ name: 'ccusage',
96
+ category: 'agents',
97
+ about: "Reports the agents' token use and cost by day, month or session from their logs in the sandbox (`ccusage daily`; add --offline to skip fetching prices).",
98
+ size: '5 MB',
99
+ source: { locked: 'npm', package: 'ccusage', version: CCUSAGE_VERSION },
100
+ exe: 'ccusage.cmd',
101
+ cli: true,
102
+ plugsInto: "Reads Claude Code's session logs in the sandbox; changes nothing",
103
+ userOnly: true,
104
+ },
105
+ {
106
+ id: 'playwright-mcp',
107
+ name: 'Playwright MCP',
108
+ category: 'agents',
109
+ about: 'Lets Claude Code drive a browser (Microsoft Edge, already in the sandbox) to open pages, click, fill forms and take screenshots: the MCP server of microsoft/playwright-mcp.',
110
+ size: '20 MB',
111
+ source: { locked: 'npm', package: '@playwright/mcp', version: PLAYWRIGHT_MCP_VERSION },
112
+ exe: 'playwright-mcp.cmd',
113
+ service: true,
114
+ mcp: { name: 'sbx-playwright', script: 'node_modules/@playwright/mcp/cli.js', args: ['--browser', 'msedge'] },
115
+ plugsInto: "Claude Code as the MCP server sbx-playwright (the sandbox's Claude settings)",
116
+ userOnly: true,
117
+ },
118
+ {
119
+ id: 'context7',
120
+ name: 'Context7 MCP',
121
+ category: 'agents',
122
+ about: "Up-to-date documentation and code examples for libraries, looked up by Claude Code while it works (upstash/context7). The library names and questions go to Upstash's context7.com.",
123
+ size: '55 MB',
124
+ source: { locked: 'npm', package: '@upstash/context7-mcp', version: CONTEXT7_MCP_VERSION },
125
+ exe: 'context7-mcp.cmd',
126
+ service: true,
127
+ mcp: { name: 'sbx-context7', script: 'node_modules/@upstash/context7-mcp/dist/index.js' },
128
+ plugsInto: "Claude Code as the MCP server sbx-context7 (the sandbox's Claude settings)",
129
+ userOnly: true,
130
+ },
131
+ {
132
+ id: 'claude-mem',
133
+ name: 'claude-mem',
134
+ category: 'agents',
135
+ about: 'Persistent memory for Claude Code (a plugin you install on this PC): its database is brought into the sandbox.',
136
+ size: '',
137
+ source: { resolve: 'setting' },
138
+ exe: '',
139
+ setting: 'claudeProfile.syncClaudeMem',
140
+ plugsInto: 'Claude Code, with your Claude settings copied from this PC',
141
+ userOnly: true,
142
+ },
143
+ {
144
+ id: 'rea',
145
+ name: 'REA (Reverse Engineer Anything)',
146
+ category: 'agents',
147
+ about: 'Agent-driven reverse engineering (MCP server and CLI, by morluto). Run `rea setup` once to add it to Claude Code and Codex. Native binaries need Ghidra; needs Node 22.19+.',
148
+ size: '8 MB',
149
+ source: { npm: 'rea-agents' },
150
+ exe: 'rea.cmd',
151
+ cli: true,
152
+ plugsInto: 'Claude Code and Codex as an MCP server, after `rea setup`',
153
+ },
53
154
  // ---- editors
54
155
  {
55
156
  id: 'vscode',
@@ -511,16 +612,6 @@ export const APPS = [
511
612
  cli: true,
512
613
  },
513
614
  // ---- reverse engineering
514
- {
515
- id: 'rea',
516
- name: 'REA (Reverse Engineer Anything)',
517
- category: 'reversing',
518
- about: 'Agent-driven reverse engineering (MCP server and CLI, by morluto). Run `rea setup` once to add it to Claude Code and Codex. Native binaries need Ghidra; needs Node 22.19+.',
519
- size: '8 MB',
520
- source: { npm: 'rea-agents' },
521
- exe: 'rea.cmd',
522
- cli: true,
523
- },
524
615
  {
525
616
  id: 'ghidra',
526
617
  name: 'Ghidra',
@@ -1,2 +1,3 @@
1
- export { type AppCategory, APP_CATEGORIES, type AppSource, type AppEntry, APPS, appById } from './catalogue.js';
2
- export { exeMatcher, appsToInstall, appsNeedMesa } from './selection.js';
1
+ export { type AddonMcp, type AppCategory, APP_CATEGORIES, type AppSource, type AppEntry, APPS, appById, CCUSAGE_VERSION, CONTEXT7_MCP_VERSION, HEADROOM_VERSION, PLAYWRIGHT_MCP_VERSION, RTK_VERSION, } from './catalogue.js';
2
+ export { exeMatcher, appsToInstall, appsNeedMesa, appsNeedUv } from './selection.js';
3
+ export { ADDON_MCP_PREFIX, addonGuideLine, addonMcpServer, claudeManagedSettings, HEADROOM_ENV, HEADROOM_PORT, HEADROOM_UPSTREAM, headroomArgs, headroomEnv, headroomGuideLine, headroomUrl, type ManagedSettings, type McpServerConfig, rtkHookCommand, RTK_GUIDE_LINE, withAddonMcpServers, } from './agent-addons.js';
@@ -1,2 +1,3 @@
1
- export { APP_CATEGORIES, APPS, appById } from './catalogue.js';
2
- export { exeMatcher, appsToInstall, appsNeedMesa } from './selection.js';
1
+ export { APP_CATEGORIES, APPS, appById, CCUSAGE_VERSION, CONTEXT7_MCP_VERSION, HEADROOM_VERSION, PLAYWRIGHT_MCP_VERSION, RTK_VERSION, } from './catalogue.js';
2
+ export { exeMatcher, appsToInstall, appsNeedMesa, appsNeedUv } from './selection.js';
3
+ export { ADDON_MCP_PREFIX, addonGuideLine, addonMcpServer, claudeManagedSettings, HEADROOM_ENV, HEADROOM_PORT, HEADROOM_UPSTREAM, headroomArgs, headroomEnv, headroomGuideLine, headroomUrl, rtkHookCommand, RTK_GUIDE_LINE, withAddonMcpServers, } from './agent-addons.js';
@@ -7,5 +7,7 @@ export declare function appsToInstall(apps: Config['apps'], gitAccess: GitAccess
7
7
  entries: AppEntry[];
8
8
  skipped: string[];
9
9
  };
10
+ /** Does any chosen app install with uv (Headroom), so the uv step must run first? */
11
+ export declare function appsNeedUv(apps: Config['apps'] | undefined): boolean;
10
12
  /** Does any chosen app draw with OpenGL (so the Mesa step must run first)? */
11
13
  export declare function appsNeedMesa(apps: Config['apps'] | undefined): boolean;
@@ -36,6 +36,13 @@ export function appsToInstall(apps, gitAccess) {
36
36
  const needs7zip = allowed.some((e) => e.needs?.includes('7zip') || e.unpack === 'nsis') && !allowed.some((e) => e.id === '7zip');
37
37
  return { entries: [...(needs7zip ? [appById('7zip')] : []), ...allowed], skipped };
38
38
  }
39
+ /** Does any chosen app install with uv (Headroom), so the uv step must run first? */
40
+ export function appsNeedUv(apps) {
41
+ return Boolean(apps?.install.some((id) => {
42
+ const source = appById(id)?.source;
43
+ return source !== undefined && 'locked' in source && source.locked === 'uv';
44
+ }));
45
+ }
39
46
  /** Does any chosen app draw with OpenGL (so the Mesa step must run first)? */
40
47
  export function appsNeedMesa(apps) {
41
48
  return Boolean(apps?.install.some((id) => appById(id)?.needs?.includes('mesa')));
@@ -200,6 +200,14 @@ export declare const ProjectSpecSchema: z.ZodObject<{
200
200
  }, z.core.$strict>>;
201
201
  hooks: z.ZodBoolean;
202
202
  }, z.core.$strict>;
203
+ /** The plain shells a session can run instead of an agent; auto: PowerShell 7 when the sandbox has it, else 5.1. */
204
+ export declare const ShellChoiceSchema: z.ZodEnum<{
205
+ pwsh: "pwsh";
206
+ auto: "auto";
207
+ powershell: "powershell";
208
+ cmd: "cmd";
209
+ }>;
210
+ export type ShellChoice = z.output<typeof ShellChoiceSchema>;
203
211
  /** C:\AgentData\run\requests\<id>.json: the ONLY things the host can ask the sandbox to do. */
204
212
  export declare const GuestRequestSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
205
213
  kind: z.ZodLiteral<"session">;
@@ -378,6 +386,17 @@ export declare const GuestRequestSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
378
386
  resumeArguments: z.ZodOptional<z.ZodArray<z.ZodString>>;
379
387
  resumeOneArguments: z.ZodOptional<z.ZodArray<z.ZodString>>;
380
388
  }, z.core.$strict>>;
389
+ shell: z.ZodOptional<z.ZodEnum<{
390
+ pwsh: "pwsh";
391
+ auto: "auto";
392
+ powershell: "powershell";
393
+ cmd: "cmd";
394
+ }>>;
395
+ createdAt: z.ZodString;
396
+ }, z.core.$strict>, z.ZodObject<{
397
+ kind: z.ZodLiteral<"close">;
398
+ id: z.ZodString;
399
+ session: z.ZodString;
381
400
  createdAt: z.ZodString;
382
401
  }, z.core.$strict>, z.ZodObject<{
383
402
  kind: z.ZodLiteral<"project">;
@@ -603,6 +622,10 @@ export declare const SessionStatusSchema: z.ZodObject<{
603
622
  id: z.ZodString;
604
623
  launchId: z.ZodString;
605
624
  harness: z.ZodString;
625
+ kind: z.ZodOptional<z.ZodEnum<{
626
+ shell: "shell";
627
+ agent: "agent";
628
+ }>>;
606
629
  cwd: z.ZodString;
607
630
  project: z.ZodOptional<z.ZodString>;
608
631
  phase: z.ZodEnum<{
@@ -60,6 +60,8 @@ export const ProjectSpecSchema = z.strictObject({
60
60
  /** Its hooks were staged in C:\AgentLaunch\projects\<name>\hooks. */
61
61
  hooks: z.boolean(),
62
62
  });
63
+ /** The plain shells a session can run instead of an agent; auto: PowerShell 7 when the sandbox has it, else 5.1. */
64
+ export const ShellChoiceSchema = z.enum(['auto', 'pwsh', 'powershell', 'cmd']);
63
65
  /** C:\AgentData\run\requests\<id>.json: the ONLY things the host can ask the sandbox to do. */
64
66
  export const GuestRequestSchema = z.discriminatedUnion('kind', [
65
67
  z.strictObject({
@@ -70,8 +72,12 @@ export const GuestRequestSchema = z.discriminatedUnion('kind', [
70
72
  cwd: Text(),
71
73
  project: ProjectSpecSchema.optional(),
72
74
  harnessSpec: HarnessSchema.optional(),
75
+ /** A plain shell instead of an agent (harness is then "shell" and args are ignored). */
76
+ shell: ShellChoiceSchema.optional(),
73
77
  createdAt: TimeSchema,
74
78
  }),
79
+ /** End a running session (an agent or a shell) and everything it started. */
80
+ z.strictObject({ kind: z.literal('close'), id: IdSchema, session: IdSchema, createdAt: TimeSchema }),
75
81
  /** Provision a registered project without starting an agent (sandbox start / exec / db from its folder). */
76
82
  z.strictObject({ kind: z.literal('project'), id: IdSchema, project: ProjectSpecSchema, createdAt: TimeSchema }),
77
83
  z.strictObject({
@@ -140,6 +146,8 @@ export const SessionStatusSchema = z.object({
140
146
  id: IdSchema,
141
147
  launchId: Text(64),
142
148
  harness: Text(64),
149
+ /** A plain shell (harness is then the shell: pwsh, powershell or cmd); absent: an agent. */
150
+ kind: z.enum(['agent', 'shell']).optional(),
143
151
  cwd: Text(),
144
152
  /** The project it runs in: its hub name, or the launch folder's for the first project. */
145
153
  project: Text(64).optional(),
@@ -4,6 +4,8 @@ export declare const FrameType: {
4
4
  readonly Resize: 3;
5
5
  readonly Restart: 4;
6
6
  readonly Ping: 5;
7
+ /** Ends the program and everything it started, and with it the session. */
8
+ readonly Close: 6;
7
9
  readonly Output: 16;
8
10
  readonly Exit: 17;
9
11
  readonly Error: 18;
@@ -6,6 +6,8 @@ export const FrameType = {
6
6
  Resize: 3,
7
7
  Restart: 4,
8
8
  Ping: 5,
9
+ /** Ends the program and everything it started, and with it the session. */
10
+ Close: 6,
9
11
  Output: 16,
10
12
  Exit: 17,
11
13
  Error: 18,
@@ -10,7 +10,7 @@ import { RepoGuardStore } from '../host/guard/index.js';
10
10
  import { isSandboxRunning, realContainedDeps, spawnDetached } from '../host/sandbox/index.js';
11
11
  import { readActiveViews, WorkspaceView } from '../host/workspace-view/index.js';
12
12
  import { readForwards, sandboxAddress, startPortForwards } from '../host/network/index.js';
13
- import { AuditCollector, readAuditSettings } from '../host/audit/collect.js';
13
+ import { AuditCollector, AuditLog, readAuditSettings } from '../host/audit/index.js';
14
14
  import { readMarkedProjects, saveDataSize, watchAndMark } from '../host/guard/index.js';
15
15
  import { sizeWithin } from '../core/disk.js';
16
16
  import { autoRestartAllowed, causeSince, appendHostMemory, cpuPercentBetween, KeepAwake, LifeRecord, HostMemoryStream, readHostMemoryAsync, readLoadSettings, REQUEST_SECONDS, WATCHDOG_START, watchdogStep, saveCrashReport, SessionLedger, } from '../host/life/index.js';
@@ -183,6 +183,14 @@ export class Watcher {
183
183
  const audit = auditSettings?.enabled ? new AuditCollector(dataPath, storageRoot, auditSettings) : null;
184
184
  this.audit = audit;
185
185
  audit?.start();
186
+ // Off now, but kept before: its old days still go.
187
+ if (auditSettings && !audit)
188
+ try {
189
+ new AuditLog(AuditLog.dirFor(storageRoot, dataPath), auditSettings).maintain();
190
+ }
191
+ catch (e) {
192
+ this.note('audit: ' + errMsg(e));
193
+ }
186
194
  this.auditTimer = audit
187
195
  ? setInterval(() => {
188
196
  try {
@@ -5,8 +5,8 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1" />
6
6
  <title>Sandbox</title>
7
7
  <link rel="icon" href="data:," />
8
- <link rel="stylesheet" href="/main-RQFN4WBY.css" />
9
- <script type="module" src="/main-K2JMCAZI.js"></script>
8
+ <link rel="stylesheet" href="/main-UAQPI5XD.css" />
9
+ <script type="module" src="/main-Z2WYAE2Z.js"></script>
10
10
  </head>
11
11
  <body>
12
12
  <div id="root"></div>