botmux 3.5.0 → 3.5.2
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/dist/adapters/backend/sandbox.d.ts +99 -279
- package/dist/adapters/backend/sandbox.d.ts.map +1 -1
- package/dist/adapters/backend/sandbox.js +424 -826
- package/dist/adapters/backend/sandbox.js.map +1 -1
- package/dist/adapters/cli/codex.d.ts.map +1 -1
- package/dist/adapters/cli/codex.js +4 -0
- package/dist/adapters/cli/codex.js.map +1 -1
- package/dist/adapters/cli/fs-policy.d.ts +244 -0
- package/dist/adapters/cli/fs-policy.d.ts.map +1 -0
- package/dist/adapters/cli/fs-policy.js +539 -0
- package/dist/adapters/cli/fs-policy.js.map +1 -0
- package/dist/adapters/cli/read-isolation.d.ts +14 -200
- package/dist/adapters/cli/read-isolation.d.ts.map +1 -1
- package/dist/adapters/cli/read-isolation.js +18 -477
- package/dist/adapters/cli/read-isolation.js.map +1 -1
- package/dist/bot-registry.d.ts +26 -23
- package/dist/bot-registry.d.ts.map +1 -1
- package/dist/bot-registry.js +16 -0
- package/dist/bot-registry.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +25 -18
- package/dist/cli.js.map +1 -1
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +16 -58
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
- package/dist/core/dashboard-ipc-server.js +26 -27
- package/dist/core/dashboard-ipc-server.js.map +1 -1
- package/dist/core/passthrough-commands.d.ts.map +1 -1
- package/dist/core/passthrough-commands.js +1 -1
- package/dist/core/passthrough-commands.js.map +1 -1
- package/dist/core/plugins/mcp/gateway-installer.d.ts.map +1 -1
- package/dist/core/plugins/mcp/gateway-installer.js +14 -2
- package/dist/core/plugins/mcp/gateway-installer.js.map +1 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +90 -60
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/worker-pool.d.ts +24 -0
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +50 -6
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +6 -0
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard/bot-payload.d.ts +5 -0
- package/dist/dashboard/bot-payload.d.ts.map +1 -1
- package/dist/dashboard/bot-payload.js +7 -0
- package/dist/dashboard/bot-payload.js.map +1 -1
- package/dist/dashboard/web/bot-defaults-page.d.ts +16 -0
- package/dist/dashboard/web/bot-defaults-page.d.ts.map +1 -1
- package/dist/dashboard/web/bot-defaults-page.js +225 -6
- package/dist/dashboard/web/bot-defaults-page.js.map +1 -1
- package/dist/dashboard/web/bot-defaults.d.ts +7 -0
- package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
- package/dist/dashboard/web/bot-defaults.js.map +1 -1
- package/dist/dashboard/web/i18n.d.ts.map +1 -1
- package/dist/dashboard/web/i18n.js +38 -22
- package/dist/dashboard/web/i18n.js.map +1 -1
- package/dist/dashboard/web/sessions-page.d.ts.map +1 -1
- package/dist/dashboard/web/sessions-page.js +1 -44
- package/dist/dashboard/web/sessions-page.js.map +1 -1
- package/dist/dashboard-web/app.js +1 -1
- package/dist/dashboard-web/chunks/bot-defaults-page-AUKV7P4L.js +10 -0
- package/dist/dashboard-web/chunks/{chunk-QCPPKCX3.js → chunk-KPQAUX7V.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-WXPMNEYV.js → chunk-NRL6CVAS.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-EJDYUINZ.js → chunk-R7IAKAYX.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-H7P5UV4W.js → chunk-X2L65IOM.js} +6 -6
- package/dist/dashboard-web/chunks/{connectors-page-IR54AOAI.js → connectors-page-HDQFEXZI.js} +1 -1
- package/dist/dashboard-web/chunks/{groups-page-3P4TLUMF.js → groups-page-6DKXBYOM.js} +1 -1
- package/dist/dashboard-web/chunks/{insights-page-TDCZV56A.js → insights-page-NWARTJ6J.js} +1 -1
- package/dist/dashboard-web/chunks/{monitor-room-QWCWL3SX.js → monitor-room-AGX3XRJX.js} +1 -1
- package/dist/dashboard-web/chunks/{monitoring-page-IOWFSNVC.js → monitoring-page-GGGIWN4C.js} +1 -1
- package/dist/dashboard-web/chunks/{office-page-5AUPEHZP.js → office-page-6SIVKSK3.js} +1 -1
- package/dist/dashboard-web/chunks/{overview-page-QJMI6NLW.js → overview-page-FVR3NKAF.js} +1 -1
- package/dist/dashboard-web/chunks/{roles-page-WJVB52ET.js → roles-page-WE2YB7KN.js} +1 -1
- package/dist/dashboard-web/chunks/{schedules-page-RVRWHP4V.js → schedules-page-TB3I24XN.js} +1 -1
- package/dist/dashboard-web/chunks/sessions-page-KOOOASIL.js +2 -0
- package/dist/dashboard-web/chunks/{settings-page-TNZEPC7V.js → settings-page-IEBR7TGN.js} +1 -1
- package/dist/dashboard-web/chunks/{skills-page-7YT5TIX5.js → skills-page-3QAT2IWD.js} +1 -1
- package/dist/dashboard-web/chunks/{team-federation-page-NJZKTU7A.js → team-federation-page-K4VVAVAK.js} +1 -1
- package/dist/dashboard-web/chunks/{v3-page-NQ73UA2Q.js → v3-page-V6IOJR2B.js} +1 -1
- package/dist/dashboard-web/chunks/{whiteboards-page-DSM3MDMN.js → whiteboards-page-V6CGKRNX.js} +1 -1
- package/dist/dashboard-web/style.css +20 -3
- package/dist/dashboard.js +86 -1
- package/dist/dashboard.js.map +1 -1
- package/dist/global-config.d.ts.map +1 -1
- package/dist/global-config.js +4 -1
- package/dist/global-config.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +1 -19
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +1 -19
- package/dist/i18n/zh.js.map +1 -1
- package/dist/im/lark/card-builder.d.ts +0 -13
- package/dist/im/lark/card-builder.d.ts.map +1 -1
- package/dist/im/lark/card-builder.js +0 -34
- package/dist/im/lark/card-builder.js.map +1 -1
- package/dist/im/lark/card-handler.d.ts.map +1 -1
- package/dist/im/lark/card-handler.js +1 -30
- package/dist/im/lark/card-handler.js.map +1 -1
- package/dist/im/lark/client.d.ts +36 -0
- package/dist/im/lark/client.d.ts.map +1 -1
- package/dist/im/lark/client.js +80 -0
- package/dist/im/lark/client.js.map +1 -1
- package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
- package/dist/im/lark/event-dispatcher.js +28 -3
- package/dist/im/lark/event-dispatcher.js.map +1 -1
- package/dist/services/sandbox-migration.d.ts +14 -0
- package/dist/services/sandbox-migration.d.ts.map +1 -0
- package/dist/services/sandbox-migration.js +85 -0
- package/dist/services/sandbox-migration.js.map +1 -0
- package/dist/services/sandbox-store.d.ts +28 -0
- package/dist/services/sandbox-store.d.ts.map +1 -1
- package/dist/services/sandbox-store.js +82 -0
- package/dist/services/sandbox-store.js.map +1 -1
- package/dist/types.d.ts +13 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/child-env.d.ts +2 -2
- package/dist/utils/child-env.d.ts.map +1 -1
- package/dist/utils/child-env.js +14 -0
- package/dist/utils/child-env.js.map +1 -1
- package/dist/worker.js +417 -498
- package/dist/worker.js.map +1 -1
- package/dist/workflows/events/payloads.d.ts +56 -0
- package/dist/workflows/events/payloads.d.ts.map +1 -1
- package/dist/workflows/events/payloads.js +9 -0
- package/dist/workflows/events/payloads.js.map +1 -1
- package/dist/workflows/events/schema.d.ts +86 -0
- package/dist/workflows/events/schema.d.ts.map +1 -1
- package/dist/workflows/shared/sandbox-policy.d.ts +10 -1
- package/dist/workflows/shared/sandbox-policy.d.ts.map +1 -1
- package/dist/workflows/shared/sandbox-policy.js +12 -0
- package/dist/workflows/shared/sandbox-policy.js.map +1 -1
- package/dist/workflows/v3/bot-resolve.d.ts.map +1 -1
- package/dist/workflows/v3/bot-resolve.js +36 -0
- package/dist/workflows/v3/bot-resolve.js.map +1 -1
- package/dist/workflows/v3/contract.d.ts +8 -0
- package/dist/workflows/v3/contract.d.ts.map +1 -1
- package/dist/workflows/v3/contract.js.map +1 -1
- package/package.json +1 -1
- package/dist/dashboard-web/chunks/bot-defaults-page-O376WSER.js +0 -5
- package/dist/dashboard-web/chunks/sessions-page-KWLGBX6G.js +0 -3
- package/dist/services/sandbox-land.d.ts +0 -45
- package/dist/services/sandbox-land.d.ts.map +0 -1
- package/dist/services/sandbox-land.js +0 -394
- package/dist/services/sandbox-land.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sandbox-land.d.ts","sourceRoot":"","sources":["../../src/services/sandbox-land.ts"],"names":[],"mappings":"AA4BA,OAAO,EAAK,KAAK,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAUlD,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,IAAI,CAAC;IACT,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AACD,MAAM,WAAW,SAAS;IAAG,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;AAavD,mFAAmF;AACnF,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEnE;AAmGD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CA+E5G;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG,SAAS,CAwFjI"}
|
|
@@ -1,394 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Sandbox landing (overlayfs model): the project overlay UPPER dir IS the
|
|
3
|
-
* changeset the sandboxed agent produced. We compute a human-readable diff from
|
|
4
|
-
* it (preview/patch via `git diff --no-index` against the real project), and on
|
|
5
|
-
* the owner's confirmation copy the changed files back into the real project.
|
|
6
|
-
*
|
|
7
|
-
* The agent in the sandbox is oblivious it's overlaid — it thinks it edits the
|
|
8
|
-
* real files. So landing is owner-triggered only (the `/land` command or the
|
|
9
|
-
* dashboard button), never by the agent.
|
|
10
|
-
*
|
|
11
|
-
* Upper-layer semantics (overlayfs):
|
|
12
|
-
* - a regular file in upper → a new-or-modified file
|
|
13
|
-
* - a symlink in upper → a symlink the agent created/changed
|
|
14
|
-
* - a character device with rdev 0 → a WHITEOUT (the agent deleted the file)
|
|
15
|
-
* - a dir with xattr trusted.overlay.opaque=y → the dir's lower contents are
|
|
16
|
-
* hidden. NOTE: overlayfs sets this xattr on BOTH a freshly-created dir AND a
|
|
17
|
-
* wholesale-replaced dir, so opacity ALONE cannot tell "new" from "replaced".
|
|
18
|
-
* The real discriminator is whether the dir also exists in the lower (= the
|
|
19
|
-
* target). We therefore only treat an opaque dir as a wholesale REPLACE (drop
|
|
20
|
-
* the lower's stale contents) when it ALSO exists in the target; a purely-new
|
|
21
|
-
* opaque dir is just mkdir'd — never rm -rf'd over unrelated real files.
|
|
22
|
-
*/
|
|
23
|
-
import { spawnSync } from 'node:child_process';
|
|
24
|
-
import { existsSync, readdirSync, lstatSync, copyFileSync, mkdirSync, rmSync, readFileSync, readlinkSync, symlinkSync, unlinkSync, realpathSync, } from 'node:fs';
|
|
25
|
-
import { join, dirname, relative, resolve } from 'node:path';
|
|
26
|
-
import { t } from '../i18n/index.js';
|
|
27
|
-
/** Canonicalize dataDir the same way prepareSandbox does: the sandbox tree is
|
|
28
|
-
* created under the CANONICAL dataDir, so a symlink `config.session.dataDir`
|
|
29
|
-
* would otherwise make `/land` / diff / patch look under the wrong path and
|
|
30
|
-
* find no changeset. Best-effort — falls back to a plain normalize. */
|
|
31
|
-
function canonicalDataDir(dataDir) {
|
|
32
|
-
try {
|
|
33
|
-
return realpathSync(dataDir);
|
|
34
|
-
}
|
|
35
|
-
catch {
|
|
36
|
-
return resolve(dataDir);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
/** Locate the project overlay UPPER dir (= SandboxSpawn.workDir) for a session. */
|
|
40
|
-
export function upperDir(dataDir, sessionId) {
|
|
41
|
-
return join(canonicalDataDir(dataDir), 'sandboxes', sessionId, 'proj-upper');
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* The project LOWER source recorded by prepareSandbox at create time (meta.json).
|
|
45
|
-
* Used to tell a wholesale-REPLACED opaque dir (existed in the lower) from a
|
|
46
|
-
* purely-NEW opaque dir (didn't) — overlayfs marks BOTH opaque, so the lower is
|
|
47
|
-
* the only reliable discriminator, and the LIVE landing target may have drifted
|
|
48
|
-
* (concurrent work) so we must NOT use it for this. Returns '' when unknown
|
|
49
|
-
* (older session / meta missing) → callers fall back to the target.
|
|
50
|
-
*/
|
|
51
|
-
function projectLower(dataDir, sessionId) {
|
|
52
|
-
try {
|
|
53
|
-
const meta = JSON.parse(readFileSync(join(canonicalDataDir(dataDir), 'sandboxes', sessionId, 'meta.json'), 'utf8'));
|
|
54
|
-
return typeof meta?.projectLower === 'string' ? meta.projectLower : '';
|
|
55
|
-
}
|
|
56
|
-
catch {
|
|
57
|
-
return '';
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
/** True if a path is an overlayfs whiteout (char device, rdev 0). */
|
|
61
|
-
function isWhiteout(p) {
|
|
62
|
-
try {
|
|
63
|
-
const st = lstatSync(p);
|
|
64
|
-
return st.isCharacterDevice() && st.rdev === 0;
|
|
65
|
-
}
|
|
66
|
-
catch {
|
|
67
|
-
return false;
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Read the overlay opaque xattr for a dir.
|
|
72
|
-
* - 'y' → the dir is opaque
|
|
73
|
-
* - '' → the dir is present and NOT opaque (xattr absent)
|
|
74
|
-
* - null → could NOT determine (no xattr tooling available / read failed)
|
|
75
|
-
*
|
|
76
|
-
* `getfattr` is provided by the `attr` package and is frequently NOT installed;
|
|
77
|
-
* `trusted.overlay.*` also requires CAP_SYS_ADMIN to read (we run as root). We
|
|
78
|
-
* try getfattr first, then python3's os.getxattr (commonly present), and return
|
|
79
|
-
* null when neither can answer — callers must NOT silently treat null as "not
|
|
80
|
-
* opaque" (that would leak stale lower files); they fail-closed where it matters.
|
|
81
|
-
*/
|
|
82
|
-
function readOpaqueXattr(p) {
|
|
83
|
-
// getfattr (attr package). --only-values prints just the value; ENOATTR → exit≠0.
|
|
84
|
-
const gf = spawnSync('getfattr', ['-n', 'trusted.overlay.opaque', '--only-values', '-h', p], { encoding: 'utf8' });
|
|
85
|
-
if (gf.error == null && typeof gf.status === 'number') {
|
|
86
|
-
if (gf.status === 0)
|
|
87
|
-
return (gf.stdout ?? '').trim() === 'y' ? 'y' : '';
|
|
88
|
-
// exit≠0 with stderr mentioning "No such attribute"/ENOATTR → present, not opaque.
|
|
89
|
-
const se = (gf.stderr ?? '').toLowerCase();
|
|
90
|
-
if (se.includes('no such attribute') || se.includes('enoattr') || se.includes('not found'))
|
|
91
|
-
return '';
|
|
92
|
-
// other failure (e.g. permission) → fall through to python.
|
|
93
|
-
}
|
|
94
|
-
// python3's os.getxattr — exit 0 + 'y' on stdout when opaque; exit 0 + '' when
|
|
95
|
-
// the attr is absent; exit 2 only if python itself is unavailable.
|
|
96
|
-
const py = spawnSync('python3', [
|
|
97
|
-
'-c',
|
|
98
|
-
"import os,sys\n" +
|
|
99
|
-
"try:\n" +
|
|
100
|
-
" v=os.getxattr(sys.argv[1],'trusted.overlay.opaque')\n" +
|
|
101
|
-
" sys.stdout.write(v.decode('latin1','replace'))\n" +
|
|
102
|
-
"except OSError as e:\n" +
|
|
103
|
-
" import errno\n" +
|
|
104
|
-
" sys.exit(0) if e.errno in (errno.ENODATA,errno.ENOATTR if hasattr(errno,'ENOATTR') else errno.ENODATA) else sys.exit(3)\n",
|
|
105
|
-
p,
|
|
106
|
-
], { encoding: 'utf8' });
|
|
107
|
-
if (py.error == null && py.status === 0)
|
|
108
|
-
return (py.stdout ?? '').trim() === 'y' ? 'y' : '';
|
|
109
|
-
return null; // undeterminable
|
|
110
|
-
}
|
|
111
|
-
/** Walk the upper layer, classifying every entry into an UpperChange. */
|
|
112
|
-
function walkUpper(upper) {
|
|
113
|
-
const changes = [];
|
|
114
|
-
const recurse = (dir) => {
|
|
115
|
-
let entries = [];
|
|
116
|
-
try {
|
|
117
|
-
entries = readdirSync(dir);
|
|
118
|
-
}
|
|
119
|
-
catch {
|
|
120
|
-
return;
|
|
121
|
-
}
|
|
122
|
-
for (const name of entries) {
|
|
123
|
-
const full = join(dir, name);
|
|
124
|
-
const rel = relative(upper, full);
|
|
125
|
-
if (isWhiteout(full)) {
|
|
126
|
-
changes.push({ rel, kind: 'delete' });
|
|
127
|
-
continue;
|
|
128
|
-
}
|
|
129
|
-
let st;
|
|
130
|
-
try {
|
|
131
|
-
st = lstatSync(full);
|
|
132
|
-
}
|
|
133
|
-
catch {
|
|
134
|
-
continue;
|
|
135
|
-
}
|
|
136
|
-
if (st.isSymbolicLink()) {
|
|
137
|
-
// A symlink is landed as a symlink (NOT dereferenced into a content copy,
|
|
138
|
-
// which would destroy the link and could snapshot out-of-tree host data).
|
|
139
|
-
let linkTarget = '';
|
|
140
|
-
try {
|
|
141
|
-
linkTarget = readlinkSync(full);
|
|
142
|
-
}
|
|
143
|
-
catch { /* */ }
|
|
144
|
-
changes.push({ rel, kind: 'symlink', linkTarget });
|
|
145
|
-
}
|
|
146
|
-
else if (st.isDirectory()) {
|
|
147
|
-
// Opacity is recorded; the new-vs-replace decision is deferred to apply
|
|
148
|
-
// (where the target — the lower — is known). Either way we recurse so the
|
|
149
|
-
// dir's surviving children land as their own 'file'/'symlink' changes.
|
|
150
|
-
const opaque = readOpaqueXattr(full);
|
|
151
|
-
if (opaque === 'y' || opaque === null)
|
|
152
|
-
changes.push({ rel, kind: 'opaque' });
|
|
153
|
-
recurse(full);
|
|
154
|
-
}
|
|
155
|
-
else if (st.isFile()) {
|
|
156
|
-
changes.push({ rel, kind: 'file' });
|
|
157
|
-
}
|
|
158
|
-
// other special files (fifos/sockets/non-whiteout devices) are skipped.
|
|
159
|
-
}
|
|
160
|
-
};
|
|
161
|
-
recurse(upper);
|
|
162
|
-
return changes;
|
|
163
|
-
}
|
|
164
|
-
/**
|
|
165
|
-
* Compute the agent's changeset from the session's overlay upper layer, with a
|
|
166
|
-
* human-readable preview (per-file `git diff --no-index` vs the real project).
|
|
167
|
-
*/
|
|
168
|
-
export function computeSandboxDiff(dataDir, sessionId, locale) {
|
|
169
|
-
const upper = upperDir(dataDir, sessionId);
|
|
170
|
-
if (!existsSync(upper))
|
|
171
|
-
return { ok: false, error: t('sandbox.no_clone', undefined, locale) };
|
|
172
|
-
let changes;
|
|
173
|
-
try {
|
|
174
|
-
changes = walkUpper(upper);
|
|
175
|
-
}
|
|
176
|
-
catch (e) {
|
|
177
|
-
return { ok: false, error: t('sandbox.diff_failed', { detail: (e?.message ?? e).toString().slice(0, 300) }, locale) };
|
|
178
|
-
}
|
|
179
|
-
if (changes.length === 0) {
|
|
180
|
-
return { ok: true, empty: true, patch: '', statText: '', files: 0, insertions: 0, deletions: 0 };
|
|
181
|
-
}
|
|
182
|
-
// Diff each upper file against the SAME-NAMED real file in the overlay lower
|
|
183
|
-
// (the recorded project root) so modified files show a true unified diff (not
|
|
184
|
-
// the whole file as "added"), then rewrite git's --no-index headers to
|
|
185
|
-
// project-relative a/<rel> b/<rel> — clean for the card AND `git apply`-able as
|
|
186
|
-
// the .patch file. New files diff vs /dev/null; deletions diff lower vs /dev/null.
|
|
187
|
-
const lower = projectLower(dataDir, sessionId); // real project root ('' if unknown)
|
|
188
|
-
const relDiff = (oldPath, newPath, rel) => {
|
|
189
|
-
let out = '';
|
|
190
|
-
try {
|
|
191
|
-
out = spawnSync('git', ['diff', '--no-index', '--', oldPath, newPath], { encoding: 'utf8', maxBuffer: 64 * 1024 * 1024 }).stdout ?? '';
|
|
192
|
-
}
|
|
193
|
-
catch { /* */ }
|
|
194
|
-
if (!out)
|
|
195
|
-
return '';
|
|
196
|
-
return out.split('\n').map(line => {
|
|
197
|
-
if (line.startsWith('diff --git '))
|
|
198
|
-
return `diff --git a/${rel} b/${rel}`;
|
|
199
|
-
if (line.startsWith('--- '))
|
|
200
|
-
return line.includes('/dev/null') ? '--- /dev/null' : `--- a/${rel}`;
|
|
201
|
-
if (line.startsWith('+++ '))
|
|
202
|
-
return line.includes('/dev/null') ? '+++ /dev/null' : `+++ b/${rel}`;
|
|
203
|
-
return line;
|
|
204
|
-
}).join('\n');
|
|
205
|
-
};
|
|
206
|
-
const countPlus = (b) => b.split('\n').filter(l => l.startsWith('+') && !l.startsWith('+++')).length;
|
|
207
|
-
const countMinus = (b) => b.split('\n').filter(l => l.startsWith('-') && !l.startsWith('---')).length;
|
|
208
|
-
const statLines = [];
|
|
209
|
-
const patchParts = [];
|
|
210
|
-
let insertions = 0, deletions = 0, fileCount = 0;
|
|
211
|
-
for (const c of changes) {
|
|
212
|
-
if (c.kind === 'delete') {
|
|
213
|
-
const lowFile = lower ? join(lower, c.rel) : '';
|
|
214
|
-
const body = (lowFile && existsSync(lowFile))
|
|
215
|
-
? relDiff(lowFile, '/dev/null', c.rel)
|
|
216
|
-
: `diff --git a/${c.rel} b/${c.rel}\ndeleted file\n--- a/${c.rel}\n+++ /dev/null\n`;
|
|
217
|
-
statLines.push(`D ${c.rel}`);
|
|
218
|
-
deletions += countMinus(body) || 1;
|
|
219
|
-
patchParts.push(body);
|
|
220
|
-
fileCount++;
|
|
221
|
-
continue;
|
|
222
|
-
}
|
|
223
|
-
if (c.kind === 'symlink') {
|
|
224
|
-
statLines.push(`L ${c.rel} -> ${c.linkTarget ?? ''}`);
|
|
225
|
-
patchParts.push(`# symlink ${c.rel} -> ${c.linkTarget ?? ''} (recreated on land; not in this text patch)`);
|
|
226
|
-
fileCount++;
|
|
227
|
-
continue;
|
|
228
|
-
}
|
|
229
|
-
if (c.kind === 'opaque') {
|
|
230
|
-
// Replaced directory; its surviving children land as their own 'file'
|
|
231
|
-
// changes (walkUpper recursed), so no diff body here — just note it.
|
|
232
|
-
statLines.push(`R ${c.rel}/ (directory replaced)`);
|
|
233
|
-
continue;
|
|
234
|
-
}
|
|
235
|
-
// regular file: modified (exists in lower) vs new
|
|
236
|
-
const upPath = join(upper, c.rel);
|
|
237
|
-
const lowFile = lower ? join(lower, c.rel) : '';
|
|
238
|
-
const isMod = !!(lowFile && existsSync(lowFile));
|
|
239
|
-
const body = relDiff(isMod ? lowFile : '/dev/null', upPath, c.rel)
|
|
240
|
-
|| `diff --git a/${c.rel} b/${c.rel}\n(binary or unreadable: ${c.rel})\n`;
|
|
241
|
-
statLines.push(`${isMod ? 'M' : 'A'} ${c.rel}`);
|
|
242
|
-
insertions += countPlus(body);
|
|
243
|
-
deletions += countMinus(body);
|
|
244
|
-
patchParts.push(body);
|
|
245
|
-
fileCount++;
|
|
246
|
-
}
|
|
247
|
-
return {
|
|
248
|
-
ok: true,
|
|
249
|
-
empty: false,
|
|
250
|
-
patch: patchParts.join('\n'),
|
|
251
|
-
statText: statLines.join('\n'),
|
|
252
|
-
files: fileCount,
|
|
253
|
-
insertions,
|
|
254
|
-
deletions,
|
|
255
|
-
};
|
|
256
|
-
}
|
|
257
|
-
/**
|
|
258
|
-
* Apply the session's overlay upper changeset onto the real target project:
|
|
259
|
-
* - regular file in upper → mkdir -p parent, copy over the real file
|
|
260
|
-
* - symlink in upper → recreate the link (NOT a dereferenced copy)
|
|
261
|
-
* - whiteout → remove the corresponding real file/dir
|
|
262
|
-
* - opaque dir → only when the dir ALSO exists in the target (= a
|
|
263
|
-
* wholesale replace): drop the stale lower contents,
|
|
264
|
-
* then re-create it (its surviving files arrive as
|
|
265
|
-
* separate 'file'/'symlink' changes). A purely-new
|
|
266
|
-
* opaque dir is just mkdir'd (never rm -rf'd).
|
|
267
|
-
*
|
|
268
|
-
* Two-phase for safety:
|
|
269
|
-
* 1) PRE-VALIDATE every source is landable (dangling symlink, unreadable regular
|
|
270
|
-
* file, undeterminable opacity on a dir that exists in the target) BEFORE we
|
|
271
|
-
* mutate anything — so the common mid-loop failure (a dangling relative
|
|
272
|
-
* symlink) is caught up front and the real project is left untouched.
|
|
273
|
-
* 2) APPLY; if a per-file op still throws (race / permission / ENOSPC), we
|
|
274
|
-
* report which files were already applied so the owner isn't told "failed"
|
|
275
|
-
* with the repo silently half-landed and no clue about its state.
|
|
276
|
-
*/
|
|
277
|
-
export function applySandboxDiff(targetDir, dataDir, sessionId, locale) {
|
|
278
|
-
const upper = upperDir(dataDir, sessionId);
|
|
279
|
-
if (!existsSync(upper))
|
|
280
|
-
return { ok: false, error: t('sandbox.no_clone', undefined, locale) };
|
|
281
|
-
if (!existsSync(targetDir))
|
|
282
|
-
return { ok: false, error: t('sandbox.target_not_git', { dir: targetDir }, locale) };
|
|
283
|
-
let changes;
|
|
284
|
-
try {
|
|
285
|
-
changes = walkUpper(upper);
|
|
286
|
-
}
|
|
287
|
-
catch (e) {
|
|
288
|
-
return { ok: false, error: t('sandbox.apply_failed', { detail: (e?.message ?? e).toString().slice(0, 300) }, locale) };
|
|
289
|
-
}
|
|
290
|
-
if (changes.length === 0)
|
|
291
|
-
return { ok: false, error: t('sandbox.nothing_to_land', undefined, locale) };
|
|
292
|
-
// Project LOWER (create-time) — the reliable new-vs-replace discriminator for
|
|
293
|
-
// opaque dirs; '' when unknown → fall back to the live target.
|
|
294
|
-
const lower = projectLower(dataDir, sessionId);
|
|
295
|
-
// Does dir `rel` count as a REPLACE (existed in the lower) vs a fresh NEW dir?
|
|
296
|
-
const existedInLower = (rel) => lower ? existsSync(join(lower, rel)) : existsSync(join(targetDir, rel));
|
|
297
|
-
// ── Phase 1: pre-validate — fail-closed BEFORE any mutation ────────────────
|
|
298
|
-
const preErrors = [];
|
|
299
|
-
for (const c of changes) {
|
|
300
|
-
if (c.kind === 'file') {
|
|
301
|
-
const src = join(upper, c.rel);
|
|
302
|
-
// Resolve via lstat: a regular file must be readable; a broken/special src
|
|
303
|
-
// would make the in-loop copyFileSync throw mid-land. Catch it now.
|
|
304
|
-
try {
|
|
305
|
-
lstatSync(src);
|
|
306
|
-
}
|
|
307
|
-
catch (e) {
|
|
308
|
-
preErrors.push(`${c.rel}: source missing (${e?.code ?? e})`);
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
else if (c.kind === 'symlink') {
|
|
312
|
-
if (!c.linkTarget)
|
|
313
|
-
preErrors.push(`${c.rel}: unreadable symlink target`);
|
|
314
|
-
}
|
|
315
|
-
else if (c.kind === 'opaque') {
|
|
316
|
-
// Only an opaque dir that existed in the LOWER triggers a destructive
|
|
317
|
-
// rm -rf (a wholesale replace). For such a dir, if we could NOT determine
|
|
318
|
-
// opacity (readOpaqueXattr → null, no xattr tooling) we MUST NOT guess
|
|
319
|
-
// "not opaque" (that leaks stale lower files); fail-closed with a clear
|
|
320
|
-
// message. A purely-NEW opaque dir needs no opacity read at all.
|
|
321
|
-
if (existedInLower(c.rel)) {
|
|
322
|
-
const opaque = readOpaqueXattr(join(upper, c.rel));
|
|
323
|
-
if (opaque === null) {
|
|
324
|
-
preErrors.push(`${c.rel}/: cannot determine overlay opacity (install the "attr" package, i.e. getfattr) — refusing to land a possibly-replaced directory without knowing whether to drop its stale contents`);
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
if (preErrors.length > 0) {
|
|
330
|
-
return { ok: false, error: t('sandbox.apply_failed', { detail: `pre-flight (no changes applied): ${preErrors.slice(0, 8).join('; ').slice(0, 380)}` }, locale) };
|
|
331
|
-
}
|
|
332
|
-
// ── Phase 2: apply ─────────────────────────────────────────────────────────
|
|
333
|
-
const applied = [];
|
|
334
|
-
try {
|
|
335
|
-
for (const c of changes) {
|
|
336
|
-
const real = join(targetDir, c.rel);
|
|
337
|
-
if (c.kind === 'delete') {
|
|
338
|
-
try {
|
|
339
|
-
rmSync(real, { recursive: true, force: true });
|
|
340
|
-
}
|
|
341
|
-
catch { /* already gone */ }
|
|
342
|
-
applied.push(`-${c.rel}`);
|
|
343
|
-
continue;
|
|
344
|
-
}
|
|
345
|
-
if (c.kind === 'opaque') {
|
|
346
|
-
// Wholesale REPLACE only when the dir existed in the LOWER (create-time)
|
|
347
|
-
// — drop its stale contents. A purely-NEW opaque dir is just mkdir'd, so
|
|
348
|
-
// we never rm -rf unrelated real files that drifted into the live target
|
|
349
|
-
// under a path the agent merely created fresh (the new-dir clobber).
|
|
350
|
-
if (existedInLower(c.rel) && existsSync(real)) {
|
|
351
|
-
try {
|
|
352
|
-
rmSync(real, { recursive: true, force: true });
|
|
353
|
-
}
|
|
354
|
-
catch { /* */ }
|
|
355
|
-
}
|
|
356
|
-
mkdirSync(real, { recursive: true });
|
|
357
|
-
applied.push(`R ${c.rel}/`);
|
|
358
|
-
continue;
|
|
359
|
-
}
|
|
360
|
-
if (c.kind === 'symlink') {
|
|
361
|
-
// Recreate the link verbatim (preserve symlink-ness; do NOT dereference).
|
|
362
|
-
mkdirSync(dirname(real), { recursive: true });
|
|
363
|
-
try {
|
|
364
|
-
unlinkSync(real);
|
|
365
|
-
}
|
|
366
|
-
catch { /* not present */ }
|
|
367
|
-
try {
|
|
368
|
-
rmSync(real, { recursive: true, force: true });
|
|
369
|
-
}
|
|
370
|
-
catch { /* was a dir */ }
|
|
371
|
-
symlinkSync(c.linkTarget ?? '', real);
|
|
372
|
-
applied.push(`L ${c.rel}`);
|
|
373
|
-
continue;
|
|
374
|
-
}
|
|
375
|
-
// regular file: copy the upper content over the real file.
|
|
376
|
-
mkdirSync(dirname(real), { recursive: true });
|
|
377
|
-
// If a symlink/dir is squatting the target path, clear it first so copy lands a file.
|
|
378
|
-
try {
|
|
379
|
-
const st = lstatSync(real);
|
|
380
|
-
if (st.isSymbolicLink() || st.isDirectory())
|
|
381
|
-
rmSync(real, { recursive: true, force: true });
|
|
382
|
-
}
|
|
383
|
-
catch { /* */ }
|
|
384
|
-
copyFileSync(join(upper, c.rel), real);
|
|
385
|
-
applied.push(c.rel);
|
|
386
|
-
}
|
|
387
|
-
return { ok: true };
|
|
388
|
-
}
|
|
389
|
-
catch (e) {
|
|
390
|
-
const detail = `${(e?.message ?? e).toString().slice(0, 240)} — already applied (${applied.length}): ${applied.slice(0, 12).join(', ').slice(0, 200)}`;
|
|
391
|
-
return { ok: false, error: t('sandbox.apply_failed', { detail }, locale) };
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
//# sourceMappingURL=sandbox-land.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sandbox-land.js","sourceRoot":"","sources":["../../src/services/sandbox-land.ts"],"names":[],"mappings":"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"}
|