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
|
@@ -30,6 +30,11 @@ export declare function botDefaultsPayload(bot: DashboardBotDescriptor, j?: any,
|
|
|
30
30
|
autoboundChatCount: any;
|
|
31
31
|
brandLabel: any;
|
|
32
32
|
sandbox: boolean;
|
|
33
|
+
sandboxPaths: {
|
|
34
|
+
readWrite: any;
|
|
35
|
+
readOnly: any;
|
|
36
|
+
deny: any;
|
|
37
|
+
} | null;
|
|
33
38
|
readIsolation: boolean;
|
|
34
39
|
readIsolationSupported: boolean;
|
|
35
40
|
backendType: any;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bot-payload.d.ts","sourceRoot":"","sources":["../../src/dashboard/bot-payload.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,sBAAsB;;;;;EAO5D;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,sBAAsB,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,MAAM
|
|
1
|
+
{"version":3,"file":"bot-payload.d.ts","sourceRoot":"","sources":["../../src/dashboard/bot-payload.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,sBAAsB;;;;;EAO5D;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,sBAAsB,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuEtF"}
|
|
@@ -35,6 +35,13 @@ export function botDefaultsPayload(bot, j, error) {
|
|
|
35
35
|
autoboundChatCount: j?.autoboundChatCount ?? 0,
|
|
36
36
|
brandLabel: j?.brandLabel ?? null,
|
|
37
37
|
sandbox: j?.sandbox === true,
|
|
38
|
+
sandboxPaths: (j?.sandboxPaths && typeof j.sandboxPaths === 'object' && !Array.isArray(j.sandboxPaths))
|
|
39
|
+
? {
|
|
40
|
+
readWrite: Array.isArray(j.sandboxPaths.readWrite) ? j.sandboxPaths.readWrite.filter((x) => typeof x === 'string') : [],
|
|
41
|
+
readOnly: Array.isArray(j.sandboxPaths.readOnly) ? j.sandboxPaths.readOnly.filter((x) => typeof x === 'string') : [],
|
|
42
|
+
deny: Array.isArray(j.sandboxPaths.deny) ? j.sandboxPaths.deny.filter((x) => typeof x === 'string') : [],
|
|
43
|
+
}
|
|
44
|
+
: null,
|
|
38
45
|
readIsolation: j?.readIsolation === true,
|
|
39
46
|
readIsolationSupported: j?.readIsolationSupported === true,
|
|
40
47
|
backendType: typeof j?.backendType === 'string' ? j.backendType : null,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bot-payload.js","sourceRoot":"","sources":["../../src/dashboard/bot-payload.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bot-payload.js","sourceRoot":"","sources":["../../src/dashboard/bot-payload.ts"],"names":[],"mappings":"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"}
|
|
@@ -38,6 +38,22 @@ export declare function BotAgentSection(props: {
|
|
|
38
38
|
cliState: CliOptionsState;
|
|
39
39
|
patchBot: PatchBot;
|
|
40
40
|
}): import("react").JSX.Element;
|
|
41
|
+
type SandboxTier = 'readWrite' | 'readOnly' | 'deny';
|
|
42
|
+
type SandboxTiers = {
|
|
43
|
+
readWrite: string[];
|
|
44
|
+
readOnly: string[];
|
|
45
|
+
deny: string[];
|
|
46
|
+
};
|
|
47
|
+
/** Effective access for `path` under the three tiers: DEEPEST (longest-prefix)
|
|
48
|
+
* matching rule wins; at equal depth (same path across tiers) the MORE
|
|
49
|
+
* RESTRICTIVE tier wins — mirrors fs-policy.ts accessForPath + mergeFsRules so
|
|
50
|
+
* the UI's live labels + path tester agree with what the sandbox enforces.
|
|
51
|
+
* `home` expands a leading `~` the same way the worker does before matching, so
|
|
52
|
+
* recommendation entries like `~/.claude` line up with absolute tree nodes. */
|
|
53
|
+
export declare function effectiveAccess(tiers: SandboxTiers, path: string, home: string): {
|
|
54
|
+
access: SandboxTier | 'none';
|
|
55
|
+
rule?: string;
|
|
56
|
+
};
|
|
41
57
|
export declare function CodexAppDisplaySection(props: {
|
|
42
58
|
bot: BotDefaultsRow;
|
|
43
59
|
putCardPref(patch: CardPrefPatch): Promise<JsonResponse>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bot-defaults-page.d.ts","sourceRoot":"","sources":["../../../src/dashboard/web/bot-defaults-page.tsx"],"names":[],"mappings":"AAEA,OAAO,EAYL,KAAK,cAAc,EAEnB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,0BAA0B,EAChC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAerE,KAAK,QAAQ,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,cAAc,KAAK,cAAc,CAAC,KAAK,IAAI,CAAC;AACpH,KAAK,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC,CAAC;AAEtD,KAAK,YAAY,GAAG;IAClB,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,GAAG,CAAC;CACX,CAAC;AAyIF,KAAK,uBAAuB,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEzE,KAAK,qBAAqB,GAAG;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,uBAAuB,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,mBAAmB,CAAC;IAC/B,eAAe,CAAC,EAAE,uBAAuB,CAAC;IAC1C,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE;QACX,EAAE,EAAE,OAAO,CAAC;QACZ,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,0BAA0B,CAAC,QAAQ,CAAC,CAAC;KAC/C,CAAC;CACH,CAAC;AAiBF;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,IAAI,CAAC,qBAAqB,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,WAAW,GAAG,iBAAiB,CAAC,GACjG,mBAAmB,GAAG,IAAI,CAc5B;AAqCD,wBAAgB,eAAe,gCAsK9B;
|
|
1
|
+
{"version":3,"file":"bot-defaults-page.d.ts","sourceRoot":"","sources":["../../../src/dashboard/web/bot-defaults-page.tsx"],"names":[],"mappings":"AAEA,OAAO,EAYL,KAAK,cAAc,EAEnB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,0BAA0B,EAChC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAerE,KAAK,QAAQ,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,cAAc,KAAK,cAAc,CAAC,KAAK,IAAI,CAAC;AACpH,KAAK,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC,CAAC;AAEtD,KAAK,YAAY,GAAG;IAClB,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,GAAG,CAAC;CACX,CAAC;AAyIF,KAAK,uBAAuB,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEzE,KAAK,qBAAqB,GAAG;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,uBAAuB,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,mBAAmB,CAAC;IAC/B,eAAe,CAAC,EAAE,uBAAuB,CAAC;IAC1C,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE;QACX,EAAE,EAAE,OAAO,CAAC;QACZ,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,0BAA0B,CAAC,QAAQ,CAAC,CAAC;KAC/C,CAAC;CACH,CAAC;AAiBF;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,IAAI,CAAC,qBAAqB,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,WAAW,GAAG,iBAAiB,CAAC,GACjG,mBAAmB,GAAG,IAAI,CAc5B;AAqCD,wBAAgB,eAAe,gCAsK9B;AAkfD,wBAAgB,eAAe,CAAC,KAAK,EAAE;IACrC,GAAG,EAAE,cAAc,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,eAAe,CAAC;IAC1B,QAAQ,EAAE,QAAQ,CAAC;CACpB,+BAkOA;AAkPD,KAAK,WAAW,GAAG,WAAW,GAAG,UAAU,GAAG,MAAM,CAAC;AACrD,KAAK,YAAY,GAAG;IAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAMhF;;;;;gFAKgF;AAChF,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,WAAW,GAAG,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAsBhI;AAskBD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE;IAAE,GAAG,EAAE,cAAc,CAAC;IAAC,WAAW,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;CAAE,+BA8C9H;AAmrCD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,WAAW,GAAG,YAAY,CAErE"}
|
|
@@ -273,7 +273,7 @@ function BotDefaultsCard(props) {
|
|
|
273
273
|
return (_jsxs("article", { className: "bd-card bd-profile", "data-appid": bot.larkAppId, children: [_jsxs("header", { className: "bd-profile-head", children: [_jsx(Html, { html: botAvatarHtml({ name, larkAppId: bot.larkAppId }) }), _jsxs("div", { className: "bd-profile-id", children: [_jsx("strong", { children: name }), _jsx("code", { children: bot.larkAppId })] })] }), _jsxs("p", { className: "hint-warn-inline", children: ["\u67E5\u8BE2\u5931\u8D25\uFF1A", bot.error] })] }));
|
|
274
274
|
}
|
|
275
275
|
const def = bot.defaultOncall ?? { enabled: false, workingDir: '', since: 0 };
|
|
276
|
-
return (_jsxs("article", { className: "bd-card bd-profile", "data-appid": bot.larkAppId, children: [_jsxs("header", { className: "bd-profile-head", children: [_jsx(BotAvatarControl, { bot: bot, name: name, patchBot: patchBot }), _jsx("div", { className: "bd-profile-main", children: _jsx(BotProfileIdentity, { bot: bot, cli: cli, patchBot: patchBot, meta: (_jsxs(_Fragment, { children: [_jsxs("small", { className: "bd-meta-ok", children: ["\u25CF ", tr('botDefaults.metaOnline')] }), _jsxs("small", { "data-oncall-since": true, children: [tr('botDefaults.lastEnabled'), ": ", fmtSince(def.since ?? 0)] }), _jsx("small", { children: tr('botDefaults.autobound', { count: bot.autoboundChatCount ?? 0 }) })] })) }) })] }), _jsxs("div", { className: "bd-body bd-grid", children: [_jsxs("div", { className: "bd-column", children: [_jsxs("section", { className: "bd-tile", children: [_jsx(BotAgentSection, { bot: bot, sessionFallback: cli, cliState: cliState, patchBot: patchBot }), _jsx(WorkingDirSection, { bot: bot, patchBot: patchBot, putCardPref: putCardPref }), bot.cliId !== 'riff' && _jsx(SandboxSection, { bot: bot, patchBot: patchBot }), bot.cliId !== 'riff' && _jsx(BackendTypeSection, { bot: bot, patchBot: patchBot })] }), _jsx("section", { className: "bd-tile", children: _jsx(RuntimeEnvironmentSection, { bot: bot, patchBot: patchBot }) }), _jsx("section", { className: "bd-tile", children: _jsx(GrantSection, { bot: bot, patchBot: patchBot }) })] }), _jsxs("div", { className: "bd-column", children: [_jsxs("section", { className: "bd-tile", children: [_jsx(SessionModeSection, { bot: bot, patchBot: patchBot, putCardPref: putCardPref }), _jsx(SubstituteModeSection, { bot: bot, patchBot: patchBot }), _jsx(CrossBotSection, { bot: bot, putCardPref: putCardPref }), _jsx(SessionCapSection, { bot: bot, patchBot: patchBot })] }), _jsxs("section", { className: "bd-tile", children: [_jsx(CardBehaviorSection, { bot: bot, putCardPref: putCardPref }), _jsx(CodexAppDisplaySection, { bot: bot, putCardPref: putCardPref }), _jsx(SummaryTriggerSection, { bot: bot, patchBot: patchBot }), _jsx(BrandSection, { bot: bot, patchBot: patchBot })] }), _jsx("section", { className: "bd-tile", children: _jsx(RoleSection, { bot: bot, patchBot: patchBot }) })] })] })] }));
|
|
276
|
+
return (_jsxs("article", { className: "bd-card bd-profile", "data-appid": bot.larkAppId, children: [_jsxs("header", { className: "bd-profile-head", children: [_jsx(BotAvatarControl, { bot: bot, name: name, patchBot: patchBot }), _jsx("div", { className: "bd-profile-main", children: _jsx(BotProfileIdentity, { bot: bot, cli: cli, patchBot: patchBot, meta: (_jsxs(_Fragment, { children: [_jsxs("small", { className: "bd-meta-ok", children: ["\u25CF ", tr('botDefaults.metaOnline')] }), _jsxs("small", { "data-oncall-since": true, children: [tr('botDefaults.lastEnabled'), ": ", fmtSince(def.since ?? 0)] }), _jsx("small", { children: tr('botDefaults.autobound', { count: bot.autoboundChatCount ?? 0 }) })] })) }) })] }), _jsxs("div", { className: "bd-body bd-grid", children: [_jsxs("div", { className: "bd-column", children: [_jsxs("section", { className: "bd-tile", children: [_jsx(BotAgentSection, { bot: bot, sessionFallback: cli, cliState: cliState, patchBot: patchBot }), _jsx(WorkingDirSection, { bot: bot, patchBot: patchBot, putCardPref: putCardPref }), bot.cliId !== 'riff' && _jsx(SandboxSection, { bot: bot, patchBot: patchBot }), bot.cliId !== 'riff' && bot.sandbox === true && _jsx(SandboxPathsSection, { bot: bot, patchBot: patchBot }), bot.cliId !== 'riff' && _jsx(BackendTypeSection, { bot: bot, patchBot: patchBot })] }), _jsx("section", { className: "bd-tile", children: _jsx(RuntimeEnvironmentSection, { bot: bot, patchBot: patchBot }) }), _jsx("section", { className: "bd-tile", children: _jsx(GrantSection, { bot: bot, patchBot: patchBot }) })] }), _jsxs("div", { className: "bd-column", children: [_jsxs("section", { className: "bd-tile", children: [_jsx(SessionModeSection, { bot: bot, patchBot: patchBot, putCardPref: putCardPref }), _jsx(SubstituteModeSection, { bot: bot, patchBot: patchBot }), _jsx(CrossBotSection, { bot: bot, putCardPref: putCardPref }), _jsx(SessionCapSection, { bot: bot, patchBot: patchBot })] }), _jsxs("section", { className: "bd-tile", children: [_jsx(CardBehaviorSection, { bot: bot, putCardPref: putCardPref }), _jsx(CodexAppDisplaySection, { bot: bot, putCardPref: putCardPref }), _jsx(SummaryTriggerSection, { bot: bot, patchBot: patchBot }), _jsx(BrandSection, { bot: bot, patchBot: patchBot })] }), _jsx("section", { className: "bd-tile", children: _jsx(RoleSection, { bot: bot, patchBot: patchBot }) })] })] })] }));
|
|
277
277
|
}
|
|
278
278
|
function RuntimeEnvironmentSection(props) {
|
|
279
279
|
const tr = useT();
|
|
@@ -833,14 +833,233 @@ function SandboxSection(props) {
|
|
|
833
833
|
setBusy(false);
|
|
834
834
|
}
|
|
835
835
|
}
|
|
836
|
-
//
|
|
837
|
-
//
|
|
838
|
-
//
|
|
839
|
-
// (
|
|
840
|
-
//
|
|
836
|
+
// The unified fs-policy always provides deny-by-default file read/write
|
|
837
|
+
// isolation. This capability line is narrower: whether the CLI's global data
|
|
838
|
+
// root can additionally be redirected into this bot's private BOT_HOME
|
|
839
|
+
// (claude/codex, no wrapper), keeping CLI credentials/config/history separate
|
|
840
|
+
// from sibling bots. Keep that distinction explicit in the UI copy.
|
|
841
841
|
const readIsoSupported = bot.readIsolationSupported === true;
|
|
842
842
|
return (_jsxs("section", { className: "bd-section", children: [_jsx("h3", { className: "bd-section-title", children: tr('botDefaults.sectionSandbox') }), _jsx(ToggleRow, { checked: enabled, disabled: busy, dataAction: "toggle-sandbox", title: tr('botDefaults.sandboxToggle'), help: tr('botDefaults.sandboxHelp'), onChange: checked => void toggle(checked) }), _jsx("p", { className: "bd-section-note", "data-read-iso-capability": readIsoSupported ? 'yes' : 'no', children: readIsoSupported ? `+ ${tr('botDefaults.sandboxReadIsoOn')}` : tr('botDefaults.sandboxReadIsoOff') }), _jsx("div", { className: "actions", children: _jsx(StatusSpan, { status: status, attr: { 'data-sandbox-status': '' } }) })] }));
|
|
843
843
|
}
|
|
844
|
+
/** Restrictiveness ranking — mirrors fs-policy.ts RESTRICTIVENESS so a same-path
|
|
845
|
+
* cross-tier conflict resolves the SAME way the sandbox will (deny > ro > rw). */
|
|
846
|
+
const SBX_RESTRICTIVENESS = { readWrite: 0, readOnly: 1, deny: 2 };
|
|
847
|
+
/** Effective access for `path` under the three tiers: DEEPEST (longest-prefix)
|
|
848
|
+
* matching rule wins; at equal depth (same path across tiers) the MORE
|
|
849
|
+
* RESTRICTIVE tier wins — mirrors fs-policy.ts accessForPath + mergeFsRules so
|
|
850
|
+
* the UI's live labels + path tester agree with what the sandbox enforces.
|
|
851
|
+
* `home` expands a leading `~` the same way the worker does before matching, so
|
|
852
|
+
* recommendation entries like `~/.claude` line up with absolute tree nodes. */
|
|
853
|
+
export function effectiveAccess(tiers, path, home) {
|
|
854
|
+
const expand = (p) => (p === '~' || p.startsWith('~/')) ? home.replace(/\/+$/, '') + p.slice(1) : p;
|
|
855
|
+
const norm = (p) => expand(p).replace(/\/+$/, '') || '/';
|
|
856
|
+
const target = norm(path);
|
|
857
|
+
const covers = (parent, child) => {
|
|
858
|
+
const a = norm(parent), b = norm(child);
|
|
859
|
+
return a === b || b.startsWith(a === '/' ? '/' : a + '/');
|
|
860
|
+
};
|
|
861
|
+
const depth = (p) => norm(p) === '/' ? 0 : norm(p).split('/').filter(Boolean).length;
|
|
862
|
+
let best;
|
|
863
|
+
const consider = (access, rule) => {
|
|
864
|
+
if (!covers(rule, target))
|
|
865
|
+
return;
|
|
866
|
+
const d = depth(rule);
|
|
867
|
+
if (!best || d > best.ruleDepth
|
|
868
|
+
|| (d === best.ruleDepth && SBX_RESTRICTIVENESS[access] > SBX_RESTRICTIVENESS[best.access])) {
|
|
869
|
+
best = { access, ruleDepth: d, rule };
|
|
870
|
+
}
|
|
871
|
+
};
|
|
872
|
+
for (const p of tiers.readWrite)
|
|
873
|
+
consider('readWrite', p);
|
|
874
|
+
for (const p of tiers.readOnly)
|
|
875
|
+
consider('readOnly', p);
|
|
876
|
+
for (const p of tiers.deny)
|
|
877
|
+
consider('deny', p);
|
|
878
|
+
return best ? { access: best.access, rule: best.rule } : { access: 'none' };
|
|
879
|
+
}
|
|
880
|
+
/** Per-CLI recommended sandbox paths — the "Claude recommends adding ~/.claude"
|
|
881
|
+
* one-click starters. Keyed by cliId family; falls back to a generic set. */
|
|
882
|
+
function recommendedTiers(cliId) {
|
|
883
|
+
const id = (cliId ?? '').toLowerCase();
|
|
884
|
+
if (id.includes('claude')) {
|
|
885
|
+
return { labelKey: 'botDefaults.sbxPathsRecommendClaude', tiers: { readWrite: [], readOnly: ['~/.claude'], deny: [] } };
|
|
886
|
+
}
|
|
887
|
+
if (id.includes('codex')) {
|
|
888
|
+
return { labelKey: 'botDefaults.sbxPathsRecommendCodex', tiers: { readWrite: [], readOnly: ['~/.codex'], deny: [] } };
|
|
889
|
+
}
|
|
890
|
+
if (id.includes('gemini')) {
|
|
891
|
+
return { labelKey: 'botDefaults.sbxPathsRecommendGemini', tiers: { readWrite: [], readOnly: ['~/.gemini'], deny: [] } };
|
|
892
|
+
}
|
|
893
|
+
return { labelKey: 'botDefaults.sbxPathsRecommendGeneric', tiers: { readWrite: [], readOnly: [], deny: [] } };
|
|
894
|
+
}
|
|
895
|
+
function emptyTiers() { return { readWrite: [], readOnly: [], deny: [] }; }
|
|
896
|
+
function normTiers(t) {
|
|
897
|
+
if (!t)
|
|
898
|
+
return emptyTiers();
|
|
899
|
+
return { readWrite: [...(t.readWrite ?? [])], readOnly: [...(t.readOnly ?? [])], deny: [...(t.deny ?? [])] };
|
|
900
|
+
}
|
|
901
|
+
function tiersEqual(a, b) {
|
|
902
|
+
const k = (x) => [...x].sort().join('\n');
|
|
903
|
+
return k(a.readWrite) === k(b.readWrite) && k(a.readOnly) === k(b.readOnly) && k(a.deny) === k(b.deny);
|
|
904
|
+
}
|
|
905
|
+
/** Serialize tiers to the copy-paste text form (one path per line, tier-tagged). */
|
|
906
|
+
function tiersToText(t) {
|
|
907
|
+
const lines = [];
|
|
908
|
+
for (const p of t.readWrite)
|
|
909
|
+
lines.push(`rw ${p}`);
|
|
910
|
+
for (const p of t.readOnly)
|
|
911
|
+
lines.push(`ro ${p}`);
|
|
912
|
+
for (const p of t.deny)
|
|
913
|
+
lines.push(`deny ${p}`);
|
|
914
|
+
return lines.join('\n');
|
|
915
|
+
}
|
|
916
|
+
/** Parse the copy-paste text form back into tiers. Tolerates `rw`/`readWrite`,
|
|
917
|
+
* `ro`/`readOnly`, `deny`/`-`; blank lines and `#` comments are ignored. */
|
|
918
|
+
function textToTiers(text) {
|
|
919
|
+
const t = emptyTiers();
|
|
920
|
+
for (const raw of text.split('\n')) {
|
|
921
|
+
const line = raw.trim();
|
|
922
|
+
if (!line || line.startsWith('#'))
|
|
923
|
+
continue;
|
|
924
|
+
const m = /^(\S+)\s+(.+)$/.exec(line);
|
|
925
|
+
if (!m)
|
|
926
|
+
continue;
|
|
927
|
+
const tag = m[1].toLowerCase();
|
|
928
|
+
const path = m[2].trim();
|
|
929
|
+
if (tag === 'rw' || tag === 'readwrite' || tag === 'rw:')
|
|
930
|
+
t.readWrite.push(path);
|
|
931
|
+
else if (tag === 'ro' || tag === 'readonly' || tag === 'ro:')
|
|
932
|
+
t.readOnly.push(path);
|
|
933
|
+
else if (tag === 'deny' || tag === '-' || tag === 'deny:')
|
|
934
|
+
t.deny.push(path);
|
|
935
|
+
}
|
|
936
|
+
return t;
|
|
937
|
+
}
|
|
938
|
+
function SandboxPathsSection(props) {
|
|
939
|
+
const tr = useT();
|
|
940
|
+
const { bot, patchBot } = props;
|
|
941
|
+
const [tiers, setTiers] = useState(() => normTiers(bot.sandboxPaths));
|
|
942
|
+
const [text, setText] = useState(() => tiersToText(normTiers(bot.sandboxPaths)));
|
|
943
|
+
const [textMode, setTextMode] = useState(false);
|
|
944
|
+
const [status, setStatus] = useState(null);
|
|
945
|
+
const [busy, setBusy] = useState(false);
|
|
946
|
+
const [testPath, setTestPath] = useState('');
|
|
947
|
+
// Lazy directory tree: path → child dir list (undefined = not yet loaded).
|
|
948
|
+
const [children, setChildren] = useState({});
|
|
949
|
+
const [expanded, setExpanded] = useState(new Set());
|
|
950
|
+
const [roots, setRoots] = useState([]);
|
|
951
|
+
// Canonical $HOME (first fs-list root) — used to expand `~` in tiers/tester
|
|
952
|
+
// the SAME way the worker does, so recommendation entries (~/.claude) match
|
|
953
|
+
// absolute tree nodes and effective-access labels are accurate.
|
|
954
|
+
const [homeRoot, setHomeRoot] = useState('~');
|
|
955
|
+
const saved = useMemo(() => normTiers(bot.sandboxPaths), [bot.sandboxPaths]);
|
|
956
|
+
useEffect(() => { setTiers(normTiers(bot.sandboxPaths)); setText(tiersToText(normTiers(bot.sandboxPaths))); }, [bot.sandboxPaths]);
|
|
957
|
+
const dirty = !tiersEqual(tiers, saved);
|
|
958
|
+
const loadDir = useCallback(async (path) => {
|
|
959
|
+
try {
|
|
960
|
+
const q = path ? `?path=${encodeURIComponent(path)}` : '';
|
|
961
|
+
const r = await fetch(`/api/fs/list${q}`);
|
|
962
|
+
const j = await r.json();
|
|
963
|
+
if (!j.ok)
|
|
964
|
+
return;
|
|
965
|
+
if (!path) {
|
|
966
|
+
setRoots(j.entries.map((e) => ({ name: e.name, path: e.path })));
|
|
967
|
+
// Backend returns canonical $HOME explicitly (realpath'd) so `~` expansion
|
|
968
|
+
// here matches the realpath'd child nodes + the worker's sandbox binds.
|
|
969
|
+
if (typeof j.home === 'string' && j.home.startsWith('/'))
|
|
970
|
+
setHomeRoot(j.home);
|
|
971
|
+
}
|
|
972
|
+
else
|
|
973
|
+
setChildren(prev => ({ ...prev, [path]: j.entries.map((e) => ({ name: e.name, path: e.path })) }));
|
|
974
|
+
}
|
|
975
|
+
catch { /* listing is best-effort; manual/text entry still works */ }
|
|
976
|
+
}, []);
|
|
977
|
+
useEffect(() => { if (!textMode && roots.length === 0)
|
|
978
|
+
void loadDir(''); }, [textMode, roots.length, loadDir]);
|
|
979
|
+
// The tier a path is EXPLICITLY set to (undefined = inherits from ancestor).
|
|
980
|
+
const explicitTier = useCallback((path) => {
|
|
981
|
+
const n = path.replace(/\/+$/, '') || '/';
|
|
982
|
+
if (tiers.readWrite.some(p => (p.replace(/\/+$/, '') || '/') === n))
|
|
983
|
+
return 'readWrite';
|
|
984
|
+
if (tiers.readOnly.some(p => (p.replace(/\/+$/, '') || '/') === n))
|
|
985
|
+
return 'readOnly';
|
|
986
|
+
if (tiers.deny.some(p => (p.replace(/\/+$/, '') || '/') === n))
|
|
987
|
+
return 'deny';
|
|
988
|
+
return undefined;
|
|
989
|
+
}, [tiers]);
|
|
990
|
+
// Cycle a node: inherit → readWrite → readOnly → deny → inherit.
|
|
991
|
+
const cycleNode = useCallback((path) => {
|
|
992
|
+
setStatus(null);
|
|
993
|
+
const n = path.replace(/\/+$/, '') || '/';
|
|
994
|
+
const cur = explicitTier(path);
|
|
995
|
+
const next = cur === undefined ? 'readWrite' : cur === 'readWrite' ? 'readOnly' : cur === 'readOnly' ? 'deny' : undefined;
|
|
996
|
+
setTiers(prev => {
|
|
997
|
+
const strip = (arr) => arr.filter(p => (p.replace(/\/+$/, '') || '/') !== n);
|
|
998
|
+
const t = { readWrite: strip(prev.readWrite), readOnly: strip(prev.readOnly), deny: strip(prev.deny) };
|
|
999
|
+
if (next)
|
|
1000
|
+
t[next].push(path);
|
|
1001
|
+
setText(tiersToText(t));
|
|
1002
|
+
return t;
|
|
1003
|
+
});
|
|
1004
|
+
}, [explicitTier]);
|
|
1005
|
+
function applyRecommended() {
|
|
1006
|
+
const rec = recommendedTiers(bot.cliId);
|
|
1007
|
+
setStatus(null);
|
|
1008
|
+
setTiers(prev => {
|
|
1009
|
+
const merge = (base, add) => [...new Set([...base, ...add])];
|
|
1010
|
+
const t = {
|
|
1011
|
+
readWrite: merge(prev.readWrite, rec.tiers.readWrite),
|
|
1012
|
+
readOnly: merge(prev.readOnly, rec.tiers.readOnly),
|
|
1013
|
+
deny: merge(prev.deny, rec.tiers.deny),
|
|
1014
|
+
};
|
|
1015
|
+
setText(tiersToText(t));
|
|
1016
|
+
return t;
|
|
1017
|
+
});
|
|
1018
|
+
}
|
|
1019
|
+
function syncFromText(next) {
|
|
1020
|
+
setText(next);
|
|
1021
|
+
setTiers(textToTiers(next));
|
|
1022
|
+
setStatus(null);
|
|
1023
|
+
}
|
|
1024
|
+
async function save() {
|
|
1025
|
+
setBusy(true);
|
|
1026
|
+
setStatus(null);
|
|
1027
|
+
try {
|
|
1028
|
+
const res = await sendJson('PUT', `/api/bots/${encodeURIComponent(bot.larkAppId)}/sandbox-paths`, tiers);
|
|
1029
|
+
if (res.ok && res.body.ok) {
|
|
1030
|
+
setStatus({ text: `✓ ${tr('botDefaults.sbxPathsSaved')}`, ok: true });
|
|
1031
|
+
patchBot(bot.larkAppId, { sandboxPaths: res.body.sandboxPaths ?? { readWrite: [], readOnly: [], deny: [] } });
|
|
1032
|
+
}
|
|
1033
|
+
else {
|
|
1034
|
+
setStatus({ text: `✗ ${responseErrorText(res)}` });
|
|
1035
|
+
}
|
|
1036
|
+
}
|
|
1037
|
+
catch (e) {
|
|
1038
|
+
setStatus({ text: `✗ ${caughtErrorText(e)}` });
|
|
1039
|
+
}
|
|
1040
|
+
finally {
|
|
1041
|
+
setBusy(false);
|
|
1042
|
+
}
|
|
1043
|
+
}
|
|
1044
|
+
const tierBadge = (a) => a === 'readWrite' ? tr('botDefaults.sbxRw')
|
|
1045
|
+
: a === 'readOnly' ? tr('botDefaults.sbxRo')
|
|
1046
|
+
: a === 'deny' ? tr('botDefaults.sbxDeny')
|
|
1047
|
+
: tr('botDefaults.sbxNone');
|
|
1048
|
+
function TreeNode(props) {
|
|
1049
|
+
const { name, path, depth } = props;
|
|
1050
|
+
const isOpen = expanded.has(path);
|
|
1051
|
+
const explicit = explicitTier(path);
|
|
1052
|
+
const eff = effectiveAccess(tiers, path, homeRoot);
|
|
1053
|
+
const kids = children[path];
|
|
1054
|
+
return (_jsxs("div", { className: "bd-sbx-node", children: [_jsxs("div", { className: "bd-sbx-row", style: { paddingLeft: depth * 16 }, children: [_jsx("span", { className: "bd-sbx-twisty", onClick: () => {
|
|
1055
|
+
setExpanded(prev => { const s = new Set(prev); s.has(path) ? s.delete(path) : s.add(path); return s; });
|
|
1056
|
+
if (!kids)
|
|
1057
|
+
void loadDir(path);
|
|
1058
|
+
}, children: isOpen ? '▾' : '▸' }), _jsx("span", { className: "bd-sbx-name", title: path, children: name }), _jsx("button", { type: "button", className: `bd-sbx-state bd-sbx-state-${explicit ?? 'inherit'}`, "data-action": "cycle-sandbox-path", "data-path": path, title: explicit ? undefined : `${tr('botDefaults.sbxInherit')}: ${tierBadge(eff.access)}`, onClick: () => cycleNode(path), children: explicit ? tierBadge(explicit) : `↳ ${tierBadge(eff.access)}` })] }), isOpen && (_jsxs("div", { className: "bd-sbx-kids", children: [kids?.map(c => _jsx(TreeNode, { name: c.name, path: c.path, depth: depth + 1 }, c.path)), kids && kids.length === 0 && (_jsx("div", { className: "bd-sbx-empty", style: { paddingLeft: (depth + 1) * 16 + 20 }, children: tr('botDefaults.sbxNoSubdirs') }))] }))] }));
|
|
1059
|
+
}
|
|
1060
|
+
const testResult = testPath.trim() ? effectiveAccess(tiers, testPath.trim(), homeRoot) : null;
|
|
1061
|
+
return (_jsxs("section", { className: "bd-section", children: [_jsx("h3", { className: "bd-section-title", children: tr('botDefaults.sectionSandboxPaths') }), _jsx("p", { className: "bd-section-note", children: tr('botDefaults.sbxPathsHelp') }), _jsxs("div", { className: "actions", style: { gap: 8, flexWrap: 'wrap' }, children: [_jsx("button", { type: "button", className: "bd-btn", "data-action": "apply-sandbox-recommended", onClick: applyRecommended, children: tr(recommendedTiers(bot.cliId).labelKey) }), _jsx("button", { type: "button", className: "bd-btn", onClick: () => setTextMode(m => !m), children: textMode ? tr('botDefaults.sbxPathsTreeMode') : tr('botDefaults.sbxPathsTextMode') })] }), textMode ? (_jsx("textarea", { className: "bd-sbx-text", "data-field": "sandbox-paths-text", rows: 8, value: text, spellCheck: false, placeholder: 'rw ~/my-data\nro ~/reference-repos\ndeny ~/my-data/secrets', onChange: e => syncFromText(e.target.value) })) : (_jsx("div", { className: "bd-sbx-tree", "data-field": "sandbox-paths-tree", children: roots.map(r => _jsx(TreeNode, { name: r.name, path: r.path, depth: 0 }, r.path)) })), _jsxs("div", { className: "bd-sbx-tester", children: [_jsx("input", { className: "bd-sbx-test-input", "data-field": "sandbox-path-test", placeholder: tr('botDefaults.sbxTestPlaceholder'), value: testPath, onChange: e => setTestPath(e.target.value) }), testResult && (_jsxs("span", { className: `bd-sbx-test-out bd-sbx-state-${testResult.access}`, "data-test-access": testResult.access, children: [tierBadge(testResult.access), testResult.rule ? ` ← ${testResult.rule}` : ''] }))] }), _jsxs("div", { className: "actions", children: [_jsx("button", { type: "button", className: "bd-btn bd-btn-primary", "data-action": "save-sandbox-paths", disabled: busy || !dirty, onClick: () => void save(), children: tr('botDefaults.sbxPathsSave') }), _jsx(StatusSpan, { status: status, attr: { 'data-sandbox-paths-status': '' } })] })] }));
|
|
1062
|
+
}
|
|
844
1063
|
const BACKEND_TYPE_OPTIONS = [
|
|
845
1064
|
{ value: '', labelKey: 'botDefaults.backendAuto' },
|
|
846
1065
|
{ value: 'tmux', labelKey: 'botDefaults.backendTmux' },
|