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.
Files changed (147) hide show
  1. package/dist/adapters/backend/sandbox.d.ts +99 -279
  2. package/dist/adapters/backend/sandbox.d.ts.map +1 -1
  3. package/dist/adapters/backend/sandbox.js +424 -826
  4. package/dist/adapters/backend/sandbox.js.map +1 -1
  5. package/dist/adapters/cli/codex.d.ts.map +1 -1
  6. package/dist/adapters/cli/codex.js +4 -0
  7. package/dist/adapters/cli/codex.js.map +1 -1
  8. package/dist/adapters/cli/fs-policy.d.ts +244 -0
  9. package/dist/adapters/cli/fs-policy.d.ts.map +1 -0
  10. package/dist/adapters/cli/fs-policy.js +539 -0
  11. package/dist/adapters/cli/fs-policy.js.map +1 -0
  12. package/dist/adapters/cli/read-isolation.d.ts +14 -200
  13. package/dist/adapters/cli/read-isolation.d.ts.map +1 -1
  14. package/dist/adapters/cli/read-isolation.js +18 -477
  15. package/dist/adapters/cli/read-isolation.js.map +1 -1
  16. package/dist/bot-registry.d.ts +26 -23
  17. package/dist/bot-registry.d.ts.map +1 -1
  18. package/dist/bot-registry.js +16 -0
  19. package/dist/bot-registry.js.map +1 -1
  20. package/dist/cli.d.ts.map +1 -1
  21. package/dist/cli.js +25 -18
  22. package/dist/cli.js.map +1 -1
  23. package/dist/core/command-handler.d.ts.map +1 -1
  24. package/dist/core/command-handler.js +16 -58
  25. package/dist/core/command-handler.js.map +1 -1
  26. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  27. package/dist/core/dashboard-ipc-server.js +26 -27
  28. package/dist/core/dashboard-ipc-server.js.map +1 -1
  29. package/dist/core/passthrough-commands.d.ts.map +1 -1
  30. package/dist/core/passthrough-commands.js +1 -1
  31. package/dist/core/passthrough-commands.js.map +1 -1
  32. package/dist/core/plugins/mcp/gateway-installer.d.ts.map +1 -1
  33. package/dist/core/plugins/mcp/gateway-installer.js +14 -2
  34. package/dist/core/plugins/mcp/gateway-installer.js.map +1 -1
  35. package/dist/core/session-manager.d.ts.map +1 -1
  36. package/dist/core/session-manager.js +90 -60
  37. package/dist/core/session-manager.js.map +1 -1
  38. package/dist/core/worker-pool.d.ts +24 -0
  39. package/dist/core/worker-pool.d.ts.map +1 -1
  40. package/dist/core/worker-pool.js +50 -6
  41. package/dist/core/worker-pool.js.map +1 -1
  42. package/dist/daemon.d.ts.map +1 -1
  43. package/dist/daemon.js +6 -0
  44. package/dist/daemon.js.map +1 -1
  45. package/dist/dashboard/bot-payload.d.ts +5 -0
  46. package/dist/dashboard/bot-payload.d.ts.map +1 -1
  47. package/dist/dashboard/bot-payload.js +7 -0
  48. package/dist/dashboard/bot-payload.js.map +1 -1
  49. package/dist/dashboard/web/bot-defaults-page.d.ts +16 -0
  50. package/dist/dashboard/web/bot-defaults-page.d.ts.map +1 -1
  51. package/dist/dashboard/web/bot-defaults-page.js +225 -6
  52. package/dist/dashboard/web/bot-defaults-page.js.map +1 -1
  53. package/dist/dashboard/web/bot-defaults.d.ts +7 -0
  54. package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
  55. package/dist/dashboard/web/bot-defaults.js.map +1 -1
  56. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  57. package/dist/dashboard/web/i18n.js +38 -22
  58. package/dist/dashboard/web/i18n.js.map +1 -1
  59. package/dist/dashboard/web/sessions-page.d.ts.map +1 -1
  60. package/dist/dashboard/web/sessions-page.js +1 -44
  61. package/dist/dashboard/web/sessions-page.js.map +1 -1
  62. package/dist/dashboard-web/app.js +1 -1
  63. package/dist/dashboard-web/chunks/bot-defaults-page-AUKV7P4L.js +10 -0
  64. package/dist/dashboard-web/chunks/{chunk-QCPPKCX3.js → chunk-KPQAUX7V.js} +1 -1
  65. package/dist/dashboard-web/chunks/{chunk-WXPMNEYV.js → chunk-NRL6CVAS.js} +1 -1
  66. package/dist/dashboard-web/chunks/{chunk-EJDYUINZ.js → chunk-R7IAKAYX.js} +1 -1
  67. package/dist/dashboard-web/chunks/{chunk-H7P5UV4W.js → chunk-X2L65IOM.js} +6 -6
  68. package/dist/dashboard-web/chunks/{connectors-page-IR54AOAI.js → connectors-page-HDQFEXZI.js} +1 -1
  69. package/dist/dashboard-web/chunks/{groups-page-3P4TLUMF.js → groups-page-6DKXBYOM.js} +1 -1
  70. package/dist/dashboard-web/chunks/{insights-page-TDCZV56A.js → insights-page-NWARTJ6J.js} +1 -1
  71. package/dist/dashboard-web/chunks/{monitor-room-QWCWL3SX.js → monitor-room-AGX3XRJX.js} +1 -1
  72. package/dist/dashboard-web/chunks/{monitoring-page-IOWFSNVC.js → monitoring-page-GGGIWN4C.js} +1 -1
  73. package/dist/dashboard-web/chunks/{office-page-5AUPEHZP.js → office-page-6SIVKSK3.js} +1 -1
  74. package/dist/dashboard-web/chunks/{overview-page-QJMI6NLW.js → overview-page-FVR3NKAF.js} +1 -1
  75. package/dist/dashboard-web/chunks/{roles-page-WJVB52ET.js → roles-page-WE2YB7KN.js} +1 -1
  76. package/dist/dashboard-web/chunks/{schedules-page-RVRWHP4V.js → schedules-page-TB3I24XN.js} +1 -1
  77. package/dist/dashboard-web/chunks/sessions-page-KOOOASIL.js +2 -0
  78. package/dist/dashboard-web/chunks/{settings-page-TNZEPC7V.js → settings-page-IEBR7TGN.js} +1 -1
  79. package/dist/dashboard-web/chunks/{skills-page-7YT5TIX5.js → skills-page-3QAT2IWD.js} +1 -1
  80. package/dist/dashboard-web/chunks/{team-federation-page-NJZKTU7A.js → team-federation-page-K4VVAVAK.js} +1 -1
  81. package/dist/dashboard-web/chunks/{v3-page-NQ73UA2Q.js → v3-page-V6IOJR2B.js} +1 -1
  82. package/dist/dashboard-web/chunks/{whiteboards-page-DSM3MDMN.js → whiteboards-page-V6CGKRNX.js} +1 -1
  83. package/dist/dashboard-web/style.css +20 -3
  84. package/dist/dashboard.js +86 -1
  85. package/dist/dashboard.js.map +1 -1
  86. package/dist/global-config.d.ts.map +1 -1
  87. package/dist/global-config.js +4 -1
  88. package/dist/global-config.js.map +1 -1
  89. package/dist/i18n/en.d.ts.map +1 -1
  90. package/dist/i18n/en.js +1 -19
  91. package/dist/i18n/en.js.map +1 -1
  92. package/dist/i18n/zh.d.ts.map +1 -1
  93. package/dist/i18n/zh.js +1 -19
  94. package/dist/i18n/zh.js.map +1 -1
  95. package/dist/im/lark/card-builder.d.ts +0 -13
  96. package/dist/im/lark/card-builder.d.ts.map +1 -1
  97. package/dist/im/lark/card-builder.js +0 -34
  98. package/dist/im/lark/card-builder.js.map +1 -1
  99. package/dist/im/lark/card-handler.d.ts.map +1 -1
  100. package/dist/im/lark/card-handler.js +1 -30
  101. package/dist/im/lark/card-handler.js.map +1 -1
  102. package/dist/im/lark/client.d.ts +36 -0
  103. package/dist/im/lark/client.d.ts.map +1 -1
  104. package/dist/im/lark/client.js +80 -0
  105. package/dist/im/lark/client.js.map +1 -1
  106. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  107. package/dist/im/lark/event-dispatcher.js +28 -3
  108. package/dist/im/lark/event-dispatcher.js.map +1 -1
  109. package/dist/services/sandbox-migration.d.ts +14 -0
  110. package/dist/services/sandbox-migration.d.ts.map +1 -0
  111. package/dist/services/sandbox-migration.js +85 -0
  112. package/dist/services/sandbox-migration.js.map +1 -0
  113. package/dist/services/sandbox-store.d.ts +28 -0
  114. package/dist/services/sandbox-store.d.ts.map +1 -1
  115. package/dist/services/sandbox-store.js +82 -0
  116. package/dist/services/sandbox-store.js.map +1 -1
  117. package/dist/types.d.ts +13 -1
  118. package/dist/types.d.ts.map +1 -1
  119. package/dist/utils/child-env.d.ts +2 -2
  120. package/dist/utils/child-env.d.ts.map +1 -1
  121. package/dist/utils/child-env.js +14 -0
  122. package/dist/utils/child-env.js.map +1 -1
  123. package/dist/worker.js +417 -498
  124. package/dist/worker.js.map +1 -1
  125. package/dist/workflows/events/payloads.d.ts +56 -0
  126. package/dist/workflows/events/payloads.d.ts.map +1 -1
  127. package/dist/workflows/events/payloads.js +9 -0
  128. package/dist/workflows/events/payloads.js.map +1 -1
  129. package/dist/workflows/events/schema.d.ts +86 -0
  130. package/dist/workflows/events/schema.d.ts.map +1 -1
  131. package/dist/workflows/shared/sandbox-policy.d.ts +10 -1
  132. package/dist/workflows/shared/sandbox-policy.d.ts.map +1 -1
  133. package/dist/workflows/shared/sandbox-policy.js +12 -0
  134. package/dist/workflows/shared/sandbox-policy.js.map +1 -1
  135. package/dist/workflows/v3/bot-resolve.d.ts.map +1 -1
  136. package/dist/workflows/v3/bot-resolve.js +36 -0
  137. package/dist/workflows/v3/bot-resolve.js.map +1 -1
  138. package/dist/workflows/v3/contract.d.ts +8 -0
  139. package/dist/workflows/v3/contract.d.ts.map +1 -1
  140. package/dist/workflows/v3/contract.js.map +1 -1
  141. package/package.json +1 -1
  142. package/dist/dashboard-web/chunks/bot-defaults-page-O376WSER.js +0 -5
  143. package/dist/dashboard-web/chunks/sessions-page-KWLGBX6G.js +0 -3
  144. package/dist/services/sandbox-land.d.ts +0 -45
  145. package/dist/services/sandbox-land.d.ts.map +0 -1
  146. package/dist/services/sandbox-land.js +0 -394
  147. package/dist/services/sandbox-land.js.map +0 -1
