botmux 3.4.3 → 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/README.en.md +10 -7
- package/README.md +11 -6
- package/dist/adapters/backend/herdr-backend.d.ts +43 -6
- package/dist/adapters/backend/herdr-backend.d.ts.map +1 -1
- package/dist/adapters/backend/herdr-backend.js +362 -28
- package/dist/adapters/backend/herdr-backend.js.map +1 -1
- package/dist/adapters/backend/reproduce-command.d.ts +39 -0
- package/dist/adapters/backend/reproduce-command.d.ts.map +1 -0
- package/dist/adapters/backend/reproduce-command.js +63 -0
- package/dist/adapters/backend/reproduce-command.js.map +1 -0
- 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/backend/session-backend-selector.d.ts +10 -1
- package/dist/adapters/backend/session-backend-selector.d.ts.map +1 -1
- package/dist/adapters/backend/session-backend-selector.js +73 -4
- package/dist/adapters/backend/session-backend-selector.js.map +1 -1
- package/dist/adapters/backend/types.d.ts +16 -0
- package/dist/adapters/backend/types.d.ts.map +1 -1
- package/dist/adapters/backend/types.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/pi-initial-prompt.d.ts.map +1 -1
- package/dist/adapters/cli/pi-initial-prompt.js +5 -1
- package/dist/adapters/cli/pi-initial-prompt.js.map +1 -1
- 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/adapters/cli/traex.d.ts.map +1 -1
- package/dist/adapters/cli/traex.js +5 -0
- package/dist/adapters/cli/traex.js.map +1 -1
- package/dist/adapters/cli/types.d.ts +3 -3
- package/dist/adapters/cli/types.d.ts.map +1 -1
- package/dist/adapters/hook-installer.d.ts +7 -0
- package/dist/adapters/hook-installer.d.ts.map +1 -1
- package/dist/adapters/hook-installer.js +56 -0
- package/dist/adapters/hook-installer.js.map +1 -1
- package/dist/bot-registry.d.ts +39 -23
- package/dist/bot-registry.d.ts.map +1 -1
- package/dist/bot-registry.js +134 -2
- package/dist/bot-registry.js.map +1 -1
- package/dist/cli/capabilities.d.ts +24 -0
- package/dist/cli/capabilities.d.ts.map +1 -0
- package/dist/cli/capabilities.js +25 -0
- package/dist/cli/capabilities.js.map +1 -0
- package/dist/cli/create-group-resolver.d.ts +24 -0
- package/dist/cli/create-group-resolver.d.ts.map +1 -1
- package/dist/cli/create-group-resolver.js +23 -0
- package/dist/cli/create-group-resolver.js.map +1 -1
- package/dist/cli/daemon-lifecycle-env.d.ts +5 -7
- package/dist/cli/daemon-lifecycle-env.d.ts.map +1 -1
- package/dist/cli/daemon-lifecycle-env.js +13 -7
- package/dist/cli/daemon-lifecycle-env.js.map +1 -1
- package/dist/cli/exact-chat-grant-client.d.ts +48 -0
- package/dist/cli/exact-chat-grant-client.d.ts.map +1 -0
- package/dist/cli/exact-chat-grant-client.js +108 -0
- package/dist/cli/exact-chat-grant-client.js.map +1 -0
- package/dist/cli/exact-chat-grant.d.ts +18 -0
- package/dist/cli/exact-chat-grant.d.ts.map +1 -0
- package/dist/cli/exact-chat-grant.js +97 -0
- package/dist/cli/exact-chat-grant.js.map +1 -0
- package/dist/cli.d.ts +10 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +795 -144
- package/dist/cli.js.map +1 -1
- package/dist/codex-rpc-engine.d.ts +26 -0
- package/dist/codex-rpc-engine.d.ts.map +1 -1
- package/dist/codex-rpc-engine.js +113 -2
- package/dist/codex-rpc-engine.js.map +1 -1
- package/dist/config.d.ts +16 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +16 -0
- package/dist/config.js.map +1 -1
- package/dist/core/bot-live-control.d.ts +41 -0
- package/dist/core/bot-live-control.d.ts.map +1 -0
- package/dist/core/bot-live-control.js +135 -0
- package/dist/core/bot-live-control.js.map +1 -0
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +44 -66
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/daemon-config-fence.d.ts +8 -0
- package/dist/core/daemon-config-fence.d.ts.map +1 -0
- package/dist/core/daemon-config-fence.js +13 -0
- package/dist/core/daemon-config-fence.js.map +1 -0
- package/dist/core/dashboard-events.d.ts +5 -0
- package/dist/core/dashboard-events.d.ts.map +1 -1
- package/dist/core/dashboard-events.js.map +1 -1
- package/dist/core/dashboard-ipc-server.d.ts +21 -2
- package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
- package/dist/core/dashboard-ipc-server.js +258 -32
- package/dist/core/dashboard-ipc-server.js.map +1 -1
- package/dist/core/dispatch-registry.d.ts +12 -0
- package/dist/core/dispatch-registry.d.ts.map +1 -0
- package/dist/core/dispatch-registry.js +33 -0
- package/dist/core/dispatch-registry.js.map +1 -0
- package/dist/core/dispatch.d.ts +99 -0
- package/dist/core/dispatch.d.ts.map +1 -1
- package/dist/core/dispatch.js +136 -0
- package/dist/core/dispatch.js.map +1 -1
- package/dist/core/maintenance.d.ts.map +1 -1
- package/dist/core/maintenance.js +10 -3
- package/dist/core/maintenance.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/persistent-backend.d.ts +16 -2
- package/dist/core/persistent-backend.d.ts.map +1 -1
- package/dist/core/persistent-backend.js +40 -0
- package/dist/core/persistent-backend.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-discovery.d.ts +8 -1
- package/dist/core/session-discovery.d.ts.map +1 -1
- package/dist/core/session-discovery.js +140 -8
- package/dist/core/session-discovery.js.map +1 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +102 -68
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/session-title.d.ts +8 -0
- package/dist/core/session-title.d.ts.map +1 -1
- package/dist/core/session-title.js +54 -0
- package/dist/core/session-title.js.map +1 -1
- package/dist/core/terminal-write-auth.d.ts +15 -0
- package/dist/core/terminal-write-auth.d.ts.map +1 -1
- package/dist/core/terminal-write-auth.js +20 -0
- package/dist/core/terminal-write-auth.js.map +1 -1
- package/dist/core/trigger-session.d.ts.map +1 -1
- package/dist/core/trigger-session.js +3 -2
- package/dist/core/trigger-session.js.map +1 -1
- package/dist/core/types.d.ts +33 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/worker-pool.d.ts +51 -8
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +439 -25
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/daemon.d.ts +4 -2
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +403 -26
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard/bot-onboarding.d.ts +127 -1
- package/dist/dashboard/bot-onboarding.d.ts.map +1 -1
- package/dist/dashboard/bot-onboarding.js +1104 -25
- package/dist/dashboard/bot-onboarding.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/debug-terminal.d.ts +18 -0
- package/dist/dashboard/debug-terminal.d.ts.map +1 -0
- package/dist/dashboard/debug-terminal.js +338 -0
- package/dist/dashboard/debug-terminal.js.map +1 -0
- package/dist/dashboard/public-redact.d.ts +2 -0
- package/dist/dashboard/public-redact.d.ts.map +1 -1
- package/dist/dashboard/public-redact.js +12 -3
- package/dist/dashboard/public-redact.js.map +1 -1
- package/dist/dashboard/registry.d.ts +8 -0
- package/dist/dashboard/registry.d.ts.map +1 -1
- package/dist/dashboard/registry.js +13 -0
- package/dist/dashboard/registry.js.map +1 -1
- package/dist/dashboard/settings-write-applier.d.ts +47 -1
- package/dist/dashboard/settings-write-applier.d.ts.map +1 -1
- package/dist/dashboard/settings-write-applier.js +102 -1
- package/dist/dashboard/settings-write-applier.js.map +1 -1
- package/dist/dashboard/web/app.d.ts.map +1 -1
- package/dist/dashboard/web/app.js +2 -0
- package/dist/dashboard/web/app.js.map +1 -1
- package/dist/dashboard/web/bot-defaults-page.d.ts +17 -0
- package/dist/dashboard/web/bot-defaults-page.d.ts.map +1 -1
- package/dist/dashboard/web/bot-defaults-page.js +249 -11
- package/dist/dashboard/web/bot-defaults-page.js.map +1 -1
- package/dist/dashboard/web/bot-defaults.d.ts +22 -0
- package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
- package/dist/dashboard/web/bot-defaults.js +19 -0
- 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 +114 -28
- package/dist/dashboard/web/i18n.js.map +1 -1
- package/dist/dashboard/web/icon-tooltip.d.ts +3 -0
- package/dist/dashboard/web/icon-tooltip.d.ts.map +1 -0
- package/dist/dashboard/web/icon-tooltip.js +108 -0
- package/dist/dashboard/web/icon-tooltip.js.map +1 -0
- package/dist/dashboard/web/sessions-kanban.js +2 -2
- package/dist/dashboard/web/sessions-kanban.js.map +1 -1
- package/dist/dashboard/web/sessions-page.d.ts.map +1 -1
- package/dist/dashboard/web/sessions-page.js +49 -53
- package/dist/dashboard/web/sessions-page.js.map +1 -1
- package/dist/dashboard/web/sessions.d.ts +2 -0
- package/dist/dashboard/web/sessions.d.ts.map +1 -1
- package/dist/dashboard/web/sessions.js +46 -2
- package/dist/dashboard/web/sessions.js.map +1 -1
- package/dist/dashboard/web/settings-page.d.ts +78 -0
- package/dist/dashboard/web/settings-page.d.ts.map +1 -1
- package/dist/dashboard/web/settings-page.js +88 -1
- package/dist/dashboard/web/settings-page.js.map +1 -1
- package/dist/dashboard/web/store.d.ts +2 -0
- package/dist/dashboard/web/store.d.ts.map +1 -1
- package/dist/dashboard/web/store.js +13 -1
- package/dist/dashboard/web/store.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-P6GO5KT4.js → chunk-KPQAUX7V.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-UBOLHQCK.js → chunk-NRL6CVAS.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-JNRSPKLS.js → chunk-R7IAKAYX.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-CUV65BIQ.js → chunk-X2L65IOM.js} +8 -8
- package/dist/dashboard-web/chunks/{connectors-page-KTC2QWNW.js → connectors-page-HDQFEXZI.js} +1 -1
- package/dist/dashboard-web/chunks/{groups-page-B3EKGOLY.js → groups-page-6DKXBYOM.js} +1 -1
- package/dist/dashboard-web/chunks/{insights-page-X6RXNCWX.js → insights-page-NWARTJ6J.js} +1 -1
- package/dist/dashboard-web/chunks/{monitor-room-LLRA5LQW.js → monitor-room-AGX3XRJX.js} +1 -1
- package/dist/dashboard-web/chunks/{monitoring-page-7MT5FEOS.js → monitoring-page-GGGIWN4C.js} +1 -1
- package/dist/dashboard-web/chunks/{office-page-KD46D5TD.js → office-page-6SIVKSK3.js} +1 -1
- package/dist/dashboard-web/chunks/{overview-page-JUWNH32O.js → overview-page-FVR3NKAF.js} +1 -1
- package/dist/dashboard-web/chunks/{roles-page-P6F7NLOI.js → roles-page-WE2YB7KN.js} +1 -1
- package/dist/dashboard-web/chunks/{schedules-page-XIHWZST4.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-IEBR7TGN.js +2 -0
- package/dist/dashboard-web/chunks/{skills-page-A46KVWBL.js → skills-page-3QAT2IWD.js} +1 -1
- package/dist/dashboard-web/chunks/{team-federation-page-SDUC56DF.js → team-federation-page-K4VVAVAK.js} +1 -1
- package/dist/dashboard-web/chunks/{v3-page-J5JOTUSQ.js → v3-page-V6IOJR2B.js} +1 -1
- package/dist/dashboard-web/chunks/{whiteboards-page-U7LSOAWI.js → whiteboards-page-V6CGKRNX.js} +1 -1
- package/dist/dashboard-web/style.css +218 -10
- package/dist/dashboard.js +380 -8
- package/dist/dashboard.js.map +1 -1
- package/dist/features/codex-notifier/adoption.d.ts +11 -0
- package/dist/features/codex-notifier/adoption.d.ts.map +1 -0
- package/dist/features/codex-notifier/adoption.js +11 -0
- package/dist/features/codex-notifier/adoption.js.map +1 -0
- package/dist/features/codex-notifier/app-opener.d.ts +21 -0
- package/dist/features/codex-notifier/app-opener.d.ts.map +1 -0
- package/dist/features/codex-notifier/app-opener.js +33 -0
- package/dist/features/codex-notifier/app-opener.js.map +1 -0
- package/dist/features/codex-notifier/card-action.d.ts +27 -0
- package/dist/features/codex-notifier/card-action.d.ts.map +1 -0
- package/dist/features/codex-notifier/card-action.js +84 -0
- package/dist/features/codex-notifier/card-action.js.map +1 -0
- package/dist/features/codex-notifier/card.d.ts +12 -0
- package/dist/features/codex-notifier/card.d.ts.map +1 -0
- package/dist/features/codex-notifier/card.js +150 -0
- package/dist/features/codex-notifier/card.js.map +1 -0
- package/dist/features/codex-notifier/codex-context.d.ts +12 -0
- package/dist/features/codex-notifier/codex-context.d.ts.map +1 -0
- package/dist/features/codex-notifier/codex-context.js +161 -0
- package/dist/features/codex-notifier/codex-context.js.map +1 -0
- package/dist/features/codex-notifier/config.d.ts +9 -0
- package/dist/features/codex-notifier/config.d.ts.map +1 -0
- package/dist/features/codex-notifier/config.js +11 -0
- package/dist/features/codex-notifier/config.js.map +1 -0
- package/dist/features/codex-notifier/confirmed-turn.d.ts +20 -0
- package/dist/features/codex-notifier/confirmed-turn.d.ts.map +1 -0
- package/dist/features/codex-notifier/confirmed-turn.js +130 -0
- package/dist/features/codex-notifier/confirmed-turn.js.map +1 -0
- package/dist/features/codex-notifier/emitter.d.ts +13 -0
- package/dist/features/codex-notifier/emitter.d.ts.map +1 -0
- package/dist/features/codex-notifier/emitter.js +33 -0
- package/dist/features/codex-notifier/emitter.js.map +1 -0
- package/dist/features/codex-notifier/event-store.d.ts +29 -0
- package/dist/features/codex-notifier/event-store.d.ts.map +1 -0
- package/dist/features/codex-notifier/event-store.js +217 -0
- package/dist/features/codex-notifier/event-store.js.map +1 -0
- package/dist/features/codex-notifier/event.d.ts +46 -0
- package/dist/features/codex-notifier/event.d.ts.map +1 -0
- package/dist/features/codex-notifier/event.js +188 -0
- package/dist/features/codex-notifier/event.js.map +1 -0
- package/dist/features/codex-notifier/hook-cli.d.ts +23 -0
- package/dist/features/codex-notifier/hook-cli.d.ts.map +1 -0
- package/dist/features/codex-notifier/hook-cli.js +130 -0
- package/dist/features/codex-notifier/hook-cli.js.map +1 -0
- package/dist/features/codex-notifier/hook-installer.d.ts +19 -0
- package/dist/features/codex-notifier/hook-installer.d.ts.map +1 -0
- package/dist/features/codex-notifier/hook-installer.js +158 -0
- package/dist/features/codex-notifier/hook-installer.js.map +1 -0
- package/dist/features/codex-notifier/index.d.ts +21 -0
- package/dist/features/codex-notifier/index.d.ts.map +1 -0
- package/dist/features/codex-notifier/index.js +19 -0
- package/dist/features/codex-notifier/index.js.map +1 -0
- package/dist/features/codex-notifier/internal-turn.d.ts +5 -0
- package/dist/features/codex-notifier/internal-turn.d.ts.map +1 -0
- package/dist/features/codex-notifier/internal-turn.js +43 -0
- package/dist/features/codex-notifier/internal-turn.js.map +1 -0
- package/dist/features/codex-notifier/outbox-worker.d.ts +71 -0
- package/dist/features/codex-notifier/outbox-worker.d.ts.map +1 -0
- package/dist/features/codex-notifier/outbox-worker.js +290 -0
- package/dist/features/codex-notifier/outbox-worker.js.map +1 -0
- package/dist/features/codex-notifier/outbox.d.ts +25 -0
- package/dist/features/codex-notifier/outbox.d.ts.map +1 -0
- package/dist/features/codex-notifier/outbox.js +225 -0
- package/dist/features/codex-notifier/outbox.js.map +1 -0
- package/dist/features/codex-notifier/paths.d.ts +7 -0
- package/dist/features/codex-notifier/paths.d.ts.map +1 -0
- package/dist/features/codex-notifier/paths.js +20 -0
- package/dist/features/codex-notifier/paths.js.map +1 -0
- package/dist/features/codex-notifier/screen-lock.d.ts +12 -0
- package/dist/features/codex-notifier/screen-lock.d.ts.map +1 -0
- package/dist/features/codex-notifier/screen-lock.js +47 -0
- package/dist/features/codex-notifier/screen-lock.js.map +1 -0
- package/dist/features/codex-notifier/side-conversation-monitor.d.ts +102 -0
- package/dist/features/codex-notifier/side-conversation-monitor.d.ts.map +1 -0
- package/dist/features/codex-notifier/side-conversation-monitor.js +774 -0
- package/dist/features/codex-notifier/side-conversation-monitor.js.map +1 -0
- package/dist/features/codex-notifier/types.d.ts +42 -0
- package/dist/features/codex-notifier/types.d.ts.map +1 -0
- package/dist/features/codex-notifier/types.js +2 -0
- package/dist/features/codex-notifier/types.js.map +1 -0
- package/dist/features/codex-notifier/worker-lock.d.ts +8 -0
- package/dist/features/codex-notifier/worker-lock.d.ts.map +1 -0
- package/dist/features/codex-notifier/worker-lock.js +108 -0
- package/dist/features/codex-notifier/worker-lock.js.map +1 -0
- package/dist/global-config.d.ts +13 -0
- package/dist/global-config.d.ts.map +1 -1
- package/dist/global-config.js +34 -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 +2 -36
- package/dist/im/lark/card-builder.js.map +1 -1
- package/dist/im/lark/card-handler.d.ts +2 -0
- package/dist/im/lark/card-handler.d.ts.map +1 -1
- package/dist/im/lark/card-handler.js +166 -64
- package/dist/im/lark/card-handler.js.map +1 -1
- package/dist/im/lark/client.d.ts +98 -4
- package/dist/im/lark/client.d.ts.map +1 -1
- package/dist/im/lark/client.js +317 -29
- 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 +48 -33
- package/dist/im/lark/event-dispatcher.js.map +1 -1
- package/dist/services/codex-app-threads.d.ts +47 -0
- package/dist/services/codex-app-threads.d.ts.map +1 -1
- package/dist/services/codex-app-threads.js +502 -10
- package/dist/services/codex-app-threads.js.map +1 -1
- package/dist/services/exact-chat-grant.d.ts +83 -0
- package/dist/services/exact-chat-grant.d.ts.map +1 -0
- package/dist/services/exact-chat-grant.js +249 -0
- package/dist/services/exact-chat-grant.js.map +1 -0
- package/dist/services/group-creator.d.ts +11 -0
- package/dist/services/group-creator.d.ts.map +1 -1
- package/dist/services/group-creator.js +18 -9
- package/dist/services/group-creator.js.map +1 -1
- package/dist/services/local-cli-opener.d.ts.map +1 -1
- package/dist/services/local-cli-opener.js +10 -5
- package/dist/services/local-cli-opener.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/services/traex-user-input.d.ts +19 -0
- package/dist/services/traex-user-input.d.ts.map +1 -0
- package/dist/services/traex-user-input.js +57 -0
- package/dist/services/traex-user-input.js.map +1 -0
- package/dist/setup/open-platform-automation.d.ts +24 -3
- package/dist/setup/open-platform-automation.d.ts.map +1 -1
- package/dist/setup/open-platform-automation.js +45 -8
- package/dist/setup/open-platform-automation.js.map +1 -1
- package/dist/setup/verify-permissions.d.ts +18 -0
- package/dist/setup/verify-permissions.d.ts.map +1 -1
- package/dist/setup/verify-permissions.js +60 -0
- package/dist/setup/verify-permissions.js.map +1 -1
- package/dist/types.d.ts +83 -5
- 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/utils/stuck-detector.d.ts +45 -0
- package/dist/utils/stuck-detector.d.ts.map +1 -0
- package/dist/utils/stuck-detector.js +188 -0
- package/dist/utils/stuck-detector.js.map +1 -0
- package/dist/utils/stuck-key-guard.d.ts +75 -0
- package/dist/utils/stuck-key-guard.d.ts.map +1 -0
- package/dist/utils/stuck-key-guard.js +77 -0
- package/dist/utils/stuck-key-guard.js.map +1 -0
- package/dist/worker.js +1119 -588
- 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-B5AY4B2J.js +0 -5
- package/dist/dashboard-web/chunks/sessions-page-2VECQ27T.js +0 -3
- package/dist/dashboard-web/chunks/settings-page-HMIUE2JA.js +0 -2
- 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
|
@@ -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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pi-initial-prompt.d.ts","sourceRoot":"","sources":["../../../src/adapters/cli/pi-initial-prompt.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,gCAAgC,OAAO,CAAC;AASrD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,
|
|
1
|
+
{"version":3,"file":"pi-initial-prompt.d.ts","sourceRoot":"","sources":["../../../src/adapters/cli/pi-initial-prompt.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,gCAAgC,OAAO,CAAC;AASrD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAQ5E;AAED,wBAAgB,sBAAsB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAErE;AAED,wBAAgB,kBAAkB,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEpF;AAED,wBAAgB,uBAAuB,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEzF;AASD,wBAAgB,yBAAyB,CAAC,IAAI,EAAE;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,GAAG;IACF,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,cAAc,EAAE,MAAM,EAAE,CAAC;QACzB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC7B,CAAC;CACH,CAyBA"}
|
|
@@ -10,7 +10,11 @@ function safeSessionFileStem(sessionId) {
|
|
|
10
10
|
return sessionId.replace(/[^A-Za-z0-9._-]/g, '_').replace(/^\.+$/, '_');
|
|
11
11
|
}
|
|
12
12
|
export function piInitialPromptNeedsFile(prompt) {
|
|
13
|
-
return !!prompt && Buffer.byteLength(prompt, 'utf8') > PI_INITIAL_PROMPT_ARG_BYTE_LIMIT
|
|
13
|
+
return !!prompt && (Buffer.byteLength(prompt, 'utf8') > PI_INITIAL_PROMPT_ARG_BYTE_LIMIT
|
|
14
|
+
// Herdr 0.7.5 rejects control characters in managed-agent argv. Its macOS
|
|
15
|
+
// integration can also bypass the PATH launcher, so even short routed
|
|
16
|
+
// Botmux prompts must use Pi's safe @file positional form.
|
|
17
|
+
|| /[\x00-\x1f\x7f]/.test(prompt));
|
|
14
18
|
}
|
|
15
19
|
export function piInitialPromptRootDir(sessionDataDir) {
|
|
16
20
|
return join(sessionDataDir, 'pi-initial-prompts');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pi-initial-prompt.js","sourceRoot":"","sources":["../../../src/adapters/cli/pi-initial-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EACL,yBAAyB,EACzB,0BAA0B,GAC3B,MAAM,kCAAkC,CAAC;AAE1C,MAAM,CAAC,MAAM,gCAAgC,GAAG,IAAI,CAAC;AAErD,MAAM,eAAe,GAAG,mBAAmB,CAAC;AAE5C,SAAS,mBAAmB,CAAC,SAAiB;IAC5C,IAAI,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IAClF,OAAO,SAAS,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,MAA0B;IACjE,OAAO,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"pi-initial-prompt.js","sourceRoot":"","sources":["../../../src/adapters/cli/pi-initial-prompt.ts"],"names":[],"mappings":"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"}
|