windows-development-sandbox 1.11.6 → 1.12.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.
- package/README.md +12 -6
- package/config.example.json +4 -3
- package/dist/app/features/apps/apps-rows.d.ts +4 -1
- package/dist/app/features/apps/apps-rows.js +7 -2
- package/dist/app/features/apps/apps.def.d.ts +19 -0
- package/dist/app/features/apps/apps.def.js +49 -12
- package/dist/app/features/apps/apps.run.d.ts +2 -0
- package/dist/app/features/apps/apps.run.js +1 -1
- package/dist/app/features/audit/audit.def.d.ts +341 -0
- package/dist/app/features/audit/audit.def.js +454 -0
- package/dist/app/features/audit/audit.run.d.ts +107 -0
- package/dist/app/features/audit/audit.run.js +133 -0
- package/dist/app/features/audit/index.d.ts +2 -0
- package/dist/app/features/audit/index.js +3 -0
- package/dist/app/features/defs.d.ts +194 -1
- package/dist/app/features/defs.js +4 -0
- package/dist/app/features/projects/projects.def.js +1 -1
- package/dist/app/features/settings/settings.run.d.ts +3 -0
- package/dist/app/features/settings/settings.run.js +16 -2
- package/dist/app/features/updates/update-lines.d.ts +1 -1
- package/dist/app/features/updates/update-lines.js +3 -7
- package/dist/app/features/updates/updates.def.js +1 -1
- package/dist/app/kernel/define.d.ts +12 -1
- package/dist/app/registry.js +2 -0
- package/dist/cli/args.d.ts +0 -3
- package/dist/cli/args.js +3 -4
- package/dist/cli/commands/index.d.ts +1 -1
- package/dist/cli/commands/index.js +1 -1
- package/dist/cli/commands/launch/prepare.js +1 -1
- package/dist/cli/commands/maintenance/index.d.ts +0 -1
- package/dist/cli/commands/maintenance/index.js +0 -1
- package/dist/cli/commands/registry.js +1 -2
- package/dist/cli/manifest.d.ts +0 -41
- package/dist/cli/manifest.js +0 -14
- package/dist/cli/menu/pages/apps-page.js +2 -15
- package/dist/cli/menu/pages/maintenance-page.d.ts +4 -0
- package/dist/cli/menu/pages/maintenance-page.js +51 -8
- package/dist/cli/menu/views.js +2 -0
- package/dist/core/config/defaults.js +1 -1
- package/dist/core/schema/apps.d.ts +9 -0
- package/dist/core/schema/apps.js +9 -0
- package/dist/core/schema/config.d.ts +1 -0
- package/dist/core/schema/config.js +3 -3
- package/dist/core/schema/sandbox.d.ts +1 -0
- package/dist/core/schema/sandbox.js +11 -3
- package/dist/guest/apps/app-installer.js +50 -4
- package/dist/guest/apps/index.d.ts +1 -1
- package/dist/guest/apps/index.js +1 -1
- package/dist/guest/apps/sources.js +1 -1
- package/dist/guest/audit/parse.d.ts +32 -2
- package/dist/guest/audit/parse.js +43 -5
- package/dist/guest/audit/process-audit.d.ts +3 -1
- package/dist/guest/audit/process-audit.js +9 -6
- package/dist/guest/boot/boot.js +12 -3
- package/dist/guest/boot/guide.d.ts +1 -1
- package/dist/guest/boot/guide.js +27 -3
- package/dist/guest/daemon/sessions.d.ts +7 -0
- package/dist/guest/daemon/sessions.js +27 -2
- package/dist/guest/entries/daemon.js +2 -1
- package/dist/guest/setup/addon-mcp.d.ts +2 -0
- package/dist/guest/setup/addon-mcp.js +49 -0
- package/dist/guest/setup/agent-addons.d.ts +9 -0
- package/dist/guest/setup/agent-addons.js +22 -0
- package/dist/guest/setup/headroom.d.ts +7 -0
- package/dist/guest/setup/headroom.js +60 -0
- package/dist/guest/setup/managed-policy.d.ts +2 -1
- package/dist/guest/setup/managed-policy.js +15 -6
- package/dist/guest/toolchains/plan.js +8 -3
- package/dist/host/audit/attribute.d.ts +46 -0
- package/dist/host/audit/attribute.js +76 -0
- package/dist/host/audit/collect.d.ts +29 -3
- package/dist/host/audit/collect.js +256 -61
- package/dist/host/audit/git-commits.d.ts +29 -0
- package/dist/host/audit/git-commits.js +157 -0
- package/dist/host/audit/index.d.ts +5 -0
- package/dist/host/audit/index.js +6 -0
- package/dist/host/audit/log.d.ts +44 -7
- package/dist/host/audit/log.js +148 -45
- package/dist/host/audit/redact.d.ts +2 -0
- package/dist/host/audit/redact.js +67 -0
- package/dist/host/update/decision.d.ts +3 -2
- package/dist/host/update/decision.js +2 -3
- package/dist/host/update/updater.d.ts +4 -1
- package/dist/host/update/updater.js +11 -6
- package/dist/runtime/agent.js +110 -15
- package/dist/runtime/daemon.js +569 -316
- package/dist/runtime/db.js +110 -15
- package/dist/runtime/main.js +1011 -672
- package/dist/runtime/netproxy.js +110 -15
- package/dist/runtime/view.js +110 -15
- package/dist/selftest/app.test.js +25 -1
- package/dist/selftest/audit.test.js +354 -47
- package/dist/selftest/hcs.test.js +35 -0
- package/dist/selftest/menu-screens.js +1 -1
- package/dist/selftest/menu.test.js +3 -3
- package/dist/selftest/support/engine-golden.js +9 -0
- package/dist/selftest/support/fixtures.d.ts +1 -0
- package/dist/selftest/support/web-preview.js +94 -0
- package/dist/selftest/toolchains.test.js +147 -2
- package/dist/selftest/update-service.test.js +0 -7
- package/dist/selftest/update.test.js +4 -4
- package/dist/shared/apps/agent-addons.d.ts +64 -0
- package/dist/shared/apps/agent-addons.js +95 -0
- package/dist/shared/apps/catalogue.d.ts +33 -2
- package/dist/shared/apps/catalogue.js +102 -11
- package/dist/shared/apps/index.d.ts +3 -2
- package/dist/shared/apps/index.js +3 -2
- package/dist/shared/apps/selection.d.ts +2 -0
- package/dist/shared/apps/selection.js +7 -0
- package/dist/sync/watcher.js +9 -1
- package/dist/web/index.html +2 -2
- package/dist/web/{main-RQFN4WBY.css → main-UAQPI5XD.css} +1 -1
- package/dist/web/{main-QL7KHCEE.js → main-UD4QCXZR.js} +66 -66
- package/native/csharp/HcsHost/AssemblyInfo.cs +5 -3
- package/native/csharp/HcsHost/Hcs.cs +9 -0
- package/native/csharp/HcsHost/Program.cs +26 -1
- package/native/csharp/HcsHost/Share.cs +173 -0
- package/native/csharp/HostTools/AssemblyInfo.cs +3 -3
- package/package.json +1 -1
- package/sandbox/addons/ccusage/package-lock.json +111 -0
- package/sandbox/addons/ccusage/package.json +7 -0
- package/sandbox/addons/context7/package-lock.json +1313 -0
- package/sandbox/addons/context7/package.json +7 -0
- package/sandbox/addons/headroom/requirements.in +1 -0
- package/sandbox/addons/headroom/requirements.txt +2922 -0
- package/sandbox/addons/playwright-mcp/package-lock.json +56 -0
- package/sandbox/addons/playwright-mcp/package.json +7 -0
- package/schemas/config.schema.json +13 -4
- package/schemas/sandbox-config.schema.json +2 -2
- package/dist/cli/commands/maintenance/audit.d.ts +0 -3
- package/dist/cli/commands/maintenance/audit.js +0 -58
|
@@ -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')));
|
package/dist/sync/watcher.js
CHANGED
|
@@ -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/
|
|
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 {
|
package/dist/web/index.html
CHANGED
|
@@ -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-
|
|
9
|
-
<script type="module" src="/main-
|
|
8
|
+
<link rel="stylesheet" href="/main-UAQPI5XD.css" />
|
|
9
|
+
<script type="module" src="/main-UD4QCXZR.js"></script>
|
|
10
10
|
</head>
|
|
11
11
|
<body>
|
|
12
12
|
<div id="root"></div>
|