@@ -0,0 +1,539 @@
1
+ /**
2
+ * Unified file-sandbox policy (FsPolicy) — the single source of truth for BOTH
3
+ * platform sandbox engines.
4
+ *
5
+ * Model (three-tier whitelist, per product decision 2026-07-16, design doc
6
+ * "botmux 文件沙盒重构方案"): every path gets one of three access levels —
7
+ * readWrite / readOnly / deny — and EVERYTHING NOT COVERED BY A RULE IS
8
+ * INACCESSIBLE (deny-by-default). Nested black/white lists are supported: the
9
+ * DEEPEST matching rule wins (longest-prefix), so `readOnly ~/Library` +
10
+ * `deny ~/Library/Keychains` and `deny bots/` + `readWrite bots/<self>` both
11
+ * work. This replaces the previous "read-everything + enumerated blocklist"
12
+ * model whose failure mode was silent secret exposure; here a missing baseline
13
+ * entry fails loud (CLI error), never silent.
14
+ *
15
+ * Architecture: this module is PURE (no fs / no spawn — fully unit-testable).
16
+ * buildFsPolicy(ctx) merges baseline preset + botmux-internal + adapter
17
+ * + user rules into one ordered rule list
18
+ * compileToSeatbelt(...) → macOS sandbox-exec profile text
19
+ * compileToBwrap(...) → Linux bwrap argv prefix
20
+ * Both engines resolve conflicts by "last emitted wins" (Seatbelt last-match /
21
+ * bwrap mount order), so emitting rules sorted shallow→deep yields
22
+ * longest-prefix-wins on BOTH platforms by construction — cross-platform
23
+ * parity needs no hand-synced rule lists.
24
+ *
25
+ * The worker resolves every impure input up front (realpath, existence
26
+ * filtering, sibling-free by design) and passes canonical absolute paths.
27
+ */
28
+ /** Normalize: require absolute, strip trailing slashes, reject `..` segments.
29
+ * Returns null for anything unusable (silently-dropped relative paths are a
30
+ * fail-open trap — callers log dropped entries). */
31
+ export function normalizeFsPath(p) {
32
+ if (!p || typeof p !== 'string')
33
+ return null;
34
+ const t = p.replace(/\/+$/, '') || '/';
35
+ if (!t.startsWith('/'))
36
+ return null;
37
+ if (t.split('/').includes('..'))
38
+ return null;
39
+ return t;
40
+ }
41
+ /** Path depth for emission ordering ('/' = 0, '/a' = 1, '/a/b' = 2 …). */
42
+ function pathDepth(p) {
43
+ if (p === '/')
44
+ return 0;
45
+ return p.split('/').length - 1;
46
+ }
47
+ /** Is `p` equal to or an ancestor of `child`? (both normalized) */
48
+ export function coversPath(p, child) {
49
+ if (p === child)
50
+ return true;
51
+ const prefix = p === '/' ? '/' : `${p}/`;
52
+ return child.startsWith(prefix);
53
+ }
54
+ const SOURCE_RANK = {
55
+ baseline: 0,
56
+ adapter: 1,
57
+ internal: 2,
58
+ user: 3,
59
+ mandatory: 4,
60
+ };
61
+ const RESTRICTIVENESS = { readWrite: 0, readOnly: 1, deny: 2 };
62
+ /**
63
+ * Merge candidate rules into the final ordered list:
64
+ * - normalize paths, drop unusable entries
65
+ * - dedupe same-path conflicts: higher source rank wins (user > internal >
66
+ * adapter > baseline); tie → the MORE RESTRICTIVE access wins (deny >
67
+ * readOnly > readWrite) so a duplicated entry can never widen access
68
+ * - sort shallow→deep (stable within a depth) — the emission order both
69
+ * compilers rely on for longest-prefix-wins
70
+ */
71
+ export function mergeFsRules(candidates) {
72
+ const byPath = new Map();
73
+ for (const c of candidates) {
74
+ const path = normalizeFsPath(c.path);
75
+ if (!path)
76
+ continue;
77
+ const rule = { path, access: c.access, source: c.source };
78
+ const prev = byPath.get(path);
79
+ if (!prev) {
80
+ byPath.set(path, rule);
81
+ continue;
82
+ }
83
+ const rankNew = SOURCE_RANK[rule.source], rankOld = SOURCE_RANK[prev.source];
84
+ if (rankNew > rankOld) {
85
+ byPath.set(path, rule);
86
+ continue;
87
+ }
88
+ if (rankNew === rankOld && RESTRICTIVENESS[rule.access] > RESTRICTIVENESS[prev.access]) {
89
+ byPath.set(path, rule);
90
+ }
91
+ }
92
+ return [...byPath.values()].sort((a, b) => pathDepth(a.path) - pathDepth(b.path) || (a.path < b.path ? -1 : a.path > b.path ? 1 : 0));
93
+ }
94
+ /**
95
+ * The effective access for `path` under `rules`: the DEEPEST rule whose path
96
+ * covers it; no match → 'none' (inaccessible). This one function IS the policy
97
+ * semantics — the dashboard path tester and the unit tests both call it, and
98
+ * both compilers are tested to agree with it.
99
+ */
100
+ export function accessForPath(rules, path) {
101
+ const p = normalizeFsPath(path);
102
+ if (!p)
103
+ return { access: 'none' };
104
+ let best;
105
+ for (const r of rules) {
106
+ if (!coversPath(r.path, p))
107
+ continue;
108
+ if (!best || pathDepth(r.path) > pathDepth(best.path))
109
+ best = r;
110
+ }
111
+ return best ? { access: best.access, rule: best } : { access: 'none' };
112
+ }
113
+ // ───────────────────────────── baseline presets ──────────────────────────────
114
+ /** Home-relative entries shared by both platforms. Existence-filtered by the
115
+ * worker before compiling (a missing path has nothing to protect or expose). */
116
+ function commonHomeBaseline(h) {
117
+ const ro = (p) => ({ path: p, access: 'readOnly', source: 'baseline' });
118
+ const rw = (p) => ({ path: p, access: 'readWrite', source: 'baseline' });
119
+ const deny = (p) => ({ path: p, access: 'deny', source: 'baseline' });
120
+ return [
121
+ // Shell/env init read by non-interactive subshells (the Bash tool sources
122
+ // .zshenv — botmux's lark-cli identity mapping lives there) + git identity.
123
+ ro(`${h}/.zshenv`), ro(`${h}/.zprofile`), ro(`${h}/.zshrc`),
124
+ ro(`${h}/.profile`), ro(`${h}/.bashrc`), ro(`${h}/.bash_profile`),
125
+ ro(`${h}/.gitconfig`), ro(`${h}/.config/git`), ro(`${h}/.gitignore_global`), ro(`${h}/.gitattributes`),
126
+ // Language toolchains / version managers / package caches commonly under
127
+ // $HOME (read+exec so python/perl/ruby/rust/go/node/java built or managed
128
+ // there just work — the deny-by-default read posture would otherwise hide a
129
+ // pyenv python or a cargo-built binary). READ-ONLY: the agent runs them, it
130
+ // doesn't need to mutate the toolchain. Credential files that live INSIDE a
131
+ // few of these (crates.io / rubygems / maven tokens) are re-denied DEEPER
132
+ // below so longest-prefix keeps them secret.
133
+ ro(`${h}/.fnm`), ro(`${h}/.nvm`), ro(`${h}/.volta`), ro(`${h}/.npm-global`),
134
+ ro(`${h}/.nodenv`), ro(`${h}/.yarn`), ro(`${h}/.pnpm`), ro(`${h}/.bun`), ro(`${h}/.deno`),
135
+ ro(`${h}/.pyenv`), ro(`${h}/Library/Python`), ro(`${h}/.local/lib`), ro(`${h}/.pipx`),
136
+ ro(`${h}/.rbenv`), ro(`${h}/.rvm`), ro(`${h}/.gem`), ro(`${h}/perl5`), ro(`${h}/.cpanm`), ro(`${h}/.cpan`),
137
+ ro(`${h}/.cargo`), ro(`${h}/.rustup`),
138
+ ro(`${h}/go`), ro(`${h}/.gvm`), ro(`${h}/.goenv`),
139
+ ro(`${h}/.sdkman`), ro(`${h}/.jenv`), ro(`${h}/.m2`), ro(`${h}/.gradle`),
140
+ ro(`${h}/.asdf`), ro(`${h}/.mise`), ro(`${h}/.plenv`),
141
+ ro(`${h}/.opam`), ro(`${h}/.ghcup`), ro(`${h}/.stack`), ro(`${h}/.nimble`), ro(`${h}/.pub-cache`),
142
+ ro(`${h}/.local/share`), ro(`${h}/.local/bin`),
143
+ // Toolchain credential files sitting inside the read-allowed dirs above —
144
+ // re-denied deeper (registry/publish tokens, maven server passwords).
145
+ deny(`${h}/.cargo/credentials`), deny(`${h}/.cargo/credentials.toml`),
146
+ deny(`${h}/.gem/credentials`),
147
+ deny(`${h}/.m2/settings.xml`), deny(`${h}/.m2/settings-security.xml`),
148
+ deny(`${h}/.gradle/gradle.properties`),
149
+ // Scratch/caches every CLI + spawned tool needs.
150
+ rw(`${h}/.cache`), rw(`${h}/.npm`), rw(`${h}/.local/state`),
151
+ // The daemon-written botmux wrapper (head of PATH) + skill plugin dir.
152
+ ro(`${h}/.botmux/bin`), ro(`${h}/.botmux/claude-plugin`),
153
+ // Crown jewels — most are already unreachable via deny-by-default; these
154
+ // explicit denies guard the ones that could fall under an allowed tree
155
+ // (workingDir = $HOME, a broad user readOnly, …). Defence-in-depth.
156
+ deny(`${h}/.ssh`), deny(`${h}/.aws`), deny(`${h}/.azure`), deny(`${h}/.gnupg`),
157
+ deny(`${h}/.netrc`), deny(`${h}/.config/gh`), deny(`${h}/.config/glab-cli`),
158
+ deny(`${h}/.config/gcloud`), deny(`${h}/.config/op`), deny(`${h}/.config/1Password`),
159
+ deny(`${h}/.1password`), deny(`${h}/.password-store`), deny(`${h}/.git-credentials`),
160
+ deny(`${h}/.npmrc`), deny(`${h}/.pypirc`), deny(`${h}/.docker/config.json`), deny(`${h}/.kube`),
161
+ deny(`${h}/.lark-cli`),
162
+ ];
163
+ }
164
+ function darwinBaseline(h) {
165
+ const ro = (p) => ({ path: p, access: 'readOnly', source: 'baseline' });
166
+ const rw = (p) => ({ path: p, access: 'readWrite', source: 'baseline' });
167
+ const deny = (p) => ({ path: p, access: 'deny', source: 'baseline' });
168
+ return [
169
+ ...commonHomeBaseline(h),
170
+ // System: dyld/frameworks/toolchain — broad readOnly + surgical deny holes.
171
+ ro('/System'), ro('/usr'), ro('/bin'), ro('/sbin'), ro('/Library'), ro('/opt'),
172
+ ro('/private/etc'),
173
+ ro('/private/var/select'), // /var/select/sh
174
+ ro('/private/var/db/timezone'),
175
+ ro('/private/var/run'), // resolv.conf
176
+ deny('/Library/Keychains'),
177
+ // Scratch: macOS per-user TMPDIR root + tmp family + devices.
178
+ rw('/dev'), rw('/private/tmp'), rw('/private/var/tmp'), rw('/private/var/folders'),
179
+ // ~/Library: CLIs need broad read (fonts/prefs/frameworks caches) and write
180
+ // into Caches + Application Support — with the secret stores denied DEEPER
181
+ // (longest-prefix beats the rw grant).
182
+ ro(`${h}/Library`),
183
+ rw(`${h}/Library/Caches`),
184
+ rw(`${h}/Library/Application Support`),
185
+ rw(`${h}/Library/Logs`),
186
+ deny(`${h}/Library/Keychains`),
187
+ // lark-cli's key store holds EVERY bot's app-secret ciphertext + master key
188
+ // (the known pre-refactor leak — see design doc §2.4). Deny the dir; the
189
+ // bot's OWN send path uses send-cred.json in BOT_HOME, not this store.
190
+ deny(`${h}/Library/Application Support/lark-cli`),
191
+ ];
192
+ }
193
+ function linuxBaseline(h) {
194
+ const ro = (p) => ({ path: p, access: 'readOnly', source: 'baseline' });
195
+ const rw = (p) => ({ path: p, access: 'readWrite', source: 'baseline' });
196
+ return [
197
+ ...commonHomeBaseline(h),
198
+ // Toolchain + config. /bin,/lib*… on usrmerge distros are symlinks — the
199
+ // bwrap compiler replicates them (see CompileBwrapOpts.symlinks); on
200
+ // non-usrmerge hosts the worker passes them as existing dirs instead.
201
+ ro('/usr'), ro('/etc'), ro('/opt'),
202
+ // /run is a fresh tmpfs (compiler primitive); fnm/nvm farms under /run are
203
+ // re-exposed via ctx.execPaths. /tmp,/dev/shm,/var/tmp fresh tmpfs; /dev,
204
+ // /proc via bwrap primitives — all emitted by the compiler, not rules.
205
+ rw(`${h}/.cache`), rw(`${h}/.npm`),
206
+ ];
207
+ }
208
+ // ───────────────────────────── policy assembly ───────────────────────────────
209
+ /**
210
+ * Build the unified FsPolicy: baseline preset (platform) + adapter-declared
211
+ * paths + botmux-internal injections + user sandboxPaths (highest precedence).
212
+ * Pure — the worker canonicalizes and existence-filters all ctx paths first.
213
+ */
214
+ export function buildFsPolicy(ctx) {
215
+ const candidates = [];
216
+ const push = (paths, access, source) => {
217
+ for (const p of paths ?? [])
218
+ candidates.push({ path: p, access, source });
219
+ };
220
+ candidates.push(...(ctx.platform === 'darwin' ? darwinBaseline(ctx.homeDir) : linuxBaseline(ctx.homeDir)));
221
+ // Adapter-declared surfaces.
222
+ push(ctx.execPaths, 'readOnly', 'adapter');
223
+ push(ctx.authPaths, 'readWrite', 'adapter');
224
+ if (!ctx.redirectedCliData)
225
+ push(ctx.cliDataPaths, 'readWrite', 'adapter');
226
+ // botmux internals.
227
+ push([ctx.workingDir, ctx.botHome], 'readWrite', 'internal');
228
+ push(ctx.outbox ? [ctx.outbox] : [], 'readWrite', 'internal');
229
+ push(ctx.extraWritePaths, 'readWrite', 'internal');
230
+ push(ctx.readonlyRoots, 'readOnly', 'internal');
231
+ // Own routing metadata (`botmux send` reply routing) — read-only.
232
+ push([`${ctx.sessionDataDir}/sessions-${ctx.currentAppId}.json`], 'readOnly', 'internal');
233
+ // Own upload bucket — readWRITE: `botmux quoted` / downloadResources writes the
234
+ // downloaded attachment under attachments/<self>/<messageId>/… (not just reads
235
+ // pre-uploaded files). The worker mkdirs it pre-spawn so it survives the
236
+ // existence-filter and gets bound rw. Siblings' buckets stay uncovered.
237
+ push([`${ctx.sessionDataDir}/attachments/${ctx.currentAppId}`], 'readWrite', 'internal');
238
+ // Own per-bot lark-cli config (agent-facing lark-cli identity).
239
+ push([`${ctx.homeDir}/.lark-cli-bots/${ctx.currentAppId}`], 'readWrite', 'internal');
240
+ // ── botmux CLI runtime surface (deny-by-default ALLOW-LIST) ──
241
+ // The agent runs `botmux …` and claude fires SessionStart / AskUserQuestion
242
+ // hooks that exec `node <install>/dist/cli.js …`. They need the install dir +
243
+ // a SMALL set of ~/.botmux files. We do NOT expose ~/.botmux wholesale: it
244
+ // holds live credentials (config.json's voice accessKey/secretKey/apiKey, .env,
245
+ // data/webhook-master.key + webhook-secrets.json) and other bots' private
246
+ // content (data/schedules.json prompts+routing, sibling sessions/identities/
247
+ // send-creds, connectors/federations/…). A readOnly umbrella + deny-list is
248
+ // the fragile "expose-then-blocklist" pattern this refactor exists to kill —
249
+ // and it fails OPEN for files created after spawn. So allow-list ONLY what the
250
+ // CLI/hooks genuinely read; everything else (incl. future files + all creds)
251
+ // stays denied by construction. (Verified against codex review 2026-07-16.)
252
+ const bh = ctx.botmuxHome, sd = ctx.sessionDataDir, app = ctx.currentAppId;
253
+ push(ctx.botmuxInstallRoot ? [ctx.botmuxInstallRoot] : [], 'readOnly', 'internal');
254
+ push([
255
+ `${bh}/.data-dir`, // resolves DATA_DIR location
256
+ `${bh}/.dashboard-port`, // dashboard port (owner term-link; harmless port int)
257
+ `${bh}/bin`, // the daemon-written `botmux` wrapper (head of PATH)
258
+ `${bh}/claude-plugin`, // skill/plugin dir (claude --plugin-dir); no secrets
259
+ `${bh}/lark-scopes.json`, // static scope catalog
260
+ `${sd}/dashboard-daemons`, // per-bot {ipcPort, resolvedAllowedUsers} — hook IPC discovery (operational, not secret)
261
+ `${sd}/bots-info.json`, // bot display names / avatars for <available_bots> + recipient rendering
262
+ `${sd}/bot-openids-${app}.json`, // OWN routing cross-ref (sibling ones stay denied)
263
+ // own sessions-<self>.json + attachments/<self> already pushed above (readOnly)
264
+ ], 'readOnly', 'internal');
265
+ // turn-sends: the CLI APPENDS its OWN dedup marker to
266
+ // `turn-sends/<sessionId>.jsonl` (write, not read). Grant the SINGLE file, not
267
+ // the whole directory: a directory-wide readWrite let session A rewrite
268
+ // session B's `<B>.jsonl` marker (corrupting B's send-dedup → dropped/duplicate
269
+ // replies). The exact-file grant confines each session to its own marker. The
270
+ // worker PRE-CREATES this file before spawn so it survives the existence
271
+ // filter and bwrap can bind it (bwrap cannot bind a nonexistent source).
272
+ if (ctx.sessionId)
273
+ push([`${sd}/turn-sends/${ctx.sessionId}.jsonl`], 'readWrite', 'internal');
274
+ // schedules.json: `botmux schedule` is a READ-MODIFY-WRITE store shared by all
275
+ // bots (one file). It must be readWrite — a read-deny makes a sandboxed
276
+ // `botmux schedule` load an empty map and overwrite, wiping EVERY bot's tasks.
277
+ // This DOES expose other bots' task prompts+routing; accepted by the owner
278
+ // (王旭 2026-07-16) as the cost of the schedule feature — same call the old
279
+ // read-isolation made (schedules.json deliberately never denied).
280
+ push([`${sd}/schedules.json`], 'readWrite', 'internal');
281
+ // macOS lark-cli key store carve-out. The baseline DENIES the whole
282
+ // `~/Library/Application Support/lark-cli` dir (it holds EVERY bot's appsecret
283
+ // ciphertext + the master key — the pre-refactor cross-bot leak). But this bot
284
+ // needs its OWN appsecret + the master key to decrypt it and authenticate
285
+ // (verified: without these `lark-cli auth scopes` fails "keychain Get failed …
286
+ // operation not permitted"). Re-allow ONLY those two, read-only, at a DEEPER
287
+ // path than the deny so longest-prefix-wins. Siblings' `appsecret_*.enc` and
288
+ // user tokens stay denied → the master key alone can't decrypt what it can't
289
+ // read (verified: sibling ciphertext still DENIED). Linux keeps its keys in the
290
+ // per-bot `.lark-cli-bots/<self>` dir (already readWrite above), so this is
291
+ // darwin-only.
292
+ if (ctx.platform === 'darwin') {
293
+ const larkStore = `${ctx.homeDir}/Library/Application Support/lark-cli`;
294
+ push([`${larkStore}/master.key.file`, `${larkStore}/appsecret_${ctx.currentAppId}.enc`], 'readOnly', 'internal');
295
+ }
296
+ // User config — highest precedence.
297
+ push(ctx.userPaths?.readWrite, 'readWrite', 'user');
298
+ push(ctx.userPaths?.readOnly, 'readOnly', 'user');
299
+ push(ctx.userPaths?.deny, 'deny', 'user');
300
+ push(ctx.mandatoryDenyPaths, 'deny', 'mandatory');
301
+ push(ctx.mandatoryReadOnlyPaths, 'readOnly', 'mandatory');
302
+ return {
303
+ rules: mergeFsRules(candidates),
304
+ net: ctx.net !== false,
305
+ writeRegexes: [...(ctx.writeRegexes ?? [])],
306
+ denyRegexes: [...(ctx.mandatoryDenyRegexes ?? [])],
307
+ finalReadOnlyPaths: [...(ctx.mandatoryReadOnlyPaths ?? [])],
308
+ };
309
+ }
310
+ // ───────────────────────────── Seatbelt compiler ─────────────────────────────
311
+ function escSb(p) {
312
+ return p.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
313
+ }
314
+ function escSbRegex(r) {
315
+ return r.replace(/"/g, '.'); // a `"` would terminate the #"…" literal
316
+ }
317
+ /** Every strict ancestor of every non-deny rule path. Under read-deny-default,
318
+ * realpath()/stat of an intermediate dir fails and crashes CLIs that
319
+ * canonicalize their config dir — so each ancestor needs file-read-metadata
320
+ * (literal, NOT subpath: no listing/enumeration is granted). */
321
+ export function ancestorsNeedingTraverse(rules) {
322
+ const out = new Set();
323
+ for (const r of rules) {
324
+ if (r.access === 'deny')
325
+ continue;
326
+ let p = r.path;
327
+ for (;;) {
328
+ const parent = p === '/' ? null : p.slice(0, p.lastIndexOf('/')) || '/';
329
+ if (!parent)
330
+ break;
331
+ out.add(parent);
332
+ if (parent === '/')
333
+ break;
334
+ p = parent;
335
+ }
336
+ }
337
+ return [...out].sort((a, b) => pathDepth(a) - pathDepth(b) || (a < b ? -1 : 1));
338
+ }
339
+ /** Apple's stock base profile — sets up the process-bootstrap file reads
340
+ * (dyld shared cache, sysctl-backed system paths, mach services) that a raw
341
+ * `(deny file-read* (subpath "/"))` would block, aborting the process before
342
+ * main(). Empirically required: with a blanket read-deny even `/usr/bin/true`
343
+ * SIGABRTs at dyld; importing this base fixes bootstrap WITHOUT opening the
344
+ * disk (verified: /etc/hosts and $HOME stay denied under it). */
345
+ const SEATBELT_BASE_PROFILE = '/System/Library/Sandbox/Profiles/bsd.sb';
346
+ /**
347
+ * Compile the policy to a macOS Seatbelt profile. `(deny default)` + Apple's
348
+ * bsd.sb base makes it deny-by-default for BOTH files and other operations,
349
+ * then we re-allow the non-file operation classes the CLI needs (process/mach/
350
+ * ipc/sysctl/signal, network gated on policy.net) and the three file tiers
351
+ * emitted shallow→deep (Seatbelt applies the LAST matching rule → deepest rule
352
+ * wins, matching accessForPath()).
353
+ */
354
+ export function compileToSeatbelt(policy) {
355
+ const lines = [
356
+ '(version 1)',
357
+ '(deny default)',
358
+ `(import "${SEATBELT_BASE_PROFILE}")`,
359
+ // Non-file operation classes. `(allow default)` used to grant these wholesale;
360
+ // under `(deny default)` we re-grant exactly what a CLI + its subprocesses need.
361
+ '(allow process*)',
362
+ '(allow signal)',
363
+ '(allow mach*)',
364
+ '(allow ipc*)',
365
+ '(allow sysctl*)',
366
+ '(allow file-ioctl)',
367
+ ...(policy.net ? ['(allow network*)', '(allow system-socket)'] : []),
368
+ ];
369
+ for (const r of policy.rules) {
370
+ const p = escSb(r.path);
371
+ if (r.access === 'deny') {
372
+ lines.push(`(deny file-read* (subpath "${p}"))`);
373
+ lines.push(`(deny file-write* (subpath "${p}"))`);
374
+ }
375
+ else {
376
+ lines.push(`(allow file-read* (subpath "${p}"))`);
377
+ if (r.access === 'readWrite')
378
+ lines.push(`(allow file-write* (subpath "${p}"))`);
379
+ else
380
+ lines.push(`(deny file-write* (subpath "${p}"))`); // re-assert: deeper ro inside a rw tree must drop write
381
+ }
382
+ }
383
+ // Traversal metadata for ancestors of every allowed path — emitted AFTER the
384
+ // rules so a broad deny cannot clobber the narrow literal grants a nested
385
+ // allow needs (deny ~/x + readWrite ~/x/y: realpath must stat ~/x). Literal
386
+ // (not subpath): grants stat/readlink of the dir itself, never listing.
387
+ for (const p of ancestorsNeedingTraverse(policy.rules)) {
388
+ lines.push(`(allow file-read-metadata (literal "${escSb(p)}"))`);
389
+ }
390
+ for (const re of policy.writeRegexes) {
391
+ lines.push(`(allow file-write* (regex #"${escSbRegex(re)}"))`);
392
+ }
393
+ for (const re of policy.denyRegexes ?? []) {
394
+ lines.push(`(deny file-read* (regex #"${escSbRegex(re)}"))`);
395
+ lines.push(`(deny file-write* (regex #"${escSbRegex(re)}"))`);
396
+ }
397
+ for (const path of policy.finalReadOnlyPaths ?? []) {
398
+ lines.push(`(allow file-read* (subpath "${escSb(path)}"))`);
399
+ lines.push(`(deny file-write* (subpath "${escSb(path)}"))`);
400
+ }
401
+ return lines.join('\n') + '\n';
402
+ }
403
+ /**
404
+ * Compile the policy to a bwrap argv prefix. Deny-by-default is bwrap's
405
+ * natural shape: a fresh tmpfs root, then ONLY the rule paths are bound in
406
+ * (later mounts win → emitting shallow→deep gives deepest-rule-wins, matching
407
+ * accessForPath()). deny rules materialize as READ-ONLY, UNREADABLE empty
408
+ * masks (mode-000 empty-dir ro-bind for dirs, mode-000 empty-file ro-bind for
409
+ * files) and are emitted whenever they sit under an exposed tree — outside it
410
+ * they're unreachable already (deny-by-default), and bwrap would fail mounting
411
+ * onto a void path.
412
+ *
413
+ * Two properties this must preserve (both cost real blockers in review):
414
+ * 1. The mask is `--ro-bind` of an EMPTY source, NOT `--tmpfs`: a `--tmpfs
415
+ * <deny>` mount is WRITABLE inside the sandbox, so it hid the real contents
416
+ * but still let the CLI write into the denied path — not a real deny.
417
+ * 2. A deny path is masked EVEN WHEN IT DOES NOT EXIST YET. Skipping absent
418
+ * denies left the path inside the read-write parent bind, so the sandbox
419
+ * could `mkdir`+write it straight onto the host, and anything the host
420
+ * created there mid-session became readable (a stat→exec TOCTOU). The
421
+ * worker pre-creates the mountpoint on the host so the mask always binds.
422
+ */
423
+ export function compileToBwrap(policy, opts) {
424
+ const a = [];
425
+ const emptyFiles = [];
426
+ const maskMounts = [];
427
+ a.push('--tmpfs', '/');
428
+ a.push('--proc', '/proc', '--dev', '/dev');
429
+ a.push('--tmpfs', '/tmp', '--tmpfs', '/run', '--tmpfs', '/var/tmp', '--tmpfs', '/dev/shm');
430
+ for (const s of opts.symlinks ?? [])
431
+ a.push('--symlink', s.target, s.path);
432
+ const exposed = []; // non-deny paths emitted so far (for deny reachability)
433
+ const remountRo = []; // deny tmpfs masks to re-seal read-only after nested binds
434
+ let emptyIdx = 0;
435
+ for (const r of policy.rules) {
436
+ if (r.access === 'deny') {
437
+ if (!exposed.some(e => coversPath(e, r.path)))
438
+ continue; // unreachable → already denied by default
439
+ // Does a DEEPER allow (white-in-black carve-out) live under this deny?
440
+ // e.g. readWrite /proj → deny /proj/x → readWrite /proj/x/self. If so the
441
+ // mask must be able to HOST a child submount — a mode-000 read-only bind
442
+ // can't (bwrap: "Can't mkdir …/self: Read-only file system"). Use a fresh
443
+ // `--tmpfs` mask (hides the real contents, accepts the nested bind) and
444
+ // re-seal it read-only with `--remount-ro` AFTER the nested binds are
445
+ // emitted. tmpfs writes are in-memory and NEVER touch the host; the mask
446
+ // is listable only for the carve-out's own path (inherent to white-in-black).
447
+ const hasNestedAllow = policy.rules.some(o => o.access !== 'deny' && o.path !== r.path && coversPath(r.path, o.path));
448
+ // A deny is REDUNDANT only when the NEAREST enclosing rule is ALSO a deny:
449
+ // then this path is already masked by that ancestor and emitting a deeper
450
+ // mask would (a) add nothing and (b) fail to mount onto the ancestor's
451
+ // mode-000 read-only mask. Redundancy MUST be judged by the deepest strict
452
+ // ancestor rule — NOT "any ancestor deny exists" — because an allow can
453
+ // re-expose the tree between the two denies (deny /outer → allow
454
+ // /outer/self → deny /outer/self/secret): there the nearest ancestor of
455
+ // `secret` is the `self` ALLOW, so `secret` is a real leaf deny that MUST
456
+ // be masked (skipping it leaks the secret). Find the deepest exposed strict
457
+ // ancestor and skip only when it denies.
458
+ let nearestAncestor;
459
+ for (const o of policy.rules) {
460
+ if (o.path === r.path || !coversPath(o.path, r.path))
461
+ continue; // strict ancestor only
462
+ if (o.access !== 'deny' && !exposed.includes(o.path))
463
+ continue; // allow ancestor must be emitted to count
464
+ if (o.access === 'deny' && !exposed.some(e => coversPath(e, o.path)))
465
+ continue; // deny ancestor must be reachable
466
+ if (!nearestAncestor || pathDepth(o.path) > pathDepth(nearestAncestor.path))
467
+ nearestAncestor = o;
468
+ }
469
+ const shadowedByDeny = !hasNestedAllow && nearestAncestor?.access === 'deny';
470
+ if (shadowedByDeny)
471
+ continue;
472
+ if (hasNestedAllow) {
473
+ a.push('--tmpfs', r.path);
474
+ remountRo.push(r.path);
475
+ maskMounts.push({ path: r.path, kind: 'dir' });
476
+ }
477
+ else if (opts.filePaths?.has(r.path)) {
478
+ // FILE-shaped leaf deny: ro-bind a mode-000 empty placeholder file
479
+ // (unreadable + read-only).
480
+ const empty = `${opts.emptiesDir}/mask-${emptyIdx++}`;
481
+ emptyFiles.push({ path: empty, maskedPath: r.path });
482
+ a.push('--ro-bind', empty, r.path);
483
+ maskMounts.push({ path: r.path, kind: 'file' });
484
+ }
485
+ else {
486
+ // DIRECTORY-shaped leaf deny (existing dir OR not-yet-existing path):
487
+ // ro-bind the shared mode-000 empty dir → contents hidden, mount
488
+ // read-only, and the mask itself unreadable (a real deny, not a
489
+ // writable/listable tmpfs).
490
+ a.push('--ro-bind', opts.emptyDir, r.path);
491
+ maskMounts.push({ path: r.path, kind: 'dir' });
492
+ }
493
+ continue;
494
+ }
495
+ a.push(r.access === 'readWrite' ? '--bind' : '--ro-bind', r.path, r.path);
496
+ exposed.push(r.path);
497
+ }
498
+ // Re-seal white-in-black deny masks read-only AFTER their nested carve-out
499
+ // binds were emitted (a --remount-ro before the child bind would block the
500
+ // mkdir; after it, the child submount keeps its own writability while the
501
+ // tmpfs parent becomes unwritable).
502
+ for (const p of remountRo)
503
+ a.push('--remount-ro', p);
504
+ a.push('--unshare-user', '--unshare-pid', '--unshare-ipc', '--unshare-uts', '--unshare-cgroup-try');
505
+ if (!policy.net)
506
+ a.push('--unshare-net');
507
+ a.push('--die-with-parent', '--new-session', '--chdir', opts.chdir);
508
+ return { args: a, emptyFiles, maskMounts };
509
+ }
510
+ /**
511
+ * old→new field mapping (lossless: the old fields' expressiveness is a subset
512
+ * of the three-tier model). Used by the registry's load-time auto-migration,
513
+ * which writes the NEW fields while KEEPING the old ones in bots.json — a
514
+ * downgraded daemon reads the untouched old fields, so downgrade needs no
515
+ * reverse script (design doc §6.2). Returns null when nothing to migrate.
516
+ */
517
+ export function migrateLegacySandboxFields(entry) {
518
+ if (entry.sandboxPaths !== undefined)
519
+ return null; // already on the new model
520
+ const hasLegacy = entry.readIsolation === true
521
+ || (entry.sandboxReadonlyPaths?.length ?? 0) > 0
522
+ || (entry.sandboxHidePaths?.length ?? 0) > 0
523
+ || (entry.readDenyExtraPaths?.length ?? 0) > 0;
524
+ const sandbox = entry.sandbox === true || entry.readIsolation === true;
525
+ if (!hasLegacy)
526
+ return null; // plain `sandbox: true` needs no path migration
527
+ const readOnly = [...(entry.sandboxReadonlyPaths ?? [])];
528
+ const deny = [...(entry.sandboxHidePaths ?? []), ...(entry.readDenyExtraPaths ?? [])];
529
+ const sandboxPaths = {};
530
+ if (readOnly.length)
531
+ sandboxPaths.readOnly = readOnly;
532
+ if (deny.length)
533
+ sandboxPaths.deny = [...new Set(deny)];
534
+ return {
535
+ sandbox,
536
+ ...(readOnly.length || deny.length ? { sandboxPaths } : {}),
537
+ };
538
+ }
539
+ //# sourceMappingURL=fs-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-policy.js","sourceRoot":"","sources":["../../../src/adapters/cli/fs-policy.ts"],"names":[],"mappings":"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"}